| /* | |
| * Copyright 2017 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "SkMakeUnique.h" | |
| #include "SkVptr.h" | |
| #include "Test.h" | |
| namespace { | |
| struct Base { | |
| virtual ~Base() = default; | |
| virtual size_t val() const = 0; | |
| }; | |
| struct SubclassA : public Base { | |
| SubclassA(size_t val) : fVal(val) {} | |
| size_t val() const override { return fVal; } | |
| size_t fVal; | |
| }; | |
| struct SubclassB : public Base { | |
| SubclassB() {} | |
| size_t val() const override { return 42; } | |
| }; | |
| } | |
| DEF_TEST(Vptr, r) { | |
| std::unique_ptr<Base> a = skstd::make_unique<SubclassA>(21), | |
| b = skstd::make_unique<SubclassB>(), | |
| c = skstd::make_unique<SubclassA>(22), | |
| d = skstd::make_unique<SubclassB>(); | |
| // These 4 objects all have unique identities. | |
| REPORTER_ASSERT(r, a != b); | |
| REPORTER_ASSERT(r, a != c); | |
| REPORTER_ASSERT(r, a != d); | |
| REPORTER_ASSERT(r, b != c); | |
| REPORTER_ASSERT(r, b != d); | |
| REPORTER_ASSERT(r, c != d); | |
| // Only b and d have the same val(). | |
| REPORTER_ASSERT(r, a->val() != b->val()); | |
| REPORTER_ASSERT(r, a->val() != c->val()); | |
| REPORTER_ASSERT(r, a->val() != d->val()); | |
| REPORTER_ASSERT(r, b->val() != c->val()); | |
| REPORTER_ASSERT(r, b->val() == d->val()); | |
| REPORTER_ASSERT(r, c->val() != d->val()); | |
| // SkVptr() returns the same value for objects of the same concrete type. | |
| REPORTER_ASSERT(r, SkVptr(*a) == SkVptr(*c)); | |
| REPORTER_ASSERT(r, SkVptr(*b) == SkVptr(*d)); | |
| REPORTER_ASSERT(r, SkVptr(*a) != SkVptr(*b)); | |
| } |