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()