+ ConnectionTracker connectionTracker;
+ Control control = Control::New();
+
+ DALI_TEST_CHECK(DevelControl::AccessibilityGetNameSignal(control).Empty());
+ control.ConnectSignal(&connectionTracker, "getName", &TestVoidCallback);
+ DALI_TEST_CHECK(!DevelControl::AccessibilityGetNameSignal(control).Empty());
+
+ DALI_TEST_CHECK(DevelControl::AccessibilityGetDescriptionSignal(control).Empty());
+ control.ConnectSignal(&connectionTracker, "getDescription", &TestVoidCallback);
+ DALI_TEST_CHECK(!DevelControl::AccessibilityGetDescriptionSignal(control).Empty());
+
+ DALI_TEST_CHECK(DevelControl::AccessibilityDoGestureSignal(control).Empty());
+ control.ConnectSignal(&connectionTracker, "doGesture", &TestVoidCallback);
+ DALI_TEST_CHECK(!DevelControl::AccessibilityDoGestureSignal(control).Empty());
+
+ END_TEST;
+}
+
+static void Wait(ToolkitTestApplication& application)
+{
+ application.SendNotification();
+ application.Render(16);
+}
+
+int UtcDaliAccessibilityScrollToChildScrollView(void)
+{
+ ToolkitTestApplication application;
+ Dali::Accessibility::TestEnableSC(true);
+
+ ScrollView scrollView = ScrollView::New();
+ application.GetScene().Add(scrollView);
+
+ PushButton actorA = PushButton::New();
+ const Dali::Vector3 positionA = Vector3(100.0f, 400.0f, 0.0f);
+ actorA.SetProperty(Dali::Actor::Property::POSITION, positionA);
+ scrollView.Add(actorA);
+
+ PushButton actorB = PushButton::New();
+ const Dali::Vector3 positionB = Vector3(500.0f, 200.0f, 0.0f);
+ actorB.SetProperty(Dali::Actor::Property::POSITION, positionB);
+ scrollView.Add(actorB);
+
+ TableView tableView = TableView::New(2, 2); // 2 by 2 grid.
+ tableView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+ scrollView.Add(tableView);
+
+ PushButton actorC = PushButton::New();
+ actorC.SetProperty(Actor::Property::SIZE, Vector2(50.0f, 50.0f));
+ tableView.AddChild(actorC, TableView::CellPosition(0, 0));
+
+ PushButton actorD = PushButton::New();
+ application.GetScene().Add(actorD);
+
+ Wait(application);
+
+ auto* accessibleParent = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(scrollView));
+ DALI_TEST_CHECK(accessibleParent);
+ auto* accessibleA = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(actorA));
+ DALI_TEST_CHECK(accessibleA);
+ auto* accessibleB = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(actorB));
+ DALI_TEST_CHECK(accessibleB);
+ auto* accessibleC = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(actorC));
+ DALI_TEST_CHECK(accessibleC);
+
+ accessibleA->GrabHighlight(); // == scrollView.ScrollTo(actorA)
+ Wait(application);
+ accessibleB->GrabHighlight(); // == scrollView.ScrollTo(actorB)
+ Wait(application);
+
+ // scrollView is ancestor of actorC
+ // This should work without a crash
+ accessibleC->GrabHighlight(); // == scrollView.ScrollTo(actorC)
+ Wait(application);
+
+ // negative testcase calling ScrollToChild using non-child actor
+ accessibleParent->ScrollToChild(actorD);
+
+ Dali::Accessibility::TestEnableSC(false);
+ END_TEST;
+}
+
+namespace
+{
+class TestItemFactory : public ItemFactory
+{
+public:
+ TestItemFactory()
+ {
+ }
+
+ unsigned int GetNumberOfItems() override
+ {
+ return 2;
+ }
+
+ Dali::Actor NewItem(unsigned int itemId) override
+ {
+ return TextLabel::New(std::to_string(itemId));
+ }
+};
+} // namespace
+
+int UtcDaliAccessibilityScrollToChildItemView(void)
+{
+ ToolkitTestApplication application;
+ Dali::Accessibility::TestEnableSC(true);
+
+ TestItemFactory factory;
+ ItemView view = ItemView::New(factory);
+ Dali::Vector3 vec(480.0f, 800.0f, 0.0f);
+ ItemLayoutPtr layout = DefaultItemLayout::New(DefaultItemLayout::DEPTH);
+
+ view.AddLayout(*layout);
+ view.SetProperty(Actor::Property::SIZE, vec);
+
+ application.GetScene().Add(view);
+ layout->SetOrientation(ControlOrientation::Down);
+ view.ActivateLayout(0, vec, 0.0f);
+
+ Wait(application);
+
+ auto* accessibleParent = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(view));
+ DALI_TEST_CHECK(accessibleParent);
+ auto* accessibleA = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(view.GetItem(0)));
+ DALI_TEST_CHECK(accessibleA);
+ auto* accessibleB = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(view.GetItem(1)));
+ DALI_TEST_CHECK(accessibleB);
+
+ accessibleA->GrabHighlight(); // == view.ScrollToItem(view.GetItemId(actorA))
+ Wait(application);
+ accessibleB->GrabHighlight(); // == view.ScrollToItem(view.GetItemId(actorB))
+ Wait(application);
+
+ Dali::Accessibility::TestEnableSC(false);
+ END_TEST;
+}
+
+int UtcDaliAccessibilityScrollToChildNonScrollable(void)
+{
+ ToolkitTestApplication application;
+ Dali::Accessibility::TestEnableSC(true);
+
+ TextLabel label = TextLabel::New("123");
+
+ auto* accessible = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(label));
+ DALI_TEST_CHECK(accessible);
+
+ DALI_TEST_EQUALS(accessible->IsScrollable(), false, TEST_LOCATION);
+ DALI_TEST_EQUALS(accessible->ScrollToChild({}), false, TEST_LOCATION);
+ DALI_TEST_EQUALS(accessible->GetInternalActor(), label, TEST_LOCATION);
+
+ Dali::Accessibility::TestEnableSC(false);
+ END_TEST;
+}
+
+int UtcDaliAccessibilityCheckHighlight(void)
+{
+ ToolkitTestApplication application;
+ Dali::Accessibility::TestEnableSC(true);
+ Dali::Accessibility::TestResetMoveOutedCalled();
+
+ // Make precondition two children exist in parent area
+ PushButton parentButton = PushButton::New();
+ parentButton.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_TO_BOUNDING_BOX);
+ parentButton.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+ parentButton.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+ parentButton.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, 0.0f));
+ parentButton.SetProperty(Actor::Property::SIZE, Dali::Vector2(100.0f, 200.0f));
+ application.GetScene().Add(parentButton);
+
+ PushButton buttonA = PushButton::New();
+ buttonA.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+ buttonA.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+ buttonA.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, 0.0f));
+ buttonA.SetProperty(Actor::Property::SIZE, Dali::Vector2(100.0f, 100.0f));
+ parentButton.Add(buttonA);
+
+ PushButton buttonB = PushButton::New();
+ buttonB.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+ buttonB.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+ buttonB.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, 100.0f));
+ buttonB.SetProperty(Actor::Property::SIZE, Dali::Vector2(100.0f, 100.0f));
+ parentButton.Add(buttonB);
+ Wait(application);
+
+ // Set highlight to first child (A) to enable movement tracking
+ auto* accessible = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(buttonA));
+ DALI_TEST_CHECK(accessible);
+ accessible->GrabHighlight();
+ Wait(application);
+
+ // Move first child (A) out of parent area through the parent's area top edge - single move outed event expected for A object and OUTGOING_TOP_LEFT direction
+ buttonA.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, -200.0f));
+ Wait(application);
+ // Need one more notificaiton to get correct updated position
+ application.SendNotification();
+ DALI_TEST_EQUALS(true, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);