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);
890 defaultScene.SurfaceResized(newSize.width, newSize.height, 0, false);
892 DALI_TEST_EQUALS(stage.GetSize(), newSize, TEST_LOCATION);
893 DALI_TEST_EQUALS(defaultScene.GetSize(), newSize, TEST_LOCATION);
898 int UtcDaliSceneSurfaceResizedDefaultSceneViewport(void)
900 tet_infoline("Ensure resizing of the surface & viewport is handled properly");
902 TestApplication application;
903 TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
904 TraceCallStack& callStack = glAbstraction.GetViewportTrace();
905 glAbstraction.EnableViewportCallTrace(true);
907 // Initial scene setup
908 Geometry geometry = CreateQuadGeometry();
909 Shader shader = CreateShader();
910 Renderer renderer = Renderer::New(geometry, shader);
912 Actor actor = Actor::New();
913 actor.AddRenderer(renderer);
914 actor.SetProperty(Actor::Property::SIZE, Vector2(400.0f, 400.0f));
915 application.GetScene().Add(actor);
917 // Render before resizing surface
918 application.SendNotification();
919 application.Render(0);
920 glAbstraction.ResetViewportCallStack();
922 auto defaultScene = application.GetScene();
923 DALI_TEST_CHECK(defaultScene);
925 // Ensure stage size matches the scene size
926 auto stage = Stage::GetCurrent();
927 DALI_TEST_EQUALS(stage.GetSize(), defaultScene.GetSize(), TEST_LOCATION);
930 Vector2 newSize(1000.0f, 2000.0f);
931 std::string viewportParams("0, 0, 1000, 2000"); // to match newSize
932 DALI_TEST_CHECK(stage.GetSize() != newSize);
933 defaultScene.SurfaceResized(newSize.width, newSize.height, 0, false);
935 DALI_TEST_EQUALS(stage.GetSize(), newSize, TEST_LOCATION);
936 DALI_TEST_EQUALS(defaultScene.GetSize(), newSize, TEST_LOCATION);
938 // Render after resizing surface
939 application.SendNotification();
940 application.Render(0);
942 // Check that the viewport is handled properly
943 DALI_TEST_CHECK(callStack.FindMethodAndGetParameters("Viewport", viewportParams));
948 int UtcDaliSceneSurfaceResizedMultipleRenderTasks(void)
950 tet_infoline("Ensure resizing of the surface & viewport is handled properly");
952 TestApplication application;
953 TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
954 TraceCallStack& callStack = glAbstraction.GetViewportTrace();
955 glAbstraction.EnableViewportCallTrace(true);
957 // Initial scene setup
958 auto scene = application.GetScene();
960 Geometry geometry = CreateQuadGeometry();
961 Shader shader = CreateShader();
962 Renderer renderer = Renderer::New(geometry, shader);
964 Actor actor = Actor::New();
965 actor.AddRenderer(renderer);
967 int testHeight = 400;
968 actor.SetProperty(Actor::Property::SIZE, Vector2(testWidth, testHeight));
971 CameraActor offscreenCameraActor = CameraActor::New(Size(testWidth, testHeight));
972 application.GetScene().Add(offscreenCameraActor);
974 FrameBuffer newFrameBuffer = FrameBuffer::New(testWidth, testHeight, FrameBuffer::Attachment::NONE);
976 RenderTask newTask = scene.GetRenderTaskList().CreateTask();
977 newTask.SetCameraActor(offscreenCameraActor);
978 newTask.SetSourceActor(actor);
979 newTask.SetFrameBuffer(newFrameBuffer);
980 newTask.SetViewportPosition(Vector2(0, 0));
981 newTask.SetViewportSize(Vector2(testWidth, testHeight));
983 // Render before resizing surface
984 application.SendNotification();
985 application.Render(0);
986 glAbstraction.ResetViewportCallStack();
988 Rect<int32_t> initialViewport = newTask.GetViewport();
989 int initialWidth = initialViewport.width;
990 int initialHeight = initialViewport.height;
991 DALI_TEST_EQUALS(initialWidth, testWidth, TEST_LOCATION);
992 DALI_TEST_EQUALS(initialHeight, testHeight, TEST_LOCATION);
994 auto defaultScene = application.GetScene();
995 DALI_TEST_CHECK(defaultScene);
997 // Ensure stage size matches the scene size
998 auto stage = Stage::GetCurrent();
999 DALI_TEST_EQUALS(stage.GetSize(), defaultScene.GetSize(), TEST_LOCATION);
1002 Vector2 newSize(1000.0f, 2000.0f);
1003 std::string viewportParams("0, 0, 1000, 2000"); // to match newSize
1004 DALI_TEST_CHECK(stage.GetSize() != newSize);
1005 defaultScene.SurfaceResized(newSize.width, newSize.height, 0, false);
1007 DALI_TEST_EQUALS(stage.GetSize(), newSize, TEST_LOCATION);
1008 DALI_TEST_EQUALS(defaultScene.GetSize(), newSize, TEST_LOCATION);
1010 // Render after resizing surface
1011 application.SendNotification();
1012 application.Render(0);
1014 // Check that the viewport is handled properly
1015 DALI_TEST_CHECK(callStack.FindMethodAndGetParameters("Viewport", viewportParams));
1017 // Second render-task should not be affected
1018 Rect<int32_t> viewport = newTask.GetViewport();
1019 int width = viewport.width;
1020 int height = viewport.height;
1021 DALI_TEST_EQUALS(width, testWidth, TEST_LOCATION);
1022 DALI_TEST_EQUALS(height, testHeight, TEST_LOCATION);
1027 int UtcDaliSceneSurfaceResizedAdditionalScene(void)
1029 tet_infoline("Ensure resizing of the surface is handled properly on additional scenes");
1031 TestApplication application;
1032 Vector2 originalSurfaceSize(500.0f, 1000.0f);
1034 auto scene = Integration::Scene::New(Size(originalSurfaceSize.width, originalSurfaceSize.height));
1036 // Ensure stage size does NOT match the surface size
1037 auto stage = Stage::GetCurrent();
1038 const auto stageSize = stage.GetSize();
1039 DALI_TEST_CHECK(stageSize != originalSurfaceSize);
1040 DALI_TEST_EQUALS(originalSurfaceSize, scene.GetSize(), TEST_LOCATION);
1042 // Resize the surface and inform the scene accordingly
1043 Vector2 newSize(1000.0f, 2000.0f);
1044 DALI_TEST_CHECK(stage.GetSize() != newSize);
1046 scene.SurfaceResized(newSize.width, newSize.height, 0, false);
1048 // Ensure the stage hasn't been resized
1049 DALI_TEST_EQUALS(stage.GetSize(), stageSize, TEST_LOCATION);
1050 DALI_TEST_EQUALS(scene.GetSize(), newSize, TEST_LOCATION);
1055 int UtcDaliSceneKeyEventGeneratedSignalP(void)
1057 TestApplication application;
1058 Dali::Integration::Scene scene = application.GetScene();
1060 KeyEventGeneratedSignalData data;
1061 KeyEventGeneratedReceivedFunctor functor(data);
1062 scene.KeyEventGeneratedSignal().Connect(&application, functor);
1064 Integration::KeyEvent event("a", "", "a", 0, 0, 0, Integration::KeyEvent::UP, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE);
1065 application.ProcessEvent(event);
1067 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
1068 DALI_TEST_CHECK(event.keyModifier == data.receivedKeyEvent.GetKeyModifier());
1069 DALI_TEST_CHECK(event.keyName == data.receivedKeyEvent.GetKeyName());
1070 DALI_TEST_CHECK(event.keyString == data.receivedKeyEvent.GetKeyString());
1071 DALI_TEST_CHECK(event.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.GetState()));
1075 Integration::KeyEvent event2("i", "", "i", 0, 0, 0, Integration::KeyEvent::UP, "i", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE);
1076 application.ProcessEvent(event2);
1078 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
1079 DALI_TEST_CHECK(event2.keyModifier == data.receivedKeyEvent.GetKeyModifier());
1080 DALI_TEST_CHECK(event2.keyName == data.receivedKeyEvent.GetKeyName());
1081 DALI_TEST_CHECK(event2.keyString == data.receivedKeyEvent.GetKeyString());
1082 DALI_TEST_CHECK(event2.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.GetState()));
1086 Integration::KeyEvent event3("a", "", "a", 0, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE);
1087 application.ProcessEvent(event3);
1089 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
1090 DALI_TEST_CHECK(event3.keyModifier == data.receivedKeyEvent.GetKeyModifier());
1091 DALI_TEST_CHECK(event3.keyName == data.receivedKeyEvent.GetKeyName());
1092 DALI_TEST_CHECK(event3.keyString == data.receivedKeyEvent.GetKeyString());
1093 DALI_TEST_CHECK(event3.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.GetState()));
1097 Integration::KeyEvent event4("a", "", "a", 0, 0, 0, Integration::KeyEvent::UP, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE);
1098 application.ProcessEvent(event4);
1100 DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
1101 DALI_TEST_CHECK(event4.keyModifier == data.receivedKeyEvent.GetKeyModifier());
1102 DALI_TEST_CHECK(event4.keyName == data.receivedKeyEvent.GetKeyName());
1103 DALI_TEST_CHECK(event4.keyString == data.receivedKeyEvent.GetKeyString());
1104 DALI_TEST_CHECK(event4.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.GetState()));
1108 int UtcDaliSceneEnsureReplacedSurfaceKeepsClearColor(void)
1110 tet_infoline("Ensure we keep background color when the scene surface is replaced ");
1112 TestApplication application;
1114 // Create a new scene and set the background color of the main scene
1115 auto defaultScene = application.GetScene();
1116 defaultScene.SetBackgroundColor(Color::BLUE);
1118 // Need to create a renderable as we don't start rendering until we have at least one
1119 // We don't need to add this to any scene
1120 auto actor = CreateRenderableActor();
1122 auto& glAbstraction = application.GetGlAbstraction();
1123 auto clearCountBefore = glAbstraction.GetClearCountCalled();
1125 application.SendNotification();
1126 application.Render();
1128 DALI_TEST_EQUALS(glAbstraction.GetClearCountCalled(), clearCountBefore + 1, TEST_LOCATION);
1129 DALI_TEST_EQUALS(glAbstraction.GetLastClearColor(), Color::BLUE, TEST_LOCATION);
1131 defaultScene.SurfaceReplaced();
1133 application.SendNotification();
1134 application.Render();
1136 DALI_TEST_EQUALS(glAbstraction.GetClearCountCalled(), clearCountBefore + 2, TEST_LOCATION);
1137 DALI_TEST_EQUALS(glAbstraction.GetLastClearColor(), Color::BLUE, TEST_LOCATION);
1139 // Check when the main render task viewport is set the clear color is clipped using scissors
1140 TraceCallStack& scissorTrace = glAbstraction.GetScissorTrace();
1141 TraceCallStack& enabledDisableTrace = glAbstraction.GetEnableDisableTrace();
1142 scissorTrace.Enable(true);
1143 enabledDisableTrace.Enable(true);
1145 defaultScene.GetRenderTaskList().GetTask(0).SetViewport(Viewport(0.0f, 0.0f, 100.0f, 100.0f));
1147 application.SendNotification();
1148 application.Render();
1150 // Check scissor test was enabled.
1151 DALI_TEST_CHECK(enabledDisableTrace.FindMethodAndParams("Enable", "3089")); // 3089 = 0xC11 (GL_SCISSOR_TEST)
1153 // Check the scissor was set, and the coordinates are correct.
1154 DALI_TEST_CHECK(scissorTrace.FindMethodAndParams("Scissor", "0, 700, 100, 100"));
1156 DALI_TEST_EQUALS(glAbstraction.GetClearCountCalled(), clearCountBefore + 3, TEST_LOCATION);
1157 DALI_TEST_EQUALS(glAbstraction.GetLastClearColor(), Color::BLUE, TEST_LOCATION);
1159 scissorTrace.Enable(false);
1160 scissorTrace.Reset();
1162 enabledDisableTrace.Enable(false);
1163 enabledDisableTrace.Reset();
1168 int UtcDaliSceneEmptySceneRendering(void)
1170 tet_infoline("Ensure not rendering before a Renderer is added");
1172 TestApplication application;
1173 TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
1175 // Render without any renderer
1176 application.SendNotification();
1177 application.Render();
1179 // Check the clear count and the render status
1180 DALI_TEST_EQUALS(glAbstraction.GetClearCountCalled(), 0, TEST_LOCATION);
1181 DALI_TEST_EQUALS(application.GetRenderNeedsPostRender(), false, TEST_LOCATION);
1184 Geometry geometry = CreateQuadGeometry();
1185 Shader shader = CreateShader();
1186 Renderer renderer = Renderer::New(geometry, shader);
1188 Actor actor = Actor::New();
1189 actor.AddRenderer(renderer);
1191 actor.SetProperty(Actor::Property::SIZE, Vector2(400, 400));
1192 application.GetScene().Add(actor);
1195 application.SendNotification();
1196 application.Render();
1198 // Check the clear count and the render status
1199 DALI_TEST_EQUALS(glAbstraction.GetClearCountCalled(), 1, TEST_LOCATION);
1200 DALI_TEST_EQUALS(application.GetRenderNeedsPostRender(), true, TEST_LOCATION);
1202 // Remove the Renderer
1203 application.GetScene().Remove(actor);
1208 application.SendNotification();
1209 application.Render();
1211 // Check the clear count and the render status
1212 DALI_TEST_EQUALS(glAbstraction.GetClearCountCalled(), 2, TEST_LOCATION); // Should be cleared
1213 DALI_TEST_EQUALS(application.GetRenderNeedsPostRender(), true, TEST_LOCATION);
1218 int UtcDaliSceneFrameRenderedPresentedCallback(void)
1220 tet_infoline("UtcDaliSceneFrameRenderedCallback");
1222 TestApplication application;
1225 Geometry geometry = CreateQuadGeometry();
1226 Shader shader = CreateShader();
1227 Renderer renderer = Renderer::New(geometry, shader);
1229 Actor actor = Actor::New();
1230 actor.AddRenderer(renderer);
1231 application.GetScene().Add(actor);
1233 Dali::Integration::Scene scene = application.GetScene();
1236 scene.AddFrameRenderedCallback(std::unique_ptr<CallbackBase>(MakeCallback(&FrameCallback)), frameId);
1237 scene.AddFramePresentedCallback(std::unique_ptr<CallbackBase>(MakeCallback(&FrameCallback)), frameId);
1240 application.SendNotification();
1241 application.Render();
1243 Dali::Integration::Scene::FrameCallbackContainer callbackContainer;
1244 scene.GetFrameRenderedCallback(callbackContainer);
1246 DALI_TEST_EQUALS(callbackContainer.size(), 1, TEST_LOCATION);
1247 DALI_TEST_EQUALS(callbackContainer[0].second, frameId, TEST_LOCATION);
1249 callbackContainer.clear();
1251 scene.GetFramePresentedCallback(callbackContainer);
1253 DALI_TEST_EQUALS(callbackContainer.size(), 1, TEST_LOCATION);
1254 DALI_TEST_EQUALS(callbackContainer[0].second, frameId, TEST_LOCATION);