2 * Copyright (c) 2016 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.
21 #include <dali/integration-api/scene.h>
22 #include <dali/integration-api/events/key-event-integ.h>
23 #include <dali/public-api/events/key-event.h>
24 #include <dali/integration-api/events/touch-event-integ.h>
25 #include <dali/integration-api/events/wheel-event-integ.h>
27 #include <dali-test-suite-utils.h>
29 // Internal headers are allowed here
34 const std::string DEFAULT_DEVICE_NAME("hwKeyboard");
36 // Functor for EventProcessingFinished signal
37 struct EventProcessingFinishedFunctor
40 * @param[in] eventProcessingFinished reference to a boolean variable used to check if signal has been called.
42 EventProcessingFinishedFunctor( bool& eventProcessingFinished )
43 : mEventProcessingFinished( eventProcessingFinished )
48 mEventProcessingFinished = true;
51 bool& mEventProcessingFinished;
54 // Stores data that is populated in the key-event callback and will be read by the TET cases
55 struct KeyEventSignalData
58 : functorCalled(false)
63 functorCalled = false;
65 receivedKeyEvent.keyModifier = 0;
66 receivedKeyEvent.keyPressedName.clear();
67 receivedKeyEvent.keyPressed.clear();
71 KeyEvent receivedKeyEvent;
74 // Functor that sets the data when called
75 struct KeyEventReceivedFunctor
77 KeyEventReceivedFunctor( KeyEventSignalData& data ) : signalData( data ) { }
79 bool operator()( const KeyEvent& keyEvent )
81 signalData.functorCalled = true;
82 signalData.receivedKeyEvent = keyEvent;
87 KeyEventSignalData& signalData;
90 // Stores data that is populated in the touched signal callback and will be read by the TET cases
91 struct TouchedSignalData
94 : functorCalled(false)
99 functorCalled = false;
101 receivedTouchEvent.points.clear();
102 receivedTouchEvent.time = 0;
104 receivedTouchData.Reset();
108 TouchEvent receivedTouchEvent;
109 TouchData receivedTouchData;
112 // Functor that sets the data when touched signal is received
113 struct TouchedFunctor
115 TouchedFunctor( TouchedSignalData& data ) : signalData( data ) { }
117 void operator()( const TouchEvent& touch )
119 signalData.functorCalled = true;
120 signalData.receivedTouchEvent = touch;
123 TouchedSignalData& signalData;
126 // Functor that sets the data when touched signal is received
129 TouchFunctor( TouchedSignalData& data ) : signalData( data ) { }
131 void operator()( const TouchData& touch )
133 signalData.functorCalled = true;
134 signalData.receivedTouchData = touch;
139 signalData.functorCalled = true;
142 TouchedSignalData& signalData;
145 // Stores data that is populated in the wheel-event callback and will be read by the TET cases
146 struct WheelEventSignalData
148 WheelEventSignalData()
149 : functorCalled(false)
154 functorCalled = false;
158 WheelEvent receivedWheelEvent;
161 // Functor that sets the data when wheel-event signal is received
162 struct WheelEventReceivedFunctor
164 WheelEventReceivedFunctor( WheelEventSignalData& data ) : signalData( data ) { }
166 bool operator()( const WheelEvent& wheelEvent )
168 signalData.functorCalled = true;
169 signalData.receivedWheelEvent = wheelEvent;
174 WheelEventSignalData& signalData;
177 void GenerateTouch( TestApplication& application, PointState::Type state, const Vector2& screenPosition )
179 Integration::TouchEvent touchEvent;
180 Integration::Point point;
181 point.SetState( state );
182 point.SetScreenPosition( screenPosition );
183 touchEvent.points.push_back( point );
184 application.ProcessEvent( touchEvent );
187 bool DummyTouchCallback( Actor actor, const TouchEvent& touch )
192 } // unnamed namespace
194 int UtcDaliSceneAdd(void)
196 TestApplication application;
197 tet_infoline("Testing Dali::Integration::Scene::Add");
199 Dali::Integration::Scene scene = application.GetScene();
201 Actor actor = Actor::New();
202 DALI_TEST_CHECK( !actor.OnStage() );
205 DALI_TEST_CHECK( actor.OnStage() );
210 int UtcDaliSceneRemove(void)
212 TestApplication application;
213 tet_infoline("Testing Dali::Integration::Scene::Remove");
215 Dali::Integration::Scene scene = application.GetScene();
217 Actor actor = Actor::New();
218 DALI_TEST_CHECK( !actor.OnStage() );
221 DALI_TEST_CHECK( actor.OnStage() );
224 DALI_TEST_CHECK( !actor.OnStage() );
229 int UtcDaliSceneGetSize(void)
231 TestApplication application;
232 tet_infoline("Testing Dali::Integration::Scene::GetSize");
234 Dali::Integration::Scene scene = application.GetScene();
235 Size size = scene.GetSize();
236 DALI_TEST_EQUALS( TestApplication::DEFAULT_SURFACE_WIDTH, size.width, TEST_LOCATION );
237 DALI_TEST_EQUALS( TestApplication::DEFAULT_SURFACE_HEIGHT, size.height, TEST_LOCATION );
242 int UtcDaliSceneGetDpi(void)
244 TestApplication application; // Initializes core DPI to default values
246 // Test that setting core DPI explicitly also sets up the scene's DPI.
247 Dali::Integration::Scene scene = application.GetScene();
248 scene.SetDpi( Vector2(200.0f, 180.0f) );
249 Vector2 dpi = scene.GetDpi();
250 DALI_TEST_EQUALS( dpi.x, 200.0f, TEST_LOCATION );
251 DALI_TEST_EQUALS( dpi.y, 180.0f, TEST_LOCATION );
255 int UtcDaliSceneGetRenderTaskList(void)
257 TestApplication application;
258 tet_infoline("Testing Dali::Integration::Scene::GetRenderTaskList");
260 Dali::Integration::Scene scene = application.GetScene();
262 // Check we get a valid instance.
263 const RenderTaskList& tasks = scene.GetRenderTaskList();
265 // There should be 1 task by default.
266 DALI_TEST_EQUALS( tasks.GetTaskCount(), 1u, TEST_LOCATION );
268 // RenderTaskList has it's own UTC tests.
269 // But we can confirm that GetRenderTaskList in Stage retrieves the same RenderTaskList each time.
270 RenderTask newTask = scene.GetRenderTaskList().CreateTask();
272 DALI_TEST_EQUALS( scene.GetRenderTaskList().GetTask( 1 ), newTask, TEST_LOCATION );
277 int UtcDaliSceneGetRootLayer(void)
279 TestApplication application;
280 tet_infoline("Testing Dali::Integration::Scene::GetRootLayer");
282 Dali::Integration::Scene scene = application.GetScene();
283 Layer layer = scene.GetLayer( 0 );
284 DALI_TEST_CHECK( layer );
286 // Check that GetRootLayer() correctly retreived layer 0.
287 DALI_TEST_CHECK( scene.GetRootLayer() == layer );
292 int UtcDaliSceneGetLayerCount(void)
294 TestApplication application;
295 tet_infoline("Testing Dali::Integration::Scene::GetLayerCount");
297 Dali::Integration::Scene scene = application.GetScene();
298 // Initially we have a default layer
299 DALI_TEST_EQUALS( scene.GetLayerCount(), 1u, TEST_LOCATION );
301 Layer layer = Layer::New();
304 DALI_TEST_EQUALS( scene.GetLayerCount(), 2u, TEST_LOCATION );
308 int UtcDaliSceneGetLayer(void)
310 TestApplication application;
311 tet_infoline("Testing Dali::Integration::Scene::GetLayer");
313 Dali::Integration::Scene scene = application.GetScene();
315 Layer rootLayer = scene.GetLayer( 0 );
316 DALI_TEST_CHECK( rootLayer );
318 Layer layer = Layer::New();
321 Layer sameLayer = scene.GetLayer( 1 );
322 DALI_TEST_CHECK( layer == sameLayer );
327 int UtcDaliSceneEventProcessingFinishedP(void)
329 TestApplication application;
330 Dali::Integration::Scene scene = application.GetScene();
332 bool eventProcessingFinished = false;
333 EventProcessingFinishedFunctor functor( eventProcessingFinished );
334 scene.EventProcessingFinishedSignal().Connect( &application, functor );
336 Actor actor( Actor::New() );
339 application.SendNotification();
340 application.Render();
342 DALI_TEST_CHECK( eventProcessingFinished );
347 int UtcDaliSceneEventProcessingFinishedN(void)
349 TestApplication application;
350 Dali::Integration::Scene scene = application.GetScene();
352 bool eventProcessingFinished = false;
353 EventProcessingFinishedFunctor functor( eventProcessingFinished );
354 scene.EventProcessingFinishedSignal().Connect( &application, functor );
356 Actor actor( Actor::New() );
359 // Do not complete event processing and confirm the signal has not been emitted.
360 DALI_TEST_CHECK( !eventProcessingFinished );
365 int UtcDaliSceneSignalKeyEventP(void)
367 TestApplication application;
368 Dali::Integration::Scene scene = application.GetScene();
370 KeyEventSignalData data;
371 KeyEventReceivedFunctor functor( data );
372 scene.KeyEventSignal().Connect( &application, functor );
374 Integration::KeyEvent event( "i", "", "i", 0, 0, 0, Integration::KeyEvent::Down, "i", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE );
375 application.ProcessEvent( event );
377 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
378 DALI_TEST_CHECK( event.keyModifier == data.receivedKeyEvent.keyModifier );
379 DALI_TEST_CHECK( event.keyName == data.receivedKeyEvent.keyPressedName );
380 DALI_TEST_CHECK( event.keyString == data.receivedKeyEvent.keyPressed );
381 DALI_TEST_CHECK( event.state == static_cast<Integration::KeyEvent::State>( data.receivedKeyEvent.state ) );
385 Integration::KeyEvent event2( "i", "", "i", 0, 0, 0, Integration::KeyEvent::Up, "i", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE );
386 application.ProcessEvent( event2 );
388 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
389 DALI_TEST_CHECK( event2.keyModifier == data.receivedKeyEvent.keyModifier );
390 DALI_TEST_CHECK( event2.keyName == data.receivedKeyEvent.keyPressedName );
391 DALI_TEST_CHECK( event2.keyString == data.receivedKeyEvent.keyPressed );
392 DALI_TEST_CHECK( event2.state == static_cast<Integration::KeyEvent::State>( data.receivedKeyEvent.state ) );
396 Integration::KeyEvent event3( "a", "", "a", 0, 0, 0, Integration::KeyEvent::Down, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE );
397 application.ProcessEvent( event3 );
399 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
400 DALI_TEST_CHECK( event3.keyModifier == data.receivedKeyEvent.keyModifier );
401 DALI_TEST_CHECK( event3.keyName == data.receivedKeyEvent.keyPressedName );
402 DALI_TEST_CHECK( event3.keyString == data.receivedKeyEvent.keyPressed );
403 DALI_TEST_CHECK( event3.state == static_cast<Integration::KeyEvent::State>( data.receivedKeyEvent.state ) );
407 Integration::KeyEvent event4( "a", "", "a", 0, 0, 0, Integration::KeyEvent::Up, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE );
408 application.ProcessEvent( event4 );
410 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
411 DALI_TEST_CHECK( event4.keyModifier == data.receivedKeyEvent.keyModifier );
412 DALI_TEST_CHECK( event4.keyName == data.receivedKeyEvent.keyPressedName );
413 DALI_TEST_CHECK( event4.keyString == data.receivedKeyEvent.keyPressed );
414 DALI_TEST_CHECK( event4.state == static_cast<Integration::KeyEvent::State>( data.receivedKeyEvent.state ) );
418 int UtcDaliSceneSignalKeyEventN(void)
420 TestApplication application;
421 Dali::Integration::Scene scene = application.GetScene();
423 KeyEventSignalData data;
424 KeyEventReceivedFunctor functor( data );
425 scene.KeyEventSignal().Connect( &application, functor );
427 // Check that a non-pressed key events data is not modified.
428 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
433 int UtcDaliSceneTouchSignalP(void)
435 TestApplication application;
436 Dali::Integration::Scene scene = application.GetScene();
438 TouchedSignalData data;
439 TouchFunctor functor( data );
440 scene.TouchSignal().Connect( &application, functor );
442 // Render and notify.
443 application.SendNotification();
444 application.Render();
446 // Basic test: No actors, single touch (down then up).
448 GenerateTouch( application, PointState::DOWN, Vector2( 10.0f, 10.0f ) );
450 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
451 DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u );
452 DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0) );
455 GenerateTouch( application, PointState::UP, Vector2( 10.0f, 10.0f ) );
457 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
458 DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u );
459 DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0) );
463 // Add an actor to the scene.
464 Actor actor = Actor::New();
465 actor.SetSize( 100.0f, 100.0f );
466 actor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
467 actor.SetParentOrigin( ParentOrigin::TOP_LEFT );
468 actor.TouchedSignal().Connect( &DummyTouchCallback );
471 // Render and notify.
472 application.SendNotification();
473 application.Render();
475 // Actor on scene, single touch, down in actor, motion, then up outside actor.
477 GenerateTouch( application, PointState::DOWN, Vector2( 10.0f, 10.0f ) );
479 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
480 DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u );
481 DALI_TEST_CHECK( data.receivedTouchData.GetHitActor(0) == actor );
484 GenerateTouch( application, PointState::MOTION, Vector2( 150.0f, 10.0f ) ); // Some motion
486 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
489 GenerateTouch( application, PointState::UP, Vector2( 150.0f, 10.0f ) ); // Some motion
491 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
492 DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u );
493 DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0) );
497 // Multiple touch. Should only receive a touch on first down and last up.
499 Integration::TouchEvent touchEvent;
500 Integration::Point point;
503 point.SetState( PointState::DOWN );
504 point.SetScreenPosition( Vector2( 10.0f, 10.0f ) );
505 touchEvent.points.push_back( point );
506 application.ProcessEvent( touchEvent );
507 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
508 DALI_TEST_EQUALS( data.receivedTouchData.GetPointCount(), 1u, TEST_LOCATION );
512 touchEvent.points[0].SetState( PointState::STATIONARY );
513 point.SetDeviceId( 1 );
514 point.SetScreenPosition( Vector2( 50.0f, 50.0f ) );
515 touchEvent.points.push_back( point );
516 application.ProcessEvent( touchEvent );
517 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
520 // Primary point is up
521 touchEvent.points[0].SetState( PointState::UP );
522 touchEvent.points[1].SetState( PointState::STATIONARY );
523 application.ProcessEvent( touchEvent );
524 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
527 // Remove 1st point now, 2nd point is now in motion
528 touchEvent.points.erase( touchEvent.points.begin() );
529 touchEvent.points[0].SetState( PointState::MOTION );
530 touchEvent.points[0].SetScreenPosition( Vector2( 150.0f, 50.0f ) );
531 application.ProcessEvent( touchEvent );
532 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
536 touchEvent.points[0].SetState( PointState::UP );
537 application.ProcessEvent( touchEvent );
538 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
539 DALI_TEST_EQUALS( data.receivedTouchData.GetPointCount(), 1u, TEST_LOCATION );
545 int UtcDaliSceneTouchSignalN(void)
547 TestApplication application;
548 Dali::Integration::Scene scene = application.GetScene();
550 TouchedSignalData data;
551 TouchFunctor functor( data );
552 scene.TouchSignal().Connect( &application, functor );
554 // Render and notify.
555 application.SendNotification();
556 application.Render();
558 // Confirm functor not called before there has been any touch event.
559 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
561 // No actors, single touch, down, motion then up.
563 GenerateTouch( application, PointState::DOWN, Vector2( 10.0f, 10.0f ) );
565 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
566 DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u );
567 DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0));
571 // Confirm there is no signal when the touchpoint is only moved.
572 GenerateTouch( application, PointState::MOTION, Vector2( 1200.0f, 10.0f ) ); // Some motion
574 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
577 // Confirm a following up event generates a signal.
578 GenerateTouch( application, PointState::UP, Vector2( 1200.0f, 10.0f ) );
580 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
581 DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u );
582 DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0));
586 // Add an actor to the scene.
587 Actor actor = Actor::New();
588 actor.SetSize( 100.0f, 100.0f );
589 actor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
590 actor.SetParentOrigin( ParentOrigin::TOP_LEFT );
591 actor.TouchedSignal().Connect( &DummyTouchCallback );
594 // Render and notify.
595 application.SendNotification();
596 application.Render();
598 // Actor on scene. Interrupted before down and interrupted after down.
600 GenerateTouch( application, PointState::INTERRUPTED, Vector2( 10.0f, 10.0f ) );
602 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
603 DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u );
604 DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0) );
605 DALI_TEST_CHECK( data.receivedTouchData.GetState(0) == PointState::INTERRUPTED );
608 GenerateTouch( application, PointState::DOWN, Vector2( 10.0f, 10.0f ) );
610 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
611 DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u );
612 DALI_TEST_CHECK( data.receivedTouchData.GetHitActor(0) == actor );
613 DALI_TEST_CHECK( data.receivedTouchData.GetState(0) == PointState::DOWN );
616 GenerateTouch( application, PointState::INTERRUPTED, Vector2( 10.0f, 10.0f ) );
618 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
619 DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u );
620 DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0) );
621 DALI_TEST_CHECK( data.receivedTouchData.GetState(0) == PointState::INTERRUPTED );
623 DALI_TEST_EQUALS( data.receivedTouchData.GetPointCount(), 1u, TEST_LOCATION );
625 // Check that getting info about a non-existent point returns an empty handle
626 Actor actor = data.receivedTouchData.GetHitActor( 1 );
627 DALI_TEST_CHECK( !actor );
635 int UtcDaliSceneSignalWheelEventP(void)
637 TestApplication application;
638 Dali::Integration::Scene scene = application.GetScene();
640 WheelEventSignalData data;
641 WheelEventReceivedFunctor functor( data );
642 scene.WheelEventSignal().Connect( &application, functor );
644 Integration::WheelEvent event( Integration::WheelEvent::CUSTOM_WHEEL, 0, 0u, Vector2( 0.0f, 0.0f ), 1, 1000u );
645 application.ProcessEvent( event );
647 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
648 DALI_TEST_CHECK( static_cast< WheelEvent::Type >(event.type) == data.receivedWheelEvent.type );
649 DALI_TEST_CHECK( event.direction == data.receivedWheelEvent.direction );
650 DALI_TEST_CHECK( event.modifiers == data.receivedWheelEvent.modifiers );
651 DALI_TEST_CHECK( event.point == data.receivedWheelEvent.point );
652 DALI_TEST_CHECK( event.z == data.receivedWheelEvent.z );
653 DALI_TEST_CHECK( event.timeStamp == data.receivedWheelEvent.timeStamp );
657 Integration::WheelEvent event2( Integration::WheelEvent::CUSTOM_WHEEL, 0, 0u, Vector2( 0.0f, 0.0f ), -1, 1000u );
658 application.ProcessEvent( event2 );
660 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
661 DALI_TEST_CHECK( static_cast< WheelEvent::Type >(event2.type) == data.receivedWheelEvent.type );
662 DALI_TEST_CHECK( event2.direction == data.receivedWheelEvent.direction );
663 DALI_TEST_CHECK( event2.modifiers == data.receivedWheelEvent.modifiers );
664 DALI_TEST_CHECK( event2.point == data.receivedWheelEvent.point );
665 DALI_TEST_CHECK( event2.z == data.receivedWheelEvent.z );
666 DALI_TEST_CHECK( event2.timeStamp == data.receivedWheelEvent.timeStamp );