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.
18 #include <dali-test-suite-utils.h>
19 #include <dali/devel-api/common/stage.h>
20 #include <dali/integration-api/events/key-event-integ.h>
21 #include <dali/integration-api/events/touch-event-integ.h>
22 #include <dali/integration-api/events/wheel-event-integ.h>
23 #include <dali/integration-api/scene.h>
24 #include <dali/public-api/events/key-event.h>
25 #include <mesh-builder.h>
30 // 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)
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)
65 functorCalled = false;
67 receivedKeyEvent.Reset();
71 KeyEvent receivedKeyEvent;
74 // Functor that sets the data when called
75 struct KeyEventReceivedFunctor
77 KeyEventReceivedFunctor(KeyEventSignalData& data)
82 bool operator()(const KeyEvent& keyEvent)
84 signalData.functorCalled = true;
85 signalData.receivedKeyEvent = keyEvent;
90 KeyEventSignalData& signalData;
93 // Stores data that is populated in the touched signal callback and will be read by the TET cases
94 struct TouchedSignalData
97 : functorCalled(false),
98 createNewScene(false),
99 newSceneCreated(false)
105 functorCalled = false;
106 createNewScene = false;
107 newSceneCreated = false;
108 receivedTouchEvent.Reset();
113 bool newSceneCreated;
114 TouchEvent receivedTouchEvent;
117 // Functor that sets the data when touched signal is received
120 TouchFunctor(TouchedSignalData& data)
125 void operator()(const TouchEvent& touch)
127 signalData.functorCalled = true;
128 signalData.receivedTouchEvent = touch;
130 if(signalData.createNewScene)
132 Dali::Integration::Scene scene = Dali::Integration::Scene::New(Size(480.0f, 800.0f));
133 DALI_TEST_CHECK(scene);
135 signalData.newSceneCreated = true;
141 signalData.functorCalled = true;
144 TouchedSignalData& signalData;
147 // Stores data that is populated in the wheel-event callback and will be read by the TET cases
148 struct WheelEventSignalData
150 WheelEventSignalData()
151 : functorCalled(false)
157 functorCalled = false;
161 WheelEvent receivedWheelEvent;
164 // Functor that sets the data when wheel-event signal is received
165 struct WheelEventReceivedFunctor
167 WheelEventReceivedFunctor(WheelEventSignalData& data)
172 bool operator()(const WheelEvent& wheelEvent)
174 signalData.functorCalled = true;
175 signalData.receivedWheelEvent = wheelEvent;
180 WheelEventSignalData& signalData;
183 // Stores data that is populated in the KeyEventGeneratedSignal callback and will be read by the TET cases
184 struct KeyEventGeneratedSignalData
186 KeyEventGeneratedSignalData()
187 : functorCalled(false)
193 functorCalled = false;
195 receivedKeyEvent.Reset();
199 KeyEvent receivedKeyEvent;
202 // Functor that sets the data when called
203 struct KeyEventGeneratedReceivedFunctor
205 KeyEventGeneratedReceivedFunctor(KeyEventGeneratedSignalData& data)
210 bool operator()(const KeyEvent& keyEvent)
212 signalData.functorCalled = true;
213 signalData.receivedKeyEvent = keyEvent;
220 signalData.functorCalled = true;
224 KeyEventGeneratedSignalData& signalData;
227 void GenerateTouch(TestApplication& application, PointState::Type state, const Vector2& screenPosition)
229 Integration::TouchEvent touchEvent;
230 Integration::Point point;
231 point.SetState(state);
232 point.SetScreenPosition(screenPosition);
233 touchEvent.points.push_back(point);
234 application.ProcessEvent(touchEvent);
237 bool DummyTouchCallback(Actor actor, const TouchEvent& touch)
242 void FrameCallback(int frameId)
246 } // unnamed namespace
248 int UtcDaliSceneAdd(void)
250 TestApplication application;
251 tet_infoline("Testing Dali::Integration::Scene::Add");
253 Dali::Integration::Scene scene = application.GetScene();
255 Actor actor = Actor::New();
256 DALI_TEST_CHECK(!actor.GetProperty<bool>(Actor::Property::CONNECTED_TO_SCENE));
259 DALI_TEST_CHECK(actor.GetProperty<bool>(Actor::Property::CONNECTED_TO_SCENE));
264 int UtcDaliSceneRemove(void)
266 TestApplication application;
267 tet_infoline("Testing Dali::Integration::Scene::Remove");
269 Dali::Integration::Scene scene = application.GetScene();
271 Actor actor = Actor::New();
272 DALI_TEST_CHECK(!actor.GetProperty<bool>(Actor::Property::CONNECTED_TO_SCENE));
275 DALI_TEST_CHECK(actor.GetProperty<bool>(Actor::Property::CONNECTED_TO_SCENE));
278 DALI_TEST_CHECK(!actor.GetProperty<bool>(Actor::Property::CONNECTED_TO_SCENE));
283 int UtcDaliSceneGetSize(void)
285 TestApplication application;
286 tet_infoline("Testing Dali::Integration::Scene::GetSize");
288 Dali::Integration::Scene scene = application.GetScene();
289 Size size = scene.GetSize();
290 DALI_TEST_EQUALS(TestApplication::DEFAULT_SURFACE_WIDTH, size.width, TEST_LOCATION);
291 DALI_TEST_EQUALS(TestApplication::DEFAULT_SURFACE_HEIGHT, size.height, TEST_LOCATION);
296 int UtcDaliSceneGetDpi(void)
298 TestApplication application; // Initializes core DPI to default values
300 // Test that setting core DPI explicitly also sets up the scene's DPI.
301 Dali::Integration::Scene scene = application.GetScene();
302 scene.SetDpi(Vector2(200.0f, 180.0f));
303 Vector2 dpi = scene.GetDpi();
304 DALI_TEST_EQUALS(dpi.x, 200.0f, TEST_LOCATION);
305 DALI_TEST_EQUALS(dpi.y, 180.0f, TEST_LOCATION);
309 int UtcDaliSceneGetRenderTaskList(void)
311 TestApplication application;
312 tet_infoline("Testing Dali::Integration::Scene::GetRenderTaskList");
314 Dali::Integration::Scene scene = application.GetScene();
316 // Check we get a valid instance.
317 const RenderTaskList& tasks = scene.GetRenderTaskList();
319 // There should be 1 task by default.
320 DALI_TEST_EQUALS(tasks.GetTaskCount(), 1u, TEST_LOCATION);
322 // RenderTaskList has it's own UTC tests.
323 // But we can confirm that GetRenderTaskList in Stage retrieves the same RenderTaskList each time.
324 RenderTask newTask = scene.GetRenderTaskList().CreateTask();
326 DALI_TEST_EQUALS(scene.GetRenderTaskList().GetTask(1), newTask, TEST_LOCATION);
331 int UtcDaliSceneGetRootLayer(void)
333 TestApplication application;
334 tet_infoline("Testing Dali::Integration::Scene::GetRootLayer");
336 Dali::Integration::Scene scene = application.GetScene();
337 Layer layer = scene.GetLayer(0);
338 DALI_TEST_CHECK(layer);
340 // Check that GetRootLayer() correctly retreived layer 0.
341 DALI_TEST_CHECK(scene.GetRootLayer() == layer);
346 int UtcDaliSceneGetLayerCount(void)
348 TestApplication application;
349 tet_infoline("Testing Dali::Integration::Scene::GetLayerCount");
351 Dali::Integration::Scene scene = application.GetScene();
352 // Initially we have a default layer
353 DALI_TEST_EQUALS(scene.GetLayerCount(), 1u, TEST_LOCATION);
355 Layer layer = Layer::New();
358 DALI_TEST_EQUALS(scene.GetLayerCount(), 2u, TEST_LOCATION);
362 int UtcDaliSceneGetLayer(void)
364 TestApplication application;
365 tet_infoline("Testing Dali::Integration::Scene::GetLayer");
367 Dali::Integration::Scene scene = application.GetScene();
369 Layer rootLayer = scene.GetLayer(0);
370 DALI_TEST_CHECK(rootLayer);
372 Layer layer = Layer::New();
375 Layer sameLayer = scene.GetLayer(1);
376 DALI_TEST_CHECK(layer == sameLayer);
381 int UtcDaliSceneGet(void)
383 TestApplication application;
384 tet_infoline("Testing Dali::Integration::Scene::Get");
386 Dali::Integration::Scene scene = application.GetScene();
388 Actor actor = Actor::New();
389 DALI_TEST_CHECK(Dali::Integration::Scene() == Dali::Integration::Scene::Get(actor));
393 DALI_TEST_CHECK(scene == Dali::Integration::Scene::Get(actor));
398 int UtcDaliSceneDiscard(void)
400 TestApplication application;
401 tet_infoline("Testing Dali::Scene::Discard");
403 // Create a new Scene
404 Dali::Integration::Scene scene = Dali::Integration::Scene::New(Size(480.0f, 800.0f));
405 DALI_TEST_CHECK(scene);
407 // One reference of scene kept here and the other one kept in the Core
408 DALI_TEST_CHECK(scene.GetBaseObject().ReferenceCount() == 2);
410 // Render and notify.
411 application.SendNotification();
412 application.Render(0);
414 // Keep the reference of the root layer handle so it will still be alive after the scene is deleted
415 Layer rootLayer = scene.GetRootLayer();
416 DALI_TEST_CHECK(rootLayer);
417 DALI_TEST_CHECK(rootLayer.GetBaseObject().ReferenceCount() == 2);
419 // Request to discard the scene from the Core
421 DALI_TEST_CHECK(scene.GetBaseObject().ReferenceCount() == 1);
423 // Reset the scene handle
426 // Render and notify.
427 application.SendNotification();
428 application.Render(0);
430 // At this point, the scene should have been automatically deleted
431 // To prove this, the ref count of the root layer handle should be decremented to 1
432 DALI_TEST_CHECK(rootLayer.GetBaseObject().ReferenceCount() == 1);
434 // Delete the root layer handle
437 // Render and notify.
438 application.SendNotification();
439 application.Render(0);
444 int UtcDaliSceneCreateNewSceneDuringCoreEventProcessing(void)
446 TestApplication application;
448 Dali::Integration::Scene scene = application.GetScene();
450 TouchedSignalData data;
451 data.createNewScene = true;
452 TouchFunctor functor(data);
453 scene.TouchedSignal().Connect(&application, functor);
455 // Render and notify.
456 application.SendNotification();
457 application.Render();
459 GenerateTouch(application, PointState::DOWN, Vector2(10.0f, 10.0f));
461 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
462 DALI_TEST_EQUALS(true, data.createNewScene, TEST_LOCATION);
463 DALI_TEST_EQUALS(true, data.newSceneCreated, TEST_LOCATION);
469 int UtcDaliSceneRootLayerAndSceneAlignment(void)
471 TestApplication application;
474 Dali::Integration::Scene scene = Dali::Integration::Scene::New(Size(480.0f, 800.0f));
475 DALI_TEST_CHECK(scene);
477 // One reference of scene kept here and the other one kept in the Core
478 DALI_TEST_CHECK(scene.GetBaseObject().ReferenceCount() == 2);
480 // Add a renderable actor to the scene
481 auto actor = CreateRenderableActor();
484 // Render and notify.
485 application.SendNotification();
486 application.Render(0);
488 // Keep the reference of the root layer handle so it will still be alive after the scene is deleted
489 Layer rootLayer = scene.GetRootLayer();
490 DALI_TEST_CHECK(rootLayer);
491 DALI_TEST_CHECK(rootLayer.GetBaseObject().ReferenceCount() == 2);
493 // Request to discard the scene from the Core
495 DALI_TEST_CHECK(scene.GetBaseObject().ReferenceCount() == 1);
497 // Reset the scene handle
500 // Render and notify.
501 application.SendNotification();
502 application.Render(0);
504 // At this point, the scene should have been automatically deleted
505 // To prove this, the ref count of the root layer handle should be decremented to 1
506 DALI_TEST_CHECK(rootLayer.GetBaseObject().ReferenceCount() == 1);
508 // Create a new Scene while the root layer of the deleted scene is still alive
509 Dali::Integration::Scene newScene = Dali::Integration::Scene::New(Size(480.0f, 800.0f));
510 DALI_TEST_CHECK(newScene);
512 // Render and notify.
513 application.SendNotification();
514 application.Render(0);
516 // At this point, we have only one scene but two root layers
517 // The root layer of the deleted scene is still alive
518 DALI_TEST_CHECK(rootLayer.GetBaseObject().ReferenceCount() == 1);
520 // Delete the root layer of the deleted scene
523 // Render and notify.
524 application.SendNotification();
525 application.Render(0);
530 int UtcDaliSceneEventProcessingFinishedP(void)
532 TestApplication application;
533 Dali::Integration::Scene scene = application.GetScene();
535 bool eventProcessingFinished = false;
536 EventProcessingFinishedFunctor functor(eventProcessingFinished);
537 scene.EventProcessingFinishedSignal().Connect(&application, functor);
539 Actor actor(Actor::New());
542 application.SendNotification();
543 application.Render();
545 DALI_TEST_CHECK(eventProcessingFinished);
550 int UtcDaliSceneEventProcessingFinishedN(void)
552 TestApplication application;
553 Dali::Integration::Scene scene = application.GetScene();
555 bool eventProcessingFinished = false;
556 EventProcessingFinishedFunctor functor(eventProcessingFinished);
557 scene.EventProcessingFinishedSignal().Connect(&application, functor);
559 Actor actor(Actor::New());
562 // Do not complete event processing and confirm the signal has not been emitted.
563 DALI_TEST_CHECK(!eventProcessingFinished);
568 int UtcDaliSceneSignalKeyEventP(void)
570 TestApplication application;
571 Dali::Integration::Scene scene = application.GetScene();
573 KeyEventSignalData data;
574 KeyEventReceivedFunctor functor(data);
575 scene.KeyEventSignal().Connect(&application, functor);
577 Integration::KeyEvent event("i", "", "i", 0, 0, 0, Integration::KeyEvent::DOWN, "i", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE);
578 application.ProcessEvent(event);
580 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
581 DALI_TEST_CHECK(event.keyModifier == data.receivedKeyEvent.GetKeyModifier());
582 DALI_TEST_CHECK(event.keyName == data.receivedKeyEvent.GetKeyName());
583 DALI_TEST_CHECK(event.keyString == data.receivedKeyEvent.GetKeyString());
584 DALI_TEST_CHECK(event.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.GetState()));
588 Integration::KeyEvent event2("i", "", "i", 0, 0, 0, Integration::KeyEvent::UP, "i", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE);
589 application.ProcessEvent(event2);
591 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
592 DALI_TEST_CHECK(event2.keyModifier == data.receivedKeyEvent.GetKeyModifier());
593 DALI_TEST_CHECK(event2.keyName == data.receivedKeyEvent.GetKeyName());
594 DALI_TEST_CHECK(event2.keyString == data.receivedKeyEvent.GetKeyString());
595 DALI_TEST_CHECK(event2.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.GetState()));
599 Integration::KeyEvent event3("a", "", "a", 0, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE);
600 application.ProcessEvent(event3);
602 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
603 DALI_TEST_CHECK(event3.keyModifier == data.receivedKeyEvent.GetKeyModifier());
604 DALI_TEST_CHECK(event3.keyName == data.receivedKeyEvent.GetKeyName());
605 DALI_TEST_CHECK(event3.keyString == data.receivedKeyEvent.GetKeyString());
606 DALI_TEST_CHECK(event3.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.GetState()));
610 Integration::KeyEvent event4("a", "", "a", 0, 0, 0, Integration::KeyEvent::UP, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE);
611 application.ProcessEvent(event4);
613 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
614 DALI_TEST_CHECK(event4.keyModifier == data.receivedKeyEvent.GetKeyModifier());
615 DALI_TEST_CHECK(event4.keyName == data.receivedKeyEvent.GetKeyName());
616 DALI_TEST_CHECK(event4.keyString == data.receivedKeyEvent.GetKeyString());
617 DALI_TEST_CHECK(event4.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.GetState()));
621 int UtcDaliSceneSignalKeyEventN(void)
623 TestApplication application;
624 Dali::Integration::Scene scene = application.GetScene();
626 KeyEventSignalData data;
627 KeyEventReceivedFunctor functor(data);
628 scene.KeyEventSignal().Connect(&application, functor);
630 // Check that a non-pressed key events data is not modified.
631 DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
636 int UtcDaliSceneTouchedSignalP(void)
638 TestApplication application;
639 Dali::Integration::Scene scene = application.GetScene();
641 TouchedSignalData data;
642 TouchFunctor functor(data);
643 scene.TouchedSignal().Connect(&application, functor);
645 // Render and notify.
646 application.SendNotification();
647 application.Render();
649 // Basic test: No actors, single touch (down then up).
651 GenerateTouch(application, PointState::DOWN, Vector2(10.0f, 10.0f));
653 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
654 DALI_TEST_CHECK(data.receivedTouchEvent.GetPointCount() != 0u);
655 DALI_TEST_CHECK(!data.receivedTouchEvent.GetHitActor(0));
658 GenerateTouch(application, PointState::UP, Vector2(10.0f, 10.0f));
660 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
661 DALI_TEST_CHECK(data.receivedTouchEvent.GetPointCount() != 0u);
662 DALI_TEST_CHECK(!data.receivedTouchEvent.GetHitActor(0));
666 // Add an actor to the scene.
667 Actor actor = Actor::New();
668 actor.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
669 actor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
670 actor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
671 actor.TouchedSignal().Connect(&DummyTouchCallback);
674 // Render and notify.
675 application.SendNotification();
676 application.Render();
678 // Actor on scene, single touch, down in actor, motion, then up outside actor.
680 GenerateTouch(application, PointState::DOWN, Vector2(10.0f, 10.0f));
682 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
683 DALI_TEST_CHECK(data.receivedTouchEvent.GetPointCount() != 0u);
684 DALI_TEST_CHECK(data.receivedTouchEvent.GetHitActor(0) == actor);
687 GenerateTouch(application, PointState::MOTION, Vector2(150.0f, 10.0f)); // Some motion
689 DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
692 GenerateTouch(application, PointState::UP, Vector2(150.0f, 10.0f)); // Some motion
694 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
695 DALI_TEST_CHECK(data.receivedTouchEvent.GetPointCount() != 0u);
696 DALI_TEST_CHECK(!data.receivedTouchEvent.GetHitActor(0));
700 // Multiple touch. Should only receive a touch on first down and last up.
702 Integration::TouchEvent touchEvent;
703 Integration::Point point;
706 point.SetState(PointState::DOWN);
707 point.SetScreenPosition(Vector2(10.0f, 10.0f));
708 touchEvent.points.push_back(point);
709 application.ProcessEvent(touchEvent);
710 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
711 DALI_TEST_EQUALS(data.receivedTouchEvent.GetPointCount(), 1u, TEST_LOCATION);
715 touchEvent.points[0].SetState(PointState::STATIONARY);
716 point.SetDeviceId(1);
717 point.SetScreenPosition(Vector2(50.0f, 50.0f));
718 touchEvent.points.push_back(point);
719 application.ProcessEvent(touchEvent);
720 DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
723 // Primary point is up
724 touchEvent.points[0].SetState(PointState::UP);
725 touchEvent.points[1].SetState(PointState::STATIONARY);
726 application.ProcessEvent(touchEvent);
727 DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
730 // Remove 1st point now, 2nd point is now in motion
731 touchEvent.points.erase(touchEvent.points.begin());
732 touchEvent.points[0].SetState(PointState::MOTION);
733 touchEvent.points[0].SetScreenPosition(Vector2(150.0f, 50.0f));
734 application.ProcessEvent(touchEvent);
735 DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
739 touchEvent.points[0].SetState(PointState::UP);
740 application.ProcessEvent(touchEvent);
741 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
742 DALI_TEST_EQUALS(data.receivedTouchEvent.GetPointCount(), 1u, TEST_LOCATION);
748 int UtcDaliSceneTouchedSignalN(void)
750 TestApplication application;
751 Dali::Integration::Scene scene = application.GetScene();
753 TouchedSignalData data;
754 TouchFunctor functor(data);
755 scene.TouchedSignal().Connect(&application, functor);
757 // Render and notify.
758 application.SendNotification();
759 application.Render();
761 // Confirm functor not called before there has been any touch event.
762 DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
764 // No actors, single touch, down, motion then up.
766 GenerateTouch(application, PointState::DOWN, Vector2(10.0f, 10.0f));
768 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
769 DALI_TEST_CHECK(data.receivedTouchEvent.GetPointCount() != 0u);
770 DALI_TEST_CHECK(!data.receivedTouchEvent.GetHitActor(0));
774 // Confirm there is no signal when the touchpoint is only moved.
775 GenerateTouch(application, PointState::MOTION, Vector2(1200.0f, 10.0f)); // Some motion
777 DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
780 // Confirm a following up event generates a signal.
781 GenerateTouch(application, PointState::UP, Vector2(1200.0f, 10.0f));
783 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
784 DALI_TEST_CHECK(data.receivedTouchEvent.GetPointCount() != 0u);
785 DALI_TEST_CHECK(!data.receivedTouchEvent.GetHitActor(0));
789 // Add an actor to the scene.
790 Actor actor = Actor::New();
791 actor.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
792 actor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
793 actor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
794 actor.TouchedSignal().Connect(&DummyTouchCallback);
797 // Render and notify.
798 application.SendNotification();
799 application.Render();
801 // Actor on scene. Interrupted before down and interrupted after down.
803 GenerateTouch(application, PointState::INTERRUPTED, Vector2(10.0f, 10.0f));
805 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
806 DALI_TEST_CHECK(data.receivedTouchEvent.GetPointCount() != 0u);
807 DALI_TEST_CHECK(!data.receivedTouchEvent.GetHitActor(0));
808 DALI_TEST_CHECK(data.receivedTouchEvent.GetState(0) == PointState::INTERRUPTED);
811 GenerateTouch(application, PointState::DOWN, Vector2(10.0f, 10.0f));
813 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
814 DALI_TEST_CHECK(data.receivedTouchEvent.GetPointCount() != 0u);
815 DALI_TEST_CHECK(data.receivedTouchEvent.GetHitActor(0) == actor);
816 DALI_TEST_CHECK(data.receivedTouchEvent.GetState(0) == PointState::DOWN);
819 GenerateTouch(application, PointState::INTERRUPTED, Vector2(10.0f, 10.0f));
821 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
822 DALI_TEST_CHECK(data.receivedTouchEvent.GetPointCount() != 0u);
823 DALI_TEST_CHECK(!data.receivedTouchEvent.GetHitActor(0));
824 DALI_TEST_CHECK(data.receivedTouchEvent.GetState(0) == PointState::INTERRUPTED);
826 DALI_TEST_EQUALS(data.receivedTouchEvent.GetPointCount(), 1u, TEST_LOCATION);
828 // Check that getting info about a non-existent point returns an empty handle
829 Actor actor = data.receivedTouchEvent.GetHitActor(1);
830 DALI_TEST_CHECK(!actor);
838 int UtcDaliSceneSignalWheelEventP(void)
840 TestApplication application;
841 Dali::Integration::Scene scene = application.GetScene();
843 WheelEventSignalData data;
844 WheelEventReceivedFunctor functor(data);
845 scene.WheelEventSignal().Connect(&application, functor);
847 Integration::WheelEvent event(Integration::WheelEvent::CUSTOM_WHEEL, 0, 0u, Vector2(0.0f, 0.0f), 1, 1000u);
848 application.ProcessEvent(event);
850 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
851 DALI_TEST_CHECK(static_cast<WheelEvent::Type>(event.type) == data.receivedWheelEvent.GetType());
852 DALI_TEST_CHECK(event.direction == data.receivedWheelEvent.GetDirection());
853 DALI_TEST_CHECK(event.modifiers == data.receivedWheelEvent.GetModifiers());
854 DALI_TEST_CHECK(event.point == data.receivedWheelEvent.GetPoint());
855 DALI_TEST_CHECK(event.delta == data.receivedWheelEvent.GetDelta());
856 DALI_TEST_CHECK(event.timeStamp == data.receivedWheelEvent.GetTime());
860 Integration::WheelEvent event2(Integration::WheelEvent::CUSTOM_WHEEL, 0, 0u, Vector2(0.0f, 0.0f), -1, 1000u);
861 application.ProcessEvent(event2);
863 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
864 DALI_TEST_CHECK(static_cast<WheelEvent::Type>(event2.type) == data.receivedWheelEvent.GetType());
865 DALI_TEST_CHECK(event2.direction == data.receivedWheelEvent.GetDirection());
866 DALI_TEST_CHECK(event2.modifiers == data.receivedWheelEvent.GetModifiers());
867 DALI_TEST_CHECK(event2.point == data.receivedWheelEvent.GetPoint());
868 DALI_TEST_CHECK(event2.delta == data.receivedWheelEvent.GetDelta());
869 DALI_TEST_CHECK(event2.timeStamp == data.receivedWheelEvent.GetTime());
873 int UtcDaliSceneSurfaceResizedDefaultScene(void)
875 tet_infoline("Ensure resizing of the surface is handled properly");
877 TestApplication application;
879 auto defaultScene = application.GetScene();
880 DALI_TEST_CHECK(defaultScene);
882 // Ensure stage size matches the scene size
883 auto stage = Stage::GetCurrent();
884 DALI_TEST_EQUALS(stage.GetSize(), defaultScene.GetSize(), TEST_LOCATION);
887 Vector2 newSize(1000.0f, 2000.0f);
888 DALI_TEST_CHECK(stage.GetSize() != newSize);
889 defaultScene.SurfaceResized(newSize.width, newSize.height);
891 DALI_TEST_EQUALS(stage.GetSize(), newSize, TEST_LOCATION);
892 DALI_TEST_EQUALS(defaultScene.GetSize(), newSize, TEST_LOCATION);
897 int UtcDaliSceneSurfaceResizedDefaultSceneViewport(void)
899 tet_infoline("Ensure resizing of the surface & viewport is handled properly");
901 TestApplication application;
902 TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
903 TraceCallStack& callStack = glAbstraction.GetViewportTrace();
904 glAbstraction.EnableViewportCallTrace(true);
906 // Initial scene setup
907 Geometry geometry = CreateQuadGeometry();
908 Shader shader = CreateShader();
909 Renderer renderer = Renderer::New(geometry, shader);
911 Actor actor = Actor::New();
912 actor.AddRenderer(renderer);
913 actor.SetProperty(Actor::Property::SIZE, Vector2(400.0f, 400.0f));
914 application.GetScene().Add(actor);
916 // Render before resizing surface
917 application.SendNotification();
918 application.Render(0);
919 glAbstraction.ResetViewportCallStack();
921 auto defaultScene = application.GetScene();
922 DALI_TEST_CHECK(defaultScene);
924 // Ensure stage size matches the scene size
925 auto stage = Stage::GetCurrent();
926 DALI_TEST_EQUALS(stage.GetSize(), defaultScene.GetSize(), TEST_LOCATION);
929 Vector2 newSize(1000.0f, 2000.0f);
930 std::string viewportParams("0, 0, 1000, 2000"); // to match newSize
931 DALI_TEST_CHECK(stage.GetSize() != newSize);
932 defaultScene.SurfaceResized(newSize.width, newSize.height);
934 DALI_TEST_EQUALS(stage.GetSize(), newSize, TEST_LOCATION);
935 DALI_TEST_EQUALS(defaultScene.GetSize(), newSize, TEST_LOCATION);
937 // Render after resizing surface
938 application.SendNotification();
939 application.Render(0);
941 // Check that the viewport is handled properly
942 DALI_TEST_CHECK(callStack.FindMethodAndGetParameters("Viewport", viewportParams));
947 int UtcDaliSceneSurfaceResizedMultipleRenderTasks(void)
949 tet_infoline("Ensure resizing of the surface & viewport is handled properly");
951 TestApplication application;
952 TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
953 TraceCallStack& callStack = glAbstraction.GetViewportTrace();
954 glAbstraction.EnableViewportCallTrace(true);
956 // Initial scene setup
957 auto scene = application.GetScene();
959 Geometry geometry = CreateQuadGeometry();
960 Shader shader = CreateShader();
961 Renderer renderer = Renderer::New(geometry, shader);
963 Actor actor = Actor::New();
964 actor.AddRenderer(renderer);
966 int testHeight = 400;
967 actor.SetProperty(Actor::Property::SIZE, Vector2(testWidth, testHeight));
970 CameraActor offscreenCameraActor = CameraActor::New(Size(testWidth, testHeight));
971 application.GetScene().Add(offscreenCameraActor);
973 FrameBuffer newFrameBuffer = FrameBuffer::New(testWidth, testHeight, FrameBuffer::Attachment::NONE);
975 RenderTask newTask = scene.GetRenderTaskList().CreateTask();
976 newTask.SetCameraActor(offscreenCameraActor);
977 newTask.SetSourceActor(actor);
978 newTask.SetFrameBuffer(newFrameBuffer);
979 newTask.SetViewportPosition(Vector2(0, 0));
980 newTask.SetViewportSize(Vector2(testWidth, testHeight));
982 // Render before resizing surface
983 application.SendNotification();
984 application.Render(0);
985 glAbstraction.ResetViewportCallStack();
987 Rect<int32_t> initialViewport = newTask.GetViewport();
988 int initialWidth = initialViewport.width;
989 int initialHeight = initialViewport.height;
990 DALI_TEST_EQUALS(initialWidth, testWidth, TEST_LOCATION);
991 DALI_TEST_EQUALS(initialHeight, testHeight, TEST_LOCATION);
993 auto defaultScene = application.GetScene();
994 DALI_TEST_CHECK(defaultScene);
996 // Ensure stage size matches the scene size
997 auto stage = Stage::GetCurrent();
998 DALI_TEST_EQUALS(stage.GetSize(), defaultScene.GetSize(), TEST_LOCATION);
1001 Vector2 newSize(1000.0f, 2000.0f);
1002 std::string viewportParams("0, 0, 1000, 2000"); // to match newSize
1003 DALI_TEST_CHECK(stage.GetSize() != newSize);
1004 defaultScene.SurfaceResized(newSize.width, newSize.height);
1006 DALI_TEST_EQUALS(stage.GetSize(), newSize, TEST_LOCATION);
1007 DALI_TEST_EQUALS(defaultScene.GetSize(), newSize, TEST_LOCATION);
1009 // Render after resizing surface
1010 application.SendNotification();
1011 application.Render(0);
1013 // Check that the viewport is handled properly
1014 DALI_TEST_CHECK(callStack.FindMethodAndGetParameters("Viewport", viewportParams));
1016 // Second render-task should not be affected
1017 Rect<int32_t> viewport = newTask.GetViewport();
1018 int width = viewport.width;
1019 int height = viewport.height;
1020 DALI_TEST_EQUALS(width, testWidth, TEST_LOCATION);
1021 DALI_TEST_EQUALS(height, testHeight, TEST_LOCATION);
1026 int UtcDaliSceneSurfaceResizedAdditionalScene(void)
1028 tet_infoline("Ensure resizing of the surface is handled properly on additional scenes");
1030 TestApplication application;
1031 Vector2 originalSurfaceSize(500.0f, 1000.0f);
1033 auto scene = Integration::Scene::New(Size(originalSurfaceSize.width, originalSurfaceSize.height));
1035 // Ensure stage size does NOT match the surface size
1036 auto stage = Stage::GetCurrent();
1037 const auto stageSize = stage.GetSize();
1038 DALI_TEST_CHECK(stageSize != originalSurfaceSize);
1039 DALI_TEST_EQUALS(originalSurfaceSize, scene.GetSize(), TEST_LOCATION);
1041 // Resize the surface and inform the scene accordingly
1042 Vector2 newSize(1000.0f, 2000.0f);
1043 DALI_TEST_CHECK(stage.GetSize() != newSize);
1044 scene.SurfaceResized(newSize.width, newSize.height);
1046 // Ensure the stage hasn't been resized
1047 DALI_TEST_EQUALS(stage.GetSize(), stageSize, TEST_LOCATION);
1048 DALI_TEST_EQUALS(scene.GetSize(), newSize, TEST_LOCATION);
1053 int UtcDaliSceneKeyEventGeneratedSignalP(void)
1055 TestApplication application;
1056 Dali::Integration::Scene scene = application.GetScene();
1058 KeyEventGeneratedSignalData data;
1059 KeyEventGeneratedReceivedFunctor functor(data);
1060 scene.KeyEventGeneratedSignal().Connect(&application, functor);
1062 Integration::KeyEvent event("a", "", "a", 0, 0, 0, Integration::KeyEvent::UP, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE);
1063 application.ProcessEvent(event);
1065 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
1066 DALI_TEST_CHECK(event.keyModifier == data.receivedKeyEvent.GetKeyModifier());
1067 DALI_TEST_CHECK(event.keyName == data.receivedKeyEvent.GetKeyName());
1068 DALI_TEST_CHECK(event.keyString == data.receivedKeyEvent.GetKeyString());
1069 DALI_TEST_CHECK(event.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.GetState()));
1073 Integration::KeyEvent event2("i", "", "i", 0, 0, 0, Integration::KeyEvent::UP, "i", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE);
1074 application.ProcessEvent(event2);
1076 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
1077 DALI_TEST_CHECK(event2.keyModifier == data.receivedKeyEvent.GetKeyModifier());
1078 DALI_TEST_CHECK(event2.keyName == data.receivedKeyEvent.GetKeyName());
1079 DALI_TEST_CHECK(event2.keyString == data.receivedKeyEvent.GetKeyString());
1080 DALI_TEST_CHECK(event2.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.GetState()));
1084 Integration::KeyEvent event3("a", "", "a", 0, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE);
1085 application.ProcessEvent(event3);
1087 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
1088 DALI_TEST_CHECK(event3.keyModifier == data.receivedKeyEvent.GetKeyModifier());
1089 DALI_TEST_CHECK(event3.keyName == data.receivedKeyEvent.GetKeyName());
1090 DALI_TEST_CHECK(event3.keyString == data.receivedKeyEvent.GetKeyString());
1091 DALI_TEST_CHECK(event3.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.GetState()));
1095 Integration::KeyEvent event4("a", "", "a", 0, 0, 0, Integration::KeyEvent::UP, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE);
1096 application.ProcessEvent(event4);
1098 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
1099 DALI_TEST_CHECK(event4.keyModifier == data.receivedKeyEvent.GetKeyModifier());
1100 DALI_TEST_CHECK(event4.keyName == data.receivedKeyEvent.GetKeyName());
1101 DALI_TEST_CHECK(event4.keyString == data.receivedKeyEvent.GetKeyString());
1102 DALI_TEST_CHECK(event4.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.GetState()));
1106 int UtcDaliSceneEnsureReplacedSurfaceKeepsClearColor(void)
1108 tet_infoline("Ensure we keep background color when the scene surface is replaced ");
1110 TestApplication application;
1112 // Create a new scene and set the background color of the main scene
1113 auto defaultScene = application.GetScene();
1114 defaultScene.SetBackgroundColor(Color::BLUE);
1116 // Need to create a renderable as we don't start rendering until we have at least one
1117 // We don't need to add this to any scene
1118 auto actor = CreateRenderableActor();
1120 auto& glAbstraction = application.GetGlAbstraction();
1121 auto clearCountBefore = glAbstraction.GetClearCountCalled();
1123 application.SendNotification();
1124 application.Render();
1126 DALI_TEST_EQUALS(glAbstraction.GetClearCountCalled(), clearCountBefore + 1, TEST_LOCATION);
1127 DALI_TEST_EQUALS(glAbstraction.GetLastClearColor(), Color::BLUE, TEST_LOCATION);
1129 defaultScene.SurfaceReplaced();
1131 application.SendNotification();
1132 application.Render();
1134 DALI_TEST_EQUALS(glAbstraction.GetClearCountCalled(), clearCountBefore + 2, TEST_LOCATION);
1135 DALI_TEST_EQUALS(glAbstraction.GetLastClearColor(), Color::BLUE, TEST_LOCATION);
1137 // Check when the main render task viewport is set the clear color is clipped using scissors
1138 TraceCallStack& scissorTrace = glAbstraction.GetScissorTrace();
1139 TraceCallStack& enabledDisableTrace = glAbstraction.GetEnableDisableTrace();
1140 scissorTrace.Enable(true);
1141 enabledDisableTrace.Enable(true);
1143 defaultScene.GetRenderTaskList().GetTask(0).SetViewport(Viewport(0.0f, 0.0f, 100.0f, 100.0f));
1145 application.SendNotification();
1146 application.Render();
1148 // Check scissor test was enabled.
1149 DALI_TEST_CHECK(enabledDisableTrace.FindMethodAndParams("Enable", "3089")); // 3089 = 0xC11 (GL_SCISSOR_TEST)
1151 // Check the scissor was set, and the coordinates are correct.
1152 DALI_TEST_CHECK(scissorTrace.FindMethodAndParams("Scissor", "0, 700, 100, 100"));
1154 DALI_TEST_EQUALS(glAbstraction.GetClearCountCalled(), clearCountBefore + 3, TEST_LOCATION);
1155 DALI_TEST_EQUALS(glAbstraction.GetLastClearColor(), Color::BLUE, TEST_LOCATION);
1157 scissorTrace.Enable(false);
1158 scissorTrace.Reset();
1160 enabledDisableTrace.Enable(false);
1161 enabledDisableTrace.Reset();
1166 int UtcDaliSceneEmptySceneRendering(void)
1168 tet_infoline("Ensure not rendering before a Renderer is added");
1170 TestApplication application;
1171 TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
1173 // Render without any renderer
1174 application.SendNotification();
1175 application.Render();
1177 // Check the clear count and the render status
1178 DALI_TEST_EQUALS(glAbstraction.GetClearCountCalled(), 0, TEST_LOCATION);
1179 DALI_TEST_EQUALS(application.GetRenderNeedsPostRender(), false, TEST_LOCATION);
1182 Geometry geometry = CreateQuadGeometry();
1183 Shader shader = CreateShader();
1184 Renderer renderer = Renderer::New(geometry, shader);
1186 Actor actor = Actor::New();
1187 actor.AddRenderer(renderer);
1189 actor.SetProperty(Actor::Property::SIZE, Vector2(400, 400));
1190 application.GetScene().Add(actor);
1193 application.SendNotification();
1194 application.Render();
1196 // Check the clear count and the render status
1197 DALI_TEST_EQUALS(glAbstraction.GetClearCountCalled(), 1, TEST_LOCATION);
1198 DALI_TEST_EQUALS(application.GetRenderNeedsPostRender(), true, TEST_LOCATION);
1200 // Remove the Renderer
1201 application.GetScene().Remove(actor);
1206 application.SendNotification();
1207 application.Render();
1209 // Check the clear count and the render status
1210 DALI_TEST_EQUALS(glAbstraction.GetClearCountCalled(), 2, TEST_LOCATION); // Should be cleared
1211 DALI_TEST_EQUALS(application.GetRenderNeedsPostRender(), true, TEST_LOCATION);
1216 int UtcDaliSceneFrameRenderedPresentedCallback(void)
1218 tet_infoline("UtcDaliSceneFrameRenderedCallback");
1220 TestApplication application;
1223 Geometry geometry = CreateQuadGeometry();
1224 Shader shader = CreateShader();
1225 Renderer renderer = Renderer::New(geometry, shader);
1227 Actor actor = Actor::New();
1228 actor.AddRenderer(renderer);
1229 application.GetScene().Add(actor);
1231 Dali::Integration::Scene scene = application.GetScene();
1234 scene.AddFrameRenderedCallback(std::unique_ptr<CallbackBase>(MakeCallback(&FrameCallback)), frameId);
1235 scene.AddFramePresentedCallback(std::unique_ptr<CallbackBase>(MakeCallback(&FrameCallback)), frameId);
1238 application.SendNotification();
1239 application.Render();
1241 Dali::Integration::Scene::FrameCallbackContainer callbackContainer;
1242 scene.GetFrameRenderedCallback(callbackContainer);
1244 DALI_TEST_EQUALS(callbackContainer.size(), 1, TEST_LOCATION);
1245 DALI_TEST_EQUALS(callbackContainer[0].second, frameId, TEST_LOCATION);
1247 callbackContainer.clear();
1249 scene.GetFramePresentedCallback(callbackContainer);
1251 DALI_TEST_EQUALS(callbackContainer.size(), 1, TEST_LOCATION);
1252 DALI_TEST_EQUALS(callbackContainer[0].second, frameId, TEST_LOCATION);