8e1673e1961e0f910635d6e2552b1dc6cd7533f6
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-ControlWrapper.cpp
1 /*
2  * Copyright (c) 2019 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
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
18 #include <iostream>
19 #include <stdlib.h>
20
21 // Need to override adaptor classes for toolkit test harness, so include
22 // test harness headers before dali headers.
23 #include <dali-toolkit-test-suite-utils.h>
24
25 #include <dali.h>
26 #include <dali/public-api/dali-core.h>
27 #include <dali/devel-api/actors/custom-actor-devel.h>
28 #include <dali/devel-api/object/csharp-type-registry.h>
29 #include <dali-toolkit/dali-toolkit.h>
30 #include <dali-toolkit/devel-api/controls/control-devel.h>
31 #include <dali-toolkit/devel-api/controls/control-wrapper.h>
32 #include <dali-toolkit/devel-api/controls/control-wrapper-impl.h>
33 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
34 #include <dali-toolkit/devel-api/visual-factory/transition-data.h>
35
36 using namespace Dali;
37 using namespace Dali::Toolkit;
38
39 void utc_dali_toolkit_control_wrapper_startup(void)
40 {
41   test_return_value = TET_UNDEF;
42 }
43
44 void utc_dali_toolkit_control_wrapper_cleanup(void)
45 {
46   test_return_value = TET_PASS;
47 }
48
49 ///////////////////////////////////////////////////////////////////////////////////////////////////
50
51 namespace
52 {
53 bool gOnRelayout = false;
54 } // namespace
55
56 ///////////////////////////////////////////////////////////////////////////////////////////////////
57
58
59 namespace Impl
60 {
61 struct TestCustomControl : public Toolkit::Internal::ControlWrapper
62 {
63   /**
64    * Constructor
65    */
66   TestCustomControl()  : Toolkit::Internal::ControlWrapper( CustomControlBehaviour( Toolkit::Internal::ControlWrapper::DISABLE_STYLE_CHANGE_SIGNALS |
67           Toolkit::Internal::ControlWrapper::REQUIRES_KEYBOARD_NAVIGATION_SUPPORT )) ,
68           mDaliProperty( Property::INVALID_INDEX ),
69           mSizeSet( Vector3::ZERO ),
70           mTargetSize( Vector3::ZERO ),
71           mNego( false ),
72           mDepth( 0u )
73   {
74   }
75
76   TestCustomControl(bool nego)  : Toolkit::Internal::ControlWrapper( CustomControlBehaviour( Toolkit::Internal::ControlWrapper::DISABLE_STYLE_CHANGE_SIGNALS |
77           Toolkit::Internal::ControlWrapper::REQUIRES_KEYBOARD_NAVIGATION_SUPPORT ) ),
78           mDaliProperty( Property::INVALID_INDEX ),
79           mSizeSet( Vector3::ZERO ),
80           mTargetSize( Vector3::ZERO ),
81           mNego( nego ),
82           mDepth( 0u )
83   {
84   }
85
86   /**
87    * Destructor
88    */
89   virtual ~TestCustomControl()
90   {
91   }
92
93   void Initialize( const char* name = NULL )
94   {
95     mDaliProperty = Self().RegisterProperty( "Dali", std::string("no"), Property::READ_WRITE );
96
97     OnInitialize( name );
98   }
99
100   using Control::OnInitialize; ///< To tell the compiler that we really do want to overload OnInitialize in this class & were not trying to override it
101   virtual void OnInitialize( const char* name ) {}
102
103   // From Toolkit::Internal::ControlWrapper
104   virtual void OnStageConnection( int depth )
105   {
106     mDepth = depth;
107     Control::OnStageConnection(depth);
108   }
109   virtual void OnStageDisconnection()
110   {
111     Control::OnStageDisconnection();
112   }
113   virtual void OnChildAdd( Actor& child )
114   {
115     Control::OnChildAdd(child);
116   }
117   virtual void OnChildRemove( Actor& child )
118   {
119     Control::OnChildRemove(child);
120   }
121   virtual void OnPropertySet( Property::Index index, Property::Value propertyValue )
122   {
123     Control::OnPropertySet(index, propertyValue);
124   }
125   virtual void OnSizeSet( const Vector3& targetSize )
126   {
127     mSizeSet = targetSize;
128     Control::OnSizeSet( targetSize );
129   }
130   virtual void OnSizeAnimation( Animation& animation, const Vector3& targetSize )
131   {
132     mTargetSize = targetSize;
133     Control::OnSizeAnimation( animation, targetSize );
134   }
135   virtual bool OnTouchEvent( const TouchEvent& event )
136   {
137     return true;
138   }
139   virtual bool OnHoverEvent( const HoverEvent& event )
140   {
141     return true;
142   }
143   virtual bool OnWheelEvent( const WheelEvent& event )
144   {
145     return true;
146   }
147   virtual bool OnKeyEvent( const KeyEvent& event )
148   {
149     return true;
150   }
151   virtual void OnKeyInputFocusGained()
152   {
153   }
154   virtual void OnKeyInputFocusLost()
155   {
156   }
157   virtual Vector3 GetNaturalSize()
158   {
159     return Vector3( 0.0f, 0.0f, 0.0f );
160   }
161
162   virtual float GetHeightForWidth( float width )
163   {
164     return 0.0f;
165   }
166
167   virtual float GetWidthForHeight( float height )
168   {
169     return 0.0f;
170   }
171
172   void TestRegisterVisual( Property::Index index, Toolkit::Visual::Base visual )
173   {
174     ControlWrapper::RegisterVisual( index, visual );
175
176     VisualIndices::iterator iter = std::find( mRegisteredVisualIndices.begin(), mRegisteredVisualIndices.end(), index );
177     if( iter == mRegisteredVisualIndices.end() )
178     {
179       mRegisteredVisualIndices.push_back(index);
180     }
181   }
182
183   virtual void OnRelayout( const Vector2& size, RelayoutContainer& container )
184   {
185     gOnRelayout = true;
186
187     for( VisualIndices::iterator iter = mRegisteredVisualIndices.begin(); iter != mRegisteredVisualIndices.end() ; ++iter )
188     {
189       Visual::Base visual = GetVisual(*iter);
190       Property::Map map; // empty map enforces defaults
191       visual.SetTransformAndSize( map, size );
192     }
193   }
194
195   virtual void OnSetResizePolicy( ResizePolicy::Type policy, Dimension::Type dimension )
196   {
197   }
198
199   virtual void OnCalculateRelayoutSize( Dimension::Type dimension )
200   {
201   }
202
203   virtual float CalculateChildSize( const Dali::Actor& child, Dimension::Type dimension )
204   {
205     return 0.0f;
206   }
207
208   virtual void OnLayoutNegotiated( float size, Dimension::Type dimension )
209   {
210   }
211
212   virtual bool RelayoutDependentOnChildren( Dimension::Type dimension = Dimension::ALL_DIMENSIONS )
213   {
214     return false;
215   }
216
217   void SetDaliProperty(std::string s)
218   {
219     Self().SetProperty(mDaliProperty, s);
220   }
221   void TestRelayoutRequest()
222   {
223     RelayoutRequest();
224   }
225
226   float TestGetHeightForWidthBase( float width )
227   {
228     return GetHeightForWidthBase( width );
229   }
230
231   float TestGetWidthForHeightBase( float height )
232   {
233     return GetWidthForHeightBase( height );
234   }
235
236   float TestCalculateChildSizeBase( const Dali::Actor& child, Dimension::Type dimension )
237   {
238     return CalculateChildSizeBase( child, dimension );
239   }
240
241   bool TestRelayoutDependentOnChildrenBase( Dimension::Type dimension )
242   {
243     return RelayoutDependentOnChildrenBase( dimension );
244   }
245
246   Property::Index mDaliProperty;
247   Vector3 mSizeSet;
248   Vector3 mTargetSize;
249   bool mNego;
250   unsigned int mDepth;
251
252   typedef std::vector<Property::Index> VisualIndices;
253   VisualIndices mRegisteredVisualIndices;
254 };
255
256
257
258 }
259
260 static std::string customControlTypeName = "MyTestCustomControl";
261 static TypeRegistration customControl( customControlTypeName, typeid(Dali::Toolkit::Control), NULL );
262
263
264 int UtcDaliControlWrapperConstructor(void)
265 {
266   ToolkitTestApplication application;  // Exceptions require ToolkitTestApplication
267
268   Toolkit::Internal::ControlWrapper* controlWrapperImpl = new Toolkit::Internal::ControlWrapper( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
269   ControlWrapper controlWrapper;
270
271   DALI_TEST_CHECK( !ControlWrapper::DownCast( controlWrapper ) );
272
273   controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
274
275   DALI_TEST_CHECK( ControlWrapper::DownCast( controlWrapper ) );
276
277   Dali::TypeInfo typeInfo = DevelCustomActor::GetTypeInfo( controlWrapper );
278
279   DALI_TEST_EQUALS( typeInfo.GetName(), customControlTypeName, TEST_LOCATION);
280
281
282   END_TEST;
283 }
284
285 int UtcDaliControlWrapperDestructor(void)
286 {
287   TestApplication application;
288
289   ControlWrapper control = ControlWrapper::New( customControlTypeName, *( new Toolkit::Internal::ControlWrapper( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT ) ) );
290
291   ControlWrapper control2( control );
292
293   DALI_TEST_CHECK( control );
294   control.Reset();
295   DALI_TEST_CHECK( !control );
296
297   DALI_TEST_CHECK( control2 );
298   control2.Reset();
299   DALI_TEST_CHECK( !control2 );
300
301   END_TEST;
302 }
303
304 int UtcDaliControlWrapperRelayoutRequest(void)
305 {
306   TestApplication application;
307
308   DALI_TEST_EQUALS( gOnRelayout, false, TEST_LOCATION );
309
310   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
311   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
312
313   Stage::GetCurrent().Add( controlWrapper );
314
315   application.SendNotification();
316   application.Render();
317
318   DALI_TEST_EQUALS( gOnRelayout, true, TEST_LOCATION );
319   gOnRelayout = false;
320
321   controlWrapperImpl->TestRelayoutRequest();
322   application.SendNotification();
323   application.Render();
324
325   DALI_TEST_EQUALS( gOnRelayout, true, TEST_LOCATION );
326
327   END_TEST;
328 }
329
330 int UtcDaliControlWrapperImplGetHeightForWidthBase(void)
331 {
332   TestApplication application;
333
334   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
335   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
336
337   float width = 300.0f;
338   float v = 0.0f;
339
340   application.SendNotification();
341   application.Render();
342
343   v = controlWrapperImpl->TestGetHeightForWidthBase( width );
344
345   DALI_TEST_EQUALS( width, v, TEST_LOCATION );
346
347   END_TEST;
348 }
349
350 int UtcDaliControlWrapperGetWidthForHeightBase(void)
351 {
352   TestApplication application;
353
354   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
355   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
356
357   float height = 300.0f;
358   float v = 0.0f;
359
360   application.SendNotification();
361   application.Render();
362
363   v = controlWrapperImpl->TestGetWidthForHeightBase( height );
364
365   DALI_TEST_EQUALS( height, v, TEST_LOCATION );
366
367   END_TEST;
368 }
369
370 int UtcDaliControlWrapperCalculateChildSizeBase(void)
371 {
372   TestApplication application;
373
374   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
375   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
376
377   Actor child = Actor::New();
378   child.SetResizePolicy( Dali::ResizePolicy::FIXED, Dali::Dimension::ALL_DIMENSIONS );
379   child.SetSize(150, 150);
380
381   application.SendNotification();
382   application.Render();
383
384   float v = 9.99f;
385   v = controlWrapperImpl->TestCalculateChildSizeBase( child, Dali::Dimension::ALL_DIMENSIONS );
386   DALI_TEST_EQUALS( v, 0.0f, TEST_LOCATION );
387
388   END_TEST;
389 }
390
391 int UtcDaliControlWrapperRelayoutDependentOnChildrenBase(void)
392 {
393   TestApplication application;
394
395   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
396   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
397
398   bool v = false;
399
400   v = controlWrapperImpl->TestRelayoutDependentOnChildrenBase( Dali::Dimension::ALL_DIMENSIONS );
401   application.SendNotification();
402   application.Render();
403
404   DALI_TEST_EQUALS( v, true, TEST_LOCATION );
405
406   controlWrapper.SetResizePolicy( Dali::ResizePolicy::FIXED, Dali::Dimension::ALL_DIMENSIONS );
407   v = controlWrapperImpl->TestRelayoutDependentOnChildrenBase( Dali::Dimension::WIDTH );
408   application.SendNotification();
409   application.Render();
410   DALI_TEST_EQUALS( v, false, TEST_LOCATION );
411
412   END_TEST;
413 }
414
415 int UtcDaliControlWrapperRegisterVisualToSelf(void)
416 {
417   ToolkitTestApplication application;
418
419   Test::ObjectDestructionTracker objectDestructionTracker;
420
421   {
422     Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
423     ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
424
425     objectDestructionTracker.Start( controlWrapper );
426
427     Property::Index index = 1;
428
429     Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get();
430     Toolkit::Visual::Base visual;
431
432     Property::Map map;
433     map[Visual::Property::TYPE] = Visual::COLOR;
434     map[ColorVisual::Property::MIX_COLOR] = Color::RED;
435
436     visual = visualFactory.CreateVisual( map );
437     DALI_TEST_CHECK( visual );
438
439     // Register to self
440     controlWrapperImpl->RegisterVisual( index, visual );
441
442     DALI_TEST_EQUALS( objectDestructionTracker.IsDestroyed(), false, TEST_LOCATION ); // Control not destroyed yet
443     DALI_TEST_EQUALS( controlWrapperImpl->GetVisual( index ), visual, TEST_LOCATION );
444   }
445
446   DALI_TEST_EQUALS( objectDestructionTracker.IsDestroyed(), true, TEST_LOCATION ); // Should be destroyed
447
448   END_TEST;
449 }
450
451 int UtcDaliControlWrapperRegisterVisualWithDepthIndexToSelf(void)
452 {
453   ToolkitTestApplication application;
454
455   Test::ObjectDestructionTracker objectDestructionTracker;
456
457   {
458     Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
459     ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
460
461     objectDestructionTracker.Start( controlWrapper );
462
463     Property::Index index = 1;
464
465     Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get();
466     Toolkit::Visual::Base visual;
467
468     Property::Map map;
469     map[Visual::Property::TYPE] = Visual::COLOR;
470     map[ColorVisual::Property::MIX_COLOR] = Color::RED;
471
472     visual = visualFactory.CreateVisual( map );
473     DALI_TEST_CHECK( visual );
474
475     // Register to self
476     controlWrapperImpl->RegisterVisual( index, visual, 4 );
477
478     DALI_TEST_EQUALS( objectDestructionTracker.IsDestroyed(), false, TEST_LOCATION ); // Control not destroyed yet
479     DALI_TEST_EQUALS( controlWrapperImpl->GetVisual( index ), visual, TEST_LOCATION );
480     DALI_TEST_EQUALS( visual.GetDepthIndex(), 4, TEST_LOCATION );
481   }
482
483   DALI_TEST_EQUALS( objectDestructionTracker.IsDestroyed(), true, TEST_LOCATION ); // Should be destroyed
484
485   END_TEST;
486 }
487
488 int UtcDaliControlWrapperRegisterDisabledVisual(void)
489 {
490   ToolkitTestApplication application;
491
492   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
493   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
494
495   Property::Index TEST_PROPERTY = 1;
496
497   Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get();
498   Toolkit::Visual::Base visual;
499
500   Property::Map map;
501   map[Visual::Property::TYPE] = Visual::COLOR;
502   map[ColorVisual::Property::MIX_COLOR] = Color::RED;
503
504   visual = visualFactory.CreateVisual( map );
505   DALI_TEST_CHECK(visual);
506
507   // Register index with a color visual
508   controlWrapperImpl->RegisterVisual( TEST_PROPERTY, visual, false );
509
510   DALI_TEST_EQUALS( controlWrapperImpl->GetVisual( TEST_PROPERTY ), visual, TEST_LOCATION );
511   DALI_TEST_EQUALS( controlWrapperImpl->IsVisualEnabled( TEST_PROPERTY ), false, TEST_LOCATION );
512
513   Stage::GetCurrent().Add( controlWrapper );
514
515   // Render and notify
516   application.SendNotification();
517   application.Render();
518
519   DALI_TEST_EQUALS( controlWrapperImpl->IsVisualEnabled( TEST_PROPERTY ), false, TEST_LOCATION );
520
521   DALI_TEST_EQUALS( controlWrapper.OnStage(), true, TEST_LOCATION );
522
523   controlWrapperImpl->EnableVisual( TEST_PROPERTY, true );
524
525   DALI_TEST_EQUALS( controlWrapperImpl->IsVisualEnabled( TEST_PROPERTY ), true, TEST_LOCATION );
526
527   END_TEST;
528 }
529
530 int UtcDaliControlWrapperRegisterDisabledVisualWithDepthIndex(void)
531 {
532   ToolkitTestApplication application;
533
534   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
535   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
536
537   Property::Index TEST_PROPERTY = 1;
538
539   Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get();
540   Toolkit::Visual::Base visual;
541
542   Property::Map map;
543   map[Visual::Property::TYPE] = Visual::COLOR;
544   map[ColorVisual::Property::MIX_COLOR] = Color::RED;
545
546   visual = visualFactory.CreateVisual( map );
547   DALI_TEST_CHECK(visual);
548
549   // Register index with a color visual
550   controlWrapperImpl->RegisterVisual( TEST_PROPERTY, visual, false, 10 );
551
552   DALI_TEST_EQUALS( controlWrapperImpl->GetVisual( TEST_PROPERTY ), visual, TEST_LOCATION );
553   DALI_TEST_EQUALS( controlWrapperImpl->IsVisualEnabled( TEST_PROPERTY ), false, TEST_LOCATION );
554   DALI_TEST_EQUALS( visual.GetDepthIndex(), 10, TEST_LOCATION );
555
556   Stage::GetCurrent().Add( controlWrapper );
557
558   // Render and notify
559   application.SendNotification();
560   application.Render();
561
562   DALI_TEST_EQUALS( controlWrapperImpl->IsVisualEnabled( TEST_PROPERTY ), false, TEST_LOCATION );
563
564   DALI_TEST_EQUALS( controlWrapper.OnStage(), true, TEST_LOCATION );
565
566   controlWrapperImpl->EnableVisual( TEST_PROPERTY, true );
567
568   DALI_TEST_EQUALS( controlWrapperImpl->IsVisualEnabled( TEST_PROPERTY ), true, TEST_LOCATION );
569
570   END_TEST;
571 }
572
573 int UtcDaliControlWrapperRegisterUnregisterVisual(void)
574 {
575   ToolkitTestApplication application;
576
577   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
578   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
579
580   Property::Index index = 1;
581
582   Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get();
583   Toolkit::Visual::Base visual;
584
585   Property::Map map;
586   map[Visual::Property::TYPE] = Visual::COLOR;
587   map[ColorVisual::Property::MIX_COLOR] = Color::RED;
588
589   visual = visualFactory.CreateVisual( map );
590   DALI_TEST_CHECK(visual);
591
592   // Register index with a color visual
593   controlWrapperImpl->RegisterVisual( index, visual );
594
595   DALI_TEST_EQUALS( controlWrapperImpl->GetVisual( index ), visual, TEST_LOCATION );
596
597   // Unregister visual
598   controlWrapperImpl->UnregisterVisual( index );
599
600   DALI_TEST_CHECK( !controlWrapperImpl->GetVisual( index ) );
601
602   END_TEST;
603 }
604
605 int UtcDaliControlWrapperTransitionDataMap1N(void)
606 {
607   TestApplication application;
608
609   Property::Map map;
610   map["target"] = "Actor1";
611   map["property"] = "randomProperty";
612   map["initialValue"] = Color::MAGENTA;
613   map["targetValue"] = Color::RED;
614   map["animator"] = Property::Map()
615     .Add("alphaFunction", "EASE_OUT")
616     .Add("timePeriod", Property::Map()
617          .Add("delay", 0.5f)
618          .Add("duration", 1.0f));
619
620   Dali::Toolkit::TransitionData transition = TransitionData::New( map );
621
622   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
623   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
624
625   //DummyControl actor = DummyControl::New();
626   controlWrapper.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
627   controlWrapper.SetName("Actor1");
628   controlWrapper.SetColor(Color::CYAN);
629   Stage::GetCurrent().Add(controlWrapper);
630
631   Animation anim = controlWrapperImpl->CreateTransition( transition );
632   DALI_TEST_CHECK( ! anim );
633
634   Property::Map returnedMap = transition.GetAnimatorAt(0);
635
636   Property::Value* value = returnedMap.Find("property");
637   DALI_TEST_CHECK( value != NULL);
638   DALI_TEST_EQUALS( "randomProperty", value->Get<std::string>(), TEST_LOCATION );
639
640   value = returnedMap.Find("initialValue");
641   DALI_TEST_CHECK( value != NULL);
642   DALI_TEST_EQUALS( Color::MAGENTA, value->Get<Vector4>(), TEST_LOCATION );
643
644   value = returnedMap.Find("targetValue");
645   DALI_TEST_CHECK( value != NULL);
646   DALI_TEST_EQUALS( Color::RED, value->Get<Vector4>(), TEST_LOCATION );
647
648   value = returnedMap.Find("animator");
649   DALI_TEST_CHECK( value != NULL);
650   Property::Map returnedAnimatorMap = value->Get<Property::Map>();
651
652   value = returnedAnimatorMap.Find("alphaFunction");
653   DALI_TEST_CHECK( value != NULL);
654   DALI_TEST_EQUALS( "EASE_OUT", value->Get<std::string>(), TEST_LOCATION );
655
656   value = returnedAnimatorMap.Find("timePeriod");
657   DALI_TEST_CHECK( value != NULL);
658   Property::Map returnedTimePeriodMap = value->Get<Property::Map>();
659
660   value = returnedTimePeriodMap.Find("delay");
661   DALI_TEST_CHECK( value != NULL);
662   DALI_TEST_EQUALS( 0.5f, value->Get<float>(), TEST_LOCATION );
663
664   value = returnedTimePeriodMap.Find("duration");
665   DALI_TEST_CHECK( value != NULL);
666   DALI_TEST_EQUALS( 1.0f, value->Get<float>(), TEST_LOCATION );
667
668   END_TEST;
669 }
670
671 int UtcDaliControlWrapperApplyThemeStyle(void)
672 {
673   ToolkitTestApplication application;
674
675   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
676   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
677
678   controlWrapperImpl->ApplyThemeStyle();
679
680   DALI_TEST_CHECK( true );
681   END_TEST;
682 }
683
684 int UtcDaliControlWrapperTestControlProperties(void)
685 {
686   ToolkitTestApplication application;
687
688   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
689   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
690
691   Stage::GetCurrent().Add( controlWrapper );
692
693   // "background" property
694   Property::Map rendererMap;
695   rendererMap[Visual::Property::TYPE] = Visual::COLOR;
696   rendererMap[ColorVisual::Property::MIX_COLOR] = Color::RED;
697   controlWrapper.SetProperty( Control::Property::BACKGROUND, rendererMap );
698   Property::Value propertyValue = controlWrapper.GetProperty( Control::Property::BACKGROUND );
699   Property::Map* resultMap = propertyValue.GetMap();
700   DALI_TEST_CHECK( resultMap->Find( Toolkit::Visual::Property::TYPE ) );
701   DALI_TEST_EQUALS( resultMap->Find( Toolkit::Visual::Property::TYPE )->Get<int>(), (int)Visual::COLOR, TEST_LOCATION );
702   DALI_TEST_CHECK( resultMap->Find( ColorVisual::Property::MIX_COLOR ) );
703   DALI_TEST_EQUALS( resultMap->Find( ColorVisual::Property::MIX_COLOR )->Get<Vector4>(), Color::RED, TEST_LOCATION );
704
705   // "keyInputFocus" property
706   controlWrapper.SetProperty( Control::Property::KEY_INPUT_FOCUS, true );
707   DALI_TEST_EQUALS( true, controlWrapper.GetProperty( Control::Property::KEY_INPUT_FOCUS ).Get< bool >(), TEST_LOCATION );
708
709   // "styleName" property
710   controlWrapper.SetProperty( Control::Property::STYLE_NAME, "MyCustomStyle" );
711   DALI_TEST_EQUALS( "MyCustomStyle", controlWrapper.GetProperty( Control::Property::STYLE_NAME ).Get< std::string >(), TEST_LOCATION );
712
713   END_TEST;
714 }
715
716 int UtcDaliControlWrapperTypeRegistryCreation(void)
717 {
718   ToolkitTestApplication application;
719
720   TypeInfo typeInfo = TypeRegistry::Get().GetTypeInfo( "ControlWrapper" );
721   DALI_TEST_CHECK( typeInfo )
722
723   // Check that we can't create a ControlWrapper instance
724   BaseHandle baseHandle = typeInfo.CreateInstance();
725   DALI_TEST_CHECK( !baseHandle )
726
727   END_TEST;
728 }
729
730 void SetProperty(BaseObject* object, const char* const name, Property::Value* value)
731 {
732 }
733 Property::Value* GetProperty(BaseObject* object, const char* const name )
734 {
735   return NULL;
736 }
737
738 int UtcDaliControlWrapperAnimateVisual(void)
739 {
740   tet_infoline("Test that the control wrapper's visuals can be animated by name when registered");
741
742   ToolkitTestApplication application;
743   Test::ObjectDestructionTracker objectDestructionTracker;
744
745   {
746     Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
747     ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
748
749     Property::Index index = Control::CONTROL_PROPERTY_END_INDEX+1;
750     std::string visualName("colorVisual");
751     CSharpTypeRegistry::RegisterProperty( customControlTypeName, visualName, index, Property::VECTOR4, SetProperty, GetProperty );
752
753     objectDestructionTracker.Start( controlWrapper );
754
755     Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get();
756     Toolkit::Visual::Base visual;
757
758     Property::Map map;
759     map[Visual::Property::TYPE] = Visual::COLOR;
760     map[ColorVisual::Property::MIX_COLOR] = Color::RED;
761
762     visual = visualFactory.CreateVisual( map );
763     DALI_TEST_CHECK( visual );
764
765     // Register to self
766     controlWrapperImpl->TestRegisterVisual( index, visual );
767
768     Stage::GetCurrent().Add( controlWrapper );
769     controlWrapper.SetSize( 100, 100 );
770     application.SendNotification();
771     application.Render(0); // Trigger animation start
772
773     Property::Map transition;
774     transition["target"] = visualName;
775     transition["property"] = "mixColor";
776     transition["targetValue"] = Color::GREEN;
777     Property::Map animator;
778     animator["alphaFunction"] = "LINEAR";
779     animator["duration"] = 1.0f;
780     animator["delay"] = 0.0f;
781     transition["animator"] = animator;
782
783     TransitionData transitionData = TransitionData::New(transition);
784     Animation anim = DevelControl::CreateTransition( *controlWrapperImpl, transitionData );
785     anim.Play();
786
787     application.SendNotification();
788     application.Render(0); // Trigger animation start
789
790     application.Render(1000); // animation end
791     application.Render(  10);
792
793     Property::Map visualMap;
794     visual.CreatePropertyMap( visualMap );
795     Property::Value* value = visualMap.Find(ColorVisual::Property::MIX_COLOR, "mixColor");
796     DALI_TEST_CHECK( value != NULL );
797     if( value )
798     {
799       Vector4 testColor = value->Get<Vector4>();
800       DALI_TEST_EQUALS( testColor, Color::GREEN, 0.001f, TEST_LOCATION );
801     }
802
803     DALI_TEST_EQUALS( objectDestructionTracker.IsDestroyed(), false, TEST_LOCATION ); // Control not destroyed yet
804     DALI_TEST_EQUALS( controlWrapperImpl->GetVisual( index ), visual, TEST_LOCATION );
805
806     Stage::GetCurrent().Remove( controlWrapper );
807   }
808
809   DALI_TEST_EQUALS( objectDestructionTracker.IsDestroyed(), true, TEST_LOCATION ); // Should be destroyed
810
811   END_TEST;
812 }