47a13eca7e8801d9f91cb29dc031d25eae4218b7
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-Control.cpp
1 /*
2  * Copyright (c) 2015 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 UtcDaliControlGetImplementation(void)
208 {
209   ToolkitTestApplication application;
210
211   DummyControl control;
212
213   // Get Empty
214   {
215     try
216     {
217       Toolkit::Internal::Control& controlImpl = control.GetImplementation();
218       (void)controlImpl; // Avoid unused warning
219       tet_result(TET_FAIL);
220     }
221     catch (DaliException &exception)
222     {
223       tet_result(TET_PASS);
224     }
225   }
226
227   // Get Const Empty
228   {
229     try
230     {
231       const DummyControl constControl(control);
232       const Toolkit::Internal::Control& controlImpl = constControl.GetImplementation();
233       (void)controlImpl; // Avoid unused warning
234       tet_result(TET_FAIL);
235     }
236     catch (DaliException &exception)
237     {
238       tet_result(TET_PASS);
239     }
240   }
241
242   control = DummyControl::New();
243
244   // Get
245   {
246     try
247     {
248       Toolkit::Internal::Control& controlImpl = control.GetImplementation();
249       (void)controlImpl; // Avoid unused warning
250       tet_result(TET_PASS);
251     }
252     catch (DaliException &exception)
253     {
254       tet_result(TET_FAIL);
255     }
256   }
257
258   // Get Const
259   {
260     try
261     {
262       const DummyControl constControl(control);
263       const Toolkit::Internal::Control& controlImpl = constControl.GetImplementation();
264       (void)controlImpl; // Avoid unused warning
265       tet_result(TET_PASS);
266     }
267     catch (DaliException &exception)
268     {
269       tet_result(TET_FAIL);
270     }
271   }
272   END_TEST;
273 }
274
275 int UtcDaliControlSignalConnectDisconnect(void)
276 {
277   ToolkitTestApplication application;
278
279   {
280     DummyControl dummy = DummyControlImpl::New();
281
282     Actor actor = Actor::New();
283     DALI_TEST_EQUALS( actor.OnStageSignal().GetConnectionCount(), 0u, TEST_LOCATION );
284     Toolkit::Internal::Control& control = dummy.GetImplementation();
285     DummyControlImpl* dummyImpl = dynamic_cast<DummyControlImpl*>(&control);
286     DALI_TEST_CHECK( dummyImpl );
287
288     actor.OnStageSignal().Connect( dummyImpl, &DummyControlImpl::CustomSlot1 );
289     DALI_TEST_EQUALS( actor.OnStageSignal().GetConnectionCount(), 1u, TEST_LOCATION );
290     DALI_TEST_EQUALS( dummyImpl->mCustomSlot1Called, false, TEST_LOCATION );
291
292     Stage::GetCurrent().Add( actor );
293     DALI_TEST_EQUALS( dummyImpl->mCustomSlot1Called, true, TEST_LOCATION );
294
295     dummyImpl->mCustomSlot1Called = false;
296     actor.OnStageSignal().Disconnect( dummyImpl, &DummyControlImpl::CustomSlot1 );
297     DALI_TEST_EQUALS( actor.OnStageSignal().GetConnectionCount(), 0u, TEST_LOCATION );
298     Stage::GetCurrent().Remove( actor );
299     Stage::GetCurrent().Add( actor );
300     DALI_TEST_EQUALS( dummyImpl->mCustomSlot1Called, false, TEST_LOCATION );
301   }
302   END_TEST;
303 }
304
305 int UtcDaliControlSignalAutomaticDisconnect(void)
306 {
307   ToolkitTestApplication application;
308
309   Actor actor = Actor::New();
310
311   {
312     DummyControl dummy = DummyControlImpl::New();
313     Toolkit::Internal::Control& control = dummy.GetImplementation();
314     DummyControlImpl* dummyImpl = dynamic_cast<DummyControlImpl*>(&control);
315     DALI_TEST_CHECK( dummyImpl );
316
317     actor.OnStageSignal().Connect( dummyImpl, &DummyControlImpl::CustomSlot1 );
318     DALI_TEST_EQUALS( actor.OnStageSignal().GetConnectionCount(), 1u, TEST_LOCATION );
319     DALI_TEST_EQUALS( dummyImpl->mCustomSlot1Called, false, TEST_LOCATION );
320
321     Stage::GetCurrent().Add( actor );
322     DALI_TEST_EQUALS( dummyImpl->mCustomSlot1Called, true, TEST_LOCATION );
323     Stage::GetCurrent().Remove( actor );
324   }
325   // dummyControl automatically disconnects
326
327   DALI_TEST_EQUALS( actor.OnStageSignal().GetConnectionCount(), 0u, TEST_LOCATION );
328
329   const Vector3 ignoredSize( 20, 20, 0 );
330   actor.SetSize( ignoredSize );
331   END_TEST;
332 }
333
334 int UtcDaliControlTestParameters(void)
335 {
336   ToolkitTestApplication application;
337   DummyControl test = DummyControl::New();
338
339   test.SetSize( 0.7f, 0.7f, 0.7f );
340
341   Stage::GetCurrent().Add( test );
342
343   application.SendNotification();
344   application.Render();
345
346   float width = 640.0f;
347   float height = test.GetHeightForWidth( width );
348   DALI_TEST_EQUALS( 640.0f, height, TEST_LOCATION );
349   DALI_TEST_EQUALS( 640.0f, test.GetWidthForHeight( height ), TEST_LOCATION );
350
351   test.KeyEventSignal();
352
353   // Provide coverage for pointer destructor
354   Control* testControlPtr = new Control;
355   DALI_TEST_CHECK( testControlPtr );
356   delete testControlPtr;
357   END_TEST;
358 }
359
360 int UtcDaliControlBackgroundColor(void)
361 {
362   ToolkitTestApplication application;
363   Control control = Control::New();
364
365   DALI_TEST_CHECK( !control.GetBackgroundActor() );
366   DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::TRANSPARENT, TEST_LOCATION );
367
368   control.SetBackgroundColor( Color::RED );
369   DALI_TEST_CHECK( control.GetBackgroundActor() );
370   DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::RED, TEST_LOCATION );
371
372   END_TEST;
373 }
374
375 int UtcDaliControlBackgroundImage(void)
376 {
377   ToolkitTestApplication application;
378   Control control = Control::New();
379
380   DALI_TEST_CHECK( !control.GetBackgroundActor() );
381   DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::TRANSPARENT, TEST_LOCATION );
382
383   Image image = ResourceImage::New("TestImage");
384   control.SetBackgroundImage( image );
385   DALI_TEST_CHECK( control.GetBackgroundActor() );
386   DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::WHITE, TEST_LOCATION );
387
388   control.SetBackgroundColor( Color::GREEN );
389   DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::GREEN, TEST_LOCATION );
390
391   control.ClearBackground();
392   DALI_TEST_CHECK( !control.GetBackgroundActor() );
393   DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::TRANSPARENT, TEST_LOCATION );
394
395   control.SetBackgroundColor( Color::YELLOW );
396   control.SetBackgroundImage( image );
397   DALI_TEST_CHECK( control.GetBackgroundActor() );
398   DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::YELLOW, TEST_LOCATION );
399
400   END_TEST;
401 }
402
403 int UtcDaliControlBackgroundProperties(void)
404 {
405   ToolkitTestApplication application;
406   Control control = Control::New();
407
408   DALI_TEST_CHECK( !control.GetBackgroundActor() );
409   DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::TRANSPARENT, TEST_LOCATION );
410   DALI_TEST_EQUALS( control.GetProperty( Control::Property::BACKGROUND_COLOR ).Get< Vector4 >(), Color::TRANSPARENT, TEST_LOCATION );
411   DALI_TEST_CHECK( control.GetProperty( Control::Property::BACKGROUND_IMAGE ).Get< Property::Map >().Empty() );
412
413   control.SetProperty( Control::Property::BACKGROUND_COLOR, Color::RED );
414   DALI_TEST_CHECK( control.GetBackgroundActor() );
415   DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::RED, TEST_LOCATION );
416   DALI_TEST_EQUALS( control.GetProperty( Control::Property::BACKGROUND_COLOR ).Get< Vector4 >(), Color::RED, TEST_LOCATION );
417
418   Property::Map imageMap;
419   imageMap[ "filename" ] = "TestImage";
420   Property::Map map;
421   map[ "image" ] = imageMap;
422   control.SetProperty( Control::Property::BACKGROUND_IMAGE, map );
423   DALI_TEST_CHECK( control.GetBackgroundActor() );
424   DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::RED, TEST_LOCATION );
425   DALI_TEST_EQUALS( control.GetProperty( Control::Property::BACKGROUND_COLOR ).Get< Vector4 >(), Color::RED, TEST_LOCATION );
426
427   Property::Value propValue = control.GetProperty( Control::Property::BACKGROUND_IMAGE );
428   DALI_TEST_CHECK( propValue.HasKey( "image" ) );
429   DALI_TEST_CHECK( propValue.GetValue( "image" ).HasKey( "filename" ) );
430   DALI_TEST_CHECK( propValue.GetValue( "image" ).GetValue( "filename" ).Get< std::string>() == "TestImage" );
431
432   Property::Map emptyMap;
433   control.SetProperty( Control::Property::BACKGROUND_IMAGE, emptyMap );
434   DALI_TEST_CHECK( !control.GetBackgroundActor() );
435   DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::TRANSPARENT, TEST_LOCATION );
436   DALI_TEST_EQUALS( control.GetProperty( Control::Property::BACKGROUND_COLOR ).Get< Vector4 >(), Color::TRANSPARENT, TEST_LOCATION );
437   DALI_TEST_CHECK( control.GetProperty( Control::Property::BACKGROUND_IMAGE ).Get< Property::Map >().Empty() );
438
439   END_TEST;
440 }
441
442 int UtcDaliControlKeyProperties(void)
443 {
444   ToolkitTestApplication application;
445
446   Control control = Control::New();
447   Stage::GetCurrent().Add( control );
448
449   DALI_TEST_EQUALS( control.HasKeyInputFocus(), control.GetProperty( Control::Property::KEY_INPUT_FOCUS ).Get< bool >(), TEST_LOCATION );
450
451   control.SetKeyInputFocus();
452   DALI_TEST_EQUALS( true, control.GetProperty( Control::Property::KEY_INPUT_FOCUS ).Get< bool >(), TEST_LOCATION );
453
454   control.ClearKeyInputFocus();
455   DALI_TEST_EQUALS( false, control.GetProperty( Control::Property::KEY_INPUT_FOCUS ).Get< bool >(), TEST_LOCATION );
456
457   control.SetProperty( Control::Property::KEY_INPUT_FOCUS, true );
458   DALI_TEST_EQUALS( true, control.HasKeyInputFocus(), TEST_LOCATION );
459
460   END_TEST;
461 }
462
463 int UtcDaliControlGestureSignals(void)
464 {
465   ToolkitTestApplication application;
466   ConnectionTracker connectionTracker;
467   Control control = Control::New();
468
469   // Each gesture detector gets created when connecting to the gesture signals
470   DALI_TEST_CHECK( !control.GetTapGestureDetector() );
471   control.ConnectSignal( &connectionTracker, "tapped", &TestVoidCallback );
472   DALI_TEST_CHECK( control.GetTapGestureDetector() );
473
474   DALI_TEST_CHECK( !control.GetPanGestureDetector() );
475   control.ConnectSignal( &connectionTracker, "panned", &TestVoidCallback );
476   DALI_TEST_CHECK( control.GetPanGestureDetector() );
477
478   DALI_TEST_CHECK( !control.GetPinchGestureDetector() );
479   control.ConnectSignal( &connectionTracker, "pinched", &TestVoidCallback );
480   DALI_TEST_CHECK( control.GetPinchGestureDetector() );
481
482   DALI_TEST_CHECK( !control.GetLongPressGestureDetector() );
483   control.ConnectSignal( &connectionTracker, "long-pressed", &TestVoidCallback );
484   DALI_TEST_CHECK( control.GetLongPressGestureDetector() );
485
486   END_TEST;
487 }
488
489 int UtcDaliControlImplKeyInputFocusGainedSignal(void)
490 {
491   ToolkitTestApplication application;
492
493   Control control = Control::New();
494   Stage::GetCurrent().Add( control );
495
496   gKeyInputFocusCallBackCalled = false;
497   control.KeyInputFocusGainedSignal().Connect(&TestKeyInputFocusCallback);
498
499   application.SendNotification();
500   application.Render();
501
502   control.SetKeyInputFocus();
503
504   DALI_TEST_CHECK( control.HasKeyInputFocus() );
505
506   DALI_TEST_CHECK( gKeyInputFocusCallBackCalled );
507
508   END_TEST;
509 }
510
511 int UtcDaliControlImplKeyInputFocusLostSignal(void)
512 {
513   ToolkitTestApplication application;
514
515   Control control = Control::New();
516   Stage::GetCurrent().Add( control );
517
518   gKeyInputFocusCallBackCalled = false;
519   control.KeyInputFocusLostSignal().Connect(&TestKeyInputFocusCallback);
520
521   application.SendNotification();
522   application.Render();
523
524   control.SetKeyInputFocus();
525
526   DALI_TEST_CHECK( control.HasKeyInputFocus() );
527
528   control.ClearKeyInputFocus();
529
530   DALI_TEST_CHECK( gKeyInputFocusCallBackCalled );
531
532   END_TEST;
533 }