Fix control properties for C# custom view
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-ControlWrapper.cpp
1 /*
2  * Copyright (c) 2016 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-toolkit/dali-toolkit.h>
28 #include <dali-toolkit/devel-api/controls/control-wrapper.h>
29 #include <dali-toolkit/devel-api/controls/control-wrapper-impl.h>
30 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
31 #include <dali-toolkit/devel-api/visual-factory/transition-data.h>
32
33 using namespace Dali;
34 using namespace Dali::Toolkit;
35
36 void utc_dali_toolkit_control_wrapper_startup(void)
37 {
38   test_return_value = TET_UNDEF;
39 }
40
41 void utc_dali_toolkit_control_wrapper_cleanup(void)
42 {
43   test_return_value = TET_PASS;
44 }
45
46 ///////////////////////////////////////////////////////////////////////////////////////////////////
47
48 namespace
49 {
50 bool gOnRelayout = false;
51 } // namespace
52
53 ///////////////////////////////////////////////////////////////////////////////////////////////////
54
55 namespace Impl
56 {
57 struct TestCustomControl : public Toolkit::Internal::ControlWrapper
58 {
59   /**
60   * Constructor
61   */
62   TestCustomControl()  : Toolkit::Internal::ControlWrapper( CustomControlBehaviour( Toolkit::Internal::ControlWrapper::DISABLE_STYLE_CHANGE_SIGNALS |
63           Toolkit::Internal::ControlWrapper::REQUIRES_KEYBOARD_NAVIGATION_SUPPORT )) ,
64           mDaliProperty( Property::INVALID_INDEX ),
65           mSizeSet( Vector3::ZERO ),
66           mTargetSize( Vector3::ZERO ),
67           mNego( false ),
68           mDepth( 0u )
69   {
70   }
71
72   TestCustomControl(bool nego)  : Toolkit::Internal::ControlWrapper( CustomControlBehaviour( Toolkit::Internal::ControlWrapper::DISABLE_STYLE_CHANGE_SIGNALS |
73           Toolkit::Internal::ControlWrapper::REQUIRES_KEYBOARD_NAVIGATION_SUPPORT ) ),
74           mDaliProperty( Property::INVALID_INDEX ),
75           mSizeSet( Vector3::ZERO ),
76           mTargetSize( Vector3::ZERO ),
77           mNego( nego )
78   {
79   }
80   /**
81    * Destructor
82    */
83   virtual ~TestCustomControl()
84   {
85   }
86
87   void Initialize( const char* name = NULL )
88   {
89     mDaliProperty = Self().RegisterProperty( "Dali", std::string("no"), Property::READ_WRITE );
90
91     OnInitialize( name );
92   }
93
94   virtual void OnInitialize( const char* name ) {}
95
96   // From Toolkit::Internal::ControlWrapper
97   virtual void OnStageConnection( int depth )
98   {
99     mDepth = depth;
100   }
101   virtual void OnStageDisconnection()
102   {
103   }
104   virtual void OnChildAdd( Actor& child )
105   {
106   }
107   virtual void OnChildRemove( Actor& child )
108   {
109   }
110   virtual void OnPropertySet( Property::Index index, Property::Value propertyValue )
111   {
112   }
113   virtual void OnSizeSet( const Vector3& targetSize )
114   {
115     mSizeSet = targetSize;
116   }
117   virtual void OnSizeAnimation( Animation& animation, const Vector3& targetSize )
118   {
119     mTargetSize = targetSize;
120   }
121   virtual bool OnTouchEvent( const TouchEvent& event )
122   {
123     return true;
124   }
125   virtual bool OnHoverEvent( const HoverEvent& event )
126   {
127     return true;
128   }
129   virtual bool OnWheelEvent( const WheelEvent& event )
130   {
131     return true;
132   }
133   virtual bool OnKeyEvent( const KeyEvent& event )
134   {
135     return true;
136   }
137   virtual void OnKeyInputFocusGained()
138   {
139   }
140   virtual void OnKeyInputFocusLost()
141   {
142   }
143   virtual Vector3 GetNaturalSize()
144   {
145     return Vector3( 0.0f, 0.0f, 0.0f );
146   }
147
148   virtual float GetHeightForWidth( float width )
149   {
150     return 0.0f;
151   }
152
153   virtual float GetWidthForHeight( float height )
154   {
155     return 0.0f;
156   }
157
158   virtual void OnRelayout( const Vector2& size, RelayoutContainer& container )
159   {
160     gOnRelayout = true;
161   }
162
163   virtual void OnSetResizePolicy( ResizePolicy::Type policy, Dimension::Type dimension )
164   {
165   }
166
167   virtual void OnCalculateRelayoutSize( Dimension::Type dimension )
168   {
169   }
170
171   virtual float CalculateChildSize( const Dali::Actor& child, Dimension::Type dimension )
172   {
173     return 0.0f;
174   }
175
176   virtual void OnLayoutNegotiated( float size, Dimension::Type dimension )
177   {
178   }
179
180   virtual bool RelayoutDependentOnChildren( Dimension::Type dimension = Dimension::ALL_DIMENSIONS )
181   {
182     return false;
183   }
184
185   void SetDaliProperty(std::string s)
186   {
187     Self().SetProperty(mDaliProperty, s);
188   }
189   void TestRelayoutRequest()
190   {
191     RelayoutRequest();
192   }
193
194   float TestGetHeightForWidthBase( float width )
195   {
196     return GetHeightForWidthBase( width );
197   }
198
199   float TestGetWidthForHeightBase( float height )
200   {
201     return GetWidthForHeightBase( height );
202   }
203
204   float TestCalculateChildSizeBase( const Dali::Actor& child, Dimension::Type dimension )
205   {
206     return CalculateChildSizeBase( child, dimension );
207   }
208
209   bool TestRelayoutDependentOnChildrenBase( Dimension::Type dimension )
210   {
211     return RelayoutDependentOnChildrenBase( dimension );
212   }
213
214   Property::Index mDaliProperty;
215   Vector3 mSizeSet;
216   Vector3 mTargetSize;
217   bool mNego;
218   unsigned int mDepth;
219 };
220
221 }
222
223 static std::string customControlTypeName = "TestCustomControl";
224 static TypeRegistration customControl( customControlTypeName, typeid(Dali::Toolkit::Control), NULL );
225
226 int UtcDaliControlWrapperConstructor(void)
227 {
228   ToolkitTestApplication application;  // Exceptions require ToolkitTestApplication
229
230   Toolkit::Internal::ControlWrapper* controlWrapperImpl = new Toolkit::Internal::ControlWrapper( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
231   ControlWrapper controlWrapper;
232
233   DALI_TEST_CHECK( !ControlWrapper::DownCast( controlWrapper ) );
234
235   controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
236
237   DALI_TEST_CHECK( ControlWrapper::DownCast( controlWrapper ) );
238
239   END_TEST;
240 }
241
242 int UtcDaliControlWrapperDestructor(void)
243 {
244   TestApplication application;
245
246   ControlWrapper control = ControlWrapper::New( customControlTypeName, *( new Toolkit::Internal::ControlWrapper( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT ) ) );
247
248   ControlWrapper control2( control );
249
250   DALI_TEST_CHECK( control );
251   control.Reset();
252   DALI_TEST_CHECK( !control );
253
254   DALI_TEST_CHECK( control2 );
255   control2.Reset();
256   DALI_TEST_CHECK( !control2 );
257
258   END_TEST;
259 }
260
261 int UtcDaliControlWrapperRelayoutRequest(void)
262 {
263   TestApplication application;
264
265   DALI_TEST_EQUALS( gOnRelayout, false, TEST_LOCATION );
266
267   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
268   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
269
270   Stage::GetCurrent().Add( controlWrapper );
271
272   application.SendNotification();
273   application.Render();
274
275   DALI_TEST_EQUALS( gOnRelayout, true, TEST_LOCATION );
276   gOnRelayout = false;
277
278   controlWrapperImpl->TestRelayoutRequest();
279   application.SendNotification();
280   application.Render();
281
282   DALI_TEST_EQUALS( gOnRelayout, true, TEST_LOCATION );
283
284   END_TEST;
285 }
286
287 int UtcDaliControlWrapperImplGetHeightForWidthBase(void)
288 {
289   TestApplication application;
290
291   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
292   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
293
294   float width = 300.0f;
295   float v = 0.0f;
296
297   application.SendNotification();
298   application.Render();
299
300   v = controlWrapperImpl->TestGetHeightForWidthBase( width );
301
302   DALI_TEST_EQUALS( width, v, TEST_LOCATION );
303
304   END_TEST;
305 }
306
307 int UtcDaliControlWrapperGetWidthForHeightBase(void)
308 {
309   TestApplication application;
310
311   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
312   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
313
314   float height = 300.0f;
315   float v = 0.0f;
316
317   application.SendNotification();
318   application.Render();
319
320   v = controlWrapperImpl->TestGetWidthForHeightBase( height );
321
322   DALI_TEST_EQUALS( height, v, TEST_LOCATION );
323
324   END_TEST;
325 }
326
327 int UtcDaliControlWrapperCalculateChildSizeBase(void)
328 {
329   TestApplication application;
330
331   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
332   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
333
334   Actor child = Actor::New();
335   child.SetResizePolicy( Dali::ResizePolicy::FIXED, Dali::Dimension::ALL_DIMENSIONS );
336   child.SetSize(150, 150);
337
338   application.SendNotification();
339   application.Render();
340
341   float v = 9.99f;
342   v = controlWrapperImpl->TestCalculateChildSizeBase( child, Dali::Dimension::ALL_DIMENSIONS );
343   DALI_TEST_EQUALS( v, 0.0f, TEST_LOCATION );
344
345   END_TEST;
346 }
347
348 int UtcDaliControlWrapperRelayoutDependentOnChildrenBase(void)
349 {
350   TestApplication application;
351
352   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
353   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
354
355   bool v = false;
356
357   v = controlWrapperImpl->TestRelayoutDependentOnChildrenBase( Dali::Dimension::ALL_DIMENSIONS );
358   application.SendNotification();
359   application.Render();
360
361   DALI_TEST_EQUALS( v, true, TEST_LOCATION );
362
363   controlWrapper.SetResizePolicy( Dali::ResizePolicy::FIXED, Dali::Dimension::ALL_DIMENSIONS );
364   v = controlWrapperImpl->TestRelayoutDependentOnChildrenBase( Dali::Dimension::WIDTH );
365   application.SendNotification();
366   application.Render();
367   DALI_TEST_EQUALS( v, false, TEST_LOCATION );
368
369   END_TEST;
370 }
371
372 int UtcDaliControlWrapperRegisterVisualToSelf(void)
373 {
374   ToolkitTestApplication application;
375
376   Test::ObjectDestructionTracker objectDestructionTracker;
377
378   {
379     Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
380     ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
381
382     objectDestructionTracker.Start( controlWrapper );
383
384     Property::Index index = 1;
385
386     Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get();
387     Toolkit::Visual::Base visual;
388
389     Property::Map map;
390     map[Visual::Property::TYPE] = Visual::COLOR;
391     map[ColorVisual::Property::MIX_COLOR] = Color::RED;
392
393     visual = visualFactory.CreateVisual( map );
394     DALI_TEST_CHECK( visual );
395
396     // Register to self
397     controlWrapperImpl->RegisterVisual( index, visual );
398
399     DALI_TEST_EQUALS( objectDestructionTracker.IsDestroyed(), false, TEST_LOCATION ); // Control not destroyed yet
400     DALI_TEST_EQUALS( controlWrapperImpl->GetVisual( index ), visual, TEST_LOCATION );
401   }
402
403   DALI_TEST_EQUALS( objectDestructionTracker.IsDestroyed(), true, TEST_LOCATION ); // Should be destroyed
404
405   END_TEST;
406 }
407
408 int UtcDaliControlWrapperRegisterDisabledVisual(void)
409 {
410   ToolkitTestApplication application;
411
412   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
413   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
414
415   Property::Index TEST_PROPERTY = 1;
416
417   Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get();
418   Toolkit::Visual::Base visual;
419
420   Property::Map map;
421   map[Visual::Property::TYPE] = Visual::COLOR;
422   map[ColorVisual::Property::MIX_COLOR] = Color::RED;
423
424   visual = visualFactory.CreateVisual( map );
425   DALI_TEST_CHECK(visual);
426
427   // Register index with a color visual
428   controlWrapperImpl->RegisterVisual( TEST_PROPERTY, visual, false );
429
430   DALI_TEST_EQUALS( controlWrapperImpl->GetVisual( TEST_PROPERTY ), visual, TEST_LOCATION );
431   DALI_TEST_EQUALS( controlWrapperImpl->IsVisualEnabled( TEST_PROPERTY ), false, TEST_LOCATION );
432
433   Stage::GetCurrent().Add( controlWrapper );
434
435   // Render and notify
436   application.SendNotification();
437   application.Render();
438
439   DALI_TEST_EQUALS( controlWrapperImpl->IsVisualEnabled( TEST_PROPERTY ), false, TEST_LOCATION );
440
441   DALI_TEST_EQUALS( controlWrapper.OnStage(), true, TEST_LOCATION );
442
443   controlWrapperImpl->EnableVisual( TEST_PROPERTY, true );
444
445   DALI_TEST_EQUALS( controlWrapperImpl->IsVisualEnabled( TEST_PROPERTY ), true, TEST_LOCATION );
446
447   END_TEST;
448 }
449
450 int UtcDaliControlWrapperRegisterUnregisterVisual(void)
451 {
452   ToolkitTestApplication application;
453
454   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
455   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
456
457   Property::Index index = 1;
458
459   Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get();
460   Toolkit::Visual::Base visual;
461
462   Property::Map map;
463   map[Visual::Property::TYPE] = Visual::COLOR;
464   map[ColorVisual::Property::MIX_COLOR] = Color::RED;
465
466   visual = visualFactory.CreateVisual( map );
467   DALI_TEST_CHECK(visual);
468
469   // Register index with a color visual
470   controlWrapperImpl->RegisterVisual( index, visual );
471
472   DALI_TEST_EQUALS( controlWrapperImpl->GetVisual( index ), visual, TEST_LOCATION );
473
474   // Unregister visual
475   controlWrapperImpl->UnregisterVisual( index );
476
477   DALI_TEST_CHECK( !controlWrapperImpl->GetVisual( index ) );
478
479   END_TEST;
480 }
481
482 int UtcDaliControlWrapperTransitionDataMap1N(void)
483 {
484   TestApplication application;
485
486   Property::Map map;
487   map["target"] = "Actor1";
488   map["property"] = "randomProperty";
489   map["initialValue"] = Color::MAGENTA;
490   map["targetValue"] = Color::RED;
491   map["animator"] = Property::Map()
492     .Add("alphaFunction", "EASE_OUT")
493     .Add("timePeriod", Property::Map()
494          .Add("delay", 0.5f)
495          .Add("duration", 1.0f));
496
497   Dali::Toolkit::TransitionData transition = TransitionData::New( map );
498
499   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
500   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
501
502   //DummyControl actor = DummyControl::New();
503   controlWrapper.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
504   controlWrapper.SetName("Actor1");
505   controlWrapper.SetColor(Color::CYAN);
506   Stage::GetCurrent().Add(controlWrapper);
507
508   Animation anim = controlWrapperImpl->CreateTransition( transition );
509   DALI_TEST_CHECK( ! anim );
510
511   Property::Map returnedMap = transition.GetAnimatorAt(0);
512
513   Property::Value* value = returnedMap.Find("property");
514   DALI_TEST_CHECK( value != NULL);
515   DALI_TEST_EQUALS( "randomProperty", value->Get<std::string>(), TEST_LOCATION );
516
517   value = returnedMap.Find("initialValue");
518   DALI_TEST_CHECK( value != NULL);
519   DALI_TEST_EQUALS( Color::MAGENTA, value->Get<Vector4>(), TEST_LOCATION );
520
521   value = returnedMap.Find("targetValue");
522   DALI_TEST_CHECK( value != NULL);
523   DALI_TEST_EQUALS( Color::RED, value->Get<Vector4>(), TEST_LOCATION );
524
525   value = returnedMap.Find("animator");
526   DALI_TEST_CHECK( value != NULL);
527   Property::Map returnedAnimatorMap = value->Get<Property::Map>();
528
529   value = returnedAnimatorMap.Find("alphaFunction");
530   DALI_TEST_CHECK( value != NULL);
531   DALI_TEST_EQUALS( "EASE_OUT", value->Get<std::string>(), TEST_LOCATION );
532
533   value = returnedAnimatorMap.Find("timePeriod");
534   DALI_TEST_CHECK( value != NULL);
535   Property::Map returnedTimePeriodMap = value->Get<Property::Map>();
536
537   value = returnedTimePeriodMap.Find("delay");
538   DALI_TEST_CHECK( value != NULL);
539   DALI_TEST_EQUALS( 0.5f, value->Get<float>(), TEST_LOCATION );
540
541   value = returnedTimePeriodMap.Find("duration");
542   DALI_TEST_CHECK( value != NULL);
543   DALI_TEST_EQUALS( 1.0f, value->Get<float>(), TEST_LOCATION );
544
545   END_TEST;
546 }
547
548 int UtcDaliControlWrapperApplyThemeStyle(void)
549 {
550   ToolkitTestApplication application;
551
552   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
553   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
554
555   controlWrapperImpl->ApplyThemeStyle();
556
557   DALI_TEST_CHECK( true );
558   END_TEST;
559 }
560
561 int UtcDaliControlWrapperTestControlProperties(void)
562 {
563   ToolkitTestApplication application;
564
565   Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
566   ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
567
568   Stage::GetCurrent().Add( controlWrapper );
569
570   // "background" property
571   Property::Map rendererMap;
572   rendererMap[Visual::Property::TYPE] = Visual::COLOR;
573   rendererMap[ColorVisual::Property::MIX_COLOR] = Color::RED;
574   controlWrapper.SetProperty( Control::Property::BACKGROUND, rendererMap );
575   Property::Value propertyValue = controlWrapper.GetProperty( Control::Property::BACKGROUND );
576   Property::Map* resultMap = propertyValue.GetMap();
577   DALI_TEST_CHECK( resultMap->Find( Visual::Property::TYPE ) );
578   DALI_TEST_EQUALS( resultMap->Find( Visual::Property::TYPE )->Get<int>(), (int)Visual::COLOR, TEST_LOCATION );
579   DALI_TEST_CHECK( resultMap->Find( ColorVisual::Property::MIX_COLOR ) );
580   DALI_TEST_EQUALS( resultMap->Find( ColorVisual::Property::MIX_COLOR )->Get<Vector4>(), Color::RED, TEST_LOCATION );
581
582   // "keyInputFocus" property
583   controlWrapper.SetProperty( Control::Property::KEY_INPUT_FOCUS, true );
584   DALI_TEST_EQUALS( true, controlWrapper.GetProperty( Control::Property::KEY_INPUT_FOCUS ).Get< bool >(), TEST_LOCATION );
585
586   // "styleName" property
587   controlWrapper.SetProperty( Control::Property::STYLE_NAME, "MyCustomStyle" );
588   DALI_TEST_EQUALS( "MyCustomStyle", controlWrapper.GetProperty( Control::Property::STYLE_NAME ).Get< std::string >(), TEST_LOCATION );
589
590   END_TEST;
591 }
592
593 int UtcDaliControlWrapperTypeRegistryCreation(void)
594 {
595   ToolkitTestApplication application;
596
597   TypeInfo typeInfo = TypeRegistry::Get().GetTypeInfo( "ControlWrapper" );
598   DALI_TEST_CHECK( typeInfo )
599
600   // Check that we can't create a ControlWrapper instance
601   BaseHandle baseHandle = typeInfo.CreateInstance();
602   DALI_TEST_CHECK( !baseHandle )
603
604   END_TEST;
605 }