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