81a57811fb31c9663b98358418853830276e4041
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-Control.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-toolkit/dali-toolkit.h>
27 #include "dummy-control.h"
28
29 using namespace Dali;
30 using namespace Dali::Toolkit;
31
32 void utc_dali_toolkit_control_startup(void)
33 {
34   test_return_value = TET_UNDEF;
35 }
36
37 void utc_dali_toolkit_control_cleanup(void)
38 {
39   test_return_value = TET_PASS;
40 }
41
42 ///////////////////////////////////////////////////////////////////////////////////////////////////
43
44 namespace
45 {
46
47 bool gObjectCreatedCallBackCalled;
48
49 void TestCallback(BaseHandle handle)
50 {
51   gObjectCreatedCallBackCalled = true;
52 }
53
54 void TestVoidCallback()
55 {
56 }
57
58 static bool gKeyInputFocusCallBackCalled;
59
60 static void TestKeyInputFocusCallback( Control control )
61 {
62   tet_infoline(" TestKeyInputFocusCallback");
63
64   gKeyInputFocusCallBackCalled = true;
65 }
66
67 } // namespace
68
69 ///////////////////////////////////////////////////////////////////////////////////////////////////
70
71
72 int UtcDaliControlConstructor(void)
73 {
74   ToolkitTestApplication application;  // Exceptions require ToolkitTestApplication
75
76   DummyControl dummy;
77
78   DALI_TEST_CHECK( !Control::DownCast(dummy) );
79
80   dummy = DummyControl::New();
81
82   DALI_TEST_CHECK( Control::DownCast(dummy) );
83   END_TEST;
84 }
85
86 int UtcDaliControlNew(void)
87 {
88   ToolkitTestApplication application;  // Exceptions require ToolkitTestApplication
89
90   Control control;
91
92   DALI_TEST_CHECK( !Control::DownCast(control) );
93
94   control = Control::New();
95
96   DALI_TEST_CHECK( Control::DownCast(control) );
97   END_TEST;
98 }
99
100
101 int UtcDaliControlRegister(void)
102 {
103   ToolkitTestApplication application;
104
105   // Ensure the object is registered after creation
106   ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
107   DALI_TEST_CHECK( registry );
108
109   gObjectCreatedCallBackCalled = false;
110   registry.ObjectCreatedSignal().Connect( &TestCallback );
111   {
112     Alignment alignment = Alignment::New();
113   }
114   DALI_TEST_CHECK( gObjectCreatedCallBackCalled );
115   END_TEST;
116 }
117
118 int UtcDaliControlCopyAndAssignment(void)
119 {
120   ToolkitTestApplication application;
121
122   DummyControl control = DummyControl::New();
123   Control emptyControl;
124
125   Control controlCopy( control );
126   DALI_TEST_CHECK( control == controlCopy );
127
128   Control emptyControlCopy( emptyControl );
129   DALI_TEST_CHECK( emptyControl == emptyControlCopy );
130
131   Control controlEquals;
132   controlEquals = control;
133   DALI_TEST_CHECK( control == controlEquals );
134
135   Control emptyControlEquals;
136   emptyControlEquals = emptyControl;
137   DALI_TEST_CHECK( emptyControl == emptyControlEquals );
138
139   // Self assignment
140   control = control;
141   DALI_TEST_CHECK( control == controlCopy );
142   END_TEST;
143 }
144
145 int UtcDaliControlDownCast(void)
146 {
147   ToolkitTestApplication application;
148
149   DummyControl control;
150
151   DALI_TEST_CHECK( !Control::DownCast( control ) );
152
153   control = DummyControl::New();
154
155   DALI_TEST_CHECK( Control::DownCast( control ) );
156
157   Actor actor;
158
159   DALI_TEST_CHECK( !Control::DownCast( actor ) );
160
161   actor = Actor::New();
162
163   DALI_TEST_CHECK( !Control::DownCast( actor ) );
164   END_TEST;
165 }
166
167 int UtcDaliControlDownCastTemplate(void)
168 {
169   ToolkitTestApplication application;
170
171   DummyControl control;
172
173   DALI_TEST_CHECK( !DummyControl::DownCast( control ));
174
175   control = DummyControl::New();
176
177   DALI_TEST_CHECK( DummyControl::DownCast( control ) );
178
179   Actor actor;
180
181   DALI_TEST_CHECK( !DummyControl::DownCast( actor ) );
182
183   actor = Actor::New();
184
185   DALI_TEST_CHECK( !DummyControl::DownCast( actor ) );
186   END_TEST;
187 }
188
189 int UtcDaliControlKeyInputFocus(void)
190 {
191   ToolkitTestApplication application;
192   Stage stage = Stage::GetCurrent();
193
194   DummyControl control;
195
196   PushButton pushButton1 = PushButton::New();
197   stage.Add( pushButton1 );
198
199   pushButton1.SetKeyInputFocus();
200   DALI_TEST_CHECK( pushButton1.HasKeyInputFocus() );
201
202   pushButton1.ClearKeyInputFocus();
203   DALI_TEST_CHECK( !pushButton1.HasKeyInputFocus() );
204   END_TEST;
205 }
206
207 int UtcDaliControlGetImplementationN(void)
208 {
209   ToolkitTestApplication application;
210   DummyControl control;
211
212   // Get Empty
213   {
214     try
215     {
216       Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation( control );
217       (void)controlImpl; // Avoid unused warning
218       tet_result(TET_FAIL);
219     }
220     catch (DaliException &exception)
221     {
222       tet_result(TET_PASS);
223     }
224   }
225   END_TEST;
226 }
227
228 int UtcDaliControlGetImplementationConstN(void)
229 {
230   ToolkitTestApplication application;
231   DummyControl control;
232
233   // Get Const Empty
234   {
235     try
236     {
237       const DummyControl constControl(control);
238       const Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation( constControl );
239       (void)controlImpl; // Avoid unused warning
240       tet_result(TET_FAIL);
241     }
242     catch (DaliException &exception)
243     {
244       tet_result(TET_PASS);
245     }
246   }
247   END_TEST;
248 }
249
250 int UtcDaliControlGetImplementationP(void)
251 {
252   ToolkitTestApplication application;
253   DummyControl control = DummyControl::New();
254
255   // Get
256   {
257     try
258     {
259       Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation( control );
260       (void)controlImpl; // Avoid unused warning
261       tet_result(TET_PASS);
262     }
263     catch (DaliException &exception)
264     {
265       tet_result(TET_FAIL);
266     }
267   }
268   END_TEST;
269 }
270
271 int UtcDaliControlGetImplementationConstP(void)
272 {
273   ToolkitTestApplication application;
274   DummyControl control = DummyControl::New();
275   // Get Const
276   {
277     try
278     {
279       const DummyControl constControl(control);
280       const Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation( constControl );
281       (void)controlImpl; // Avoid unused warning
282       tet_result(TET_PASS);
283     }
284     catch (DaliException &exception)
285     {
286       tet_result(TET_FAIL);
287     }
288   }
289   END_TEST;
290 }
291
292 int UtcDaliControlSignalConnectDisconnect(void)
293 {
294   ToolkitTestApplication application;
295
296   {
297     DummyControl dummy = DummyControlImpl::New();
298
299     Actor actor = Actor::New();
300     DALI_TEST_EQUALS( actor.OnStageSignal().GetConnectionCount(), 0u, TEST_LOCATION );
301     Toolkit::Internal::Control& control = Toolkit::Internal::GetImplementation( dummy );
302     DummyControlImpl* dummyImpl = dynamic_cast<DummyControlImpl*>(&control);
303
304     if( dummyImpl == NULL )
305     {
306       tet_result( TET_FAIL );
307       END_TEST;
308     }
309
310     actor.OnStageSignal().Connect( dummyImpl, &DummyControlImpl::CustomSlot1 );
311     DALI_TEST_EQUALS( actor.OnStageSignal().GetConnectionCount(), 1u, TEST_LOCATION );
312     DALI_TEST_EQUALS( dummyImpl->mCustomSlot1Called, false, TEST_LOCATION );
313
314     Stage::GetCurrent().Add( actor );
315     DALI_TEST_EQUALS( dummyImpl->mCustomSlot1Called, true, TEST_LOCATION );
316
317     dummyImpl->mCustomSlot1Called = false;
318     actor.OnStageSignal().Disconnect( dummyImpl, &DummyControlImpl::CustomSlot1 );
319     DALI_TEST_EQUALS( actor.OnStageSignal().GetConnectionCount(), 0u, TEST_LOCATION );
320     Stage::GetCurrent().Remove( actor );
321     Stage::GetCurrent().Add( actor );
322     DALI_TEST_EQUALS( dummyImpl->mCustomSlot1Called, false, TEST_LOCATION );
323   }
324   END_TEST;
325 }
326
327 int UtcDaliControlSignalAutomaticDisconnect(void)
328 {
329   ToolkitTestApplication application;
330
331   Actor actor = Actor::New();
332
333   {
334     DummyControl dummy = DummyControlImpl::New();
335     Toolkit::Internal::Control& control = Toolkit::Internal::GetImplementation( dummy );
336     DummyControlImpl* dummyImpl = dynamic_cast<DummyControlImpl*>(&control);
337
338     if( dummyImpl == NULL )
339     {
340       tet_result( TET_FAIL );
341       END_TEST;
342     }
343
344     actor.OnStageSignal().Connect( dummyImpl, &DummyControlImpl::CustomSlot1 );
345     DALI_TEST_EQUALS( actor.OnStageSignal().GetConnectionCount(), 1u, TEST_LOCATION );
346     DALI_TEST_EQUALS( dummyImpl->mCustomSlot1Called, false, TEST_LOCATION );
347
348     Stage::GetCurrent().Add( actor );
349     DALI_TEST_EQUALS( dummyImpl->mCustomSlot1Called, true, TEST_LOCATION );
350     Stage::GetCurrent().Remove( actor );
351   }
352   // dummyControl automatically disconnects
353
354   DALI_TEST_EQUALS( actor.OnStageSignal().GetConnectionCount(), 0u, TEST_LOCATION );
355
356   const Vector3 ignoredSize( 20, 20, 0 );
357   actor.SetSize( ignoredSize );
358   END_TEST;
359 }
360
361 int UtcDaliControlTestParameters(void)
362 {
363   ToolkitTestApplication application;
364   DummyControl test = DummyControl::New();
365
366   test.SetSize( 0.7f, 0.7f, 0.7f );
367
368   Stage::GetCurrent().Add( test );
369
370   application.SendNotification();
371   application.Render();
372
373   float width = 640.0f;
374   float height = test.GetHeightForWidth( width );
375   DALI_TEST_EQUALS( 640.0f, height, TEST_LOCATION );
376   DALI_TEST_EQUALS( 640.0f, test.GetWidthForHeight( height ), TEST_LOCATION );
377
378   test.KeyEventSignal();
379
380   // Provide coverage for pointer destructor
381   Control* testControlPtr = new Control;
382   DALI_TEST_CHECK( testControlPtr );
383   delete testControlPtr;
384   END_TEST;
385 }
386
387 int UtcDaliControlBackgroundColor(void)
388 {
389   ToolkitTestApplication application;
390   Control control = Control::New();
391
392   DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::TRANSPARENT, TEST_LOCATION );
393
394   control.SetBackgroundColor( Color::RED );
395
396   Property::Value propValue = control.GetProperty( Control::Property::BACKGROUND );
397   Property::Map* resultMap = propValue.GetMap();
398   DALI_TEST_CHECK( resultMap->Find( Visual::Property::TYPE ) );
399   DALI_TEST_CHECK( resultMap->Find( Visual::Property::TYPE )->Get<int>() == Visual::COLOR );
400   DALI_TEST_CHECK( resultMap->Find( ColorVisual::Property::MIX_COLOR ) );
401   DALI_TEST_CHECK( resultMap->Find( ColorVisual::Property::MIX_COLOR )->Get<Vector4>() == Color::RED );
402
403   DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::RED, TEST_LOCATION );
404
405   control.SetBackgroundColor( Color::YELLOW );
406
407   propValue = control.GetProperty( Control::Property::BACKGROUND );
408   resultMap = propValue.GetMap();
409   DALI_TEST_CHECK( resultMap->Find( ColorVisual::Property::MIX_COLOR ) );
410   DALI_TEST_CHECK( resultMap->Find( ColorVisual::Property::MIX_COLOR )->Get<Vector4>() == Color::YELLOW );
411
412   DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::YELLOW, TEST_LOCATION );
413
414   END_TEST;
415 }
416
417 int UtcDaliControlBackgroundImage(void)
418 {
419   ToolkitTestApplication application;
420   Control control = Control::New();
421
422   DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::TRANSPARENT, TEST_LOCATION );
423
424   Image image = ResourceImage::New("TestImage");
425   control.SetBackgroundImage( image );
426
427   Property::Value propValue = control.GetProperty( Control::Property::BACKGROUND );
428   Property::Map* resultMap = propValue.GetMap();
429   DALI_TEST_CHECK( resultMap->Find( Visual::Property::TYPE ) );
430   DALI_TEST_CHECK( resultMap->Find( Visual::Property::TYPE )->Get<int>() == Visual::IMAGE );
431   DALI_TEST_CHECK( resultMap->Find( ImageVisual::Property::URL ) );
432   DALI_TEST_CHECK( resultMap->Find( ImageVisual::Property::URL )->Get<std::string>() == "TestImage" );
433
434   image = ResourceImage::New("TestImage2");
435   control.SetBackgroundImage( image );
436
437   propValue = control.GetProperty( Control::Property::BACKGROUND );
438   resultMap = propValue.GetMap();
439   DALI_TEST_CHECK( resultMap->Find( ImageVisual::Property::URL ) );
440   DALI_TEST_CHECK( resultMap->Find( ImageVisual::Property::URL )->Get<std::string>() == "TestImage2" );
441
442   END_TEST;
443 }
444
445 int UtcDaliControlBackgroundProperties(void)
446 {
447   ToolkitTestApplication application;
448   Control control = Control::New();
449
450   DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::TRANSPARENT, TEST_LOCATION );
451   DALI_TEST_CHECK( control.GetProperty( Control::Property::BACKGROUND ).Get< Property::Map >().Empty() );
452
453   Property::Map imageMap;
454   imageMap[ Visual::Property::TYPE ] = Visual::IMAGE;
455   imageMap[ ImageVisual::Property::URL ] = "TestImage";
456   control.SetProperty( Control::Property::BACKGROUND, imageMap );
457   Property::Value propValue = control.GetProperty( Control::Property::BACKGROUND );
458   Property::Map* resultMap = propValue.GetMap();
459   DALI_TEST_CHECK( resultMap->Find( Visual::Property::TYPE ) );
460   DALI_TEST_EQUALS( resultMap->Find( Visual::Property::TYPE )->Get<int>(),(int)Visual::IMAGE, TEST_LOCATION );
461   DALI_TEST_CHECK( resultMap->Find( ImageVisual::Property::URL ) );
462   DALI_TEST_EQUALS( resultMap->Find( ImageVisual::Property::URL )->Get<std::string>(), "TestImage", TEST_LOCATION );
463
464   Property::Map rendererMap;
465   rendererMap[Visual::Property::TYPE] = Visual::COLOR;
466   rendererMap[ColorVisual::Property::MIX_COLOR] = Color::CYAN;
467   control.SetProperty( Control::Property::BACKGROUND, rendererMap );
468   propValue = control.GetProperty( Control::Property::BACKGROUND );
469   resultMap = propValue.GetMap();
470   DALI_TEST_CHECK( resultMap->Find( Visual::Property::TYPE ) );
471   DALI_TEST_EQUALS( resultMap->Find( Visual::Property::TYPE )->Get<int>(), (int)Visual::COLOR, TEST_LOCATION );
472   DALI_TEST_CHECK( resultMap->Find( ColorVisual::Property::MIX_COLOR ) );
473   DALI_TEST_EQUALS( resultMap->Find( ColorVisual::Property::MIX_COLOR )->Get<Vector4>(), Color::CYAN, TEST_LOCATION );
474
475   Property::Map emptyMap;
476   control.SetProperty( Control::Property::BACKGROUND, emptyMap );
477   DALI_TEST_CHECK( control.GetProperty( Control::Property::BACKGROUND ).Get< Property::Map >().Empty() );
478
479   // set as URL
480   control.SetProperty( Control::Property::BACKGROUND, "Foobar.png" );
481   propValue = control.GetProperty( Control::Property::BACKGROUND );
482   resultMap = propValue.GetMap();
483   DALI_TEST_EQUALS( resultMap->Find( Visual::Property::TYPE )->Get<int>(), (int)Visual::IMAGE, TEST_LOCATION );
484   DALI_TEST_EQUALS( resultMap->Find( ImageVisual::Property::URL )->Get<std::string>(), "Foobar.png", TEST_LOCATION );
485
486   // Deprecated Properties
487   control.SetProperty( Control::Property::BACKGROUND_COLOR, Color::YELLOW );
488   DALI_TEST_EQUALS( control.GetProperty( Control::Property::BACKGROUND_COLOR ).Get< Vector4 >(), Color::YELLOW, TEST_LOCATION );
489   DALI_TEST_EQUALS( control.GetProperty( Control::Property::BACKGROUND_COLOR ).Get< Vector4 >(), control.GetBackgroundColor(), TEST_LOCATION );
490
491   control.ClearBackground();
492
493   Property::Map deprecatedImageMap;
494   deprecatedImageMap[ "filename" ] = "TestImage";
495   control.SetProperty( Control::Property::BACKGROUND_IMAGE, deprecatedImageMap );
496   propValue = control.GetProperty( Control::Property::BACKGROUND_IMAGE );
497   resultMap = propValue.GetMap();
498   DALI_TEST_EQUALS( resultMap->Find( ImageVisual::Property::URL )->Get< std::string >(), "TestImage" , TEST_LOCATION );
499
500   control.SetProperty( Control::Property::BACKGROUND_IMAGE, emptyMap );
501   DALI_TEST_CHECK( control.GetProperty( Control::Property::BACKGROUND_IMAGE ).Get< Property::Map >().Empty() );
502
503   END_TEST;
504 }
505
506 int UtcDaliControlKeyProperties(void)
507 {
508   ToolkitTestApplication application;
509
510   Control control = Control::New();
511   Stage::GetCurrent().Add( control );
512
513   DALI_TEST_EQUALS( control.HasKeyInputFocus(), control.GetProperty( Control::Property::KEY_INPUT_FOCUS ).Get< bool >(), TEST_LOCATION );
514
515   control.SetKeyInputFocus();
516   DALI_TEST_EQUALS( true, control.GetProperty( Control::Property::KEY_INPUT_FOCUS ).Get< bool >(), TEST_LOCATION );
517
518   control.ClearKeyInputFocus();
519   DALI_TEST_EQUALS( false, control.GetProperty( Control::Property::KEY_INPUT_FOCUS ).Get< bool >(), TEST_LOCATION );
520
521   control.SetProperty( Control::Property::KEY_INPUT_FOCUS, true );
522   DALI_TEST_EQUALS( true, control.HasKeyInputFocus(), TEST_LOCATION );
523
524   END_TEST;
525 }
526
527 int UtcDaliControlGestureSignals(void)
528 {
529   ToolkitTestApplication application;
530   ConnectionTracker connectionTracker;
531   Control control = Control::New();
532
533   // Each gesture detector gets created when connecting to the gesture signals
534   DALI_TEST_CHECK( !control.GetTapGestureDetector() );
535   control.ConnectSignal( &connectionTracker, "tapped", &TestVoidCallback );
536   DALI_TEST_CHECK( control.GetTapGestureDetector() );
537
538   DALI_TEST_CHECK( !control.GetPanGestureDetector() );
539   control.ConnectSignal( &connectionTracker, "panned", &TestVoidCallback );
540   DALI_TEST_CHECK( control.GetPanGestureDetector() );
541
542   DALI_TEST_CHECK( !control.GetPinchGestureDetector() );
543   control.ConnectSignal( &connectionTracker, "pinched", &TestVoidCallback );
544   DALI_TEST_CHECK( control.GetPinchGestureDetector() );
545
546   DALI_TEST_CHECK( !control.GetLongPressGestureDetector() );
547   control.ConnectSignal( &connectionTracker, "longPressed",  &TestVoidCallback );
548   DALI_TEST_CHECK( control.GetLongPressGestureDetector() );
549
550   END_TEST;
551 }
552
553 int UtcDaliControlImplKeyInputFocusGainedSignal(void)
554 {
555   ToolkitTestApplication application;
556
557   Control control = Control::New();
558   Stage::GetCurrent().Add( control );
559
560   gKeyInputFocusCallBackCalled = false;
561   control.KeyInputFocusGainedSignal().Connect(&TestKeyInputFocusCallback);
562
563   application.SendNotification();
564   application.Render();
565
566   control.SetKeyInputFocus();
567
568   DALI_TEST_CHECK( control.HasKeyInputFocus() );
569
570   DALI_TEST_CHECK( gKeyInputFocusCallBackCalled );
571
572   END_TEST;
573 }
574
575 int UtcDaliControlImplKeyInputFocusLostSignal(void)
576 {
577   ToolkitTestApplication application;
578
579   Control control = Control::New();
580   Stage::GetCurrent().Add( control );
581
582   gKeyInputFocusCallBackCalled = false;
583   control.KeyInputFocusLostSignal().Connect(&TestKeyInputFocusCallback);
584
585   application.SendNotification();
586   application.Render();
587
588   control.SetKeyInputFocus();
589
590   DALI_TEST_CHECK( control.HasKeyInputFocus() );
591
592   control.ClearKeyInputFocus();
593
594   DALI_TEST_CHECK( gKeyInputFocusCallBackCalled );
595
596   END_TEST;
597 }
598
599 int UtcDaliControlImplGetControlExtensionP(void)
600 {
601   ToolkitTestApplication application;
602   Control control = Control::New();
603
604   Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation( control );
605
606   DALI_TEST_CHECK( NULL == controlImpl.GetControlExtension() );
607
608   END_TEST;
609 }