(Properties) Ensure TypeInfo is set when creating Type via TypeInfo
[platform/core/uifw/dali-core.git] / automated-tests / src / dali-unmanaged / utc-Dali-TypeRegistry.cpp
1 //
2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
3 //
4 // Licensed under the Flora License, Version 1.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //     http://floralicense.org/license/
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an AS IS BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16
17 #include <iostream>
18 #include <stdlib.h>
19 #include <dali/dali.h>
20 #include <dali/public-api/dali-core.h>
21 #include <dali-test-suite-utils.h>
22 #include <dali/integration-api/events/long-press-gesture-event.h>
23 #include <dali/integration-api/events/pan-gesture-event.h>
24 #include <dali/integration-api/events/pinch-gesture-event.h>
25 #include <dali/integration-api/events/tap-gesture-event.h>
26 #include <dali/integration-api/events/touch-event-integ.h>
27
28 using namespace Dali;
29
30
31 namespace
32 {
33
34 // Stores data that is populated in the callback and will be read by the Test cases
35 struct SignalData
36 {
37   SignalData()
38   : functorCalled( false ),
39     voidFunctorCalled( false ),
40     receivedGesture( Gesture::Clear ),
41     pressedActor()
42   {}
43
44   void Reset()
45   {
46     functorCalled = false;
47     voidFunctorCalled = false;
48
49     receivedGesture.numberOfTouches = 0u;
50     receivedGesture.screenPoint = Vector2(0.0f, 0.0f);
51     receivedGesture.localPoint = Vector2(0.0f, 0.0f);
52
53     pressedActor = NULL;
54   }
55
56   bool functorCalled;
57   bool voidFunctorCalled;
58   LongPressGesture receivedGesture;
59   Actor pressedActor;
60 };
61
62 // Functor that sets the data when called
63 struct GestureReceivedFunctor
64 {
65   GestureReceivedFunctor(SignalData& data) : signalData(data) { }
66
67   void operator()(Actor actor, LongPressGesture longPress)
68   {
69     signalData.functorCalled = true;
70     signalData.receivedGesture = longPress;
71     signalData.pressedActor = actor;
72   }
73
74   void operator()()
75   {
76     signalData.voidFunctorCalled = true;
77   }
78
79   SignalData& signalData;
80 };
81
82 // Generate a LongPressGestureEvent to send to Core
83 Integration::LongPressGestureEvent GenerateLongPress(
84     Gesture::State state,
85     unsigned int numberOfTouches,
86     Vector2 point)
87 {
88   Integration::LongPressGestureEvent longPress( state );
89
90   longPress.numberOfTouches = numberOfTouches;
91   longPress.point = point;
92
93   return longPress;
94 }
95
96 // Generate a PanGestureEvent to send to Core
97 Integration::PanGestureEvent GeneratePan(
98     Gesture::State state,
99     Vector2 previousPosition,
100     Vector2 currentPosition,
101     unsigned long timeDelta,
102     unsigned int numberOfTouches = 1,
103     unsigned int time = 1u)
104 {
105   Integration::PanGestureEvent pan(state);
106
107   pan.previousPosition = previousPosition;
108   pan.currentPosition = currentPosition;
109   pan.timeDelta = timeDelta;
110   pan.numberOfTouches = numberOfTouches;
111   pan.time = time;
112
113   return pan;
114 }
115 // Generate a PinchGestureEvent to send to Core
116 Integration::PinchGestureEvent GeneratePinch(
117     Gesture::State state,
118     float scale,
119     float speed,
120     Vector2 centerpoint)
121 {
122   Integration::PinchGestureEvent pinch(state);
123
124   pinch.scale = scale;
125   pinch.speed = speed;
126   pinch.centerPoint = centerpoint;
127
128   return pinch;
129 }
130 // Generate a TapGestureEvent to send to Core
131 Integration::TapGestureEvent GenerateTap(
132     Gesture::State state,
133     unsigned int numberOfTaps,
134     unsigned int numberOfTouches,
135     Vector2 point)
136 {
137   Integration::TapGestureEvent tap( state );
138
139   tap.numberOfTaps = numberOfTaps;
140   tap.numberOfTouches = numberOfTouches;
141   tap.point = point;
142
143   return tap;
144 }
145
146 //
147 // Create function as Init function called
148 //
149 static bool CreateCustomInitCalled = false;
150 BaseHandle CreateCustomInit(void)
151 {
152   CreateCustomInitCalled = true;
153   return BaseHandle();
154 }
155
156 static bool CreateCustomNamedInitCalled = false;
157 BaseHandle CreateCustomNamedInit(void)
158 {
159   CreateCustomNamedInitCalled = true;
160   return BaseHandle();
161 }
162
163 const std::string scriptedName("PopupStyle");
164 static TypeRegistration scriptedType( scriptedName, typeid(Dali::CustomActor), CreateCustomNamedInit );
165
166 // Property Registration
167 bool setPropertyCalled = false;
168 bool getPropertyCalled = false;
169 void SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value )
170 {
171   setPropertyCalled = true;
172 }
173 Property::Value GetProperty( BaseObject* object, Property::Index propertyIndex )
174 {
175   getPropertyCalled = true;
176   return Property::Value( true );
177 }
178
179
180
181 /*******************************************************************************
182  *
183  * Custom Actor
184  *
185  ******************************************************************************/
186 namespace Impl
187 {
188 struct MyTestCustomActor : public CustomActorImpl
189 {
190   typedef SignalV2< void ()> SignalType;
191   typedef SignalV2< void (float)> SignalTypeFloat;
192
193   MyTestCustomActor() : CustomActorImpl( true ) // requires touch
194   { }
195
196   virtual ~MyTestCustomActor()
197   { }
198
199   void ResetCallStack()
200   {
201   }
202
203   // From CustomActorImpl
204   virtual void OnStageConnection()
205   {
206   }
207   virtual void OnStageDisconnection()
208   {
209   }
210   virtual void OnChildAdd(Actor& child)
211   {
212   }
213   virtual void OnChildRemove(Actor& child)
214   {
215   }
216   virtual void OnSizeSet(const Vector3& targetSize)
217   {
218   }
219   virtual void OnSizeAnimation(Animation& animation, const Vector3& targetSize)
220   {
221   }
222   virtual bool OnTouchEvent(const TouchEvent& event)
223   {
224     return true;
225   }
226   virtual bool OnMouseWheelEvent(const MouseWheelEvent& event)
227   {
228     return true;
229   }
230   virtual bool OnKeyEvent(const KeyEvent& event)
231   {
232     return true;
233   }
234   virtual void OnKeyInputFocusGained()
235   {
236   }
237   virtual void OnKeyInputFocusLost()
238   {
239   }
240   virtual Actor GetChildByAlias(const std::string& actorAlias)
241   {
242     return Actor::New();
243   }
244
245 public:
246
247   SignalType mSignal;
248 };
249
250 }; // namespace Impl
251
252 class MyTestCustomActor : public CustomActor
253 {
254 public:
255
256   typedef SignalV2< void ()> SignalType;
257   typedef SignalV2< void (float)> SignalTypeFloat;
258
259   MyTestCustomActor()
260   {
261   }
262
263   static MyTestCustomActor New()
264   {
265     Impl::MyTestCustomActor* p = new Impl::MyTestCustomActor;
266     return MyTestCustomActor( *p ); // takes ownership
267   }
268
269   virtual ~MyTestCustomActor()
270   {
271   }
272
273   static MyTestCustomActor DownCast( BaseHandle handle )
274   {
275     MyTestCustomActor result;
276
277     CustomActor custom = Dali::CustomActor::DownCast( handle );
278     if ( custom )
279     {
280       CustomActorImpl& customImpl = custom.GetImplementation();
281
282       Impl::MyTestCustomActor* impl = dynamic_cast<Impl::MyTestCustomActor*>(&customImpl);
283
284       if (impl)
285       {
286         result = MyTestCustomActor(customImpl.GetOwner());
287       }
288     }
289
290     return result;
291   }
292
293   SignalType& GetCustomSignal()
294   {
295     Dali::RefObject& obj = GetImplementation();
296     return static_cast<Impl::MyTestCustomActor&>( obj ).mSignal;
297   }
298
299 private:
300
301   MyTestCustomActor(Internal::CustomActor* internal)
302   : CustomActor(internal)
303   {
304   }
305
306   MyTestCustomActor( Impl::MyTestCustomActor& impl )
307   : CustomActor( impl )
308   {
309   }
310 };
311
312
313 class MyTestCustomActor2 : public CustomActor
314 {
315 public:
316
317   MyTestCustomActor2()
318   {
319   }
320
321   static MyTestCustomActor2 New()
322   {
323     return MyTestCustomActor2(); // takes ownership
324   }
325
326   virtual ~MyTestCustomActor2()
327   {
328   }
329
330   static MyTestCustomActor2 DownCast( BaseHandle handle )
331   {
332     MyTestCustomActor2 result;
333
334     CustomActor custom = Dali::CustomActor::DownCast( handle );
335     if ( custom )
336     {
337       CustomActorImpl& customImpl = custom.GetImplementation();
338
339       Impl::MyTestCustomActor* impl = dynamic_cast<Impl::MyTestCustomActor*>(&customImpl);
340
341       if (impl)
342       {
343         result = MyTestCustomActor2(customImpl.GetOwner());
344       }
345     }
346
347     return result;
348   }
349
350 private:
351
352   MyTestCustomActor2(Internal::CustomActor* internal)
353   : CustomActor(internal)
354   {
355   }
356
357   MyTestCustomActor2( Impl::MyTestCustomActor& impl )
358   : CustomActor( impl )
359   {
360   }
361 };
362
363 static TypeRegistration customTypeInit( typeid(MyTestCustomActor2), typeid(Dali::CustomActor), CreateCustomInit, true );
364
365
366 BaseHandle CreateCustom(void)
367 {
368   return MyTestCustomActor::New();
369 }
370
371 static std::string lastSignalConnectionCustom;
372
373 bool DoConnectSignalCustom( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
374 {
375   lastSignalConnectionCustom = signalName;
376
377   bool connected( true );
378
379   Dali::BaseHandle handle(object);
380   MyTestCustomActor customActor = MyTestCustomActor::DownCast(handle);
381
382   if( "sig1" == signalName )
383   {
384     customActor.GetCustomSignal().Connect( tracker, functor );
385   }
386   else
387   {
388     // signalName does not match any signal
389     connected = false;
390   }
391
392   return connected;
393 }
394
395 bool DoConnectSignalCustomFailure( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
396 {
397   lastSignalConnectionCustom = "failed";
398
399   return false; // This is supposed to fail
400 }
401
402 struct CustomTestFunctor
403 {
404   CustomTestFunctor()
405   {
406     ++mTotalInstanceCount;
407     ++mCurrentInstanceCount;
408   }
409
410   CustomTestFunctor( const CustomTestFunctor& copyMe )
411   {
412     ++mTotalInstanceCount;
413     ++mCurrentInstanceCount;
414   }
415
416   ~CustomTestFunctor()
417   {
418     --mCurrentInstanceCount;
419   }
420
421   void operator()()
422   {
423     ++mCallbackCount;
424   }
425
426   static int mTotalInstanceCount;
427   static int mCurrentInstanceCount;
428   static int mCallbackCount;
429 };
430
431 int CustomTestFunctor::mTotalInstanceCount = 0;
432 int CustomTestFunctor::mCurrentInstanceCount = 0;
433 int CustomTestFunctor::mCallbackCount = 0;
434
435 static void ResetFunctorCounts()
436 {
437   CustomTestFunctor::mTotalInstanceCount   = 0;
438   CustomTestFunctor::mCurrentInstanceCount = 0;
439   CustomTestFunctor::mCallbackCount        = 0;
440 }
441
442 static std::string lastActionCustom;
443 bool DoActionCustom(BaseObject* object, const std::string& actionName, const std::vector<Property::Value>& attributes)
444 {
445   lastActionCustom = actionName;
446   return true;
447 }
448
449 // Custom type registration
450 static TypeRegistration customType1( typeid(MyTestCustomActor), typeid(Dali::CustomActor), CreateCustom );
451
452 // Custom signals
453 static SignalConnectorType customSignalConnector1( customType1, "sig1", DoConnectSignalCustom );
454 static SignalConnectorType customSignalConnector2( customType1, "sig2", DoConnectSignalCustomFailure );
455 static const int TEST_SIGNAL_COUNT = 2;
456
457 // Custom actions
458 static TypeAction customAction1( customType1, "act1", DoActionCustom);
459 static const int TEST_ACTION_COUNT = 1;
460
461 class TestConnectionTracker : public ConnectionTracker
462 {
463 public:
464
465   TestConnectionTracker()
466   {
467   }
468 };
469
470 BaseHandle CreateNamedActorType()
471 {
472   Actor actor = Actor::New();
473   actor.SetName( "NamedActor" );
474   return actor;
475 }
476
477 TypeRegistration namedActorType( "MyNamedActor", typeid(Dali::Actor), CreateNamedActorType );
478 PropertyRegistration namedActorPropertyOne( namedActorType, "prop-name", PROPERTY_REGISTRATION_START_INDEX, Property::BOOLEAN, &SetProperty, &GetProperty );
479
480 } // Anonymous namespace
481
482
483 // Positive test case for a method
484 int UtcDaliTypeRegistryCreateDaliObjects(void)
485 {
486   TestApplication application;
487
488   TypeRegistry registry; // like this for ctor test coverage
489   registry = TypeRegistry::Get();
490
491   TypeInfo type;
492
493   type = registry.GetTypeInfo( "ImageActor" );
494   DALI_TEST_CHECK( type );
495   DALI_TEST_CHECK( type.GetCreator() );
496   DALI_TEST_CHECK( ImageActor::DownCast( type.GetCreator()() ) );
497   ImageActor ia = ImageActor::DownCast(type.CreateInstance());
498   DALI_TEST_CHECK( ia );
499   Stage::GetCurrent().Add( ia );
500   application.Render();
501
502   type = registry.GetTypeInfo( "TextActor" );
503   DALI_TEST_CHECK( type );
504   TextActor ta = TextActor::DownCast(type.CreateInstance());
505   DALI_TEST_CHECK( ta );
506   Stage::GetCurrent().Add( ta );
507   application.Render();
508
509   type = registry.GetTypeInfo( "CameraActor" );
510   DALI_TEST_CHECK( type );
511   CameraActor ca = CameraActor::DownCast(type.CreateInstance());
512   DALI_TEST_CHECK( ca );
513   Stage::GetCurrent().Add( ca );
514   application.Render();
515
516   type = registry.GetTypeInfo( "LightActor" );
517   DALI_TEST_CHECK( type );
518   LightActor la = LightActor::DownCast(type.CreateInstance());
519   DALI_TEST_CHECK( la );
520   Stage::GetCurrent().Add( la );
521   application.Render();
522
523   // animations
524   type = registry.GetTypeInfo( "Animation" );
525   DALI_TEST_CHECK( type );
526   Animation an = Animation::DownCast(type.CreateInstance());
527   DALI_TEST_CHECK( an );
528   an.Play();
529   application.Render();
530
531   //
532   type = registry.GetTypeInfo( "ShaderEffect" );
533   DALI_TEST_CHECK( type );
534   ShaderEffect ef = ShaderEffect::DownCast(type.CreateInstance());
535   DALI_TEST_CHECK( ef );
536   application.Render();
537
538   END_TEST;
539 }
540
541 /*******************************************************************************
542  *
543  * Action through the base handle
544  *
545  ******************************************************************************/
546 int UtcDaliTypeRegistryActionViaBaseHandle(void)
547 {
548   TestApplication application;
549
550   TypeInfo type;
551
552   type = TypeRegistry::Get().GetTypeInfo( "Actor" );
553   DALI_TEST_CHECK( type );
554
555   BaseHandle hdl = type.CreateInstance();
556   DALI_TEST_CHECK( hdl );
557
558   Actor a = Actor::DownCast(hdl);
559   DALI_TEST_CHECK( a );
560
561   a.SetVisible(false);
562
563   application.SendNotification();
564   application.Render(0);
565   DALI_TEST_CHECK(!a.IsVisible());
566
567   std::vector<Property::Value> attributes;
568
569   DALI_TEST_CHECK(hdl.DoAction(Actor::ACTION_SHOW, attributes));
570
571   application.SendNotification();
572   application.Render(0);
573   DALI_TEST_CHECK(a.IsVisible());
574
575   DALI_TEST_CHECK(!hdl.DoAction("unknown-action", attributes));
576   END_TEST;
577 }
578
579 int UtcDaliTypeRegistryNames(void)
580 {
581   TestApplication application;
582
583   TypeInfo type;
584
585   TypeRegistry::NameContainer names = TypeRegistry::Get().GetTypeNames();
586
587   for(TypeRegistry::NameContainer::iterator iter = names.begin();
588       iter != names.end(); ++iter)
589   {
590     type = TypeRegistry::Get().GetTypeInfo( *iter );
591     DALI_TEST_CHECK( type );
592   }
593
594   END_TEST;
595 }
596
597 // Check named and typeid are equivalent
598 int UtcDaliTypeRegistryNameEquivalence(void)
599 {
600   TypeInfo named_type = TypeRegistry::Get().GetTypeInfo( "TextActor" );
601   TypeInfo typeinfo_type = TypeRegistry::Get().GetTypeInfo( typeid(Dali::TextActor) );
602
603   DALI_TEST_CHECK( named_type );
604   DALI_TEST_CHECK( typeinfo_type );
605
606   DALI_TEST_CHECK( named_type == typeinfo_type );
607
608   DALI_TEST_CHECK( named_type.GetName() == typeinfo_type.GetName() );
609   DALI_TEST_CHECK( named_type.GetBaseName() == typeinfo_type.GetBaseName() );
610
611   END_TEST;
612 }
613
614
615 int UtcDaliTypeRegistryCustomActor(void)
616 {
617   ResetFunctorCounts();
618
619   TestApplication application;
620
621   TypeInfo type = TypeRegistry::Get().GetTypeInfo( "MyTestCustomActor" );
622   DALI_TEST_CHECK( type );
623
624   TypeInfo baseType = TypeRegistry::Get().GetTypeInfo( "CustomActor" );
625   DALI_TEST_CHECK( baseType );
626
627   BaseHandle handle = type.CreateInstance();
628   DALI_TEST_CHECK( handle );
629
630   MyTestCustomActor customHandle = MyTestCustomActor::DownCast( handle );
631   DALI_TEST_CHECK( customHandle );
632
633   DALI_TEST_EQUALS( type.GetActions().size(), TEST_ACTION_COUNT + baseType.GetActions().size(), TEST_LOCATION );
634   DALI_TEST_EQUALS( type.GetSignals().size(), TEST_SIGNAL_COUNT + baseType.GetSignals().size(), TEST_LOCATION );
635
636   {
637     TestConnectionTracker tracker;
638
639     bool connected = handle.ConnectSignal( &tracker, "sig1", CustomTestFunctor() );
640     DALI_TEST_EQUALS( connected, true, TEST_LOCATION );
641     DALI_TEST_CHECK( lastSignalConnectionCustom == "sig1" );
642     DALI_TEST_EQUALS( CustomTestFunctor::mTotalInstanceCount, 2/*temporary copy + FunctorDelegate copy*/, TEST_LOCATION );
643     DALI_TEST_EQUALS( CustomTestFunctor::mCurrentInstanceCount, 1, TEST_LOCATION );
644
645     DALI_TEST_EQUALS( CustomTestFunctor::mCallbackCount, 0, TEST_LOCATION );
646     customHandle.GetCustomSignal().Emit();
647     DALI_TEST_EQUALS( CustomTestFunctor::mCallbackCount, 1, TEST_LOCATION );
648     DALI_TEST_EQUALS( CustomTestFunctor::mTotalInstanceCount, 2/*temporary copy + FunctorDelegate copy*/, TEST_LOCATION );
649     DALI_TEST_EQUALS( CustomTestFunctor::mCurrentInstanceCount, 1, TEST_LOCATION );
650   }
651   // tracker should automatically disconnect here
652   DALI_TEST_EQUALS( CustomTestFunctor::mTotalInstanceCount, 2/*temporary copy + FunctorDelegate copy*/, TEST_LOCATION );
653   DALI_TEST_EQUALS( CustomTestFunctor::mCurrentInstanceCount, 0, TEST_LOCATION );
654
655   // Test that functor is disconnected
656   DALI_TEST_EQUALS( CustomTestFunctor::mCallbackCount, 1, TEST_LOCATION );
657   customHandle.GetCustomSignal().Emit();
658   DALI_TEST_EQUALS( CustomTestFunctor::mCallbackCount, 1/*not incremented*/, TEST_LOCATION );
659   DALI_TEST_EQUALS( CustomTestFunctor::mTotalInstanceCount, 2/*temporary copy + FunctorDelegate copy*/, TEST_LOCATION );
660   DALI_TEST_EQUALS( CustomTestFunctor::mCurrentInstanceCount, 0, TEST_LOCATION );
661
662   std::vector<Property::Value> attributes;
663   handle.DoAction("act1", attributes);
664   DALI_TEST_CHECK( lastActionCustom == "act1" );
665   END_TEST;
666 }
667
668 int UtcDaliTypeRegistryCustomSignalFailure(void)
669 {
670   // Test what happens when signal connnector (DoConnectSignalFailure method) returns false
671
672   ResetFunctorCounts();
673
674   TestApplication application;
675
676   TypeInfo type = TypeRegistry::Get().GetTypeInfo( "MyTestCustomActor" );
677   DALI_TEST_CHECK( type );
678
679   TypeInfo baseType = TypeRegistry::Get().GetTypeInfo( "CustomActor" );
680   DALI_TEST_CHECK( baseType );
681
682   BaseHandle handle = type.CreateInstance();
683   DALI_TEST_CHECK( handle );
684
685   MyTestCustomActor customHandle = MyTestCustomActor::DownCast( handle );
686   DALI_TEST_CHECK( customHandle );
687
688   DALI_TEST_EQUALS( type.GetActions().size(), TEST_ACTION_COUNT + baseType.GetActions().size(), TEST_LOCATION );
689   DALI_TEST_EQUALS( type.GetSignals().size(), TEST_SIGNAL_COUNT + baseType.GetSignals().size(), TEST_LOCATION );
690
691   {
692     TestConnectionTracker tracker;
693
694     bool connected = handle.ConnectSignal( &tracker, "sig2", CustomTestFunctor() );
695     DALI_TEST_EQUALS( connected, false/*This is supposed to fail*/, TEST_LOCATION );
696     DALI_TEST_CHECK( lastSignalConnectionCustom == "failed" );
697     DALI_TEST_EQUALS( CustomTestFunctor::mTotalInstanceCount, 2/*temporary copy + FunctorDelegate copy*/, TEST_LOCATION );
698     DALI_TEST_EQUALS( CustomTestFunctor::mCurrentInstanceCount, 0/*deleted along with FunctorDelegate*/, TEST_LOCATION );
699
700     // Should be a NOOP
701     DALI_TEST_EQUALS( CustomTestFunctor::mCallbackCount, 0, TEST_LOCATION );
702     customHandle.GetCustomSignal().Emit();
703     DALI_TEST_EQUALS( CustomTestFunctor::mCallbackCount, 0/*never called*/, TEST_LOCATION );
704   }
705   // tracker should have nothing to disconnect here
706
707   // Should be a NOOP
708   DALI_TEST_EQUALS( CustomTestFunctor::mCallbackCount, 0, TEST_LOCATION );
709   customHandle.GetCustomSignal().Emit();
710   DALI_TEST_EQUALS( CustomTestFunctor::mCallbackCount, 0/*never called*/, TEST_LOCATION );
711   END_TEST;
712 }
713
714
715
716 int UtcDaliTypeRegistryInitFunctions(void)
717 {
718   TestApplication application;
719
720   DALI_TEST_CHECK( "MyTestCustomActor2" == customTypeInit.RegisteredName() );
721
722   DALI_TEST_CHECK( true == CreateCustomInitCalled );
723   TypeInfo type = TypeRegistry::Get().GetTypeInfo( "MyTestCustomActor2" );
724   DALI_TEST_CHECK( type );
725   END_TEST;
726 }
727
728
729
730
731 int UtcDaliTypeRegistryNameInitFunctions(void)
732 {
733   TestApplication application;
734
735   DALI_TEST_CHECK( scriptedName == scriptedType.RegisteredName() );
736
737   TypeInfo baseType = TypeRegistry::Get().GetTypeInfo( scriptedName );
738   DALI_TEST_CHECK( baseType );
739
740   BaseHandle handle = baseType.CreateInstance();
741
742   DALI_TEST_CHECK( true == CreateCustomNamedInitCalled );
743   TypeInfo type = TypeRegistry::Get().GetTypeInfo( scriptedName );
744   DALI_TEST_CHECK( type );
745   END_TEST;
746 }
747
748
749 int UtcDaliPropertyRegistration(void)
750 {
751   TestApplication application;
752   TypeRegistry typeRegistry = TypeRegistry::Get();
753
754   // Check property count before property registration
755   TypeInfo typeInfo = typeRegistry.GetTypeInfo( typeid(MyTestCustomActor) );
756   DALI_TEST_CHECK( typeInfo );
757   BaseHandle handle = typeInfo.CreateInstance();
758   DALI_TEST_CHECK( handle );
759   Actor customActor = Actor::DownCast( handle );
760   DALI_TEST_CHECK( customActor );
761   unsigned int initialPropertyCount( customActor.GetPropertyCount() );
762
763   std::string propertyName( "prop-1" );
764   int propertyIndex( PROPERTY_REGISTRATION_START_INDEX );
765   Property::Type propertyType( Property::BOOLEAN );
766   PropertyRegistration property1( customType1, propertyName, propertyIndex, propertyType, &SetProperty, &GetProperty );
767
768   // Check property count after registration
769   unsigned int postRegistrationPropertyCount( customActor.GetPropertyCount() );
770   DALI_TEST_EQUALS( initialPropertyCount + 1u, postRegistrationPropertyCount, TEST_LOCATION );
771
772   // Add custom property and check property count
773   customActor.RegisterProperty( "custom-prop-1", true );
774   unsigned int customPropertyCount( customActor.GetPropertyCount() );
775   DALI_TEST_EQUALS( postRegistrationPropertyCount + 1u, customPropertyCount, TEST_LOCATION );
776
777   // Set the property, ensure SetProperty called
778   DALI_TEST_CHECK( !setPropertyCalled );
779   customActor.SetProperty( propertyIndex, false );
780   DALI_TEST_CHECK( setPropertyCalled );
781
782   // Get the property, ensure GetProperty called
783   DALI_TEST_CHECK( !getPropertyCalled );
784   (void)customActor.GetProperty< bool >( propertyIndex );
785   DALI_TEST_CHECK( getPropertyCalled );
786
787   // Check the property name
788   DALI_TEST_EQUALS( customActor.GetPropertyName( propertyIndex ), propertyName, TEST_LOCATION );
789   DALI_TEST_EQUALS( typeInfo.GetPropertyName( propertyIndex ), propertyName, TEST_LOCATION );
790
791   // Check the property index
792   DALI_TEST_EQUALS( customActor.GetPropertyIndex( propertyName ), propertyIndex, TEST_LOCATION );
793
794   // Check the property type
795   DALI_TEST_EQUALS( customActor.GetPropertyType( propertyIndex ), propertyType, TEST_LOCATION );
796
797   // Check property count of type-info is 1
798   Property::IndexContainer indices;
799   typeInfo.GetPropertyIndices( indices );
800   DALI_TEST_EQUALS( indices.size(), 1u, TEST_LOCATION );
801
802   // Ensure indices returned from actor and customActor differ by two
803   Actor actor = Actor::New();
804   actor.GetPropertyIndices( indices );
805   unsigned int actorIndices = indices.size();
806   customActor.GetPropertyIndices( indices );
807   unsigned int customActorIndices = indices.size();
808   DALI_TEST_EQUALS( actorIndices + 2u, customActorIndices, TEST_LOCATION ); // Custom property + registered property
809   END_TEST;
810 }
811
812 int UtcDaliPropertyRegistrationIndexOutOfBounds(void)
813 {
814   TestApplication application;
815   TypeRegistry typeRegistry = TypeRegistry::Get();
816
817   // Attempt to register a property type out-of-bounds index (less than)
818   try
819   {
820     PropertyRegistration property1( customType1, "prop-name", PROPERTY_REGISTRATION_START_INDEX - 1, Property::BOOLEAN, &SetProperty, &GetProperty );
821     tet_result( TET_FAIL );
822   }
823   catch ( DaliException& e )
824   {
825     DALI_TEST_ASSERT( e, "( index >= PROPERTY_REGISTRATION_START_INDEX ) && ( index <= PROPERTY_REGISTRATION_MAX_INDEX )", TEST_LOCATION );
826   }
827
828   // Attempt to register a property type out-of-bounds index (greater than)
829   try
830   {
831     PropertyRegistration property1( customType1, "prop-name", PROPERTY_REGISTRATION_MAX_INDEX + 1, Property::BOOLEAN, &SetProperty, &GetProperty );
832     tet_result( TET_FAIL );
833   }
834   catch ( DaliException& e )
835   {
836     DALI_TEST_ASSERT( e, "( index >= PROPERTY_REGISTRATION_START_INDEX ) && ( index <= PROPERTY_REGISTRATION_MAX_INDEX )", TEST_LOCATION );
837   }
838   END_TEST;
839 }
840
841 int UtcDaliPropertyRegistrationFunctions(void)
842 {
843   TestApplication application;
844   int propertyIndex = PROPERTY_REGISTRATION_START_INDEX + 10;
845
846   // Attempt to register a property without a setter
847   try
848   {
849     PropertyRegistration property1( customType1, "prop-name", propertyIndex++, Property::BOOLEAN, NULL, &GetProperty );
850     tet_result( TET_PASS );
851   }
852   catch ( DaliException& e )
853   {
854     tet_result( TET_FAIL );
855   }
856
857   // Attempt to register a property without a getter
858   try
859   {
860     PropertyRegistration property1( customType1, "prop-name", propertyIndex++, Property::BOOLEAN, NULL, NULL );
861     tet_result( TET_FAIL );
862   }
863   catch ( DaliException& e )
864   {
865     DALI_TEST_ASSERT( e, "! \"GetProperty", TEST_LOCATION );
866   }
867   END_TEST;
868 }
869
870 int UtcDaliPropertyRegistrationAddSameIndex(void)
871 {
872   TestApplication application;
873   int propertyIndex = PROPERTY_REGISTRATION_START_INDEX + 100;
874
875   // Add one property with a valid property index
876   PropertyRegistration property1( customType1, "prop-name", propertyIndex, Property::BOOLEAN, &SetProperty, &GetProperty );
877
878   // Attempt to add another property with the same index
879   try
880   {
881     PropertyRegistration property2( customType1, "prop-name-2", propertyIndex, Property::BOOLEAN, &SetProperty, &GetProperty );
882   }
883   catch ( DaliException& e )
884   {
885     DALI_TEST_ASSERT( e, "! \"Property index already added", TEST_LOCATION );
886   }
887   END_TEST;
888 }
889
890 int UtcDaliPropertyRegistrationPropertyWritable(void)
891 {
892   TestApplication application;
893   int propertyIndex1 = PROPERTY_REGISTRATION_START_INDEX + 200;
894   int propertyIndex2 = PROPERTY_REGISTRATION_START_INDEX + 201;
895
896   // Add two properties, one with SetProperty, one without
897   PropertyRegistration property1( customType1, "prop-name-readwrite", propertyIndex1, Property::BOOLEAN, &SetProperty, &GetProperty );
898   PropertyRegistration property2( customType1, "prop-name-readonly",  propertyIndex2, Property::BOOLEAN, NULL, &GetProperty );
899
900   // Create custom-actor
901   TypeInfo typeInfo = TypeRegistry::Get().GetTypeInfo( typeid(MyTestCustomActor) );
902   DALI_TEST_CHECK( typeInfo );
903   BaseHandle handle = typeInfo.CreateInstance();
904   DALI_TEST_CHECK( handle );
905   Actor customActor = Actor::DownCast( handle );
906   DALI_TEST_CHECK( customActor );
907
908   // Check whether properties are writable
909   DALI_TEST_CHECK(   customActor.IsPropertyWritable( propertyIndex1 ) );
910   DALI_TEST_CHECK( ! customActor.IsPropertyWritable( propertyIndex2 ) );
911   END_TEST;
912 }
913
914 int UtcDaliPropertyRegistrationPropertyAnimatable(void)
915 {
916   TestApplication application;
917   int propertyIndex = PROPERTY_REGISTRATION_START_INDEX + 400;
918
919   // These properties are not animatable
920   PropertyRegistration property1( customType1, "prop-name", propertyIndex, Property::BOOLEAN, &SetProperty, &GetProperty );
921
922   // Create custom-actor
923   TypeInfo typeInfo = TypeRegistry::Get().GetTypeInfo( typeid(MyTestCustomActor) );
924   DALI_TEST_CHECK( typeInfo );
925   BaseHandle handle = typeInfo.CreateInstance();
926   DALI_TEST_CHECK( handle );
927   Actor customActor = Actor::DownCast( handle );
928   DALI_TEST_CHECK( customActor );
929
930   // Check if animatable
931   DALI_TEST_CHECK( ! customActor.IsPropertyAnimatable( propertyIndex ) );
932   END_TEST;
933 }
934
935 int UtcDaliPropertyRegistrationInvalidGetAndSet(void)
936 {
937   TestApplication application;
938   int propertyIndex = PROPERTY_REGISTRATION_START_INDEX + 2000;
939
940   // Create custom-actor
941   TypeInfo typeInfo = TypeRegistry::Get().GetTypeInfo( typeid(MyTestCustomActor) );
942   DALI_TEST_CHECK( typeInfo );
943   BaseHandle handle = typeInfo.CreateInstance();
944   DALI_TEST_CHECK( handle );
945   Actor customActor = Actor::DownCast( handle );
946   DALI_TEST_CHECK( customActor );
947
948   // Try to set an index that hasn't been added
949   try
950   {
951     customActor.SetProperty( propertyIndex, true );
952     tet_result( TET_FAIL );
953   }
954   catch ( DaliException& e )
955   {
956     DALI_TEST_ASSERT( e, "! \"Cannot find property index", TEST_LOCATION );
957   }
958
959   // Try to get an index that hasn't been added
960   try
961   {
962     (void) customActor.GetProperty< bool >( propertyIndex );
963     tet_result( TET_FAIL );
964   }
965   catch ( DaliException& e )
966   {
967     DALI_TEST_ASSERT( e, "! \"Cannot find property index", TEST_LOCATION );
968   }
969   END_TEST;
970 }
971
972
973
974 int UtcDaliLongPressGestureDetectorTypeRegistry(void)
975 {
976   TestApplication application;
977
978   Actor actor = Actor::New();
979   actor.SetSize(100.0f, 100.0f);
980   actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
981   Stage::GetCurrent().Add(actor);
982
983   // Register Type
984   TypeInfo type;
985   type = TypeRegistry::Get().GetTypeInfo( "LongPressGestureDetector" );
986   DALI_TEST_CHECK( type );
987   BaseHandle handle = type.CreateInstance();
988   DALI_TEST_CHECK( handle );
989   LongPressGestureDetector detector = LongPressGestureDetector::DownCast( handle );
990   DALI_TEST_CHECK( detector );
991
992   // Attach actor to detector
993   SignalData data;
994   GestureReceivedFunctor functor( data );
995   detector.Attach(actor);
996
997   // Connect to signal through type
998   handle.ConnectSignal( &application, LongPressGestureDetector::SIGNAL_LONG_PRESS_DETECTED, functor );
999
1000   // Render and notify
1001   application.SendNotification();
1002   application.Render();
1003
1004   // Emit gesture
1005   application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 10.0f)));
1006   application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 10.0f)));
1007   application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 10.0f)));
1008   DALI_TEST_EQUALS(true, data.voidFunctorCalled, TEST_LOCATION);
1009   END_TEST;
1010 }
1011
1012 int UtcDaliPanGestureDetectorTypeRegistry(void)
1013 {
1014   TestApplication application;
1015
1016   Actor actor = Actor::New();
1017   actor.SetSize(100.0f, 100.0f);
1018   actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1019   Stage::GetCurrent().Add(actor);
1020
1021   // Register Type
1022   TypeInfo type;
1023   type = TypeRegistry::Get().GetTypeInfo( "PanGestureDetector" );
1024   DALI_TEST_CHECK( type );
1025   BaseHandle handle = type.CreateInstance();
1026   DALI_TEST_CHECK( handle );
1027   PanGestureDetector detector = PanGestureDetector::DownCast( handle );
1028   DALI_TEST_CHECK( detector );
1029
1030   // Attach actor to detector
1031   SignalData data;
1032   GestureReceivedFunctor functor( data );
1033   detector.Attach(actor);
1034
1035   // Connect to signal through type
1036   handle.ConnectSignal( &application, PanGestureDetector::SIGNAL_PAN_DETECTED, functor );
1037
1038   // Render and notify
1039   application.SendNotification();
1040   application.Render();
1041
1042   // Emit gesture
1043   application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
1044   application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
1045   application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
1046   DALI_TEST_EQUALS(true, data.voidFunctorCalled, TEST_LOCATION);
1047   END_TEST;
1048 }
1049
1050 int UtcDaliPinchGestureDetectorTypeRegistry(void)
1051 {
1052   TestApplication application;
1053
1054   Actor actor = Actor::New();
1055   actor.SetSize(100.0f, 100.0f);
1056   actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1057   Stage::GetCurrent().Add(actor);
1058
1059   // Register Type
1060   TypeInfo type;
1061   type = TypeRegistry::Get().GetTypeInfo( "PinchGestureDetector" );
1062   DALI_TEST_CHECK( type );
1063   BaseHandle handle = type.CreateInstance();
1064   DALI_TEST_CHECK( handle );
1065   PinchGestureDetector detector = PinchGestureDetector::DownCast( handle );
1066   DALI_TEST_CHECK( detector );
1067
1068   // Attach actor to detector
1069   SignalData data;
1070   GestureReceivedFunctor functor( data );
1071   detector.Attach(actor);
1072
1073   // Connect to signal through type
1074   handle.ConnectSignal( &application, PinchGestureDetector::SIGNAL_PINCH_DETECTED, functor );
1075
1076   // Render and notify
1077   application.SendNotification();
1078   application.Render();
1079
1080   // Emit gesture
1081   application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
1082   DALI_TEST_EQUALS(true, data.voidFunctorCalled, TEST_LOCATION);
1083   END_TEST;
1084 }
1085
1086 int UtcDaliTapGestureDetectorTypeRegistry(void)
1087 {
1088   TestApplication application;
1089
1090   Actor actor = Actor::New();
1091   actor.SetSize(100.0f, 100.0f);
1092   actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1093   Stage::GetCurrent().Add(actor);
1094
1095   // Register Type
1096   TypeInfo type;
1097   type = TypeRegistry::Get().GetTypeInfo( "TapGestureDetector" );
1098   DALI_TEST_CHECK( type );
1099   BaseHandle handle = type.CreateInstance();
1100   DALI_TEST_CHECK( handle );
1101   TapGestureDetector detector = TapGestureDetector::DownCast( handle );
1102   DALI_TEST_CHECK( detector );
1103
1104   // Attach actor to detector
1105   SignalData data;
1106   GestureReceivedFunctor functor( data );
1107   detector.Attach(actor);
1108
1109   // Connect to signal through type
1110   handle.ConnectSignal( &application, TapGestureDetector::SIGNAL_TAP_DETECTED, functor );
1111
1112   // Render and notify
1113   application.SendNotification();
1114   application.Render();
1115
1116   // Emit gesture
1117   application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f)));
1118   application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f)));
1119   DALI_TEST_EQUALS(true, data.voidFunctorCalled, TEST_LOCATION);
1120   END_TEST;
1121 }
1122
1123 int UtcDaliTypeRegistryNamedType(void)
1124 {
1125   TestApplication application;
1126   TypeRegistry typeRegistry = TypeRegistry::Get();
1127
1128   // Create a normal actor
1129   BaseHandle actorHandle = typeRegistry.GetTypeInfo( "Actor" ).CreateInstance();
1130   DALI_TEST_CHECK( actorHandle );
1131   Actor actor( Actor::DownCast( actorHandle ) );
1132   DALI_TEST_CHECK( actor );
1133   unsigned int actorPropertyCount( actor.GetPropertyCount() );
1134
1135   // Create Named Actor Type
1136   BaseHandle namedHandle = typeRegistry.GetTypeInfo( "MyNamedActor" ).CreateInstance();
1137   DALI_TEST_CHECK( namedHandle );
1138   Actor namedActor( Actor::DownCast( namedHandle ) );
1139   DALI_TEST_CHECK( namedActor );
1140   unsigned int namedActorPropertyCount( namedActor.GetPropertyCount() );
1141
1142   DALI_TEST_CHECK( namedActorPropertyCount > actorPropertyCount );
1143   END_TEST;
1144 }
1145