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 "testing_objects.h"
178bf80f4bSopenharmony_ci
188bf80f4bSopenharmony_ci#include <ostream>
198bf80f4bSopenharmony_ci
208bf80f4bSopenharmony_ci#include <base/math/vector.h>
218bf80f4bSopenharmony_ci
228bf80f4bSopenharmony_ci#include <meta/api/call_context.h>
238bf80f4bSopenharmony_ci#include <meta/api/util.h>
248bf80f4bSopenharmony_ci#include <meta/ext/animation/interpolator.h>
258bf80f4bSopenharmony_ci#include <meta/ext/any_builder.h>
268bf80f4bSopenharmony_ci#include <meta/ext/attachment/attachment.h>
278bf80f4bSopenharmony_ci#include <meta/ext/event_impl.h>
288bf80f4bSopenharmony_ci#include <meta/ext/object.h>
298bf80f4bSopenharmony_ci#include <meta/ext/object_container.h>
308bf80f4bSopenharmony_ci#include <meta/ext/serialization/common_value_serializers.h>
318bf80f4bSopenharmony_ci#include <meta/interface/intf_containable.h>
328bf80f4bSopenharmony_ci#include <meta/interface/intf_container.h>
338bf80f4bSopenharmony_ci#include <meta/interface/intf_startable.h>
348bf80f4bSopenharmony_ci#include <meta/interface/intf_tickable.h>
358bf80f4bSopenharmony_ci#include <meta/interface/property/intf_property.h>
368bf80f4bSopenharmony_ci#include <meta/interface/property/property.h>
378bf80f4bSopenharmony_ci#include <meta/interface/property/property_events.h>
388bf80f4bSopenharmony_ci
398bf80f4bSopenharmony_cinamespace {
408bf80f4bSopenharmony_ci
418bf80f4bSopenharmony_ciclass TestAttachment
428bf80f4bSopenharmony_ci    : public META_NS::AttachmentFwd<TestAttachment, ClassId::TestAttachment, META_NS::ITestAttachment> {
438bf80f4bSopenharmony_ci    bool AttachTo(const META_NS::IAttach::Ptr& target, const META_NS::IObject::Ptr& dataContext) override
448bf80f4bSopenharmony_ci    {
458bf80f4bSopenharmony_ci        attachCount_++;
468bf80f4bSopenharmony_ci        return true;
478bf80f4bSopenharmony_ci    }
488bf80f4bSopenharmony_ci    bool DetachFrom(const META_NS::IAttach::Ptr& target) override
498bf80f4bSopenharmony_ci    {
508bf80f4bSopenharmony_ci        detachCount_++;
518bf80f4bSopenharmony_ci        return true;
528bf80f4bSopenharmony_ci    }
538bf80f4bSopenharmony_ci
548bf80f4bSopenharmony_ci    uint32_t GetAttachCount() const override
558bf80f4bSopenharmony_ci    {
568bf80f4bSopenharmony_ci        return attachCount_;
578bf80f4bSopenharmony_ci    }
588bf80f4bSopenharmony_ci    uint32_t GetDetachCount() const override
598bf80f4bSopenharmony_ci    {
608bf80f4bSopenharmony_ci        return detachCount_;
618bf80f4bSopenharmony_ci    }
628bf80f4bSopenharmony_ci
638bf80f4bSopenharmony_ci    META_IMPLEMENT_PROPERTY(string, Name);
648bf80f4bSopenharmony_ci
658bf80f4bSopenharmony_ci    BASE_NS::string GetName() const override
668bf80f4bSopenharmony_ci    {
678bf80f4bSopenharmony_ci        auto name = META_ACCESS_PROPERTY_VALUE(Name);
688bf80f4bSopenharmony_ci        return name.empty() ? ObjectFwd::GetName() : name;
698bf80f4bSopenharmony_ci    }
708bf80f4bSopenharmony_ci    void SetName(const BASE_NS::string& name) override
718bf80f4bSopenharmony_ci    {
728bf80f4bSopenharmony_ci        META_ACCESS_PROPERTY(Name)->SetValue(name);
738bf80f4bSopenharmony_ci    }
748bf80f4bSopenharmony_ciprivate:
758bf80f4bSopenharmony_ci    uint32_t attachCount_ {};
768bf80f4bSopenharmony_ci    uint32_t detachCount_ {};
778bf80f4bSopenharmony_ci};
788bf80f4bSopenharmony_ciclass TestStartable : public META_NS::AttachmentFwd<TestStartable, ClassId::TestStartable,
798bf80f4bSopenharmony_ci                            META_NS::ITestStartable, META_NS::IStartable, META_NS::ITickable> {
808bf80f4bSopenharmony_ci    bool AttachTo(const META_NS::IAttach::Ptr& target, const META_NS::IObject::Ptr& dataContext) override
818bf80f4bSopenharmony_ci    {
828bf80f4bSopenharmony_ci        if (recording_) {
838bf80f4bSopenharmony_ci            ops_.push_back(ITestStartable::Operation::ATTACH);
848bf80f4bSopenharmony_ci        }
858bf80f4bSopenharmony_ci        attachCount_++;
868bf80f4bSopenharmony_ci        META_ACCESS_PROPERTY(StartableState)->SetValue(StartableState::ATTACHED);
878bf80f4bSopenharmony_ci        return true;
888bf80f4bSopenharmony_ci    }
898bf80f4bSopenharmony_ci    bool DetachFrom(const META_NS::IAttach::Ptr& target) override
908bf80f4bSopenharmony_ci    {
918bf80f4bSopenharmony_ci        if (recording_) {
928bf80f4bSopenharmony_ci            ops_.push_back(ITestStartable::Operation::DETACH);
938bf80f4bSopenharmony_ci        }
948bf80f4bSopenharmony_ci        META_ACCESS_PROPERTY(StartableState)->SetValue(StartableState::DETACHED);
958bf80f4bSopenharmony_ci        detachCount_++;
968bf80f4bSopenharmony_ci        return true;
978bf80f4bSopenharmony_ci    }
988bf80f4bSopenharmony_ci    uint32_t GetAttachCount() const override
998bf80f4bSopenharmony_ci    {
1008bf80f4bSopenharmony_ci        return attachCount_;
1018bf80f4bSopenharmony_ci    }
1028bf80f4bSopenharmony_ci    uint32_t GetDetachCount() const override
1038bf80f4bSopenharmony_ci    {
1048bf80f4bSopenharmony_ci        return detachCount_;
1058bf80f4bSopenharmony_ci    }
1068bf80f4bSopenharmony_ci
1078bf80f4bSopenharmony_ci    META_IMPLEMENT_PROPERTY(string, Name);
1088bf80f4bSopenharmony_ci    META_IMPLEMENT_EVENT(IOnChanged, OnStarted)
1098bf80f4bSopenharmony_ci    META_IMPLEMENT_EVENT(IOnChanged, OnStopped)
1108bf80f4bSopenharmony_ci    META_IMPLEMENT_EVENT(IOnChanged, OnTicked)
1118bf80f4bSopenharmony_ci
1128bf80f4bSopenharmony_ci    BASE_NS::string GetName() const override
1138bf80f4bSopenharmony_ci    {
1148bf80f4bSopenharmony_ci        auto name = META_ACCESS_PROPERTY_VALUE(Name);
1158bf80f4bSopenharmony_ci        return name.empty() ? ObjectFwd::GetName() : name;
1168bf80f4bSopenharmony_ci    }
1178bf80f4bSopenharmony_ci    void SetName(const BASE_NS::string& name) override
1188bf80f4bSopenharmony_ci    {
1198bf80f4bSopenharmony_ci        META_ACCESS_PROPERTY(Name)->SetValue(name);
1208bf80f4bSopenharmony_ci    }
1218bf80f4bSopenharmony_ci
1228bf80f4bSopenharmony_cipublic:
1238bf80f4bSopenharmony_ci    void StartRecording() override
1248bf80f4bSopenharmony_ci    {
1258bf80f4bSopenharmony_ci        recording_ = true;
1268bf80f4bSopenharmony_ci        ops_.clear();
1278bf80f4bSopenharmony_ci    }
1288bf80f4bSopenharmony_ci    BASE_NS::vector<Operation> StopRecording() override
1298bf80f4bSopenharmony_ci    {
1308bf80f4bSopenharmony_ci        recording_ = false;
1318bf80f4bSopenharmony_ci        return ops_;
1328bf80f4bSopenharmony_ci    }
1338bf80f4bSopenharmony_ci    BASE_NS::vector<Operation> GetOps() const override
1348bf80f4bSopenharmony_ci    {
1358bf80f4bSopenharmony_ci        return ops_;
1368bf80f4bSopenharmony_ci    }
1378bf80f4bSopenharmony_ci
1388bf80f4bSopenharmony_cipublic:
1398bf80f4bSopenharmony_ci    void Tick(const TimeSpan& time, const TimeSpan& sinceLastTick) override
1408bf80f4bSopenharmony_ci    {
1418bf80f4bSopenharmony_ci        lastTick_ =  time;
1428bf80f4bSopenharmony_ci        if (recording_) {
1438bf80f4bSopenharmony_ci            ops_.push_back(ITestStartable::Operation::TICK);
1448bf80f4bSopenharmony_ci        }
1458bf80f4bSopenharmony_ci        META_ACCESS_EVENT(OnTicked)->Invoke();
1468bf80f4bSopenharmony_ci    }
1478bf80f4bSopenharmony_ci
1488bf80f4bSopenharmony_ci    TimeSpan GetLastTick() const override
1498bf80f4bSopenharmony_ci    {
1508bf80f4bSopenharmony_ci        return lastTick_;
1518bf80f4bSopenharmony_ci    }
1528bf80f4bSopenharmony_ci
1538bf80f4bSopenharmony_cipublic:
1548bf80f4bSopenharmony_ci    META_IMPLEMENT_INTERFACE_PROPERTY(IStartable, META_NS::StartBehavior, StartableMode, StartBehavior::MANUAL);
1558bf80f4bSopenharmony_ci    META_IMPLEMENT_INTERFACE_READONLY_PROPERTY(
1568bf80f4bSopenharmony_ci        IStartable, META_NS::StartableState, StartableState, StartableState::DETACHED);
1578bf80f4bSopenharmony_ci
1588bf80f4bSopenharmony_ci    bool Start() override
1598bf80f4bSopenharmony_ci    {
1608bf80f4bSopenharmony_ci        if (recording_) {
1618bf80f4bSopenharmony_ci            ops_.push_back(ITestStartable::Operation::START);
1628bf80f4bSopenharmony_ci        }
1638bf80f4bSopenharmony_ci        META_ACCESS_PROPERTY(StartableState)->SetValue(StartableState::STARTED);
1648bf80f4bSopenharmony_ci        META_ACCESS_EVENT(OnStarted)->Invoke();
1658bf80f4bSopenharmony_ci        return true;
1668bf80f4bSopenharmony_ci    }
1678bf80f4bSopenharmony_ci
1688bf80f4bSopenharmony_ci    bool Stop() override
1698bf80f4bSopenharmony_ci    {
1708bf80f4bSopenharmony_ci        if (recording_) {
1718bf80f4bSopenharmony_ci            ops_.push_back(ITestStartable::Operation::STOP);
1728bf80f4bSopenharmony_ci        }
1738bf80f4bSopenharmony_ci        META_ACCESS_PROPERTY(StartableState)->SetValue(StartableState::ATTACHED);
1748bf80f4bSopenharmony_ci        META_ACCESS_EVENT(OnStopped)->Invoke();
1758bf80f4bSopenharmony_ci        return true;
1768bf80f4bSopenharmony_ci    }
1778bf80f4bSopenharmony_ci
1788bf80f4bSopenharmony_ciprivate:
1798bf80f4bSopenharmony_ci    bool recording_ { false };
1808bf80f4bSopenharmony_ci    BASE_NS::vector<ITestStartable::Operation> ops_;
1818bf80f4bSopenharmony_ci    uint32_t attachCount_ {};
1828bf80f4bSopenharmony_ci    uint32_t detachCount_ {};
1838bf80f4bSopenharmony_ci    TimeSpan lastTick_ { TimeSpan::Infinite() };
1848bf80f4bSopenharmony_ci};
1858bf80f4bSopenharmony_ci
1868bf80f4bSopenharmony_ciclass EmbeddedTestType
1878bf80f4bSopenharmony_ci    : public ObjectFwd<EmbeddedTestType, ClassId::EmbeddedTestType, ClassId::Object, IEmbeddedTestType> {
1888bf80f4bSopenharmony_cipublic:
1898bf80f4bSopenharmony_ci    META_IMPLEMENT_PROPERTY(int, Property, 0);
1908bf80f4bSopenharmony_ci};
1918bf80f4bSopenharmony_ci
1928bf80f4bSopenharmony_ciclass TestType : public ObjectFwd<TestType, ClassId::TestType, ClassId::Object, ITestType, IContainable,
1938bf80f4bSopenharmony_ci                      IMutableContainable, IEnablePropertyTraversal, INotifyOnChange> {
1948bf80f4bSopenharmony_cipublic:
1958bf80f4bSopenharmony_ci    using Super = ObjectFwd<TestType, ClassId::TestType, ClassId::Object, ITestType, IContainable, IMutableContainable,
1968bf80f4bSopenharmony_ci        IEnablePropertyTraversal, INotifyOnChange>;
1978bf80f4bSopenharmony_ci
1988bf80f4bSopenharmony_ci    using Super::Super;
1998bf80f4bSopenharmony_ci
2008bf80f4bSopenharmony_ci    META_IMPLEMENT_INTERFACE_PROPERTY(ITestType, int, First);
2018bf80f4bSopenharmony_ci
2028bf80f4bSopenharmony_ci    META_IMPLEMENT_PROPERTY(string, Second, "", ObjectFlagBits::INTERNAL);
2038bf80f4bSopenharmony_ci
2048bf80f4bSopenharmony_ci    META_IMPLEMENT_READONLY_PROPERTY(int, Third, 0);
2058bf80f4bSopenharmony_ci    META_IMPLEMENT_READONLY_PROPERTY(string, Fourth, "");
2068bf80f4bSopenharmony_ci
2078bf80f4bSopenharmony_ci    META_IMPLEMENT_PROPERTY(BASE_NS::Math::Vec3, Vec3Property1);
2088bf80f4bSopenharmony_ci    META_IMPLEMENT_PROPERTY(BASE_NS::Math::Vec3, Vec3Property2);
2098bf80f4bSopenharmony_ci    META_IMPLEMENT_PROPERTY(BASE_NS::Math::Vec3, Vec3Property3);
2108bf80f4bSopenharmony_ci    META_IMPLEMENT_PROPERTY(float, FloatProperty1);
2118bf80f4bSopenharmony_ci    META_IMPLEMENT_PROPERTY(float, FloatProperty2, {});
2128bf80f4bSopenharmony_ci    META_IMPLEMENT_PROPERTY(MyComparableTestType, MyTestTypeProperty1);
2138bf80f4bSopenharmony_ci    META_IMPLEMENT_PROPERTY(MyComparableTestType, MyTestTypeProperty2);
2148bf80f4bSopenharmony_ci
2158bf80f4bSopenharmony_ci    META_IMPLEMENT_PROPERTY(IEmbeddedTestType::Ptr, EmbeddedTestTypeProperty);
2168bf80f4bSopenharmony_ci
2178bf80f4bSopenharmony_ci    META_IMPLEMENT_INTERFACE_ARRAY_PROPERTY(ITestType, int, MyIntArray);
2188bf80f4bSopenharmony_ci    META_IMPLEMENT_READONLY_ARRAY_PROPERTY(int, MyConstIntArray, (BASE_NS::vector<int> { 1, 2, 3, 4, 5}));
2198bf80f4bSopenharmony_ci
2208bf80f4bSopenharmony_ci    META_IMPLEMENT_PROPERTY(string, Name);
2218bf80f4bSopenharmony_ci
2228bf80f4bSopenharmony_ci    META_IMPLEMENT_FUNCTION(TestType, MyTestFunc, "value")
2238bf80f4bSopenharmony_ci    META_IMPLEMENT_FUNCTION(TestType, MyConstTestFunc, "value")
2248bf80f4bSopenharmony_ci
2258bf80f4bSopenharmony_ci    META_IMPLEMENT_INTERFACE_EVENT(ITestType, IOnChanged, OnTest);
2268bf80f4bSopenharmony_ci    META_IMPLEMENT_EVENT(IEvent, IOnChanged, OnChanged);
2278bf80f4bSopenharmony_ci
2288bf80f4bSopenharmony_ci    int MyTestFunc(int v)
2298bf80f4bSopenharmony_ci    {
2308bf80f4bSopenharmony_ci        return v;
2318bf80f4bSopenharmony_ci    }
2328bf80f4bSopenharmony_ci
2338bf80f4bSopenharmony_ci    int MyConstTestFunc(int v) const
2348bf80f4bSopenharmony_ci    {
2358bf80f4bSopenharmony_ci        return v;
2368bf80f4bSopenharmony_ci    }
2378bf80f4bSopenharmony_ci
2388bf80f4bSopenharmony_ci    int NormalMember() override
2398bf80f4bSopenharmony_ci    {
2408bf80f4bSopenharmony_ci        return First()->GetValue();
2418bf80f4bSopenharmony_ci    }
2428bf80f4bSopenharmony_ci
2438bf80f4bSopenharmony_ci    int OtherNormalMember(int v, int some) const override
2448bf80f4bSopenharmony_ci    {
2458bf80f4bSopenharmony_ci        return v + some;
2468bf80f4bSopenharmony_ci    }
2478bf80f4bSopenharmony_ci
2488bf80f4bSopenharmony_ci    META_IMPLEMENT_INTERFACE_FUNCTION(ITestType, TestType, NormalMember);
2498bf80f4bSopenharmony_ci    META_IMPLEMENT_FUNCTION(TestType, OtherNormalMember, "value", "some");
2508bf80f4bSopenharmony_ci
2518bf80f4bSopenharmony_cipublic:
2528bf80f4bSopenharmony_ci    bool Build(const IMetadata::Ptr&) override
2538bf80f4bSopenharmony_ci    {
2548bf80f4bSopenharmony_ci        metaPropertyEmbeddedTestTypeProperty_->SetValue(
2558bf80f4bSopenharmony_ci            META_NS::GetObjectRegistry().Create<IEmbeddedTestType>(ClassId::EmbeddedTestType));
2568bf80f4bSopenharmony_ci        return true;
2578bf80f4bSopenharmony_ci    }
2588bf80f4bSopenharmony_ci
2598bf80f4bSopenharmony_ci    IObject::Ptr GetParent() const override
2608bf80f4bSopenharmony_ci    {
2618bf80f4bSopenharmony_ci        return parent_.lock();
2628bf80f4bSopenharmony_ci    }
2638bf80f4bSopenharmony_ci
2648bf80f4bSopenharmony_ci    void SetParent(const IObject::Ptr& parent) override
2658bf80f4bSopenharmony_ci    {
2668bf80f4bSopenharmony_ci        parent_ = parent;
2678bf80f4bSopenharmony_ci    }
2688bf80f4bSopenharmony_ci
2698bf80f4bSopenharmony_ci    BASE_NS::string GetName() const override
2708bf80f4bSopenharmony_ci    {
2718bf80f4bSopenharmony_ci        return Name()->GetValue().empty() ? ObjectFwd::GetName() : Name()->GetValue();
2728bf80f4bSopenharmony_ci    }
2738bf80f4bSopenharmony_ci
2748bf80f4bSopenharmony_ci    void SetName(const BASE_NS::string& name) override
2758bf80f4bSopenharmony_ci    {
2768bf80f4bSopenharmony_ci        Name()->SetValue(name);
2778bf80f4bSopenharmony_ci        META_ACCESS_EVENT(OnChanged)->Invoke();
2788bf80f4bSopenharmony_ci    }
2798bf80f4bSopenharmony_ci
2808bf80f4bSopenharmony_ci    void SetProperty(const IProperty::ConstWeakPtr& p) override
2818bf80f4bSopenharmony_ci    {
2828bf80f4bSopenharmony_ci        owningProp_ = p;
2838bf80f4bSopenharmony_ci    }
2848bf80f4bSopenharmony_ci
2858bf80f4bSopenharmony_ci    IProperty::ConstWeakPtr GetProperty() const override
2868bf80f4bSopenharmony_ci    {
2878bf80f4bSopenharmony_ci        return owningProp_;
2888bf80f4bSopenharmony_ci    }
2898bf80f4bSopenharmony_ci
2908bf80f4bSopenharmony_ciprivate:
2918bf80f4bSopenharmony_ci    IObject::WeakPtr parent_;
2928bf80f4bSopenharmony_ci    IProperty::ConstWeakPtr owningProp_;
2938bf80f4bSopenharmony_ci};
2948bf80f4bSopenharmony_citemplate<typename FinalClass, const META_NS::ClassInfo& ClassInfo, const META_NS::ClassInfo& SuperClassInfo>
2958bf80f4bSopenharmony_ciclass TestContainerFwd : public CommonObjectContainerFwd<FinalClass, ClassInfo, SuperClassInfo, ITestContainer,
2968bf80f4bSopenharmony_ci                            IContainable, IMutableContainable> {
2978bf80f4bSopenharmony_ci    using Super = CommonObjectContainerFwd<FinalClass, ClassInfo, SuperClassInfo, ITestContainer, IContainable,
2988bf80f4bSopenharmony_ci        IMutableContainable>;
2998bf80f4bSopenharmony_ci
3008bf80f4bSopenharmony_cipublic:
3018bf80f4bSopenharmony_ci    META_IMPLEMENT_PROPERTY(string, Name);
3028bf80f4bSopenharmony_ci
3038bf80f4bSopenharmony_ci    IObject::Ptr GetParent() const override
3048bf80f4bSopenharmony_ci    {
3058bf80f4bSopenharmony_ci        return parent_.lock();
3068bf80f4bSopenharmony_ci    }
3078bf80f4bSopenharmony_ci
3088bf80f4bSopenharmony_ci    void SetParent(const IObject::Ptr& parent) override
3098bf80f4bSopenharmony_ci    {
3108bf80f4bSopenharmony_ci        parent_ = parent;
3118bf80f4bSopenharmony_ci    }
3128bf80f4bSopenharmony_ci
3138bf80f4bSopenharmony_ci    BASE_NS::string GetName() const override
3148bf80f4bSopenharmony_ci    {
3158bf80f4bSopenharmony_ci        return this->Name()->GetValue().empty() ? Super::GetName() : this->Name()->GetValue();
3168bf80f4bSopenharmony_ci    }
3178bf80f4bSopenharmony_ci
3188bf80f4bSopenharmony_ci    void SetName(const BASE_NS::string& name) override
3198bf80f4bSopenharmony_ci    {
3208bf80f4bSopenharmony_ci        META_ACCESS_PROPERTY(Name)->SetValue(name);
3218bf80f4bSopenharmony_ci    }
3228bf80f4bSopenharmony_ci
3238bf80f4bSopenharmony_ci    void Increment() override
3248bf80f4bSopenharmony_ci    {
3258bf80f4bSopenharmony_ci        ++increment_;
3268bf80f4bSopenharmony_ci    }
3278bf80f4bSopenharmony_ci    int GetIncrement() const override
3288bf80f4bSopenharmony_ci    {
3298bf80f4bSopenharmony_ci        return increment_;
3308bf80f4bSopenharmony_ci    }
3318bf80f4bSopenharmony_ci
3328bf80f4bSopenharmony_ci    META_IMPLEMENT_FUNCTION(TestContainerFwd, Increment);
3338bf80f4bSopenharmony_ci
3348bf80f4bSopenharmony_ciprivate:
3358bf80f4bSopenharmony_ci    IObject::WeakPtr parent_;
3368bf80f4bSopenharmony_ci    int increment_ {};
3378bf80f4bSopenharmony_ci};
3388bf80f4bSopenharmony_ci
3398bf80f4bSopenharmony_ciclass TestContainer : public TestContainerFwd<TestContainer, ClassId::TestContainer, ClassId::ObjectContainer> {};
3408bf80f4bSopenharmony_ci
3418bf80f4bSopenharmony_ciclass TestFlatContainer
3428bf80f4bSopenharmony_ci    : public TestContainerFwd<TestFlatContainer, ClassId::TestFlatContainer, ClassId::ObjectFlatContainer> {};
3438bf80f4bSopenharmony_ci
3448bf80f4bSopenharmony_ciclass TestString : public MetaObjectFwd<TestString, ClassId::TestString, ClassId::Object, ITestString, IAny, IValue,
3458bf80f4bSopenharmony_ci                        INotifyOnChange> {
3468bf80f4bSopenharmony_cipublic:
3478bf80f4bSopenharmony_ci    META_IMPLEMENT_EVENT(IEvent, IOnChanged, OnChanged);
3488bf80f4bSopenharmony_ci
3498bf80f4bSopenharmony_ci    explicit TestString(BASE_NS::string s = "") : str_(s) {}
3508bf80f4bSopenharmony_ci
3518bf80f4bSopenharmony_ci    BASE_NS::string GetString() const override
3528bf80f4bSopenharmony_ci    {
3538bf80f4bSopenharmony_ci        return str_;
3548bf80f4bSopenharmony_ci    }
3558bf80f4bSopenharmony_ci    void SetString(BASE_NS::string s) override
3568bf80f4bSopenharmony_ci    {
3578bf80f4bSopenharmony_ci        str_ = s;
3588bf80f4bSopenharmony_ci        META_ACCESS_EVENT(OnChanged)->Invoke();
3598bf80f4bSopenharmony_ci    }
3608bf80f4bSopenharmony_ci
3618bf80f4bSopenharmony_ci    static constexpr TypeId TYPE_ID = UidFromType<ITestString::Ptr>();
3628bf80f4bSopenharmony_ci
3638bf80f4bSopenharmony_ci    const BASE_NS::array_view<const TypeId> GetCompatibleTypes(CompatibilityDirection) const override
3648bf80f4bSopenharmony_ci    {
3658bf80f4bSopenharmony_ci        static const TypeId arr[] = { TYPE_ID, UidFromType<BASE_NS::string>() };
3668bf80f4bSopenharmony_ci        return arr;
3678bf80f4bSopenharmony_ci    }
3688bf80f4bSopenharmony_ci
3698bf80f4bSopenharmony_ci    AnyReturnValue GetData(const TypeId& id, void* data, size_t size) const override
3708bf80f4bSopenharmony_ci    {
3718bf80f4bSopenharmony_ci        if (id == TYPE_ID) {
3728bf80f4bSopenharmony_ci            *static_cast<ITestString::Ptr*>(data) = GetSelf<ITestString>();
3738bf80f4bSopenharmony_ci            return AnyReturn::SUCCESS;
3748bf80f4bSopenharmony_ci        }
3758bf80f4bSopenharmony_ci        if (id == UidFromType<BASE_NS::string>()) {
3768bf80f4bSopenharmony_ci            *static_cast<BASE_NS::string*>(data) = str_;
3778bf80f4bSopenharmony_ci            return AnyReturn::SUCCESS;
3788bf80f4bSopenharmony_ci        }
3798bf80f4bSopenharmony_ci        return AnyReturn::INCOMPATIBLE_TYPE;
3808bf80f4bSopenharmony_ci    }
3818bf80f4bSopenharmony_ci    AnyReturnValue SetData(const TypeId& id, const void* data, size_t size) override
3828bf80f4bSopenharmony_ci    {
3838bf80f4bSopenharmony_ci        if (id == TYPE_ID) {
3848bf80f4bSopenharmony_ci            str_ = (*static_cast<const ITestString::Ptr*>(data))->GetString();
3858bf80f4bSopenharmony_ci            return AnyReturn::SUCCESS;
3868bf80f4bSopenharmony_ci        }
3878bf80f4bSopenharmony_ci        if (id == UidFromType<BASE_NS::string>()) {
3888bf80f4bSopenharmony_ci            str_ = *static_cast<const BASE_NS::string*>(data);
3898bf80f4bSopenharmony_ci            return AnyReturn::SUCCESS;
3908bf80f4bSopenharmony_ci        }
3918bf80f4bSopenharmony_ci        return AnyReturn::INCOMPATIBLE_TYPE;
3928bf80f4bSopenharmony_ci    }
3938bf80f4bSopenharmony_ci    AnyReturnValue CopyFrom(const IAny& any) override
3948bf80f4bSopenharmony_ci    {
3958bf80f4bSopenharmony_ci        if (any.GetTypeId() == TYPE_ID) {
3968bf80f4bSopenharmony_ci            ITestString::Ptr p;
3978bf80f4bSopenharmony_ci            auto ret = any.GetValue(p);
3988bf80f4bSopenharmony_ci            if (ret) {
3998bf80f4bSopenharmony_ci                if (p) {
4008bf80f4bSopenharmony_ci                    str_ = p->GetString();
4018bf80f4bSopenharmony_ci                } else {
4028bf80f4bSopenharmony_ci                    str_ = "";
4038bf80f4bSopenharmony_ci                }
4048bf80f4bSopenharmony_ci            }
4058bf80f4bSopenharmony_ci            return ret;
4068bf80f4bSopenharmony_ci        }
4078bf80f4bSopenharmony_ci        return any.GetValue(str_);
4088bf80f4bSopenharmony_ci    }
4098bf80f4bSopenharmony_ci    IAny::Ptr Clone(const AnyCloneOptions& options) const override
4108bf80f4bSopenharmony_ci    {
4118bf80f4bSopenharmony_ci        if (options.role == TypeIdRole::CURRENT || options.role == TypeIdRole::ITEM) {
4128bf80f4bSopenharmony_ci            auto obj = META_NS::GetObjectRegistry().Create<ITestString>(ClassId::TestString);
4138bf80f4bSopenharmony_ci            if (obj && options.value == CloneValueType::COPY_VALUE) {
4148bf80f4bSopenharmony_ci                obj->SetString(str_);
4158bf80f4bSopenharmony_ci            }
4168bf80f4bSopenharmony_ci            return interface_pointer_cast<IAny>(obj);
4178bf80f4bSopenharmony_ci        }
4188bf80f4bSopenharmony_ci        return nullptr;
4198bf80f4bSopenharmony_ci    }
4208bf80f4bSopenharmony_ci    TypeId GetTypeId(TypeIdRole role) const override
4218bf80f4bSopenharmony_ci    {
4228bf80f4bSopenharmony_ci        if (role == TypeIdRole::CURRENT || role == TypeIdRole::ITEM) {
4238bf80f4bSopenharmony_ci            return TYPE_ID;
4248bf80f4bSopenharmony_ci        }
4258bf80f4bSopenharmony_ci        return {};
4268bf80f4bSopenharmony_ci    }
4278bf80f4bSopenharmony_ci    BASE_NS::string GetTypeIdString() const override
4288bf80f4bSopenharmony_ci    {
4298bf80f4bSopenharmony_ci        return MetaType<ITestString::Ptr>::name;
4308bf80f4bSopenharmony_ci    }
4318bf80f4bSopenharmony_ci
4328bf80f4bSopenharmony_ci    AnyReturnValue SetValue(const IAny& value) override
4338bf80f4bSopenharmony_ci    {
4348bf80f4bSopenharmony_ci        return CopyFrom(value);
4358bf80f4bSopenharmony_ci    }
4368bf80f4bSopenharmony_ci    const IAny& GetValue() const override
4378bf80f4bSopenharmony_ci    {
4388bf80f4bSopenharmony_ci        return *this;
4398bf80f4bSopenharmony_ci    }
4408bf80f4bSopenharmony_ci    bool IsCompatible(const TypeId& id) const override
4418bf80f4bSopenharmony_ci    {
4428bf80f4bSopenharmony_ci        return META_NS::IsCompatible(*this, id);
4438bf80f4bSopenharmony_ci    }
4448bf80f4bSopenharmony_ci
4458bf80f4bSopenharmony_ciprivate:
4468bf80f4bSopenharmony_ci    BASE_NS::string str_;
4478bf80f4bSopenharmony_ci};
4488bf80f4bSopenharmony_ci
4498bf80f4bSopenharmony_ciclass TestPtrValue : public ObjectFwd<TestPtrValue, ClassId::TestPtrValue, ClassId::Object, ITestPtrValue> {
4508bf80f4bSopenharmony_cipublic:
4518bf80f4bSopenharmony_ci    META_IMPLEMENT_PROPERTY(META_VALUE_PTR(ITestString, ClassId::TestString), Text, BASE_NS::string("Some"));
4528bf80f4bSopenharmony_ci    META_IMPLEMENT_PROPERTY(META_VALUE_PTR(ITestString, ClassId::TestString), String);
4538bf80f4bSopenharmony_ci};
4548bf80f4bSopenharmony_ci} // namespace
4558bf80f4bSopenharmony_ci
4568bf80f4bSopenharmony_ciclass MyTestTypeInterpolator
4578bf80f4bSopenharmony_ci    : public META_NS::Interpolator<MyComparableTestType, MyTestTypeInterpolator, ClassId::MyTestTypeInterpolator> {};
4588bf80f4bSopenharmony_ci
4598bf80f4bSopenharmony_cistatic void RegisterComparableTestTypeSerialiser()
4608bf80f4bSopenharmony_ci{
4618bf80f4bSopenharmony_ci    RegisterSerializer<MyComparableTestType>(
4628bf80f4bSopenharmony_ci        [](auto&, const MyComparableTestType& v) {
4638bf80f4bSopenharmony_ci            auto n = GetObjectRegistry().Create<IDoubleNode>(META_NS::ClassId::DoubleNode);
4648bf80f4bSopenharmony_ci            if (n) {
4658bf80f4bSopenharmony_ci                n->SetValue(v.i);
4668bf80f4bSopenharmony_ci            }
4678bf80f4bSopenharmony_ci            return n;
4688bf80f4bSopenharmony_ci        },
4698bf80f4bSopenharmony_ci        [](auto&, const ISerNode::ConstPtr& node, MyComparableTestType& out) {
4708bf80f4bSopenharmony_ci            float v {};
4718bf80f4bSopenharmony_ci            if (ExtractNumber(node, v)) {
4728bf80f4bSopenharmony_ci                out.i = v;
4738bf80f4bSopenharmony_ci                return true;
4748bf80f4bSopenharmony_ci            }
4758bf80f4bSopenharmony_ci            return false;
4768bf80f4bSopenharmony_ci        });
4778bf80f4bSopenharmony_ci}
4788bf80f4bSopenharmony_cistatic void RegisterTestEnumSerialiser()
4798bf80f4bSopenharmony_ci{
4808bf80f4bSopenharmony_ci    RegisterSerializer<TestEnum>(
4818bf80f4bSopenharmony_ci        [](auto&, const TestEnum& v) {
4828bf80f4bSopenharmony_ci            auto n = GetObjectRegistry().Create<IUIntNode>(META_NS::ClassId::UIntNode);
4838bf80f4bSopenharmony_ci            if (n) {
4848bf80f4bSopenharmony_ci                n->SetValue(v);
4858bf80f4bSopenharmony_ci            }
4868bf80f4bSopenharmony_ci            return n;
4878bf80f4bSopenharmony_ci        },
4888bf80f4bSopenharmony_ci        [](auto&, const ISerNode::ConstPtr& node, TestEnum& out) {
4898bf80f4bSopenharmony_ci            auto v = interface_cast<IUIntNode>(node);
4908bf80f4bSopenharmony_ci            if (v) {
4918bf80f4bSopenharmony_ci                out = static_cast<TestEnum>(v->GetValue());
4928bf80f4bSopenharmony_ci            }
4938bf80f4bSopenharmony_ci            return v != nullptr;
4948bf80f4bSopenharmony_ci        });
4958bf80f4bSopenharmony_ci}
4968bf80f4bSopenharmony_ci
4978bf80f4bSopenharmony_cistatic void RegisterMyTestTypeSerialiser()
4988bf80f4bSopenharmony_ci{
4998bf80f4bSopenharmony_ci    RegisterSerializer<MyTestType>(
5008bf80f4bSopenharmony_ci        [](auto&, const MyTestType& v) {
5018bf80f4bSopenharmony_ci            auto obj = CreateObjectNode(UidFromType<MyTestType>(), "MyTestType");
5028bf80f4bSopenharmony_ci            if (obj) {
5038bf80f4bSopenharmony_ci                if (auto n = GetObjectRegistry().Create<IMapNode>(META_NS::ClassId::MapNode)) {
5048bf80f4bSopenharmony_ci                    auto in = GetObjectRegistry().Create<IIntNode>(META_NS::ClassId::IntNode);
5058bf80f4bSopenharmony_ci                    if (in) {
5068bf80f4bSopenharmony_ci                        in->SetValue(v.i);
5078bf80f4bSopenharmony_ci                        n->AddNode("value", n);
5088bf80f4bSopenharmony_ci                        obj->SetMembers(n);
5098bf80f4bSopenharmony_ci                    }
5108bf80f4bSopenharmony_ci                }
5118bf80f4bSopenharmony_ci            }
5128bf80f4bSopenharmony_ci            return obj;
5138bf80f4bSopenharmony_ci        },
5148bf80f4bSopenharmony_ci        [](auto&, const ISerNode::ConstPtr& node, MyTestType& out) {
5158bf80f4bSopenharmony_ci            if (auto obj = interface_cast<IObjectNode>(node)) {
5168bf80f4bSopenharmony_ci                if (auto m = interface_cast<IMapNode>(obj->GetMembers())) {
5178bf80f4bSopenharmony_ci                    auto vnode = m->FindNode("value");
5188bf80f4bSopenharmony_ci                    int64_t v {};
5198bf80f4bSopenharmony_ci                    if (ExtractNumber(vnode, v)) {
5208bf80f4bSopenharmony_ci                        out.i = v;
5218bf80f4bSopenharmony_ci                        return true;
5228bf80f4bSopenharmony_ci                    }
5238bf80f4bSopenharmony_ci                }
5248bf80f4bSopenharmony_ci            }
5258bf80f4bSopenharmony_ci            return false;
5268bf80f4bSopenharmony_ci        });
5278bf80f4bSopenharmony_ci}
5288bf80f4bSopenharmony_ci
5298bf80f4bSopenharmony_civoid RegisterTestTypes()
5308bf80f4bSopenharmony_ci{
5318bf80f4bSopenharmony_ci    auto& registry = META_NS::GetObjectRegistry();
5328bf80f4bSopenharmony_ci    registry.RegisterObjectType(EmbeddedTestType::GetFactory());
5338bf80f4bSopenharmony_ci    registry.RegisterObjectType(TestContainer::GetFactory());
5348bf80f4bSopenharmony_ci    registry.RegisterObjectType(TestFlatContainer::GetFactory());
5358bf80f4bSopenharmony_ci    registry.RegisterObjectType(TestType::GetFactory());
5368bf80f4bSopenharmony_ci    registry.RegisterObjectType(MyTestTypeInterpolator::GetFactory());
5378bf80f4bSopenharmony_ci    registry.RegisterObjectType(TestAttachment::GetFactory());
5388bf80f4bSopenharmony_ci    registry.RegisterObjectType(TestStartable::GetFactory());
5398bf80f4bSopenharmony_ci    registry.RegisterObjectType(TestString::GetFactory());
5408bf80f4bSopenharmony_ci    registry.RegisterObjectType(TestPtrValue::GetFactory());
5418bf80f4bSopenharmony_ci
5428bf80f4bSopenharmony_ci    RegisterTypeForBuiltinAny<MyComparableTestType>();
5438bf80f4bSopenharmony_ci    RegisterTypeForBuiltinAny<MyTestType>();
5448bf80f4bSopenharmony_ci    RegisterTypeForBuiltinAny<TestEnum>();
5458bf80f4bSopenharmony_ci    RegisterTypeForBuiltinAny<IEmbeddedTestType::Ptr>();
5468bf80f4bSopenharmony_ci    RegisterTypeForBuiltinAny<ITestType::Ptr>();
5478bf80f4bSopenharmony_ci    RegisterTypeForBuiltinAny<ITestType::WeakPtr>();
5488bf80f4bSopenharmony_ci
5498bf80f4bSopenharmony_ci    registry.RegisterInterpolator(UidFromType<MyComparableTestType>(), ClassId::MyTestTypeInterpolator.Id().ToUid());
5508bf80f4bSopenharmony_ci
5518bf80f4bSopenharmony_ci    RegisterComparableTestTypeSerialiser();
5528bf80f4bSopenharmony_ci    RegisterTestEnumSerialiser();
5538bf80f4bSopenharmony_ci    RegisterMyTestTypeSerialiser();
5548bf80f4bSopenharmony_ci}
5558bf80f4bSopenharmony_ci
5568bf80f4bSopenharmony_civoid UnregisterTestTypes()
5578bf80f4bSopenharmony_ci{
5588bf80f4bSopenharmony_ci    auto& registry = META_NS::GetObjectRegistry();
5598bf80f4bSopenharmony_ci    UnregisterSerializer<MyTestType>();
5608bf80f4bSopenharmony_ci    UnregisterSerializer<TestEnum>();
5618bf80f4bSopenharmony_ci    UnregisterSerializer<MyComparableTestType>();
5628bf80f4bSopenharmony_ci
5638bf80f4bSopenharmony_ci    registry.UnregisterInterpolator(UidFromType<MyComparableTestType>());
5648bf80f4bSopenharmony_ci
5658bf80f4bSopenharmony_ci    UnregisterTypeForBuiltinAny<ITestType::WeakPtr>();
5668bf80f4bSopenharmony_ci    UnregisterTypeForBuiltinAny<ITestType::Ptr>();
5678bf80f4bSopenharmony_ci    UnregisterTypeForBuiltinAny<IEmbeddedTestType::Ptr>();
5688bf80f4bSopenharmony_ci    UnregisterTypeForBuiltinAny<MyComparableTestType>();
5698bf80f4bSopenharmony_ci    UnregisterTypeForBuiltinAny<MyTestType>();
5708bf80f4bSopenharmony_ci    UnregisterTypeForBuiltinAny<TestEnum>();
5718bf80f4bSopenharmony_ci
5728bf80f4bSopenharmony_ci    registry.UnregisterObjectType(TestPtrValue::GetFactory());
5738bf80f4bSopenharmony_ci    registry.UnregisterObjectType(TestString::GetFactory());
5748bf80f4bSopenharmony_ci    registry.UnregisterObjectType(TestStartable::GetFactory());
5758bf80f4bSopenharmony_ci    registry.UnregisterObjectType(TestAttachment::GetFactory());
5768bf80f4bSopenharmony_ci    registry.UnregisterObjectType(MyTestTypeInterpolator::GetFactory());
5778bf80f4bSopenharmony_ci    registry.UnregisterObjectType(TestType::GetFactory());
5788bf80f4bSopenharmony_ci    registry.UnregisterObjectType(TestFlatContainer::GetFactory());
5798bf80f4bSopenharmony_ci    registry.UnregisterObjectType(TestContainer::GetFactory());
5808bf80f4bSopenharmony_ci    registry.UnregisterObjectType(EmbeddedTestType::GetFactory());
5818bf80f4bSopenharmony_ci}
5828bf80f4bSopenharmony_ci
5838bf80f4bSopenharmony_ciITestType::Ptr CreateTestType(const BASE_NS::string_view name)
5848bf80f4bSopenharmony_ci{
5858bf80f4bSopenharmony_ci    const auto object = META_NS::GetObjectRegistry().Create<ITestType>(ClassId::TestType);
5868bf80f4bSopenharmony_ci    if (object) {
5878bf80f4bSopenharmony_ci        object->SetName(BASE_NS::string(name));
5888bf80f4bSopenharmony_ci    }
5898bf80f4bSopenharmony_ci    return object;
5908bf80f4bSopenharmony_ci}
5918bf80f4bSopenharmony_ci
5928bf80f4bSopenharmony_ciITestContainer::Ptr CreateTestContainer(const BASE_NS::string_view name, ClassInfo type)
5938bf80f4bSopenharmony_ci{
5948bf80f4bSopenharmony_ci    const auto object = META_NS::GetObjectRegistry().Create<ITestContainer>(type);
5958bf80f4bSopenharmony_ci    if (object) {
5968bf80f4bSopenharmony_ci        object->SetName(BASE_NS::string(name));
5978bf80f4bSopenharmony_ci    }
5988bf80f4bSopenharmony_ci    return object;
5998bf80f4bSopenharmony_ci}
6008bf80f4bSopenharmony_ci
6018bf80f4bSopenharmony_ciITestAttachment::Ptr CreateTestAttachment(const BASE_NS::string_view name)
6028bf80f4bSopenharmony_ci{
6038bf80f4bSopenharmony_ci    const auto object = META_NS::GetObjectRegistry().Create<ITestAttachment>(ClassId::TestAttachment);
6048bf80f4bSopenharmony_ci    if (object) {
6058bf80f4bSopenharmony_ci        object->SetName(BASE_NS::string(name));
6068bf80f4bSopenharmony_ci    }
6078bf80f4bSopenharmony_ci    return object;
6088bf80f4bSopenharmony_ci}
6098bf80f4bSopenharmony_ci
6108bf80f4bSopenharmony_ciITestStartable::Ptr CreateTestStartable(const BASE_NS::string_view name, META_NS::StartBehavior behavior)
6118bf80f4bSopenharmony_ci{
6128bf80f4bSopenharmony_ci    const auto object = META_NS::GetObjectRegistry().Create<ITestStartable>(ClassId::TestStartable);
6138bf80f4bSopenharmony_ci    if (object) {
6148bf80f4bSopenharmony_ci        object->SetName(BASE_NS::string(name));
6158bf80f4bSopenharmony_ci    }
6168bf80f4bSopenharmony_ci    SetValue(interface_pointer_cast<IStartable>(object)->StartableMode(), behavior);
6178bf80f4bSopenharmony_ci    return object;
6188bf80f4bSopenharmony_ci}
6198bf80f4bSopenharmony_ci
6208bf80f4bSopenharmony_cistd::ostream& operator<<(std::ostream& os, const META_NS::ITestStartable::Operation& op)
6218bf80f4bSopenharmony_ci{
6228bf80f4bSopenharmony_ci    switch (op) {
6238bf80f4bSopenharmony_ci        case ITestStartable::Operation::START:
6248bf80f4bSopenharmony_ci            return os << "Operation::START";
6258bf80f4bSopenharmony_ci        case ITestStartable::Operation::STOP:
6268bf80f4bSopenharmony_ci            return os << "Operation::STOP";
6278bf80f4bSopenharmony_ci        case ITestStartable::Operation::ATTACH:
6288bf80f4bSopenharmony_ci            return os << "Operation::ATTACH";
6298bf80f4bSopenharmony_ci        case ITestStartable::Operation::DETACH:
6308bf80f4bSopenharmony_ci            return os << "Operation::DETACH";
6318bf80f4bSopenharmony_ci        case ITestStartable::Operation::TICK:
6328bf80f4bSopenharmony_ci            return os << "Operation::TICK";
6338bf80f4bSopenharmony_ci    }
6348bf80f4bSopenharmony_ci    return os;
6358bf80f4bSopenharmony_ci}
636