80a8f70fea1c99ade2feb1ab19134ecb077d5ccc
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-Button.cpp
1 /*
2  * Copyright (c) 2014 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 <dali/integration-api/events/touch-event-integ.h>
28
29 using namespace Dali;
30 using namespace Toolkit;
31
32
33 void utc_dali_toolkit_button_startup(void)
34 {
35   test_return_value = TET_UNDEF;
36 }
37
38 void utc_dali_toolkit_button_cleanup(void)
39 {
40   test_return_value = TET_PASS;
41 }
42
43 namespace
44 {
45 static bool gIsCalledButtonCallback = false;
46
47 static bool ButtonCallback( Button button )
48 {
49   gIsCalledButtonCallback = true;
50   return false;
51 }
52
53 struct CallbackFunctor
54 {
55   CallbackFunctor(bool* callbackFlag)
56   : mCallbackFlag( callbackFlag )
57   {
58   }
59
60   void operator()()
61   {
62     *mCallbackFlag = true;
63   }
64   bool* mCallbackFlag;
65 };
66
67
68 Image CreateSolidColorImage( const Vector4& color, unsigned int width, unsigned int height )
69 {
70   BufferImage imageData = BufferImage::New( width, height, Pixel::RGBA8888 );
71
72   // Create the image
73   PixelBuffer* pixbuf = imageData.GetBuffer();
74   unsigned int size = width * height;
75
76   for( size_t i = 0; i < size; i++ )
77     {
78       pixbuf[i*4+0] = 0xFF * color.r;
79       pixbuf[i*4+1] = 0xFF * color.g;
80       pixbuf[i*4+2] = 0xFF * color.b;
81       pixbuf[i*4+3] = 0xFF * color.a;
82     }
83
84   imageData.Update();
85
86   return imageData;
87 }
88
89 Dali::Integration::Point GetPointDownInside()
90 {
91   Dali::Integration::Point point;
92   point.SetState( PointState::DOWN );
93   point.SetScreenPosition( Vector2( 240, 400 ) );
94   return point;
95 }
96
97 Dali::Integration::Point GetPointUpInside()
98 {
99   Dali::Integration::Point point;
100   point.SetState( PointState::UP );
101   point.SetScreenPosition( Vector2( 240, 400 ) );
102   return point;
103 }
104
105 Dali::Integration::Point GetPointLeave()
106 {
107   Dali::Integration::Point point;
108   point.SetState( PointState::LEAVE );
109   point.SetScreenPosition( Vector2( 240, 400 ) );
110   return point;
111 }
112
113 Dali::Integration::Point GetPointEnter()
114 {
115   Dali::Integration::Point point;
116   point.SetState( PointState::MOTION );
117   point.SetScreenPosition( Vector2( 240, 400 ) );
118   return point;
119 }
120
121 Dali::Integration::Point GetPointDownOutside()
122 {
123   Dali::Integration::Point point;
124   point.SetState( PointState::DOWN );
125   point.SetScreenPosition( Vector2( 10, 10 ) );
126   return point;
127 }
128
129 Dali::Integration::Point GetPointUpOutside()
130 {
131   Dali::Integration::Point point;
132   point.SetState( PointState::UP );
133   point.SetScreenPosition( Vector2( 10, 10 ) );
134   return point;
135 }
136
137
138 static float ANIMATION_TIME( 0.5f );
139 } // namespace
140
141 int UtcDaliButtonConstructorP(void)
142 {
143   TestApplication application;
144
145   Button button;
146
147   DALI_TEST_CHECK( !button );
148   END_TEST;
149 }
150
151 int UtcDaliButtonCopyConstructorP(void)
152 {
153   TestApplication application;
154
155   // Initialize an object, ref count == 1
156   Button button = PushButton::New();
157
158   Button copy( button );
159   DALI_TEST_CHECK( copy );
160   END_TEST;
161 }
162
163 int UtcDaliButtonAssignmentOperatorP(void)
164 {
165   TestApplication application;
166
167   Button button = PushButton::New();
168
169   Button copy( button );
170   DALI_TEST_CHECK( copy );
171
172   DALI_TEST_CHECK( button == copy );
173   END_TEST;
174 }
175
176 int UtcDaliButtonDownCastP(void)
177 {
178   TestApplication application;
179
180   Button button = PushButton::New();
181
182   BaseHandle object(button);
183
184   Button button2 = Button::DownCast( object );
185   DALI_TEST_CHECK(button2);
186
187   Button button3 = DownCast< Button >(object);
188   DALI_TEST_CHECK(button3);
189   END_TEST;
190 }
191
192 int UtcDaliButtonDownCastN(void)
193 {
194   TestApplication application;
195
196   BaseHandle unInitializedObject;
197
198   Button button1 = Button::DownCast( unInitializedObject );
199   DALI_TEST_CHECK( !button1 );
200
201   Button button2 = DownCast< Button >( unInitializedObject );
202   DALI_TEST_CHECK( !button2 );
203   END_TEST;
204 }
205
206 int UtcDaliButtonSetDisabledP(void)
207 {
208   ToolkitTestApplication application;
209
210   Button button = PushButton::New();
211
212   button.SetDisabled( true );
213
214   DALI_TEST_CHECK( button.IsDisabled() );
215
216   button.SetDisabled( false );
217
218   DALI_TEST_CHECK( !button.IsDisabled() );
219
220   button.SetDisabled( true );
221
222   DALI_TEST_CHECK( button.IsDisabled() );
223
224   button.SetDisabled( false );
225
226   DALI_TEST_CHECK( !button.IsDisabled() );
227   END_TEST;
228 }
229
230 int UtcDaliButtonIsDisabledP(void)
231 {
232   ToolkitTestApplication application;
233
234   Button button = PushButton::New();
235
236   button.SetDisabled( true );
237
238   DALI_TEST_CHECK( button.IsDisabled() );
239
240   button.SetDisabled( false );
241
242   DALI_TEST_CHECK( !button.IsDisabled() );
243   END_TEST;
244 }
245
246 int UtcDaliButtonSetAutoRepeatingP(void)
247 {
248   ToolkitTestApplication application;
249
250   Button button = PushButton::New();
251
252   button.SetAutoRepeating( true );
253
254   DALI_TEST_CHECK( button.IsAutoRepeating() );
255
256   button.SetAutoRepeating( false );
257
258   DALI_TEST_CHECK( !button.IsAutoRepeating() );
259
260   button.SetAutoRepeating( true );
261
262   DALI_TEST_CHECK( button.IsAutoRepeating() );
263
264   button.SetAutoRepeating( false );
265
266   DALI_TEST_CHECK( !button.IsAutoRepeating() );
267   END_TEST;
268 }
269
270 int UtcDaliButtonIsAutoRepeatingP(void)
271 {
272   ToolkitTestApplication application;
273
274   Button button = PushButton::New();
275
276   button.SetAutoRepeating( true );
277
278   DALI_TEST_CHECK( button.IsAutoRepeating() );
279
280   button.SetAutoRepeating( false );
281
282   DALI_TEST_CHECK( !button.IsAutoRepeating() );
283   END_TEST;
284 }
285
286 int UtcDaliButtonSetInitialAutoRepeatingDelayP(void)
287 {
288   ToolkitTestApplication application;
289
290   Button button = PushButton::New();
291
292   button.SetInitialAutoRepeatingDelay( 0.5f );
293
294   DALI_TEST_EQUALS( button.GetInitialAutoRepeatingDelay(), 0.5f, TEST_LOCATION );
295
296   button.SetInitialAutoRepeatingDelay( 0.2f );
297
298   DALI_TEST_EQUALS( button.GetInitialAutoRepeatingDelay(), 0.2f, TEST_LOCATION );
299   END_TEST;
300 }
301
302 int UtcDaliButtonSetNextAutoRepeatingDelayP(void)
303 {
304   ToolkitTestApplication application;
305
306   Button button = PushButton::New();
307
308   button.SetNextAutoRepeatingDelay( 0.5f );
309
310   DALI_TEST_EQUALS( button.GetNextAutoRepeatingDelay(), 0.5f, TEST_LOCATION );
311
312   button.SetNextAutoRepeatingDelay( 0.2f );
313
314   DALI_TEST_EQUALS( button.GetNextAutoRepeatingDelay(), 0.2f, TEST_LOCATION );
315   END_TEST;
316 }
317
318 int UtcDaliButtonSetTogglableButtonP(void)
319 {
320   ToolkitTestApplication application;
321
322   Button button = PushButton::New();
323
324   button.SetTogglableButton( true );
325
326   DALI_TEST_CHECK( button.IsTogglableButton() );
327
328   button.SetTogglableButton( false );
329
330   DALI_TEST_CHECK( !button.IsTogglableButton() );
331   END_TEST;
332 }
333
334 int UtcDaliButtonSetSelectedP(void)
335 {
336   ToolkitTestApplication application;
337
338   Button button = PushButton::New();
339   button.SetTogglableButton( true );
340
341   button.SetSelected( true );
342
343   DALI_TEST_CHECK( button.IsSelected() );
344
345   button.SetSelected( false );
346
347   DALI_TEST_CHECK( !button.IsSelected() );
348   END_TEST;
349 }
350
351 int UtcDaliButtonSetAnimationTimeP(void)
352 {
353   ToolkitTestApplication application;
354   tet_infoline(" UtcDaliButtonSetAnimationTimeP");
355
356   Button button = PushButton::New();
357
358   button.SetAnimationTime( ANIMATION_TIME );
359
360   DALI_TEST_EQUALS( button.GetAnimationTime(), ANIMATION_TIME, TEST_LOCATION );
361   END_TEST;
362 }
363
364 int UtcDaliButtonSetLabelStringP(void)
365 {
366   ToolkitTestApplication application;
367
368   Button button = PushButton::New();
369
370   button.SetLabelText( "Button Label" );
371
372   DALI_TEST_EQUALS( button.GetLabelText(), "Button Label", TEST_LOCATION );
373   END_TEST;
374 }
375
376 int UtcDaliButtonSetLabelActorP(void)
377 {
378   ToolkitTestApplication application;
379
380   Button button = PushButton::New();
381
382   button.SetLabelText( "Button Label" );
383
384   DALI_TEST_EQUALS( button.GetLabelText(), "Button Label", TEST_LOCATION );
385   END_TEST;
386 }
387
388 int UtcDaliButtonSetUnselectedImageP(void)
389 {
390   ToolkitTestApplication application;
391   tet_infoline(" UtcDaliButtonSetUnselectedImageP");
392
393   PushButton pushButton = PushButton::New();
394   Stage::GetCurrent().Add( pushButton );
395
396   application.SendNotification();
397   application.Render();
398
399   pushButton.SetSize( Vector2( 20.0f, 20.0f ) );
400   pushButton.SetUnselectedImage( "Image.jpg" );
401
402   application.SendNotification();
403   application.Render();
404
405   Vector3 size = pushButton.GetCurrentSize();
406
407   DALI_TEST_EQUALS( size.width, 20.f, TEST_LOCATION );
408   DALI_TEST_EQUALS( size.height, 20.f, TEST_LOCATION );
409
410   END_TEST;
411 }
412
413 int UtcDaliButtonSetSelectedImageP(void)
414 {
415   ToolkitTestApplication application;
416   tet_infoline(" UtcDaliButtonSetButtonImage");
417
418   PushButton pushButton = PushButton::New();
419   Stage::GetCurrent().Add( pushButton );
420
421   application.SendNotification();
422   application.Render();
423
424   pushButton.SetSize( Vector2( 20.0f, 20.0f ) );
425   pushButton.SetSelectedImage( "Image.jpg" );
426
427   application.SendNotification();
428   application.Render();
429
430   Vector3 size = pushButton.GetCurrentSize();
431
432   DALI_TEST_EQUALS( size.width, 20.f, TEST_LOCATION );
433   DALI_TEST_EQUALS( size.height, 20.f, TEST_LOCATION );
434
435   END_TEST;
436 }
437
438 int UtcDaliButtonPressedSignalP(void)
439 {
440   ToolkitTestApplication application;
441   tet_infoline(" UtcDaliButtonPressedSignalP");
442
443   Button button = PushButton::New();
444   button.SetAnchorPoint( AnchorPoint::TOP_LEFT );
445   button.SetParentOrigin( ParentOrigin::TOP_LEFT );
446   button.SetPosition( 240, 400 );
447   button.SetSize( 100, 100 );
448
449   Stage::GetCurrent().Add( button );
450
451   application.SendNotification();
452   application.Render();
453
454   // connect to its touch signal
455   ConnectionTracker* testTracker = new ConnectionTracker();
456   button.PressedSignal().Connect( &ButtonCallback );
457   button.ReleasedSignal().Connect( &ButtonCallback );
458   bool pressedSignal = false;
459   bool releasedSignal = false;
460   button.ConnectSignal( testTracker, "pressed",   CallbackFunctor(&pressedSignal) );
461   button.ConnectSignal( testTracker, "released",  CallbackFunctor(&releasedSignal) );
462
463   Dali::Integration::TouchEvent event;
464
465   // Test1. Touch point down and up inside the button.
466
467   gIsCalledButtonCallback = false;
468   event = Dali::Integration::TouchEvent();
469   event.AddPoint( GetPointDownInside() );
470   application.ProcessEvent( event );
471
472   DALI_TEST_CHECK( gIsCalledButtonCallback );
473   DALI_TEST_CHECK( pressedSignal );
474
475   gIsCalledButtonCallback = false;
476   event = Dali::Integration::TouchEvent();
477   event.AddPoint( GetPointUpInside() );
478   application.ProcessEvent( event );
479
480   DALI_TEST_CHECK( gIsCalledButtonCallback );
481   DALI_TEST_CHECK( releasedSignal );
482
483   // Test2. Touch point down and up outside the button.
484
485   pressedSignal = false;
486   releasedSignal = false;
487   gIsCalledButtonCallback = false;
488   event = Dali::Integration::TouchEvent();
489   event.AddPoint( GetPointDownOutside() );
490   application.ProcessEvent( event );
491
492   DALI_TEST_CHECK( !gIsCalledButtonCallback );
493   DALI_TEST_CHECK( !pressedSignal );
494
495   gIsCalledButtonCallback = false;
496   event = Dali::Integration::TouchEvent();
497   event.AddPoint( GetPointUpOutside() );
498   application.ProcessEvent( event );
499
500   DALI_TEST_CHECK( !gIsCalledButtonCallback );
501   DALI_TEST_CHECK( !releasedSignal );
502
503   // Test3. Touch point down inside and up outside the button.
504
505   gIsCalledButtonCallback = false;
506   event = Dali::Integration::TouchEvent();
507   event.AddPoint( GetPointDownInside() );
508   application.ProcessEvent( event );
509
510   DALI_TEST_CHECK( gIsCalledButtonCallback );
511
512   gIsCalledButtonCallback = false;
513   event = Dali::Integration::TouchEvent();
514   event.AddPoint( GetPointLeave() );
515   application.ProcessEvent( event );
516
517   event = Dali::Integration::TouchEvent();
518   event.AddPoint( GetPointUpOutside() );
519   application.ProcessEvent( event );
520
521   DALI_TEST_CHECK( gIsCalledButtonCallback );
522
523   // Test4. Touch point down outside and up inside the button.
524
525   gIsCalledButtonCallback = false;
526   event = Dali::Integration::TouchEvent();
527   event.AddPoint( GetPointDownOutside() );
528   application.ProcessEvent( event );
529
530   DALI_TEST_CHECK( !gIsCalledButtonCallback );
531
532   gIsCalledButtonCallback = false;
533   event = Dali::Integration::TouchEvent();
534   event.AddPoint( GetPointEnter() );
535   application.ProcessEvent( event );
536
537   event = Dali::Integration::TouchEvent();
538   event.AddPoint( GetPointUpInside() );
539   application.ProcessEvent( event );
540
541   DALI_TEST_CHECK( !gIsCalledButtonCallback );
542   END_TEST;
543 }
544
545 int UtcDaliButtonClickedSignalP(void)
546 {
547   ToolkitTestApplication application;
548   tet_infoline(" UtcDaliButtonClickedSignalP");
549
550   Button button = PushButton::New();
551   button.SetAnchorPoint( AnchorPoint::TOP_LEFT );
552   button.SetParentOrigin( ParentOrigin::TOP_LEFT );
553   button.SetPosition( 240, 400 );
554   button.SetSize( 100, 100 );
555
556   Stage::GetCurrent().Add( button );
557
558   application.SendNotification();
559   application.Render();
560
561   // connect to its touch signal
562   button.ClickedSignal().Connect( &ButtonCallback );
563   bool clickedSignal = false;
564   ConnectionTracker* testTracker = new ConnectionTracker();
565   button.ConnectSignal( testTracker, "clicked",   CallbackFunctor(&clickedSignal) );
566
567   Dali::Integration::TouchEvent event;
568
569   // Test1. Touch point down and up inside the button.
570
571   gIsCalledButtonCallback = false;
572   event = Dali::Integration::TouchEvent();
573   event.AddPoint( GetPointDownInside() );
574   application.ProcessEvent( event );
575
576   event = Dali::Integration::TouchEvent();
577   event.AddPoint( GetPointUpInside() );
578   application.ProcessEvent( event );
579
580   DALI_TEST_CHECK( gIsCalledButtonCallback );
581   DALI_TEST_CHECK( clickedSignal );
582
583   // Test2. Touch point down and up outside the button.
584
585   gIsCalledButtonCallback = false;
586   clickedSignal = false;
587   event = Dali::Integration::TouchEvent();
588   event.AddPoint( GetPointDownOutside() );
589   application.ProcessEvent( event );
590
591   event = Dali::Integration::TouchEvent();
592   event.AddPoint( GetPointUpOutside() );
593   application.ProcessEvent( event );
594
595   DALI_TEST_CHECK( !gIsCalledButtonCallback );
596   DALI_TEST_CHECK( !clickedSignal );
597
598   // Test3. Touch point down inside and up outside the button.
599
600   gIsCalledButtonCallback = false;
601   clickedSignal = false;
602   event = Dali::Integration::TouchEvent();
603   event.AddPoint( GetPointDownInside() );
604   application.ProcessEvent( event );
605
606   event = Dali::Integration::TouchEvent();
607   event.AddPoint( GetPointLeave() );
608   application.ProcessEvent( event );
609
610   event = Dali::Integration::TouchEvent();
611   event.AddPoint( GetPointUpOutside() );
612   application.ProcessEvent( event );
613
614   DALI_TEST_CHECK( !gIsCalledButtonCallback );
615   DALI_TEST_CHECK( !clickedSignal );
616
617   // Test4. Touch point down outside and up inside the button.
618
619   gIsCalledButtonCallback = false;
620   clickedSignal = false;
621   event = Dali::Integration::TouchEvent();
622   event.AddPoint( GetPointDownOutside() );
623   application.ProcessEvent( event );
624
625   event = Dali::Integration::TouchEvent();
626   event.AddPoint( GetPointEnter() );
627   application.ProcessEvent( event );
628
629   event = Dali::Integration::TouchEvent();
630   event.AddPoint( GetPointUpInside() );
631   application.ProcessEvent( event );
632
633   DALI_TEST_CHECK( !gIsCalledButtonCallback );
634   DALI_TEST_CHECK( !clickedSignal );
635   END_TEST;
636 }
637
638 int UtcDaliButtonStateChangedSignalP(void)
639 {
640   ToolkitTestApplication application;
641   tet_infoline(" UtcDaliButtonStateChangedSignalP");
642
643   Button button = PushButton::New();
644   button.SetTogglableButton( true );
645
646   Stage::GetCurrent().Add( button );
647
648   application.SendNotification();
649   application.Render();
650
651   // connect to its signal
652   button.StateChangedSignal().Connect( &ButtonCallback );
653   bool stateChangedSignal = false;
654   ConnectionTracker* testTracker = new ConnectionTracker();
655   button.ConnectSignal( testTracker, "stateChanged",   CallbackFunctor(&stateChangedSignal) );
656
657   gIsCalledButtonCallback = false;
658   button.SetSelected( true );
659
660   DALI_TEST_CHECK( gIsCalledButtonCallback );
661   DALI_TEST_CHECK( stateChangedSignal );
662
663   gIsCalledButtonCallback = false;
664   stateChangedSignal = false;
665
666   button.SetSelected( false );
667
668   DALI_TEST_CHECK( gIsCalledButtonCallback );
669   DALI_TEST_CHECK( stateChangedSignal );
670   END_TEST;
671 }
672
673 int UtcDaliButtonSetProperty(void)
674 {
675   tet_infoline("UtcDaliButtonSetProperty: ");
676   ToolkitTestApplication application;
677
678   PushButton pushButton = PushButton::New();
679
680   pushButton.SetProperty(pushButton.GetPropertyIndex("disabled"), false);
681   DALI_TEST_CHECK( false == pushButton.IsDisabled() );
682
683   pushButton.SetProperty(pushButton.GetPropertyIndex("disabled"), true);
684   DALI_TEST_CHECK( true == pushButton.IsDisabled() );
685
686   END_TEST;
687 }
688
689 int UtcDaliButtonSize(void)
690 {
691   ToolkitTestApplication application;
692   tet_infoline(" UtcDaliButtonSize");
693
694   // First an image is set, then SetSize is called.
695   PushButton pushButton = PushButton::New();
696   Stage::GetCurrent().Add( pushButton );
697
698   pushButton.SetBackgroundImage( "Image.jpg" );
699   pushButton.SetSize( 10.f, 10.f );
700
701   application.SendNotification();
702   application.Render();
703
704   Vector3 size = pushButton.GetCurrentSize();
705
706   DALI_TEST_EQUALS( size.width, 10.f, TEST_LOCATION );
707   DALI_TEST_EQUALS( size.height, 10.f, TEST_LOCATION );
708   END_TEST;
709 }