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