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