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.
21 #include <dali/dali.h>
22 #include <dali/integration-api/events/key-event-integ.h>
23 #include <dali/integration-api/events/touch-event-integ.h>
25 #include <dali-test-suite-utils.h>
30 void stage_test_startup(void)
32 test_return_value = TET_UNDEF;
35 void stage_test_cleanup(void)
37 test_return_value = TET_PASS;
44 * Functor for EventProcessingFinished signal
46 struct EventProcessingFinishedFunctor
49 * @param[in] eventProcessingFinished reference to a boolean variable used to check if signal has been called.
51 EventProcessingFinishedFunctor( bool& eventProcessingFinished )
52 : mEventProcessingFinished( eventProcessingFinished )
57 mEventProcessingFinished = true;
60 bool& mEventProcessingFinished;
63 // Stores data that is populated in the key-event callback and will be read by the TET cases
64 struct KeyEventSignalData
67 : functorCalled(false)
72 functorCalled = false;
74 receivedKeyEvent.keyModifier = 0;
75 receivedKeyEvent.keyPressedName.clear();
76 receivedKeyEvent.keyPressed.clear();
80 KeyEvent receivedKeyEvent;
83 // Functor that sets the data when called
84 struct KeyEventReceivedFunctor
86 KeyEventReceivedFunctor( KeyEventSignalData& data ) : signalData( data ) { }
88 bool operator()( const KeyEvent& keyEvent )
90 signalData.functorCalled = true;
91 signalData.receivedKeyEvent = keyEvent;
96 KeyEventSignalData& signalData;
99 // Stores data that is populated in the touched signal callback and will be read by the TET cases
100 struct TouchedSignalData
103 : functorCalled(false)
108 functorCalled = false;
110 receivedTouchEvent.points.clear();
111 receivedTouchEvent.time = 0;
115 TouchEvent receivedTouchEvent;
118 // Functor that sets the data when touched signal is received
119 struct TouchedFunctor
121 TouchedFunctor( TouchedSignalData& data ) : signalData( data ) { }
123 void operator()( const TouchEvent& touch )
125 signalData.functorCalled = true;
126 signalData.receivedTouchEvent = touch;
129 TouchedSignalData& signalData;
132 bool DummyTouchCallback( Actor actor, const TouchEvent& touch )
137 } // unnamed namespace
140 int UtcDaliStageDefaultConstructor(void)
142 TestApplication application;
145 DALI_TEST_CHECK(!stage);
149 int UtcDaliStageDestructor(void)
151 TestApplication application;
152 Stage* stage = new Stage();
156 DALI_TEST_CHECK( true );
160 int UtcDaliStageGetCurrent(void)
162 TestApplication application;
163 Stage stage = Stage::GetCurrent();
165 DALI_TEST_CHECK(stage);
169 int UtcDaliStageIsInstalled(void)
171 DALI_TEST_CHECK(!Stage::IsInstalled());
173 TestApplication application;
177 DALI_TEST_CHECK(Stage::IsInstalled());
181 int UtcDaliStageAdd(void)
183 TestApplication application;
185 Stage stage = Stage::GetCurrent();
187 Actor actor = Actor::New();
188 DALI_TEST_CHECK(!actor.OnStage());
191 DALI_TEST_CHECK(actor.OnStage());
195 int UtcDaliStageRemove(void)
197 TestApplication application;
199 Stage stage = Stage::GetCurrent();
201 Actor actor = Actor::New();
202 DALI_TEST_CHECK(!actor.OnStage());
205 DALI_TEST_CHECK(actor.OnStage());
208 DALI_TEST_CHECK(!actor.OnStage());
212 int UtcDaliStageGetSize(void)
214 TestApplication application;
216 Stage stage = Stage::GetCurrent();
218 Vector2 size = stage.GetSize();
220 DALI_TEST_EQUALS(size.width, static_cast<float>(TestApplication::DEFAULT_SURFACE_WIDTH), TEST_LOCATION);
221 DALI_TEST_EQUALS(size.height, static_cast<float>(TestApplication::DEFAULT_SURFACE_HEIGHT), TEST_LOCATION);
225 int UtcDaliStageGetDpi01(void)
227 TestApplication application; // Initializes core DPI to default values
229 Stage stage = Stage::GetCurrent();
231 // Test the default DPI.
232 Vector2 dpi = stage.GetDpi();
233 DALI_TEST_EQUALS(dpi.x, static_cast<float>(TestApplication::DEFAULT_HORIZONTAL_DPI), TEST_LOCATION);
234 DALI_TEST_EQUALS(dpi.y, static_cast<float>(TestApplication::DEFAULT_VERTICAL_DPI), TEST_LOCATION);
238 int UtcDaliStageGetDpi02(void)
240 TestApplication application; // Initializes core DPI to default values
242 // Test that setting core DPI explicitly also sets up the Stage's DPI.
243 application.GetCore().SetDpi(200, 180);
245 Stage stage = Stage::GetCurrent();
246 Vector2 dpi = stage.GetDpi();
247 DALI_TEST_EQUALS(dpi.x, 200.0f, TEST_LOCATION);
248 DALI_TEST_EQUALS(dpi.y, 180.0f, TEST_LOCATION);
253 int UtcDaliStageGetDpi03(void)
255 TestApplication application(480, 800, 72.0f, 120.0f); // Initializes core DPI with specific values
257 Stage stage = Stage::GetCurrent();
259 // Test that setting core DPI explicitly also sets up the Stage's DPI.
260 Vector2 dpi = stage.GetDpi();
261 DALI_TEST_EQUALS(dpi.x, 72.0f, TEST_LOCATION);
262 DALI_TEST_EQUALS(dpi.y, 120.0f, TEST_LOCATION);
266 int UtcDaliStageGetLayerCount(void)
268 TestApplication application;
270 Stage stage = Stage::GetCurrent();
272 // Initially we have a default layer
273 DALI_TEST_EQUALS(stage.GetLayerCount(), 1u, TEST_LOCATION);
275 Layer layer = Layer::New();
278 DALI_TEST_EQUALS(stage.GetLayerCount(), 2u, TEST_LOCATION);
282 int UtcDaliStageGetLayer(void)
284 TestApplication application;
286 Stage stage = Stage::GetCurrent();
288 Layer rootLayer = stage.GetLayer(0);
289 DALI_TEST_CHECK(rootLayer);
291 Layer layer = Layer::New();
294 Layer sameLayer = stage.GetLayer(1);
295 DALI_TEST_CHECK(layer == sameLayer);
300 int UtcDaliStageGetRootLayer(void)
302 TestApplication application;
304 Stage stage = Stage::GetCurrent();
306 Layer rootLayer = stage.GetLayer(0);
307 DALI_TEST_CHECK( rootLayer );
309 Layer layer = Layer::New();
311 layer.LowerToBottom();
313 DALI_TEST_CHECK( stage.GetRootLayer() == rootLayer );
317 int UtcDaliStageSetBackgroundColor(void)
319 TestApplication application;
321 Stage stage = Stage::GetCurrent();
323 Vector4 testColor(0.1f, 0.2f, 0.3f, 1.0f);
324 stage.SetBackgroundColor(testColor);
326 DALI_TEST_EQUALS(testColor, stage.GetBackgroundColor(), TEST_LOCATION);
330 int UtcDaliStageGetBackgroundColor(void)
332 TestApplication application;
334 Stage stage = Stage::GetCurrent();
336 DALI_TEST_EQUALS(Stage::DEFAULT_BACKGROUND_COLOR, stage.GetBackgroundColor(), TEST_LOCATION);
340 int UtcDaliStageKeepRendering(void)
342 TestApplication application;
344 Stage stage = Stage::GetCurrent();
346 // Run core until it wants to sleep
347 bool keepUpdating( true );
348 while ( keepUpdating )
350 application.SendNotification();
351 keepUpdating = application.Render(1000.0f /*1 second*/);
354 // Force rendering for the next 5 seconds
355 stage.KeepRendering( 5.0f );
357 application.SendNotification();
359 // Test that core wants to sleep after 10 seconds
360 keepUpdating = application.Render(1000.0f /*1 second*/);
361 DALI_TEST_CHECK( keepUpdating );
362 keepUpdating = application.Render(1000.0f /*2 seconds*/);
363 DALI_TEST_CHECK( keepUpdating );
364 keepUpdating = application.Render(1000.0f /*3 seconds*/);
365 DALI_TEST_CHECK( keepUpdating );
366 keepUpdating = application.Render(1000.0f /*4 seconds*/);
367 DALI_TEST_CHECK( keepUpdating );
368 keepUpdating = application.Render(1000.0f /*5 seconds*/);
369 DALI_TEST_CHECK( !keepUpdating );
373 int UtcDaliStageEventProcessingFinished(void)
375 TestApplication application;
376 Stage stage = Stage::GetCurrent();
378 bool eventProcessingFinished = false;
379 EventProcessingFinishedFunctor functor( eventProcessingFinished );
380 stage.EventProcessingFinishedSignal().Connect( &application, functor );
382 Actor actor( Actor::New() );
385 application.SendNotification();
386 application.Render();
388 DALI_TEST_CHECK( eventProcessingFinished );
393 int UtcDaliStageSignalKeyEvent(void)
395 TestApplication application;
396 Stage stage = Stage::GetCurrent();
398 KeyEventSignalData data;
399 KeyEventReceivedFunctor functor( data );
400 stage.KeyEventSignal().Connect( &application, functor );
402 Integration::KeyEvent event( "i","i", 0, 0, 0, Integration::KeyEvent::Down );
403 application.ProcessEvent( event );
405 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
406 DALI_TEST_CHECK( event.keyModifier == data.receivedKeyEvent.keyModifier );
407 DALI_TEST_CHECK( event.keyName == data.receivedKeyEvent.keyPressedName );
408 DALI_TEST_CHECK( event.keyString == data.receivedKeyEvent.keyPressed );
409 DALI_TEST_CHECK( event.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
413 Integration::KeyEvent event2( "i","i", 0, 0, 0, Integration::KeyEvent::Up );
414 application.ProcessEvent( event2 );
416 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
417 DALI_TEST_CHECK( event2.keyModifier == data.receivedKeyEvent.keyModifier );
418 DALI_TEST_CHECK( event2.keyName == data.receivedKeyEvent.keyPressedName );
419 DALI_TEST_CHECK( event2.keyString == data.receivedKeyEvent.keyPressed );
420 DALI_TEST_CHECK( event2.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
424 Integration::KeyEvent event3( "a","a", 0, 0, 0, Integration::KeyEvent::Down );
425 application.ProcessEvent( event3 );
427 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
428 DALI_TEST_CHECK( event3.keyModifier == data.receivedKeyEvent.keyModifier );
429 DALI_TEST_CHECK( event3.keyName == data.receivedKeyEvent.keyPressedName );
430 DALI_TEST_CHECK( event3.keyString == data.receivedKeyEvent.keyPressed );
431 DALI_TEST_CHECK( event3.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
435 Integration::KeyEvent event4( "a","a", 0, 0, 0, Integration::KeyEvent::Up );
436 application.ProcessEvent( event4 );
438 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
439 DALI_TEST_CHECK( event4.keyModifier == data.receivedKeyEvent.keyModifier );
440 DALI_TEST_CHECK( event4.keyName == data.receivedKeyEvent.keyPressedName );
441 DALI_TEST_CHECK( event4.keyString == data.receivedKeyEvent.keyPressed );
442 DALI_TEST_CHECK( event4.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
446 int UtcDaliStageTouchedSignal(void)
448 TestApplication application;
449 Stage stage = Stage::GetCurrent();
451 TouchedSignalData data;
452 TouchedFunctor functor( data );
453 stage.TouchedSignal().Connect( &application, functor );
456 application.SendNotification();
457 application.Render();
459 // NO ACTORS, SINGLE TOUCH, DOWN, MOTION THEN UP
461 Integration::TouchEvent touchEvent;
462 touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) );
463 application.ProcessEvent( touchEvent );
465 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
466 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
467 DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
470 touchEvent.points[0].state = TouchPoint::Motion;
471 touchEvent.points[0].screen.x = 12.0f; // Some motion
472 application.ProcessEvent( touchEvent );
474 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
477 touchEvent.points[0].state = TouchPoint::Up;
478 application.ProcessEvent( touchEvent );
480 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
481 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
482 DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
486 // Add an actor to the scene
488 Actor actor = Actor::New();
489 actor.SetSize( 100.0f, 100.0f );
490 actor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
491 actor.SetParentOrigin( ParentOrigin::TOP_LEFT );
492 actor.TouchedSignal().Connect( &DummyTouchCallback );
496 application.SendNotification();
497 application.Render();
499 // ACTOR ON SCENE, SINGLE TOUCH, DOWN IN ACTOR, MOTION THEN UP OUTSIDE ACTOR
501 Integration::TouchEvent touchEvent;
502 touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) );
503 application.ProcessEvent( touchEvent );
505 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
506 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
507 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].hitActor == actor );
510 touchEvent.points[0].state = TouchPoint::Motion;
511 touchEvent.points[0].screen.x = 150.0f; // Some motion
512 application.ProcessEvent( touchEvent );
514 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
517 touchEvent.points[0].state = TouchPoint::Up;
518 application.ProcessEvent( touchEvent );
520 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
521 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
522 DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
526 // INTERRUPTED BEFORE DOWN AND INTERRUPTED AFTER DOWN
528 Integration::TouchEvent touchEvent;
529 touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Interrupted, 10.0f, 10.0f ) );
530 application.ProcessEvent( touchEvent );
532 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
533 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
534 DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
535 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Interrupted );
538 touchEvent.points[0].state = TouchPoint::Down;
539 application.ProcessEvent( touchEvent );
541 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
542 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
543 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].hitActor == actor );
544 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Down );
547 touchEvent.points[0].state = TouchPoint::Interrupted;
548 application.ProcessEvent( touchEvent );
550 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
551 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
552 DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
553 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Interrupted );
557 // MULTIPLE TOUCH, SHOULD ONLY RECEIVE TOUCH ON FIRST DOWN AND LAST UP
559 Integration::TouchEvent touchEvent;
562 touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) );
563 application.ProcessEvent( touchEvent );
564 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
568 touchEvent.points[0].state = TouchPoint::Stationary;
569 touchEvent.points.push_back( TouchPoint( 1, TouchPoint::Down, 50.0f, 50.0f ) );
570 application.ProcessEvent( touchEvent );
571 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
574 // Primary point is up
575 touchEvent.points[0].state = TouchPoint::Up;
576 touchEvent.points[1].state = TouchPoint::Stationary;
577 application.ProcessEvent( touchEvent );
578 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
581 // Remove 1st point now, 2nd point is now in motion
582 touchEvent.points.erase( touchEvent.points.begin() );
583 touchEvent.points[0].state = TouchPoint::Motion;
584 touchEvent.points[0].screen.x = 150.0f;
585 application.ProcessEvent( touchEvent );
586 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
590 touchEvent.points[0].state = TouchPoint::Up;
591 application.ProcessEvent( touchEvent );
592 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );