X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=inline;f=automated-tests%2Fsrc%2Fdali-toolkit%2Futc-Dali-ImageView.cpp;h=c92f4c318ef4468e7f6b4b719a68a63b384d2f28;hb=e53a04c17ec1b512bb7c9e8defa62a32ef384e11;hp=dd400db2aa46997b582394bc6f2e8e329b8f4d6b;hpb=4aa0584cea3f755c3e1871932f06bc005033d906;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp b/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp index dd400db..c92f4c3 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) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2024 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. @@ -71,6 +71,8 @@ const char* TEST_BROKEN_IMAGE_L = TEST_RESOURCE_DIR "/broken_l.9.png"; const char* TEST_BROKEN_IMAGE_01 = TEST_RESOURCE_DIR "/button-up.9.png"; const char* TEST_BROKEN_IMAGE_02 = TEST_RESOURCE_DIR "/heartsframe.9.png"; +const char* TEST_INVALID_NPATCH_FILE_NAME_01 = "invalid1.9.png"; + // resolution: 34*34, pixel format: RGBA8888 static const char* gImage_34_RGBA = TEST_RESOURCE_DIR "/icon-edit.png"; // resolution: 600*600, pixel format: RGB888 @@ -83,6 +85,8 @@ const char* TEST_SVG_FILE_NAME = TEST_RESOURCE_DIR "/svg1.svg" const char* TEST_ANIMATED_VECTOR_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/insta_camera.json"; const char* TEST_WEBP_FILE_NAME = TEST_RESOURCE_DIR "/dali-logo.webp"; +const char* TEST_OVERWRITABLE_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/overwritable-image.jpg"; + void TestUrl(ImageView imageView, const std::string url) { Property::Value value = imageView.GetProperty(imageView.GetPropertyIndex("image")); @@ -92,6 +96,38 @@ void TestUrl(ImageView imageView, const std::string url) DALI_TEST_EQUALS(urlActual, url, TEST_LOCATION); } +void OverwriteImage(const char* sourceFilename) +{ + FILE* fpOut = fopen(TEST_OVERWRITABLE_IMAGE_FILE_NAME, "wb"); + DALI_TEST_CHECK(fpOut); + if(fpOut) + { + FILE* fpIn = fopen(sourceFilename, "rb"); + if(fpIn) + { + fseek(fpIn, 0, SEEK_END); + size_t size = ftell(fpIn); + + tet_printf("Open %s success! file size : %zu byte\n", sourceFilename, size); + Dali::Vector data; + data.Resize(size); + fseek(fpIn, 0, SEEK_SET); + size_t realSize = fread(data.Begin(), sizeof(uint8_t), size, fpIn); + fclose(fpIn); + data.Resize(realSize); + + // Overwrite + fwrite(data.Begin(), sizeof(uint8_t), size, fpOut); + } + else + { + tet_printf("Open %s failed! write invalid\n", sourceFilename); + fprintf(fpOut, "invalid\n"); + } + fclose(fpOut); + } +} + } // namespace int UtcDaliImageViewNewP(void) @@ -574,16 +610,8 @@ int UtcDaliImageViewAsyncLoadingWithAtlasing(void) // loading is not started if the actor is offScene application.GetScene().Add(imageView); - application.SendNotification(); - application.Render(16); - application.Render(16); - application.SendNotification(); imageView.SetProperty(Dali::Actor::Property::LAYOUT_DIRECTION, Dali::LayoutDirection::RIGHT_TO_LEFT); - application.SendNotification(); - application.Render(16); - application.Render(16); - application.SendNotification(); // loading started, this waits for the loader thread for max 30 seconds DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); @@ -621,10 +649,6 @@ int UtcDaliImageViewAsyncLoadingWithAtlasing02(void) imageView.SetProperty(ImageView::Property::IMAGE, asyncLoadingMap); application.GetScene().Add(imageView); - application.SendNotification(); - application.Render(16); - application.Render(16); - application.SendNotification(); // loading started, this waits for the loader thread for max 30 seconds DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); @@ -829,10 +853,6 @@ int UtcDaliImageViewAsyncLoadingEncodedBufferWithAtlasing(void) imageView.SetProperty(ImageView::Property::IMAGE, imageMap); imageView.SetProperty(Dali::Actor::Property::LAYOUT_DIRECTION, Dali::LayoutDirection::RIGHT_TO_LEFT); - application.SendNotification(); - application.Render(16); - application.Render(16); - application.SendNotification(); // loading started, this waits for the loader thread for max 30 seconds DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); @@ -893,6 +913,126 @@ int UtcDaliImageViewSyncLoadingEncodedBuffer(void) END_TEST; } +int UtcDaliImageViewEncodedBufferWithSvg(void) +{ + ToolkitTestApplication application; + TestGlAbstraction& gl = application.GetGlAbstraction(); + const std::vector& textures = gl.GetBoundTextures(); + size_t numTextures = textures.size(); + + // Get encoded raw-buffer svg image and generate url + EncodedImageBuffer buffer = ConvertFileToEncodedImageBuffer(TEST_SVG_FILE_NAME, EncodedImageBuffer::ImageType::VECTOR_IMAGE); + ImageUrl url = Toolkit::Image::GenerateUrl(buffer); + + // Async loading, no atlasing for big size image + ImageView imageView = ImageView::New(url.GetUrl()); + + // By default, Aysnc loading is used + application.GetScene().Add(imageView); + imageView.SetProperty(Actor::Property::SIZE, Vector2(100, 100)); + imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + + application.SendNotification(); + application.Render(16); + + // Load svg image + rasterize. + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + + application.SendNotification(); + application.Render(16); + application.SendNotification(); + + const std::vector& textures2 = gl.GetBoundTextures(); + DALI_TEST_GREATER(textures2.size(), numTextures, TEST_LOCATION); + + // Remove visual, for line coverage. + imageView.Unparent(); + application.SendNotification(); + application.Render(16); + + END_TEST; +} + +int UtcDaliImageViewEncodedBufferWithAnimatedVectorImage(void) +{ + ToolkitTestApplication application; + TestGlAbstraction& gl = application.GetGlAbstraction(); + const std::vector& textures = gl.GetBoundTextures(); + size_t numTextures = textures.size(); + + // Get encoded raw-buffer lottie image and generate url + EncodedImageBuffer buffer = ConvertFileToEncodedImageBuffer(TEST_ANIMATED_VECTOR_IMAGE_FILE_NAME, EncodedImageBuffer::ImageType::ANIMATED_VECTOR_IMAGE); + ImageUrl url = Toolkit::Image::GenerateUrl(buffer); + + // Async loading, no atlasing for big size image + ImageView imageView = ImageView::New(url.GetUrl()); + + // By default, Aysnc loading is used + application.GetScene().Add(imageView); + imageView.SetProperty(Actor::Property::SIZE, Vector2(100, 100)); + imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + + application.SendNotification(); + application.Render(16); + + // Load lottie image is sync. Only wait rasterize. + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + application.SendNotification(); + application.Render(16); + application.SendNotification(); + + const std::vector& textures2 = gl.GetBoundTextures(); + DALI_TEST_GREATER(textures2.size(), numTextures, TEST_LOCATION); + + // Remove visual, for line coverage. + imageView.Unparent(); + application.SendNotification(); + application.Render(16); + + END_TEST; +} + +int UtcDaliImageViewEncodedBufferWithInvalidImageType(void) +{ + ToolkitTestApplication application; + TestGlAbstraction& gl = application.GetGlAbstraction(); + const std::vector& textures = gl.GetBoundTextures(); + size_t numTextures = textures.size(); + + // Get encoded raw-buffer jpg image with invalid image type, and generate url + EncodedImageBuffer buffer = ConvertFileToEncodedImageBuffer(gImage_34_RGBA, static_cast(-1)); + ImageUrl url = Toolkit::Image::GenerateUrl(buffer); + + // Async loading, no atlasing for big size image + ImageView imageView = ImageView::New(url.GetUrl()); + + // By default, Aysnc loading is used + application.GetScene().Add(imageView); + imageView.SetProperty(Actor::Property::SIZE, Vector2(100, 100)); + imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + + application.SendNotification(); + application.Render(16); + + // Load image + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + application.SendNotification(); + application.Render(16); + application.SendNotification(); + + const std::vector& textures2 = gl.GetBoundTextures(); + DALI_TEST_GREATER(textures2.size(), numTextures, TEST_LOCATION); + + // Remove visual, for line coverage. + imageView.Unparent(); + application.SendNotification(); + application.Render(16); + + END_TEST; +} + int UtcDaliImageViewAddedTexture(void) { ToolkitTestApplication application; @@ -1052,6 +1192,23 @@ void ResourceReadySignal(Control control) gResourceReadySignalFired = true; } +void OnResourceReadySignalSVG(Control control) +{ + // Check whether Image Visual transforms on ImageVieiw::OnRelayout() + Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(control); + Toolkit::Visual::Base imageVisual = DevelControl::GetVisual(controlImpl, ImageView::Property::IMAGE); + Property::Map resultMap; + imageVisual.CreatePropertyMap(resultMap); + + Property::Value* transformValue = resultMap.Find(Visual::Property::TRANSFORM); + DALI_TEST_CHECK(transformValue); + Property::Map* retMap = transformValue->GetMap(); + DALI_TEST_CHECK(retMap); + + // Fitting mode should not be applied at this point + DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::SIZE)->Get(), Vector2::ZERO, TEST_LOCATION); +} + int UtcDaliImageViewCheckResourceReady(void) { ToolkitTestApplication application; @@ -2063,6 +2220,10 @@ int UtcDaliImageViewFittingModesFitHeight01(void) DALI_TEST_CHECK(value); DALI_TEST_EQUALS(value->Get(), Vector2(0, 0), TEST_LOCATION); // OFFSET is zero + value = returnedMap.Find(DevelVisual::Property::VISUAL_FITTING_MODE); + DALI_TEST_CHECK(value); + DALI_TEST_EQUALS(value->Get(), "FIT_HEIGHT", TEST_LOCATION); // OFFSET is zero + END_TEST; } @@ -2153,6 +2314,10 @@ int UtcDaliImageViewFittingModesFitWidth01(void) DALI_TEST_CHECK(value); DALI_TEST_EQUALS(value->Get(), Vector2(0, 50), TEST_LOCATION); + value = returnedMap.Find(DevelVisual::Property::VISUAL_FITTING_MODE); + DALI_TEST_CHECK(value); + DALI_TEST_EQUALS(value->Get(), "FIT_WIDTH", TEST_LOCATION); // OFFSET is zero + END_TEST; } @@ -2694,10 +2859,6 @@ void ReloadImage(ImageView imageView) void ResourceFailedReload(Control control) { gFailCounter++; - if(gFailCounter < MAX_RETRIES) - { - ReloadImage(ImageView::DownCast(control)); - } } } // namespace @@ -2716,17 +2877,14 @@ int UtcDaliImageViewReloadFailedOnResourceReadySignal(void) // 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); + ReloadImage(imageView); DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - application.SendNotification(); - DALI_TEST_EQUALS(gFailCounter, 2, TEST_LOCATION); + ReloadImage(imageView); DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - application.SendNotification(); DALI_TEST_EQUALS(gFailCounter, 3, TEST_LOCATION); END_TEST; @@ -2793,6 +2951,34 @@ int UtcDaliImageViewLoadRemoteSVG(void) END_TEST; } +int UtcDaliImageViewLoadRemoteLottie(void) +{ + tet_infoline("Test load from a remote server. (Note we don't support real download now. Just for line coverage)"); + + ToolkitTestApplication application; + + { + Toolkit::ImageView imageView; + imageView = Toolkit::ImageView::New(); + imageView.SetImage("https://lottie.json"); + imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT); + imageView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT); + imageView.SetProperty(Actor::Property::SIZE, Vector2(300, 300)); + imageView.SetProperty(Actor::Property::POSITION, Vector3(150.0f, 150.0f, 0.0f)); + + application.GetScene().Add(imageView); + + DALI_TEST_CHECK(imageView); + + application.SendNotification(); + application.Render(); + + // Do not check anything for here. + } + + END_TEST; +} + int UtcDaliImageViewSyncSVGLoading(void) { ToolkitTestApplication application; @@ -2821,6 +3007,51 @@ int UtcDaliImageViewSyncSVGLoading(void) END_TEST; } +int UtcDaliImageViewSyncSVGLoading02(void) +{ + ToolkitTestApplication application; + + tet_infoline("ImageView Testing SVG image sync loading"); + + { + ImageView imageView = ImageView::New(); + + // Sync loading is used + Property::Map syncLoadingMap; + syncLoadingMap.Insert(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE); + syncLoadingMap.Insert(Toolkit::ImageVisual::Property::URL, TEST_RESOURCE_DIR "/svg1.svg"); + syncLoadingMap.Insert(Toolkit::ImageVisual::Property::SYNCHRONOUS_LOADING, true); + syncLoadingMap.Insert(DevelVisual::Property::VISUAL_FITTING_MODE, Toolkit::DevelVisual::FIT_KEEP_ASPECT_RATIO); + imageView.SetProperty(ImageView::Property::IMAGE, syncLoadingMap); + imageView.ResourceReadySignal().Connect(&OnResourceReadySignalSVG); + + application.GetScene().Add(imageView); + DALI_TEST_CHECK(imageView); + + application.SendNotification(); + application.Render(); + + // Check whether Image Visual transforms on ImageVieiw::OnRelayout() + Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(imageView); + Toolkit::Visual::Base imageVisual = DevelControl::GetVisual(controlImpl, ImageView::Property::IMAGE); + Property::Map resultMap; + imageVisual.CreatePropertyMap(resultMap); + + Property::Value* transformValue = resultMap.Find(Visual::Property::TRANSFORM); + DALI_TEST_CHECK(transformValue); + Property::Map* retMap = transformValue->GetMap(); + DALI_TEST_CHECK(retMap); + + // Image Visual should be positioned depending on ImageView's padding + DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::SIZE)->Get(), Vector2(100, 100), TEST_LOCATION); + + Vector3 naturalSize = imageView.GetNaturalSize(); + DALI_TEST_EQUALS(naturalSize.width, 100.0f, TEST_LOCATION); + DALI_TEST_EQUALS(naturalSize.height, 100.0f, TEST_LOCATION); + } + END_TEST; +} + int UtcDaliImageViewAsyncSVGLoading(void) { ToolkitTestApplication application; @@ -3679,33 +3910,114 @@ void OnResourceReadySignal07(Control control) } } -} // namespace - -int UtcDaliImageViewSetImageOnResourceReadySignal01(void) +void OnResourceReadySignal08(Control control) { - tet_infoline("Test setting image from within signal handler."); - - ToolkitTestApplication application; + gResourceReadySignalCounter++; - gResourceReadySignalCounter = 0; + if(gImageView1) + { + gImageView1.Unparent(); + gImageView1.Reset(); + } + if(gImageView2) + { + gImageView2.Unparent(); + gImageView2.Reset(); + } +} - ImageView imageView = ImageView::New(gImage_34_RGBA); - imageView.ResourceReadySignal().Connect(&OnResourceReadySignal01); +std::size_t gResourceReadySignal09Emitted = false; - application.GetScene().Add(imageView); +void OnResourceReadySignal09(Control control) +{ + gResourceReadySignalCounter++; - DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + if(gImageView1 && !gResourceReadySignal09Emitted) + { + gResourceReadySignal09Emitted = true; + gImageView1.ResourceReadySignal().Disconnect(&OnResourceReadySignal09); - application.SendNotification(); - application.Render(); + // Try to load cached invalid nine patch image. It will request load now. + gImageView1.SetImage(TEST_INVALID_NPATCH_FILE_NAME_01); + gImageView2.SetImage(TEST_INVALID_NPATCH_FILE_NAME_01); - DALI_TEST_EQUALS(gResourceReadySignalCounter, 2, TEST_LOCATION); + // Destroy all visuals immediatly. + gImageView1.Unparent(); + gImageView1.Reset(); + gImageView2.Unparent(); + gImageView2.Reset(); + } +} +constexpr int gResourceReadySignal10MaxCounter = 5; - DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION); +void OnResourceReadySignal10(Control control) +{ + gResourceReadySignalCounter++; - // Create a new ImageView to cache the image - ImageView imageView1 = ImageView::New(gImage_600_RGB); - application.GetScene().Add(imageView1); + tet_printf("OnResourceReadySignal10 comes!\n"); + if(gResourceReadySignalCounter < gResourceReadySignal10MaxCounter) + { + tet_printf("OnResourceReadySignal10 Set image\n"); + gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, gImage_34_RGBA); + tet_printf("OnResourceReadySignal10 Set image done\n"); + } +} + +void OnResourceReadySignal11(Control control) +{ + gResourceReadySignalCounter++; + + if(!gImageView2) + { + auto scene = gImageView1.GetParent(); + + // Try to load animated image visual here which is already cached, and then ignore forcely. + + Property::Map map1; + map1[Toolkit::ImageVisual::Property::URL] = TEST_GIF_FILE_NAME; + + gImageView2 = ImageView::New(); + gImageView2.SetProperty(Toolkit::ImageView::Property::IMAGE, map1); + + gImageView3 = ImageView::New(); + gImageView3.SetProperty(Toolkit::ImageView::Property::IMAGE, map1); + + scene.Add(gImageView2); + gImageView2.Unparent(); + + scene.Add(gImageView3); + gImageView3.Unparent(); + gImageView3.Reset(); // Destroy visual + } +} + +} // namespace + +int UtcDaliImageViewSetImageOnResourceReadySignal01(void) +{ + tet_infoline("Test setting image from within signal handler."); + + ToolkitTestApplication application; + + gResourceReadySignalCounter = 0; + + ImageView imageView = ImageView::New(gImage_34_RGBA); + imageView.ResourceReadySignal().Connect(&OnResourceReadySignal01); + + application.GetScene().Add(imageView); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadySignalCounter, 2, TEST_LOCATION); + + DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION); + + // Create a new ImageView to cache the image + ImageView imageView1 = ImageView::New(gImage_600_RGB); + application.GetScene().Add(imageView1); DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); @@ -3866,8 +4178,6 @@ int UtcDaliImageViewOnResourceReadySignalWithBrokenAlphaMask02(void) imageView.ResourceReadySignal().Connect(&OnSimpleResourceReadySignal); application.GetScene().Add(imageView); - application.SendNotification(); - application.Render(); // Don't unparent imageView, for keep the cache. }; @@ -3885,7 +4195,8 @@ int UtcDaliImageViewOnResourceReadySignalWithBrokenAlphaMask02(void) // Remain 1 signal due to we use #URL + 1 mask image. DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(expectResourceReadySignalCounter + 1), true, TEST_LOCATION); - + application.SendNotification(); + application.Render(); DALI_TEST_EQUALS(gResourceReadySignalCounter, expectResourceReadySignalCounter, TEST_LOCATION); END_TEST; @@ -4160,7 +4471,13 @@ int UtcDaliImageViewSetImageOnResourceReadySignal06(void) DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); DALI_TEST_EQUALS(gResourceReadySignalCounter, 2, TEST_LOCATION); - tet_infoline("load done"); + tet_infoline("Note that resource ready should not come now."); + tet_infoline("Try to load remained 2 valid image + apply masking"); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION); + DALI_TEST_EQUALS(gResourceReadySignalCounter, 4, TEST_LOCATION); + + tet_infoline("Check all resource ready comes now."); } END_TEST; } @@ -4216,23 +4533,1106 @@ int UtcDaliImageViewSetImageOnResourceReadySignal07(void) END_TEST; } -int UtcDaliImageViewUseSameUrlWithAnimatedImageVisual(void) +int UtcDaliImageViewSetImageOnResourceReadySignal08(void) { - tet_infoline("Test multiple views with same image in animated image visual"); + tet_infoline("Test remove npatch images during resource ready"); + ToolkitTestApplication application; - gImageView1 = ImageView::New(TEST_WEBP_FILE_NAME); - application.GetScene().Add(gImageView1); + gResourceReadySignalCounter = 0; - tet_infoline("Remove imageView and Create new imageView with same url"); - application.GetScene().Remove(gImageView1); - gImageView2 = ImageView::New(TEST_WEBP_FILE_NAME); - application.GetScene().Add(gImageView2); + Property::Map map; + map[Toolkit::ImageVisual::Property::URL] = TEST_BROKEN_IMAGE_M; + + // Clear image view for clear test + + if(gImageView1) + { + gImageView1.Reset(); + } + if(gImageView2) + { + gImageView2.Reset(); + } + + // Case 1 : Remove all images during resource ready. + try + { + gImageView1 = ImageView::New(); + gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal08); + application.GetScene().Add(gImageView1); + + application.SendNotification(); + application.Render(); + + // Load gImageView1 + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + DALI_TEST_EQUALS(gResourceReadySignalCounter, 1, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_CHECK(true); + } + catch(...) + { + // Exception should not happened + DALI_TEST_CHECK(false); + } + + // Clear cache. application.SendNotification(); application.Render(); - tet_infoline("Check the ImageView load image successfully"); + gResourceReadySignalCounter = 0; + + // Case 2 : Remove all images when we use cached resource. + try + { + gImageView1 = ImageView::New(); + gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + gImageView1.ResourceReadySignal().Connect(&OnSimpleResourceReadySignal); + application.GetScene().Add(gImageView1); + + application.SendNotification(); + application.Render(); + + // Load gImageView1 + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + DALI_TEST_EQUALS(gResourceReadySignalCounter, 1, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + gImageView2 = ImageView::New(); + gImageView2.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + gImageView2.ResourceReadySignal().Connect(&OnResourceReadySignal08); + application.GetScene().Add(gImageView2); + DALI_TEST_EQUALS(gResourceReadySignalCounter, 2, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_CHECK(true); + } + catch(...) + { + // Exception should not happened + DALI_TEST_CHECK(false); + } + gResourceReadySignalCounter = 0; + + // Clear image view for clear test + + if(gImageView1) + { + gImageView1.Reset(); + } + if(gImageView2) + { + gImageView2.Reset(); + } + + END_TEST; +} + +int UtcDaliImageViewSetImageOnResourceReadySignal09(void) +{ + tet_infoline("Test load invalid npatch images during invalid resource ready"); + + ToolkitTestApplication application; + + gResourceReadySignalCounter = 0; + + Property::Map map; + map[Toolkit::ImageVisual::Property::URL] = TEST_INVALID_NPATCH_FILE_NAME_01; + + // Clear image view for clear test + + if(gImageView1) + { + gImageView1.Reset(); + } + if(gImageView2) + { + gImageView2.Reset(); + } + if(gImageView3) + { + gImageView3.Reset(); + } + + // Dummy view with npatch image + ImageView dummyView = ImageView::New(TEST_BROKEN_IMAGE_M); + application.GetScene().Add(dummyView); + + application.SendNotification(); + application.Render(); DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + // Case 1 : Reload images during resource ready. + try + { + gResourceReadySignal09Emitted = false; + + gImageView1 = ImageView::New(); + gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal09); + application.GetScene().Add(gImageView1); + + gImageView2 = ImageView::New(); + application.GetScene().Add(gImageView2); + + // Load TEST_INVALID_NPATCH_FILE_NAME_01 + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + // Load TEST_INVALID_NPATCH_FILE_NAME_01 one more times. + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_CHECK(true); + } + catch(...) + { + // Exception should not happened + DALI_TEST_CHECK(false); + } + + // Clear cache. + application.SendNotification(); + application.Render(); + + gResourceReadySignalCounter = 0; + + // Case 2 : Remove all images when we use cached resource. + try + { + gResourceReadySignal09Emitted = false; + + gImageView3 = ImageView::New(); + gImageView3.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + gImageView3.ResourceReadySignal().Connect(&OnSimpleResourceReadySignal); + application.GetScene().Add(gImageView3); + + gImageView2 = ImageView::New(); + application.GetScene().Add(gImageView2); + + // Load gImageView2 + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + gImageView1 = ImageView::New(); + gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal09); + application.GetScene().Add(gImageView1); + + // Load gImageView1 + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + // Load TEST_INVALID_NPATCH_FILE_NAME_01 one more times. + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_CHECK(true); + } + catch(...) + { + // Exception should not happened + DALI_TEST_CHECK(false); + } + gResourceReadySignalCounter = 0; + + // Clear image view for clear test + + if(gImageView1) + { + gImageView1.Reset(); + } + if(gImageView2) + { + gImageView2.Reset(); + } + if(gImageView3) + { + gImageView3.Reset(); + } + END_TEST; } + +int UtcDaliImageViewSetImageOnResourceReadySignal10(void) +{ + tet_infoline("Test ResourceReady signal comes more than 2 times."); + + ToolkitTestApplication application; + + gResourceReadySignalCounter = 0; + + // Clear image view for clear test + + if(gImageView1) + { + gImageView1.Reset(); + } + + // Dummy view to cache image. + ImageView dummyView = ImageView::New(gImage_34_RGBA); + application.GetScene().Add(dummyView); + + application.SendNotification(); + application.Render(); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + try + { + gImageView1 = ImageView::New(); + gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, gImage_34_RGBA); + gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal10); + application.GetScene().Add(gImageView1); // It will call resourceReady signal 1 time. + + tet_printf("ResourceReady called %d times\n", gResourceReadySignalCounter); + + DALI_TEST_GREATER(gResourceReadySignal10MaxCounter, gResourceReadySignalCounter, TEST_LOCATION); // Check whether resource ready call too much. + + for(int i = 0; i < gResourceReadySignal10MaxCounter; ++i) + { + tet_printf("RunIdles\n"); + // Executes the idle callbacks. + application.RunIdles(); + application.SendNotification(); + application.Render(); + tet_printf("RunIdles done\n"); + } + tet_printf("ResourceReady called %d times\n", gResourceReadySignalCounter); + + DALI_TEST_EQUALS(gResourceReadySignalCounter, gResourceReadySignal10MaxCounter, TEST_LOCATION); + + DALI_TEST_CHECK(true); + } + catch(...) + { + // Exception should not happened + DALI_TEST_CHECK(false); + } + + // Clear cache. + application.SendNotification(); + application.Render(); + + gResourceReadySignalCounter = 0; + + gResourceReadySignalCounter = 0; + + // Clear image view for clear test + + if(gImageView1) + { + gImageView1.Reset(); + } + + END_TEST; +} + +int UtcDaliImageViewSetImageOnResourceReadySignal10WhenAddIdleFailed(void) +{ + tet_infoline("Test ResourceReady signal comes more than 2 times, but do not call again if AddIdle failed"); + + ToolkitTestApplication application; + + gResourceReadySignalCounter = 0; + + // Clear image view for clear test + + if(gImageView1) + { + gImageView1.Reset(); + } + + // Dummy view to cache image. + ImageView dummyView = ImageView::New(gImage_34_RGBA); + application.GetScene().Add(dummyView); + + application.SendNotification(); + application.Render(); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + // Make AddIdle failed. + ToolkitApplication::ADD_IDLE_SUCCESS = false; + + try + { + gImageView1 = ImageView::New(); + gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, gImage_34_RGBA); + gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal10); + application.GetScene().Add(gImageView1); // It will call resourceReady signal 1 time. + + tet_printf("ResourceReady called %d times\n", gResourceReadySignalCounter); + + DALI_TEST_GREATER(gResourceReadySignal10MaxCounter, gResourceReadySignalCounter, TEST_LOCATION); // Check whether resource ready call too much. + + for(int i = 0; i < gResourceReadySignal10MaxCounter; ++i) + { + tet_printf("RunIdles\n"); + // Executes the idle callbacks. + application.RunIdles(); + application.SendNotification(); + application.Render(); + tet_printf("RunIdles done\n"); + } + tet_printf("ResourceReady called %d times\n", gResourceReadySignalCounter); + + DALI_TEST_GREATER(gResourceReadySignal10MaxCounter, gResourceReadySignalCounter, TEST_LOCATION); // Check whether resource ready not called multiple times. + + DALI_TEST_CHECK(true); + } + catch(...) + { + // Exception should not happened + DALI_TEST_CHECK(false); + } + + ToolkitApplication::ADD_IDLE_SUCCESS = true; + + // Clear cache. + application.SendNotification(); + application.Render(); + + gResourceReadySignalCounter = 0; + + gResourceReadySignalCounter = 0; + + // Clear image view for clear test + + if(gImageView1) + { + gImageView1.Reset(); + } + + END_TEST; +} + +int UtcDaliImageViewSetImageOnResourceReadySignal11(void) +{ + tet_infoline("Test ResourceReady Add AnimatedImageVisual and then Remove immediately."); + + ToolkitTestApplication application; + + gResourceReadySignalCounter = 0; + + // Clear image view for clear test + + if(gImageView1) + { + gImageView1.Reset(); + } + if(gImageView2) + { + gImageView2.Reset(); + } + if(gImageView3) + { + gImageView3.Reset(); + } + + try + { + gImageView1 = ImageView::New(); + gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, TEST_GIF_FILE_NAME); + gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal11); + application.GetScene().Add(gImageView1); // It will call resourceReady signal 1 time. + + tet_printf("ResourceReady called %d times\n", gResourceReadySignalCounter); + + DALI_TEST_EQUALS(gResourceReadySignalCounter, 0, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + // Load gImageView1 + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + tet_printf("ResourceReady called %d times\n", gResourceReadySignalCounter); + + DALI_TEST_EQUALS(gResourceReadySignalCounter, 1, TEST_LOCATION); + + DALI_TEST_CHECK(true); + } + catch(...) + { + // Exception should not happened + DALI_TEST_CHECK(false); + } + + // Clear cache. + application.SendNotification(); + application.Render(); + + gResourceReadySignalCounter = 0; + + // Clear image view for clear test + + if(gImageView1) + { + gImageView1.Reset(); + } + if(gImageView2) + { + gImageView2.Reset(); + } + if(gImageView3) + { + gImageView3.Reset(); + } + + END_TEST; +} + +int UtcDaliImageViewUseSameUrlWithAnimatedImageVisual(void) +{ + tet_infoline("Test multiple views with same image in animated image visual"); + ToolkitTestApplication application; + + gImageView1 = ImageView::New(TEST_WEBP_FILE_NAME); + application.GetScene().Add(gImageView1); + + tet_infoline("Remove imageView and Create new imageView with same url"); + application.GetScene().Remove(gImageView1); + gImageView2 = ImageView::New(TEST_WEBP_FILE_NAME); + application.GetScene().Add(gImageView2); + + application.SendNotification(); + application.Render(); + + tet_infoline("Check the ImageView load image successfully"); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + END_TEST; +} + +int UtcDaliImageViewNpatchImageCacheTest01(void) +{ + tet_infoline("Test npatch image cached"); + + ToolkitTestApplication application; + ImageView imageView[2]; + + auto& gl = application.GetGlAbstraction(); + gl.EnableTextureCallTrace(true); + auto& textureCallStack = gl.GetTextureTrace(); + textureCallStack.Enable(true); + textureCallStack.EnableLogging(true); + + auto TestNPatch = [&](int index, const std::string& nPatchImageUrl, const char* location) { + if(imageView[index]) + { + imageView[index].Unparent(); + } + + // Ensure remove npatch cache if required. + application.SendNotification(); + application.Render(); + + imageView[index] = ImageView::New(nPatchImageUrl); + imageView[index].SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f)); + application.GetScene().Add(imageView[index]); + }; + + TestNPatch(0, TEST_BROKEN_IMAGE_M, TEST_LOCATION); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + tet_printf("trace : \n%s\n", textureCallStack.GetTraceString().c_str()); + + // Check we gen only 1 textures + DALI_TEST_EQUALS(textureCallStack.CountMethod("GenTextures"), 1, TEST_LOCATION); + textureCallStack.Reset(); + + // Let we use cached textures + for(int i = 0; i < 10; i++) + { + TestNPatch(1, TEST_BROKEN_IMAGE_M, TEST_LOCATION); + TestNPatch(0, TEST_BROKEN_IMAGE_M, TEST_LOCATION); + } + + application.SendNotification(); + application.Render(); + // Check we use cached npatch data so we don't generate new texture textures + DALI_TEST_EQUALS(textureCallStack.CountMethod("GenTextures"), 0, TEST_LOCATION); + + // Clear all cached + imageView[0].Unparent(); + imageView[0].Reset(); + imageView[1].Unparent(); + imageView[1].Reset(); + + application.SendNotification(); + application.Render(); + + textureCallStack.Reset(); + // Let we use deference textures + TestNPatch(1, TEST_BROKEN_IMAGE_S, TEST_LOCATION); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + // Try to load multiple times. + for(int i = 0; i < 3; i++) + { + TestNPatch(0, TEST_BROKEN_IMAGE_M, TEST_LOCATION); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + TestNPatch(1, TEST_BROKEN_IMAGE_S, TEST_LOCATION); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + } + application.SendNotification(); + application.Render(); + + imageView[0].Unparent(); + imageView[0].Reset(); + imageView[1].Unparent(); + imageView[1].Reset(); + + application.SendNotification(); + application.Render(); + + // Check memory leak + DALI_TEST_EQUALS(textureCallStack.CountMethod("GenTextures"), textureCallStack.CountMethod("DeleteTextures"), TEST_LOCATION); + + END_TEST; +} + +int UtcDaliImageViewNpatchImageCacheTest02(void) +{ + tet_infoline("Test npatch image cached with border"); + + ToolkitTestApplication application; + ImageView imageView[2]; + + auto& gl = application.GetGlAbstraction(); + gl.EnableTextureCallTrace(true); + auto& textureCallStack = gl.GetTextureTrace(); + textureCallStack.Enable(true); + textureCallStack.EnableLogging(true); + + auto TestBorderImage = [&](int index, const std::string& normalImageUrl, const Rect border, const char* location) { + Property::Map map; + map[Toolkit::Visual::Property::TYPE] = Toolkit::Visual::N_PATCH; + map[Toolkit::ImageVisual::Property::URL] = normalImageUrl; + map[Toolkit::ImageVisual::Property::BORDER] = border; + + imageView[index] = ImageView::New(); + imageView[index].SetProperty(Toolkit::ImageView::Property::IMAGE, map); + imageView[index].SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f)); + application.GetScene().Add(imageView[index]); + }; + + TestBorderImage(0, gImage_34_RGBA, Rect(0, 0, 0, 0), TEST_LOCATION); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + tet_printf("trace : \n%s\n", textureCallStack.GetTraceString().c_str()); + + // Check we gen only 1 textures + DALI_TEST_EQUALS(textureCallStack.CountMethod("GenTextures"), 1, TEST_LOCATION); + textureCallStack.Reset(); + + // Let we use cached textures + for(int i = 0; i < 10; i++) + { + TestBorderImage(0, gImage_34_RGBA, Rect(i, i + 1, i + 2, i + 3), TEST_LOCATION); + TestBorderImage(1, gImage_34_RGBA, Rect(i + 1, i, i + 3, i + 2), TEST_LOCATION); + } + + application.SendNotification(); + application.Render(); + + // Check we use cached npatch data so we don't generate new texture textures + DALI_TEST_EQUALS(textureCallStack.CountMethod("GenTextures"), 0, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliImageViewPlaceholderImage01(void) +{ + tet_infoline("Test imageView use placeholder image"); + + ToolkitTestApplication application; + Property::Map map; + map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB; + + ImageView imageView = ImageView::New(); + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + imageView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f)); + application.GetScene().Add(imageView); + + Property::Value value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE); + std::string url; + DALI_TEST_CHECK(value.Get(url)); + DALI_TEST_CHECK(url.empty()); + imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA); + + application.SendNotification(); + application.Render(); + + value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE); + DALI_TEST_CHECK(value.Get(url)); + DALI_TEST_CHECK(url == gImage_34_RGBA); + + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + application.SendNotification(); + application.Render(); + + // Replace Image test + map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1; + map[ImageView::Property::PLACEHOLDER_IMAGE] = gImage_34_RGBA; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + application.SendNotification(); + application.Render(); + + map[Toolkit::ImageVisual::Property::URL] = ""; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + application.SendNotification(); + application.Render(); + + map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_2; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + application.SendNotification(); + application.Render(); + + // Replace Image test2 + map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + application.SendNotification(); + application.Render(); + + map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_2; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + application.SendNotification(); + application.Render(); + + map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + application.SendNotification(); + application.Render(900); + + map[Toolkit::ImageVisual::Property::URL] = ""; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + application.SendNotification(); + application.Render(); + + map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + application.SendNotification(); + application.Render(); + + END_TEST; +} + +int UtcDaliImageViewPlaceholderImage02(void) +{ + tet_infoline("Test imageView use placeholder image without resource ready"); + + ToolkitTestApplication application; + + Property::Map map; + map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB; + + ImageView imageView = ImageView::New(); + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + imageView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f)); + DALI_TEST_EQUALS(imageView.IsResourceReady(), false, TEST_LOCATION); + imageView.ResourceReadySignal().Connect(&ResourceReadySignal); + application.GetScene().Add(imageView); + + Property::Value value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE); + std::string url; + DALI_TEST_CHECK(value.Get(url)); + DALI_TEST_CHECK(url.empty()); + + imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE); + DALI_TEST_CHECK(value.Get(url)); + DALI_TEST_CHECK(url == gImage_34_RGBA); + + DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION); + DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION); + + gResourceReadySignalFired = false; + map[Toolkit::ImageVisual::Property::URL] = ""; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION); + DALI_TEST_EQUALS(gResourceReadySignalFired, false, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliImageViewTransitionEffect01(void) +{ + tet_infoline("Test imageView use transition effect"); + + ToolkitTestApplication application; + Property::Map map; + map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB; + map[Toolkit::Visual::Property::OPACITY] = 0.9f; + + ImageView imageView = ImageView::New(); + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + imageView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f)); + application.GetScene().Add(imageView); + + Property::Value value = imageView.GetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT); + bool transition; + DALI_TEST_CHECK(value.Get(transition)); + DALI_TEST_CHECK(transition == false); + imageView.SetProperty(Toolkit::ImageView::Property::ENABLE_TRANSITION_EFFECT, true); + + application.SendNotification(); + application.Render(); + + value = imageView.GetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT); + DALI_TEST_CHECK(value.Get(transition)); + DALI_TEST_CHECK(transition == true); + + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + // Test transition effect with placeholder + map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + map[Toolkit::ImageVisual::Property::URL] = ""; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA); + application.SendNotification(); + application.Render(); + + map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA); + application.SendNotification(); + application.Render(); + + map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA); + application.SendNotification(); + + map[Toolkit::ImageVisual::Property::URL] = ""; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA); + application.SendNotification(); + application.Render(); + + map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, ""); + application.SendNotification(); + application.Render(); + + map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + application.SendNotification(); + application.Render(); + + map[Toolkit::ImageVisual::Property::URL] = ""; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + application.SendNotification(); + application.Render(); + + // Test transition effect without placeholder + map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + application.SendNotification(); + application.Render(); + + map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + application.SendNotification(); + application.Render(); + + map[Toolkit::ImageVisual::Property::URL] = ""; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + application.SendNotification(); + application.Render(); + + map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB; + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + application.SendNotification(); + application.Render(); + + imageView.SetImage(TEST_IMAGE_1); + application.SendNotification(); + application.Render(); + + imageView.SetImage(gImage_600_RGB); + application.SendNotification(); + application.Render(9000); + + imageView.SetImage(""); + application.SendNotification(); + application.Render(); + + imageView.SetImage(TEST_IMAGE_1); + application.SendNotification(); + application.Render(); + + // Clear all cached + imageView.Unparent(); + imageView.Reset(); + + END_TEST; +} + +int UtcDaliImageViewTransitionEffect02(void) +{ + tet_infoline("Test imageView use transition effect with replace image"); + + ToolkitTestApplication application; + + Property::Map map; + + ImageView imageView = ImageView::New(); + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + imageView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f)); + application.GetScene().Add(imageView); + + Property::Value value; + value = imageView.GetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT); + bool transition; + DALI_TEST_CHECK(value.Get(transition)); + DALI_TEST_CHECK(transition == false); + imageView.SetProperty(Toolkit::ImageView::Property::ENABLE_TRANSITION_EFFECT, true); + + value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE); + std::string url; + DALI_TEST_CHECK(value.Get(url)); + DALI_TEST_CHECK(url.empty()); + imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA); + application.SendNotification(); + application.Render(); + + imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, ""); + application.SendNotification(); + application.Render(); + + imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA); + application.SendNotification(); + application.Render(); + + value = imageView.GetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT); + DALI_TEST_CHECK(value.Get(transition)); + DALI_TEST_CHECK(transition == true); + + value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE); + DALI_TEST_CHECK(value.Get(url)); + DALI_TEST_CHECK(url == gImage_34_RGBA); + + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map); + application.SendNotification(); + application.Render(); + + // Clear all cached + imageView.Unparent(); + imageView.Reset(); + + END_TEST; +} + +int UtcDaliImageViewTransitionEffect03(void) +{ + tet_infoline("Test imageView use transition effect with placeholder"); + + ToolkitTestApplication application; + Property::Map map; + + ImageView imageView = ImageView::New(); + imageView.SetImage(""); + imageView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f)); + imageView.SetProperty(ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA); + imageView.SetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT, true); + application.GetScene().Add(imageView); + + //DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + application.SendNotification(); + application.Render(16); + + tet_infoline("(1)"); + imageView.SetImage(gImage_600_RGB); + imageView.SetProperty(ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + application.SendNotification(); + application.Render(16); + + Property::Value value; + value = imageView.GetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT); + bool transition; + DALI_TEST_CHECK(value.Get(transition)); + DALI_TEST_CHECK(transition == true); + + value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE); + std::string url; + DALI_TEST_CHECK(value.Get(url)); + DALI_TEST_CHECK(url == gImage_34_RGBA); + + imageView.SetImage(""); + application.SendNotification(); + application.Render(16); + + imageView.SetImage(TEST_IMAGE_1); + imageView.SetProperty(ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(16); + + // Clear all cached + imageView.Unparent(); + imageView.Reset(); + + END_TEST; +} + +int UtcDaliImageViewImageLoadFailureAndReload01(void) +{ + tet_infoline("Try to load invalid image first, and then reload after that image valid."); + ToolkitTestApplication application; + + gResourceReadySignalFired = false; + + // Make overwritable image invalid first. + OverwriteImage(""); + + ImageView imageView = ImageView::New(TEST_OVERWRITABLE_IMAGE_FILE_NAME); + imageView.SetProperty(Actor::Property::SIZE, Vector2(100.f, 100.f)); + imageView.ResourceReadySignal().Connect(&ResourceReadySignal); + + application.GetScene().Add(imageView); + application.SendNotification(); + application.Render(16); + + // loading started, this waits for the loader thread + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION); + DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION); + DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::FAILED, TEST_LOCATION); + + gResourceReadySignalFired = false; + + // Make overwritable image valid now. + OverwriteImage(gImage_34_RGBA); + + // Reload the image + Property::Map attributes; + DevelControl::DoAction(imageView, ImageView::Property::IMAGE, DevelImageVisual::Action::RELOAD, attributes); + application.SendNotification(); + application.Render(16); + + // loading started, this waits for the loader thread + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION); + DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION); + DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::READY, TEST_LOCATION); + + // Make overwritable image invalid end of test (for clean). + OverwriteImage(""); + + gResourceReadySignalFired = false; + + END_TEST; +} + +int UtcDaliImageViewImageLoadFailureAndReload02(void) +{ + tet_infoline("Try to load invalid image first, and then reload after that image valid."); + tet_infoline("This case, broken image was n-patch. So we should check whether Geometry / Shader changed after reload"); + ToolkitTestApplication application; + + Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get(); + DevelStyleManager::SetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::SMALL, TEST_BROKEN_IMAGE_S); + DevelStyleManager::SetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::NORMAL, TEST_BROKEN_IMAGE_M); + DevelStyleManager::SetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::LARGE, TEST_BROKEN_IMAGE_L); + + gResourceReadySignalFired = false; + + // Make overwritable image invalid first. + OverwriteImage(""); + + ImageView imageView = ImageView::New(TEST_OVERWRITABLE_IMAGE_FILE_NAME); + imageView.SetProperty(Actor::Property::SIZE, Vector2(100.f, 100.f)); + imageView.ResourceReadySignal().Connect(&ResourceReadySignal); + + application.GetScene().Add(imageView); + application.SendNotification(); + application.Render(16); + + // loading started, this waits for the loader thread + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION); + DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION); + DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::FAILED, TEST_LOCATION); + + DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION); + Geometry brokenGeometry = imageView.GetRendererAt(0u).GetGeometry(); + Shader brokenShader = imageView.GetRendererAt(0u).GetShader(); + DALI_TEST_CHECK(brokenGeometry); + DALI_TEST_CHECK(brokenShader); + + gResourceReadySignalFired = false; + + // Make overwritable image valid now. + OverwriteImage(gImage_34_RGBA); + + // Reload the image + Property::Map attributes; + DevelControl::DoAction(imageView, ImageView::Property::IMAGE, DevelImageVisual::Action::RELOAD, attributes); + application.SendNotification(); + application.Render(16); + + // loading started, this waits for the loader thread + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION); + DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION); + DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::READY, TEST_LOCATION); + + // Check whether we don't use n-patch shader and geometry in this case. + DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION); + DALI_TEST_CHECK(brokenGeometry != imageView.GetRendererAt(0u).GetGeometry()); + DALI_TEST_CHECK(brokenShader != imageView.GetRendererAt(0u).GetShader()); + + // Make overwritable image invalid end of test (for clean). + OverwriteImage(""); + + gResourceReadySignalFired = false; + + END_TEST; +} \ No newline at end of file