18bf80f4bSopenharmony_ci/* 28bf80f4bSopenharmony_ci * Copyright (C) 2024 Huawei Device Co., Ltd. 38bf80f4bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 48bf80f4bSopenharmony_ci * you may not use this file except in compliance with the License. 58bf80f4bSopenharmony_ci * You may obtain a copy of the License at 68bf80f4bSopenharmony_ci * 78bf80f4bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 88bf80f4bSopenharmony_ci * 98bf80f4bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 108bf80f4bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 118bf80f4bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 128bf80f4bSopenharmony_ci * See the License for the specific language governing permissions and 138bf80f4bSopenharmony_ci * limitations under the License. 148bf80f4bSopenharmony_ci */ 158bf80f4bSopenharmony_ci 168bf80f4bSopenharmony_ci#include <gtest/gtest.h> 178bf80f4bSopenharmony_ci 188bf80f4bSopenharmony_ci#include <meta/interface/object_macros.h> 198bf80f4bSopenharmony_ci 208bf80f4bSopenharmony_ci#include "src/test_runner.h" 218bf80f4bSopenharmony_ci 228bf80f4bSopenharmony_ciusing namespace testing::ext; 238bf80f4bSopenharmony_ci 248bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE() 258bf80f4bSopenharmony_ci 268bf80f4bSopenharmony_ciclass PointerTest : public testing::Test { 278bf80f4bSopenharmony_cipublic: 288bf80f4bSopenharmony_ci static void SetUpTestSuite() 298bf80f4bSopenharmony_ci { 308bf80f4bSopenharmony_ci SetTest(); 318bf80f4bSopenharmony_ci } 328bf80f4bSopenharmony_ci static void TearDownTestSuite() 338bf80f4bSopenharmony_ci { 348bf80f4bSopenharmony_ci ResetTest(); 358bf80f4bSopenharmony_ci } 368bf80f4bSopenharmony_ci void SetUp() override {} 378bf80f4bSopenharmony_ci void TearDown() override {} 388bf80f4bSopenharmony_ci}; 398bf80f4bSopenharmony_ci 408bf80f4bSopenharmony_cinamespace { 418bf80f4bSopenharmony_cistruct PtrTestData { 428bf80f4bSopenharmony_ci PtrTestData(int& constructCount, int& destructCount) 438bf80f4bSopenharmony_ci : constructCount(constructCount), destructCount(destructCount) 448bf80f4bSopenharmony_ci { 458bf80f4bSopenharmony_ci constructCount++; 468bf80f4bSopenharmony_ci } 478bf80f4bSopenharmony_ci ~PtrTestData() 488bf80f4bSopenharmony_ci { 498bf80f4bSopenharmony_ci destructCount++; 508bf80f4bSopenharmony_ci } 518bf80f4bSopenharmony_ci 528bf80f4bSopenharmony_ci int data { 0 }; 538bf80f4bSopenharmony_ci int& constructCount; 548bf80f4bSopenharmony_ci int& destructCount; 558bf80f4bSopenharmony_ci 568bf80f4bSopenharmony_ci static constexpr int dataValue = 42; 578bf80f4bSopenharmony_ci}; 588bf80f4bSopenharmony_ci} 598bf80f4bSopenharmony_ci 608bf80f4bSopenharmony_ci/** 618bf80f4bSopenharmony_ci * @tc.name: PointerTest 628bf80f4bSopenharmony_ci * @tc.desc: test SharedPtr function 638bf80f4bSopenharmony_ci * @tc.type: FUNC 648bf80f4bSopenharmony_ci * @tc.require: I7DMS1 658bf80f4bSopenharmony_ci */ 668bf80f4bSopenharmony_ciHWTEST_F(PointerTest, SharedPtr, TestSize.Level1) 678bf80f4bSopenharmony_ci{ 688bf80f4bSopenharmony_ci int constructCount = 0, destructCount = 0; 698bf80f4bSopenharmony_ci ASSERT_NE(ptr.get(), nullptr); 708bf80f4bSopenharmony_ci 718bf80f4bSopenharmony_ci EXPECT_EQ(ptr->data, 0); 728bf80f4bSopenharmony_ci EXPECT_EQ(constructCount, 1); 738bf80f4bSopenharmony_ci 748bf80f4bSopenharmony_ci EXPECT_EQ(constructCount, 2); 758bf80f4bSopenharmony_ci ptr2->data = PtrTestData::dataValue; 768bf80f4bSopenharmony_ci EXPECT_NE(ptr->data, ptr2->data); 778bf80f4bSopenharmony_ci 788bf80f4bSopenharmony_ci EXPECT_EQ(destructCount, 0); 798bf80f4bSopenharmony_ci 808bf80f4bSopenharmony_ci ptr = ptr2; 818bf80f4bSopenharmony_ci EXPECT_EQ(destructCount, 1); 828bf80f4bSopenharmony_ci EXPECT_EQ(ptr->data, ptr2->data); 838bf80f4bSopenharmony_ci ptr.reset(); 848bf80f4bSopenharmony_ci ptr2.reset(); 858bf80f4bSopenharmony_ci EXPECT_EQ(destructCount, 2); 868bf80f4bSopenharmony_ci} 878bf80f4bSopenharmony_ci 888bf80f4bSopenharmony_ci/** 898bf80f4bSopenharmony_ci * @tc.name: PointerTest 908bf80f4bSopenharmony_ci * @tc.desc: test WeakPtr function 918bf80f4bSopenharmony_ci * @tc.type: FUNC 928bf80f4bSopenharmony_ci * @tc.require: I7DMS1 938bf80f4bSopenharmony_ci */ 948bf80f4bSopenharmony_ciHWTEST_F(PointerTest, WeakPtr, TestSize.Level1) 958bf80f4bSopenharmony_ci{ 968bf80f4bSopenharmony_ci int constructCount = 0, destructCount = 0; 978bf80f4bSopenharmony_ci ptr->data = PtrTestData::dataValue; 988bf80f4bSopenharmony_ci EXPECT_EQ(ptr->data, PtrTestData::dataValue); 998bf80f4bSopenharmony_ci EXPECT_EQ(constructCount, 1); 1008bf80f4bSopenharmony_ci 1018bf80f4bSopenharmony_ci BASE_NS::weak_ptr<PtrTestData> wptr(ptr); 1028bf80f4bSopenharmony_ci EXPECT_EQ(constructCount, 1); 1038bf80f4bSopenharmony_ci 1048bf80f4bSopenharmony_ci { 1058bf80f4bSopenharmony_ci auto p = wptr.lock(); 1068bf80f4bSopenharmony_ci ASSERT_NE(p.get(), nullptr); 1078bf80f4bSopenharmony_ci EXPECT_EQ(constructCount, 1); 1088bf80f4bSopenharmony_ci EXPECT_EQ(p->data, PtrTestData::dataValue); 1098bf80f4bSopenharmony_ci } 1108bf80f4bSopenharmony_ci 1118bf80f4bSopenharmony_ci ptr.reset(); 1128bf80f4bSopenharmony_ci EXPECT_EQ(destructCount, 1); 1138bf80f4bSopenharmony_ci 1148bf80f4bSopenharmony_ci auto p = wptr.lock(); 1158bf80f4bSopenharmony_ci EXPECT_EQ(p.get(), nullptr); 1168bf80f4bSopenharmony_ci} 1178bf80f4bSopenharmony_ci 1188bf80f4bSopenharmony_ciclass IBase : public CORE_NS::IInterface { 1198bf80f4bSopenharmony_cipublic: 1208bf80f4bSopenharmony_ci static constexpr BASE_NS::Uid UID { "00000000-0000-0000-0000-000000000001" }; 1218bf80f4bSopenharmony_ci virtual void AmBase() = 0; 1228bf80f4bSopenharmony_ci virtual void Identify() = 0; 1238bf80f4bSopenharmony_ci}; 1248bf80f4bSopenharmony_ci 1258bf80f4bSopenharmony_ciclass IBase2 : public IBase { 1268bf80f4bSopenharmony_cipublic: 1278bf80f4bSopenharmony_ci static constexpr BASE_NS::Uid UID { "00000000-0000-0000-0000-000000000002" }; 1288bf80f4bSopenharmony_ci virtual uint32_t NonConstCount() const = 0; 1298bf80f4bSopenharmony_ci virtual uint32_t ConstCount() const = 0; 1308bf80f4bSopenharmony_ci virtual void B2() = 0; 1318bf80f4bSopenharmony_ci virtual void DoIt() const = 0; 1328bf80f4bSopenharmony_ci virtual void DoIt() = 0; 1338bf80f4bSopenharmony_ci 1348bf80f4bSopenharmony_ci virtual void NonConstOnlyDoIt() = 0; 1358bf80f4bSopenharmony_ci virtual void ConstOnlyDoIt() const = 0; 1368bf80f4bSopenharmony_ci}; 1378bf80f4bSopenharmony_ci 1388bf80f4bSopenharmony_ciclass IBase3 : public IBase { 1398bf80f4bSopenharmony_cipublic: 1408bf80f4bSopenharmony_ci static constexpr BASE_NS::Uid UID { "00000000-0000-0000-0000-000000000003" }; 1418bf80f4bSopenharmony_ci virtual void B3() = 0; 1428bf80f4bSopenharmony_ci virtual void Identify() const = 0; 1438bf80f4bSopenharmony_ci virtual void Narf() const = 0; 1448bf80f4bSopenharmony_ci using IBase::Identify; 1458bf80f4bSopenharmony_ci}; 1468bf80f4bSopenharmony_ci 1478bf80f4bSopenharmony_ciclass DualBase : private IBase2, private IBase3 { 1488bf80f4bSopenharmony_cipublic: 1498bf80f4bSopenharmony_ci static BASE_NS::shared_ptr<CORE_NS::IInterface> Construct() 1508bf80f4bSopenharmony_ci { 1518bf80f4bSopenharmony_ci return interface_pointer_cast<CORE_NS::IInterface>(ptr); 1528bf80f4bSopenharmony_ci } 1538bf80f4bSopenharmony_ci mutable int ncc = 0; 1548bf80f4bSopenharmony_ci mutable int cc = 0; 1558bf80f4bSopenharmony_ci void Narf() const override 1568bf80f4bSopenharmony_ci { 1578bf80f4bSopenharmony_ci printf("Narf"); 1588bf80f4bSopenharmony_ci } 1598bf80f4bSopenharmony_ci uint32_t NonConstCount() const override 1608bf80f4bSopenharmony_ci { 1618bf80f4bSopenharmony_ci return ncc; 1628bf80f4bSopenharmony_ci } 1638bf80f4bSopenharmony_ci uint32_t ConstCount() const override 1648bf80f4bSopenharmony_ci { 1658bf80f4bSopenharmony_ci return cc; 1668bf80f4bSopenharmony_ci } 1678bf80f4bSopenharmony_ci void NonConstOnlyDoIt() override 1688bf80f4bSopenharmony_ci { 1698bf80f4bSopenharmony_ci ncc++; 1708bf80f4bSopenharmony_ci printf("Non Const Only DoIt\n"); 1718bf80f4bSopenharmony_ci } 1728bf80f4bSopenharmony_ci void ConstOnlyDoIt() const override 1738bf80f4bSopenharmony_ci { 1748bf80f4bSopenharmony_ci cc++; 1758bf80f4bSopenharmony_ci printf("Const Only DoIt\n"); 1768bf80f4bSopenharmony_ci } 1778bf80f4bSopenharmony_ci void DoIt() const override 1788bf80f4bSopenharmony_ci { 1798bf80f4bSopenharmony_ci cc++; 1808bf80f4bSopenharmony_ci printf("Const DoIt\n"); 1818bf80f4bSopenharmony_ci } 1828bf80f4bSopenharmony_ci void DoIt() override 1838bf80f4bSopenharmony_ci { 1848bf80f4bSopenharmony_ci ncc++; 1858bf80f4bSopenharmony_ci printf("Non const DoIt\n"); 1868bf80f4bSopenharmony_ci } 1878bf80f4bSopenharmony_ci void AmBase() override 1888bf80f4bSopenharmony_ci { 1898bf80f4bSopenharmony_ci printf("DualBase %p\n", this); 1908bf80f4bSopenharmony_ci } 1918bf80f4bSopenharmony_ci void Identify() const override 1928bf80f4bSopenharmony_ci { 1938bf80f4bSopenharmony_ci printf("I am CONST DualBase %p\n", this); 1948bf80f4bSopenharmony_ci } 1958bf80f4bSopenharmony_ci void Identify() override 1968bf80f4bSopenharmony_ci { 1978bf80f4bSopenharmony_ci printf("I am DualBase %p\n", this); 1988bf80f4bSopenharmony_ci } 1998bf80f4bSopenharmony_ci void B2() override 2008bf80f4bSopenharmony_ci { 2018bf80f4bSopenharmony_ci printf("DualBase (B2) %p\n", this); 2028bf80f4bSopenharmony_ci } 2038bf80f4bSopenharmony_ci void B3() override 2048bf80f4bSopenharmony_ci { 2058bf80f4bSopenharmony_ci printf("DualBase (B3) %p\n", this); 2068bf80f4bSopenharmony_ci } 2078bf80f4bSopenharmony_ci 2088bf80f4bSopenharmony_ci const IInterface* GetInterface(const BASE_NS::Uid& uid) const override 2098bf80f4bSopenharmony_ci { 2108bf80f4bSopenharmony_ci return const_cast<DualBase*>(this)->GetInterface(uid); 2118bf80f4bSopenharmony_ci } 2128bf80f4bSopenharmony_ci 2138bf80f4bSopenharmony_ci IInterface* GetInterface(const BASE_NS::Uid& uid) override 2148bf80f4bSopenharmony_ci { 2158bf80f4bSopenharmony_ci if (uid == IInterface::UID) { 2168bf80f4bSopenharmony_ci return static_cast<IBase2*>(this); 2178bf80f4bSopenharmony_ci } 2188bf80f4bSopenharmony_ci if (uid == IBase::UID) { 2198bf80f4bSopenharmony_ci return static_cast<IBase2*>(this); 2208bf80f4bSopenharmony_ci } 2218bf80f4bSopenharmony_ci if (uid == IBase2::UID) { 2228bf80f4bSopenharmony_ci return static_cast<IBase2*>(this); 2238bf80f4bSopenharmony_ci } 2248bf80f4bSopenharmony_ci if (uid == IBase3::UID) { 2258bf80f4bSopenharmony_ci return static_cast<IBase3*>(this); 2268bf80f4bSopenharmony_ci } 2278bf80f4bSopenharmony_ci return nullptr; 2288bf80f4bSopenharmony_ci } 2298bf80f4bSopenharmony_ci META_IMPLEMENT_REF_COUNT() 2308bf80f4bSopenharmony_ci}; 2318bf80f4bSopenharmony_ci 2328bf80f4bSopenharmony_ci/** 2338bf80f4bSopenharmony_ci * @tc.name: PointerTest 2348bf80f4bSopenharmony_ci * @tc.desc: test AliasTest function 2358bf80f4bSopenharmony_ci * @tc.type: FUNC 2368bf80f4bSopenharmony_ci * @tc.require: I7DMS1 2378bf80f4bSopenharmony_ci */ 2388bf80f4bSopenharmony_ciHWTEST_F(PointerTest, AliasTest, TestSize.Level1) 2398bf80f4bSopenharmony_ci{ 2408bf80f4bSopenharmony_ci { 2418bf80f4bSopenharmony_ci IBase2* ap = (IBase2*)dd->GetInterface(IBase2::UID); 2428bf80f4bSopenharmony_ci IBase3* bp = (IBase3*)dd->GetInterface(IBase3::UID); 2438bf80f4bSopenharmony_ci BASE_NS::shared_ptr<IBase> orig(ap); 2448bf80f4bSopenharmony_ci { 2458bf80f4bSopenharmony_ci BASE_NS::shared_ptr<IBase> alias(orig, bp); 2468bf80f4bSopenharmony_ci } 2478bf80f4bSopenharmony_ci } 2488bf80f4bSopenharmony_ci { 2498bf80f4bSopenharmony_ci BASE_NS::shared_ptr b3(interface_pointer_cast<IBase3>(t)); 2508bf80f4bSopenharmony_ci BASE_NS::shared_ptr b2(interface_pointer_cast<IBase2>(t)); 2518bf80f4bSopenharmony_ci 2528bf80f4bSopenharmony_ci EXPECT_TRUE(t == b3); 2538bf80f4bSopenharmony_ci EXPECT_TRUE((void*)b3.get() != (void*)b2.get()); 2548bf80f4bSopenharmony_ci 2558bf80f4bSopenharmony_ci BASE_NS::shared_ptr ib3(interface_pointer_cast<CORE_NS::IInterface>(t)); 2568bf80f4bSopenharmony_ci BASE_NS::shared_ptr ib2(interface_pointer_cast<CORE_NS::IInterface>(t)); 2578bf80f4bSopenharmony_ci 2588bf80f4bSopenharmony_ci EXPECT_TRUE(ib2 == b2); 2598bf80f4bSopenharmony_ci EXPECT_TRUE(ib3 == b3); 2608bf80f4bSopenharmony_ci EXPECT_TRUE(ib3 == ib2); 2618bf80f4bSopenharmony_ci EXPECT_TRUE((void*)ib3.get() == (void*)ib2.get()); 2628bf80f4bSopenharmony_ci } 2638bf80f4bSopenharmony_ci 2648bf80f4bSopenharmony_ci BASE_NS::weak_ptr<IBase> wp2; 2658bf80f4bSopenharmony_ci { 2668bf80f4bSopenharmony_ci BASE_NS::shared_ptr<IBase3> b3(interface_pointer_cast<IBase3>(t)); 2678bf80f4bSopenharmony_ci wp2 = b3; 2688bf80f4bSopenharmony_ci ASSERT_TRUE(wp2.lock()); 2698bf80f4bSopenharmony_ci ASSERT_FALSE(wp2.Compare(b3)); 2708bf80f4bSopenharmony_ci ASSERT_TRUE(wp2.lock() == b3); 2718bf80f4bSopenharmony_ci ASSERT_TRUE(b3 == interface_pointer_cast<IBase3>(wp2.lock())); 2728bf80f4bSopenharmony_ci b3.reset(); 2738bf80f4bSopenharmony_ci ASSERT_TRUE(wp2.lock()); 2748bf80f4bSopenharmony_ci ASSERT_FALSE(wp2.Compare(b3)); 2758bf80f4bSopenharmony_ci ASSERT_FALSE(b3 == interface_pointer_cast<IBase3>(wp2.lock())); 2768bf80f4bSopenharmony_ci } 2778bf80f4bSopenharmony_ci 2788bf80f4bSopenharmony_ci BASE_NS::weak_ptr wp(t); 2798bf80f4bSopenharmony_ci ASSERT_TRUE(wp.lock()); 2808bf80f4bSopenharmony_ci ASSERT_TRUE(wp.Compare(t)); 2818bf80f4bSopenharmony_ci ASSERT_TRUE(t == wp.lock()); 2828bf80f4bSopenharmony_ci 2838bf80f4bSopenharmony_ci ASSERT_TRUE(wp2.lock()); 2848bf80f4bSopenharmony_ci ASSERT_TRUE(wp2.lock() == t); 2858bf80f4bSopenharmony_ci ASSERT_TRUE(t == wp2.lock()); 2868bf80f4bSopenharmony_ci 2878bf80f4bSopenharmony_ci t.reset(); 2888bf80f4bSopenharmony_ci 2898bf80f4bSopenharmony_ci ASSERT_FALSE(wp.Compare(t)); 2908bf80f4bSopenharmony_ci ASSERT_TRUE(t == wp.lock()); 2918bf80f4bSopenharmony_ci 2928bf80f4bSopenharmony_ci ASSERT_FALSE(wp.lock()); 2938bf80f4bSopenharmony_ci ASSERT_TRUE(wp.lock() == nullptr); 2948bf80f4bSopenharmony_ci ASSERT_TRUE(t == nullptr); 2958bf80f4bSopenharmony_ci 2968bf80f4bSopenharmony_ci ASSERT_TRUE(wp2.lock() == t); 2978bf80f4bSopenharmony_ci ASSERT_TRUE(t == wp2.lock()); 2988bf80f4bSopenharmony_ci 2998bf80f4bSopenharmony_ci ASSERT_FALSE(wp2.lock()); 3008bf80f4bSopenharmony_ci ASSERT_TRUE(wp2.lock() == nullptr); 3018bf80f4bSopenharmony_ci} 3028bf80f4bSopenharmony_ci 3038bf80f4bSopenharmony_ci/** 3048bf80f4bSopenharmony_ci * @tc.name: PointerTest 3058bf80f4bSopenharmony_ci * @tc.desc: test NullTests function 3068bf80f4bSopenharmony_ci * @tc.type: FUNC 3078bf80f4bSopenharmony_ci * @tc.require: I7DMS1 3088bf80f4bSopenharmony_ci */ 3098bf80f4bSopenharmony_ciHWTEST_F(PointerTest, NullTests, TestSize.Level1) 3108bf80f4bSopenharmony_ci{ 3118bf80f4bSopenharmony_ci int constructCount = 0, destructCount = 0; 3128bf80f4bSopenharmony_ci BASE_NS::weak_ptr<PtrTestData> ptr2 = ptr; 3138bf80f4bSopenharmony_ci BASE_NS::weak_ptr<PtrTestData> ptr22 = ptr; 3148bf80f4bSopenharmony_ci ASSERT_FALSE(ptr.get() == nullptr); 3158bf80f4bSopenharmony_ci ASSERT_FALSE(ptr == nullptr); 3168bf80f4bSopenharmony_ci 3178bf80f4bSopenharmony_ci ASSERT_FALSE(ptr2.lock().get() == nullptr); 3188bf80f4bSopenharmony_ci ASSERT_FALSE(ptr2.lock() == nullptr); 3198bf80f4bSopenharmony_ci 3208bf80f4bSopenharmony_ci ASSERT_TRUE(ptr.get() != nullptr); 3218bf80f4bSopenharmony_ci ASSERT_TRUE(ptr != nullptr); 3228bf80f4bSopenharmony_ci 3238bf80f4bSopenharmony_ci ASSERT_TRUE(ptr2.lock().get() != nullptr); 3248bf80f4bSopenharmony_ci ASSERT_TRUE(ptr2.lock() != nullptr); 3258bf80f4bSopenharmony_ci 3268bf80f4bSopenharmony_ci ptr.reset(); 3278bf80f4bSopenharmony_ci 3288bf80f4bSopenharmony_ci ASSERT_FALSE(ptr.get() != nullptr); 3298bf80f4bSopenharmony_ci ASSERT_FALSE(ptr != nullptr); 3308bf80f4bSopenharmony_ci 3318bf80f4bSopenharmony_ci ASSERT_FALSE(ptr2.lock().get() != nullptr); 3328bf80f4bSopenharmony_ci ASSERT_FALSE(ptr2.lock() != nullptr); 3338bf80f4bSopenharmony_ci 3348bf80f4bSopenharmony_ci ASSERT_TRUE(ptr.get() == nullptr); 3358bf80f4bSopenharmony_ci ASSERT_TRUE(ptr == nullptr); 3368bf80f4bSopenharmony_ci 3378bf80f4bSopenharmony_ci ASSERT_TRUE(ptr2.lock().get() == nullptr); 3388bf80f4bSopenharmony_ci ASSERT_TRUE(ptr2.lock() == nullptr); 3398bf80f4bSopenharmony_ci 3408bf80f4bSopenharmony_ci BASE_NS::shared_ptr<PtrTestData> ptr3; 3418bf80f4bSopenharmony_ci BASE_NS::weak_ptr<PtrTestData> ptr4; 3428bf80f4bSopenharmony_ci 3438bf80f4bSopenharmony_ci ASSERT_TRUE(ptr3 == ptr4.lock()); 3448bf80f4bSopenharmony_ci ASSERT_TRUE(ptr4.Compare(ptr3)); 3458bf80f4bSopenharmony_ci 3468bf80f4bSopenharmony_ci ASSERT_FALSE(ptr4.Compare(ptr2)); 3478bf80f4bSopenharmony_ci ASSERT_TRUE(ptr3 == ptr); 3488bf80f4bSopenharmony_ci 3498bf80f4bSopenharmony_ci ASSERT_TRUE(ptr2.Compare(ptr22)); 3508bf80f4bSopenharmony_ci 3518bf80f4bSopenharmony_ci { 3528bf80f4bSopenharmony_ci BASE_NS::weak_ptr<PtrTestData> empty; 3538bf80f4bSopenharmony_ci BASE_NS::weak_ptr<PtrTestData> ptrAW = ptrA; 3548bf80f4bSopenharmony_ci 3558bf80f4bSopenharmony_ci BASE_NS::weak_ptr<PtrTestData> ptrBW = ptrB; 3568bf80f4bSopenharmony_ci 3578bf80f4bSopenharmony_ci ptrA.reset(); 3588bf80f4bSopenharmony_ci ptrB.reset(); 3598bf80f4bSopenharmony_ci 3608bf80f4bSopenharmony_ci ASSERT_FALSE(ptrAW.Compare(empty)); 3618bf80f4bSopenharmony_ci ASSERT_FALSE(ptrAW.Compare(ptrBW)); 3628bf80f4bSopenharmony_ci ASSERT_TRUE(ptrAW.lock() == ptrBW.lock()); 3638bf80f4bSopenharmony_ci ASSERT_TRUE(empty.lock() == ptrBW.lock()); 3648bf80f4bSopenharmony_ci } 3658bf80f4bSopenharmony_ci} 3668bf80f4bSopenharmony_ci 3678bf80f4bSopenharmony_ci/** 3688bf80f4bSopenharmony_ci * @tc.name: PointerTest 3698bf80f4bSopenharmony_ci * @tc.desc: test AliasTest2 function 3708bf80f4bSopenharmony_ci * @tc.type: FUNC 3718bf80f4bSopenharmony_ci * @tc.require: I7DMS1 3728bf80f4bSopenharmony_ci */ 3738bf80f4bSopenharmony_ciHWTEST_F(PointerTest, AliasTest2, TestSize.Level1) 3748bf80f4bSopenharmony_ci{ 3758bf80f4bSopenharmony_ci BASE_NS::shared_ptr<CORE_NS::IInterface> t((IBase*)(db)->GetInterface(CORE_NS::IInterface::UID)); 3768bf80f4bSopenharmony_ci BASE_NS::shared_ptr ib1(interface_pointer_cast<CORE_NS::IInterface>(t)); 3778bf80f4bSopenharmony_ci BASE_NS::shared_ptr ib2(interface_pointer_cast<IBase>(t)); 3788bf80f4bSopenharmony_ci BASE_NS::shared_ptr ib3(interface_pointer_cast<IBase2>(t)); 3798bf80f4bSopenharmony_ci BASE_NS::shared_ptr ib4(interface_pointer_cast<IBase3>(t)); 3808bf80f4bSopenharmony_ci 3818bf80f4bSopenharmony_ci ASSERT_TRUE(t == ib1); 3828bf80f4bSopenharmony_ci ASSERT_TRUE(t == ib2); 3838bf80f4bSopenharmony_ci ASSERT_TRUE(t == ib3); 3848bf80f4bSopenharmony_ci ASSERT_TRUE(t == ib4); 3858bf80f4bSopenharmony_ci ASSERT_TRUE(ib2 == ib3); 3868bf80f4bSopenharmony_ci ASSERT_TRUE(ib2 == ib4); 3878bf80f4bSopenharmony_ci 3888bf80f4bSopenharmony_ci ib4 = nullptr; 3898bf80f4bSopenharmony_ci t = nullptr; 3908bf80f4bSopenharmony_ci ib1 = nullptr; 3918bf80f4bSopenharmony_ci ib2 = nullptr; 3928bf80f4bSopenharmony_ci ib3 = nullptr; 3938bf80f4bSopenharmony_ci} 3948bf80f4bSopenharmony_ci 3958bf80f4bSopenharmony_ci/** 3968bf80f4bSopenharmony_ci * @tc.name: PointerTest 3978bf80f4bSopenharmony_ci * @tc.desc: test WeakTest2 function 3988bf80f4bSopenharmony_ci * @tc.type: FUNC 3998bf80f4bSopenharmony_ci * @tc.require: I7DMS1 4008bf80f4bSopenharmony_ci */ 4018bf80f4bSopenharmony_ciHWTEST_F(PointerTest, WeakTest2, TestSize.Level1) 4028bf80f4bSopenharmony_ci{ 4038bf80f4bSopenharmony_ci BASE_NS::shared_ptr<CORE_NS::IInterface> t((IBase*)(db)->GetInterface(CORE_NS::IInterface::UID)); 4048bf80f4bSopenharmony_ci BASE_NS::shared_ptr ib1(interface_pointer_cast<CORE_NS::IInterface>(t)); 4058bf80f4bSopenharmony_ci BASE_NS::shared_ptr ib2(interface_pointer_cast<IBase>(t)); 4068bf80f4bSopenharmony_ci BASE_NS::shared_ptr ib3(interface_pointer_cast<IBase2>(t)); 4078bf80f4bSopenharmony_ci BASE_NS::shared_ptr ib4(interface_pointer_cast<IBase3>(t)); 4088bf80f4bSopenharmony_ci 4098bf80f4bSopenharmony_ci BASE_NS::weak_ptr wt(t); 4108bf80f4bSopenharmony_ci BASE_NS::weak_ptr wb1(ib1); 4118bf80f4bSopenharmony_ci BASE_NS::weak_ptr wb2(ib2); 4128bf80f4bSopenharmony_ci BASE_NS::weak_ptr wb3(ib3); 4138bf80f4bSopenharmony_ci BASE_NS::weak_ptr wb4(ib4); 4148bf80f4bSopenharmony_ci 4158bf80f4bSopenharmony_ci ASSERT_TRUE(wt.Compare(t)); 4168bf80f4bSopenharmony_ci ASSERT_TRUE(wt.Compare(wb1)); 4178bf80f4bSopenharmony_ci ASSERT_TRUE(wt.Compare(wb2)); 4188bf80f4bSopenharmony_ci ASSERT_TRUE(wt.Compare(wb3)); 4198bf80f4bSopenharmony_ci ASSERT_FALSE(wt.Compare(wb4)); 4208bf80f4bSopenharmony_ci ASSERT_TRUE(wt.CompareOwner(wb4)); 4218bf80f4bSopenharmony_ci ASSERT_TRUE(wb2.Compare(wb3)); 4228bf80f4bSopenharmony_ci 4238bf80f4bSopenharmony_ci ASSERT_TRUE(wb2.CompareOwner(wb4)); 4248bf80f4bSopenharmony_ci ASSERT_FALSE(wb2.Compare(wb4)); 4258bf80f4bSopenharmony_ci 4268bf80f4bSopenharmony_ci ASSERT_FALSE(wt.Compare(wb4)); 4278bf80f4bSopenharmony_ci ASSERT_TRUE(wt.CompareOwner(wb4)); 4288bf80f4bSopenharmony_ci ASSERT_TRUE(wt.lock() == wb4.lock()); 4298bf80f4bSopenharmony_ci 4308bf80f4bSopenharmony_ci t = nullptr; 4318bf80f4bSopenharmony_ci 4328bf80f4bSopenharmony_ci ASSERT_FALSE(wt.Compare(t)); 4338bf80f4bSopenharmony_ci ASSERT_TRUE(wt.lock()); 4348bf80f4bSopenharmony_ci ASSERT_TRUE(t == nullptr); 4358bf80f4bSopenharmony_ci 4368bf80f4bSopenharmony_ci ASSERT_TRUE(wt.Compare(wb1)); 4378bf80f4bSopenharmony_ci ASSERT_TRUE(wt.Compare(wb2)); 4388bf80f4bSopenharmony_ci ASSERT_TRUE(wt.Compare(wb3)); 4398bf80f4bSopenharmony_ci 4408bf80f4bSopenharmony_ci ib1 = nullptr; 4418bf80f4bSopenharmony_ci ib2 = nullptr; 4428bf80f4bSopenharmony_ci ib3 = nullptr; 4438bf80f4bSopenharmony_ci 4448bf80f4bSopenharmony_ci ASSERT_TRUE(wt.Compare(wb1)); 4458bf80f4bSopenharmony_ci ASSERT_TRUE(wt.Compare(wb2)); 4468bf80f4bSopenharmony_ci ASSERT_TRUE(wt.Compare(wb3)); 4478bf80f4bSopenharmony_ci ASSERT_FALSE(wt.Compare(wb4)); 4488bf80f4bSopenharmony_ci ASSERT_TRUE(wt.CompareOwner(wb4)); 4498bf80f4bSopenharmony_ci ASSERT_TRUE(wb2.Compare(wb3)); 4508bf80f4bSopenharmony_ci ASSERT_TRUE(wb2.CompareOwner(wb4)); 4518bf80f4bSopenharmony_ci ASSERT_FALSE(wb2.Compare(wb4)); 4528bf80f4bSopenharmony_ci 4538bf80f4bSopenharmony_ci wt = nullptr; 4548bf80f4bSopenharmony_ci wb1 = nullptr; 4558bf80f4bSopenharmony_ci wb2 = nullptr; 4568bf80f4bSopenharmony_ci wb3 = nullptr; 4578bf80f4bSopenharmony_ci 4588bf80f4bSopenharmony_ci ASSERT_TRUE(wt.lock() == nullptr); 4598bf80f4bSopenharmony_ci ASSERT_TRUE(wb1.lock() == nullptr); 4608bf80f4bSopenharmony_ci ASSERT_TRUE(wb2.lock() == nullptr); 4618bf80f4bSopenharmony_ci ASSERT_TRUE(wb3.lock() == nullptr); 4628bf80f4bSopenharmony_ci ASSERT_TRUE(wb2.Compare(wb3)); 4638bf80f4bSopenharmony_ci ASSERT_TRUE(!wb2.Compare(wb4)); 4648bf80f4bSopenharmony_ci 4658bf80f4bSopenharmony_ci auto* ptr = ib4.get(); 4668bf80f4bSopenharmony_ci auto* ptr2 = wb4.lock().get(); 4678bf80f4bSopenharmony_ci 4688bf80f4bSopenharmony_ci ib4 = nullptr; 4698bf80f4bSopenharmony_ci 4708bf80f4bSopenharmony_ci ASSERT_TRUE(wb4.lock() == nullptr); 4718bf80f4bSopenharmony_ci ASSERT_FALSE(wt.Compare(wb4)); 4728bf80f4bSopenharmony_ci} 4738bf80f4bSopenharmony_ci 4748bf80f4bSopenharmony_ci/** 4758bf80f4bSopenharmony_ci * @tc.name: PointerTest 4768bf80f4bSopenharmony_ci * @tc.desc: test ImplicitConversions function 4778bf80f4bSopenharmony_ci * @tc.type: FUNC 4788bf80f4bSopenharmony_ci * @tc.require: I7DMS1 4798bf80f4bSopenharmony_ci */ 4808bf80f4bSopenharmony_ciHWTEST_F(PointerTest, ImplicitConversions, TestSize.Level1) 4818bf80f4bSopenharmony_ci{ 4828bf80f4bSopenharmony_ci auto db = DualBase::Construct(); 4838bf80f4bSopenharmony_ci BASE_NS::shared_ptr<IBase3> ib4(interface_pointer_cast<IBase3>(db)); 4848bf80f4bSopenharmony_ci BASE_NS::shared_ptr<CORE_NS::IInterface> a(ib4); 4858bf80f4bSopenharmony_ci 4868bf80f4bSopenharmony_ci ASSERT_TRUE(db.get() != ib4.get()); 4878bf80f4bSopenharmony_ci ASSERT_TRUE(db.get() == a.get()); 4888bf80f4bSopenharmony_ci 4898bf80f4bSopenharmony_ci BASE_NS::weak_ptr<CORE_NS::IInterface> aa(ib4); 4908bf80f4bSopenharmony_ci 4918bf80f4bSopenharmony_ci BASE_NS::weak_ptr<CORE_NS::IInterface> b; 4928bf80f4bSopenharmony_ci b = ib4; 4938bf80f4bSopenharmony_ci 4948bf80f4bSopenharmony_ci BASE_NS::weak_ptr<IBase3> ba(ib4); 4958bf80f4bSopenharmony_ci 4968bf80f4bSopenharmony_ci BASE_NS::weak_ptr<CORE_NS::IInterface> d(ba); 4978bf80f4bSopenharmony_ci 4988bf80f4bSopenharmony_ci BASE_NS::weak_ptr<CORE_NS::IInterface> dd; 4998bf80f4bSopenharmony_ci dd = ba; 5008bf80f4bSopenharmony_ci 5018bf80f4bSopenharmony_ci BASE_NS::weak_ptr<CORE_NS::IInterface> c(BASE_NS::move(ba)); 5028bf80f4bSopenharmony_ci} 5038bf80f4bSopenharmony_ci 5048bf80f4bSopenharmony_ci/** 5058bf80f4bSopenharmony_ci * @tc.name: PointerTest 5068bf80f4bSopenharmony_ci * @tc.desc: test CusTomDeleter function 5078bf80f4bSopenharmony_ci * @tc.type: FUNC 5088bf80f4bSopenharmony_ci * @tc.require: I7DMS1 5098bf80f4bSopenharmony_ci */ 5108bf80f4bSopenharmony_ciint g_customDeleterCalled = 0; 5118bf80f4bSopenharmony_ciHWTEST_F(PointerTest, CustomDeleter, TestSize.Level1) 5128bf80f4bSopenharmony_ci{ 5138bf80f4bSopenharmony_ci int value = 42; 5148bf80f4bSopenharmony_ci auto deleter = [](void* p) { 5158bf80f4bSopenharmony_ci g_customDeleterCalled++; 5168bf80f4bSopenharmony_ci printf("Last reference for %p gone\n", p); 5178bf80f4bSopenharmony_ci }; 5188bf80f4bSopenharmony_ci { 5198bf80f4bSopenharmony_ci BASE_NS::shared_ptr<int> sb2; 5208bf80f4bSopenharmony_ci { 5218bf80f4bSopenharmony_ci BASE_NS::shared_ptr<int> custom(&value, deleter); 5228bf80f4bSopenharmony_ci BASE_NS::weak_ptr wb = custom; 5238bf80f4bSopenharmony_ci BASE_NS::shared_ptr sb = custom; 5248bf80f4bSopenharmony_ci sb2 = custom; 5258bf80f4bSopenharmony_ci custom = nullptr; 5268bf80f4bSopenharmony_ci sb = nullptr; 5278bf80f4bSopenharmony_ci } 5288bf80f4bSopenharmony_ci ASSERT_TRUE(g_customDeleterCalled == 0); 5298bf80f4bSopenharmony_ci } 5308bf80f4bSopenharmony_ci ASSERT_TRUE(g_customDeleterCalled == 1); 5318bf80f4bSopenharmony_ci} 5328bf80f4bSopenharmony_ci 5338bf80f4bSopenharmony_ci/** 5348bf80f4bSopenharmony_ci * @tc.name: PointerTest 5358bf80f4bSopenharmony_ci * @tc.desc: test ConstConversion function 5368bf80f4bSopenharmony_ci * @tc.type: FUNC 5378bf80f4bSopenharmony_ci * @tc.require: I7DMS1 5388bf80f4bSopenharmony_ci */ 5398bf80f4bSopenharmony_ciHWTEST_F(PointerTest, ConstConversion, TestSize.Level1) 5408bf80f4bSopenharmony_ci{ 5418bf80f4bSopenharmony_ci auto db = interface_pointer_cast<IBase2>(DualBase::Construct()); 5428bf80f4bSopenharmony_ci 5438bf80f4bSopenharmony_ci BASE_NS::shared_ptr<IBase2> a(db); 5448bf80f4bSopenharmony_ci BASE_NS::shared_ptr<const IBase2> ca(db); 5458bf80f4bSopenharmony_ci 5468bf80f4bSopenharmony_ci EXPECT_EQ(db->NonConstCount(), 0); 5478bf80f4bSopenharmony_ci EXPECT_EQ(db->ConstCount(), 0); 5488bf80f4bSopenharmony_ci 5498bf80f4bSopenharmony_ci a->DoIt(); 5508bf80f4bSopenharmony_ci EXPECT_EQ(db->NonConstCount(), 1); 5518bf80f4bSopenharmony_ci EXPECT_EQ(db->ConstCount(), 0); 5528bf80f4bSopenharmony_ci 5538bf80f4bSopenharmony_ci ca->DoIt(); 5548bf80f4bSopenharmony_ci EXPECT_EQ(db->NonConstCount(), 1); 5558bf80f4bSopenharmony_ci EXPECT_EQ(db->ConstCount(), 1); 5568bf80f4bSopenharmony_ci ca->DoIt(); 5578bf80f4bSopenharmony_ci EXPECT_EQ(db->NonConstCount(), 1); 5588bf80f4bSopenharmony_ci EXPECT_EQ(db->ConstCount(), 2); 5598bf80f4bSopenharmony_ci 5608bf80f4bSopenharmony_ci a->ConstOnlyDoIt(); 5618bf80f4bSopenharmony_ci EXPECT_EQ(db->NonConstCount(), 1); 5628bf80f4bSopenharmony_ci EXPECT_EQ(db->ConstCount(), 3); 5638bf80f4bSopenharmony_ci ca->ConstOnlyDoIt(); 5648bf80f4bSopenharmony_ci EXPECT_EQ(db->NonConstCount(), 1); 5658bf80f4bSopenharmony_ci EXPECT_EQ(db->ConstCount(), 4); 5668bf80f4bSopenharmony_ci 5678bf80f4bSopenharmony_ci a->NonConstOnlyDoIt(); 5688bf80f4bSopenharmony_ci EXPECT_EQ(db->NonConstCount(), 2); 5698bf80f4bSopenharmony_ci EXPECT_EQ(db->ConstCount(), 4); 5708bf80f4bSopenharmony_ci 5718bf80f4bSopenharmony_ci BASE_NS::shared_ptr<const IBase3> da; 5728bf80f4bSopenharmony_ci 5738bf80f4bSopenharmony_ci da = interface_pointer_cast<const IBase3>(db); 5748bf80f4bSopenharmony_ci da->Identify(); 5758bf80f4bSopenharmony_ci 5768bf80f4bSopenharmony_ci auto* p = interface_cast<const IBase3>(a); 5778bf80f4bSopenharmony_ci 5788bf80f4bSopenharmony_ci auto* po = interface_cast<const IBase2>(a); 5798bf80f4bSopenharmony_ci auto* ppo = interface_cast<const IBase2>(ca); 5808bf80f4bSopenharmony_ci 5818bf80f4bSopenharmony_ci p->Narf(); 5828bf80f4bSopenharmony_ci} 5838bf80f4bSopenharmony_ci 5848bf80f4bSopenharmony_ci/** 5858bf80f4bSopenharmony_ci * @tc.name: PointerTest 5868bf80f4bSopenharmony_ci * @tc.desc: test ConstConversion2 function 5878bf80f4bSopenharmony_ci * @tc.type: FUNC 5888bf80f4bSopenharmony_ci * @tc.require: I7DMS1 5898bf80f4bSopenharmony_ci */ 5908bf80f4bSopenharmony_ciHWTEST_F(PointerTest, ConstConversion2, TestSize.Level1) 5918bf80f4bSopenharmony_ci{ 5928bf80f4bSopenharmony_ci auto db = interface_pointer_cast<IBase2>(DualBase::Construct()); 5938bf80f4bSopenharmony_ci 5948bf80f4bSopenharmony_ci BASE_NS::weak_ptr<IBase2> a(db); 5958bf80f4bSopenharmony_ci BASE_NS::weak_ptr<const IBase2> ca(db); 5968bf80f4bSopenharmony_ci 5978bf80f4bSopenharmony_ci EXPECT_EQ(db->NonConstCount(), 0); 5988bf80f4bSopenharmony_ci EXPECT_EQ(db->ConstCount(), 0); 5998bf80f4bSopenharmony_ci 6008bf80f4bSopenharmony_ci a.lock()->DoIt(); 6018bf80f4bSopenharmony_ci EXPECT_EQ(db->NonConstCount(), 1); 6028bf80f4bSopenharmony_ci EXPECT_EQ(db->ConstCount(), 0); 6038bf80f4bSopenharmony_ci 6048bf80f4bSopenharmony_ci ca.lock()->DoIt(); 6058bf80f4bSopenharmony_ci EXPECT_EQ(db->NonConstCount(), 1); 6068bf80f4bSopenharmony_ci EXPECT_EQ(db->ConstCount(), 1); 6078bf80f4bSopenharmony_ci ca.lock()->DoIt(); 6088bf80f4bSopenharmony_ci EXPECT_EQ(db->NonConstCount(), 1); 6098bf80f4bSopenharmony_ci EXPECT_EQ(db->ConstCount(), 2); 6108bf80f4bSopenharmony_ci 6118bf80f4bSopenharmony_ci a.lock()->ConstOnlyDoIt(); 6128bf80f4bSopenharmony_ci EXPECT_EQ(db->NonConstCount(), 1); 6138bf80f4bSopenharmony_ci EXPECT_EQ(db->ConstCount(), 3); 6148bf80f4bSopenharmony_ci ca.lock()->ConstOnlyDoIt(); 6158bf80f4bSopenharmony_ci EXPECT_EQ(db->NonConstCount(), 1); 6168bf80f4bSopenharmony_ci EXPECT_EQ(db->ConstCount(), 4); 6178bf80f4bSopenharmony_ci 6188bf80f4bSopenharmony_ci a.lock()->NonConstOnlyDoIt(); 6198bf80f4bSopenharmony_ci EXPECT_EQ(db->NonConstCount(), 2); 6208bf80f4bSopenharmony_ci EXPECT_EQ(db->ConstCount(), 4); 6218bf80f4bSopenharmony_ci 6228bf80f4bSopenharmony_ci BASE_NS::weak_ptr<const IBase3> da; 6238bf80f4bSopenharmony_ci 6248bf80f4bSopenharmony_ci da = interface_pointer_cast<const IBase3>(db); 6258bf80f4bSopenharmony_ci da.lock()->Identify(); 6268bf80f4bSopenharmony_ci} 6278bf80f4bSopenharmony_ciMETA_END_NAMESPACE()