Pass surface into scene constructor
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-Scene.cpp
index 5f9e9d2..6e44ca7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -141,7 +141,8 @@ struct TouchFunctor
 
     if ( signalData.createNewScene )
     {
-      Dali::Integration::Scene scene = Dali::Integration::Scene::New( Vector2( 480.0f, 800.0f ) );
+      TestRenderSurface* surface = new TestRenderSurface( PositionSize( 0.0f, 0.0f, 480.0f, 800.0f ) ); // This is a leak, but we need to keep the surface alive till the end
+      Dali::Integration::Scene scene = Dali::Integration::Scene::New( *surface );
       DALI_TEST_CHECK( scene );
 
       signalData.newSceneCreated = true;
@@ -361,7 +362,8 @@ int UtcDaliSceneDiscard(void)
   tet_infoline("Testing Dali::Scene::Discard");
 
   // Create a new Scene
-  Dali::Integration::Scene scene = Dali::Integration::Scene::New( Vector2( 480.0f, 800.0f ) );
+  TestRenderSurface surface( PositionSize( 0.0f, 0.0f, 480.0f, 800.0f ) );
+  Dali::Integration::Scene scene = Dali::Integration::Scene::New( surface );
   DALI_TEST_CHECK( scene );
 
   // One reference of scene kept here and the other one kept in the Core
@@ -431,12 +433,17 @@ int UtcDaliSceneRootLayerAndSceneAlignment(void)
   TestApplication application;
 
   // Create a Scene
-  Dali::Integration::Scene scene = Dali::Integration::Scene::New( Vector2( 480.0f, 800.0f ) );
+  TestRenderSurface surface( PositionSize( 0.0f, 0.0f, 480.0f, 800.0f ) );
+  Dali::Integration::Scene scene = Dali::Integration::Scene::New( surface );
   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 );
 
+  // Add a renderable actor to the scene
+  auto actor = CreateRenderableActor();
+  scene.Add( actor );
+
   // Render and notify.
   application.SendNotification();
   application.Render(0);
@@ -462,7 +469,8 @@ int UtcDaliSceneRootLayerAndSceneAlignment(void)
   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 ) );
+  TestRenderSurface surface2( PositionSize( 0.0f, 0.0f, 480.0f, 800.0f ) );
+  Dali::Integration::Scene newScene = Dali::Integration::Scene::New( surface2 );
   DALI_TEST_CHECK( newScene );
 
   // Render and notify.
@@ -483,6 +491,43 @@ int UtcDaliSceneRootLayerAndSceneAlignment(void)
   END_TEST;
 }
 
+int UtcDaliSceneDeleteSurface(void)
+{
+  TestApplication application;
+
+  // Create the render surface for the scene
+  TestRenderSurface* renderSurface = new TestRenderSurface( Dali::PositionSize( 0, 0, 480.0f, 800.0f ) );
+
+  // Create a Scene
+  Dali::Integration::Scene scene = Dali::Integration::Scene::New( *renderSurface );
+  DALI_TEST_CHECK( scene );
+
+  // Render and notify.
+  application.SendNotification();
+  application.Render(0);
+
+  // Add a renderable actor to the scene
+  auto actor = CreateRenderableActor();
+  scene.Add( actor );
+
+  // Render and notify.
+  application.SendNotification();
+  application.Render(0);
+
+  // Notify the Core that the render surface will be deleted.
+  application.GetCore().SurfaceDeleted( renderSurface );
+
+  // Delete the render surface
+  delete renderSurface;
+  renderSurface = nullptr;
+
+  // Render and notify.
+  application.SendNotification();
+  application.Render(0);
+
+  END_TEST;
+}
+
 int UtcDaliSceneEventProcessingFinishedP(void)
 {
   TestApplication application;
@@ -826,3 +871,133 @@ int UtcDaliSceneSignalWheelEventP(void)
   END_TEST;
 }
 
+int UtcDaliSceneEnsureEmptySceneCleared(void)
+{
+  tet_infoline( "Ensure we clear the newly added window" );
+
+  TestApplication application;
+
+  // Create a new scene and set the background colors of both the new and the main scenes
+  auto defaultScene = application.GetScene();
+  defaultScene.SetBackgroundColor( Color::WHITE );
+
+  TestRenderSurface surface( PositionSize( 0.0f, 0.0f, 480.0f, 800.0f ) );
+  auto newScene = Integration::Scene::New( surface );
+  newScene.SetBackgroundColor( Color::RED );
+
+  // Need to create a renderable as we don't start rendering until we have at least one
+  // We don't need to add this to any scene
+  auto actor = CreateRenderableActor();
+
+  auto& glAbstraction = application.GetGlAbstraction();
+  auto clearCountBefore = glAbstraction.GetClearCountCalled();
+
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_EQUALS( glAbstraction.GetClearCountCalled(), clearCountBefore + 2, TEST_LOCATION );
+
+  // Add the actor to the main scene
+  defaultScene.Add( actor );
+
+  application.SendNotification();
+  application.Render();
+
+  // Add another scene and set its background color, ensure we clear it to the appropriate color
+
+  TestRenderSurface surface2( PositionSize( 0.0f, 0.0f, 480.0f, 800.0f ) );
+  auto thirdScene = Integration::Scene::New( surface2 );
+  thirdScene.SetBackgroundColor( Color::BLUE );
+
+  clearCountBefore = glAbstraction.GetClearCountCalled();
+
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_EQUALS( glAbstraction.GetClearCountCalled(), clearCountBefore + 3, TEST_LOCATION );
+
+  END_TEST;
+}
+
+int UtcDaliSceneSurfaceResizedDefaultScene(void)
+{
+  tet_infoline( "Ensure resizing of the surface is handled properly" );
+
+  TestApplication application;
+
+  auto defaultScene = application.GetScene();
+  Integration::RenderSurface* defaultSurface = defaultScene.GetSurface();
+  DALI_TEST_CHECK( defaultSurface );
+
+  // Ensure stage size matches the surface size
+  auto stage = Stage::GetCurrent();
+  DALI_TEST_EQUALS( stage.GetSize(), Vector2( defaultSurface->GetPositionSize().width, defaultSurface->GetPositionSize().height ), TEST_LOCATION );
+
+  // Resize the surface and inform the scene accordingly
+  Vector2 newSize( 1000.0f, 2000.0f );
+  DALI_TEST_CHECK( stage.GetSize() != newSize );
+  defaultSurface->MoveResize( PositionSize( 0, 0, newSize.width, newSize.height ) );
+  defaultScene.SurfaceResized();
+
+  DALI_TEST_EQUALS( stage.GetSize(), newSize, TEST_LOCATION );
+  DALI_TEST_EQUALS( defaultScene.GetSize(), newSize, TEST_LOCATION );
+
+  END_TEST;
+}
+
+int UtcDaliSceneSurfaceResizedAdditionalScene(void)
+{
+  tet_infoline( "Ensure resizing of the surface is handled properly on additional scenes" );
+
+  TestApplication application;
+  Vector2 originalSurfaceSize( 500.0f, 1000.0f );
+
+  TestRenderSurface surface( PositionSize( 0.0f, 0.0f, originalSurfaceSize.width, originalSurfaceSize.height ) );
+  auto scene = Integration::Scene::New( surface );
+
+  // Ensure stage size does NOT match the surface size
+  auto stage = Stage::GetCurrent();
+  const auto stageSize = stage.GetSize();
+  DALI_TEST_CHECK( stageSize != originalSurfaceSize );
+  DALI_TEST_EQUALS( originalSurfaceSize, scene.GetSize(), TEST_LOCATION );
+
+  // Resize the surface and inform the scene accordingly
+  Vector2 newSize( 1000.0f, 2000.0f );
+  DALI_TEST_CHECK( stage.GetSize() != newSize );
+  surface.MoveResize( PositionSize( 0, 0, newSize.width, newSize.height ) );
+  scene.SurfaceResized();
+
+  // Ensure the stage hasn't been resized
+  DALI_TEST_EQUALS( stage.GetSize(), stageSize, TEST_LOCATION );
+  DALI_TEST_EQUALS( scene.GetSize(), newSize, TEST_LOCATION );
+
+  END_TEST;
+}
+
+int UtcDaliSceneSetSurface(void)
+{
+  tet_infoline( "Scene::SetSurface test" );
+
+  TestApplication application;
+
+  // Create a scene with a surface and ensure the size and surface is set correctly on the scene
+  Vector2 surfaceSize( 480.0f, 800.0f );
+  TestRenderSurface surface( PositionSize( 0.0f, 0.0f, surfaceSize.width, surfaceSize.height ) );
+  auto scene = Integration::Scene::New( surface );
+  DALI_TEST_EQUALS( scene.GetSize(), surfaceSize, TEST_LOCATION );
+  DALI_TEST_CHECK( scene.GetSurface() == &surface );
+
+  // Create a new surface and set that on the scene
+  Vector2 newSurfaceSize( 1000.0f, 1000.0f );
+  TestRenderSurface newSurface( PositionSize( 0.0f, 0.0f, newSurfaceSize.width, newSurfaceSize.height ) );
+  scene.SetSurface( newSurface );
+  DALI_TEST_EQUALS( scene.GetSize(), newSurfaceSize, TEST_LOCATION );
+  DALI_TEST_CHECK( scene.GetSurface() == &newSurface );
+
+  // Ensure setting the same surface again doesn't have any side effects
+  scene.SetSurface( newSurface );
+  DALI_TEST_EQUALS( scene.GetSize(), newSurfaceSize, TEST_LOCATION );
+  DALI_TEST_CHECK( scene.GetSurface() == &newSurface );
+
+  END_TEST;
+}