2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.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
8 // http://floralicense.org/license/
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.
22 #include <dali/public-api/dali-core.h>
23 #include <dali/integration-api/events/key-event-integ.h>
24 #include <dali/integration-api/events/touch-event-integ.h>
26 #include <dali-test-suite-utils.h>
31 static void Startup();
32 static void Cleanup();
36 void (*tet_startup)() = Startup;
37 void (*tet_cleanup)() = Cleanup;
42 POSITIVE_TC_IDX = 0x01,
46 #define MAX_NUMBER_OF_TESTS 10000
48 struct tet_testlist tet_testlist[MAX_NUMBER_OF_TESTS];
51 // Add test functionality for all APIs in the class (Positive and Negative)
52 TEST_FUNCTION( UtcDaliStageDefaultConstructor, POSITIVE_TC_IDX );
53 TEST_FUNCTION( UtcDaliStageDestructor, POSITIVE_TC_IDX );
54 TEST_FUNCTION( UtcDaliStageGetCurrent, POSITIVE_TC_IDX );
55 TEST_FUNCTION( UtcDaliStageIsInstalled, POSITIVE_TC_IDX );
56 TEST_FUNCTION( UtcDaliStageAdd, POSITIVE_TC_IDX );
57 TEST_FUNCTION( UtcDaliStageRemove, POSITIVE_TC_IDX );
58 TEST_FUNCTION( UtcDaliStageGetSize, POSITIVE_TC_IDX );
59 TEST_FUNCTION( UtcDaliStageGetLayerCount, POSITIVE_TC_IDX );
60 TEST_FUNCTION( UtcDaliStageGetLayer, POSITIVE_TC_IDX );
61 TEST_FUNCTION( UtcDaliStageGetRootLayer, POSITIVE_TC_IDX );
62 TEST_FUNCTION( UtcDaliStageSetBackgroundColor, POSITIVE_TC_IDX );
63 TEST_FUNCTION( UtcDaliStageGetBackgroundColor, POSITIVE_TC_IDX );
64 TEST_FUNCTION( UtcDaliStageGetDpi01, POSITIVE_TC_IDX );
65 TEST_FUNCTION( UtcDaliStageGetDpi02, POSITIVE_TC_IDX );
66 TEST_FUNCTION( UtcDaliStageGetDpi03, POSITIVE_TC_IDX );
67 TEST_FUNCTION( UtcDaliStageInitializeDynamics, POSITIVE_TC_IDX );
68 TEST_FUNCTION( UtcDaliStageGetDynamicsWorld, POSITIVE_TC_IDX );
69 TEST_FUNCTION( UtcDaliStageTerminateDynamics, POSITIVE_TC_IDX );
70 TEST_FUNCTION( UtcDaliStageKeepRendering, POSITIVE_TC_IDX );
71 TEST_FUNCTION( UtcDaliStageEventProcessingFinished, POSITIVE_TC_IDX );
72 TEST_FUNCTION( UtcDaliStageSignalKeyEvent, POSITIVE_TC_IDX );
73 TEST_FUNCTION( UtcDaliStageTouchedSignal, POSITIVE_TC_IDX );
79 * Functor for EventProcessingFinished signal
81 struct EventProcessingFinishedFunctor
84 * @param[in] eventProcessingFinished reference to a boolean variable used to check if signal has been called.
86 EventProcessingFinishedFunctor( bool& eventProcessingFinished )
87 : mEventProcessingFinished( eventProcessingFinished )
92 mEventProcessingFinished = true;
95 bool& mEventProcessingFinished;
98 // Stores data that is populated in the key-event callback and will be read by the TET cases
99 struct KeyEventSignalData
102 : functorCalled(false)
107 functorCalled = false;
109 receivedKeyEvent.keyModifier = 0;
110 receivedKeyEvent.keyPressedName.clear();
111 receivedKeyEvent.keyPressed.clear();
115 KeyEvent receivedKeyEvent;
118 // Functor that sets the data when called
119 struct KeyEventReceivedFunctor
121 KeyEventReceivedFunctor( KeyEventSignalData& data ) : signalData( data ) { }
123 bool operator()( const KeyEvent& keyEvent )
125 signalData.functorCalled = true;
126 signalData.receivedKeyEvent = keyEvent;
131 KeyEventSignalData& signalData;
134 // Stores data that is populated in the touched signal callback and will be read by the TET cases
135 struct TouchedSignalData
138 : functorCalled(false)
143 functorCalled = false;
145 receivedTouchEvent.points.clear();
146 receivedTouchEvent.time = 0;
150 TouchEvent receivedTouchEvent;
153 // Functor that sets the data when touched signal is received
154 struct TouchedFunctor
156 TouchedFunctor( TouchedSignalData& data ) : signalData( data ) { }
158 void operator()( const TouchEvent& touch )
160 signalData.functorCalled = true;
161 signalData.receivedTouchEvent = touch;
164 TouchedSignalData& signalData;
167 bool DummyTouchCallback( Actor actor, const TouchEvent& touch )
172 } // unnamed namespace
174 // Called only once before first test is run.
175 static void Startup()
177 // THERE IS NO MAINLOOP IN THE TEST APPLICATION
180 // Called only once after last test is run
181 static void Cleanup()
185 static void UtcDaliStageDefaultConstructor()
187 TestApplication application;
190 DALI_TEST_CHECK(!stage);
193 static void UtcDaliStageDestructor()
195 TestApplication application;
196 Stage* stage = new Stage();
200 DALI_TEST_CHECK( true );
203 static void UtcDaliStageGetCurrent()
205 TestApplication application;
206 Stage stage = Stage::GetCurrent();
208 DALI_TEST_CHECK(stage);
211 static void UtcDaliStageIsInstalled()
213 DALI_TEST_CHECK(!Stage::IsInstalled());
215 TestApplication application;
219 DALI_TEST_CHECK(Stage::IsInstalled());
222 static void UtcDaliStageAdd()
224 TestApplication application;
226 Stage stage = Stage::GetCurrent();
228 Actor actor = Actor::New();
229 DALI_TEST_CHECK(!actor.OnStage());
232 DALI_TEST_CHECK(actor.OnStage());
235 static void UtcDaliStageRemove()
237 TestApplication application;
239 Stage stage = Stage::GetCurrent();
241 Actor actor = Actor::New();
242 DALI_TEST_CHECK(!actor.OnStage());
245 DALI_TEST_CHECK(actor.OnStage());
248 DALI_TEST_CHECK(!actor.OnStage());
251 static void UtcDaliStageGetSize()
253 TestApplication application;
255 Stage stage = Stage::GetCurrent();
257 Vector2 size = stage.GetSize();
259 DALI_TEST_EQUALS(size.width, static_cast<float>(TestApplication::DEFAULT_SURFACE_WIDTH), TEST_LOCATION);
260 DALI_TEST_EQUALS(size.height, static_cast<float>(TestApplication::DEFAULT_SURFACE_HEIGHT), TEST_LOCATION);
263 static void UtcDaliStageGetDpi01()
265 TestApplication application; // Initializes core DPI to default values
267 Stage stage = Stage::GetCurrent();
269 // Test the default DPI.
270 Vector2 dpi = stage.GetDpi();
271 DALI_TEST_EQUALS(dpi.x, static_cast<float>(TestApplication::DEFAULT_HORIZONTAL_DPI), TEST_LOCATION);
272 DALI_TEST_EQUALS(dpi.y, static_cast<float>(TestApplication::DEFAULT_VERTICAL_DPI), TEST_LOCATION);
275 static void UtcDaliStageGetDpi02()
277 TestApplication application; // Initializes core DPI to default values
279 // Test that setting core DPI explicitly also sets up the Stage's DPI.
280 application.GetCore().SetDpi(200, 180);
282 Stage stage = Stage::GetCurrent();
283 Vector2 dpi = stage.GetDpi();
284 DALI_TEST_EQUALS(dpi.x, 200.0f, TEST_LOCATION);
285 DALI_TEST_EQUALS(dpi.y, 180.0f, TEST_LOCATION);
289 static void UtcDaliStageGetDpi03()
291 TestApplication application(480, 800, 72.0f, 120.0f); // Initializes core DPI with specific values
293 Stage stage = Stage::GetCurrent();
295 // Test that setting core DPI explicitly also sets up the Stage's DPI.
296 Vector2 dpi = stage.GetDpi();
297 DALI_TEST_EQUALS(dpi.x, 72.0f, TEST_LOCATION);
298 DALI_TEST_EQUALS(dpi.y, 120.0f, TEST_LOCATION);
301 static void UtcDaliStageInitializeDynamics()
303 TestApplication application;
305 Stage stage = Stage::GetCurrent();
307 DALI_TEST_CHECK( !stage.InitializeDynamics( DynamicsWorldConfig::New() ) );
310 static void UtcDaliStageGetDynamicsWorld()
312 TestApplication application;
314 Stage stage = Stage::GetCurrent();
316 DALI_TEST_CHECK( !stage.GetDynamicsWorld() );
319 static void UtcDaliStageTerminateDynamics()
321 TestApplication application;
323 Stage stage = Stage::GetCurrent();
325 stage.TerminateDynamics();
327 DALI_TEST_CHECK( !stage.GetDynamicsWorld() );
330 static void UtcDaliStageGetLayerCount()
332 TestApplication application;
334 Stage stage = Stage::GetCurrent();
336 // Initially we have a default layer
337 DALI_TEST_EQUALS(stage.GetLayerCount(), 1u, TEST_LOCATION);
339 Layer layer = Layer::New();
342 DALI_TEST_EQUALS(stage.GetLayerCount(), 2u, TEST_LOCATION);
345 static void UtcDaliStageGetLayer()
347 TestApplication application;
349 Stage stage = Stage::GetCurrent();
351 Layer rootLayer = stage.GetLayer(0);
352 DALI_TEST_CHECK(rootLayer);
354 Layer layer = Layer::New();
357 Layer sameLayer = stage.GetLayer(1);
358 DALI_TEST_CHECK(layer == sameLayer);
362 static void UtcDaliStageGetRootLayer()
364 TestApplication application;
366 Stage stage = Stage::GetCurrent();
368 Layer rootLayer = stage.GetLayer(0);
369 DALI_TEST_CHECK( rootLayer );
371 Layer layer = Layer::New();
373 layer.LowerToBottom();
375 DALI_TEST_CHECK( stage.GetRootLayer() == rootLayer );
378 static void UtcDaliStageSetBackgroundColor()
380 TestApplication application;
382 Stage stage = Stage::GetCurrent();
384 Vector4 testColor(0.1f, 0.2f, 0.3f, 1.0f);
385 stage.SetBackgroundColor(testColor);
387 DALI_TEST_EQUALS(testColor, stage.GetBackgroundColor(), TEST_LOCATION);
390 static void UtcDaliStageGetBackgroundColor()
392 TestApplication application;
394 Stage stage = Stage::GetCurrent();
396 DALI_TEST_EQUALS(Stage::DEFAULT_BACKGROUND_COLOR, stage.GetBackgroundColor(), TEST_LOCATION);
399 static void UtcDaliStageKeepRendering()
401 TestApplication application;
403 Stage stage = Stage::GetCurrent();
405 // Run core until it wants to sleep
406 bool keepUpdating( true );
407 while ( keepUpdating )
409 application.SendNotification();
410 keepUpdating = application.Render(1000.0f /*1 second*/);
413 // Force rendering for the next 5 seconds
414 stage.KeepRendering( 5.0f );
416 application.SendNotification();
418 // Test that core wants to sleep after 10 seconds
419 keepUpdating = application.Render(1000.0f /*1 second*/);
420 DALI_TEST_CHECK( keepUpdating );
421 keepUpdating = application.Render(1000.0f /*2 seconds*/);
422 DALI_TEST_CHECK( keepUpdating );
423 keepUpdating = application.Render(1000.0f /*3 seconds*/);
424 DALI_TEST_CHECK( keepUpdating );
425 keepUpdating = application.Render(1000.0f /*4 seconds*/);
426 DALI_TEST_CHECK( keepUpdating );
427 keepUpdating = application.Render(1000.0f /*5 seconds*/);
428 DALI_TEST_CHECK( !keepUpdating );
431 static void UtcDaliStageEventProcessingFinished()
433 TestApplication application;
434 Stage stage = Stage::GetCurrent();
436 bool eventProcessingFinished = false;
437 EventProcessingFinishedFunctor functor( eventProcessingFinished );
438 stage.EventProcessingFinishedSignal().Connect( &application, functor );
440 Actor actor( Actor::New() );
443 application.SendNotification();
444 application.Render();
446 DALI_TEST_CHECK( eventProcessingFinished );
450 static void UtcDaliStageSignalKeyEvent()
452 TestApplication application;
453 Stage stage = Stage::GetCurrent();
455 KeyEventSignalData data;
456 KeyEventReceivedFunctor functor( data );
457 stage.KeyEventSignal().Connect( &application, functor );
459 Integration::KeyEvent event( "i","i", 0, 0, 0, Integration::KeyEvent::Down );
460 application.ProcessEvent( event );
462 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
463 DALI_TEST_CHECK( event.keyModifier == data.receivedKeyEvent.keyModifier );
464 DALI_TEST_CHECK( event.keyName == data.receivedKeyEvent.keyPressedName );
465 DALI_TEST_CHECK( event.keyString == data.receivedKeyEvent.keyPressed );
466 DALI_TEST_CHECK( event.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
470 Integration::KeyEvent event2( "i","i", 0, 0, 0, Integration::KeyEvent::Up );
471 application.ProcessEvent( event2 );
473 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
474 DALI_TEST_CHECK( event2.keyModifier == data.receivedKeyEvent.keyModifier );
475 DALI_TEST_CHECK( event2.keyName == data.receivedKeyEvent.keyPressedName );
476 DALI_TEST_CHECK( event2.keyString == data.receivedKeyEvent.keyPressed );
477 DALI_TEST_CHECK( event2.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
481 Integration::KeyEvent event3( "a","a", 0, 0, 0, Integration::KeyEvent::Down );
482 application.ProcessEvent( event3 );
484 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
485 DALI_TEST_CHECK( event3.keyModifier == data.receivedKeyEvent.keyModifier );
486 DALI_TEST_CHECK( event3.keyName == data.receivedKeyEvent.keyPressedName );
487 DALI_TEST_CHECK( event3.keyString == data.receivedKeyEvent.keyPressed );
488 DALI_TEST_CHECK( event3.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
492 Integration::KeyEvent event4( "a","a", 0, 0, 0, Integration::KeyEvent::Up );
493 application.ProcessEvent( event4 );
495 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
496 DALI_TEST_CHECK( event4.keyModifier == data.receivedKeyEvent.keyModifier );
497 DALI_TEST_CHECK( event4.keyName == data.receivedKeyEvent.keyPressedName );
498 DALI_TEST_CHECK( event4.keyString == data.receivedKeyEvent.keyPressed );
499 DALI_TEST_CHECK( event4.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
502 void UtcDaliStageTouchedSignal()
504 TestApplication application;
505 Stage stage = Stage::GetCurrent();
507 TouchedSignalData data;
508 TouchedFunctor functor( data );
509 stage.TouchedSignal().Connect( &application, functor );
512 application.SendNotification();
513 application.Render();
515 // NO ACTORS, SINGLE TOUCH, DOWN, MOTION THEN UP
517 Integration::TouchEvent touchEvent;
518 touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) );
519 application.ProcessEvent( touchEvent );
521 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
522 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
523 DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
526 touchEvent.points[0].state = TouchPoint::Motion;
527 touchEvent.points[0].screen.x = 12.0f; // Some motion
528 application.ProcessEvent( touchEvent );
530 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
533 touchEvent.points[0].state = TouchPoint::Up;
534 application.ProcessEvent( touchEvent );
536 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
537 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
538 DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
542 // Add an actor to the scene
544 Actor actor = Actor::New();
545 actor.SetSize( 100.0f, 100.0f );
546 actor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
547 actor.SetParentOrigin( ParentOrigin::TOP_LEFT );
548 actor.TouchedSignal().Connect( &DummyTouchCallback );
552 application.SendNotification();
553 application.Render();
555 // ACTOR ON SCENE, SINGLE TOUCH, DOWN IN ACTOR, MOTION THEN UP OUTSIDE ACTOR
557 Integration::TouchEvent touchEvent;
558 touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) );
559 application.ProcessEvent( touchEvent );
561 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
562 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
563 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].hitActor == actor );
566 touchEvent.points[0].state = TouchPoint::Motion;
567 touchEvent.points[0].screen.x = 150.0f; // Some motion
568 application.ProcessEvent( touchEvent );
570 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
573 touchEvent.points[0].state = TouchPoint::Up;
574 application.ProcessEvent( touchEvent );
576 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
577 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
578 DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
582 // INTERRUPTED BEFORE DOWN AND INTERRUPTED AFTER DOWN
584 Integration::TouchEvent touchEvent;
585 touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Interrupted, 10.0f, 10.0f ) );
586 application.ProcessEvent( touchEvent );
588 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
589 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
590 DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
591 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Interrupted );
594 touchEvent.points[0].state = TouchPoint::Down;
595 application.ProcessEvent( touchEvent );
597 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
598 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
599 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].hitActor == actor );
600 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Down );
603 touchEvent.points[0].state = TouchPoint::Interrupted;
604 application.ProcessEvent( touchEvent );
606 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
607 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
608 DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
609 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Interrupted );
613 // MULTIPLE TOUCH, SHOULD ONLY RECEIVE TOUCH ON FIRST DOWN AND LAST UP
615 Integration::TouchEvent touchEvent;
618 touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) );
619 application.ProcessEvent( touchEvent );
620 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
624 touchEvent.points[0].state = TouchPoint::Stationary;
625 touchEvent.points.push_back( TouchPoint( 1, TouchPoint::Down, 50.0f, 50.0f ) );
626 application.ProcessEvent( touchEvent );
627 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
630 // Primary point is up
631 touchEvent.points[0].state = TouchPoint::Up;
632 touchEvent.points[1].state = TouchPoint::Stationary;
633 application.ProcessEvent( touchEvent );
634 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
637 // Remove 1st point now, 2nd point is now in motion
638 touchEvent.points.erase( touchEvent.points.begin() );
639 touchEvent.points[0].state = TouchPoint::Motion;
640 touchEvent.points[0].screen.x = 150.0f;
641 application.ProcessEvent( touchEvent );
642 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
646 touchEvent.points[0].state = TouchPoint::Up;
647 application.ProcessEvent( touchEvent );
648 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );