X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-toolkit%2Futc-Dali-ImageView.cpp;h=7d1ea16743be20206ca1c7132a402796bd55dd43;hp=02446a08b7c56b51d65b5a1e8cdec000d9414a9f;hb=bb3a306721570de9cbed7d63f8a478622af9a374;hpb=5e110a596a3beb09bc6e2f9ae3d3b68d6a30c72c diff --git a/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp b/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp index 02446a0..7d1ea16 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 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. @@ -836,7 +836,8 @@ int UtcDaliImageViewSetImageOnstageN(void) DALI_TEST_CHECK( !value.Get( url ) ); Property::Map map; - DALI_TEST_CHECK( !value.Get( map ) ); + value.Get( map ); + DALI_TEST_CHECK( map.Empty() ); END_TEST; } @@ -931,7 +932,8 @@ int UtcDaliImageViewSetImageOffstageN(void) DALI_TEST_CHECK( !value.Get( url ) ); Property::Map map; - DALI_TEST_CHECK( !value.Get( map ) ); + value.Get( map ); + DALI_TEST_CHECK( map.Empty() ); END_TEST; } @@ -951,7 +953,8 @@ int UtcDaliImageViewSetImageN(void) DALI_TEST_CHECK( !value.Get( url ) ); Property::Map map; - DALI_TEST_CHECK( !value.Get( map ) ); + value.Get( map ); + DALI_TEST_CHECK( map.Empty() ); std::string resource_url; Property::Value val = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) ); @@ -980,7 +983,8 @@ int UtcDaliImageViewSetImageTypeChangesP(void) application.Render( 16 ); DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty - DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty + value.Get( map ); + DALI_TEST_CHECK( map.Empty() ); // Value should be empty DALI_TEST_CHECK( ! visual ); // Visual should be invalid // Set a URL @@ -1006,7 +1010,8 @@ int UtcDaliImageViewSetImageTypeChangesP(void) visual = DevelControl::GetVisual( controlImpl, ImageView::Property::IMAGE ); DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty - DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty + value.Get( map ); + DALI_TEST_CHECK( map.Empty() ); // Value should be empty DALI_TEST_CHECK( ! visual ); // Visual should be invalid // Set an Image @@ -1033,7 +1038,8 @@ int UtcDaliImageViewSetImageTypeChangesP(void) visual = DevelControl::GetVisual( controlImpl, ImageView::Property::IMAGE ); DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty - DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty + value.Get( map ); + DALI_TEST_CHECK( map.Empty() ); // Value should be empty DALI_TEST_CHECK( ! visual ); // Visual should be invalid // Set a URL in property map @@ -1708,3 +1714,314 @@ int UtcDaliImageViewPaddingProperty02(void) END_TEST; } + +int UtcDaliImageViewUsingAtlasAndGetNaturalSize(void) +{ + ToolkitTestApplication application; + + // Check ImageView with background and main image, to ensure both visuals are marked as loaded + ImageView imageView = ImageView::New(); + Property::Map imageMap; + imageMap[ Toolkit::Visual::Property::TYPE ] = Toolkit::Visual::IMAGE; + imageMap[ Toolkit::ImageVisual::Property::URL ] = gImage_34_RGBA; + imageMap[ Toolkit::ImageVisual::Property::ATLASING ] = true; + imageView.SetProperty( Toolkit::ImageView::Property::IMAGE, imageMap ); + Stage::GetCurrent().Add( imageView ); + + // Trigger a potential relayout + application.SendNotification(); + application.Render(); + + Vector3 naturalSize = imageView.GetNaturalSize(); + + DALI_TEST_EQUALS( naturalSize.width, 34.0f, TEST_LOCATION ); + DALI_TEST_EQUALS( naturalSize.height, 34.0f, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliImageViewFillMode(void) +{ + ToolkitTestApplication application; + + tet_infoline( "Create an ImageVisual without padding and set the fill-mode to fill" ); + tet_infoline( " There should be no need to change the transform, our size-policy should be relative and size shoudl be [1,1]"); + + ImageView imageView = ImageView::New(); + Property::Map imageMap; + imageMap.Add( Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE ); + imageMap.Add( Toolkit::ImageVisual::Property::URL, gImage_600_RGB ); + imageMap.Add( DevelVisual::Property::VISUAL_FITTING_MODE, DevelVisual::FittingMode::FILL ); + + imageView.SetProperty( Toolkit::ImageView::Property::IMAGE, imageMap ); + + Stage::GetCurrent().Add( imageView ); + + // Trigger a potential relayout + application.SendNotification(); + application.Render(); + + Toolkit::Visual::Base visual = DevelControl::GetVisual( Toolkit::Internal::GetImplementation( imageView ), Toolkit::ImageView::Property::IMAGE ); + Property::Map returnedMap; + visual.CreatePropertyMap( returnedMap ); + + Property::Value* value = returnedMap.Find( Toolkit::Visual::Property::TRANSFORM ); + DALI_TEST_CHECK( value ); + Property::Map* map = value->GetMap(); + DALI_TEST_CHECK( map ); + + // If there's + value = map->Find( Toolkit::Visual::Transform::Property::SIZE ); + DALI_TEST_CHECK( value ); + DALI_TEST_EQUALS( value->Get< Vector2 >(), Vector2::ONE, TEST_LOCATION ); // Relative size so will take up 100% + + value = map->Find( Toolkit::Visual::Transform::Property::SIZE_POLICY ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get< int >() == Toolkit::Visual::Transform::Policy::RELATIVE ); + + END_TEST; +} + +int UtcDaliImageViewCustomShader(void) +{ + ToolkitTestApplication application; + + // Set a custom shader with an image url + { + Property::Map properties; + Property::Map shader; + const std::string vertexShader = "Foobar"; + const std::string fragmentShader = "Foobar"; + shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader; + shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader; + + properties[Visual::Property::TYPE] = Visual::IMAGE; + properties[Visual::Property::SHADER] = shader; + properties[ImageVisual::Property::URL] = TEST_IMAGE_FILE_NAME; + + ImageView imageView = ImageView::New(); + imageView.SetProperty( ImageView::Property::IMAGE, properties ); + + Stage::GetCurrent().Add( imageView ); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + Renderer renderer = imageView.GetRendererAt( 0 ); + Shader shader2 = renderer.GetShader(); + Property::Value value = shader2.GetProperty( Shader::Property::PROGRAM ); + Property::Map* map = value.GetMap(); + DALI_TEST_CHECK( map ); + + Property::Value* fragment = map->Find( "fragment" ); // fragment key name from shader-impl.cpp + DALI_TEST_EQUALS( fragmentShader, fragment->Get< std::string >(), TEST_LOCATION ); + + Property::Value* vertex = map->Find( "vertex" ); // vertex key name from shader-impl.cpp + DALI_TEST_EQUALS( vertexShader, vertex->Get< std::string >(), TEST_LOCATION ); + } + + // Set a custom shader after setting an image url + { + Property::Map properties; + Property::Map shader; + const std::string vertexShader = "Foobar"; + const std::string fragmentShader = "Foobar"; + shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader; + shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader; + + properties[Visual::Property::SHADER] = shader; + + ImageView imageView = ImageView::New( TEST_IMAGE_FILE_NAME ); + imageView.SetProperty( ImageView::Property::IMAGE, properties ); + + Stage::GetCurrent().Add( imageView ); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + Renderer renderer = imageView.GetRendererAt( 0 ); + Shader shader2 = renderer.GetShader(); + Property::Value value = shader2.GetProperty( Shader::Property::PROGRAM ); + Property::Map* map = value.GetMap(); + DALI_TEST_CHECK( map ); + + Property::Value* fragment = map->Find( "fragment" ); // fragment key name from shader-impl.cpp + DALI_TEST_EQUALS( fragmentShader, fragment->Get< std::string >(), TEST_LOCATION ); + + Property::Value* vertex = map->Find( "vertex" ); // vertex key name from shader-impl.cpp + DALI_TEST_EQUALS( vertexShader, vertex->Get< std::string >(), TEST_LOCATION ); + } + + // Set a custom shader before setting an image url + { + Property::Map properties; + Property::Map shader; + const std::string vertexShader = "Foobar"; + const std::string fragmentShader = "Foobar"; + shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader; + shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader; + + properties[Visual::Property::SHADER] = shader; + + ImageView imageView = ImageView::New(); + imageView.SetProperty( ImageView::Property::IMAGE, properties ); + imageView.SetProperty( ImageView::Property::IMAGE, TEST_IMAGE_FILE_NAME ); + + Stage::GetCurrent().Add( imageView ); + + application.SendNotification(); + application.Render(); + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + Renderer renderer = imageView.GetRendererAt( 0 ); + Shader shader2 = renderer.GetShader(); + Property::Value value = shader2.GetProperty( Shader::Property::PROGRAM ); + Property::Map* map = value.GetMap(); + DALI_TEST_CHECK( map ); + + Property::Value* fragment = map->Find( "fragment" ); // fragment key name from shader-impl.cpp + DALI_TEST_EQUALS( fragmentShader, fragment->Get< std::string >(), TEST_LOCATION ); + + Property::Value* vertex = map->Find( "vertex" ); // vertex key name from shader-impl.cpp + DALI_TEST_EQUALS( vertexShader, vertex->Get< std::string >(), TEST_LOCATION ); + } + + // Set a custom shader after setting a property map + { + Property::Map properties; + Property::Map shader; + const std::string vertexShader = "Foobar"; + const std::string fragmentShader = "Foobar"; + shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader; + shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader; + + properties[Visual::Property::SHADER] = shader; + + Property::Map properties1; + properties1[Visual::Property::TYPE] = Visual::IMAGE; + properties1[ImageVisual::Property::URL] = TEST_IMAGE_FILE_NAME; + + ImageView imageView = ImageView::New(); + imageView.SetProperty( ImageView::Property::IMAGE, properties1 ); + imageView.SetProperty( ImageView::Property::IMAGE, properties ); + + Stage::GetCurrent().Add( imageView ); + + application.SendNotification(); + application.Render(); + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + Renderer renderer = imageView.GetRendererAt( 0 ); + Shader shader2 = renderer.GetShader(); + Property::Value value = shader2.GetProperty( Shader::Property::PROGRAM ); + Property::Map* map = value.GetMap(); + DALI_TEST_CHECK( map ); + + Property::Value* fragment = map->Find( "fragment" ); // fragment key name from shader-impl.cpp + DALI_TEST_EQUALS( fragmentShader, fragment->Get< std::string >(), TEST_LOCATION ); + + Property::Value* vertex = map->Find( "vertex" ); // vertex key name from shader-impl.cpp + DALI_TEST_EQUALS( vertexShader, vertex->Get< std::string >(), TEST_LOCATION ); + } + + // Set a custom shader before setting a property map + { + Property::Map properties; + Property::Map shader; + const std::string vertexShader = "Foobar"; + const std::string fragmentShader = "Foobar"; + shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader; + shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader; + + properties[Visual::Property::SHADER] = shader; + + Property::Map properties1; + properties1[Visual::Property::TYPE] = Visual::IMAGE; + properties1[ImageVisual::Property::URL] = TEST_IMAGE_FILE_NAME; + + ImageView imageView = ImageView::New(); + imageView.SetProperty( ImageView::Property::IMAGE, properties ); + imageView.SetProperty( ImageView::Property::IMAGE, properties1 ); + + Stage::GetCurrent().Add( imageView ); + + application.SendNotification(); + application.Render(); + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + Renderer renderer = imageView.GetRendererAt( 0 ); + Shader shader2 = renderer.GetShader(); + Property::Value value = shader2.GetProperty( Shader::Property::PROGRAM ); + Property::Map* map = value.GetMap(); + DALI_TEST_CHECK( map ); + + Property::Value* fragment = map->Find( "fragment" ); // fragment key name from shader-impl.cpp + DALI_TEST_EQUALS( fragmentShader, fragment->Get< std::string >(), TEST_LOCATION ); + + Property::Value* vertex = map->Find( "vertex" ); // vertex key name from shader-impl.cpp + DALI_TEST_EQUALS( vertexShader, vertex->Get< std::string >(), TEST_LOCATION ); + } + + END_TEST; +} + + +namespace +{ +static int gFailCounter = 0; +const int MAX_RETRIES(3); + +void ReloadImage(ImageView imageView) +{ + Property::Map imageImmediateLoadingMap; + imageImmediateLoadingMap[ ImageVisual::Property::URL ] = "Non-existant-image.jpg"; + imageImmediateLoadingMap[ ImageVisual::Property::LOAD_POLICY ] = ImageVisual::LoadPolicy::IMMEDIATE; + + tet_infoline("Immediate load an image"); + imageView.SetProperty( ImageView::Property::IMAGE, imageImmediateLoadingMap ); +} + +void ResourceFailedReload( Control control ) +{ + gFailCounter++; + if( gFailCounter < MAX_RETRIES ) + { + ReloadImage(ImageView::DownCast(control)); + } +} +} + +int UtcDaliImageViewReloadFailedOnResourceReadySignal(void) +{ + tet_infoline("Test reloading failed image from within signal handler."); + + ToolkitTestApplication application; + + gFailCounter = 0; + + ImageView imageView = ImageView::New(); + imageView.ResourceReadySignal().Connect( &ResourceFailedReload ); + DALI_TEST_EQUALS( gFailCounter, 0, TEST_LOCATION ); + ReloadImage(imageView); + + // loading started, this waits for the loader thread to complete + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + application.SendNotification(); + + DALI_TEST_EQUALS( gFailCounter, 1, TEST_LOCATION ); + + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + application.SendNotification(); + + DALI_TEST_EQUALS( gFailCounter, 2, TEST_LOCATION ); + + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + application.SendNotification(); + DALI_TEST_EQUALS( gFailCounter, 3, TEST_LOCATION ); + + END_TEST; +}