• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "helpers/testing_objects.h"
17 
18 #include <ostream>
19 
20 #include <base/math/vector.h>
21 
22 #include <meta/api/call_context.h>
23 #include <meta/api/util.h>
24 #include <meta/ext/animation/interpolator.h>
25 #include <meta/ext/any_builder.h>
26 #include <meta/ext/attachment/attachment.h>
27 #include <meta/ext/event_impl.h>
28 #include <meta/ext/object_container.h>
29 #include <meta/ext/object_fwd.h>
30 #include <meta/ext/serialization/common_value_serializers.h>
31 #include <meta/interface/intf_containable.h>
32 #include <meta/interface/intf_container.h>
33 #include <meta/interface/intf_startable.h>
34 #include <meta/interface/intf_tickable.h>
35 #include <meta/interface/property/intf_property.h>
36 #include <meta/interface/property/property.h>
37 #include <meta/interface/property/property_events.h>
38 
39 META_BEGIN_NAMESPACE()
40 
41 META_REGISTER_SINGLETON_CLASS(
42     MyTestTypeInterpolator, "cf6ad797-b2cc-44c7-8b5d-220b3c47950e", META_NS::ObjectCategoryBits::INTERNAL)
43 
44 namespace {
45 
46 class TestAttachment : public IntroduceInterfaces<META_NS::AttachmentFwd, META_NS::ITestAttachment> {
META_OBJECT(TestAttachment,ClassId::TestAttachment,IntroduceInterfaces)47     META_OBJECT(TestAttachment, ClassId::TestAttachment, IntroduceInterfaces)
48 
49     bool AttachTo(const META_NS::IAttach::Ptr& target, const META_NS::IObject::Ptr& dataContext) override
50     {
51         attachCount_++;
52         return true;
53     }
DetachFrom(const META_NS::IAttach::Ptr & target)54     bool DetachFrom(const META_NS::IAttach::Ptr& target) override
55     {
56         detachCount_++;
57         return true;
58     }
59 
GetAttachCount() const60     uint32_t GetAttachCount() const override
61     {
62         return attachCount_;
63     }
GetDetachCount() const64     uint32_t GetDetachCount() const override
65     {
66         return detachCount_;
67     }
68 
69 public:
70     META_BEGIN_STATIC_DATA()
META_STATIC_PROPERTY_DATA(ITestAttachment,string,Name)71     META_STATIC_PROPERTY_DATA(ITestAttachment, string, Name)
72     META_END_STATIC_DATA()
73     META_IMPLEMENT_PROPERTY(string, Name)
74 
75     BASE_NS::string GetName() const override
76     {
77         auto name = META_ACCESS_PROPERTY_VALUE(Name);
78         return name.empty() ? ObjectFwd::GetName() : name;
79     }
80 
SetName(const BASE_NS::string & name)81     void SetName(const BASE_NS::string& name) override
82     {
83         META_ACCESS_PROPERTY(Name)->SetValue(name);
84     }
85 
86 private:
87     uint32_t attachCount_ {};
88     uint32_t detachCount_ {};
89 };
90 
91 class TestStartable : public IntroduceInterfaces<META_NS::AttachmentFwd, META_NS::ITestStartable,
92                           META_NS::IStartable, META_NS::ITickable> {
93     META_OBJECT(TestStartable, ClassId::TestStartable, IntroduceInterfaces)
94 public:
95     META_BEGIN_STATIC_DATA()
META_STATIC_PROPERTY_DATA(IStartable,META_NS::StartBehavior,StartableMode,StartBehavior::MANUAL)96     META_STATIC_PROPERTY_DATA(IStartable, META_NS::StartBehavior, StartableMode, StartBehavior::MANUAL)
97     META_STATIC_PROPERTY_DATA(IStartable, META_NS::StartableState, StartableState, StartableState::DETACHED)
98     META_STATIC_PROPERTY_DATA(META_NS::ITestAttachment, BASE_NS::string, Name)
99     META_STATIC_EVENT_DATA(META_NS::ITestStartable, META_NS::IOnChanged, OnStarted)
100     META_STATIC_EVENT_DATA(META_NS::ITestStartable, META_NS::IOnChanged, OnStopped)
101     META_STATIC_EVENT_DATA(META_NS::ITestStartable, META_NS::IOnChanged, OnTicked)
102     META_END_STATIC_DATA()
103 
104     bool AttachTo(const META_NS::IAttach::Ptr& target, const META_NS::IObject::Ptr& dataContext) override
105     {
106         if (recording_) {
107             ops_.push_back(ITestStartable::Operation::ATTACH);
108         }
109         attachCount_++;
110         META_ACCESS_PROPERTY(StartableState)->SetValue(StartableState::ATTACHED);
111         return true;
112     }
DetachFrom(const META_NS::IAttach::Ptr & target)113     bool DetachFrom(const META_NS::IAttach::Ptr& target) override
114     {
115         if (recording_) {
116             ops_.push_back(ITestStartable::Operation::DETACH);
117         }
118         META_ACCESS_PROPERTY(StartableState)->SetValue(StartableState::DETACHED);
119         detachCount_++;
120         return true;
121     }
122 
GetAttachCount() const123     uint32_t GetAttachCount() const override
124     {
125         return attachCount_;
126     }
GetDetachCount() const127     uint32_t GetDetachCount() const override
128     {
129         return detachCount_;
130     }
131 
META_IMPLEMENT_PROPERTY(string,Name)132     META_IMPLEMENT_PROPERTY(string, Name)
133     META_IMPLEMENT_EVENT(IOnChanged, OnStarted)
134     META_IMPLEMENT_EVENT(IOnChanged, OnStopped)
135     META_IMPLEMENT_EVENT(IOnChanged, OnTicked)
136 
137     BASE_NS::string GetName() const override
138     {
139         auto name = META_ACCESS_PROPERTY_VALUE(Name);
140         return name.empty() ? ObjectFwd::GetName() : name;
141     }
142 
SetName(const BASE_NS::string & name)143     void SetName(const BASE_NS::string& name) override
144     {
145         META_ACCESS_PROPERTY(Name)->SetValue(name);
146     }
147 
148 public: // ITestStartable
StartRecording()149     void StartRecording() override
150     {
151         recording_ = true;
152         ops_.clear();
153     }
StopRecording()154     BASE_NS::vector<Operation> StopRecording() override
155     {
156         recording_ = false;
157         return ops_;
158     }
GetOps() const159     BASE_NS::vector<Operation> GetOps() const override
160     {
161         return ops_;
162     }
163 
164 public: // ITickable
Tick(const TimeSpan & time,const TimeSpan & sinceLastTick)165     void Tick(const TimeSpan& time, const TimeSpan& sinceLastTick) override
166     {
167         lastTick_ = time;
168         if (recording_) {
169             ops_.push_back(ITestStartable::Operation::TICK);
170         }
171         Invoke<IOnChanged>(OnTicked());
172     }
173 
GetLastTick() const174     TimeSpan GetLastTick() const override
175     {
176         return lastTick_;
177     }
178 
179 public: // IStartable
META_IMPLEMENT_PROPERTY(META_NS::StartBehavior,StartableMode)180     META_IMPLEMENT_PROPERTY(META_NS::StartBehavior, StartableMode)
181     META_IMPLEMENT_READONLY_PROPERTY(META_NS::StartableState, StartableState)
182 
183     bool Start() override
184     {
185         if (recording_) {
186             ops_.push_back(ITestStartable::Operation::START);
187         }
188         META_ACCESS_PROPERTY(StartableState)->SetValue(StartableState::STARTED);
189         Invoke<IOnChanged>(OnStarted());
190         return true;
191     }
192 
Stop()193     bool Stop() override
194     {
195         if (recording_) {
196             ops_.push_back(ITestStartable::Operation::STOP);
197         }
198         META_ACCESS_PROPERTY(StartableState)->SetValue(StartableState::ATTACHED);
199         Invoke<IOnChanged>(OnStopped());
200         return true;
201     }
202 
203 private:
204     bool recording_ { false };
205     BASE_NS::vector<ITestStartable::Operation> ops_;
206     uint32_t attachCount_ {};
207     uint32_t detachCount_ {};
208     TimeSpan lastTick_ { TimeSpan::Infinite() };
209 };
210 
211 class EmbeddedTestType : public IntroduceInterfaces<ObjectFwd, IEmbeddedTestType> {
212     META_OBJECT(EmbeddedTestType, ClassId::EmbeddedTestType, IntroduceInterfaces)
213 public:
214     META_BEGIN_STATIC_DATA()
215     META_STATIC_PROPERTY_DATA(IEmbeddedTestType, int, Property)
216     META_END_STATIC_DATA()
217     META_IMPLEMENT_PROPERTY(int, Property)
218 };
219 
220 class TestType : public IntroduceInterfaces<ObjectFwd, ITestType, IContainable, IMutableContainable,
221                      IEnablePropertyTraversal, INotifyOnChange> {
222     META_OBJECT(TestType, ClassId::TestType, IntroduceInterfaces)
223 public:
224     using IMetadata::GetProperty;
225     using Super::Super;
226 
227     META_BEGIN_STATIC_DATA()
228 
229     META_STATIC_PROPERTY_DATA(ITestType, int, First)
230     META_STATIC_PROPERTY_DATA(ITestType, string, Second, "", ObjectFlagBits::INTERNAL)
231     META_STATIC_PROPERTY_DATA(ITestType, int, Third, 0)
232     META_STATIC_PROPERTY_DATA(ITestType, string, Fourth, "")
233 
234     META_STATIC_PROPERTY_DATA(ITestType, BASE_NS::Math::Vec3, Vec3Property1)
235     META_STATIC_PROPERTY_DATA(ITestType, BASE_NS::Math::Vec3, Vec3Property2)
236     META_STATIC_PROPERTY_DATA(ITestType, BASE_NS::Math::Vec3, Vec3Property3)
237     META_STATIC_PROPERTY_DATA(ITestType, float, FloatProperty1)
238     META_STATIC_PROPERTY_DATA(ITestType, float, FloatProperty2)
239     META_STATIC_PROPERTY_DATA(ITestType, MyComparableTestType, MyTestTypeProperty1)
240     META_STATIC_PROPERTY_DATA(ITestType, MyComparableTestType, MyTestTypeProperty2)
241 
242     META_STATIC_PROPERTY_DATA(ITestType, IEmbeddedTestType::Ptr, EmbeddedTestTypeProperty)
243     META_STATIC_PROPERTY_DATA(ITestType, string, Name)
244 
245     META_STATIC_ARRAY_PROPERTY_DATA(ITestType, int, MyIntArray)
246     META_STATIC_ARRAY_PROPERTY_DATA(ITestType, int, MyConstIntArray, (BASE_NS::vector<int> { 1, 2, 3, 4, 5 }))
247 
248     META_STATIC_ARRAY_PROPERTY_DATA(ITestType, IObject::Ptr, MyObjectArray)
249 
250     META_STATIC_FUNCTION_DATA(ITestType, NormalMember)
251     META_STATIC_FUNCTION_DATA(ITestType, OtherNormalMember, "value", "some")
252 
253     META_STATIC_EVENT_DATA(ITestType, IOnChanged, OnTest)
254     META_STATIC_EVENT_DATA(IEvent, IOnChanged, OnChanged)
255     META_END_STATIC_DATA()
256 
257     META_IMPLEMENT_PROPERTY(int, First)
258     META_IMPLEMENT_PROPERTY(string, Second)
259 
260     META_IMPLEMENT_READONLY_PROPERTY(int, Third)
261     META_IMPLEMENT_READONLY_PROPERTY(string, Fourth)
262 
263     META_IMPLEMENT_PROPERTY(BASE_NS::Math::Vec3, Vec3Property1)
264     META_IMPLEMENT_PROPERTY(BASE_NS::Math::Vec3, Vec3Property2)
265     META_IMPLEMENT_PROPERTY(BASE_NS::Math::Vec3, Vec3Property3)
266     META_IMPLEMENT_PROPERTY(float, FloatProperty1)
267     META_IMPLEMENT_PROPERTY(float, FloatProperty2)
268     META_IMPLEMENT_PROPERTY(MyComparableTestType, MyTestTypeProperty1)
269     META_IMPLEMENT_PROPERTY(MyComparableTestType, MyTestTypeProperty2)
270 
271     META_IMPLEMENT_PROPERTY(IEmbeddedTestType::Ptr, EmbeddedTestTypeProperty)
272 
273     META_IMPLEMENT_ARRAY_PROPERTY(int, MyIntArray)
274     META_IMPLEMENT_READONLY_ARRAY_PROPERTY(int, MyConstIntArray)
275     //    META_IMPLEMENT_PROPERTY(int, NonSerialized, 1)
276 
277     META_IMPLEMENT_ARRAY_PROPERTY(IObject::Ptr, MyObjectArray);
278 
META_IMPLEMENT_PROPERTY(string,Name)279     META_IMPLEMENT_PROPERTY(string, Name)
280 
281     META_IMPLEMENT_EVENT(IOnChanged, OnTest)
282     META_IMPLEMENT_EVENT(IOnChanged, OnChanged)
283 
284     int NormalMember() override
285     {
286         return First()->GetValue();
287     }
288 
OtherNormalMember(int v,int some) const289     int OtherNormalMember(int v, int some) const override
290     {
291         return v + some;
292     }
293 
294 public:
Build(const IMetadata::Ptr &)295     bool Build(const IMetadata::Ptr&) override
296     {
297         EmbeddedTestTypeProperty()->SetValue(
298             META_NS::GetObjectRegistry().Create<IEmbeddedTestType>(ClassId::EmbeddedTestType));
299         return true;
300     }
301 
GetParent() const302     IObject::Ptr GetParent() const override
303     {
304         return parent_.lock();
305     }
306 
SetParent(const IObject::Ptr & parent)307     void SetParent(const IObject::Ptr& parent) override
308     {
309         parent_ = parent;
310     }
311 
GetName() const312     BASE_NS::string GetName() const override
313     {
314         return Name()->GetValue().empty() ? ObjectFwd::GetName() : Name()->GetValue();
315     }
316 
SetName(const BASE_NS::string & name)317     void SetName(const BASE_NS::string& name) override
318     {
319         Name()->SetValue(name);
320         Invoke<IOnChanged>(OnChanged());
321     }
322 
SetProperty(const IProperty::ConstWeakPtr & p)323     void SetProperty(const IProperty::ConstWeakPtr& p) override
324     {
325         owningProp_ = p;
326     }
327 
GetProperty() const328     IProperty::ConstWeakPtr GetProperty() const override
329     {
330         return owningProp_;
331     }
332 
333 private:
334     IObject::WeakPtr parent_;
335     IProperty::ConstWeakPtr owningProp_;
336 };
337 
338 class TestContainerFwd
339     : public IntroduceInterfaces<CommonObjectContainerFwd, ITestContainer, IContainable, IMutableContainable> {
340     META_OBJECT_NO_CLASSINFO(TestContainerFwd, IntroduceInterfaces)
341 public:
342     META_BEGIN_STATIC_DATA()
META_STATIC_PROPERTY_DATA(ITestContainer,string,Name)343     META_STATIC_PROPERTY_DATA(ITestContainer, string, Name)
344     META_STATIC_FUNCTION_DATA(ITestContainer, Increment)
345     META_END_STATIC_DATA()
346 
347     META_IMPLEMENT_PROPERTY(string, Name)
348 
349     IObject::Ptr GetParent() const override
350     {
351         return parent_.lock();
352     }
SetParent(const IObject::Ptr & parent)353     void SetParent(const IObject::Ptr& parent) override
354     {
355         parent_ = parent;
356     }
GetName() const357     BASE_NS::string GetName() const override
358     {
359         return this->Name()->GetValue().empty() ? Super::GetName() : this->Name()->GetValue();
360     }
361 
SetName(const BASE_NS::string & name)362     void SetName(const BASE_NS::string& name) override
363     {
364         META_ACCESS_PROPERTY(Name)->SetValue(name);
365     }
366 
Increment()367     void Increment() override
368     {
369         ++increment_;
370     }
GetIncrement() const371     int GetIncrement() const override
372     {
373         return increment_;
374     }
375 
376 private:
377     IObject::WeakPtr parent_;
378     int increment_ {};
379 };
380 
381 class TestContainer : public TestContainerFwd {
382     META_OBJECT(TestContainer, ClassId::TestContainer, TestContainerFwd, ClassId::ObjectContainer)
383 };
384 
385 class TestFlatContainer : public TestContainerFwd {
386     META_OBJECT(TestFlatContainer, ClassId::TestFlatContainer, TestContainerFwd, ClassId::ObjectFlatContainer)
387 };
388 
389 class TestString : public IntroduceInterfaces<ObjectFwd, ITestString, IAny, IValue, INotifyOnChange> {
390     META_OBJECT(TestString, ClassId::TestString, IntroduceInterfaces)
391 
392 public:
393     META_BEGIN_STATIC_DATA()
META_STATIC_EVENT_DATA(IEvent,IOnChanged,OnChanged)394     META_STATIC_EVENT_DATA(IEvent, IOnChanged, OnChanged)
395     META_END_STATIC_DATA()
396 
397     META_IMPLEMENT_EVENT(IOnChanged, OnChanged)
398 
399     TestString(BASE_NS::string s = "") : str_(s) {}
400 
GetString() const401     BASE_NS::string GetString() const override
402     {
403         return str_;
404     }
SetString(BASE_NS::string s)405     void SetString(BASE_NS::string s) override
406     {
407         str_ = s;
408         Invoke<IOnChanged>(OnChanged());
409     }
410 
411     static constexpr TypeId TYPE_ID = UidFromType<ITestString::Ptr>();
412 
413     // virtual ObjectId GetClassId() const;
GetCompatibleTypes(CompatibilityDirection) const414     const BASE_NS::array_view<const TypeId> GetCompatibleTypes(CompatibilityDirection) const override
415     {
416         static const TypeId arr[] = { TYPE_ID, UidFromType<BASE_NS::string>() };
417         return arr;
418     }
GetData(const TypeId & id,void * data,size_t size) const419     AnyReturnValue GetData(const TypeId& id, void* data, size_t size) const override
420     {
421         if (id == TYPE_ID) {
422             *static_cast<ITestString::Ptr*>(data) = GetSelf<ITestString>();
423             return AnyReturn::SUCCESS;
424         }
425         if (id == UidFromType<BASE_NS::string>()) {
426             *static_cast<BASE_NS::string*>(data) = str_;
427             return AnyReturn::SUCCESS;
428         }
429         return AnyReturn::INCOMPATIBLE_TYPE;
430     }
SetData(const TypeId & id,const void * data,size_t size)431     AnyReturnValue SetData(const TypeId& id, const void* data, size_t size) override
432     {
433         if (id == TYPE_ID) {
434             str_ = (*static_cast<const ITestString::Ptr*>(data))->GetString();
435             return AnyReturn::SUCCESS;
436         }
437         if (id == UidFromType<BASE_NS::string>()) {
438             str_ = *static_cast<const BASE_NS::string*>(data);
439             return AnyReturn::SUCCESS;
440         }
441         return AnyReturn::INCOMPATIBLE_TYPE;
442     }
CopyFrom(const IAny & any)443     AnyReturnValue CopyFrom(const IAny& any) override
444     {
445         if (any.GetTypeId() == TYPE_ID) {
446             ITestString::Ptr p;
447             auto ret = any.GetValue(p);
448             if (ret) {
449                 if (p) {
450                     str_ = p->GetString();
451                 } else {
452                     str_ = "";
453                 }
454             }
455             return ret;
456         }
457         return any.GetValue(str_);
458     }
ResetValue()459     AnyReturnValue ResetValue() override
460     {
461         str_.clear();
462         return AnyReturn::SUCCESS;
463     }
Clone(const AnyCloneOptions & options) const464     IAny::Ptr Clone(const AnyCloneOptions& options) const override
465     {
466         if (options.role == TypeIdRole::CURRENT || options.role == TypeIdRole::ITEM) {
467             auto obj = META_NS::GetObjectRegistry().Create<ITestString>(ClassId::TestString);
468             if (obj && options.value == CloneValueType::COPY_VALUE) {
469                 obj->SetString(str_);
470             }
471             return interface_pointer_cast<IAny>(obj);
472         }
473         return nullptr;
474     }
GetTypeId(TypeIdRole role) const475     TypeId GetTypeId(TypeIdRole role) const override
476     {
477         if (role == TypeIdRole::CURRENT || role == TypeIdRole::ITEM) {
478             return TYPE_ID;
479         }
480         return {};
481     }
GetTypeIdString() const482     BASE_NS::string GetTypeIdString() const override
483     {
484         return MetaType<ITestString::Ptr>::name;
485     }
486 
SetValue(const IAny & value)487     AnyReturnValue SetValue(const IAny& value) override
488     {
489         return CopyFrom(value);
490     }
GetValue() const491     const IAny& GetValue() const override
492     {
493         return *this;
494     }
IsCompatible(const TypeId & id) const495     bool IsCompatible(const TypeId& id) const override
496     {
497         return META_NS::IsCompatible(*this, id);
498     }
499 
500 private:
501     BASE_NS::string str_;
502 };
503 
504 class TestPtrValue : public IntroduceInterfaces<ObjectFwd, ITestPtrValue> {
505     META_OBJECT(TestPtrValue, ClassId::TestPtrValue, IntroduceInterfaces)
506 public:
507     META_BEGIN_STATIC_DATA()
508     META_STATIC_PROPERTY_DATA(
509         ITestPtrValue, META_VALUE_PTR(ITestString, ClassId::TestString), Text, BASE_NS::string("Some"))
510     META_STATIC_PROPERTY_DATA(ITestPtrValue, META_VALUE_PTR(ITestString, ClassId::TestString), String)
511     META_END_STATIC_DATA()
512     META_IMPLEMENT_PROPERTY(META_VALUE_PTR(ITestString, ClassId::TestString), Text)
513     META_IMPLEMENT_PROPERTY(META_VALUE_PTR(ITestString, ClassId::TestString), String)
514 };
515 
516 } // namespace
517 
518 class MyTestTypeInterpolator : public META_NS::Interpolator<MyComparableTestType> {
519     META_OBJECT(MyTestTypeInterpolator, ClassId::MyTestTypeInterpolator, Interpolator, ClassId::BaseObject)
520 };
521 
RegisterComparableTestTypeSerialiser()522 static void RegisterComparableTestTypeSerialiser()
523 {
524     RegisterSerializer<MyComparableTestType>(
525         [](auto&, const MyComparableTestType& v) {
526             auto n = GetObjectRegistry().Create<IDoubleNode>(META_NS::ClassId::DoubleNode);
527             if (n) {
528                 n->SetValue(v.i);
529             }
530             return n;
531         },
532         [](auto&, const ISerNode::ConstPtr& node, MyComparableTestType& out) {
533             float v {};
534             if (ExtractNumber(node, v)) {
535                 out.i = v;
536                 return true;
537             }
538             return false;
539         });
540 }
RegisterTestEnumSerialiser()541 static void RegisterTestEnumSerialiser()
542 {
543     RegisterSerializer<TestEnum>(
544         [](auto&, const TestEnum& v) {
545             auto n = GetObjectRegistry().Create<IUIntNode>(META_NS::ClassId::UIntNode);
546             if (n) {
547                 n->SetValue(v);
548             }
549             return n;
550         },
551         [](auto&, const ISerNode::ConstPtr& node, TestEnum& out) {
552             auto v = interface_cast<IUIntNode>(node);
553             if (v) {
554                 out = static_cast<TestEnum>(v->GetValue());
555             }
556             return v != nullptr;
557         });
558 }
RegisterMyTestTypeSerialiser()559 static void RegisterMyTestTypeSerialiser()
560 {
561     RegisterSerializer<MyTestType>(
562         [](auto&, const MyTestType& v) {
563             auto obj = CreateObjectNode(UidFromType<MyTestType>(), "MyTestType");
564             if (obj) {
565                 if (auto n = GetObjectRegistry().Create<IMapNode>(META_NS::ClassId::MapNode)) {
566                     auto in = GetObjectRegistry().Create<IIntNode>(META_NS::ClassId::IntNode);
567                     if (in) {
568                         in->SetValue(v.i);
569                         n->AddNode("value", n);
570                         obj->SetMembers(n);
571                     }
572                 }
573             }
574             return obj;
575         },
576         [](auto&, const ISerNode::ConstPtr& node, MyTestType& out) {
577             if (auto obj = interface_cast<IObjectNode>(node)) {
578                 if (auto m = interface_cast<IMapNode>(obj->GetMembers())) {
579                     auto vnode = m->FindNode("value");
580                     int64_t v {};
581                     if (ExtractNumber(vnode, v)) {
582                         out.i = v;
583                         return true;
584                     }
585                 }
586             }
587             return false;
588         });
589 }
590 
RegisterTestTypes()591 void RegisterTestTypes()
592 {
593     auto& registry = META_NS::GetObjectRegistry();
594     registry.RegisterObjectType(EmbeddedTestType::GetFactory());
595     registry.RegisterObjectType(TestContainer::GetFactory());
596     registry.RegisterObjectType(TestFlatContainer::GetFactory());
597     registry.RegisterObjectType(TestType::GetFactory());
598     registry.RegisterObjectType(MyTestTypeInterpolator::GetFactory());
599     registry.RegisterObjectType(TestAttachment::GetFactory());
600     registry.RegisterObjectType(TestStartable::GetFactory());
601     registry.RegisterObjectType(TestString::GetFactory());
602     registry.RegisterObjectType(TestPtrValue::GetFactory());
603 
604     RegisterTypeForBuiltinAny<MyComparableTestType>();
605     RegisterTypeForBuiltinAny<MyTestType>();
606     RegisterTypeForBuiltinAny<TestEnum>();
607     RegisterTypeForBuiltinAny<IEmbeddedTestType::Ptr>();
608     RegisterTypeForBuiltinAny<ITestType::Ptr>();
609     RegisterTypeForBuiltinAny<ITestType::WeakPtr>();
610 
611     registry.RegisterInterpolator(UidFromType<MyComparableTestType>(), ClassId::MyTestTypeInterpolator.Id().ToUid());
612 
613     RegisterComparableTestTypeSerialiser();
614     RegisterTestEnumSerialiser();
615     RegisterMyTestTypeSerialiser();
616 }
617 
UnregisterTestTypes()618 void UnregisterTestTypes()
619 {
620     auto& registry = META_NS::GetObjectRegistry();
621     UnregisterSerializer<MyTestType>();
622     UnregisterSerializer<TestEnum>();
623     UnregisterSerializer<MyComparableTestType>();
624 
625     registry.UnregisterInterpolator(UidFromType<MyComparableTestType>());
626 
627     UnregisterTypeForBuiltinAny<ITestType::WeakPtr>();
628     UnregisterTypeForBuiltinAny<ITestType::Ptr>();
629     UnregisterTypeForBuiltinAny<IEmbeddedTestType::Ptr>();
630     UnregisterTypeForBuiltinAny<MyComparableTestType>();
631     UnregisterTypeForBuiltinAny<MyTestType>();
632     UnregisterTypeForBuiltinAny<TestEnum>();
633 
634     registry.UnregisterObjectType(TestPtrValue::GetFactory());
635     registry.UnregisterObjectType(TestString::GetFactory());
636     registry.UnregisterObjectType(TestStartable::GetFactory());
637     registry.UnregisterObjectType(TestAttachment::GetFactory());
638     registry.UnregisterObjectType(MyTestTypeInterpolator::GetFactory());
639     registry.UnregisterObjectType(TestType::GetFactory());
640     registry.UnregisterObjectType(TestFlatContainer::GetFactory());
641     registry.UnregisterObjectType(TestContainer::GetFactory());
642     registry.UnregisterObjectType(EmbeddedTestType::GetFactory());
643 }
644 
CreateTestType(const BASE_NS::string_view name)645 ITestType::Ptr CreateTestType(const BASE_NS::string_view name)
646 {
647     const auto object = META_NS::GetObjectRegistry().Create<ITestType>(ClassId::TestType);
648     if (object) {
649         object->SetName(BASE_NS::string(name));
650     }
651     return object;
652 }
653 
CreateTestContainer(const BASE_NS::string_view name,ClassInfo type)654 ITestContainer::Ptr CreateTestContainer(const BASE_NS::string_view name, ClassInfo type)
655 {
656     const auto object = META_NS::GetObjectRegistry().Create<ITestContainer>(type);
657     if (object) {
658         object->SetName(BASE_NS::string(name));
659     }
660     return object;
661 }
662 
CreateTestAttachment(const BASE_NS::string_view name)663 ITestAttachment::Ptr CreateTestAttachment(const BASE_NS::string_view name)
664 {
665     const auto object = META_NS::GetObjectRegistry().Create<ITestAttachment>(ClassId::TestAttachment);
666     if (object) {
667         object->SetName(BASE_NS::string(name));
668     }
669     return object;
670 }
671 
CreateTestStartable(const BASE_NS::string_view name,META_NS::StartBehavior behavior)672 ITestStartable::Ptr CreateTestStartable(const BASE_NS::string_view name, META_NS::StartBehavior behavior)
673 {
674     const auto object = META_NS::GetObjectRegistry().Create<ITestStartable>(ClassId::TestStartable);
675     if (object) {
676         object->SetName(BASE_NS::string(name));
677     }
678     SetValue(interface_pointer_cast<IStartable>(object)->StartableMode(), behavior);
679     return object;
680 }
681 
operator <<(std::ostream & os,const META_NS::ITestStartable::Operation & op)682 std::ostream& operator<<(std::ostream& os, const META_NS::ITestStartable::Operation& op)
683 {
684     switch (op) {
685         case ITestStartable::Operation::START:
686             return os << "Operation::START";
687         case ITestStartable::Operation::STOP:
688             return os << "Operation::STOP";
689         case ITestStartable::Operation::ATTACH:
690             return os << "Operation::ATTACH";
691         case ITestStartable::Operation::DETACH:
692             return os << "Operation::DETACH";
693         case ITestStartable::Operation::TICK:
694             return os << "Operation::TICK";
695     }
696     return os;
697 }
698 
699 META_END_NAMESPACE()
700