2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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/context-notifier.h>
24 #include <dali/integration-api/events/key-event-integ.h>
25 #include <dali/integration-api/events/touch-event-integ.h>
27 #include <dali-test-suite-utils.h>
31 void stage_test_startup(void)
33 test_return_value = TET_UNDEF;
36 void stage_test_cleanup(void)
38 test_return_value = TET_PASS;
45 * Functor for EventProcessingFinished signal
47 struct EventProcessingFinishedFunctor
50 * @param[in] eventProcessingFinished reference to a boolean variable used to check if signal has been called.
52 EventProcessingFinishedFunctor( bool& eventProcessingFinished )
53 : mEventProcessingFinished( eventProcessingFinished )
58 mEventProcessingFinished = true;
61 bool& mEventProcessingFinished;
64 // Stores data that is populated in the key-event callback and will be read by the TET cases
65 struct KeyEventSignalData
68 : functorCalled(false)
73 functorCalled = false;
75 receivedKeyEvent.keyModifier = 0;
76 receivedKeyEvent.keyPressedName.clear();
77 receivedKeyEvent.keyPressed.clear();
81 KeyEvent receivedKeyEvent;
84 // Functor that sets the data when called
85 struct KeyEventReceivedFunctor
87 KeyEventReceivedFunctor( KeyEventSignalData& data ) : signalData( data ) { }
89 bool operator()( const KeyEvent& keyEvent )
91 signalData.functorCalled = true;
92 signalData.receivedKeyEvent = keyEvent;
97 KeyEventSignalData& signalData;
100 // Stores data that is populated in the touched signal callback and will be read by the TET cases
101 struct TouchedSignalData
104 : functorCalled(false)
109 functorCalled = false;
111 receivedTouchEvent.points.clear();
112 receivedTouchEvent.time = 0;
116 TouchEvent receivedTouchEvent;
119 // Functor that sets the data when touched signal is received
120 struct TouchedFunctor
122 TouchedFunctor( TouchedSignalData& data ) : signalData( data ) { }
124 void operator()( const TouchEvent& touch )
126 signalData.functorCalled = true;
127 signalData.receivedTouchEvent = touch;
130 TouchedSignalData& signalData;
133 bool DummyTouchCallback( Actor actor, const TouchEvent& touch )
139 struct ContextStatusFunctor
141 ContextStatusFunctor(bool& calledFlag) : mCalledFlag( calledFlag )
158 struct SceneCreatedStatusFunctor
160 SceneCreatedStatusFunctor(bool& calledFlag) : mCalledFlag( calledFlag )
177 } // unnamed namespace
180 int UtcDaliStageDefaultConstructor(void)
182 TestApplication application;
185 DALI_TEST_CHECK(!stage);
189 int UtcDaliStageDestructor(void)
191 TestApplication application;
192 Stage* stage = new Stage();
196 DALI_TEST_CHECK( true );
200 int UtcDaliStageGetCurrent(void)
202 TestApplication application;
203 Stage stage = Stage::GetCurrent();
205 DALI_TEST_CHECK(stage);
209 int UtcDaliStageIsInstalled(void)
211 DALI_TEST_CHECK(!Stage::IsInstalled());
213 TestApplication application;
217 DALI_TEST_CHECK(Stage::IsInstalled());
221 int UtcDaliStageAdd(void)
223 TestApplication application;
225 Stage stage = Stage::GetCurrent();
227 Actor actor = Actor::New();
228 DALI_TEST_CHECK(!actor.OnStage());
231 DALI_TEST_CHECK(actor.OnStage());
235 int UtcDaliStageRemove(void)
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());
252 int UtcDaliStageGetSize(void)
254 TestApplication application;
256 Stage stage = Stage::GetCurrent();
258 Vector2 size = stage.GetSize();
260 DALI_TEST_EQUALS(size.width, static_cast<float>(TestApplication::DEFAULT_SURFACE_WIDTH), TEST_LOCATION);
261 DALI_TEST_EQUALS(size.height, static_cast<float>(TestApplication::DEFAULT_SURFACE_HEIGHT), TEST_LOCATION);
265 int UtcDaliStageGetDpi01(void)
267 TestApplication application; // Initializes core DPI to default values
269 Stage stage = Stage::GetCurrent();
271 // Test the default DPI.
272 Vector2 dpi = stage.GetDpi();
273 DALI_TEST_EQUALS(dpi.x, static_cast<float>(TestApplication::DEFAULT_HORIZONTAL_DPI), TEST_LOCATION);
274 DALI_TEST_EQUALS(dpi.y, static_cast<float>(TestApplication::DEFAULT_VERTICAL_DPI), TEST_LOCATION);
278 int UtcDaliStageGetDpi02(void)
280 TestApplication application; // Initializes core DPI to default values
282 // Test that setting core DPI explicitly also sets up the Stage's DPI.
283 application.GetCore().SetDpi(200, 180);
285 Stage stage = Stage::GetCurrent();
286 Vector2 dpi = stage.GetDpi();
287 DALI_TEST_EQUALS(dpi.x, 200.0f, TEST_LOCATION);
288 DALI_TEST_EQUALS(dpi.y, 180.0f, TEST_LOCATION);
293 int UtcDaliStageGetDpi03(void)
295 TestApplication application(480, 800, 72.0f, 120.0f); // Initializes core DPI with specific values
297 Stage stage = Stage::GetCurrent();
299 // Test that setting core DPI explicitly also sets up the Stage's DPI.
300 Vector2 dpi = stage.GetDpi();
301 DALI_TEST_EQUALS(dpi.x, 72.0f, TEST_LOCATION);
302 DALI_TEST_EQUALS(dpi.y, 120.0f, TEST_LOCATION);
306 int UtcDaliStageGetLayerCount(void)
308 TestApplication application;
310 Stage stage = Stage::GetCurrent();
312 // Initially we have a default layer
313 DALI_TEST_EQUALS(stage.GetLayerCount(), 1u, TEST_LOCATION);
315 Layer layer = Layer::New();
318 DALI_TEST_EQUALS(stage.GetLayerCount(), 2u, TEST_LOCATION);
322 int UtcDaliStageGetLayer(void)
324 TestApplication application;
326 Stage stage = Stage::GetCurrent();
328 Layer rootLayer = stage.GetLayer(0);
329 DALI_TEST_CHECK(rootLayer);
331 Layer layer = Layer::New();
334 Layer sameLayer = stage.GetLayer(1);
335 DALI_TEST_CHECK(layer == sameLayer);
340 int UtcDaliStageGetRootLayer(void)
342 TestApplication application;
344 Stage stage = Stage::GetCurrent();
346 Layer rootLayer = stage.GetLayer(0);
347 DALI_TEST_CHECK( rootLayer );
349 Layer layer = Layer::New();
351 layer.LowerToBottom();
353 DALI_TEST_CHECK( stage.GetRootLayer() == rootLayer );
357 int UtcDaliStageSetBackgroundColor(void)
359 TestApplication application;
361 Stage stage = Stage::GetCurrent();
363 Vector4 testColor(0.1f, 0.2f, 0.3f, 1.0f);
364 stage.SetBackgroundColor(testColor);
366 DALI_TEST_EQUALS(testColor, stage.GetBackgroundColor(), TEST_LOCATION);
370 int UtcDaliStageGetBackgroundColor(void)
372 TestApplication application;
374 Stage stage = Stage::GetCurrent();
376 DALI_TEST_EQUALS(Stage::DEFAULT_BACKGROUND_COLOR, stage.GetBackgroundColor(), TEST_LOCATION);
380 int UtcDaliStageKeepRendering(void)
382 TestApplication application;
384 Stage stage = Stage::GetCurrent();
386 // Run core until it wants to sleep
387 bool keepUpdating( true );
388 while ( keepUpdating )
390 application.SendNotification();
391 keepUpdating = application.Render(1000.0f /*1 second*/);
394 // Force rendering for the next 5 seconds
395 stage.KeepRendering( 5.0f );
397 application.SendNotification();
399 // Test that core wants to sleep after 10 seconds
400 keepUpdating = application.Render(1000.0f /*1 second*/);
401 DALI_TEST_CHECK( keepUpdating );
402 keepUpdating = application.Render(1000.0f /*2 seconds*/);
403 DALI_TEST_CHECK( keepUpdating );
404 keepUpdating = application.Render(1000.0f /*3 seconds*/);
405 DALI_TEST_CHECK( keepUpdating );
406 keepUpdating = application.Render(1000.0f /*4 seconds*/);
407 DALI_TEST_CHECK( keepUpdating );
408 keepUpdating = application.Render(1000.0f /*5 seconds*/);
409 DALI_TEST_CHECK( !keepUpdating );
413 int UtcDaliStageEventProcessingFinished(void)
415 TestApplication application;
416 Stage stage = Stage::GetCurrent();
418 bool eventProcessingFinished = false;
419 EventProcessingFinishedFunctor functor( eventProcessingFinished );
420 stage.EventProcessingFinishedSignal().Connect( &application, functor );
422 Actor actor( Actor::New() );
425 application.SendNotification();
426 application.Render();
428 DALI_TEST_CHECK( eventProcessingFinished );
433 int UtcDaliStageSignalKeyEvent(void)
435 TestApplication application;
436 Stage stage = Stage::GetCurrent();
438 KeyEventSignalData data;
439 KeyEventReceivedFunctor functor( data );
440 stage.KeyEventSignal().Connect( &application, functor );
442 Integration::KeyEvent event( "i","i", 0, 0, 0, Integration::KeyEvent::Down );
443 application.ProcessEvent( event );
445 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
446 DALI_TEST_CHECK( event.keyModifier == data.receivedKeyEvent.keyModifier );
447 DALI_TEST_CHECK( event.keyName == data.receivedKeyEvent.keyPressedName );
448 DALI_TEST_CHECK( event.keyString == data.receivedKeyEvent.keyPressed );
449 DALI_TEST_CHECK( event.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
453 Integration::KeyEvent event2( "i","i", 0, 0, 0, Integration::KeyEvent::Up );
454 application.ProcessEvent( event2 );
456 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
457 DALI_TEST_CHECK( event2.keyModifier == data.receivedKeyEvent.keyModifier );
458 DALI_TEST_CHECK( event2.keyName == data.receivedKeyEvent.keyPressedName );
459 DALI_TEST_CHECK( event2.keyString == data.receivedKeyEvent.keyPressed );
460 DALI_TEST_CHECK( event2.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
464 Integration::KeyEvent event3( "a","a", 0, 0, 0, Integration::KeyEvent::Down );
465 application.ProcessEvent( event3 );
467 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
468 DALI_TEST_CHECK( event3.keyModifier == data.receivedKeyEvent.keyModifier );
469 DALI_TEST_CHECK( event3.keyName == data.receivedKeyEvent.keyPressedName );
470 DALI_TEST_CHECK( event3.keyString == data.receivedKeyEvent.keyPressed );
471 DALI_TEST_CHECK( event3.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
475 Integration::KeyEvent event4( "a","a", 0, 0, 0, Integration::KeyEvent::Up );
476 application.ProcessEvent( event4 );
478 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
479 DALI_TEST_CHECK( event4.keyModifier == data.receivedKeyEvent.keyModifier );
480 DALI_TEST_CHECK( event4.keyName == data.receivedKeyEvent.keyPressedName );
481 DALI_TEST_CHECK( event4.keyString == data.receivedKeyEvent.keyPressed );
482 DALI_TEST_CHECK( event4.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
486 int UtcDaliStageTouchedSignal(void)
488 TestApplication application;
489 Stage stage = Stage::GetCurrent();
491 TouchedSignalData data;
492 TouchedFunctor functor( data );
493 stage.TouchedSignal().Connect( &application, functor );
496 application.SendNotification();
497 application.Render();
499 // NO ACTORS, SINGLE TOUCH, DOWN, MOTION THEN UP
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 );
510 touchEvent.points[0].state = TouchPoint::Motion;
511 touchEvent.points[0].screen.x = 12.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 // Add an actor to the scene
528 Actor actor = Actor::New();
529 actor.SetSize( 100.0f, 100.0f );
530 actor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
531 actor.SetParentOrigin( ParentOrigin::TOP_LEFT );
532 actor.TouchedSignal().Connect( &DummyTouchCallback );
536 application.SendNotification();
537 application.Render();
539 // ACTOR ON SCENE, SINGLE TOUCH, DOWN IN ACTOR, MOTION THEN UP OUTSIDE ACTOR
541 Integration::TouchEvent touchEvent;
542 touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) );
543 application.ProcessEvent( touchEvent );
545 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
546 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
547 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].hitActor == actor );
550 touchEvent.points[0].state = TouchPoint::Motion;
551 touchEvent.points[0].screen.x = 150.0f; // Some motion
552 application.ProcessEvent( touchEvent );
554 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
557 touchEvent.points[0].state = TouchPoint::Up;
558 application.ProcessEvent( touchEvent );
560 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
561 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
562 DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
566 // INTERRUPTED BEFORE DOWN AND INTERRUPTED AFTER DOWN
568 Integration::TouchEvent touchEvent;
569 touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Interrupted, 10.0f, 10.0f ) );
570 application.ProcessEvent( touchEvent );
572 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
573 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
574 DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
575 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Interrupted );
578 touchEvent.points[0].state = TouchPoint::Down;
579 application.ProcessEvent( touchEvent );
581 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
582 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
583 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].hitActor == actor );
584 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Down );
587 touchEvent.points[0].state = TouchPoint::Interrupted;
588 application.ProcessEvent( touchEvent );
590 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
591 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
592 DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
593 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Interrupted );
597 // MULTIPLE TOUCH, SHOULD ONLY RECEIVE TOUCH ON FIRST DOWN AND LAST UP
599 Integration::TouchEvent touchEvent;
602 touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) );
603 application.ProcessEvent( touchEvent );
604 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
608 touchEvent.points[0].state = TouchPoint::Stationary;
609 touchEvent.points.push_back( TouchPoint( 1, TouchPoint::Down, 50.0f, 50.0f ) );
610 application.ProcessEvent( touchEvent );
611 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
614 // Primary point is up
615 touchEvent.points[0].state = TouchPoint::Up;
616 touchEvent.points[1].state = TouchPoint::Stationary;
617 application.ProcessEvent( touchEvent );
618 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
621 // Remove 1st point now, 2nd point is now in motion
622 touchEvent.points.erase( touchEvent.points.begin() );
623 touchEvent.points[0].state = TouchPoint::Motion;
624 touchEvent.points[0].screen.x = 150.0f;
625 application.ProcessEvent( touchEvent );
626 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
630 touchEvent.points[0].state = TouchPoint::Up;
631 application.ProcessEvent( touchEvent );
632 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
638 int UtcDaliStageContextLostRegainedSignals(void)
641 Stage stage = Stage::GetCurrent();
643 bool contextLost = false;
644 bool contextRegained = false;
645 ContextStatusFunctor contextLostFunctor( contextLost );
646 ContextStatusFunctor contextRegainedFunctor( contextRegained );
647 stage.ContextLostSignal().Connect(&app, contextLostFunctor );
648 stage.ContextRegainedSignal().Connect(&app, contextRegainedFunctor );
650 Integration::Core& core = app.GetCore();
651 Integration::ContextNotifierInterface* notifier = core.GetContextNotifier();
652 notifier->NotifyContextLost();
653 DALI_TEST_EQUALS( contextLost, true, TEST_LOCATION );
655 notifier->NotifyContextRegained();
656 DALI_TEST_EQUALS( contextRegained, true, TEST_LOCATION );
661 int UtcDaliStageSceneCreatedSignal(void)
664 Stage stage = Stage::GetCurrent();
666 bool signalCalled = false;
667 SceneCreatedStatusFunctor sceneCreatedFunctor( signalCalled );
668 stage.SceneCreatedSignal().Connect(&app, sceneCreatedFunctor );
670 Integration::Core& core = app.GetCore();
672 DALI_TEST_EQUALS( signalCalled, true, TEST_LOCATION );