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/api/object.h>
198bf80f4bSopenharmony_ci#include <meta/base/ref_uri.h>
208bf80f4bSopenharmony_ci#include <meta/interface/intf_metadata.h>
218bf80f4bSopenharmony_ci
228bf80f4bSopenharmony_ci#include "src/test_runner.h"
238bf80f4bSopenharmony_ci#include "src/util.h"
248bf80f4bSopenharmony_ci#include "src/testing_objects.h"
258bf80f4bSopenharmony_ci
268bf80f4bSopenharmony_ciusing namespace testing::ext;
278bf80f4bSopenharmony_ci
288bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE()
298bf80f4bSopenharmony_ci
308bf80f4bSopenharmony_ciclass RefUriTest : public testing::Test {
318bf80f4bSopenharmony_cipublic:
328bf80f4bSopenharmony_ci    static void SetUpTestSuite()
338bf80f4bSopenharmony_ci    {
348bf80f4bSopenharmony_ci        SetTest();
358bf80f4bSopenharmony_ci    }
368bf80f4bSopenharmony_ci    static void TearDownTestSuite()
378bf80f4bSopenharmony_ci    {
388bf80f4bSopenharmony_ci        ResetTest();
398bf80f4bSopenharmony_ci    }
408bf80f4bSopenharmony_ci    void SetUp() override {}
418bf80f4bSopenharmony_ci    void TearDown() override {}
428bf80f4bSopenharmony_ci};
438bf80f4bSopenharmony_ci
448bf80f4bSopenharmony_ci/**
458bf80f4bSopenharmony_ci * @tc.name: RefUriTest
468bf80f4bSopenharmony_ci * @tc.desc: test DefaultAndUidConstruction function
478bf80f4bSopenharmony_ci * @tc.type: FUNC
488bf80f4bSopenharmony_ci * @tc.require: I7DMS1
498bf80f4bSopenharmony_ci */
508bf80f4bSopenharmony_ciHWTEST_F(RefUriTest, DefaultAndUidConstruction, TestSize.Level1)
518bf80f4bSopenharmony_ci{
528bf80f4bSopenharmony_ci    RefUri empty;
538bf80f4bSopenharmony_ci    EXPECT_TRUE(empty.IsEmpty());
548bf80f4bSopenharmony_ci    EXPECT_TRUE(empty.IsValid());
558bf80f4bSopenharmony_ci    EXPECT_TRUE(!empty.ReferencesProperty());
568bf80f4bSopenharmony_ci    EXPECT_TRUE(empty.ReferencesObject());
578bf80f4bSopenharmony_ci    EXPECT_EQ(empty.BaseObjectUid(), BASE_NS::Uid {});
588bf80f4bSopenharmony_ci    EXPECT_TRUE(!empty.StartsFromRoot());
598bf80f4bSopenharmony_ci    EXPECT_EQ(empty.RelativeUri(), empty);
608bf80f4bSopenharmony_ci    EXPECT_EQ(empty.ReferencedName(), "");
618bf80f4bSopenharmony_ci    EXPECT_EQ(empty.ToString(), "ref:/");
628bf80f4bSopenharmony_ci
638bf80f4bSopenharmony_ci    BASE_NS::Uid uid { "f80a3984-7ac7-4400-8e17-13937cc11d39" };
648bf80f4bSopenharmony_ci    RefUri u1 { uid };
658bf80f4bSopenharmony_ci    EXPECT_TRUE(!u1.IsEmpty());
668bf80f4bSopenharmony_ci    EXPECT_TRUE(u1.IsValid());
678bf80f4bSopenharmony_ci    EXPECT_TRUE(!u1.ReferencesProperty());
688bf80f4bSopenharmony_ci    EXPECT_TRUE(u1.ReferencesObject());
698bf80f4bSopenharmony_ci    EXPECT_EQ(u1.BaseObjectUid(), uid);
708bf80f4bSopenharmony_ci    EXPECT_TRUE(!u1.StartsFromRoot());
718bf80f4bSopenharmony_ci    EXPECT_EQ(u1.RelativeUri(), empty);
728bf80f4bSopenharmony_ci    EXPECT_EQ(u1.ReferencedName(), "");
738bf80f4bSopenharmony_ci    EXPECT_EQ(u1.ToString(), "ref:f80a3984-7ac7-4400-8e17-13937cc11d39/");
748bf80f4bSopenharmony_ci
758bf80f4bSopenharmony_ci    RefUri u2 { uid, "/test/path" };
768bf80f4bSopenharmony_ci    EXPECT_TRUE(!u2.IsEmpty());
778bf80f4bSopenharmony_ci    EXPECT_TRUE(u2.IsValid());
788bf80f4bSopenharmony_ci    EXPECT_TRUE(!u2.ReferencesProperty());
798bf80f4bSopenharmony_ci    EXPECT_TRUE(u2.ReferencesObject());
808bf80f4bSopenharmony_ci    EXPECT_EQ(u2.BaseObjectUid(), uid);
818bf80f4bSopenharmony_ci    EXPECT_TRUE(!u2.StartsFromRoot());
828bf80f4bSopenharmony_ci    EXPECT_EQ(u2.RelativeUri(), RefUri { "ref:/test/path" });
838bf80f4bSopenharmony_ci    EXPECT_EQ(u2.ReferencedName(), "path");
848bf80f4bSopenharmony_ci    EXPECT_EQ(u2.ToString(), "ref:f80a3984-7ac7-4400-8e17-13937cc11d39/test/path");
858bf80f4bSopenharmony_ci    EXPECT_EQ(u2.TakeFirstNode().name, "test");
868bf80f4bSopenharmony_ci    EXPECT_EQ(u2.TakeFirstNode().name, "path");
878bf80f4bSopenharmony_ci    EXPECT_EQ(u2, u1);
888bf80f4bSopenharmony_ci
898bf80f4bSopenharmony_ci    RefUri u3 { uid, "//test/path" };
908bf80f4bSopenharmony_ci    EXPECT_TRUE(u3.StartsFromRoot());
918bf80f4bSopenharmony_ci    EXPECT_EQ(u3.ToString(), "ref:f80a3984-7ac7-4400-8e17-13937cc11d39//test/path");
928bf80f4bSopenharmony_ci    u3.SetStartsFromRoot(false);
938bf80f4bSopenharmony_ci    EXPECT_EQ(u3, RefUri(uid, "/test/path"));
948bf80f4bSopenharmony_ci}
958bf80f4bSopenharmony_ci
968bf80f4bSopenharmony_ci/**
978bf80f4bSopenharmony_ci * @tc.name: RefUriTest
988bf80f4bSopenharmony_ci * @tc.desc: test StringConstruction function
998bf80f4bSopenharmony_ci * @tc.type: FUNC
1008bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1018bf80f4bSopenharmony_ci */
1028bf80f4bSopenharmony_ciHWTEST_F(RefUriTest, StringConstruction, TestSize.Level1)
1038bf80f4bSopenharmony_ci{
1048bf80f4bSopenharmony_ci    EXPECT_EQ(RefUri { "ref:/" }, RefUri {});
1058bf80f4bSopenharmony_ci    EXPECT_FALSE(RefUri("").IsValid());
1068bf80f4bSopenharmony_ci    EXPECT_FALSE(RefUri("/some/path").IsValid());
1078bf80f4bSopenharmony_ci    EXPECT_FALSE(RefUri("ref:///").IsValid());
1088bf80f4bSopenharmony_ci    EXPECT_EQ(RefUri("ref:/.."), RefUri::ParentUri());
1098bf80f4bSopenharmony_ci    EXPECT_FALSE(RefUri("ref:7ac7-4400-8e17-13937cc11d39").IsValid());
1108bf80f4bSopenharmony_ci    EXPECT_FALSE(RefUri("ref:f80a3984-7ac7-4400-8e17-13937cc11d39///").IsValid());
1118bf80f4bSopenharmony_ci    {
1128bf80f4bSopenharmony_ci        RefUri u { "ref://" };
1138bf80f4bSopenharmony_ci        EXPECT_TRUE(u.IsValid());
1148bf80f4bSopenharmony_ci        EXPECT_TRUE(!u.IsEmpty());
1158bf80f4bSopenharmony_ci        EXPECT_EQ(u.ToString(), "ref://");
1168bf80f4bSopenharmony_ci        EXPECT_TRUE(u.StartsFromRoot());
1178bf80f4bSopenharmony_ci    }
1188bf80f4bSopenharmony_ci    {
1198bf80f4bSopenharmony_ci        RefUri u { "ref://this/and/$that" };
1208bf80f4bSopenharmony_ci        EXPECT_TRUE(u.IsValid());
1218bf80f4bSopenharmony_ci        EXPECT_TRUE(!u.IsEmpty());
1228bf80f4bSopenharmony_ci        EXPECT_EQ(u.ToString(), "ref://this/and/$that");
1238bf80f4bSopenharmony_ci        EXPECT_TRUE(u.StartsFromRoot());
1248bf80f4bSopenharmony_ci        EXPECT_TRUE(u.ReferencesProperty());
1258bf80f4bSopenharmony_ci        EXPECT_TRUE(!u.ReferencesObject());
1268bf80f4bSopenharmony_ci        EXPECT_EQ(u.ReferencedName(), "that");
1278bf80f4bSopenharmony_ci        EXPECT_EQ(u.TakeFirstNode().name, "this");
1288bf80f4bSopenharmony_ci        {
1298bf80f4bSopenharmony_ci            auto n = u.TakeFirstNode();
1308bf80f4bSopenharmony_ci            EXPECT_EQ(n.name, "and");
1318bf80f4bSopenharmony_ci            EXPECT_EQ(n.type, RefUri::Node::OBJECT);
1328bf80f4bSopenharmony_ci        }
1338bf80f4bSopenharmony_ci        {
1348bf80f4bSopenharmony_ci            auto n = u.TakeFirstNode();
1358bf80f4bSopenharmony_ci            EXPECT_EQ(n.name, "that");
1368bf80f4bSopenharmony_ci            EXPECT_EQ(n.type, RefUri::Node::PROPERTY);
1378bf80f4bSopenharmony_ci        }
1388bf80f4bSopenharmony_ci    }
1398bf80f4bSopenharmony_ci    {
1408bf80f4bSopenharmony_ci        RefUri u { "ref:f80a3984-7ac7-4400-8e17-13937cc11d39/hips/$hops/haps" };
1418bf80f4bSopenharmony_ci        EXPECT_TRUE(u.IsValid());
1428bf80f4bSopenharmony_ci        EXPECT_TRUE(!u.IsEmpty());
1438bf80f4bSopenharmony_ci        EXPECT_EQ(u.BaseObjectUid(), BASE_NS::Uid { "f80a3984-7ac7-4400-8e17-13937cc11d39" });
1448bf80f4bSopenharmony_ci        EXPECT_EQ(u.ToString(), "ref:f80a3984-7ac7-4400-8e17-13937cc11d39/hips/$hops/haps");
1458bf80f4bSopenharmony_ci        EXPECT_TRUE(!u.StartsFromRoot());
1468bf80f4bSopenharmony_ci        EXPECT_TRUE(!u.ReferencesProperty());
1478bf80f4bSopenharmony_ci        EXPECT_TRUE(u.ReferencesObject());
1488bf80f4bSopenharmony_ci        EXPECT_EQ(u.ReferencedName(), "haps");
1498bf80f4bSopenharmony_ci        EXPECT_EQ(u.TakeFirstNode().name, "hips");
1508bf80f4bSopenharmony_ci        {
1518bf80f4bSopenharmony_ci            auto n = u.TakeFirstNode();
1528bf80f4bSopenharmony_ci            EXPECT_EQ(n.name, "hops");
1538bf80f4bSopenharmony_ci            EXPECT_EQ(n.type, RefUri::Node::PROPERTY);
1548bf80f4bSopenharmony_ci        }
1558bf80f4bSopenharmony_ci        {
1568bf80f4bSopenharmony_ci            auto n = u.TakeFirstNode();
1578bf80f4bSopenharmony_ci            EXPECT_EQ(n.name, "haps");
1588bf80f4bSopenharmony_ci            EXPECT_EQ(n.type, RefUri::Node::OBJECT);
1598bf80f4bSopenharmony_ci        }
1608bf80f4bSopenharmony_ci    }
1618bf80f4bSopenharmony_ci}
1628bf80f4bSopenharmony_ci
1638bf80f4bSopenharmony_ci/**
1648bf80f4bSopenharmony_ci * @tc.name: RefUriTest
1658bf80f4bSopenharmony_ci * @tc.desc: test Setters function
1668bf80f4bSopenharmony_ci * @tc.type: FUNC
1678bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1688bf80f4bSopenharmony_ci */
1698bf80f4bSopenharmony_ciHWTEST_F(RefUriTest, Setters, TestSize.Level1)
1708bf80f4bSopenharmony_ci{
1718bf80f4bSopenharmony_ci    {
1728bf80f4bSopenharmony_ci        RefUri u { "ref:f80a3984-7ac7-4400-8e17-13937cc11d39/hips/$hops/haps" };
1738bf80f4bSopenharmony_ci        EXPECT_TRUE(u.IsValid());
1748bf80f4bSopenharmony_ci        BASE_NS::Uid uid { "1ae79e0c-2701-4f19-8553-fb2dd22f6eba" };
1758bf80f4bSopenharmony_ci        u.SetBaseObjectUid(uid);
1768bf80f4bSopenharmony_ci        EXPECT_EQ(u.ToString(), "ref:1ae79e0c-2701-4f19-8553-fb2dd22f6eba/hips/$hops/haps");
1778bf80f4bSopenharmony_ci        u.SetStartsFromRoot(true);
1788bf80f4bSopenharmony_ci        EXPECT_EQ(u.ToString(), "ref:1ae79e0c-2701-4f19-8553-fb2dd22f6eba//hips/$hops/haps");
1798bf80f4bSopenharmony_ci    }
1808bf80f4bSopenharmony_ci    {
1818bf80f4bSopenharmony_ci        RefUri u;
1828bf80f4bSopenharmony_ci        u.PushPropertySegment("test");
1838bf80f4bSopenharmony_ci        u.PushObjectSegment("other");
1848bf80f4bSopenharmony_ci        u.PushPropertySegment("some");
1858bf80f4bSopenharmony_ci        u.PushObjectSegment("path");
1868bf80f4bSopenharmony_ci        EXPECT_EQ(u.ToString(), "ref:/path/$some/other/$test");
1878bf80f4bSopenharmony_ci    }
1888bf80f4bSopenharmony_ci}
1898bf80f4bSopenharmony_ci
1908bf80f4bSopenharmony_ci/**
1918bf80f4bSopenharmony_ci * @tc.name: RefUriTest
1928bf80f4bSopenharmony_ci * @tc.desc: test Escaping function
1938bf80f4bSopenharmony_ci * @tc.type: FUNC
1948bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1958bf80f4bSopenharmony_ci */
1968bf80f4bSopenharmony_ciHWTEST_F(RefUriTest, Escaping, TestSize.Level1)
1978bf80f4bSopenharmony_ci{
1988bf80f4bSopenharmony_ci    {
1998bf80f4bSopenharmony_ci        RefUri u(R"--(ref:/\/123\$456\@dd\\77)--");
2008bf80f4bSopenharmony_ci        EXPECT_EQ(u.ToString(), R"--(ref:/\/123\$456\@dd\\77)--");
2018bf80f4bSopenharmony_ci        EXPECT_EQ(u.TakeFirstNode().name, R"--(/123$456@dd\77)--");
2028bf80f4bSopenharmony_ci    }
2038bf80f4bSopenharmony_ci    {
2048bf80f4bSopenharmony_ci        RefUri u(R"--(ref:/\\\\\\\\\\\\\/)--");
2058bf80f4bSopenharmony_ci        EXPECT_EQ(u.ToString(), R"--(ref:/\\\\\\\\\\\\\/)--");
2068bf80f4bSopenharmony_ci        EXPECT_EQ(u.TakeFirstNode().name, R"--(\\\\\\/)--");
2078bf80f4bSopenharmony_ci    }
2088bf80f4bSopenharmony_ci    {
2098bf80f4bSopenharmony_ci        RefUri u;
2108bf80f4bSopenharmony_ci        u.PushObjectSegment(R"--($/\gg@/)--");
2118bf80f4bSopenharmony_ci        EXPECT_EQ(u.ToString(), R"--(ref:/\$\/\\gg\@\/)--");
2128bf80f4bSopenharmony_ci    }
2138bf80f4bSopenharmony_ci}
2148bf80f4bSopenharmony_ci
2158bf80f4bSopenharmony_ci/**
2168bf80f4bSopenharmony_ci * @tc.name: RefUriTest
2178bf80f4bSopenharmony_ci * @tc.desc: test Context function
2188bf80f4bSopenharmony_ci * @tc.type: FUNC
2198bf80f4bSopenharmony_ci * @tc.require: I7DMS1
2208bf80f4bSopenharmony_ci */
2218bf80f4bSopenharmony_ciHWTEST_F(RefUriTest, Context, TestSize.Level1)
2228bf80f4bSopenharmony_ci{
2238bf80f4bSopenharmony_ci    {
2248bf80f4bSopenharmony_ci        RefUri u { "ref:/@Context" };
2258bf80f4bSopenharmony_ci        EXPECT_TRUE(u.IsValid());
2268bf80f4bSopenharmony_ci        EXPECT_TRUE(!u.IsEmpty());
2278bf80f4bSopenharmony_ci        EXPECT_EQ(u.ToString(), "ref:/@Context");
2288bf80f4bSopenharmony_ci        EXPECT_TRUE(!u.StartsFromRoot());
2298bf80f4bSopenharmony_ci        EXPECT_TRUE(!u.ReferencesProperty());
2308bf80f4bSopenharmony_ci        EXPECT_TRUE(u.ReferencesObject());
2318bf80f4bSopenharmony_ci        EXPECT_EQ(u.ReferencedName(), "@Context");
2328bf80f4bSopenharmony_ci        {
2338bf80f4bSopenharmony_ci            auto n = u.TakeFirstNode();
2348bf80f4bSopenharmony_ci            EXPECT_EQ(n.name, "@Context");
2358bf80f4bSopenharmony_ci            EXPECT_EQ(n.type, RefUri::Node::SPECIAL);
2368bf80f4bSopenharmony_ci        }
2378bf80f4bSopenharmony_ci    }
2388bf80f4bSopenharmony_ci    {
2398bf80f4bSopenharmony_ci        EXPECT_EQ(RefUri::ContextUri(), RefUri("ref:/@Context"));
2408bf80f4bSopenharmony_ci        RefUri u;
2418bf80f4bSopenharmony_ci        u.PushObjectContextSegment();
2428bf80f4bSopenharmony_ci        EXPECT_EQ(u, RefUri::ContextUri());
2438bf80f4bSopenharmony_ci    }
2448bf80f4bSopenharmony_ci    {
2458bf80f4bSopenharmony_ci        RefUri u { "ref:1ae79e0c-2701-4f19-8553-fb2dd22f6eba/@Context/$Theme/$Prop" };
2468bf80f4bSopenharmony_ci        EXPECT_EQ(u.ToString(), "ref:1ae79e0c-2701-4f19-8553-fb2dd22f6eba/@Context/$Theme/$Prop");
2478bf80f4bSopenharmony_ci    }
2488bf80f4bSopenharmony_ci}
2498bf80f4bSopenharmony_ci
2508bf80f4bSopenharmony_ci/**
2518bf80f4bSopenharmony_ci * @tc.name: RefUriTest
2528bf80f4bSopenharmony_ci * @tc.desc: test Context function
2538bf80f4bSopenharmony_ci * @tc.type: FUNC
2548bf80f4bSopenharmony_ci * @tc.require: I7DMS1
2558bf80f4bSopenharmony_ci */
2568bf80f4bSopenharmony_ciHWTEST_F(RefUriTest, Canonicalization, TestSize.Level1)
2578bf80f4bSopenharmony_ci{
2588bf80f4bSopenharmony_ci    EXPECT_EQ(RefUri("ref:/.").ToString(), "ref:/");
2598bf80f4bSopenharmony_ci    EXPECT_EQ(RefUri("ref:/..").ToString(), "ref:/..");
2608bf80f4bSopenharmony_ci    EXPECT_EQ(RefUri("ref://.").ToString(), "ref://");
2618bf80f4bSopenharmony_ci    EXPECT_EQ(RefUri("ref:/some/.").ToString(), "ref:/some");
2628bf80f4bSopenharmony_ci    EXPECT_EQ(RefUri("ref:/some/..").ToString(), "ref:/");
2638bf80f4bSopenharmony_ci    EXPECT_EQ(RefUri("ref:/some/other/..").ToString(), "ref:/some");
2648bf80f4bSopenharmony_ci    EXPECT_EQ(RefUri("ref:/1/2/../../3/../4/././5/../6/.").ToString(), "ref:/4/6");
2658bf80f4bSopenharmony_ci    EXPECT_EQ(RefUri("ref:/@Theme").ToString(), "ref:/@Context/$Theme");
2668bf80f4bSopenharmony_ci    EXPECT_EQ(RefUri("ref:/@Theme/./..").ToString(), "ref:/@Context");
2678bf80f4bSopenharmony_ci    EXPECT_EQ(RefUri("ref:/../@Theme").ToString(), "ref:/../@Context/$Theme");
2688bf80f4bSopenharmony_ci    EXPECT_EQ(RefUri("ref:/@Context/..").ToString(), "ref:/");
2698bf80f4bSopenharmony_ci}
2708bf80f4bSopenharmony_ci
2718bf80f4bSopenharmony_ci/**
2728bf80f4bSopenharmony_ci * @tc.name: RefUriTest
2738bf80f4bSopenharmony_ci * @tc.desc: test ObjectHierarchyTraversal function
2748bf80f4bSopenharmony_ci * @tc.type: FUNC
2758bf80f4bSopenharmony_ci * @tc.require: I7DMS1
2768bf80f4bSopenharmony_ci */
2778bf80f4bSopenharmony_ciHWTEST_F(RefUriTest, ObjectHierarchyTraversal, TestSize.Level1)
2788bf80f4bSopenharmony_ci{
2798bf80f4bSopenharmony_ci    auto r1 = CreateTestType();
2808bf80f4bSopenharmony_ci    r1->SetName("r1");
2818bf80f4bSopenharmony_ci    auto r2 = CreateTestType();
2828bf80f4bSopenharmony_ci    r2->SetName("r2");
2838bf80f4bSopenharmony_ci    auto c1 = CreateTestContainer();
2848bf80f4bSopenharmony_ci    c1->SetName("c1");
2858bf80f4bSopenharmony_ci    auto c2 = CreateTestContainer();
2868bf80f4bSopenharmony_ci    c2->SetName("c2");
2878bf80f4bSopenharmony_ci    auto c3 = CreateTestContainer();
2888bf80f4bSopenharmony_ci    c3->SetName("c3");
2898bf80f4bSopenharmony_ci
2908bf80f4bSopenharmony_ci    interface_pointer_cast<IContainer>(c1)->Add(interface_pointer_cast<IObject>(r1));
2918bf80f4bSopenharmony_ci    interface_pointer_cast<IContainer>(c2)->Add(interface_pointer_cast<IObject>(r2));
2928bf80f4bSopenharmony_ci    interface_pointer_cast<IContainer>(c2)->Add(interface_pointer_cast<IObject>(c1));
2938bf80f4bSopenharmony_ci    interface_pointer_cast<IContainer>(c3)->Add(interface_pointer_cast<IObject>(c2));
2948bf80f4bSopenharmony_ci
2958bf80f4bSopenharmony_ci    auto o1 = interface_pointer_cast<IObjectInstance>(r1)->Resolve<IObjectInstance>(RefUri::ParentUri());
2968bf80f4bSopenharmony_ci    ASSERT_TRUE(o1);
2978bf80f4bSopenharmony_ci    EXPECT_EQ(o1->GetInstanceId(), interface_pointer_cast<IObjectInstance>(c1)->GetInstanceId());
2988bf80f4bSopenharmony_ci
2998bf80f4bSopenharmony_ci    auto o2 = interface_pointer_cast<IObjectInstance>(c3)->Resolve<IObjectInstance>(RefUri("ref:/"));
3008bf80f4bSopenharmony_ci    ASSERT_TRUE(o2);
3018bf80f4bSopenharmony_ci    EXPECT_EQ(o2->GetInstanceId(), interface_pointer_cast<IObjectInstance>(c3)->GetInstanceId());
3028bf80f4bSopenharmony_ci
3038bf80f4bSopenharmony_ci    auto o3 = interface_pointer_cast<IObjectInstance>(c3)->Resolve<IObjectInstance>(RefUri("ref:/c2/c1/r1"));
3048bf80f4bSopenharmony_ci    ASSERT_TRUE(o3);
3058bf80f4bSopenharmony_ci    EXPECT_EQ(o3->GetInstanceId(), interface_pointer_cast<IObjectInstance>(r1)->GetInstanceId());
3068bf80f4bSopenharmony_ci
3078bf80f4bSopenharmony_ci    auto o4 = interface_pointer_cast<IObjectInstance>(r1)->Resolve<IObjectInstance>(RefUri("ref://"));
3088bf80f4bSopenharmony_ci    ASSERT_TRUE(o4);
3098bf80f4bSopenharmony_ci    EXPECT_EQ(o4->GetInstanceId(), interface_pointer_cast<IObjectInstance>(c3)->GetInstanceId());
3108bf80f4bSopenharmony_ci
3118bf80f4bSopenharmony_ci    auto o5 = interface_pointer_cast<IObjectInstance>(r1)->Resolve<IObjectInstance>(RefUri("ref://c2/r2"));
3128bf80f4bSopenharmony_ci    ASSERT_TRUE(o5);
3138bf80f4bSopenharmony_ci    EXPECT_EQ(o5->GetInstanceId(), interface_pointer_cast<IObjectInstance>(r2)->GetInstanceId());
3148bf80f4bSopenharmony_ci}
3158bf80f4bSopenharmony_ci
3168bf80f4bSopenharmony_ci/**
3178bf80f4bSopenharmony_ci * @tc.name: RefUriTest
3188bf80f4bSopenharmony_ci * @tc.desc: test ObjectHierarchyTraversalWithProperty function
3198bf80f4bSopenharmony_ci * @tc.type: FUNC
3208bf80f4bSopenharmony_ci * @tc.require: I7DMS1
3218bf80f4bSopenharmony_ci */
3228bf80f4bSopenharmony_ciHWTEST_F(RefUriTest, ObjectHierarchyTraversalWithProperty, TestSize.Level1)
3238bf80f4bSopenharmony_ci{
3248bf80f4bSopenharmony_ci    auto p = CreateProperty<IObject::Ptr>("prop", 0);
3258bf80f4bSopenharmony_ci
3268bf80f4bSopenharmony_ci    auto r = CreateTestType();
3278bf80f4bSopenharmony_ci    r->SetName("r");
3288bf80f4bSopenharmony_ci    auto c1 = CreateTestContainer();
3298bf80f4bSopenharmony_ci    c1->SetName("c1");
3308bf80f4bSopenharmony_ci    auto c2 = CreateTestContainer();
3318bf80f4bSopenharmony_ci    c2->SetName("c2");
3328bf80f4bSopenharmony_ci    auto c3 = CreateTestContainer();
3338bf80f4bSopenharmony_ci    c3->SetName("c3");
3348bf80f4bSopenharmony_ci
3358bf80f4bSopenharmony_ci    interface_pointer_cast<IContainer>(c1)->Add(interface_pointer_cast<IObject>(r));
3368bf80f4bSopenharmony_ci    p->SetValue(interface_pointer_cast<IObject>(c1));
3378bf80f4bSopenharmony_ci    interface_pointer_cast<IMetadata>(c2)->AddProperty(p);
3388bf80f4bSopenharmony_ci    interface_pointer_cast<IContainer>(c3)->Add(interface_pointer_cast<IObject>(c2));
3398bf80f4bSopenharmony_ci
3408bf80f4bSopenharmony_ci    auto o = interface_cast<IObjectInstance>(c3)->Resolve<IObjectInstance>(RefUri("ref:/c2/$prop/r"));
3418bf80f4bSopenharmony_ci    ASSERT_TRUE(o);
3428bf80f4bSopenharmony_ci    EXPECT_EQ(o->GetInstanceId(), interface_cast<IObjectInstance>(r)->GetInstanceId());
3438bf80f4bSopenharmony_ci}
3448bf80f4bSopenharmony_ci
3458bf80f4bSopenharmony_ci/**
3468bf80f4bSopenharmony_ci * @tc.name: RefUriTest
3478bf80f4bSopenharmony_ci * @tc.desc: test ResolveWithProperties function
3488bf80f4bSopenharmony_ci * @tc.type: FUNC
3498bf80f4bSopenharmony_ci * @tc.require: I7DMS1
3508bf80f4bSopenharmony_ci */
3518bf80f4bSopenharmony_ciHWTEST_F(RefUriTest, ResolveWithProperties, TestSize.Level1)
3528bf80f4bSopenharmony_ci{
3538bf80f4bSopenharmony_ci    {
3548bf80f4bSopenharmony_ci        Object obj;
3558bf80f4bSopenharmony_ci        obj.AddProperty(CreateProperty<int>("prop", 0));
3568bf80f4bSopenharmony_ci        EXPECT_FALSE(obj.GetInterface<IObjectInstance>()->Resolve(RefUri("ref:/$prop")));
3578bf80f4bSopenharmony_ci        RefUri abs("ref:/$prop");
3588bf80f4bSopenharmony_ci        abs.SetAbsoluteInterpretation(true);
3598bf80f4bSopenharmony_ci        EXPECT_TRUE(obj.GetInterface<IObjectInstance>()->Resolve(abs));
3608bf80f4bSopenharmony_ci    }
3618bf80f4bSopenharmony_ci    {
3628bf80f4bSopenharmony_ci        Object obj;
3638bf80f4bSopenharmony_ci        obj.AddProperty(CreateProperty<IObject::Ptr>("prop", nullptr));
3648bf80f4bSopenharmony_ci        EXPECT_FALSE(obj.GetInterface<IObjectInstance>()->Resolve(RefUri("ref:/$prop")));
3658bf80f4bSopenharmony_ci    }
3668bf80f4bSopenharmony_ci    {
3678bf80f4bSopenharmony_ci        Object obj;
3688bf80f4bSopenharmony_ci        Object obj2;
3698bf80f4bSopenharmony_ci        auto prop = CreateProperty<IObject::Ptr>("prop", obj2.GetIObject());
3708bf80f4bSopenharmony_ci        obj.AddProperty(prop);
3718bf80f4bSopenharmony_ci        EXPECT_EQ(obj.GetInterface<IObjectInstance>()->Resolve(RefUri("ref:/$prop")), obj2.GetInterfacePtr<IObject>());
3728bf80f4bSopenharmony_ci        RefUri abs("ref:/$prop");
3738bf80f4bSopenharmony_ci        abs.SetAbsoluteInterpretation(true);
3748bf80f4bSopenharmony_ci        EXPECT_EQ(obj.GetInterface<IObjectInstance>()->Resolve(abs), interface_pointer_cast<IObject>(prop));
3758bf80f4bSopenharmony_ci    }
3768bf80f4bSopenharmony_ci    {
3778bf80f4bSopenharmony_ci        Object obj;
3788bf80f4bSopenharmony_ci        Object obj2;
3798bf80f4bSopenharmony_ci        obj.AddProperty(CreateProperty<IObject::Ptr>("prop", obj2.GetIObject()));
3808bf80f4bSopenharmony_ci        obj2.AddProperty(CreateProperty<IObject::Ptr>("prop", nullptr));
3818bf80f4bSopenharmony_ci        EXPECT_EQ(obj.GetInterface<IObjectInstance>()->Resolve(RefUri("ref:/$prop")),
3828bf80f4bSopenharmony_ci            obj2.GetInterfacePtr<IObjectInstance>());
3838bf80f4bSopenharmony_ci        EXPECT_FALSE(obj.GetInterface<IObjectInstance>()->Resolve(RefUri("ref:/$prop/$prop")));
3848bf80f4bSopenharmony_ci    }
3858bf80f4bSopenharmony_ci    {
3868bf80f4bSopenharmony_ci        Object obj;
3878bf80f4bSopenharmony_ci        Object obj2;
3888bf80f4bSopenharmony_ci        Object obj3;
3898bf80f4bSopenharmony_ci        obj.AddProperty(CreateProperty<IObject::Ptr>("prop", obj2.GetIObject()));
3908bf80f4bSopenharmony_ci        obj2.AddProperty(CreateProperty<IObject::Ptr>("prop", obj3.GetIObject()));
3918bf80f4bSopenharmony_ci        EXPECT_EQ(obj.GetInterface<IObjectInstance>()->Resolve(RefUri("ref:/$prop")),
3928bf80f4bSopenharmony_ci            obj2.GetInterfacePtr<IObjectInstance>());
3938bf80f4bSopenharmony_ci        EXPECT_EQ(obj.GetInterface<IObjectInstance>()->Resolve(RefUri("ref:/$prop/$prop")),
3948bf80f4bSopenharmony_ci            obj3.GetInterfacePtr<IObjectInstance>());
3958bf80f4bSopenharmony_ci    }
3968bf80f4bSopenharmony_ci}
3978bf80f4bSopenharmony_ci
3988bf80f4bSopenharmony_ci/**
3998bf80f4bSopenharmony_ci * @tc.name: RefUriTest
4008bf80f4bSopenharmony_ci * @tc.desc: test IObjectResolveAndSelf function
4018bf80f4bSopenharmony_ci * @tc.type: FUNC
4028bf80f4bSopenharmony_ci * @tc.require: I7DMS1
4038bf80f4bSopenharmony_ci */
4048bf80f4bSopenharmony_ciHWTEST_F(RefUriTest, IObjectResolveAndSelf, TestSize.Level1)
4058bf80f4bSopenharmony_ci{
4068bf80f4bSopenharmony_ci    Object obj;
4078bf80f4bSopenharmony_ci    Object obj2;
4088bf80f4bSopenharmony_ci    obj.AddProperty(CreateProperty<IObject::Ptr>("prop", obj2.GetIObject()));
4098bf80f4bSopenharmony_ci    EXPECT_EQ(obj.GetIObject()->Resolve(RefUri("ref:/$prop")), obj2.GetIObject());
4108bf80f4bSopenharmony_ci    EXPECT_EQ(obj.GetIObject()->GetSelf(), obj.GetIObject());
4118bf80f4bSopenharmony_ci    EXPECT_EQ(Resolve(obj.GetIObject(), RefUri("ref:/$prop")), obj2.GetIObject());
4128bf80f4bSopenharmony_ci    EXPECT_EQ(GetSelf(obj.GetIObject()), obj.GetIObject());
4138bf80f4bSopenharmony_ci}
4148bf80f4bSopenharmony_ciMETA_END_NAMESPACE()