2 * Copyright (c) 2020 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>
28 #include <mesh-builder.h>
30 // Internal headers are allowed here
35 const std::string DEFAULT_DEVICE_NAME("hwKeyboard");
37 // Functor for EventProcessingFinished signal
38 struct EventProcessingFinishedFunctor
41 * @param[in] eventProcessingFinished reference to a boolean variable used to check if signal has been called.
43 EventProcessingFinishedFunctor( bool& eventProcessingFinished )
44 : mEventProcessingFinished( eventProcessingFinished )
49 mEventProcessingFinished = true;
52 bool& mEventProcessingFinished;
55 // Stores data that is populated in the key-event callback and will be read by the TET cases
56 struct KeyEventSignalData
59 : functorCalled(false)
64 functorCalled = false;
66 receivedKeyEvent.keyModifier = 0;
67 receivedKeyEvent.keyPressedName.clear();
68 receivedKeyEvent.keyPressed.clear();
72 KeyEvent receivedKeyEvent;
75 // Functor that sets the data when called
76 struct KeyEventReceivedFunctor
78 KeyEventReceivedFunctor( KeyEventSignalData& data ) : signalData( data ) { }
80 bool operator()( const KeyEvent& keyEvent )
82 signalData.functorCalled = true;
83 signalData.receivedKeyEvent = keyEvent;
88 KeyEventSignalData& signalData;
91 // Stores data that is populated in the touched signal callback and will be read by the TET cases
92 struct TouchedSignalData
95 : functorCalled(false),
96 createNewScene(false),
97 newSceneCreated(false)
102 functorCalled = false;
103 createNewScene = false;
104 newSceneCreated = false;
106 receivedTouchEvent.points.clear();
107 receivedTouchEvent.time = 0;
109 receivedTouchData.Reset();
114 bool newSceneCreated;
115 TouchEvent receivedTouchEvent;
116 TouchData receivedTouchData;
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 // Functor that sets the data when touched signal is received
136 TouchFunctor( TouchedSignalData& data ) : signalData( data ) { }
138 void operator()( const TouchData& touch )
140 signalData.functorCalled = true;
141 signalData.receivedTouchData = touch;
143 if ( signalData.createNewScene )
145 Dali::Integration::Scene scene = Dali::Integration::Scene::New( Size( 480.0f, 800.0f ) );
146 DALI_TEST_CHECK( scene );
148 signalData.newSceneCreated = true;
154 signalData.functorCalled = true;
157 TouchedSignalData& signalData;
160 // Stores data that is populated in the wheel-event callback and will be read by the TET cases
161 struct WheelEventSignalData
163 WheelEventSignalData()
164 : functorCalled(false)
169 functorCalled = false;
173 WheelEvent receivedWheelEvent;
176 // Functor that sets the data when wheel-event signal is received
177 struct WheelEventReceivedFunctor
179 WheelEventReceivedFunctor( WheelEventSignalData& data ) : signalData( data ) { }
181 bool operator()( const WheelEvent& wheelEvent )
183 signalData.functorCalled = true;
184 signalData.receivedWheelEvent = wheelEvent;
189 WheelEventSignalData& signalData;
192 // Stores data that is populated in the KeyEventGeneratedSignal callback and will be read by the TET cases
193 struct KeyEventGeneratedSignalData
195 KeyEventGeneratedSignalData()
196 : functorCalled(false)
201 functorCalled = false;
203 receivedKeyEvent.keyModifier = 0;
204 receivedKeyEvent.keyPressedName.clear();
205 receivedKeyEvent.keyPressed.clear();
209 KeyEvent receivedKeyEvent;
212 // Functor that sets the data when called
213 struct KeyEventGeneratedReceivedFunctor
215 KeyEventGeneratedReceivedFunctor( KeyEventGeneratedSignalData& data )
219 bool operator()( const KeyEvent& keyEvent )
221 signalData.functorCalled = true;
222 signalData.receivedKeyEvent = keyEvent;
229 signalData.functorCalled = true;
233 KeyEventGeneratedSignalData& signalData;
236 void GenerateTouch( TestApplication& application, PointState::Type state, const Vector2& screenPosition )
238 Integration::TouchEvent touchEvent;
239 Integration::Point point;
240 point.SetState( state );
241 point.SetScreenPosition( screenPosition );
242 touchEvent.points.push_back( point );
243 application.ProcessEvent( touchEvent );
246 bool DummyTouchCallback( Actor actor, const TouchEvent& touch )
251 } // unnamed namespace
253 int UtcDaliSceneAdd(void)
255 TestApplication application;
256 tet_infoline("Testing Dali::Integration::Scene::Add");
258 Dali::Integration::Scene scene = application.GetScene();
260 Actor actor = Actor::New();
261 DALI_TEST_CHECK( !actor.OnStage() );
264 DALI_TEST_CHECK( actor.OnStage() );
269 int UtcDaliSceneRemove(void)
271 TestApplication application;
272 tet_infoline("Testing Dali::Integration::Scene::Remove");
274 Dali::Integration::Scene scene = application.GetScene();
276 Actor actor = Actor::New();
277 DALI_TEST_CHECK( !actor.OnStage() );
280 DALI_TEST_CHECK( actor.OnStage() );
283 DALI_TEST_CHECK( !actor.OnStage() );
288 int UtcDaliSceneGetSize(void)
290 TestApplication application;
291 tet_infoline("Testing Dali::Integration::Scene::GetSize");
293 Dali::Integration::Scene scene = application.GetScene();
294 Size size = scene.GetSize();
295 DALI_TEST_EQUALS( TestApplication::DEFAULT_SURFACE_WIDTH, size.width, TEST_LOCATION );
296 DALI_TEST_EQUALS( TestApplication::DEFAULT_SURFACE_HEIGHT, size.height, TEST_LOCATION );
301 int UtcDaliSceneGetDpi(void)
303 TestApplication application; // Initializes core DPI to default values
305 // Test that setting core DPI explicitly also sets up the scene's DPI.
306 Dali::Integration::Scene scene = application.GetScene();
307 scene.SetDpi( Vector2(200.0f, 180.0f) );
308 Vector2 dpi = scene.GetDpi();
309 DALI_TEST_EQUALS( dpi.x, 200.0f, TEST_LOCATION );
310 DALI_TEST_EQUALS( dpi.y, 180.0f, TEST_LOCATION );
314 int UtcDaliSceneGetRenderTaskList(void)
316 TestApplication application;
317 tet_infoline("Testing Dali::Integration::Scene::GetRenderTaskList");
319 Dali::Integration::Scene scene = application.GetScene();
321 // Check we get a valid instance.
322 const RenderTaskList& tasks = scene.GetRenderTaskList();
324 // There should be 1 task by default.
325 DALI_TEST_EQUALS( tasks.GetTaskCount(), 1u, TEST_LOCATION );
327 // RenderTaskList has it's own UTC tests.
328 // But we can confirm that GetRenderTaskList in Stage retrieves the same RenderTaskList each time.
329 RenderTask newTask = scene.GetRenderTaskList().CreateTask();
331 DALI_TEST_EQUALS( scene.GetRenderTaskList().GetTask( 1 ), newTask, TEST_LOCATION );
336 int UtcDaliSceneGetRootLayer(void)
338 TestApplication application;
339 tet_infoline("Testing Dali::Integration::Scene::GetRootLayer");
341 Dali::Integration::Scene scene = application.GetScene();
342 Layer layer = scene.GetLayer( 0 );
343 DALI_TEST_CHECK( layer );
345 // Check that GetRootLayer() correctly retreived layer 0.
346 DALI_TEST_CHECK( scene.GetRootLayer() == layer );
351 int UtcDaliSceneGetLayerCount(void)
353 TestApplication application;
354 tet_infoline("Testing Dali::Integration::Scene::GetLayerCount");
356 Dali::Integration::Scene scene = application.GetScene();
357 // Initially we have a default layer
358 DALI_TEST_EQUALS( scene.GetLayerCount(), 1u, TEST_LOCATION );
360 Layer layer = Layer::New();
363 DALI_TEST_EQUALS( scene.GetLayerCount(), 2u, TEST_LOCATION );
367 int UtcDaliSceneGetLayer(void)
369 TestApplication application;
370 tet_infoline("Testing Dali::Integration::Scene::GetLayer");
372 Dali::Integration::Scene scene = application.GetScene();
374 Layer rootLayer = scene.GetLayer( 0 );
375 DALI_TEST_CHECK( rootLayer );
377 Layer layer = Layer::New();
380 Layer sameLayer = scene.GetLayer( 1 );
381 DALI_TEST_CHECK( layer == sameLayer );
386 int UtcDaliSceneGet(void)
388 TestApplication application;
389 tet_infoline("Testing Dali::Integration::Scene::Get");
391 Dali::Integration::Scene scene = application.GetScene();
393 Actor actor = Actor::New();
394 DALI_TEST_CHECK( Dali::Integration::Scene() == Dali::Integration::Scene::Get( actor ) );
398 DALI_TEST_CHECK( scene == Dali::Integration::Scene::Get( actor ) );
403 int UtcDaliSceneDiscard(void)
405 TestApplication application;
406 tet_infoline("Testing Dali::Scene::Discard");
408 // Create a new Scene
409 Dali::Integration::Scene scene = Dali::Integration::Scene::New( Size( 480.0f, 800.0f ) );
410 DALI_TEST_CHECK( scene );
412 // One reference of scene kept here and the other one kept in the Core
413 DALI_TEST_CHECK( scene.GetBaseObject().ReferenceCount() == 2 );
415 // Render and notify.
416 application.SendNotification();
417 application.Render(0);
419 // Keep the reference of the root layer handle so it will still be alive after the scene is deleted
420 Layer rootLayer = scene.GetRootLayer();
421 DALI_TEST_CHECK( rootLayer );
422 DALI_TEST_CHECK( rootLayer.GetBaseObject().ReferenceCount() == 2 );
424 // Request to discard the scene from the Core
426 DALI_TEST_CHECK( scene.GetBaseObject().ReferenceCount() == 1 );
428 // Reset the scene handle
431 // Render and notify.
432 application.SendNotification();
433 application.Render(0);
435 // At this point, the scene should have been automatically deleted
436 // To prove this, the ref count of the root layer handle should be decremented to 1
437 DALI_TEST_CHECK( rootLayer.GetBaseObject().ReferenceCount() == 1 );
439 // Delete the root layer handle
442 // Render and notify.
443 application.SendNotification();
444 application.Render(0);
449 int UtcDaliSceneCreateNewSceneDuringCoreEventProcessing(void)
451 TestApplication application;
453 Dali::Integration::Scene scene = application.GetScene();
455 TouchedSignalData data;
456 data.createNewScene = true;
457 TouchFunctor functor( data );
458 scene.TouchSignal().Connect( &application, functor );
460 // Render and notify.
461 application.SendNotification();
462 application.Render();
464 GenerateTouch( application, PointState::DOWN, Vector2( 10.0f, 10.0f ) );
466 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
467 DALI_TEST_EQUALS( true, data.createNewScene, TEST_LOCATION );
468 DALI_TEST_EQUALS( true, data.newSceneCreated, TEST_LOCATION );
474 int UtcDaliSceneRootLayerAndSceneAlignment(void)
476 TestApplication application;
479 Dali::Integration::Scene scene = Dali::Integration::Scene::New( Size( 480.0f, 800.0f ) );
480 DALI_TEST_CHECK( scene );
482 // One reference of scene kept here and the other one kept in the Core
483 DALI_TEST_CHECK( scene.GetBaseObject().ReferenceCount() == 2 );
485 // Add a renderable actor to the scene
486 auto actor = CreateRenderableActor();
489 // Render and notify.
490 application.SendNotification();
491 application.Render(0);
493 // Keep the reference of the root layer handle so it will still be alive after the scene is deleted
494 Layer rootLayer = scene.GetRootLayer();
495 DALI_TEST_CHECK( rootLayer );
496 DALI_TEST_CHECK( rootLayer.GetBaseObject().ReferenceCount() == 2 );
498 // Request to discard the scene from the Core
500 DALI_TEST_CHECK( scene.GetBaseObject().ReferenceCount() == 1 );
502 // Reset the scene handle
505 // Render and notify.
506 application.SendNotification();
507 application.Render(0);
509 // At this point, the scene should have been automatically deleted
510 // To prove this, the ref count of the root layer handle should be decremented to 1
511 DALI_TEST_CHECK( rootLayer.GetBaseObject().ReferenceCount() == 1 );
513 // Create a new Scene while the root layer of the deleted scene is still alive
514 Dali::Integration::Scene newScene = Dali::Integration::Scene::New( Size( 480.0f, 800.0f ) );
515 DALI_TEST_CHECK( newScene );
517 // Render and notify.
518 application.SendNotification();
519 application.Render(0);
521 // At this point, we have only one scene but two root layers
522 // The root layer of the deleted scene is still alive
523 DALI_TEST_CHECK( rootLayer.GetBaseObject().ReferenceCount() == 1 );
525 // Delete the root layer of the deleted scene
528 // Render and notify.
529 application.SendNotification();
530 application.Render(0);
535 int UtcDaliSceneEventProcessingFinishedP(void)
537 TestApplication application;
538 Dali::Integration::Scene scene = application.GetScene();
540 bool eventProcessingFinished = false;
541 EventProcessingFinishedFunctor functor( eventProcessingFinished );
542 scene.EventProcessingFinishedSignal().Connect( &application, functor );
544 Actor actor( Actor::New() );
547 application.SendNotification();
548 application.Render();
550 DALI_TEST_CHECK( eventProcessingFinished );
555 int UtcDaliSceneEventProcessingFinishedN(void)
557 TestApplication application;
558 Dali::Integration::Scene scene = application.GetScene();
560 bool eventProcessingFinished = false;
561 EventProcessingFinishedFunctor functor( eventProcessingFinished );
562 scene.EventProcessingFinishedSignal().Connect( &application, functor );
564 Actor actor( Actor::New() );
567 // Do not complete event processing and confirm the signal has not been emitted.
568 DALI_TEST_CHECK( !eventProcessingFinished );
573 int UtcDaliSceneSignalKeyEventP(void)
575 TestApplication application;
576 Dali::Integration::Scene scene = application.GetScene();
578 KeyEventSignalData data;
579 KeyEventReceivedFunctor functor( data );
580 scene.KeyEventSignal().Connect( &application, functor );
582 Integration::KeyEvent event( "i", "", "i", 0, 0, 0, Integration::KeyEvent::Down, "i", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE );
583 application.ProcessEvent( event );
585 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
586 DALI_TEST_CHECK( event.keyModifier == data.receivedKeyEvent.keyModifier );
587 DALI_TEST_CHECK( event.keyName == data.receivedKeyEvent.keyPressedName );
588 DALI_TEST_CHECK( event.keyString == data.receivedKeyEvent.keyPressed );
589 DALI_TEST_CHECK( event.state == static_cast<Integration::KeyEvent::State>( data.receivedKeyEvent.state ) );
593 Integration::KeyEvent event2( "i", "", "i", 0, 0, 0, Integration::KeyEvent::Up, "i", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE );
594 application.ProcessEvent( event2 );
596 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
597 DALI_TEST_CHECK( event2.keyModifier == data.receivedKeyEvent.keyModifier );
598 DALI_TEST_CHECK( event2.keyName == data.receivedKeyEvent.keyPressedName );
599 DALI_TEST_CHECK( event2.keyString == data.receivedKeyEvent.keyPressed );
600 DALI_TEST_CHECK( event2.state == static_cast<Integration::KeyEvent::State>( data.receivedKeyEvent.state ) );
604 Integration::KeyEvent event3( "a", "", "a", 0, 0, 0, Integration::KeyEvent::Down, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE );
605 application.ProcessEvent( event3 );
607 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
608 DALI_TEST_CHECK( event3.keyModifier == data.receivedKeyEvent.keyModifier );
609 DALI_TEST_CHECK( event3.keyName == data.receivedKeyEvent.keyPressedName );
610 DALI_TEST_CHECK( event3.keyString == data.receivedKeyEvent.keyPressed );
611 DALI_TEST_CHECK( event3.state == static_cast<Integration::KeyEvent::State>( data.receivedKeyEvent.state ) );
615 Integration::KeyEvent event4( "a", "", "a", 0, 0, 0, Integration::KeyEvent::Up, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE );
616 application.ProcessEvent( event4 );
618 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
619 DALI_TEST_CHECK( event4.keyModifier == data.receivedKeyEvent.keyModifier );
620 DALI_TEST_CHECK( event4.keyName == data.receivedKeyEvent.keyPressedName );
621 DALI_TEST_CHECK( event4.keyString == data.receivedKeyEvent.keyPressed );
622 DALI_TEST_CHECK( event4.state == static_cast<Integration::KeyEvent::State>( data.receivedKeyEvent.state ) );
626 int UtcDaliSceneSignalKeyEventN(void)
628 TestApplication application;
629 Dali::Integration::Scene scene = application.GetScene();
631 KeyEventSignalData data;
632 KeyEventReceivedFunctor functor( data );
633 scene.KeyEventSignal().Connect( &application, functor );
635 // Check that a non-pressed key events data is not modified.
636 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
641 int UtcDaliSceneTouchSignalP(void)
643 TestApplication application;
644 Dali::Integration::Scene scene = application.GetScene();
646 TouchedSignalData data;
647 TouchFunctor functor( data );
648 scene.TouchSignal().Connect( &application, functor );
650 // Render and notify.
651 application.SendNotification();
652 application.Render();
654 // Basic test: No actors, single touch (down then up).
656 GenerateTouch( application, PointState::DOWN, Vector2( 10.0f, 10.0f ) );
658 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
659 DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u );
660 DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0) );
663 GenerateTouch( application, PointState::UP, Vector2( 10.0f, 10.0f ) );
665 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
666 DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u );
667 DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0) );
671 // Add an actor to the scene.
672 Actor actor = Actor::New();
673 actor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
674 actor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
675 actor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT );
676 actor.TouchedSignal().Connect( &DummyTouchCallback );
679 // Render and notify.
680 application.SendNotification();
681 application.Render();
683 // Actor on scene, single touch, down in actor, motion, then up outside actor.
685 GenerateTouch( application, PointState::DOWN, Vector2( 10.0f, 10.0f ) );
687 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
688 DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u );
689 DALI_TEST_CHECK( data.receivedTouchData.GetHitActor(0) == actor );
692 GenerateTouch( application, PointState::MOTION, Vector2( 150.0f, 10.0f ) ); // Some motion
694 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
697 GenerateTouch( application, PointState::UP, Vector2( 150.0f, 10.0f ) ); // Some motion
699 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
700 DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u );
701 DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0) );
705 // Multiple touch. Should only receive a touch on first down and last up.
707 Integration::TouchEvent touchEvent;
708 Integration::Point point;
711 point.SetState( PointState::DOWN );
712 point.SetScreenPosition( Vector2( 10.0f, 10.0f ) );
713 touchEvent.points.push_back( point );
714 application.ProcessEvent( touchEvent );
715 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
716 DALI_TEST_EQUALS( data.receivedTouchData.GetPointCount(), 1u, TEST_LOCATION );
720 touchEvent.points[0].SetState( PointState::STATIONARY );
721 point.SetDeviceId( 1 );
722 point.SetScreenPosition( Vector2( 50.0f, 50.0f ) );
723 touchEvent.points.push_back( point );
724 application.ProcessEvent( touchEvent );
725 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
728 // Primary point is up
729 touchEvent.points[0].SetState( PointState::UP );
730 touchEvent.points[1].SetState( PointState::STATIONARY );
731 application.ProcessEvent( touchEvent );
732 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
735 // Remove 1st point now, 2nd point is now in motion
736 touchEvent.points.erase( touchEvent.points.begin() );
737 touchEvent.points[0].SetState( PointState::MOTION );
738 touchEvent.points[0].SetScreenPosition( Vector2( 150.0f, 50.0f ) );
739 application.ProcessEvent( touchEvent );
740 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
744 touchEvent.points[0].SetState( PointState::UP );
745 application.ProcessEvent( touchEvent );
746 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
747 DALI_TEST_EQUALS( data.receivedTouchData.GetPointCount(), 1u, TEST_LOCATION );
753 int UtcDaliSceneTouchSignalN(void)
755 TestApplication application;
756 Dali::Integration::Scene scene = application.GetScene();
758 TouchedSignalData data;
759 TouchFunctor functor( data );
760 scene.TouchSignal().Connect( &application, functor );
762 // Render and notify.
763 application.SendNotification();
764 application.Render();
766 // Confirm functor not called before there has been any touch event.
767 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
769 // No actors, single touch, down, motion then up.
771 GenerateTouch( application, PointState::DOWN, Vector2( 10.0f, 10.0f ) );
773 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
774 DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u );
775 DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0));
779 // Confirm there is no signal when the touchpoint is only moved.
780 GenerateTouch( application, PointState::MOTION, Vector2( 1200.0f, 10.0f ) ); // Some motion
782 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
785 // Confirm a following up event generates a signal.
786 GenerateTouch( application, PointState::UP, Vector2( 1200.0f, 10.0f ) );
788 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
789 DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u );
790 DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0));
794 // Add an actor to the scene.
795 Actor actor = Actor::New();
796 actor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
797 actor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
798 actor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT );
799 actor.TouchedSignal().Connect( &DummyTouchCallback );
802 // Render and notify.
803 application.SendNotification();
804 application.Render();
806 // Actor on scene. Interrupted before down and interrupted after down.
808 GenerateTouch( application, PointState::INTERRUPTED, Vector2( 10.0f, 10.0f ) );
810 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
811 DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u );
812 DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0) );
813 DALI_TEST_CHECK( data.receivedTouchData.GetState(0) == PointState::INTERRUPTED );
816 GenerateTouch( application, PointState::DOWN, Vector2( 10.0f, 10.0f ) );
818 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
819 DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u );
820 DALI_TEST_CHECK( data.receivedTouchData.GetHitActor(0) == actor );
821 DALI_TEST_CHECK( data.receivedTouchData.GetState(0) == PointState::DOWN );
824 GenerateTouch( application, PointState::INTERRUPTED, Vector2( 10.0f, 10.0f ) );
826 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
827 DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u );
828 DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0) );
829 DALI_TEST_CHECK( data.receivedTouchData.GetState(0) == PointState::INTERRUPTED );
831 DALI_TEST_EQUALS( data.receivedTouchData.GetPointCount(), 1u, TEST_LOCATION );
833 // Check that getting info about a non-existent point returns an empty handle
834 Actor actor = data.receivedTouchData.GetHitActor( 1 );
835 DALI_TEST_CHECK( !actor );
843 int UtcDaliSceneSignalWheelEventP(void)
845 TestApplication application;
846 Dali::Integration::Scene scene = application.GetScene();
848 WheelEventSignalData data;
849 WheelEventReceivedFunctor functor( data );
850 scene.WheelEventSignal().Connect( &application, functor );
852 Integration::WheelEvent event( Integration::WheelEvent::CUSTOM_WHEEL, 0, 0u, Vector2( 0.0f, 0.0f ), 1, 1000u );
853 application.ProcessEvent( event );
855 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
856 DALI_TEST_CHECK( static_cast< WheelEvent::Type >(event.type) == data.receivedWheelEvent.type );
857 DALI_TEST_CHECK( event.direction == data.receivedWheelEvent.direction );
858 DALI_TEST_CHECK( event.modifiers == data.receivedWheelEvent.modifiers );
859 DALI_TEST_CHECK( event.point == data.receivedWheelEvent.point );
860 DALI_TEST_CHECK( event.z == data.receivedWheelEvent.z );
861 DALI_TEST_CHECK( event.timeStamp == data.receivedWheelEvent.timeStamp );
865 Integration::WheelEvent event2( Integration::WheelEvent::CUSTOM_WHEEL, 0, 0u, Vector2( 0.0f, 0.0f ), -1, 1000u );
866 application.ProcessEvent( event2 );
868 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
869 DALI_TEST_CHECK( static_cast< WheelEvent::Type >(event2.type) == data.receivedWheelEvent.type );
870 DALI_TEST_CHECK( event2.direction == data.receivedWheelEvent.direction );
871 DALI_TEST_CHECK( event2.modifiers == data.receivedWheelEvent.modifiers );
872 DALI_TEST_CHECK( event2.point == data.receivedWheelEvent.point );
873 DALI_TEST_CHECK( event2.z == data.receivedWheelEvent.z );
874 DALI_TEST_CHECK( event2.timeStamp == data.receivedWheelEvent.timeStamp );
878 int UtcDaliSceneSurfaceResizedDefaultScene(void)
880 tet_infoline( "Ensure resizing of the surface is handled properly" );
882 TestApplication application;
884 auto defaultScene = application.GetScene();
885 DALI_TEST_CHECK( defaultScene );
887 // Ensure stage size matches the scene size
888 auto stage = Stage::GetCurrent();
889 DALI_TEST_EQUALS( stage.GetSize(), defaultScene.GetSize(), TEST_LOCATION );
892 Vector2 newSize( 1000.0f, 2000.0f );
893 DALI_TEST_CHECK( stage.GetSize() != newSize );
894 defaultScene.SurfaceResized( newSize.width, newSize.height );
896 DALI_TEST_EQUALS( stage.GetSize(), newSize, TEST_LOCATION );
897 DALI_TEST_EQUALS( defaultScene.GetSize(), newSize, TEST_LOCATION );
902 int UtcDaliSceneSurfaceResizedDefaultSceneViewport(void)
904 tet_infoline( "Ensure resizing of the surface & viewport is handled properly" );
906 TestApplication application;
907 TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
908 TraceCallStack& callStack = glAbstraction.GetViewportTrace();
909 glAbstraction.EnableViewportCallTrace( true );
911 // Initial scene setup
912 Geometry geometry = CreateQuadGeometry();
913 Shader shader = CreateShader();
914 Renderer renderer = Renderer::New( geometry, shader );
916 Actor actor = Actor::New();
917 actor.AddRenderer(renderer);
918 actor.SetProperty( Actor::Property::SIZE, Vector2( 400.0f, 400.0f ) );
919 Stage::GetCurrent().Add(actor);
921 // Render before resizing surface
922 application.SendNotification();
923 application.Render(0);
924 glAbstraction.ResetViewportCallStack();
926 auto defaultScene = application.GetScene();
927 DALI_TEST_CHECK( defaultScene );
929 // Ensure stage size matches the scene size
930 auto stage = Stage::GetCurrent();
931 DALI_TEST_EQUALS( stage.GetSize(), defaultScene.GetSize(), TEST_LOCATION );
934 Vector2 newSize( 1000.0f, 2000.0f );
935 std::string viewportParams( "0, 0, 1000, 2000" ); // to match newSize
936 DALI_TEST_CHECK( stage.GetSize() != newSize );
937 defaultScene.SurfaceResized( newSize.width, newSize.height );
939 DALI_TEST_EQUALS( stage.GetSize(), newSize, TEST_LOCATION );
940 DALI_TEST_EQUALS( defaultScene.GetSize(), newSize, TEST_LOCATION );
942 // Render after resizing surface
943 application.SendNotification();
944 application.Render(0);
946 // Check that the viewport is handled properly
947 DALI_TEST_CHECK( callStack.FindMethodAndGetParameters("Viewport", viewportParams ) );
952 int UtcDaliSceneSurfaceResizedMultipleRenderTasks(void)
954 tet_infoline( "Ensure resizing of the surface & viewport is handled properly" );
956 TestApplication application;
957 TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
958 TraceCallStack& callStack = glAbstraction.GetViewportTrace();
959 glAbstraction.EnableViewportCallTrace( true );
961 // Initial scene setup
962 auto stage = Stage::GetCurrent();
964 Geometry geometry = CreateQuadGeometry();
965 Shader shader = CreateShader();
966 Renderer renderer = Renderer::New( geometry, shader );
968 Actor actor = Actor::New();
969 actor.AddRenderer(renderer);
971 int testHeight = 400;
972 actor.SetProperty( Actor::Property::SIZE, Vector2( testWidth, testHeight) );
975 CameraActor offscreenCameraActor = CameraActor::New( Size( testWidth, testHeight ) );
976 Stage::GetCurrent().Add( offscreenCameraActor );
978 FrameBuffer newFrameBuffer = FrameBuffer::New( testWidth, testHeight, FrameBuffer::Attachment::NONE );
980 RenderTask newTask = stage.GetRenderTaskList().CreateTask();
981 newTask.SetCameraActor( offscreenCameraActor );
982 newTask.SetSourceActor( actor );
983 newTask.SetFrameBuffer( newFrameBuffer );
984 newTask.SetViewportPosition( Vector2(0, 0) );
985 newTask.SetViewportSize( Vector2(testWidth, testHeight) );
987 // Render before resizing surface
988 application.SendNotification();
989 application.Render(0);
990 glAbstraction.ResetViewportCallStack();
992 Rect<int32_t> initialViewport = newTask.GetViewport();
993 int initialWidth = initialViewport.width;
994 int initialHeight = initialViewport.height;
995 DALI_TEST_EQUALS( initialWidth, testWidth, TEST_LOCATION );
996 DALI_TEST_EQUALS( initialHeight, testHeight, TEST_LOCATION );
998 auto defaultScene = application.GetScene();
999 DALI_TEST_CHECK( defaultScene );
1001 // Ensure stage size matches the scene size
1002 DALI_TEST_EQUALS( stage.GetSize(), defaultScene.GetSize(), TEST_LOCATION );
1005 Vector2 newSize( 1000.0f, 2000.0f );
1006 std::string viewportParams( "0, 0, 1000, 2000" ); // to match newSize
1007 DALI_TEST_CHECK( stage.GetSize() != newSize );
1008 defaultScene.SurfaceResized( newSize.width, newSize.height );
1010 DALI_TEST_EQUALS( stage.GetSize(), newSize, TEST_LOCATION );
1011 DALI_TEST_EQUALS( defaultScene.GetSize(), newSize, TEST_LOCATION );
1013 // Render after resizing surface
1014 application.SendNotification();
1015 application.Render(0);
1017 // Check that the viewport is handled properly
1018 DALI_TEST_CHECK( callStack.FindMethodAndGetParameters("Viewport", viewportParams ) );
1020 // Second render-task should not be affected
1021 Rect<int32_t> viewport = newTask.GetViewport();
1022 int width = viewport.width;
1023 int height = viewport.height;
1024 DALI_TEST_EQUALS( width, testWidth, TEST_LOCATION );
1025 DALI_TEST_EQUALS( height, testHeight, TEST_LOCATION );
1030 int UtcDaliSceneSurfaceResizedAdditionalScene(void)
1032 tet_infoline( "Ensure resizing of the surface is handled properly on additional scenes" );
1034 TestApplication application;
1035 Vector2 originalSurfaceSize( 500.0f, 1000.0f );
1037 auto scene = Integration::Scene::New( Size( originalSurfaceSize.width, originalSurfaceSize.height ) );
1039 // Ensure stage size does NOT match the surface size
1040 auto stage = Stage::GetCurrent();
1041 const auto stageSize = stage.GetSize();
1042 DALI_TEST_CHECK( stageSize != originalSurfaceSize );
1043 DALI_TEST_EQUALS( originalSurfaceSize, scene.GetSize(), TEST_LOCATION );
1045 // Resize the surface and inform the scene accordingly
1046 Vector2 newSize( 1000.0f, 2000.0f );
1047 DALI_TEST_CHECK( stage.GetSize() != newSize );
1048 scene.SurfaceResized( newSize.width, newSize.height );
1050 // Ensure the stage hasn't been resized
1051 DALI_TEST_EQUALS( stage.GetSize(), stageSize, TEST_LOCATION );
1052 DALI_TEST_EQUALS( scene.GetSize(), newSize, TEST_LOCATION );
1057 int UtcDaliSceneKeyEventGeneratedSignalP(void)
1059 TestApplication application;
1060 Dali::Integration::Scene scene = application.GetScene();
1062 KeyEventGeneratedSignalData data;
1063 KeyEventGeneratedReceivedFunctor functor( data );
1064 scene.KeyEventGeneratedSignal().Connect( &application, functor );
1066 Integration::KeyEvent event( "a", "", "a", 0, 0, 0, Integration::KeyEvent::Up, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE );
1067 application.ProcessEvent( event );
1069 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1070 DALI_TEST_CHECK( event.keyModifier == data.receivedKeyEvent.keyModifier );
1071 DALI_TEST_CHECK( event.keyName == data.receivedKeyEvent.keyPressedName );
1072 DALI_TEST_CHECK( event.keyString == data.receivedKeyEvent.keyPressed );
1073 DALI_TEST_CHECK( event.state == static_cast<Integration::KeyEvent::State>( data.receivedKeyEvent.state ) );
1077 Integration::KeyEvent event2( "i", "", "i", 0, 0, 0, Integration::KeyEvent::Up, "i", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE );
1078 application.ProcessEvent( event2 );
1080 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1081 DALI_TEST_CHECK( event2.keyModifier == data.receivedKeyEvent.keyModifier );
1082 DALI_TEST_CHECK( event2.keyName == data.receivedKeyEvent.keyPressedName );
1083 DALI_TEST_CHECK( event2.keyString == data.receivedKeyEvent.keyPressed );
1084 DALI_TEST_CHECK( event2.state == static_cast<Integration::KeyEvent::State>( data.receivedKeyEvent.state ) );
1088 Integration::KeyEvent event3( "a", "", "a", 0, 0, 0, Integration::KeyEvent::Down, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE );
1089 application.ProcessEvent( event3 );
1091 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1092 DALI_TEST_CHECK( event3.keyModifier == data.receivedKeyEvent.keyModifier );
1093 DALI_TEST_CHECK( event3.keyName == data.receivedKeyEvent.keyPressedName );
1094 DALI_TEST_CHECK( event3.keyString == data.receivedKeyEvent.keyPressed );
1095 DALI_TEST_CHECK( event3.state == static_cast<Integration::KeyEvent::State>( data.receivedKeyEvent.state ) );
1099 Integration::KeyEvent event4( "a", "", "a", 0, 0, 0, Integration::KeyEvent::Up, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE );
1100 application.ProcessEvent( event4 );
1102 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1103 DALI_TEST_CHECK( event4.keyModifier == data.receivedKeyEvent.keyModifier );
1104 DALI_TEST_CHECK( event4.keyName == data.receivedKeyEvent.keyPressedName );
1105 DALI_TEST_CHECK( event4.keyString == data.receivedKeyEvent.keyPressed );
1106 DALI_TEST_CHECK( event4.state == static_cast<Integration::KeyEvent::State>( data.receivedKeyEvent.state ) );
1110 int UtcDaliSceneEnsureReplacedSurfaceKeepsClearColor(void)
1112 tet_infoline( "Ensure we keep background color when the scene surface is replaced " );
1114 TestApplication application;
1116 // Create a new scene and set the background color of the main scene
1117 auto defaultScene = application.GetScene();
1118 defaultScene.SetBackgroundColor( Color::BLUE );
1120 // Need to create a renderable as we don't start rendering until we have at least one
1121 // We don't need to add this to any scene
1122 auto actor = CreateRenderableActor();
1124 auto& glAbstraction = application.GetGlAbstraction();
1125 auto clearCountBefore = glAbstraction.GetClearCountCalled();
1127 application.SendNotification();
1128 application.Render();
1130 DALI_TEST_EQUALS( glAbstraction.GetClearCountCalled(), clearCountBefore + 1, TEST_LOCATION );
1131 DALI_TEST_EQUALS( glAbstraction.GetLastClearColor(), Color::BLUE, TEST_LOCATION );
1133 defaultScene.SurfaceReplaced();
1135 application.SendNotification();
1136 application.Render();
1138 DALI_TEST_EQUALS( glAbstraction.GetClearCountCalled(), clearCountBefore + 2, TEST_LOCATION );
1139 DALI_TEST_EQUALS( glAbstraction.GetLastClearColor(), Color::BLUE, TEST_LOCATION );
1141 // Check when the main render task viewport is set the clear color is clipped using scissors
1142 TraceCallStack& scissorTrace = glAbstraction.GetScissorTrace();
1143 TraceCallStack& enabledDisableTrace = glAbstraction.GetEnableDisableTrace();
1144 scissorTrace.Enable( true );
1145 enabledDisableTrace.Enable( true );
1147 defaultScene.GetRenderTaskList().GetTask( 0 ).SetViewport( Viewport( 0.0f, 0.0f, 100.0f, 100.0f ) );
1149 application.SendNotification();
1150 application.Render();
1152 // Check scissor test was enabled.
1153 DALI_TEST_CHECK( enabledDisableTrace.FindMethodAndParams( "Enable", "3089" ) ); // 3089 = 0xC11 (GL_SCISSOR_TEST)
1155 // Check the scissor was set, and the coordinates are correct.
1156 DALI_TEST_CHECK( scissorTrace.FindMethodAndParams( "Scissor", "0, 700, 100, 100" ) );
1158 DALI_TEST_EQUALS( glAbstraction.GetClearCountCalled(), clearCountBefore + 3, TEST_LOCATION );
1159 DALI_TEST_EQUALS( glAbstraction.GetLastClearColor(), Color::BLUE, TEST_LOCATION );
1161 scissorTrace.Enable( false );
1162 scissorTrace.Reset();
1164 enabledDisableTrace.Enable( false );
1165 enabledDisableTrace.Reset();
1170 int UtcDaliSceneEmptySceneRendering(void)
1172 tet_infoline( "Ensure not rendering before a Renderer is added" );
1174 TestApplication application;
1175 TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
1177 // Render without any renderer
1178 application.SendNotification();
1179 application.Render();
1181 // Check the clear count and the render status
1182 DALI_TEST_EQUALS( glAbstraction.GetClearCountCalled(), 0, TEST_LOCATION );
1183 DALI_TEST_EQUALS( application.GetRenderNeedsPostRender(), false, TEST_LOCATION );
1186 Geometry geometry = CreateQuadGeometry();
1187 Shader shader = CreateShader();
1188 Renderer renderer = Renderer::New( geometry, shader );
1190 Actor actor = Actor::New();
1191 actor.AddRenderer( renderer );
1193 actor.SetProperty( Actor::Property::SIZE, Vector2( 400, 400 ) );
1194 Stage::GetCurrent().Add( actor );
1197 application.SendNotification();
1198 application.Render();
1200 // Check the clear count and the render status
1201 DALI_TEST_EQUALS( glAbstraction.GetClearCountCalled(), 1, TEST_LOCATION );
1202 DALI_TEST_EQUALS( application.GetRenderNeedsPostRender(), true, TEST_LOCATION );
1204 // Remove the Renderer
1205 Stage::GetCurrent().Remove( actor );
1210 application.SendNotification();
1211 application.Render();
1213 // Check the clear count and the render status
1214 DALI_TEST_EQUALS( glAbstraction.GetClearCountCalled(), 2, TEST_LOCATION ); // Should be cleared
1215 DALI_TEST_EQUALS( application.GetRenderNeedsPostRender(), true, TEST_LOCATION );