+
+int UtcDaliControlResourcesReady(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline("Register 2 visuals and check ResourceReady when a visual is disabled");
+
+ VisualFactory factory = VisualFactory::Get();
+ DALI_TEST_CHECK(factory);
+
+ Property::Map propertyMapLarge;
+ propertyMapLarge.Insert(Toolkit::Visual::Property::TYPE, Visual::IMAGE);
+ propertyMapLarge.Insert(ImageVisual::Property::URL, TEST_LARGE_IMAGE_FILE_NAME);
+
+ Property::Map propertyMapSmall;
+ propertyMapSmall.Insert(Toolkit::Visual::Property::TYPE, Visual::IMAGE);
+ propertyMapSmall.Insert(ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME);
+
+ Visual::Base smallVisual = factory.CreateVisual(propertyMapSmall);
+ smallVisual.SetName("smallVisual");
+ DALI_TEST_CHECK(smallVisual);
+
+ DummyControl actor = DummyControl::New();
+ DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
+
+ dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, smallVisual);
+
+ actor.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+
+ Toolkit::Visual::ResourceStatus resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL);
+ DALI_TEST_EQUALS(actor.GetRendererCount(), 0u, TEST_LOCATION);
+ DALI_TEST_EQUALS(actor.IsResourceReady(), false, TEST_LOCATION);
+ DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::PREPARING), TEST_LOCATION);
+
+ application.GetScene().Add(actor);
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render();
+
+ resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL);
+ DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(actor.IsResourceReady(), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::READY), TEST_LOCATION);
+
+ Visual::Base largeVisual = factory.CreateVisual(propertyMapLarge);
+ largeVisual.SetName("largeVisual");
+ DALI_TEST_CHECK(largeVisual);
+
+ tet_infoline("Register Visual but set disabled, IsResourceReady should be true");
+
+ dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL2, largeVisual, false);
+
+ resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL2);
+ DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::PREPARING), TEST_LOCATION);
+
+ application.SendNotification();
+
+ resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL2);
+ DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(actor.IsResourceReady(), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::PREPARING), TEST_LOCATION);
+
+ dummyImpl.EnableVisual(DummyControl::Property::TEST_VISUAL2, true);
+
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+
+ resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL2);
+ DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::READY), TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliControlResourcesReady02(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline("Change a resource during ResourceReady callback");
+
+ gResourceReadySignalFired = false;
+
+ Control control = Control::New();
+ control.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+ control.ResourceReadySignal().Connect(&ResourceReadySignal);
+
+ Property::Map propertyMap;
+ propertyMap.Insert(ImageVisual::Property::URL, "invalid.jpg");
+ control.SetProperty(Control::Property::BACKGROUND, propertyMap);
+
+ application.GetScene().Add(control);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render();
+
+ // Wait for loading & rasterization
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(control.IsResourceReady(), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
+ gResourceReadySignalFired = false;
+
+ END_TEST;
+}
+
+int UtcDaliControlMarginProperty(void)
+{
+ ToolkitTestApplication application;
+
+ Control control = Control::New();
+ control.SetBackgroundColor(Color::BLUE);
+
+ control.SetProperty(Control::Property::MARGIN, Extents(20, 10, 0, 0));
+
+ application.GetScene().Add(control);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(control.GetProperty<Extents>(Control::Property::MARGIN), Extents(20, 10, 0, 0), TEST_LOCATION);
+
+ // Parent control has one ImageView as a Child.
+ ImageView image = ImageView::New();
+ image.SetBackgroundColor(Color::RED);
+ image.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
+ image.SetProperty(Control::Property::PADDING, Extents(10, 10, 10, 10));
+ control.Add(image);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(image.GetProperty<Extents>(Control::Property::PADDING), Extents(10, 10, 10, 10), TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliControlPaddingProperty(void)
+{
+ ToolkitTestApplication application;
+
+ Control control = Control::New();
+ control.SetBackgroundColor(Color::BLUE);
+
+ control.SetProperty(Control::Property::PADDING, Extents(15, 10, 5, 10));
+
+ application.GetScene().Add(control);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(control.GetProperty<Extents>(Control::Property::PADDING), Extents(15, 10, 5, 10), TEST_LOCATION);
+
+ Control child = Control::New();
+ control.Add(child);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(child.GetProperty<Vector3>(Dali::Actor::Property::POSITION), Vector3(15, 5, 0), TEST_LOCATION);
+
+ control.SetProperty(Dali::Actor::Property::LAYOUT_DIRECTION, Dali::LayoutDirection::RIGHT_TO_LEFT);
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(child.GetProperty<Vector3>(Dali::Actor::Property::POSITION), Vector3(10, 5, 0), TEST_LOCATION);
+
+ control.SetProperty(Dali::Actor::Property::LAYOUT_DIRECTION, Dali::LayoutDirection::LEFT_TO_RIGHT);
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(child.GetProperty<Vector3>(Dali::Actor::Property::POSITION), Vector3(15, 5, 0), TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliControlDoAction(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline("DoAction on a visual registered with a control");
+
+ // Set up trace debug
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
+ //Created AnimatedImageVisual
+ VisualFactory factory = VisualFactory::Get();
+ Visual::Base imageVisual = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
+
+ DummyControl dummyControl = DummyControl::New(true);
+ Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
+
+ dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
+ dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+ application.GetScene().Add(dummyControl);
+
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
+ textureTrace.Reset();
+
+ Property::Map attributes;
+ DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelImageVisual::Action::RELOAD, attributes);
+
+ tet_infoline("Perform RELOAD action. should reload Image and generate a texture");
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliControlDoActionWhenNotStage(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline("DoAction on a visual registered with a control but not staged");
+
+ // Set up trace debug
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
+ //Created AnimatedImageVisual
+ VisualFactory factory = VisualFactory::Get();
+ Visual::Base imageVisual = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
+
+ DummyControl dummyControl = DummyControl::New(true);
+ Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
+
+ dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
+ dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION);
+ textureTrace.Reset();
+
+ Property::Map attributes;
+ DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelImageVisual::Action::RELOAD, attributes);
+
+ tet_infoline("Perform RELOAD action. should reload Image and generate a texture");
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
+ textureTrace.Reset();
+
+ tet_infoline("Adding control to stage will in turn add the visual to the stage");
+
+ application.GetScene().Add(dummyControl);
+ application.SendNotification();
+ application.Render();
+ tet_infoline("No change in textures could occurs as already loaded and cached texture will be used");
+
+ DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION);
+ textureTrace.Reset();
+
+ END_TEST;
+}
+
+int UtcDaliControlDoActionMultipleWhenNotStage01(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline("DoAction on a visual registered with a control multiple times but not staged");
+
+ // Set up trace debug
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
+ //Created AnimatedImageVisual
+ VisualFactory factory = VisualFactory::Get();
+ Visual::Base imageVisual = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
+
+ DummyControl dummyControl = DummyControl::New(true);
+ Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
+
+ dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
+ dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION);
+ textureTrace.Reset();
+
+ Property::Map attributes;
+ const uint32_t repeatMax = 10u;
+ for(uint32_t repeatCnt = 0u; repeatCnt < repeatMax; ++repeatCnt)
+ {
+ // DoAction multiple times.
+ DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelImageVisual::Action::RELOAD, attributes);
+ }
+
+ tet_infoline("Perform RELOAD action. should reload Image and generate a texture");
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
+ textureTrace.Reset();
+
+ tet_infoline("Do not load image on more time even we request reload multiple times.");
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1, 1), false, TEST_LOCATION);
+
+ tet_infoline("Adding control to stage will in turn add the visual to the stage");
+
+ application.GetScene().Add(dummyControl);
+
+ application.SendNotification();
+ application.Render();
+ tet_infoline("No change in textures could occurs as already loaded and cached texture will be used");
+
+ DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION);
+ textureTrace.Reset();
+
+ dummyControl.Unparent();
+ dummyControl.Reset();
+ application.SendNotification();
+ application.Render();
+
+ END_TEST;
+}
+
+int UtcDaliControlDoActionMultipleWhenNotStage02(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline("DoAction on a visual registered with a control multiple times but not staged");
+
+ // Set up trace debug
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
+ //Created AnimatedImageVisual
+ VisualFactory factory = VisualFactory::Get();
+ Visual::Base imageVisual = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
+ Visual::Base imageVisual2 = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
+
+ DummyControl dummyControl = DummyControl::New(true);
+ Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
+
+ gResourceReadySignalFired = false;
+
+ dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
+ dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+ dummyControl.ResourceReadySignal().Connect(&ResourceReadySignal);
+
+ application.SendNotification();
+ application.Render();
+
+ // Dummy control to keep cache
+ DummyControl keepCacheControl = DummyControl::New(true);
+ Impl::DummyControl& keepCacheImpl = static_cast<Impl::DummyControl&>(keepCacheControl.GetImplementation());
+
+ keepCacheImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual2);
+ keepCacheControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+
+ // Load request for keep cache control.
+ application.GetScene().Add(keepCacheControl);
+
+ Property::Map attributes;
+ const uint32_t repeatMax = 10u;
+ for(uint32_t repeatCnt = 0u; repeatCnt < repeatMax; ++repeatCnt)
+ {
+ // DoAction multiple times.
+ DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelImageVisual::Action::RELOAD, attributes);
+ }
+
+ application.SendNotification();
+ application.Render();
+
+ try
+ {
+ application.SendNotification();
+ application.Render();
+
+ tet_infoline("Async load completed. Sigabort should not be occured");
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render();
+
+ tet_infoline("ResourceReady signal must be fired!");
+ DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
+
+ tet_infoline("Texture generation occured");
+ DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
+ textureTrace.Reset();
+
+ tet_result(TET_PASS);
+ }
+ catch(...)
+ {
+ // Must not be throw exception.
+ tet_infoline("Exception occured!");
+ tet_result(TET_FAIL);
+ }
+
+ END_TEST;
+}
+
+int UtcDaliControlDoActionMultipleWhenNotStage03(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline("DoAction on a visual registered with a control multiple times but not staged");
+
+ // Set up trace debug
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
+ //Created AnimatedImageVisual
+ VisualFactory factory = VisualFactory::Get();
+ Visual::Base imageVisual = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
+ Visual::Base imageVisual2 = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
+
+ DummyControl dummyControl = DummyControl::New(true);
+ Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
+
+ gResourceReadySignalFired = false;
+
+ dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
+ dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+ dummyControl.ResourceReadySignal().Connect(&ResourceReadySignal);
+
+ application.SendNotification();
+ application.Render();
+
+ // Dummy control to keep cache
+ DummyControl keepCacheControl = DummyControl::New(true);
+ Impl::DummyControl& keepCacheImpl = static_cast<Impl::DummyControl&>(keepCacheControl.GetImplementation());
+
+ keepCacheImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual2);
+ keepCacheControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+
+ // Load request for keep cache control.
+ application.GetScene().Add(keepCacheControl);
+
+ Property::Map attributes;
+ const uint32_t repeatMax = 10u;
+ for(uint32_t repeatCnt = 0u; repeatCnt < repeatMax; ++repeatCnt)
+ {
+ // DoAction multiple times.
+ DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelImageVisual::Action::RELOAD, attributes);
+ }
+
+ application.SendNotification();
+ application.Render();
+
+ try
+ {
+ tet_infoline("Destroy control without stage on. And create new object that as same visual pointer as previous control");
+
+ const auto* imageVisualObjectPtr = imageVisual.GetObjectPtr();
+ const uint32_t tryCountMax = 100u;
+ uint32_t tryCount = 0u;
+ do
+ {
+ dummyControl.Reset();
+ imageVisual.Reset();
+
+ imageVisual = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
+ dummyControl = DummyControl::New(true);
+
+ Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
+
+ dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
+ dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+ } while(++tryCount < tryCountMax && imageVisualObjectPtr != imageVisual.GetObjectPtr());
+
+ tet_printf("Luck-trial count : %u. Success? %d\n", tryCount, imageVisualObjectPtr == imageVisual.GetObjectPtr());
+
+ // Connect signal
+ dummyControl.ResourceReadySignal().Connect(&ResourceReadySignal);
+
+ application.SendNotification();
+ application.Render();
+
+ tet_infoline("Async load completed after control destroyed. Sigabort should not be occured");
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render();
+
+ tet_infoline("ResourceReady signal must not be fired!");
+ DALI_TEST_EQUALS(gResourceReadySignalFired, false, TEST_LOCATION);
+
+ tet_infoline("Texture generation occured");
+ DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
+ textureTrace.Reset();
+
+ tet_result(TET_PASS);
+ }
+ catch(...)
+ {
+ // Must not be throw exception.
+ tet_infoline("Exception occured!");
+ tet_result(TET_FAIL);
+ }
+
+ END_TEST;
+}
\ No newline at end of file