X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-toolkit%2Futc-Dali-KeyboardFocusManager.cpp;h=a4802047bea656f8080d1705780f9feaf8b6272c;hb=a3b69d118ee5f918a827b23ea76813a7aefad845;hp=05f0e264107690ddfa9d461977971f0bfb2b34c1;hpb=e4a430b81add6d09b02011b4eb010039563ca4f6;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/automated-tests/src/dali-toolkit/utc-Dali-KeyboardFocusManager.cpp b/automated-tests/src/dali-toolkit/utc-Dali-KeyboardFocusManager.cpp index 05f0e26..a480204 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-KeyboardFocusManager.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-KeyboardFocusManager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2016 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. @@ -24,7 +24,7 @@ #include #include - +#include using namespace Dali; using namespace Dali::Toolkit; @@ -51,11 +51,11 @@ public: : mSignalVerified(signalReceived), mCurrentFocusedActor(), mProposedActorToFocus(), - mDirection(Control::Left) + mDirection(Control::KeyboardFocus::LEFT) { } - Actor Callback(Actor currentFocusedActor, Actor proposedActorToFocus, Control::KeyboardFocusNavigationDirection direction) + Actor Callback(Actor currentFocusedActor, Actor proposedActorToFocus, Control::KeyboardFocus::Direction direction) { tet_infoline("Verifying PreFocusChangeCallback()"); @@ -73,13 +73,13 @@ public: mSignalVerified = false; mCurrentFocusedActor = Actor(); mProposedActorToFocus = Actor(); - mDirection = Control::Left; + mDirection = Control::KeyboardFocus::LEFT; } bool& mSignalVerified; Actor mCurrentFocusedActor; Actor mProposedActorToFocus; - Control::KeyboardFocusNavigationDirection mDirection; + Control::KeyboardFocus::Direction mDirection; }; // Functors to test whether focus changed signal is emitted when the keyboard focus is changed @@ -175,8 +175,19 @@ public: Actor mActivatedActor; }; -} // namespace +// Used to connect to signals via the ConnectSignal Handle method +struct CallbackFunctor +{ + CallbackFunctor() + { + } + void operator()() + { + } +}; + +} // namespace int UtcDaliKeyboardFocusManagerGet(void) { @@ -295,13 +306,13 @@ int UtcDaliKeyboardFocusManagerMoveFocus(void) Stage::GetCurrent().Add(second); // Move the focus to the right - DALI_TEST_CHECK(manager.MoveFocus(Control::Right) == false); + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::RIGHT) == false); // Because no layout control in the stage and no actor is focused, it should emit the PreFocusChange signal DALI_TEST_CHECK(preFocusChangeCallback.mSignalVerified); DALI_TEST_CHECK(preFocusChangeCallback.mCurrentFocusedActor == Actor()); DALI_TEST_CHECK(preFocusChangeCallback.mProposedActorToFocus == Actor()); - DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::Right); + DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::KeyboardFocus::RIGHT); preFocusChangeCallback.Reset(); // Check that the focus is set on the first actor @@ -313,13 +324,13 @@ int UtcDaliKeyboardFocusManagerMoveFocus(void) focusChangedCallback.Reset(); // Move the focus towards right - DALI_TEST_CHECK(manager.MoveFocus(Control::Right) == false); + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::RIGHT) == false); // Because no layout control in the stage and the first actor is focused, it should emit the PreFocusChange signal DALI_TEST_CHECK(preFocusChangeCallback.mSignalVerified); DALI_TEST_CHECK(preFocusChangeCallback.mCurrentFocusedActor == first); DALI_TEST_CHECK(preFocusChangeCallback.mProposedActorToFocus == Actor()); - DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::Right); + DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::KeyboardFocus::RIGHT); preFocusChangeCallback.Reset(); // Check that the focus is set on the second actor @@ -331,13 +342,13 @@ int UtcDaliKeyboardFocusManagerMoveFocus(void) focusChangedCallback.Reset(); // Move the focus towards up - DALI_TEST_CHECK(manager.MoveFocus(Control::Up) == false); + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::UP) == false); // Because no layout control in the stage and no actor is focused, it should emit the PreFocusChange signal DALI_TEST_CHECK(preFocusChangeCallback.mSignalVerified); DALI_TEST_CHECK(preFocusChangeCallback.mCurrentFocusedActor == second); DALI_TEST_CHECK(preFocusChangeCallback.mProposedActorToFocus == Actor()); - DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::Up); + DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::KeyboardFocus::UP); preFocusChangeCallback.Reset(); DALI_TEST_CHECK(!focusChangedCallback.mSignalVerified); @@ -368,7 +379,7 @@ int UtcDaliKeyboardFocusManagerMoveFocus(void) focusChangedCallback.Reset(); // Move the focus towards right - DALI_TEST_CHECK(manager.MoveFocus(Control::Right) == true); + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::RIGHT) == true); DALI_TEST_CHECK(manager.GetCurrentFocusActor() == second); DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == first); @@ -376,7 +387,7 @@ int UtcDaliKeyboardFocusManagerMoveFocus(void) focusChangedCallback.Reset(); // Move the focus towards down - DALI_TEST_CHECK(manager.MoveFocus(Control::Down) == true); + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::DOWN) == true); DALI_TEST_CHECK(manager.GetCurrentFocusActor() == fourth); DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == second); @@ -384,7 +395,7 @@ int UtcDaliKeyboardFocusManagerMoveFocus(void) focusChangedCallback.Reset(); // Move the focus towards left - DALI_TEST_CHECK(manager.MoveFocus(Control::Left) == true); + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::LEFT) == true); DALI_TEST_CHECK(manager.GetCurrentFocusActor() == third); DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == fourth); @@ -392,7 +403,7 @@ int UtcDaliKeyboardFocusManagerMoveFocus(void) focusChangedCallback.Reset(); // Move the focus towards up - DALI_TEST_CHECK(manager.MoveFocus(Control::Up) == true); + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::UP) == true); DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first); DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == third); @@ -400,12 +411,12 @@ int UtcDaliKeyboardFocusManagerMoveFocus(void) focusChangedCallback.Reset(); // Move the focus towards left. The focus move will fail as no way to move it upwards - DALI_TEST_CHECK(manager.MoveFocus(Control::Left) == false); + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::LEFT) == false); DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first); DALI_TEST_CHECK(preFocusChangeCallback.mSignalVerified); DALI_TEST_CHECK(preFocusChangeCallback.mCurrentFocusedActor == first); DALI_TEST_CHECK(preFocusChangeCallback.mProposedActorToFocus == Actor()); - DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::Left); + DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::KeyboardFocus::LEFT); preFocusChangeCallback.Reset(); DALI_TEST_CHECK(!focusChangedCallback.mSignalVerified); @@ -414,7 +425,7 @@ int UtcDaliKeyboardFocusManagerMoveFocus(void) DALI_TEST_CHECK(manager.GetFocusGroupLoop() == true); // Move the focus towards left again. The focus should move to the fourth actor. - DALI_TEST_CHECK(manager.MoveFocus(Control::Left) == true); + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::LEFT) == true); DALI_TEST_CHECK(manager.GetCurrentFocusActor() == fourth); DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == first); @@ -594,7 +605,7 @@ int UtcDaliKeyboardFocusManagerSignalFocusedActorActivated(void) bool focusedActorActivatedSignalVerified = false; FocusedActorActivatedCallback focusedActorActivatedCallback(focusedActorActivatedSignalVerified); - manager.FocusedActorActivatedSignal().Connect( &focusedActorActivatedCallback, &FocusedActorActivatedCallback::Callback ); + manager.FocusedActorEnterKeySignal().Connect( &focusedActorActivatedCallback, &FocusedActorActivatedCallback::Callback ); Integration::KeyEvent returnEvent("Return", "", 0, 0, 0, Integration::KeyEvent::Up); @@ -668,3 +679,434 @@ int UtcDaliKeyboardFocusManagerSignalFocusGroupChanged(void) focusGroupChangedCallback.Reset(); END_TEST; } + +int UtcDaliKeyboardFocusManagerSignals(void) +{ + ToolkitTestApplication application; + + KeyboardFocusManager manager = KeyboardFocusManager::Get(); + DALI_TEST_CHECK( manager ); + + ConnectionTracker* testTracker = new ConnectionTracker(); + DALI_TEST_EQUALS( true, manager.ConnectSignal( testTracker, "keyboardPreFocusChange", CallbackFunctor() ), TEST_LOCATION ); + DALI_TEST_EQUALS( true, manager.ConnectSignal( testTracker, "keyboardFocusChanged", CallbackFunctor() ), TEST_LOCATION ); + DALI_TEST_EQUALS( true, manager.ConnectSignal( testTracker, "keyboardFocusGroupChanged", CallbackFunctor() ), TEST_LOCATION ); + DALI_TEST_EQUALS( true, manager.ConnectSignal( testTracker, "keyboardFocusedActorEnterKey", CallbackFunctor() ), TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliKeyboardFocusManagerMoveFocusBackward(void) +{ + ToolkitTestApplication application; + + tet_infoline(" UtcDaliKeyboardFocusManagerMoveFocusBackward"); + + KeyboardFocusManager manager = KeyboardFocusManager::Get(); + DALI_TEST_CHECK(manager); + + // Make history stack full + for(int i = 0 ; i < 31 ; i ++) + { + Actor actor = Actor::New(); + actor.SetKeyboardFocusable(true); + Stage::GetCurrent().Add(actor); + manager.SetCurrentFocusActor(actor); + } + + // Create the first actor and add it to the stage + Actor first = Actor::New(); + first.SetKeyboardFocusable(true); + Stage::GetCurrent().Add(first); + + // Create the second actor and add it to the stage + Actor second = Actor::New(); + second.SetKeyboardFocusable(true); + Stage::GetCurrent().Add(second); + + // Create the second actor and add it to the stage + Actor third = Actor::New(); + third.SetKeyboardFocusable(true); + Stage::GetCurrent().Add(third); + + // Check that the focus is set on the second actor + DALI_TEST_CHECK(manager.SetCurrentFocusActor(first) == true); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first); + + // Check that the focus is set on the second actor + DALI_TEST_CHECK(manager.SetCurrentFocusActor(second) == true); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == second); + + // Check that the focus is set on the third actor + DALI_TEST_CHECK(manager.SetCurrentFocusActor(third) == true); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == third); + + // Move the focus backward + manager.MoveFocusBackward(); + + // Check that it current focused actor is second actor + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == second); + + // Check that the focus is set on the third actor + DALI_TEST_CHECK(manager.SetCurrentFocusActor(third) == true); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == third); + + // Remove the second actor on stage + second.Unparent(); + + // Move the focus backward + manager.MoveFocusBackward(); + + // Check that it current focused actor is first actor + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first); + + END_TEST; +} + +int UtcDaliKeyboardFocusManagerChangeFocusDirectionByKeyEvents(void) +{ + ToolkitTestApplication application; + + tet_infoline(" UtcDaliKeyboardFocusManagerChangeFocusDirectionByKeyEvents"); + + KeyboardFocusManager manager = KeyboardFocusManager::Get(); + DALI_TEST_CHECK(manager); + + bool preFocusChangeSignalVerified = false; + PreFocusChangeCallback preFocusChangeCallback(preFocusChangeSignalVerified); + manager.PreFocusChangeSignal().Connect( &preFocusChangeCallback, &PreFocusChangeCallback::Callback ); + + bool focusChangedSignalVerified = false; + FocusChangedCallback focusChangedCallback(focusChangedSignalVerified); + manager.FocusChangedSignal().Connect( &focusChangedCallback, &FocusChangedCallback::Callback ); + + Integration::KeyEvent leftEvent("Left", "", 0, 0, 0, Integration::KeyEvent::Down); + Integration::KeyEvent rightEvent("Right", "", 0, 0, 0, Integration::KeyEvent::Down); + Integration::KeyEvent upEvent("Up", "", 0, 0, 0, Integration::KeyEvent::Down); + Integration::KeyEvent downEvent("Down", "", 0, 0, 0, Integration::KeyEvent::Down); + Integration::KeyEvent pageUpEvent("Prior", "", 0, 0, 0, Integration::KeyEvent::Down); + Integration::KeyEvent pageDownEvent("Next", "", 0, 0, 0, Integration::KeyEvent::Down); + + // Create a 2x2 table view and try to move focus inside it + TableView tableView = TableView::New( 2, 2 ); + Stage::GetCurrent().Add(tableView); + + // Create the first actor + Actor first = Actor::New(); + first.SetKeyboardFocusable(true); + + // Create the second actor + Actor second = Actor::New(); + second.SetKeyboardFocusable(true); + + // Create the third actor + Actor third = Actor::New(); + third.SetKeyboardFocusable(true); + + // Create the fourth actor + Actor fourth = Actor::New(); + fourth.SetKeyboardFocusable(true); + + // Add the four children to table view + tableView.AddChild(first, TableView::CellPosition(0, 0)); + tableView.AddChild(second, TableView::CellPosition(0, 1)); + tableView.AddChild(third, TableView::CellPosition(1, 0)); + tableView.AddChild(fourth, TableView::CellPosition(1, 1)); + + // Set the focus to the first actor + DALI_TEST_CHECK(manager.SetCurrentFocusActor(first) == true); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first); + DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); + DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == Actor()); + DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == first); + focusChangedCallback.Reset(); + + // Send the right key event to move the focus towards right + application.ProcessEvent(rightEvent); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == second); + DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); + DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == first); + DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == second); + focusChangedCallback.Reset(); + + // Send the down key event to move the focus towards down + application.ProcessEvent(downEvent); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == fourth); + DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); + DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == second); + DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == fourth); + focusChangedCallback.Reset(); + + // Send the down event to move the focus towards left + application.ProcessEvent(leftEvent); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == third); + DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); + DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == fourth); + DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == third); + focusChangedCallback.Reset(); + + // Send the up event to move the focus towards up + application.ProcessEvent(upEvent); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first); + DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); + DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == third); + DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == first); + focusChangedCallback.Reset(); + + // Send the pape up event, but focus should not be moved because page up is not supported by table view + application.ProcessEvent(pageUpEvent); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first); + DALI_TEST_CHECK(preFocusChangeCallback.mSignalVerified); + DALI_TEST_CHECK(preFocusChangeCallback.mCurrentFocusedActor == first); + DALI_TEST_CHECK(preFocusChangeCallback.mProposedActorToFocus == first); + DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::KeyboardFocus::PAGE_UP); + preFocusChangeCallback.Reset(); + + // Send the pape down event, but focus should not be moved because page down is not supported by table view + application.ProcessEvent(pageDownEvent); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first); + DALI_TEST_CHECK(preFocusChangeCallback.mSignalVerified); + DALI_TEST_CHECK(preFocusChangeCallback.mCurrentFocusedActor == first); + DALI_TEST_CHECK(preFocusChangeCallback.mProposedActorToFocus == first); + DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::KeyboardFocus::PAGE_DOWN); + preFocusChangeCallback.Reset(); + + // Clear the focus + manager.ClearFocus(); + + // Send the pape up event, but nothing was focued so focus manager will try the initial focus + preFocusChangeCallback.Reset(); + application.ProcessEvent(pageUpEvent); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == Actor()); + DALI_TEST_CHECK(preFocusChangeCallback.mSignalVerified); + DALI_TEST_CHECK(preFocusChangeCallback.mCurrentFocusedActor == Actor()); + DALI_TEST_CHECK(preFocusChangeCallback.mProposedActorToFocus == Actor()); + DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::KeyboardFocus::RIGHT); + + // Clear the focus again + manager.ClearFocus(); + + // Send the pape down event, but nothing was focued so focus manager will try the initial focus + preFocusChangeCallback.Reset(); + application.ProcessEvent(pageDownEvent); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == Actor()); + DALI_TEST_CHECK(preFocusChangeCallback.mSignalVerified); + DALI_TEST_CHECK(preFocusChangeCallback.mCurrentFocusedActor == Actor()); + DALI_TEST_CHECK(preFocusChangeCallback.mProposedActorToFocus == Actor()); + DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::KeyboardFocus::RIGHT); + + END_TEST; +} + + + + + +int UtcDaliKeyboardFocusManagerMoveFocusTestStateChange(void) +{ + ToolkitTestApplication application; + + tet_infoline(" UtcDaliKeyboardFocusManagerMoveFocusTestStateChange"); + + // Register Type + TypeInfo type; + type = TypeRegistry::Get().GetTypeInfo( "KeyboardFocusManager" ); + DALI_TEST_CHECK( type ); + BaseHandle handle = type.CreateInstance(); + DALI_TEST_CHECK( handle ); + + KeyboardFocusManager manager = KeyboardFocusManager::Get(); + DALI_TEST_CHECK(manager); + + bool preFocusChangeSignalVerified = false; + PreFocusChangeCallback preFocusChangeCallback(preFocusChangeSignalVerified); + manager.PreFocusChangeSignal().Connect( &preFocusChangeCallback, &PreFocusChangeCallback::Callback ); + + bool focusChangedSignalVerified = false; + FocusChangedCallback focusChangedCallback(focusChangedSignalVerified); + manager.FocusChangedSignal().Connect( &focusChangedCallback, &FocusChangedCallback::Callback ); + + // Create the first actor and add it to the stage + Control first = Control::New(); + first.SetKeyboardFocusable(true); + Stage::GetCurrent().Add(first); + + // Create the second actor and add it to the stage + Control second = Control::New(); + second.SetKeyboardFocusable(true); + Stage::GetCurrent().Add(second); + + // Move the focus to the right + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::RIGHT) == false); + + // Because no layout control in the stage and no actor is focused, it should emit the PreFocusChange signal + DALI_TEST_CHECK(preFocusChangeCallback.mSignalVerified); + DALI_TEST_CHECK(preFocusChangeCallback.mCurrentFocusedActor == Actor()); + DALI_TEST_CHECK(preFocusChangeCallback.mProposedActorToFocus == Actor()); + DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::KeyboardFocus::RIGHT); + preFocusChangeCallback.Reset(); + + // Check that the focus is set on the first actor + DALI_TEST_CHECK(manager.SetCurrentFocusActor(first) == true); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first); + DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); + DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == Actor()); + DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == first); + DALI_TEST_EQUALS(first.GetProperty(DevelControl::Property::STATE), "FOCUSED", TEST_LOCATION ); + focusChangedCallback.Reset(); + + // Move the focus towards right + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::RIGHT) == false); + + // Because no layout control in the stage and the first actor is focused, it should emit the PreFocusChange signal + DALI_TEST_CHECK(preFocusChangeCallback.mSignalVerified); + DALI_TEST_CHECK(preFocusChangeCallback.mCurrentFocusedActor == first); + DALI_TEST_CHECK(preFocusChangeCallback.mProposedActorToFocus == Actor()); + DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::KeyboardFocus::RIGHT); + preFocusChangeCallback.Reset(); + + // Check that the focus is set on the second actor + DALI_TEST_CHECK(manager.SetCurrentFocusActor(second) == true); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == second); + DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); + DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == first); + DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == second); + DALI_TEST_EQUALS(first.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + DALI_TEST_EQUALS(second.GetProperty(DevelControl::Property::STATE), "FOCUSED", TEST_LOCATION ); + focusChangedCallback.Reset(); + + // Move the focus towards up + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::UP) == false); + + // Because no layout control in the stage and no actor is focused, it should emit the PreFocusChange signal + DALI_TEST_CHECK(preFocusChangeCallback.mSignalVerified); + DALI_TEST_CHECK(preFocusChangeCallback.mCurrentFocusedActor == second); + DALI_TEST_CHECK(preFocusChangeCallback.mProposedActorToFocus == Actor()); + DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::KeyboardFocus::UP); + preFocusChangeCallback.Reset(); + DALI_TEST_CHECK(!focusChangedCallback.mSignalVerified); + + // Create a 2x2 table view and try to move focus inside it + TableView tableView = TableView::New( 2, 2 ); + Stage::GetCurrent().Add(tableView); + + // Create the third actor + Control third = Control::New(); + third.SetKeyboardFocusable(true); + + // Create the fourth actor + Control fourth = Control::New(); + fourth.SetKeyboardFocusable(true); + + // Add the four children to table view + tableView.AddChild(first, TableView::CellPosition(0, 0)); + tableView.AddChild(second, TableView::CellPosition(0, 1)); + tableView.AddChild(third, TableView::CellPosition(1, 0)); + tableView.AddChild(fourth, TableView::CellPosition(1, 1)); + + // Set the focus to the first actor + DALI_TEST_CHECK(manager.SetCurrentFocusActor(first) == true); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first); + DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); + DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == second); + DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == first); + + DALI_TEST_EQUALS(first.GetProperty(DevelControl::Property::STATE), "FOCUSED", TEST_LOCATION ); + DALI_TEST_EQUALS(second.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + + focusChangedCallback.Reset(); + + // Move the focus towards right + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::RIGHT) == true); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == second); + DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); + DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == first); + DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == second); + DALI_TEST_EQUALS(first.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + DALI_TEST_EQUALS(second.GetProperty(DevelControl::Property::STATE), "FOCUSED", TEST_LOCATION ); + + focusChangedCallback.Reset(); + + // Move the focus towards down + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::DOWN) == true); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == fourth); + DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); + DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == second); + DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == fourth); + + DALI_TEST_EQUALS(first.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + DALI_TEST_EQUALS(second.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + DALI_TEST_EQUALS(third.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + DALI_TEST_EQUALS(fourth.GetProperty(DevelControl::Property::STATE), "FOCUSED", TEST_LOCATION ); + + focusChangedCallback.Reset(); + + // Move the focus towards left + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::LEFT) == true); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == third); + DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); + DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == fourth); + DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == third); + + DALI_TEST_EQUALS(first.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + DALI_TEST_EQUALS(second.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + DALI_TEST_EQUALS(third.GetProperty(DevelControl::Property::STATE), "FOCUSED", TEST_LOCATION ); + DALI_TEST_EQUALS(fourth.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + + focusChangedCallback.Reset(); + + // Move the focus towards up + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::UP) == true); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first); + DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); + DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == third); + DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == first); + DALI_TEST_EQUALS(first.GetProperty(DevelControl::Property::STATE), "FOCUSED", TEST_LOCATION ); + DALI_TEST_EQUALS(second.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + DALI_TEST_EQUALS(third.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + DALI_TEST_EQUALS(fourth.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + focusChangedCallback.Reset(); + + // Move the focus towards left. The focus move will fail as no way to move it upwards + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::LEFT) == false); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first); + DALI_TEST_CHECK(preFocusChangeCallback.mSignalVerified); + DALI_TEST_CHECK(preFocusChangeCallback.mCurrentFocusedActor == first); + DALI_TEST_CHECK(preFocusChangeCallback.mProposedActorToFocus == Actor()); + DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::KeyboardFocus::LEFT); + DALI_TEST_EQUALS(first.GetProperty(DevelControl::Property::STATE), "FOCUSED", TEST_LOCATION ); + DALI_TEST_EQUALS(second.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + DALI_TEST_EQUALS(third.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + DALI_TEST_EQUALS(fourth.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + + preFocusChangeCallback.Reset(); + DALI_TEST_CHECK(!focusChangedCallback.mSignalVerified); + + // Enable the loop + manager.SetFocusGroupLoop(true); + DALI_TEST_CHECK(manager.GetFocusGroupLoop() == true); + + // Move the focus towards left again. The focus should move to the fourth actor. + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::LEFT) == true); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == fourth); + DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); + DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == first); + DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == fourth); + + DALI_TEST_EQUALS(first.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + DALI_TEST_EQUALS(second.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + DALI_TEST_EQUALS(third.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + DALI_TEST_EQUALS(fourth.GetProperty(DevelControl::Property::STATE), "FOCUSED", TEST_LOCATION ); + + focusChangedCallback.Reset(); + + // Clear the focus + manager.ClearFocus(); + DALI_TEST_EQUALS(first.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + DALI_TEST_EQUALS(second.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + DALI_TEST_EQUALS(third.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + DALI_TEST_EQUALS(fourth.GetProperty(DevelControl::Property::STATE), "NORMAL", TEST_LOCATION ); + + + END_TEST; +}