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/base/shared_ptr.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 SharedPtrTest : 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_ci/**
418bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest
428bf80f4bSopenharmony_ci * @tc.desc: test SharedPtrCanBeConvertedToSharedPtrWithConstType function
438bf80f4bSopenharmony_ci * @tc.type: FUNC
448bf80f4bSopenharmony_ci * @tc.require: I7DMS1
458bf80f4bSopenharmony_ci */
468bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, SharedPtrCanBeConvertedToSharedPtrWithConstType, TestSize.Level1)
478bf80f4bSopenharmony_ci{
488bf80f4bSopenharmony_ci    constexpr auto initialValue = 120;
498bf80f4bSopenharmony_ci
508bf80f4bSopenharmony_ci    BASE_NS::shared_ptr<const int> cptr = ptr;
518bf80f4bSopenharmony_ci
528bf80f4bSopenharmony_ci    EXPECT_EQ(*cptr, initialValue);
538bf80f4bSopenharmony_ci}
548bf80f4bSopenharmony_ci
558bf80f4bSopenharmony_ci/**
568bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest
578bf80f4bSopenharmony_ci * @tc.desc: test SharedPtrCanBeReturnedToSharedPtrWithConstType function
588bf80f4bSopenharmony_ci * @tc.type: FUNC
598bf80f4bSopenharmony_ci * @tc.require: I7DMS1
608bf80f4bSopenharmony_ci */
618bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, SharedPtrCanBeReturnedAsSharedPtrWithConstType, TestSize.Level1)
628bf80f4bSopenharmony_ci{
638bf80f4bSopenharmony_ci    constexpr auto initialValue = 120;
648bf80f4bSopenharmony_ci
658bf80f4bSopenharmony_ci    auto functionReturningSharedConstPtr = [ptr]() -> BASE_NS::shared_ptr<const int> { return ptr; };
668bf80f4bSopenharmony_ci
678bf80f4bSopenharmony_ci    auto cptr = functionReturningSharedConstPtr();
688bf80f4bSopenharmony_ci
698bf80f4bSopenharmony_ci    EXPECT_EQ(*cptr, initialValue);
708bf80f4bSopenharmony_ci}
718bf80f4bSopenharmony_ci
728bf80f4bSopenharmony_ci/**
738bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest
748bf80f4bSopenharmony_ci * @tc.desc: test DefaultConstructedSharedPtrIsEmpty function
758bf80f4bSopenharmony_ci * @tc.type: FUNC
768bf80f4bSopenharmony_ci * @tc.require: I7DMS1
778bf80f4bSopenharmony_ci */
788bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, DefaultConstructedSharedPtrIsEmpty, TestSize.Level1)
798bf80f4bSopenharmony_ci{
808bf80f4bSopenharmony_ci    BASE_NS::shared_ptr<int> ptr;
818bf80f4bSopenharmony_ci
828bf80f4bSopenharmony_ci    const auto rawPtr = ptr.get();
838bf80f4bSopenharmony_ci    const bool boolOperatorResult = ptr.operator bool();
848bf80f4bSopenharmony_ci
858bf80f4bSopenharmony_ci    EXPECT_EQ(rawPtr, nullptr);
868bf80f4bSopenharmony_ci    EXPECT_EQ(boolOperatorResult, false);
878bf80f4bSopenharmony_ci}
888bf80f4bSopenharmony_ci
898bf80f4bSopenharmony_ci/**
908bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest
918bf80f4bSopenharmony_ci * @tc.desc: test CopiedSharedPtrExtendObjectLifetime function
928bf80f4bSopenharmony_ci * @tc.type: FUNC
938bf80f4bSopenharmony_ci * @tc.require: I7DMS1
948bf80f4bSopenharmony_ci */
958bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, CopiedSharedPtrExtendObjectLifetime, TestSize.Level1)
968bf80f4bSopenharmony_ci{
978bf80f4bSopenharmony_ci    constexpr auto initialValue = 120;
988bf80f4bSopenharmony_ci    BASE_NS::shared_ptr<const int> cptr;
998bf80f4bSopenharmony_ci
1008bf80f4bSopenharmony_ci    {
1018bf80f4bSopenharmony_ci        cptr = ptr;
1028bf80f4bSopenharmony_ci    }
1038bf80f4bSopenharmony_ci
1048bf80f4bSopenharmony_ci    EXPECT_EQ(*cptr, initialValue);
1058bf80f4bSopenharmony_ci}
1068bf80f4bSopenharmony_ci
1078bf80f4bSopenharmony_ci/**
1088bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest
1098bf80f4bSopenharmony_ci * @tc.desc: test CopyConstructedSharedPtrExtendObjectLifetime function
1108bf80f4bSopenharmony_ci * @tc.type: FUNC
1118bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1128bf80f4bSopenharmony_ci */
1138bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, CopyConstructedSharedPtrExtendObjectLifetime, TestSize.Level1)
1148bf80f4bSopenharmony_ci{
1158bf80f4bSopenharmony_ci    constexpr auto initialValue = 120;
1168bf80f4bSopenharmony_ci    BASE_NS::shared_ptr<int> ptr = CreateShared<int>(initialValue);
1178bf80f4bSopenharmony_ci
1188bf80f4bSopenharmony_ci    auto copy = BASE_NS::shared_ptr<int>(ptr);
1198bf80f4bSopenharmony_ci    ptr.reset();
1208bf80f4bSopenharmony_ci
1218bf80f4bSopenharmony_ci    EXPECT_EQ(*copy, initialValue);
1228bf80f4bSopenharmony_ci}
1238bf80f4bSopenharmony_ci
1248bf80f4bSopenharmony_cistruct CountType {
1258bf80f4bSopenharmony_ci    int count { 1 };
1268bf80f4bSopenharmony_ci};
1278bf80f4bSopenharmony_ci
1288bf80f4bSopenharmony_civoid CountDeleter(void* p)
1298bf80f4bSopenharmony_ci{
1308bf80f4bSopenharmony_ci    --static_cast<CountType*>(p)->count;
1318bf80f4bSopenharmony_ci}
1328bf80f4bSopenharmony_ci
1338bf80f4bSopenharmony_ci/**
1348bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest
1358bf80f4bSopenharmony_ci * @tc.desc: test MoveMemoryLeakAndAssert function
1368bf80f4bSopenharmony_ci * @tc.type: FUNC
1378bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1388bf80f4bSopenharmony_ci */
1398bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, MoveMemoryLeakAndAssert, TestSize.Level1)
1408bf80f4bSopenharmony_ci{
1418bf80f4bSopenharmony_ci    CountType test;
1428bf80f4bSopenharmony_ci    {
1438bf80f4bSopenharmony_ci        BASE_NS::shared_ptr<CountType> p(&test, CountDeleter);
1448bf80f4bSopenharmony_ci        auto copy = p;
1458bf80f4bSopenharmony_ci        p = BASE_NS::move(copy);
1468bf80f4bSopenharmony_ci    }
1478bf80f4bSopenharmony_ci
1488bf80f4bSopenharmony_ci    EXPECT_EQ(test.count, 0);
1498bf80f4bSopenharmony_ci}
1508bf80f4bSopenharmony_ci
1518bf80f4bSopenharmony_ci/**
1528bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest
1538bf80f4bSopenharmony_ci * @tc.desc: test Expired function
1548bf80f4bSopenharmony_ci * @tc.type: FUNC
1558bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1568bf80f4bSopenharmony_ci */
1578bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, Expired, TestSize.Level1)
1588bf80f4bSopenharmony_ci{
1598bf80f4bSopenharmony_ci    BASE_NS::weak_ptr<int> w = ptr;
1608bf80f4bSopenharmony_ci    EXPECT_FALSE(w.expired());
1618bf80f4bSopenharmony_ci    ptr.reset();
1628bf80f4bSopenharmony_ci    EXPECT_TRUE(w.expired());
1638bf80f4bSopenharmony_ci}
1648bf80f4bSopenharmony_ci
1658bf80f4bSopenharmony_ci/**
1668bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest
1678bf80f4bSopenharmony_ci * @tc.desc: test Comparison function
1688bf80f4bSopenharmony_ci * @tc.type: FUNC
1698bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1708bf80f4bSopenharmony_ci */
1718bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, Comparison, TestSize.Level1)
1728bf80f4bSopenharmony_ci{
1738bf80f4bSopenharmony_ci    auto p2 = p1;
1748bf80f4bSopenharmony_ci    auto p3 = BASE_NS::shared_ptr<int>(p1.get(), [](void*) {});
1758bf80f4bSopenharmony_ci
1768bf80f4bSopenharmony_ci    EXPECT_EQ(p1, p2);
1778bf80f4bSopenharmony_ci    EXPECT_EQ(p1, p3);
1788bf80f4bSopenharmony_ci    EXPECT_EQ(p2, p3);
1798bf80f4bSopenharmony_ci}
1808bf80f4bSopenharmony_ci
1818bf80f4bSopenharmony_ci/**
1828bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest
1838bf80f4bSopenharmony_ci * @tc.desc: test ExplicitDeleterBasicType function
1848bf80f4bSopenharmony_ci * @tc.type: FUNC
1858bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1868bf80f4bSopenharmony_ci */
1878bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, ExplicitDeleterBasicType, TestSize.Level1)
1888bf80f4bSopenharmony_ci{
1898bf80f4bSopenharmony_ci    int count = 0;
1908bf80f4bSopenharmony_ci    {
1918bf80f4bSopenharmony_ci        auto p = BASE_NS::shared_ptr<int>(&count, [&](int *) { ++count; });
1928bf80f4bSopenharmony_ci    }
1938bf80f4bSopenharmony_ci    EXPECT_EQ(count, 1);
1948bf80f4bSopenharmony_ci}
1958bf80f4bSopenharmony_ci
1968bf80f4bSopenharmony_cinamespace {
1978bf80f4bSopenharmony_cistruct ITestInterface : CORE_NS::IInterface {
1988bf80f4bSopenharmony_ci    const IInterface* GetInterface(const BASE_NS::Uid& uid) const override
1998bf80f4bSopenharmony_ci    {
2008bf80f4bSopenharmony_ci        return this;
2018bf80f4bSopenharmony_ci    }
2028bf80f4bSopenharmony_ci
2038bf80f4bSopenharmony_ci    IInterface* GetInterface(const BASE_NS::Uid& uid) override
2048bf80f4bSopenharmony_ci    {
2058bf80f4bSopenharmony_ci        return this;
2068bf80f4bSopenharmony_ci    }
2078bf80f4bSopenharmony_ci
2088bf80f4bSopenharmony_ci    void Ref() override
2098bf80f4bSopenharmony_ci    {
2108bf80f4bSopenharmony_ci        ++count;
2118bf80f4bSopenharmony_ci    }
2128bf80f4bSopenharmony_ci
2138bf80f4bSopenharmony_ci    void Unref() override
2148bf80f4bSopenharmony_ci    {
2158bf80f4bSopenharmony_ci        --count;
2168bf80f4bSopenharmony_ci    }
2178bf80f4bSopenharmony_ci    int count { 0 };
2188bf80f4bSopenharmony_ci};
2198bf80f4bSopenharmony_ci} // namespace
2208bf80f4bSopenharmony_ci
2218bf80f4bSopenharmony_ci/**
2228bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest
2238bf80f4bSopenharmony_ci * @tc.desc: test ExplicitDeleterInterface function
2248bf80f4bSopenharmony_ci * @tc.type: FUNC
2258bf80f4bSopenharmony_ci * @tc.require: I7DMS1
2268bf80f4bSopenharmony_ci */
2278bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, ExplicitDeleterInterface, TestSize.Level1)
2288bf80f4bSopenharmony_ci{
2298bf80f4bSopenharmony_ci    {
2308bf80f4bSopenharmony_ci        ITestInterface test;
2318bf80f4bSopenharmony_ci        {
2328bf80f4bSopenharmony_ci            auto p = BASE_NS::shared_ptr<ITestInterface>(&test);
2338bf80f4bSopenharmony_ci            EXPECT_EQ(test.count, 1);
2348bf80f4bSopenharmony_ci        }
2358bf80f4bSopenharmony_ci        EXPECT_EQ(test.count, 0);
2368bf80f4bSopenharmony_ci    }
2378bf80f4bSopenharmony_ci    {
2388bf80f4bSopenharmony_ci        ITestInterface test;
2398bf80f4bSopenharmony_ci        {
2408bf80f4bSopenharmony_ci            auto p = BASE_NS::shared_ptr<CORE_NS::IInterface>(&test);
2418bf80f4bSopenharmony_ci            EXPECT_EQ(test.count, 1);
2428bf80f4bSopenharmony_ci        }
2438bf80f4bSopenharmony_ci        EXPECT_EQ(test.count, 0);
2448bf80f4bSopenharmony_ci    }
2458bf80f4bSopenharmony_ci    {
2468bf80f4bSopenharmony_ci        int count = 0;
2478bf80f4bSopenharmony_ci        ITestInterface test;
2488bf80f4bSopenharmony_ci        {
2498bf80f4bSopenharmony_ci            auto p = BASE_NS::shared_ptr<ITestInterface>(&test, [&count](ITestInterface*) { ++count; });
2508bf80f4bSopenharmony_ci            EXPECT_EQ(test.count, 0);
2518bf80f4bSopenharmony_ci        }
2528bf80f4bSopenharmony_ci        EXPECT_EQ(count, 1);
2538bf80f4bSopenharmony_ci        EXPECT_EQ(test.count, 0);
2548bf80f4bSopenharmony_ci    }
2558bf80f4bSopenharmony_ci}
2568bf80f4bSopenharmony_ci
2578bf80f4bSopenharmony_ci/**
2588bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest
2598bf80f4bSopenharmony_ci * @tc.desc: test UniquePtrConversion function
2608bf80f4bSopenharmony_ci * @tc.type: FUNC
2618bf80f4bSopenharmony_ci * @tc.require: I7DMS1
2628bf80f4bSopenharmony_ci */
2638bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, UniquePtrConversion, TestSize.Level1)
2648bf80f4bSopenharmony_ci{
2658bf80f4bSopenharmony_ci    {
2668bf80f4bSopenharmony_ci        BASE_NS::shared_ptr<int> shared(BASE_NS::move(unique));
2678bf80f4bSopenharmony_ci        ASSERT_TRUE(!unique);
2688bf80f4bSopenharmony_ci        ASSERT_TRUE(shared);
2698bf80f4bSopenharmony_ci        EXPECT_EQ(*shared, 2);
2708bf80f4bSopenharmony_ci    }
2718bf80f4bSopenharmony_ci    {
2728bf80f4bSopenharmony_ci        ITestInterface object;
2738bf80f4bSopenharmony_ci        object.Ref();
2748bf80f4bSopenharmony_ci        EXPECT_EQ(object.count, 1);
2758bf80f4bSopenharmony_ci        BASE_NS::unique_ptr<ITestInterface, decltype(deleter)> unique(&object, deleter);
2768bf80f4bSopenharmony_ci        BASE_NS::shared_ptr<CORE_NS::IInterface> shared(BASE_NS::move(unique));
2778bf80f4bSopenharmony_ci        ASSERT_TRUE(!unique);
2788bf80f4bSopenharmony_ci        ASSERT_TRUE(shared);
2798bf80f4bSopenharmony_ci        EXPECT_EQ(object.count, 1);
2808bf80f4bSopenharmony_ci        shared.reset();
2818bf80f4bSopenharmony_ci        EXPECT_EQ(object.count, 0);
2828bf80f4bSopenharmony_ci    }
2838bf80f4bSopenharmony_ci    {
2848bf80f4bSopenharmony_ci        int count = 0;
2858bf80f4bSopenharmony_ci        {
2868bf80f4bSopenharmony_ci            int value = 2;
2878bf80f4bSopenharmony_ci            BASE_NS::unique_ptr<int, decltype(deleter)> unique(&value, deleter);
2888bf80f4bSopenharmony_ci            BASE_NS::shared_ptr<int> shared(BASE_NS::move(unique));
2898bf80f4bSopenharmony_ci            ASSERT_TRUE(!unique);
2908bf80f4bSopenharmony_ci            ASSERT_TRUE(shared);
2918bf80f4bSopenharmony_ci            EXPECT_EQ(*shared, 2);
2928bf80f4bSopenharmony_ci            EXPECT_EQ(count, 0);
2938bf80f4bSopenharmony_ci        }
2948bf80f4bSopenharmony_ci        EXPECT_EQ(count, 1);
2958bf80f4bSopenharmony_ci    }
2968bf80f4bSopenharmony_ci    {
2978bf80f4bSopenharmony_ci        BASE_NS::shared_ptr<int> shared;
2988bf80f4bSopenharmony_ci        shared = BASE_NS::move(unique);
2998bf80f4bSopenharmony_ci        ASSERT_TRUE(!unique);
3008bf80f4bSopenharmony_ci        ASSERT_TRUE(shared);
3018bf80f4bSopenharmony_ci        EXPECT_EQ(*shared, 2);
3028bf80f4bSopenharmony_ci    }
3038bf80f4bSopenharmony_ci    {
3048bf80f4bSopenharmony_ci        ITestInterface object;
3058bf80f4bSopenharmony_ci        object.Ref();
3068bf80f4bSopenharmony_ci        EXPECT_EQ(object.count, 1);
3078bf80f4bSopenharmony_ci        BASE_NS::unique_ptr<ITestInterface, decltype(deleter)> unique(&object, deleter);
3088bf80f4bSopenharmony_ci        BASE_NS::shared_ptr<CORE_NS::IInterface> shared;
3098bf80f4bSopenharmony_ci        shared = BASE_NS::move(unique);
3108bf80f4bSopenharmony_ci        ASSERT_TRUE(!unique);
3118bf80f4bSopenharmony_ci        ASSERT_TRUE(shared);
3128bf80f4bSopenharmony_ci        EXPECT_EQ(object.count, 1);
3138bf80f4bSopenharmony_ci        shared.reset();
3148bf80f4bSopenharmony_ci        EXPECT_EQ(object.count, 0);
3158bf80f4bSopenharmony_ci    }
3168bf80f4bSopenharmony_ci}
3178bf80f4bSopenharmony_ci
3188bf80f4bSopenharmony_ciMETA_END_NAMESPACE()