X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-scene3d%2Futc-Dali-Model.cpp;h=b2d8169bfe4bab88e8b1d82b6123a3187cd43d91;hb=refs%2Fchanges%2F45%2F292445%2F12;hp=c18924ba2ffed291193fad66ba8d1456695561df;hpb=b37f87135b28813d5d43ed891f5e1d72ad2d9694;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/automated-tests/src/dali-scene3d/utc-Dali-Model.cpp b/automated-tests/src/dali-scene3d/utc-Dali-Model.cpp index c18924b..b2d8169 100644 --- a/automated-tests/src/dali-scene3d/utc-Dali-Model.cpp +++ b/automated-tests/src/dali-scene3d/utc-Dali-Model.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2023 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. @@ -17,13 +17,18 @@ #include #include +#include #include #include #include #include +#include #include +#include + +#include using namespace Dali; using namespace Dali::Toolkit; @@ -41,20 +46,25 @@ void model_cleanup(void) namespace { const bool DEFAULT_MODEL_CHILDREN_SENSITIVE = false; +const bool DEFAULT_MODEL_CHILDREN_FOCUSABLE = false; /** * For the AnimatedCube.gltf and its Assets * Donated by Norbert Nopper for glTF testing. * Take from https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/AnimatedCube */ -const char* TEST_GLTF_FILE_NAME = TEST_RESOURCE_DIR "/AnimatedCube.gltf"; -const char* TEST_GLTF_ANIMATION_TEST_FILE_NAME = TEST_RESOURCE_DIR "/animationTest.gltf"; -const char* TEST_DLI_FILE_NAME = TEST_RESOURCE_DIR "/arc.dli"; +const char* TEST_GLTF_FILE_NAME = TEST_RESOURCE_DIR "/AnimatedCube.gltf"; +const char* TEST_GLTF_ANIMATION_TEST_FILE_NAME = TEST_RESOURCE_DIR "/animationTest.gltf"; +const char* TEST_GLTF_EXTRAS_FILE_NAME = TEST_RESOURCE_DIR "/AnimatedMorphCubeAnimateNonZeroFrame.gltf"; +const char* TEST_GLTF_MULTIPLE_PRIMITIVE_FILE_NAME = TEST_RESOURCE_DIR "/simpleMultiplePrimitiveTest.gltf"; +const char* TEST_DLI_FILE_NAME = TEST_RESOURCE_DIR "/arc.dli"; +const char* TEST_DLI_EXERCISE_FILE_NAME = TEST_RESOURCE_DIR "/exercise.dli"; + /** * For the diffuse and specular cube map texture. * These textures are based off version of Wave engine sample * Take from https://github.com/WaveEngine/Samples * - * Copyright (c) 2022 Wave Coorporation + * Copyright (c) 2023 Wave Coorporation * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to @@ -84,6 +94,25 @@ bool TestTouchCallback(Actor, const TouchEvent&) return true; } +bool gFocusChangedCallBackCalled = false; +void TestFocusChangedCallback(Actor, Actor) +{ + gFocusChangedCallBackCalled = true; +} + +// For ResourceReady +static bool gOnRelayoutCallBackCalled = false; +void OnRelayoutCallback(Actor actor) +{ + gOnRelayoutCallBackCalled = true; +} + +static bool gResourceReadyCalled = false; +void OnResourceReady(Control control) +{ + gResourceReadyCalled = true; +} + } // namespace // Negative test case for a method @@ -122,6 +151,26 @@ int UtcDaliModelNew(void) } // Positive test case for a method +int UtcDaliModelNewP2(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliModelNew without url"); + + Scene3D::Model model = Scene3D::Model::New(); + DALI_TEST_CHECK(model); + + application.GetScene().Add(model); + + DALI_TEST_CHECK(model.GetProperty(Actor::Property::CONNECTED_TO_SCENE)); + + application.GetScene().Remove(model); + + DALI_TEST_CHECK(!model.GetProperty(Actor::Property::CONNECTED_TO_SCENE)); + + END_TEST; +} + +// Positive test case for a method int UtcDaliModelDownCast(void) { ToolkitTestApplication application; @@ -242,15 +291,23 @@ int UtcDaliModelOnScene01(void) ToolkitTestApplication application; Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); - application.GetScene().Add(model); + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + uint32_t modelCount = model.GetModelRoot().GetChildCount(); DALI_TEST_EQUALS(1, modelCount, TEST_LOCATION); - END_TEST; } @@ -259,17 +316,26 @@ int UtcDaliModelOnScene02(void) ToolkitTestApplication application; Scene3D::Model model = Scene3D::Model::New(TEST_DLI_FILE_NAME); - application.GetScene().Add(model); + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + uint32_t modelCount = model.GetModelRoot().GetChildCount(); DALI_TEST_EQUALS(1, modelCount, TEST_LOCATION); - Actor rootActor = model.GetModelRoot(); - Vector3 rootSize = rootActor.GetProperty(Dali::Actor::Property::SIZE); + Scene3D::ModelNode rootNode = model.GetModelRoot(); + Vector3 rootSize = rootNode.GetProperty(Dali::Actor::Property::SIZE); DALI_TEST_EQUALS(Vector3(2, 2, 1), rootSize, TEST_LOCATION); END_TEST; @@ -304,11 +370,24 @@ int UtcDaliModelGetNaturalSize(void) Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); Vector3 naturalSize = model.GetNaturalSize(); + DALI_TEST_EQUALS(Vector3::ZERO, naturalSize, TEST_LOCATION); + + application.GetScene().Add(model); + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + + naturalSize = model.GetNaturalSize(); DALI_TEST_EQUALS(Vector3(2, 2, 2), naturalSize, TEST_LOCATION); - Actor root = model.GetModelRoot(); - DALI_TEST_CHECK(root); + Scene3D::ModelNode rootNode = model.GetModelRoot(); + DALI_TEST_CHECK(rootNode); END_TEST; } @@ -318,12 +397,21 @@ int UtcDaliModelSetImageBasedLightSource01(void) ToolkitTestApplication application; Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); - application.GetScene().Add(model); + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + Actor meshActor = model.FindChildByName("AnimatedCube"); DALI_TEST_CHECK(meshActor); @@ -331,19 +419,33 @@ int UtcDaliModelSetImageBasedLightSource01(void) DALI_TEST_CHECK(renderer); TextureSet textureSet = renderer.GetTextures(); - DALI_TEST_EQUALS(textureSet.GetTextureCount(), 7u, TEST_LOCATION); + DALI_TEST_EQUALS(textureSet.GetTextureCount(), 9u, TEST_LOCATION); - Texture diffuseTexture = textureSet.GetTexture(5u); - Texture specularTexture = textureSet.GetTexture(6u); + Texture diffuseTexture = textureSet.GetTexture(7u); + Texture specularTexture = textureSet.GetTexture(8u); + gResourceReadyCalled = false; + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); model.SetImageBasedLightSource(TEST_DIFFUSE_TEXTURE, TEST_SPECULAR_TEXTURE); - Texture newDiffuseTexture = textureSet.GetTexture(5u); - Texture newSpecularTexture = textureSet.GetTexture(6u); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + + TextureSet newTextureSet = renderer.GetTextures(); + Texture newDiffuseTexture = newTextureSet.GetTexture(7u); + Texture newSpecularTexture = newTextureSet.GetTexture(8u); DALI_TEST_NOT_EQUALS(diffuseTexture, newDiffuseTexture, 0.0f, TEST_LOCATION); DALI_TEST_NOT_EQUALS(specularTexture, newSpecularTexture, 0.0f, TEST_LOCATION); + model.Unparent(); + model.Reset(); END_TEST; } @@ -352,12 +454,21 @@ int UtcDaliModelSetImageBasedLightSource02(void) ToolkitTestApplication application; Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); - application.GetScene().Add(model); + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + Actor meshActor = model.FindChildByName("AnimatedCube"); DALI_TEST_CHECK(meshActor); @@ -365,15 +476,16 @@ int UtcDaliModelSetImageBasedLightSource02(void) DALI_TEST_CHECK(renderer); TextureSet textureSet = renderer.GetTextures(); - DALI_TEST_EQUALS(textureSet.GetTextureCount(), 7u, TEST_LOCATION); + DALI_TEST_EQUALS(textureSet.GetTextureCount(), 9u, TEST_LOCATION); - Texture diffuseTexture = textureSet.GetTexture(5u); - Texture specularTexture = textureSet.GetTexture(6u); + Texture diffuseTexture = textureSet.GetTexture(7u); + Texture specularTexture = textureSet.GetTexture(8u); + // if url is empty, loading is not requested. model.SetImageBasedLightSource("", ""); - Texture newDiffuseTexture = textureSet.GetTexture(5u); - Texture newSpecularTexture = textureSet.GetTexture(6u); + Texture newDiffuseTexture = textureSet.GetTexture(7u); + Texture newSpecularTexture = textureSet.GetTexture(8u); DALI_TEST_EQUALS(diffuseTexture, newDiffuseTexture, TEST_LOCATION); DALI_TEST_EQUALS(specularTexture, newSpecularTexture, TEST_LOCATION); @@ -386,12 +498,21 @@ int UtcDaliModelSetImageBasedLightSource03(void) ToolkitTestApplication application; Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); - application.GetScene().Add(model); + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + Actor meshActor = model.FindChildByName("AnimatedCube"); DALI_TEST_CHECK(meshActor); @@ -399,15 +520,26 @@ int UtcDaliModelSetImageBasedLightSource03(void) DALI_TEST_CHECK(renderer); TextureSet textureSet = renderer.GetTextures(); - DALI_TEST_EQUALS(textureSet.GetTextureCount(), 7u, TEST_LOCATION); + DALI_TEST_EQUALS(textureSet.GetTextureCount(), 9u, TEST_LOCATION); - Texture diffuseTexture = textureSet.GetTexture(5u); - Texture specularTexture = textureSet.GetTexture(6u); + Texture diffuseTexture = textureSet.GetTexture(7u); + Texture specularTexture = textureSet.GetTexture(8u); + gResourceReadyCalled = false; + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); model.SetImageBasedLightSource("dummy.ktx", "dummy.ktx"); - Texture newDiffuseTexture = textureSet.GetTexture(5u); - Texture newSpecularTexture = textureSet.GetTexture(6u); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + + Texture newDiffuseTexture = textureSet.GetTexture(7u); + Texture newSpecularTexture = textureSet.GetTexture(8u); DALI_TEST_EQUALS(diffuseTexture, newDiffuseTexture, TEST_LOCATION); DALI_TEST_EQUALS(specularTexture, newSpecularTexture, TEST_LOCATION); @@ -415,6 +547,29 @@ int UtcDaliModelSetImageBasedLightSource03(void) END_TEST; } +int UtcDaliModelSetImageBasedLightSource04(void) +{ + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); + model.SetImageBasedLightSource(TEST_DIFFUSE_TEXTURE, TEST_SPECULAR_TEXTURE); + application.GetScene().Add(model); + + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + END_TEST; +} + int UtcDaliModelImageBasedFactor(void) { ToolkitTestApplication application; @@ -444,12 +599,21 @@ int UtcDaliModelChildrenSensitive01(void) // Allow children actor's event before on scene. view.SetChildrenSensitive(true); DALI_TEST_EQUALS(view.GetChildrenSensitive(), true, TEST_LOCATION); - application.GetScene().Add(view); + gResourceReadyCalled = false; + view.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + Actor meshActor = view.FindChildByName("AnimatedCube"); DALI_TEST_CHECK(meshActor); @@ -532,12 +696,21 @@ int UtcDaliModelChildrenSensitive02(void) // Block children actor's event before on scene. view.SetChildrenSensitive(false); DALI_TEST_EQUALS(view.GetChildrenSensitive(), false, TEST_LOCATION); - application.GetScene().Add(view); + gResourceReadyCalled = false; + view.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + Actor meshActor = view.FindChildByName("AnimatedCube"); DALI_TEST_CHECK(meshActor); @@ -587,18 +760,226 @@ int UtcDaliModelChildrenSensitive02(void) END_TEST; } +int UtcDaliModelChildrenFocusable01(void) +{ + ToolkitTestApplication application; + + Scene3D::Model view = Scene3D::Model::New(TEST_GLTF_FILE_NAME); + view.SetProperty(Dali::Actor::Property::SIZE, Vector3(100, 100, 100)); + view.SetProperty(Dali::Actor::Property::POSITION, Vector3(0, 0, 0)); + view.SetProperty(Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER); + view.SetProperty(Dali::Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + + // Get vaule. Default is false. + DALI_TEST_EQUALS(view.GetChildrenFocusable(), DEFAULT_MODEL_CHILDREN_FOCUSABLE, TEST_LOCATION); + + // Allow children actor's focus before on scene. + view.SetChildrenFocusable(true); + DALI_TEST_EQUALS(view.GetChildrenFocusable(), true, TEST_LOCATION); + application.GetScene().Add(view); + + gResourceReadyCalled = false; + view.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + + Actor meshActor = view.FindChildByName("AnimatedCube"); + DALI_TEST_CHECK(meshActor); + + // Enable the default algorithm + KeyboardFocusManager manager = KeyboardFocusManager::Get(); + DALI_TEST_CHECK(manager); + Dali::Toolkit::DevelKeyboardFocusManager::EnableDefaultAlgorithm(manager, true); + + // connect focusable signal + gFocusChangedCallBackCalled = false; + meshActor.SetProperty(Actor::Property::KEYBOARD_FOCUSABLE, true); + manager.FocusChangedSignal().Connect(TestFocusChangedCallback); + + // Initialize with some left-positioned actor + Control focusStartActor = Control::New(); + focusStartActor.SetProperty(Dali::Actor::Property::SIZE, Vector3(100, 100, 100)); + focusStartActor.SetProperty(Dali::Actor::Property::POSITION, Vector3(-200, 0, 0)); + focusStartActor.SetProperty(Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER); + focusStartActor.SetProperty(Dali::Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + focusStartActor.SetProperty(Dali::Actor::Property::KEYBOARD_FOCUSABLE, true); + application.GetScene().Add(focusStartActor); + + // Clear + manager.ClearFocus(); + manager.SetCurrentFocusActor(focusStartActor); + gFocusChangedCallBackCalled = false; + + // flush the queue and render once + application.SendNotification(); + application.Render(); + + // Focusable view find success + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::RIGHT) == true); + DALI_TEST_CHECK(gFocusChangedCallBackCalled); + + // Clear + manager.ClearFocus(); + manager.SetCurrentFocusActor(focusStartActor); + gFocusChangedCallBackCalled = false; + + // Block children actor's focus + view.SetChildrenFocusable(false); + DALI_TEST_EQUALS(view.GetChildrenFocusable(), false, TEST_LOCATION); + + // flush the queue and render once + application.SendNotification(); + application.Render(); + + // Focusable view find failed + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::RIGHT) == false); + DALI_TEST_CHECK(!gFocusChangedCallBackCalled); + + // Clear + manager.ClearFocus(); + manager.SetCurrentFocusActor(focusStartActor); + gFocusChangedCallBackCalled = false; + + // Allow again + view.SetChildrenFocusable(true); + DALI_TEST_EQUALS(view.GetChildrenFocusable(), true, TEST_LOCATION); + + // flush the queue and render once + application.SendNotification(); + application.Render(); + + // Focusable view find success + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::RIGHT) == true); + DALI_TEST_CHECK(gFocusChangedCallBackCalled); + + // Clear + manager.ClearFocus(); + manager.SetCurrentFocusActor(focusStartActor); + gFocusChangedCallBackCalled = false; + + END_TEST; +} + +int UtcDaliModelModelChildrenFocusable02(void) +{ + ToolkitTestApplication application; + + Scene3D::Model view = Scene3D::Model::New(TEST_GLTF_FILE_NAME); + view.SetProperty(Dali::Actor::Property::SIZE, Vector3(100, 100, 100)); + view.SetProperty(Dali::Actor::Property::POSITION, Vector3(0, 0, 0)); + view.SetProperty(Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER); + view.SetProperty(Dali::Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + + // Get vaule. Default is true. + DALI_TEST_EQUALS(view.GetChildrenFocusable(), DEFAULT_MODEL_CHILDREN_FOCUSABLE, TEST_LOCATION); + + // Block children actor's focus before on scene. + view.SetChildrenFocusable(false); + DALI_TEST_EQUALS(view.GetChildrenFocusable(), false, TEST_LOCATION); + application.GetScene().Add(view); + + gResourceReadyCalled = false; + view.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + + Actor meshActor = view.FindChildByName("AnimatedCube"); + DALI_TEST_CHECK(meshActor); + + // Enable the default algorithm + KeyboardFocusManager manager = KeyboardFocusManager::Get(); + DALI_TEST_CHECK(manager); + Dali::Toolkit::DevelKeyboardFocusManager::EnableDefaultAlgorithm(manager, true); + + // connect focusable signal + gFocusChangedCallBackCalled = false; + meshActor.SetProperty(Actor::Property::KEYBOARD_FOCUSABLE, true); + manager.FocusChangedSignal().Connect(TestFocusChangedCallback); + + // Initialize with some left-positioned actor + Control focusStartActor = Control::New(); + focusStartActor.SetProperty(Dali::Actor::Property::SIZE, Vector3(100, 100, 100)); + focusStartActor.SetProperty(Dali::Actor::Property::POSITION, Vector3(-200, 0, 0)); + focusStartActor.SetProperty(Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER); + focusStartActor.SetProperty(Dali::Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + focusStartActor.SetProperty(Dali::Actor::Property::KEYBOARD_FOCUSABLE, true); + application.GetScene().Add(focusStartActor); + + // Clear + manager.ClearFocus(); + manager.SetCurrentFocusActor(focusStartActor); + gFocusChangedCallBackCalled = false; + + // flush the queue and render once + application.SendNotification(); + application.Render(); + + // Focusable view find failed + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::RIGHT) == false); + DALI_TEST_CHECK(!gFocusChangedCallBackCalled); + + // Clear + manager.ClearFocus(); + manager.SetCurrentFocusActor(focusStartActor); + gFocusChangedCallBackCalled = false; + + // Allow again + view.SetChildrenFocusable(true); + DALI_TEST_EQUALS(view.GetChildrenFocusable(), true, TEST_LOCATION); + + // flush the queue and render once + application.SendNotification(); + application.Render(); + + // Focusable view find success + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::RIGHT) == true); + DALI_TEST_CHECK(gFocusChangedCallBackCalled); + + // Clear + manager.ClearFocus(); + manager.SetCurrentFocusActor(focusStartActor); + gFocusChangedCallBackCalled = false; + + END_TEST; +} + int UtcDaliModelAnimation01(void) { ToolkitTestApplication application; Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); model.SetProperty(Dali::Actor::Property::SIZE, Vector2(50, 50)); - application.GetScene().Add(model); + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + uint32_t animationCount = model.GetAnimationCount(); DALI_TEST_EQUALS(1, animationCount, TEST_LOCATION); @@ -618,9 +999,16 @@ int UtcDaliModelAnimation02(void) Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_ANIMATION_TEST_FILE_NAME); model.SetProperty(Dali::Actor::Property::SIZE, Vector2(50, 50)); - application.GetScene().Add(model); + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); application.SendNotification(); application.Render(); @@ -640,21 +1028,204 @@ int UtcDaliModelAnimation02(void) END_TEST; } -// For ResourceReady -namespace +int UtcDaliModelAnimation03(void) { -static bool gOnRelayoutCallBackCalled = false; -void OnRelayoutCallback(Actor actor) + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(TEST_DLI_EXERCISE_FILE_NAME); + model.SetProperty(Dali::Actor::Property::SIZE, Vector2(50, 50)); + application.GetScene().Add(model); + + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + + uint32_t animationCount = model.GetAnimationCount(); + DALI_TEST_EQUALS(18, animationCount, TEST_LOCATION); + + Animation animationByIndex = model.GetAnimation(0u); + DALI_TEST_CHECK(animationByIndex); + + Animation animationByName = model.GetAnimation("idleClip"); + DALI_TEST_CHECK(animationByName); + DALI_TEST_EQUALS(animationByIndex, animationByName, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliModelCameraGenerate01(void) { - gOnRelayoutCallBackCalled = true; + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(TEST_DLI_EXERCISE_FILE_NAME); + model.SetProperty(Dali::Actor::Property::SIZE, Vector2(50, 50)); + application.GetScene().Add(model); + + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + + uint32_t cameraCount = model.GetCameraCount(); + DALI_TEST_EQUALS(1, cameraCount, TEST_LOCATION); + + CameraActor generatedCamera = model.GenerateCamera(0u); + DALI_TEST_CHECK(generatedCamera); + + generatedCamera = model.GenerateCamera(1u); // Fail to generate camera + DALI_TEST_CHECK(!generatedCamera); + + END_TEST; } -static bool gResourceReadyCalled = false; -void OnResourceReady(Control control) +int UtcDaliModelCameraGenerate02(void) { - gResourceReadyCalled = true; + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); + model.SetProperty(Dali::Actor::Property::SIZE, Vector2(50, 50)); + application.GetScene().Add(model); + + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + + uint32_t cameraCount = model.GetCameraCount(); + DALI_TEST_EQUALS(6, cameraCount, TEST_LOCATION); + + CameraActor generatedCamera0 = model.GenerateCamera(0u); + DALI_TEST_CHECK(generatedCamera0); + CameraActor generatedCamera1 = model.GenerateCamera(1u); + DALI_TEST_CHECK(generatedCamera1); + CameraActor generatedCamera2 = model.GenerateCamera(2u); + DALI_TEST_CHECK(generatedCamera2); + CameraActor generatedCamera3 = model.GenerateCamera(3u); // Infinity far camera + DALI_TEST_CHECK(generatedCamera3); + CameraActor generatedCamera4 = model.GenerateCamera(4u); // Broken camera 1 + DALI_TEST_CHECK(!generatedCamera4); + CameraActor generatedCamera5 = model.GenerateCamera(5u); // Broken camera 2 + DALI_TEST_CHECK(!generatedCamera5); + CameraActor generatedCamera6 = model.GenerateCamera(6u); // Out of bound + DALI_TEST_CHECK(!generatedCamera6); + + CameraActor appliedCamera; + DALI_TEST_EQUALS(model.ApplyCamera(0u, appliedCamera), false, TEST_LOCATION); // Cannot apply into empty camera. + + auto CompareCameraProperties = [](CameraActor lhs, CameraActor rhs, const char* location) { + DALI_TEST_EQUALS(lhs.GetProperty(Dali::CameraActor::Property::PROJECTION_MODE), rhs.GetProperty(Dali::CameraActor::Property::PROJECTION_MODE), TEST_LOCATION); + DALI_TEST_EQUALS(lhs.GetProperty(Dali::CameraActor::Property::NEAR_PLANE_DISTANCE), rhs.GetProperty(Dali::CameraActor::Property::NEAR_PLANE_DISTANCE), TEST_LOCATION); + + if(lhs.GetProperty(Dali::CameraActor::Property::PROJECTION_MODE) == static_cast(Dali::Camera::ProjectionMode::PERSPECTIVE_PROJECTION)) + { + DALI_TEST_EQUALS(lhs.GetProperty(Dali::CameraActor::Property::FIELD_OF_VIEW), rhs.GetProperty(Dali::CameraActor::Property::FIELD_OF_VIEW), TEST_LOCATION); + // TODO : Open this test when infinity far projection implement. + // DALI_TEST_EQUALS(lhs.GetProperty(Dali::CameraActor::Property::FAR_PLANE_DISTANCE), rhs.GetProperty(Dali::CameraActor::Property::FAR_PLANE_DISTANCE), TEST_LOCATION); + } + else + { + DALI_TEST_EQUALS(lhs.GetProperty(Dali::DevelCameraActor::Property::ORTHOGRAPHIC_SIZE), rhs.GetProperty(Dali::DevelCameraActor::Property::ORTHOGRAPHIC_SIZE), TEST_LOCATION); + DALI_TEST_EQUALS(lhs.GetProperty(Dali::CameraActor::Property::FAR_PLANE_DISTANCE), rhs.GetProperty(Dali::CameraActor::Property::FAR_PLANE_DISTANCE), TEST_LOCATION); + } + }; + + appliedCamera = CameraActor::New(); + DALI_TEST_EQUALS(model.ApplyCamera(0u, appliedCamera), true, TEST_LOCATION); + CompareCameraProperties(generatedCamera0, appliedCamera, TEST_LOCATION); + DALI_TEST_EQUALS(model.ApplyCamera(1u, appliedCamera), true, TEST_LOCATION); + CompareCameraProperties(generatedCamera1, appliedCamera, TEST_LOCATION); + DALI_TEST_EQUALS(model.ApplyCamera(2u, appliedCamera), true, TEST_LOCATION); + CompareCameraProperties(generatedCamera2, appliedCamera, TEST_LOCATION); + DALI_TEST_EQUALS(model.ApplyCamera(3u, appliedCamera), true, TEST_LOCATION); + CompareCameraProperties(generatedCamera3, appliedCamera, TEST_LOCATION); + DALI_TEST_EQUALS(model.ApplyCamera(4u, appliedCamera), false, TEST_LOCATION); // Broken camera 1 + DALI_TEST_EQUALS(model.ApplyCamera(5u, appliedCamera), false, TEST_LOCATION); // Broken camera 2 + DALI_TEST_EQUALS(model.ApplyCamera(6u, appliedCamera), false, TEST_LOCATION); // Cannot apply over the index. + + END_TEST; +} + +int UtcDaliModelMultiplePrimitives(void) +{ + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_MULTIPLE_PRIMITIVE_FILE_NAME); + model.SetProperty(Dali::Actor::Property::SIZE, Vector2(50, 50)); + application.GetScene().Add(model); + + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + Actor actor = model.FindChildByName("rootNode"); + + DALI_TEST_EQUALS(0, actor.GetChildCount(), TEST_LOCATION); + DALI_TEST_EQUALS(2, actor.GetRendererCount(), TEST_LOCATION); + + END_TEST; +} + +int UtcDaliModelColorMode(void) +{ + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); + model.SetProperty(Dali::Actor::Property::SIZE, Vector2(50, 50)); + model.SetProperty(Dali::Actor::Property::COLOR, Color::RED); + application.GetScene().Add(model); + + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + Actor actor = model.FindChildByName("AnimatedCube"); + Vector4 childColor = actor[Dali::Actor::Property::COLOR]; + Vector4 childWorldColor = actor[Dali::Actor::Property::WORLD_COLOR]; + + DALI_TEST_EQUALS(childColor, Color::WHITE, TEST_LOCATION); + DALI_TEST_EQUALS(childWorldColor, Color::RED, TEST_LOCATION); + + END_TEST; } -} // namespace int UtcDaliModelResourceReady(void) { @@ -677,9 +1248,294 @@ int UtcDaliModelResourceReady(void) application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + DALI_TEST_EQUALS(gOnRelayoutCallBackCalled, false, TEST_LOCATION); DALI_TEST_EQUALS(model.IsResourceReady(), true, TEST_LOCATION); DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); END_TEST; } + +int UtcDaliModelResourceCacheCheck(void) +{ + ToolkitTestApplication application; + + // Load three instances of the same model and add them to the scene + Scene3D::Model model1 = Scene3D::Model::New(TEST_GLTF_FILE_NAME); + Scene3D::Model model2 = Scene3D::Model::New(TEST_GLTF_FILE_NAME); + Scene3D::Model model3 = Scene3D::Model::New(TEST_GLTF_FILE_NAME); + + application.GetScene().Add(model1); + application.GetScene().Add(model2); + application.GetScene().Add(model3); + + gResourceReadyCalled = false; + model1.ResourceReadySignal().Connect(&OnResourceReady); + model2.ResourceReadySignal().Connect(&OnResourceReady); + model3.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + // Check that the loading has finished for all the three instances + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + + Actor meshActor1 = model1.FindChildByName("AnimatedCube"); + Actor meshActor2 = model2.FindChildByName("AnimatedCube"); + Actor meshActor3 = model3.FindChildByName("AnimatedCube"); + DALI_TEST_CHECK(meshActor1); + DALI_TEST_CHECK(meshActor2); + DALI_TEST_CHECK(meshActor3); + + Renderer renderer1 = meshActor1.GetRendererAt(0u); + Renderer renderer2 = meshActor2.GetRendererAt(0u); + Renderer renderer3 = meshActor3.GetRendererAt(0u); + DALI_TEST_CHECK(renderer1); + DALI_TEST_CHECK(renderer2); + DALI_TEST_CHECK(renderer3); + + // Check that all the three instances use the shared textures and geometries from the cache + // but have their own shader objects + DALI_TEST_EQUALS(renderer1.GetTextures(), renderer2.GetTextures(), TEST_LOCATION); + DALI_TEST_EQUALS(renderer1.GetTextures(), renderer3.GetTextures(), TEST_LOCATION); + DALI_TEST_EQUALS(renderer1.GetGeometry(), renderer2.GetGeometry(), TEST_LOCATION); + DALI_TEST_EQUALS(renderer1.GetGeometry(), renderer3.GetGeometry(), TEST_LOCATION); + DALI_TEST_NOT_EQUALS(renderer1.GetShader(), renderer2.GetShader(), 0.0f, TEST_LOCATION); + DALI_TEST_NOT_EQUALS(renderer1.GetShader(), renderer3.GetShader(), 0.0f, TEST_LOCATION); + DALI_TEST_NOT_EQUALS(renderer2.GetShader(), renderer3.GetShader(), 0.0f, TEST_LOCATION); + + // Destroy model1 + model1.Unparent(); + model1.Reset(); + + // Check that all the other two instances still use the shared textures and geometries from the cache + // but have their own shader objects + DALI_TEST_EQUALS(renderer2.GetTextures(), renderer3.GetTextures(), TEST_LOCATION); + DALI_TEST_EQUALS(renderer2.GetGeometry(), renderer3.GetGeometry(), TEST_LOCATION); + DALI_TEST_NOT_EQUALS(renderer2.GetShader(), renderer3.GetShader(), 0.0f, TEST_LOCATION); + + // Set new IBL textures for model2, and this should apply to model2 instance only + gResourceReadyCalled = false; + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + model2.SetImageBasedLightSource(TEST_DIFFUSE_TEXTURE, TEST_SPECULAR_TEXTURE); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + // Check that the new IBL textures are loaded for model2 + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + + // Check that the two instances still use the shared geometries from the cache + // but now have their own shader objects and different texture set + DALI_TEST_NOT_EQUALS(renderer2.GetTextures(), renderer3.GetTextures(), 0.0f, TEST_LOCATION); + DALI_TEST_EQUALS(renderer2.GetGeometry(), renderer3.GetGeometry(), TEST_LOCATION); + DALI_TEST_NOT_EQUALS(renderer2.GetShader(), renderer3.GetShader(), 0.0f, TEST_LOCATION); + + // Check that the two instances now have their own diffuse texture and specular texture, + // but all the other textures are still the same + TextureSet textureSet2 = renderer2.GetTextures(); + TextureSet textureSet3 = renderer3.GetTextures(); + DALI_TEST_EQUALS(textureSet2.GetTextureCount(), 9u, TEST_LOCATION); + DALI_TEST_EQUALS(textureSet3.GetTextureCount(), 9u, TEST_LOCATION); + + for(uint32_t i = 0; i < 7u; i++) + { + DALI_TEST_EQUALS(textureSet2.GetTexture(i), textureSet3.GetTexture(i), TEST_LOCATION); + } + + DALI_TEST_NOT_EQUALS(textureSet2.GetTexture(7u), textureSet3.GetTexture(7u), 0.0f, TEST_LOCATION); + DALI_TEST_NOT_EQUALS(textureSet2.GetTexture(8u), textureSet3.GetTexture(8u), 0.0f, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliModelAddRemoveModelNode(void) +{ + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(); + model.SetProperty(Dali::Actor::Property::SIZE, Vector2(50, 50)); + + Scene3D::ModelNode node1 = Scene3D::ModelNode::New(); + Scene3D::ModelNode node2 = Scene3D::ModelNode::New(); + Scene3D::ModelNode node3 = Scene3D::ModelNode::New(); + Scene3D::ModelNode node4 = Scene3D::ModelNode::New(); + + model.AddModelNode(node1); + model.AddModelNode(node2); + model.AddModelNode(node3); + model.RemoveModelNode(node1); // Remove node before scene on + + application.GetScene().Add(model); + + Dali::Scene3D::ModelNode root = model.GetModelRoot(); + DALI_TEST_CHECK(root); + DALI_TEST_EQUALS(2, root.GetChildCount(), TEST_LOCATION); + + model.RemoveModelNode(node2); // Remove node after scene on + + DALI_TEST_EQUALS(1, root.GetChildCount(), TEST_LOCATION); + + model.AddModelNode(node4); // Add during scene on + + DALI_TEST_EQUALS(2, root.GetChildCount(), TEST_LOCATION); + + application.GetScene().Remove(model); + + model.RemoveModelNode(node3); // Remove node after scene off + + END_TEST; +} + +int UtcDaliModelFindChildModelNodeByName(void) +{ + tet_infoline(" UtcDaliModelNodeFindChildModelNodeByName."); + + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(); + application.GetScene().Add(model); + + Scene3D::ModelNode modelNode1 = Scene3D::ModelNode::New(); + Scene3D::ModelNode modelNode2 = Scene3D::ModelNode::New(); + + modelNode1.SetProperty(Dali::Actor::Property::NAME, "modelNode1"); + modelNode2.SetProperty(Dali::Actor::Property::NAME, "modelNode2"); + model.AddModelNode(modelNode1); + model.AddModelNode(modelNode2); + + Scene3D::ModelNode child1 = model.FindChildModelNodeByName("modelNode1"); + DALI_TEST_CHECK(child1); + DALI_TEST_EQUALS(child1, modelNode1, TEST_LOCATION); + + Scene3D::ModelNode child2 = model.FindChildModelNodeByName("modelNode2"); + DALI_TEST_CHECK(child2); + DALI_TEST_EQUALS(child2, modelNode2, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliModelSizeChange(void) +{ + tet_infoline(" UtcDaliModelSizeChange."); + + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); + model.SetProperty(Dali::Actor::Property::SIZE, Vector3(300, 300, 300)); + application.GetScene().Add(model); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(model.GetChildCount(), 1u, TEST_LOCATION); + Vector3 scale = model.GetChildAt(0u).GetProperty(Dali::Actor::Property::SCALE); + + model.SetProperty(Dali::Actor::Property::SIZE, Vector3(600, 600, 600)); + Vector3 scale2 = model.GetChildAt(0u).GetProperty(Dali::Actor::Property::SCALE); + + DALI_TEST_NOT_EQUALS(scale, scale2, 0.1f, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliModelSizeChange2(void) +{ + tet_infoline(" UtcDaliModelSizeChange2."); + + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); + model.SetProperty(Dali::Actor::Property::SIZE, Vector3(300, 300, 300)); + application.GetScene().Add(model); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(model.GetChildCount(), 1u, TEST_LOCATION); + Vector3 scale = model.GetChildAt(0u).GetProperty(Dali::Actor::Property::SCALE); + + Animation animation = Animation::New(0.5f); + animation.AnimateTo(Dali::Property(model, Dali::Actor::Property::SIZE), Vector3(600, 600, 600)); + animation.Play(); + + application.SendNotification(); + application.Render(250); + + application.SendNotification(); + + Vector3 scale2 = model.GetChildAt(0u).GetProperty(Dali::Actor::Property::SCALE); + DALI_TEST_NOT_EQUALS(scale, scale2, 0.1f, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliModelRetrieveBlendShapeNames(void) +{ + tet_infoline(" UtcDaliModelRetrieveBlendShapeByName."); + + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_EXTRAS_FILE_NAME); + model.SetProperty(Dali::Actor::Property::SIZE, Vector3(300, 300, 300)); + application.GetScene().Add(model); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(model.GetChildCount(), 1u, TEST_LOCATION); + + // Get target ModelNode that has extras + Scene3D::ModelNode expectNode = model.FindChildModelNodeByName("AnimatedMorphCube"); + + // Pair of expected blend shape index from expectNode. + std::map expectBlendShapeNames = { + {"Target_0", 0u}, + {"Target_1", 1u}, + }; + + std::vector blendShapeNameList; + model.RetrieveBlendShapeNames(blendShapeNameList); + + DALI_TEST_EQUALS(blendShapeNameList.size(), expectBlendShapeNames.size(), TEST_LOCATION); + for(auto i = 0u; i < blendShapeNameList.size(); ++i) + { + const auto& name = blendShapeNameList[i]; + tet_printf("Check retrieved blendshape name : %s\n", name.c_str()); + + const auto& iter = expectBlendShapeNames.find(name); + DALI_TEST_CHECK(iter != expectBlendShapeNames.end()); + + std::vector nodeList; + model.RetrieveModelNodesByBlendShapeName(name, nodeList); + DALI_TEST_EQUALS(nodeList.size(), 1u, TEST_LOCATION); + DALI_TEST_EQUALS(nodeList[0], expectNode, TEST_LOCATION); + DALI_TEST_EQUALS(nodeList[0].GetBlendShapeIndexByName(name), iter->second, TEST_LOCATION); + } + + END_TEST; +}