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