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 } // unnamed namespace
161 int UtcDaliStageDefaultConstructor(void)
163 TestApplication application;
166 DALI_TEST_CHECK(!stage);
170 int UtcDaliStageDestructor(void)
172 TestApplication application;
173 Stage* stage = new Stage();
177 DALI_TEST_CHECK( true );
181 int UtcDaliStageGetCurrent(void)
183 TestApplication application;
184 Stage stage = Stage::GetCurrent();
186 DALI_TEST_CHECK(stage);
190 int UtcDaliStageIsInstalled(void)
192 DALI_TEST_CHECK(!Stage::IsInstalled());
194 TestApplication application;
198 DALI_TEST_CHECK(Stage::IsInstalled());
202 int UtcDaliStageAdd(void)
204 TestApplication application;
206 Stage stage = Stage::GetCurrent();
208 Actor actor = Actor::New();
209 DALI_TEST_CHECK(!actor.OnStage());
212 DALI_TEST_CHECK(actor.OnStage());
216 int UtcDaliStageRemove(void)
218 TestApplication application;
220 Stage stage = Stage::GetCurrent();
222 Actor actor = Actor::New();
223 DALI_TEST_CHECK(!actor.OnStage());
226 DALI_TEST_CHECK(actor.OnStage());
229 DALI_TEST_CHECK(!actor.OnStage());
233 int UtcDaliStageGetSize(void)
235 TestApplication application;
237 Stage stage = Stage::GetCurrent();
239 Vector2 size = stage.GetSize();
241 DALI_TEST_EQUALS(size.width, static_cast<float>(TestApplication::DEFAULT_SURFACE_WIDTH), TEST_LOCATION);
242 DALI_TEST_EQUALS(size.height, static_cast<float>(TestApplication::DEFAULT_SURFACE_HEIGHT), TEST_LOCATION);
246 int UtcDaliStageGetDpi01(void)
248 TestApplication application; // Initializes core DPI to default values
250 Stage stage = Stage::GetCurrent();
252 // Test the default DPI.
253 Vector2 dpi = stage.GetDpi();
254 DALI_TEST_EQUALS(dpi.x, static_cast<float>(TestApplication::DEFAULT_HORIZONTAL_DPI), TEST_LOCATION);
255 DALI_TEST_EQUALS(dpi.y, static_cast<float>(TestApplication::DEFAULT_VERTICAL_DPI), TEST_LOCATION);
259 int UtcDaliStageGetDpi02(void)
261 TestApplication application; // Initializes core DPI to default values
263 // Test that setting core DPI explicitly also sets up the Stage's DPI.
264 application.GetCore().SetDpi(200, 180);
266 Stage stage = Stage::GetCurrent();
267 Vector2 dpi = stage.GetDpi();
268 DALI_TEST_EQUALS(dpi.x, 200.0f, TEST_LOCATION);
269 DALI_TEST_EQUALS(dpi.y, 180.0f, TEST_LOCATION);
274 int UtcDaliStageGetDpi03(void)
276 TestApplication application(480, 800, 72.0f, 120.0f); // Initializes core DPI with specific values
278 Stage stage = Stage::GetCurrent();
280 // Test that setting core DPI explicitly also sets up the Stage's DPI.
281 Vector2 dpi = stage.GetDpi();
282 DALI_TEST_EQUALS(dpi.x, 72.0f, TEST_LOCATION);
283 DALI_TEST_EQUALS(dpi.y, 120.0f, TEST_LOCATION);
287 int UtcDaliStageGetLayerCount(void)
289 TestApplication application;
291 Stage stage = Stage::GetCurrent();
293 // Initially we have a default layer
294 DALI_TEST_EQUALS(stage.GetLayerCount(), 1u, TEST_LOCATION);
296 Layer layer = Layer::New();
299 DALI_TEST_EQUALS(stage.GetLayerCount(), 2u, TEST_LOCATION);
303 int UtcDaliStageGetLayer(void)
305 TestApplication application;
307 Stage stage = Stage::GetCurrent();
309 Layer rootLayer = stage.GetLayer(0);
310 DALI_TEST_CHECK(rootLayer);
312 Layer layer = Layer::New();
315 Layer sameLayer = stage.GetLayer(1);
316 DALI_TEST_CHECK(layer == sameLayer);
321 int UtcDaliStageGetRootLayer(void)
323 TestApplication application;
325 Stage stage = Stage::GetCurrent();
327 Layer rootLayer = stage.GetLayer(0);
328 DALI_TEST_CHECK( rootLayer );
330 Layer layer = Layer::New();
332 layer.LowerToBottom();
334 DALI_TEST_CHECK( stage.GetRootLayer() == rootLayer );
338 int UtcDaliStageSetBackgroundColor(void)
340 TestApplication application;
342 Stage stage = Stage::GetCurrent();
344 Vector4 testColor(0.1f, 0.2f, 0.3f, 1.0f);
345 stage.SetBackgroundColor(testColor);
347 DALI_TEST_EQUALS(testColor, stage.GetBackgroundColor(), TEST_LOCATION);
351 int UtcDaliStageGetBackgroundColor(void)
353 TestApplication application;
355 Stage stage = Stage::GetCurrent();
357 DALI_TEST_EQUALS(Stage::DEFAULT_BACKGROUND_COLOR, stage.GetBackgroundColor(), TEST_LOCATION);
361 int UtcDaliStageKeepRendering(void)
363 TestApplication application;
365 Stage stage = Stage::GetCurrent();
367 // Run core until it wants to sleep
368 bool keepUpdating( true );
369 while ( keepUpdating )
371 application.SendNotification();
372 keepUpdating = application.Render(1000.0f /*1 second*/);
375 // Force rendering for the next 5 seconds
376 stage.KeepRendering( 5.0f );
378 application.SendNotification();
380 // Test that core wants to sleep after 10 seconds
381 keepUpdating = application.Render(1000.0f /*1 second*/);
382 DALI_TEST_CHECK( keepUpdating );
383 keepUpdating = application.Render(1000.0f /*2 seconds*/);
384 DALI_TEST_CHECK( keepUpdating );
385 keepUpdating = application.Render(1000.0f /*3 seconds*/);
386 DALI_TEST_CHECK( keepUpdating );
387 keepUpdating = application.Render(1000.0f /*4 seconds*/);
388 DALI_TEST_CHECK( keepUpdating );
389 keepUpdating = application.Render(1000.0f /*5 seconds*/);
390 DALI_TEST_CHECK( !keepUpdating );
394 int UtcDaliStageEventProcessingFinished(void)
396 TestApplication application;
397 Stage stage = Stage::GetCurrent();
399 bool eventProcessingFinished = false;
400 EventProcessingFinishedFunctor functor( eventProcessingFinished );
401 stage.EventProcessingFinishedSignal().Connect( &application, functor );
403 Actor actor( Actor::New() );
406 application.SendNotification();
407 application.Render();
409 DALI_TEST_CHECK( eventProcessingFinished );
414 int UtcDaliStageSignalKeyEvent(void)
416 TestApplication application;
417 Stage stage = Stage::GetCurrent();
419 KeyEventSignalData data;
420 KeyEventReceivedFunctor functor( data );
421 stage.KeyEventSignal().Connect( &application, functor );
423 Integration::KeyEvent event( "i","i", 0, 0, 0, Integration::KeyEvent::Down );
424 application.ProcessEvent( event );
426 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
427 DALI_TEST_CHECK( event.keyModifier == data.receivedKeyEvent.keyModifier );
428 DALI_TEST_CHECK( event.keyName == data.receivedKeyEvent.keyPressedName );
429 DALI_TEST_CHECK( event.keyString == data.receivedKeyEvent.keyPressed );
430 DALI_TEST_CHECK( event.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
434 Integration::KeyEvent event2( "i","i", 0, 0, 0, Integration::KeyEvent::Up );
435 application.ProcessEvent( event2 );
437 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
438 DALI_TEST_CHECK( event2.keyModifier == data.receivedKeyEvent.keyModifier );
439 DALI_TEST_CHECK( event2.keyName == data.receivedKeyEvent.keyPressedName );
440 DALI_TEST_CHECK( event2.keyString == data.receivedKeyEvent.keyPressed );
441 DALI_TEST_CHECK( event2.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
445 Integration::KeyEvent event3( "a","a", 0, 0, 0, Integration::KeyEvent::Down );
446 application.ProcessEvent( event3 );
448 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
449 DALI_TEST_CHECK( event3.keyModifier == data.receivedKeyEvent.keyModifier );
450 DALI_TEST_CHECK( event3.keyName == data.receivedKeyEvent.keyPressedName );
451 DALI_TEST_CHECK( event3.keyString == data.receivedKeyEvent.keyPressed );
452 DALI_TEST_CHECK( event3.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
456 Integration::KeyEvent event4( "a","a", 0, 0, 0, Integration::KeyEvent::Up );
457 application.ProcessEvent( event4 );
459 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
460 DALI_TEST_CHECK( event4.keyModifier == data.receivedKeyEvent.keyModifier );
461 DALI_TEST_CHECK( event4.keyName == data.receivedKeyEvent.keyPressedName );
462 DALI_TEST_CHECK( event4.keyString == data.receivedKeyEvent.keyPressed );
463 DALI_TEST_CHECK( event4.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
467 int UtcDaliStageTouchedSignal(void)
469 TestApplication application;
470 Stage stage = Stage::GetCurrent();
472 TouchedSignalData data;
473 TouchedFunctor functor( data );
474 stage.TouchedSignal().Connect( &application, functor );
477 application.SendNotification();
478 application.Render();
480 // NO ACTORS, SINGLE TOUCH, DOWN, MOTION THEN UP
482 Integration::TouchEvent touchEvent;
483 touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) );
484 application.ProcessEvent( touchEvent );
486 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
487 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
488 DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
491 touchEvent.points[0].state = TouchPoint::Motion;
492 touchEvent.points[0].screen.x = 12.0f; // Some motion
493 application.ProcessEvent( touchEvent );
495 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
498 touchEvent.points[0].state = TouchPoint::Up;
499 application.ProcessEvent( touchEvent );
501 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
502 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
503 DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
507 // Add an actor to the scene
509 Actor actor = Actor::New();
510 actor.SetSize( 100.0f, 100.0f );
511 actor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
512 actor.SetParentOrigin( ParentOrigin::TOP_LEFT );
513 actor.TouchedSignal().Connect( &DummyTouchCallback );
517 application.SendNotification();
518 application.Render();
520 // ACTOR ON SCENE, SINGLE TOUCH, DOWN IN ACTOR, MOTION THEN UP OUTSIDE ACTOR
522 Integration::TouchEvent touchEvent;
523 touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) );
524 application.ProcessEvent( touchEvent );
526 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
527 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
528 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].hitActor == actor );
531 touchEvent.points[0].state = TouchPoint::Motion;
532 touchEvent.points[0].screen.x = 150.0f; // Some motion
533 application.ProcessEvent( touchEvent );
535 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
538 touchEvent.points[0].state = TouchPoint::Up;
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 );
547 // INTERRUPTED BEFORE DOWN AND INTERRUPTED AFTER DOWN
549 Integration::TouchEvent touchEvent;
550 touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Interrupted, 10.0f, 10.0f ) );
551 application.ProcessEvent( touchEvent );
553 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
554 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
555 DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
556 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Interrupted );
559 touchEvent.points[0].state = TouchPoint::Down;
560 application.ProcessEvent( touchEvent );
562 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
563 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
564 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].hitActor == actor );
565 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Down );
568 touchEvent.points[0].state = TouchPoint::Interrupted;
569 application.ProcessEvent( touchEvent );
571 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
572 DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
573 DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
574 DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Interrupted );
578 // MULTIPLE TOUCH, SHOULD ONLY RECEIVE TOUCH ON FIRST DOWN AND LAST UP
580 Integration::TouchEvent touchEvent;
583 touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) );
584 application.ProcessEvent( touchEvent );
585 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
589 touchEvent.points[0].state = TouchPoint::Stationary;
590 touchEvent.points.push_back( TouchPoint( 1, TouchPoint::Down, 50.0f, 50.0f ) );
591 application.ProcessEvent( touchEvent );
592 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
595 // Primary point is up
596 touchEvent.points[0].state = TouchPoint::Up;
597 touchEvent.points[1].state = TouchPoint::Stationary;
598 application.ProcessEvent( touchEvent );
599 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
602 // Remove 1st point now, 2nd point is now in motion
603 touchEvent.points.erase( touchEvent.points.begin() );
604 touchEvent.points[0].state = TouchPoint::Motion;
605 touchEvent.points[0].screen.x = 150.0f;
606 application.ProcessEvent( touchEvent );
607 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
611 touchEvent.points[0].state = TouchPoint::Up;
612 application.ProcessEvent( touchEvent );
613 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
619 int UtcDaliStageContextLostRegainedSignals(void)
622 Stage stage = Stage::GetCurrent();
624 bool contextLost = false;
625 bool contextRegained = false;
626 ContextStatusFunctor contextLostFunctor( contextLost );
627 ContextStatusFunctor contextRegainedFunctor( contextRegained );
628 stage.ContextLostSignal().Connect(&app, contextLostFunctor );
629 stage.ContextRegainedSignal().Connect(&app, contextRegainedFunctor );
631 Integration::Core& core = app.GetCore();
632 Integration::ContextNotifierInterface* notifier = core.GetContextNotifier();
633 notifier->NotifyContextLost();
634 DALI_TEST_EQUALS( contextLost, true, TEST_LOCATION );
636 notifier->NotifyContextRegained();
637 DALI_TEST_EQUALS( contextRegained, true, TEST_LOCATION );