X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-toolkit%2Futc-Dali-ImageView.cpp;h=60d155179e0abcb10e3ea9a701938e2c334e83b0;hb=bcd234fc96035a85ab1a116c4ef8dc68ce3885cf;hp=ccc8eaeb0e8dff03b028e350fcfbec4b6b31bd1c;hpb=41743c88364fba170684720cde38e91391981830;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 ccc8eae..60d1551 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) 2023 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; @@ -2786,6 +2943,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; @@ -2814,6 +2999,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; @@ -3672,43 +3902,124 @@ void OnResourceReadySignal07(Control control) } } -} // namespace - -int UtcDaliImageViewSetImageOnResourceReadySignal01(void) +void OnResourceReadySignal08(Control control) { - tet_infoline("Test setting image from within signal handler."); + gResourceReadySignalCounter++; - ToolkitTestApplication application; + if(gImageView1) + { + gImageView1.Unparent(); + gImageView1.Reset(); + } + if(gImageView2) + { + gImageView2.Unparent(); + gImageView2.Reset(); + } +} - gResourceReadySignalCounter = 0; +std::size_t gResourceReadySignal09Emitted = false; - ImageView imageView = ImageView::New(gImage_34_RGBA); - imageView.ResourceReadySignal().Connect(&OnResourceReadySignal01); +void OnResourceReadySignal09(Control control) +{ + gResourceReadySignalCounter++; - application.GetScene().Add(imageView); + if(gImageView1 && !gResourceReadySignal09Emitted) + { + gResourceReadySignal09Emitted = true; + gImageView1.ResourceReadySignal().Disconnect(&OnResourceReadySignal09); - DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + // 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); - application.SendNotification(); - application.Render(); + // Destroy all visuals immediatly. + gImageView1.Unparent(); + gImageView1.Reset(); + gImageView2.Unparent(); + gImageView2.Reset(); + } +} +constexpr int gResourceReadySignal10MaxCounter = 5; - DALI_TEST_EQUALS(gResourceReadySignalCounter, 2, TEST_LOCATION); +void OnResourceReadySignal10(Control control) +{ + gResourceReadySignalCounter++; - DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION); + 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"); + } +} - // Create a new ImageView to cache the image - ImageView imageView1 = ImageView::New(gImage_600_RGB); - application.GetScene().Add(imageView1); +void OnResourceReadySignal11(Control control) +{ + gResourceReadySignalCounter++; - DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + if(!gImageView2) + { + auto scene = gImageView1.GetParent(); - application.SendNotification(); - application.Render(); + // Try to load animated image visual here which is already cached, and then ignore forcely. - // Reset count - gResourceReadySignalCounter = 0; + Property::Map map1; + map1[Toolkit::ImageVisual::Property::URL] = TEST_GIF_FILE_NAME; - imageView[ImageView::Property::IMAGE] = "invalid.jpg"; + 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); + + application.SendNotification(); + application.Render(); + + // Reset count + gResourceReadySignalCounter = 0; + + imageView[ImageView::Property::IMAGE] = "invalid.jpg"; DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); @@ -4152,7 +4463,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; } @@ -4208,6 +4525,470 @@ int UtcDaliImageViewSetImageOnResourceReadySignal07(void) END_TEST; } +int UtcDaliImageViewSetImageOnResourceReadySignal08(void) +{ + tet_infoline("Test remove npatch images during resource ready"); + + ToolkitTestApplication application; + + gResourceReadySignalCounter = 0; + + 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(); + + 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"); @@ -4247,6 +5028,11 @@ int UtcDaliImageViewNpatchImageCacheTest01(void) { 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]); @@ -4723,3 +5509,122 @@ int UtcDaliImageViewTransitionEffect03(void) 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