VptrTest.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /*
  2. * Copyright 2017 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "src/core/SkMakeUnique.h"
  8. #include "src/core/SkVptr.h"
  9. #include "tests/Test.h"
  10. namespace {
  11. struct Base {
  12. virtual ~Base() = default;
  13. virtual size_t val() const = 0;
  14. };
  15. struct SubclassA : public Base {
  16. SubclassA(size_t val) : fVal(val) {}
  17. size_t val() const override { return fVal; }
  18. size_t fVal;
  19. };
  20. struct SubclassB : public Base {
  21. SubclassB() {}
  22. size_t val() const override { return 42; }
  23. };
  24. }
  25. DEF_TEST(Vptr, r) {
  26. std::unique_ptr<Base> a = skstd::make_unique<SubclassA>(21),
  27. b = skstd::make_unique<SubclassB>(),
  28. c = skstd::make_unique<SubclassA>(22),
  29. d = skstd::make_unique<SubclassB>();
  30. // These 4 objects all have unique identities.
  31. REPORTER_ASSERT(r, a != b);
  32. REPORTER_ASSERT(r, a != c);
  33. REPORTER_ASSERT(r, a != d);
  34. REPORTER_ASSERT(r, b != c);
  35. REPORTER_ASSERT(r, b != d);
  36. REPORTER_ASSERT(r, c != d);
  37. // Only b and d have the same val().
  38. REPORTER_ASSERT(r, a->val() != b->val());
  39. REPORTER_ASSERT(r, a->val() != c->val());
  40. REPORTER_ASSERT(r, a->val() != d->val());
  41. REPORTER_ASSERT(r, b->val() != c->val());
  42. REPORTER_ASSERT(r, b->val() == d->val());
  43. REPORTER_ASSERT(r, c->val() != d->val());
  44. // SkVptr() returns the same value for objects of the same concrete type.
  45. REPORTER_ASSERT(r, SkVptr(*a) == SkVptr(*c));
  46. REPORTER_ASSERT(r, SkVptr(*b) == SkVptr(*d));
  47. REPORTER_ASSERT(r, SkVptr(*a) != SkVptr(*b));
  48. }