Merge "Ensure root layers and scenes aligned together properly rather than using...
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-Scene.cpp
index 21076e2..5f9e9d2 100644 (file)
@@ -91,12 +91,16 @@ struct KeyEventReceivedFunctor
 struct TouchedSignalData
 {
   TouchedSignalData()
-  : functorCalled(false)
+  : functorCalled(false),
+    createNewScene(false),
+    newSceneCreated(false)
   {}
 
   void Reset()
   {
     functorCalled = false;
+    createNewScene = false;
+    newSceneCreated = false;
 
     receivedTouchEvent.points.clear();
     receivedTouchEvent.time = 0;
@@ -105,6 +109,8 @@ struct TouchedSignalData
   }
 
   bool functorCalled;
+  bool createNewScene;
+  bool newSceneCreated;
   TouchEvent receivedTouchEvent;
   TouchData receivedTouchData;
 };
@@ -132,6 +138,14 @@ struct TouchFunctor
   {
     signalData.functorCalled = true;
     signalData.receivedTouchData = touch;
+
+    if ( signalData.createNewScene )
+    {
+      Dali::Integration::Scene scene = Dali::Integration::Scene::New( Vector2( 480.0f, 800.0f ) );
+      DALI_TEST_CHECK( scene );
+
+      signalData.newSceneCreated = true;
+    }
   }
 
   void operator()()
@@ -387,6 +401,88 @@ int UtcDaliSceneDiscard(void)
   END_TEST;
 }
 
+int UtcDaliSceneCreateNewSceneDuringCoreEventProcessing(void)
+{
+  TestApplication application;
+
+  Dali::Integration::Scene scene = application.GetScene();
+
+  TouchedSignalData data;
+  data.createNewScene = true;
+  TouchFunctor functor( data );
+  scene.TouchSignal().Connect( &application, functor );
+
+  // Render and notify.
+  application.SendNotification();
+  application.Render();
+
+  GenerateTouch( application, PointState::DOWN, Vector2( 10.0f, 10.0f ) );
+
+  DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+  DALI_TEST_EQUALS( true, data.createNewScene, TEST_LOCATION );
+  DALI_TEST_EQUALS( true, data.newSceneCreated, TEST_LOCATION );
+  data.Reset();
+
+  END_TEST;
+}
+
+int UtcDaliSceneRootLayerAndSceneAlignment(void)
+{
+  TestApplication application;
+
+  // Create a Scene
+  Dali::Integration::Scene scene = Dali::Integration::Scene::New( Vector2( 480.0f, 800.0f ) );
+  DALI_TEST_CHECK( scene );
+
+  // One reference of scene kept here and the other one kept in the Core
+  DALI_TEST_CHECK( scene.GetBaseObject().ReferenceCount() == 2 );
+
+  // Render and notify.
+  application.SendNotification();
+  application.Render(0);
+
+  // Keep the reference of the root layer handle so it will still be alive after the scene is deleted
+  Layer rootLayer = scene.GetRootLayer();
+  DALI_TEST_CHECK( rootLayer );
+  DALI_TEST_CHECK( rootLayer.GetBaseObject().ReferenceCount() == 2 );
+
+  // Request to discard the scene from the Core
+  scene.Discard();
+  DALI_TEST_CHECK( scene.GetBaseObject().ReferenceCount() == 1 );
+
+  // Reset the scene handle
+  scene.Reset();
+
+  // Render and notify.
+  application.SendNotification();
+  application.Render(0);
+
+  // At this point, the scene should have been automatically deleted
+  // To prove this, the ref count of the root layer handle should be decremented to 1
+  DALI_TEST_CHECK( rootLayer.GetBaseObject().ReferenceCount() == 1 );
+
+  // Create a new Scene while the root layer of the deleted scene is still alive
+  Dali::Integration::Scene newScene = Dali::Integration::Scene::New( Vector2( 480.0f, 800.0f ) );
+  DALI_TEST_CHECK( newScene );
+
+  // Render and notify.
+  application.SendNotification();
+  application.Render(0);
+
+  // At this point, we have only one scene but two root layers
+  // The root layer of the deleted scene is still alive
+  DALI_TEST_CHECK( rootLayer.GetBaseObject().ReferenceCount() == 1 );
+
+  // Delete the root layer of the deleted scene
+  rootLayer.Reset();
+
+  // Render and notify.
+  application.SendNotification();
+  application.Render(0);
+
+  END_TEST;
+}
+
 int UtcDaliSceneEventProcessingFinishedP(void)
 {
   TestApplication application;