X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-toolkit%2Futc-Dali-AnimatedImageVisual.cpp;h=4535413409da71f2cd36ccfc15979f4e4fffba19;hb=HEAD;hp=29abcd2e5e9ee58a9d56a71366085fcfb0cfec05;hpb=c8d8d2c4a015400a3f376f07838ecade37c954f4;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedImageVisual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedImageVisual.cpp index 29abcd2..161b479 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedImageVisual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedImageVisual.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. @@ -28,6 +28,7 @@ #include #include #include +#include #include "dummy-control.h" @@ -50,6 +51,11 @@ const char* TEST_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/application-icon-%02 const char* TEST_GIF_FILE_NAME = TEST_RESOURCE_DIR "/anim.gif"; const char* TEST_MASK_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/mask.png"; const char* TEST_WEBP_FILE_NAME = TEST_RESOURCE_DIR "/dali-logo.webp"; + +const char* TEST_N_PATCH_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/heartsframe.9.png"; +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"; + } // namespace void CopyUrlsIntoArray(Property::Array& urls, int startIndex = 0) @@ -480,7 +486,7 @@ int UtcDaliAnimatedImageVisualGetPropertyMap04(void) value = resultMap.Find(Toolkit::DevelImageVisual::Property::TOTAL_FRAME_NUMBER, "totalFrameNumber"); DALI_TEST_CHECK(value); - DALI_TEST_EQUALS(value->Get(), 4, TEST_LOCATION); + DALI_TEST_EQUALS(value->Get(), -1, TEST_LOCATION); value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, "borderlineWidth"); DALI_TEST_CHECK(value); @@ -544,6 +550,112 @@ int UtcDaliAnimatedImageVisualImageLoadingFail01(void) END_TEST; } +int UtcDaliAnimatedImageVisualImageLoadingFail02(void) +{ + ToolkitTestApplication application; + + tet_infoline("Test with non-animated single image. We should show broken image than."); + + for(int isSynchronousLoading = 0; isSynchronousLoading < 2; ++isSynchronousLoading) + { + tet_printf("Test to load non-animatable image %s\n", (isSynchronousLoading == 1) ? "Synchronously" : "Asynchronously"); + + Property::Map propertyMap; + propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE); + propertyMap.Insert(ImageVisual::Property::URL, "dummy"); + propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, (isSynchronousLoading == 1)); + + VisualFactory factory = VisualFactory::Get(); + Visual::Base visual = factory.CreateVisual(propertyMap); + + DummyControl dummyControl = DummyControl::New(true); + Impl::DummyControl& dummyImpl = static_cast(dummyControl.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + + dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS); + + DALI_TEST_EQUALS(dummyControl.GetRendererCount(), 0u, TEST_LOCATION); + + application.GetScene().Add(dummyControl); + + application.SendNotification(); + application.Render(20); + + if(!(isSynchronousLoading == 1)) + { + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + } + + application.SendNotification(); + application.Render(20); + + // Check broken image uploaded. + DALI_TEST_EQUALS(dummyControl.GetRendererCount(), 1u, TEST_LOCATION); + + dummyControl.Unparent(); + + // Remove cached image at TextureManager. + application.SendNotification(); + application.Render(20); + } + + END_TEST; +} + +int UtcDaliAnimatedImageVisualImageLoadingFail03(void) +{ + ToolkitTestApplication application; + + tet_infoline("Test with invalid image that suffix is .gif, and AnimatedImageLoading not supported. We should show broken image than."); + + for(int isSynchronousLoading = 0; isSynchronousLoading < 2; ++isSynchronousLoading) + { + tet_printf("Test to load non-animatable image %s\n", (isSynchronousLoading == 1) ? "Synchronously" : "Asynchronously"); + + Property::Map propertyMap; + propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE); + propertyMap.Insert(ImageVisual::Property::URL, "dummy.Gif"); ///< Suffix is gif so visual become AnimatedImageVisual. But AnimatedImageLoading become null. + propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, (isSynchronousLoading == 1)); + + VisualFactory factory = VisualFactory::Get(); + Visual::Base visual = factory.CreateVisual(propertyMap); + + DummyControl dummyControl = DummyControl::New(true); + Impl::DummyControl& dummyImpl = static_cast(dummyControl.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + + dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS); + + DALI_TEST_EQUALS(dummyControl.GetRendererCount(), 0u, TEST_LOCATION); + + application.GetScene().Add(dummyControl); + + application.SendNotification(); + application.Render(20); + + // TODO : Since fixed-image-cache didn't support synchronous loading now, we need to wait for a while. + // We have to remove it in future! + //if(!(isSynchronousLoading == 1)) + { + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + } + + application.SendNotification(); + application.Render(20); + + // Check broken image uploaded. + DALI_TEST_EQUALS(dummyControl.GetRendererCount(), 1u, TEST_LOCATION); + + dummyControl.Unparent(); + + // Remove cached image at TextureManager. + application.SendNotification(); + application.Render(20); + } + + END_TEST; +} + int UtcDaliAnimatedImageVisualSynchronousLoading(void) { ToolkitTestApplication application; @@ -774,7 +886,7 @@ int UtcDaliAnimatedImageVisualJumpToAction(void) DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::JUMP_TO, 6); - DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(6), true, TEST_LOCATION); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION); DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION); dummyControl.Unparent(); @@ -1233,10 +1345,9 @@ int UtcDaliAnimatedImageVisualMultiImage01(void) tet_infoline("Test that after 2 ticks that we have 6 textures"); Test::EmitGlobalTimerSignal(); - // TODO : Open this logic if we make AsyncTaskManager for toolkit UTC doesn't execute by SendNotification(). - //application.SendNotification(); - //application.Render(16); - //DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 6, TEST_LOCATION); + application.SendNotification(); + application.Render(16); + DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 6, TEST_LOCATION); tet_infoline("And that at least 2 textures were requested"); DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); @@ -1246,10 +1357,9 @@ int UtcDaliAnimatedImageVisualMultiImage01(void) tet_infoline("Test that after 3rd tick that we have 7 textures and 1 request"); Test::EmitGlobalTimerSignal(); - // TODO : Open this logic if we make AsyncTaskManager for toolkit UTC doesn't execute by SendNotification(). - //application.SendNotification(); - //application.Render(16); - //DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 7, TEST_LOCATION); + application.SendNotification(); + application.Render(16); + DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 7, TEST_LOCATION); DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); application.SendNotification(); @@ -1644,6 +1754,8 @@ int UtcDaliAnimatedImageVisualMultiImage05(void) END_TEST; } +namespace +{ void TestLoopCount(ToolkitTestApplication& application, DummyControl& dummyControl, uint16_t frameCount, uint16_t loopCount, const char* location) { TestGlAbstraction& gl = application.GetGlAbstraction(); @@ -1694,6 +1806,7 @@ void TestLoopCount(ToolkitTestApplication& application, DummyControl& dummyContr dummyControl.Unparent(); } +} // namespace int UtcDaliAnimatedImageVisualLoopCount(void) { @@ -1938,6 +2051,10 @@ int UtcDaliAnimatedImageVisualDesiredSize(void) int desiredWidth = 15; int desiredHeight = 20; + // texture size have to keep it's ratio. So, the size of texture should be 20x20. + const int resultWidth = 20; + const int resultHeight = 20; + Visual::Base visual = VisualFactory::Get().CreateVisual(TEST_GIF_FILE_NAME, ImageDimensions(desiredWidth, desiredHeight)); DALI_TEST_CHECK(visual); @@ -1961,7 +2078,7 @@ int UtcDaliAnimatedImageVisualDesiredSize(void) { std::stringstream out; - out << GL_TEXTURE_2D << ", " << 0u << ", " << desiredWidth << ", " << desiredHeight; + out << GL_TEXTURE_2D << ", " << 0u << ", " << resultWidth << ", " << resultHeight; DALI_TEST_CHECK(textureTrace.FindMethodAndParams("TexImage2D", out.str().c_str())); } @@ -1988,8 +2105,248 @@ int UtcDaliAnimatedImageVisualDesiredSize(void) { std::stringstream out; - out << GL_TEXTURE_2D << ", " << 0u << ", " << desiredWidth << ", " << desiredHeight; - DALI_TEST_CHECK(textureTrace.FindMethodAndParams("TexImage2D", out.str().c_str())); // The size should not be changed + out << GL_TEXTURE_2D << ", " << 0u << ", " << resultWidth << ", " << resultHeight; + DALI_TEST_CHECK(textureTrace.FindMethodAndParams("TexImage2D", out.str().c_str())); // The size should be changed for keeping the aspect ratio. + } + + END_TEST; +} + +int UtcDaliAnimatedImageVisualControlVisibilityChanged(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliAnimatedImageVisualControlVisibilityChanged"); + + Property::Map propertyMap; + propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_IMAGE) + .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME) + .Add(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::FIRST_FRAME) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); + + Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); + DALI_TEST_CHECK(visual); + + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + + Vector2 controlSize(20.f, 30.f); + actor.SetProperty(Actor::Property::SIZE, controlSize); + + application.GetScene().Add(actor); + + application.SendNotification(); + application.Render(); + + // Trigger count is 2 - load & render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + + Property::Map attributes; + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::PLAY, attributes); + + application.SendNotification(); + application.Render(); + + // Check frame number + DALI_TEST_CHECK(actor.GetRendererCount() == 1u); + Renderer renderer = actor.GetRendererAt(0u); + DALI_TEST_CHECK(renderer); + + Test::EmitGlobalTimerSignal(); + application.SendNotification(); + application.Render(16); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + Property::Map resultMap; + visual.CreatePropertyMap(resultMap); + + // check the property values from the returned map from a visual + Property::Value* value = resultMap.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); + DALI_TEST_CHECK(value); + DALI_TEST_NOT_EQUALS(value->Get(), 0, Math::MACHINE_EPSILON_100, TEST_LOCATION); + + actor.SetProperty(Actor::Property::VISIBLE, false); + + Test::EmitGlobalTimerSignal(); + application.SendNotification(); + application.Render(16); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + visual.CreatePropertyMap(resultMap); + + // check the property values from the returned map from a visual + value = resultMap.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); + DALI_TEST_CHECK(value); + DALI_TEST_EQUALS(value->Get(), 0, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliAnimatedImageVisualWindowVisibilityChanged(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliAnimatedImageVisualWindowVisibilityChanged"); + + Property::Map propertyMap; + propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_IMAGE) + .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME) + .Add(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::FIRST_FRAME) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); + + Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); + DALI_TEST_CHECK(visual); + + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + + Vector2 controlSize(20.f, 30.f); + actor.SetProperty(Actor::Property::SIZE, controlSize); + + application.GetScene().Add(actor); + + application.SendNotification(); + application.Render(); + + // Trigger count is 2 - load & render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + + Property::Map attributes; + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::PLAY, attributes); + + application.SendNotification(); + application.Render(); + + // Check frame number + DALI_TEST_CHECK(actor.GetRendererCount() == 1u); + Renderer renderer = actor.GetRendererAt(0u); + DALI_TEST_CHECK(renderer); + + Test::EmitGlobalTimerSignal(); + application.SendNotification(); + application.Render(16); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + Property::Map resultMap; + visual.CreatePropertyMap(resultMap); + + // check the property values from the returned map from a visual + Property::Value* value = resultMap.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); + DALI_TEST_CHECK(value); + DALI_TEST_NOT_EQUALS(value->Get(), 0, Math::MACHINE_EPSILON_100, TEST_LOCATION); + + Window window = DevelWindow::Get(actor); + window.Hide(); + + Test::EmitGlobalTimerSignal(); + application.SendNotification(); + application.Render(16); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + visual.CreatePropertyMap(resultMap); + + // check the property values from the returned map from a visual + value = resultMap.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); + DALI_TEST_CHECK(value); + DALI_TEST_EQUALS(value->Get(), 0, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliAnimatedImageVisualFrameCountBeforeLoadingFinished(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliAnimatedImageVisualFrameCountBeforeLoadingFinished"); + + Property::Map propertyMap; + propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_IMAGE) + .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); + + Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); + DALI_TEST_CHECK(visual); + + Property::Map resultMap1; + visual.CreatePropertyMap(resultMap1); + Property::Value* value1 = resultMap1.Find(DevelImageVisual::Property::TOTAL_FRAME_NUMBER); + DALI_TEST_CHECK(value1); + DALI_TEST_EQUALS(value1->Get(), -1, Math::MACHINE_EPSILON_100, TEST_LOCATION); + + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + + Property::Map resultMap2; + visual.CreatePropertyMap(resultMap2); + Property::Value* value2 = resultMap2.Find(DevelImageVisual::Property::TOTAL_FRAME_NUMBER); + DALI_TEST_CHECK(value2); + DALI_TEST_EQUALS(value2->Get(), -1, Math::MACHINE_EPSILON_100, TEST_LOCATION); + + Vector2 controlSize(20.f, 30.f); + actor.SetProperty(Actor::Property::SIZE, controlSize); + + application.GetScene().Add(actor); + + application.SendNotification(); + application.Render(); + + // Trigger count is 2 - load & render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + + Property::Map resultMap3; + visual.CreatePropertyMap(resultMap3); + Property::Value* value3 = resultMap3.Find(DevelImageVisual::Property::TOTAL_FRAME_NUMBER); + DALI_TEST_CHECK(value3); + DALI_TEST_EQUALS(value3->Get(), 4, Math::MACHINE_EPSILON_100, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliAnimatedImageVisualLoadNonRegularImage(void) +{ + ToolkitTestApplication application; + + std::vector> urlAndExpectVisualTypes = { + {TEST_MASK_IMAGE_FILE_NAME, DevelVisual::IMAGE}, + {TEST_N_PATCH_IMAGE_FILE_NAME, DevelVisual::N_PATCH}, + {TEST_SVG_FILE_NAME, DevelVisual::SVG}, + {TEST_ANIMATED_VECTOR_IMAGE_FILE_NAME, DevelVisual::ANIMATED_VECTOR_IMAGE}, + }; + + for(const auto& urlAndExpectVisualTypePair : urlAndExpectVisualTypes) + { + tet_printf("Test AnimatedImageVisual with url: %s\n", urlAndExpectVisualTypePair.first.c_str()); + Property::Map propertyMap; + propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE); + propertyMap.Insert(ImageVisual::Property::URL, urlAndExpectVisualTypePair.first); + propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true); + + Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); + DALI_TEST_CHECK(visual); + + Property::Map resultMap; + visual.CreatePropertyMap(resultMap); + + Property::Value* typeValue = resultMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER); + DALI_TEST_CHECK(typeValue); + int type = typeValue->Get(); + DALI_TEST_EQUALS(type, static_cast(urlAndExpectVisualTypePair.second), TEST_LOCATION); } END_TEST;