X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali%2Futc-Dali-Scene.cpp;h=6e44ca7d7083ea1de1e57ded9d5f7afd59e6e3e8;hb=e2d69d69eb0dcdd6c0ad8f7faafb8b7115086e3c;hp=4aedee0c79090a2d016fb751b9fe39ae56f8d7a8;hpb=ebac73d264111598c5fe0844469fac58844ccf21;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/automated-tests/src/dali/utc-Dali-Scene.cpp b/automated-tests/src/dali/utc-Dali-Scene.cpp index 4aedee0..6e44ca7 100644 --- a/automated-tests/src/dali/utc-Dali-Scene.cpp +++ b/automated-tests/src/dali/utc-Dali-Scene.cpp @@ -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. @@ -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,15 @@ struct TouchFunctor { signalData.functorCalled = true; signalData.receivedTouchData = touch; + + if ( signalData.createNewScene ) + { + 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; + } } void operator()() @@ -341,6 +356,178 @@ int UtcDaliSceneGet(void) END_TEST; } +int UtcDaliSceneDiscard(void) +{ + TestApplication application; + tet_infoline("Testing Dali::Scene::Discard"); + + // Create a new Scene + 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 ); + + // 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 ); + + // Delete the root layer handle + rootLayer.Reset(); + + // Render and notify. + application.SendNotification(); + application.Render(0); + + 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 + 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); + + // 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 + 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. + 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 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; @@ -684,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; +}