1 #include <automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/accessibility-test-utils.h>
2 #include <automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/dbus-wrapper.h>
3 #include <dali-toolkit-test-suite-utils.h>
4 #include <dali-toolkit/dali-toolkit.h>
5 #include <dali-toolkit/devel-api/controls/buttons/toggle-button.h>
6 #include <dali-toolkit/devel-api/controls/control-devel.h>
7 #include <dali-toolkit/devel-api/controls/popup/popup.h>
8 #include <dali-toolkit/devel-api/controls/table-view/table-view.h>
9 #include <dali-toolkit/devel-api/controls/web-view/web-view.h>
10 #include <dali/devel-api/actors/actor-devel.h>
11 #include <dali/devel-api/adaptor-framework/accessibility-bridge.h>
12 #include <dali/devel-api/adaptor-framework/accessibility.h>
13 #include <dali/devel-api/adaptor-framework/window-devel.h>
14 #include <dali/devel-api/atspi-interfaces/accessible.h>
15 #include <dali/devel-api/atspi-interfaces/action.h>
16 #include <dali/devel-api/atspi-interfaces/component.h>
17 #include <dali/devel-api/common/stage.h>
20 #include <automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/dbus-wrapper.h>
22 using namespace Dali::Toolkit;
24 void utc_dali_accessibility_controls_bridge_up_startup(void)
26 test_return_value = TET_UNDEF;
27 DBusWrapper::Install(std::unique_ptr<DBusWrapper>(new TestDBusWrapper));
30 void utc_dali_accessibility_controls_bridge_up_cleanup(void)
32 test_return_value = TET_PASS;
33 //DBusWrapper::Install({}) is a de-install
34 DBusWrapper::Install({});
39 namespace Accessibility
41 std::ostream& operator<<(std::ostream& stream, const Address& address)
43 stream << address.ToString();
46 } // namespace Accessibility
49 int UtcDaliControlAccessibilityRaiseBridge(void)
51 DALI_TEST_CHECK(!Accessibility::IsUp());
53 ToolkitTestApplication application;
55 Dali::Accessibility::TestEnableSC(true);
57 DALI_TEST_CHECK(Accessibility::IsUp());
59 // auto wr = static_cast<TestDBusWrapper*>(DBusWrapper::Installed());
60 // for(auto &a : wr->daliMethods) {
62 // if (std::get<3>(a.first) == MethodType::Method) mt = "MethodType::Method";
63 // else if (std::get<3>(a.first) == MethodType::Getter) mt = "MethodType::Getter";
64 // else if (std::get<3>(a.first) == MethodType::Setter) mt = "MethodType::Setter";
66 // printf("%s %s %s %s\n", std::get<0>(a.first).c_str(), std::get<1>(a.first).c_str(), std::get<2>(a.first).c_str(), mt);
69 Dali::Accessibility::TestEnableSC(false);
71 DALI_TEST_CHECK(!Accessibility::IsUp());
76 int UtcDaliControlAccessibilityName(void)
78 ToolkitTestApplication application;
80 auto control = Control::New();
81 Stage::GetCurrent().Add(control);
83 auto q = Dali::Accessibility::Accessible::Get(control);
86 DALI_TEST_EQUALS("", q->GetName(), TEST_LOCATION);
88 control.SetProperty(DevelControl::Property::ACCESSIBILITY_NAME, "Accessibility_Name");
89 DALI_TEST_EQUALS("Accessibility_Name", q->GetName(), TEST_LOCATION);
90 DALI_TEST_EQUALS(control.GetProperty(DevelControl::Property::ACCESSIBILITY_NAME).Get<std::string>(), "Accessibility_Name", TEST_LOCATION);
92 auto nameChangeCallback = [](std::string& accessibilityName) { accessibilityName = "Accessibility_Name_With_Callback"; };
94 DevelControl::AccessibilityGetNameSignal(control).Connect(nameChangeCallback);
96 DALI_TEST_EQUALS("Accessibility_Name_With_Callback", q->GetName(), TEST_LOCATION);
98 Dali::Accessibility::TestEnableSC(true);
100 DALI_TEST_EQUALS("Accessibility_Name_With_Callback", TestGetName(q->GetAddress()), TEST_LOCATION);
102 DevelControl::AccessibilityGetNameSignal(control).Disconnect(nameChangeCallback);
104 auto i = dynamic_cast<Dali::Accessibility::Component*>(q);
109 control.SetProperty(DevelControl::Property::ACCESSIBILITY_NAME, "Changed_Accessiblity_Name");
110 DALI_TEST_EQUALS("Changed_Accessiblity_Name", q->GetName(), TEST_LOCATION);
111 DALI_TEST_EQUALS(control.GetProperty(DevelControl::Property::ACCESSIBILITY_NAME).Get<std::string>(), "Changed_Accessiblity_Name", TEST_LOCATION);
113 //TODO test emission of name change signal
114 Dali::Accessibility::TestEnableSC(false);
119 int UtcDaliControlAccessibilityDescription(void)
121 ToolkitTestApplication application;
123 auto control = Control::New();
125 auto q = Dali::Accessibility::Accessible::Get(control);
128 DALI_TEST_EQUALS("", q->GetDescription(), TEST_LOCATION);
130 control.SetProperty(DevelControl::Property::ACCESSIBILITY_DESCRIPTION, "Accessibility_Description");
131 DALI_TEST_EQUALS("Accessibility_Description", q->GetDescription(), TEST_LOCATION);
133 auto property = control.GetProperty(DevelControl::Property::ACCESSIBILITY_DESCRIPTION).Get<std::string>();
134 DALI_TEST_EQUALS("Accessibility_Description", property, TEST_LOCATION);
136 auto descriptionChangeCallback = [](std::string& accessibilityDescription) { accessibilityDescription = "Accessibility_Description_With_Callback"; };
138 DevelControl::AccessibilityGetDescriptionSignal(control).Connect(descriptionChangeCallback);
140 DALI_TEST_EQUALS("Accessibility_Description_With_Callback", q->GetDescription(), TEST_LOCATION);
142 Dali::Accessibility::TestEnableSC(true);
144 DALI_TEST_EQUALS("Accessibility_Description_With_Callback", TestGetDescription(q->GetAddress()), TEST_LOCATION);
146 DevelControl::AccessibilityGetDescriptionSignal(control).Disconnect(descriptionChangeCallback);
148 auto i = dynamic_cast<Dali::Accessibility::Component*>(q);
153 control.SetProperty(DevelControl::Property::ACCESSIBILITY_DESCRIPTION, "Changed_Accessiblity_Description");
154 DALI_TEST_EQUALS("Changed_Accessiblity_Description", q->GetDescription(), TEST_LOCATION);
155 DALI_TEST_EQUALS(control.GetProperty(DevelControl::Property::ACCESSIBILITY_DESCRIPTION).Get<std::string>(), "Changed_Accessiblity_Description", TEST_LOCATION);
157 //TODO test emission of description change signal
158 Dali::Accessibility::TestEnableSC(false);
163 int UtcDaliControlAccessibilityRole(void)
165 ToolkitTestApplication application;
167 auto control = Control::New();
168 auto role_unknown = Dali::Accessibility::Role::UNKNOWN;
169 auto role_pushbutton = Dali::Accessibility::Role::PUSH_BUTTON;
171 DALI_TEST_EQUALS(role_unknown, control.GetProperty(DevelControl::Property::ACCESSIBILITY_ROLE).Get<Dali::Accessibility::Role>(), TEST_LOCATION);
173 auto q = Dali::Accessibility::Accessible::Get(control);
174 DALI_TEST_EQUALS(role_unknown, q->GetRole(), TEST_LOCATION);
175 DALI_TEST_EQUALS("unknown", q->GetRoleName(), TEST_LOCATION);
177 Dali::Accessibility::TestEnableSC(true);
179 DALI_TEST_EQUALS(static_cast<uint32_t>(role_unknown), TestGetRole(q->GetAddress()), TEST_LOCATION);
180 DALI_TEST_EQUALS("unknown", TestGetRoleName(q->GetAddress()), TEST_LOCATION);
181 DALI_TEST_EQUALS("unknown", TestGetLocalizedRoleName(q->GetAddress()), TEST_LOCATION);
183 control.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, role_pushbutton);
185 DALI_TEST_EQUALS(static_cast<uint32_t>(role_pushbutton), TestGetRole(q->GetAddress()), TEST_LOCATION);
186 DALI_TEST_EQUALS("push button", TestGetRoleName(q->GetAddress()), TEST_LOCATION);
187 DALI_TEST_EQUALS("push button", TestGetLocalizedRoleName(q->GetAddress()), TEST_LOCATION);
189 Dali::Accessibility::TestEnableSC(false);
191 DALI_TEST_EQUALS(role_pushbutton, q->GetRole(), TEST_LOCATION);
192 DALI_TEST_EQUALS("push button", q->GetRoleName(), TEST_LOCATION);
197 int UtcDaliControlAccessibilityRoleToggleButton(void)
199 ToolkitTestApplication application;
201 auto control = Dali::Toolkit::ToggleButton::New();
202 auto button = Dali::Accessibility::Role::TOGGLE_BUTTON;
204 control.SetProperty(Toolkit::ToggleButton::Property::TOOLTIPS,
205 Property::Array{"option1", "option2"});
207 Dali::Accessibility::TestEnableSC(true);
209 control.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, button);
210 auto q = Dali::Accessibility::Accessible::Get(control);
212 DALI_TEST_EQUALS(button, q->GetRole(), TEST_LOCATION);
213 DALI_TEST_EQUALS("toggle button", q->GetRoleName(), TEST_LOCATION);
215 Dali::Accessibility::States states = q->GetStates();
216 DALI_TEST_EQUALS(true, (bool)states[Dali::Accessibility::State::VISIBLE], TEST_LOCATION);
218 DALI_TEST_EQUALS("option1", q->GetDescription(), TEST_LOCATION);
220 auto i = dynamic_cast<Dali::Accessibility::Component*>(q);
225 control.SetProperty(Toolkit::Button::Property::LABEL, "ToggleButton2");
226 DALI_TEST_EQUALS("ToggleButton2", TestGetName(q->GetAddress()), TEST_LOCATION);
228 Dali::Accessibility::TestEnableSC(false);
233 int UtcDaliControlAccessibilityButtonLabel(void)
235 ToolkitTestApplication application;
237 auto control = Dali::Toolkit::PushButton::New();
238 auto button = Dali::Accessibility::Role::PUSH_BUTTON;
240 Dali::Accessibility::TestEnableSC(true);
242 control.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, button);
244 auto q = Dali::Accessibility::Accessible::Get(control);
245 auto i = dynamic_cast<Dali::Accessibility::Component*>(q);
250 control.SetProperty(Toolkit::Button::Property::LABEL, "Button2");
252 DALI_TEST_EQUALS("Button2", TestGetName(q->GetAddress()), TEST_LOCATION);
254 Dali::Accessibility::TestEnableSC(false);
259 int UtcDaliControlAccessibilityState(void)
261 ToolkitTestApplication application;
263 auto control = Control::New();
264 auto q = Dali::Accessibility::Accessible::Get(control);
266 Dali::Accessibility::TestEnableSC(true);
268 auto states_by_bridge = Dali::Accessibility::States{TestGetStates(q->GetAddress())};
269 auto states = DevelControl::GetAccessibilityStates(control);
270 DALI_TEST_CHECK(states_by_bridge == states);
272 Dali::Accessibility::TestEnableSC(false);
277 int UtcDaliControlAccessibilityModal(void)
279 ToolkitTestApplication application;
281 auto control = Dali::Toolkit::Popup::New();
282 auto q = Dali::Accessibility::Accessible::Get(control);
284 Dali::Accessibility::TestEnableSC(true);
286 auto states_by_bridge = Dali::Accessibility::States{TestGetStates(q->GetAddress())};
287 DALI_TEST_CHECK(states_by_bridge[Dali::Accessibility::State::MODAL]);
289 Dali::Accessibility::TestEnableSC(false);
294 int UtcDaliControlAccessibilityHighlightable(void)
296 ToolkitTestApplication application;
297 auto control = Control::New();
299 auto highlightable = control.GetProperty<bool>(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE);
300 DALI_TEST_EQUALS(highlightable, false, TEST_LOCATION);
302 // negative testcase - trying to set unconvertible value
303 control.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, "deadbeef");
304 highlightable = control.GetProperty<bool>(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE);
305 DALI_TEST_EQUALS(highlightable, false, TEST_LOCATION);
307 auto q = Dali::Accessibility::Accessible::Get(control);
309 Dali::Accessibility::TestEnableSC(true);
311 auto states_by_bridge = Dali::Accessibility::States{TestGetStates(q->GetAddress())};
312 DALI_TEST_CHECK(!states_by_bridge[Dali::Accessibility::State::HIGHLIGHTABLE]);
314 control.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, true);
315 DALI_TEST_EQUALS(Property::BOOLEAN, control.GetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE).GetType(), TEST_LOCATION);
316 DALI_TEST_EQUALS(true, control.GetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE).Get<bool>(), TEST_LOCATION);
318 states_by_bridge = Dali::Accessibility::States{TestGetStates(q->GetAddress())};
319 DALI_TEST_CHECK(states_by_bridge[Dali::Accessibility::State::HIGHLIGHTABLE]);
321 control.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, false);
322 DALI_TEST_EQUALS(Property::BOOLEAN, control.GetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE).GetType(), TEST_LOCATION);
323 DALI_TEST_EQUALS(false, control.GetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE).Get<bool>(), TEST_LOCATION);
325 states_by_bridge = Dali::Accessibility::States{TestGetStates(q->GetAddress())};
326 DALI_TEST_CHECK(!states_by_bridge[Dali::Accessibility::State::HIGHLIGHTABLE]);
328 Dali::Accessibility::TestEnableSC(false);
333 int UtcDaliControlAccessibilityHighlightBridgeUp(void)
335 ToolkitTestApplication application;
337 auto controla = Control::New();
338 auto controlb = Control::New();
339 controla.Add(controlb);
341 controla.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, true);
342 controlb.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, true);
344 Dali::Accessibility::TestEnableSC(true);
346 auto accessible_a = Dali::Accessibility::Accessible::Get(controla);
347 auto accessible_b = Dali::Accessibility::Accessible::Get(controlb);
349 auto a = dynamic_cast<Dali::Accessibility::Component*>(accessible_a);
350 auto b = dynamic_cast<Dali::Accessibility::Component*>(accessible_b);
352 auto states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
353 auto states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
355 DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
356 DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
358 DALI_TEST_EQUALS(true, DevelControl::GrabAccessibilityHighlight(controla), TEST_LOCATION);
360 states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
361 states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
363 DALI_TEST_CHECK(states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
364 DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
366 DALI_TEST_EQUALS(true, DevelControl::GrabAccessibilityHighlight(controlb), TEST_LOCATION);
367 DALI_TEST_EQUALS(true, DevelControl::GrabAccessibilityHighlight(controlb), TEST_LOCATION);
369 states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
370 states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
372 DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
373 DALI_TEST_CHECK(states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
375 DALI_TEST_EQUALS(false, DevelControl::ClearAccessibilityHighlight(controla), TEST_LOCATION);
377 states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
378 states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
380 DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
381 DALI_TEST_CHECK(states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
383 DALI_TEST_EQUALS(true, DevelControl::ClearAccessibilityHighlight(controlb), TEST_LOCATION);
385 states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
386 states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
388 DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
389 DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
391 DALI_TEST_CHECK(TestGrabHighlight(a->GetAddress()));
393 states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
394 states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
396 DALI_TEST_CHECK(states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
397 DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
399 DALI_TEST_CHECK(TestGrabHighlight(b->GetAddress()));
401 states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
402 states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
404 DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
405 DALI_TEST_CHECK(states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
407 DALI_TEST_CHECK(TestClearHighlight(b->GetAddress()));
409 states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
410 states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
412 DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
413 DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
415 Dali::Accessibility::TestEnableSC(false);
420 int utcDaliAccessibilityControlAttributes(void)
422 ToolkitTestApplication application;
423 auto check_box_button = Toolkit::Control::New();
427 auto attributes = check_box_button.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
428 auto attributes_map = attributes.GetMap();
430 auto position = attributes_map->Find("access_key1");
431 DALI_TEST_CHECK(!position);
433 DevelControl::AppendAccessibilityAttribute(check_box_button, "access_key1", "access_value1");
434 attributes = check_box_button.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
435 attributes_map = attributes.GetMap();
437 DALI_TEST_EQUALS((attributes_map->Find("access_key1"))->Get<std::string>(), "access_value1", TEST_LOCATION);
439 DevelControl::AppendAccessibilityAttribute(check_box_button, "access_key2", "access_value2_a");
440 attributes = check_box_button.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
441 attributes_map = attributes.GetMap();
443 DALI_TEST_EQUALS((attributes_map->Find("access_key1"))->Get<std::string>(), "access_value1", TEST_LOCATION);
444 DALI_TEST_EQUALS((attributes_map->Find("access_key2"))->Get<std::string>(), "access_value2_a", TEST_LOCATION);
446 DevelControl::AppendAccessibilityAttribute(check_box_button, "access_key2", "access_value2_b");
447 attributes = check_box_button.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
448 attributes_map = attributes.GetMap();
450 DALI_TEST_EQUALS((attributes_map->Find("access_key2"))->Get<std::string>(), "access_value2_b", TEST_LOCATION);
452 DevelControl::RemoveAccessibilityAttribute(check_box_button, "access_key2");
453 attributes = check_box_button.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
454 attributes_map = attributes.GetMap();
456 // In case when we are removing one of attributes the property is setting for NONE type.
457 DALI_TEST_EQUALS((attributes_map->Find("access_key2"))->GetType(), Property::NONE, TEST_LOCATION);
459 Dali::Accessibility::TestEnableSC(true);
461 auto ptr = Dali::Accessibility::Accessible::Get(check_box_button);
462 auto attribute_map_bridge = TestGetAttributes(ptr->GetAddress());
465 // Refresh the attributes since ControlAccessible::GetAttributes() might have added something
466 attributes = check_box_button.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
467 attributes_map = attributes.GetMap();
468 for(auto i = 0u; i < attributes_map->Count(); ++i)
469 if((attributes_map->GetValue(i)).GetType() != Property::NONE)
472 DALI_TEST_EQUALS(counter, attribute_map_bridge.size(), TEST_LOCATION);
474 for(auto it : attribute_map_bridge)
475 DALI_TEST_EQUALS((attributes_map->Find(it.first))->Get<std::string>(), it.second, TEST_LOCATION);
477 DevelControl::ClearAccessibilityAttributes(check_box_button);
478 attributes = check_box_button.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
479 attributes_map = attributes.GetMap();
481 position = attributes_map->Find("access_key1");
482 DALI_TEST_CHECK(!position);
484 position = attributes_map->Find("access_key2");
485 DALI_TEST_CHECK(!position);
487 Dali::Accessibility::TestEnableSC(false);
492 int UtcDaliControlReadingInfoType(void)
494 ToolkitTestApplication application;
495 auto control = Control::New();
497 auto reading_info_type = DevelControl::GetAccessibilityReadingInfoType(control);
499 for(auto i = 0u; i < 4; ++i)
500 DALI_TEST_CHECK(reading_info_type[static_cast<Dali::Accessibility::ReadingInfoType>(i)]);
502 reading_info_type[Dali::Accessibility::ReadingInfoType::DESCRIPTION] = false;
503 reading_info_type[Dali::Accessibility::ReadingInfoType::STATE] = false;
504 reading_info_type[Dali::Accessibility::ReadingInfoType::NAME] = false;
505 reading_info_type[Dali::Accessibility::ReadingInfoType::ROLE] = false;
507 DevelControl::SetAccessibilityReadingInfoType(control, reading_info_type);
509 reading_info_type = DevelControl::GetAccessibilityReadingInfoType(control);
511 for(auto i = 0u; i < 4; ++i)
512 DALI_TEST_CHECK(false == reading_info_type[static_cast<Dali::Accessibility::ReadingInfoType>(i)]);
514 reading_info_type[Dali::Accessibility::ReadingInfoType::DESCRIPTION] = true;
515 reading_info_type[Dali::Accessibility::ReadingInfoType::STATE] = true;
516 reading_info_type[Dali::Accessibility::ReadingInfoType::NAME] = true;
517 reading_info_type[Dali::Accessibility::ReadingInfoType::ROLE] = true;
519 DevelControl::SetAccessibilityReadingInfoType(control, reading_info_type);
521 auto q = control.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
524 DALI_TEST_EQUALS((z->Find("reading_info_type"))->Get<std::string>(), "name|role|description|state", TEST_LOCATION);
525 reading_info_type = DevelControl::GetAccessibilityReadingInfoType(control);
526 for(auto i = 0u; i < 4; ++i)
527 DALI_TEST_CHECK(reading_info_type[static_cast<Dali::Accessibility::ReadingInfoType>(i)]);
532 int UtcDaliControlDoGesture(void)
534 ToolkitTestApplication application;
535 auto control = Control::New();
536 Dali::Accessibility::TestEnableSC(true);
538 auto accessible = Dali::Accessibility::Accessible::Get(control);
539 auto gesture_one = Dali::Accessibility::GestureInfo{Dali::Accessibility::Gesture::ONE_FINGER_FLICK_LEFT, 600, 100, 500, 500, Dali::Accessibility::GestureState::BEGIN, 1000};
540 auto gesture_two = Dali::Accessibility::GestureInfo{Dali::Accessibility::Gesture::ONE_FINGER_FLICK_RIGHT, 600, 100, 500, 500, Dali::Accessibility::GestureState::BEGIN, 1000};
542 DALI_TEST_CHECK(!accessible->DoGesture(gesture_one));
543 DALI_TEST_CHECK(!TestDoGesture(accessible->GetAddress(), Dali::Accessibility::Gesture::ONE_FINGER_FLICK_LEFT, 600, 100, 500, 500, Dali::Accessibility::GestureState::BEGIN, 1000));
545 DevelControl::AccessibilityDoGestureSignal(control).Connect([](std::pair<Dali::Accessibility::GestureInfo, bool>& gesture) {
546 if(gesture.first.type == Dali::Accessibility::Gesture::ONE_FINGER_FLICK_LEFT)
547 gesture.second = true;
549 gesture.second = false;
552 DALI_TEST_CHECK(accessible->DoGesture(gesture_one));
553 DALI_TEST_CHECK(TestDoGesture(accessible->GetAddress(), Dali::Accessibility::Gesture::ONE_FINGER_FLICK_LEFT, 600, 100, 500, 500, Dali::Accessibility::GestureState::BEGIN, 1000));
555 DALI_TEST_CHECK(!accessible->DoGesture(gesture_two));
556 DALI_TEST_CHECK(!TestDoGesture(accessible->GetAddress(), Dali::Accessibility::Gesture::ONE_FINGER_FLICK_RIGHT, 600, 100, 500, 500, Dali::Accessibility::GestureState::BEGIN, 1000));
558 Dali::Accessibility::TestEnableSC(false);
563 int UtcDaliAccessibilityRelation(void)
565 ToolkitTestApplication application;
566 Dali::Accessibility::TestEnableSC(true);
568 auto rel = Accessibility::RelationType::FLOWS_TO;
569 auto control = Control::New();
570 auto destination1 = Control::New();
571 auto destination2 = Control::New();
573 DevelControl::AppendAccessibilityRelation(control, destination1, rel);
574 auto relations = DevelControl::GetAccessibilityRelations(control);
575 DALI_TEST_EQUALS(relations.size(), 1u, TEST_LOCATION);
576 DALI_TEST_EQUALS(relations[0].mRelationType, rel, TEST_LOCATION);
577 DALI_TEST_EQUALS(relations[0].mTargets.size(), 1u, TEST_LOCATION);
579 DevelControl::AppendAccessibilityRelation(control, destination2, rel);
580 relations = DevelControl::GetAccessibilityRelations(control);
581 DALI_TEST_EQUALS(relations.size(), 1u, TEST_LOCATION);
582 DALI_TEST_EQUALS(relations[0].mRelationType, rel, TEST_LOCATION);
583 DALI_TEST_EQUALS(relations[0].mTargets.size(), 2u, TEST_LOCATION);
585 auto accessible = Dali::Accessibility::Accessible::Get(control);
586 auto accessible_destination1 = Dali::Accessibility::Accessible::Get(destination1);
587 auto accessible_destination2 = Dali::Accessibility::Accessible::Get(destination2);
588 auto relationset = accessible->GetRelationSet();
590 DALI_TEST_CHECK(relationset[0].mRelationType == rel);
591 DALI_TEST_CHECK(relationset[0].mTargets[0] == accessible_destination1 || relationset[0].mTargets[1] == accessible_destination1);
592 DALI_TEST_CHECK(relationset[0].mTargets[0] == accessible_destination2 || relationset[0].mTargets[1] == accessible_destination2);
594 auto relationset_bridge = TestGetRelationSet(accessible->GetAddress());
595 DALI_TEST_CHECK(static_cast<uint32_t>(relationset[0].mRelationType) == std::get<0>(relationset_bridge[0]));
597 DALI_TEST_CHECK(relationset[0].mTargets[0]->GetAddress() == std::get<1>(relationset_bridge[0])[0] || relationset[0].mTargets[1]->GetAddress() == std::get<1>(relationset_bridge[0])[0]);
598 DALI_TEST_CHECK(relationset[0].mTargets[0]->GetAddress() == std::get<1>(relationset_bridge[0])[1] || relationset[0].mTargets[1]->GetAddress() == std::get<1>(relationset_bridge[0])[1]);
600 DevelControl::RemoveAccessibilityRelation(control, destination2, rel);
601 relations = DevelControl::GetAccessibilityRelations(control);
602 DALI_TEST_EQUALS(relations.size(), 1u, TEST_LOCATION);
603 DALI_TEST_EQUALS(relations[0].mTargets.size(), 1u, TEST_LOCATION);
605 DevelControl::ClearAccessibilityRelations(control);
606 relations = DevelControl::GetAccessibilityRelations(control);
607 DALI_TEST_EQUALS(relations.size(), 0u, TEST_LOCATION);
609 Dali::Accessibility::TestEnableSC(false);
614 int UtcDaliAccessibilityParentChildren(void)
616 ToolkitTestApplication application;
617 Dali::Accessibility::TestEnableSC(true);
619 auto parent = Control::New();
620 auto child_1 = Control::New();
621 auto child_2 = Control::New();
623 auto parent_accessible = Dali::Accessibility::Accessible::Get(parent);
624 auto child_1_accessible = Dali::Accessibility::Accessible::Get(child_1);
625 auto child_2_accessible = Dali::Accessibility::Accessible::Get(child_2);
627 auto children = TestGetChildren(parent_accessible->GetAddress());
628 DALI_TEST_EQUALS(children.size(), 0, TEST_LOCATION);
632 TestGetIndexInParent(child_1_accessible->GetAddress());
633 DALI_ABORT("Object has parent, test abort");
635 catch(TestDBusWrapper::error&)
641 TestGetChildAtIndex(parent_accessible->GetAddress(), -1);
642 DALI_ABORT("Positive index, test abort");
644 catch(TestDBusWrapper::error&)
648 DALI_TEST_EQUALS(parent_accessible->GetChildCount(), 0, TEST_LOCATION);
652 child_1_accessible->GetIndexInParent();
653 DALI_ABORT("Object has parent, test abort");
655 catch(const std::domain_error&)
662 children = TestGetChildren(parent_accessible->GetAddress());
663 DALI_TEST_EQUALS(children.size(), 2, TEST_LOCATION);
665 DALI_TEST_EQUALS(parent_accessible->GetAddress(), TestGetParent(child_1_accessible->GetAddress()), TEST_LOCATION);
666 DALI_TEST_EQUALS(child_2_accessible->GetAddress(), TestGetChildAtIndex(parent_accessible->GetAddress(), TestGetIndexInParent(child_2_accessible->GetAddress())), TEST_LOCATION);
668 DALI_TEST_EQUALS(parent_accessible, child_1_accessible->GetParent(), TEST_LOCATION);
669 DALI_TEST_EQUALS(child_2_accessible, parent_accessible->GetChildAtIndex(child_2_accessible->GetIndexInParent()), TEST_LOCATION);
671 Dali::Accessibility::TestEnableSC(false);
676 int UtcDaliAccessibilityGetLayer(void)
678 ToolkitTestApplication application;
680 Dali::Accessibility::TestEnableSC(true);
682 auto control = Control::New();
683 auto accessible_obj = Dali::Accessibility::Accessible::Get(control);
684 auto accessible_component = dynamic_cast<Dali::Accessibility::Component*>(accessible_obj);
685 DALI_TEST_CHECK(accessible_component);
686 DALI_TEST_EQUALS(Dali::Accessibility::ComponentLayer::WINDOW, accessible_component->GetLayer(), TEST_LOCATION);
687 DALI_TEST_EQUALS(Dali::Accessibility::ComponentLayer::WINDOW, TestGetLayer(accessible_component->GetAddress()), TEST_LOCATION);
689 Dali::Accessibility::TestEnableSC(false);
694 int UtcDaliAccessibilityGrabFocus(void)
696 ToolkitTestApplication application;
698 Dali::Accessibility::TestEnableSC(true);
700 auto controla = Control::New();
701 auto controlb = Control::New();
703 Stage::GetCurrent().Add(controla);
704 Stage::GetCurrent().Add(controlb);
706 controla.SetProperty(Actor::Property::KEYBOARD_FOCUSABLE, true);
707 controlb.SetProperty(Actor::Property::KEYBOARD_FOCUSABLE, true);
709 auto a = Dali::Accessibility::Accessible::Get(controla);
710 auto b = Dali::Accessibility::Accessible::Get(controlb);
712 auto a_component = dynamic_cast<Dali::Accessibility::Component*>(a);
713 auto b_component = dynamic_cast<Dali::Accessibility::Component*>(b);
715 auto states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a_component->GetAddress())};
716 auto states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b_component->GetAddress())};
718 DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::FOCUSED]);
719 DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::FOCUSED]);
721 DALI_TEST_CHECK(a_component->GrabFocus());
723 states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a_component->GetAddress())};
724 states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b_component->GetAddress())};
726 DALI_TEST_CHECK(states_by_bridge_a[Dali::Accessibility::State::FOCUSED]);
727 DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::FOCUSED]);
729 DALI_TEST_CHECK(TestGrabFocus(b_component->GetAddress()));
731 states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a_component->GetAddress())};
732 states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b_component->GetAddress())};
734 DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::FOCUSED]);
735 DALI_TEST_CHECK(states_by_bridge_b[Dali::Accessibility::State::FOCUSED]);
737 Dali::Accessibility::TestEnableSC(false);
742 int UtcDaliAccessibilityGetExtentsScreenAndWindowPositionMatch(void)
744 ToolkitTestApplication application;
745 tet_infoline("UtcDaliAccessibilityGetExtentsScreenAndWindowPositionMatch");
747 Dali::Accessibility::TestEnableSC(true);
749 auto control = Control::New();
750 Stage::GetCurrent().GetRootLayer().Add(control);
752 auto window = Dali::DevelWindow::Get(control);
753 DALI_TEST_CHECK(window);
755 //window.SetPosition({0,0});
756 DevelWindow::SetPositionSize(window, PositionSize(0, 0, 480, 240));
758 control.SetProperty(Actor::Property::POSITION, Vector3(10, 10, 100));
759 control.SetProperty(Actor::Property::SIZE, Vector2(10, 10));
761 application.SendNotification();
762 application.Render(1);
764 auto a = Dali::Accessibility::Accessible::Get(control);
765 auto a_component = dynamic_cast<Dali::Accessibility::Component*>(a);
767 auto extents = a_component->GetExtents(Dali::Accessibility::CoordinateType::SCREEN);
768 DALI_TEST_EQUALS(extents.x, 5.0f, TEST_LOCATION);
769 DALI_TEST_EQUALS(extents.y, 5.0f, TEST_LOCATION);
770 DALI_TEST_EQUALS(extents.height, 10.0f, TEST_LOCATION);
771 DALI_TEST_EQUALS(extents.width, 10.0f, TEST_LOCATION);
773 auto bridge_extents = TestGetExtents(a_component->GetAddress(), Dali::Accessibility::CoordinateType::SCREEN);
774 DALI_TEST_EQUALS(std::get<0>(bridge_extents), 5, TEST_LOCATION);
775 DALI_TEST_EQUALS(std::get<1>(bridge_extents), 5, TEST_LOCATION);
776 DALI_TEST_EQUALS(std::get<2>(bridge_extents), 10, TEST_LOCATION);
777 DALI_TEST_EQUALS(std::get<3>(bridge_extents), 10, TEST_LOCATION);
779 extents = a_component->GetExtents(Dali::Accessibility::CoordinateType::WINDOW);
780 DALI_TEST_EQUALS(extents.x, 5.0f, TEST_LOCATION);
781 DALI_TEST_EQUALS(extents.y, 5.0f, TEST_LOCATION);
782 DALI_TEST_EQUALS(extents.height, 10.0f, TEST_LOCATION);
783 DALI_TEST_EQUALS(extents.width, 10.0f, TEST_LOCATION);
785 bridge_extents = TestGetExtents(a_component->GetAddress(), Dali::Accessibility::CoordinateType::WINDOW);
786 DALI_TEST_EQUALS(std::get<0>(bridge_extents), 5, TEST_LOCATION);
787 DALI_TEST_EQUALS(std::get<1>(bridge_extents), 5, TEST_LOCATION);
788 DALI_TEST_EQUALS(std::get<2>(bridge_extents), 10, TEST_LOCATION);
789 DALI_TEST_EQUALS(std::get<3>(bridge_extents), 10, TEST_LOCATION);
791 control.SetProperty(Dali::DevelActor::Property::POSITION_USES_ANCHOR_POINT, false);
792 application.SendNotification();
793 application.Render(1);
795 extents = a_component->GetExtents(Dali::Accessibility::CoordinateType::SCREEN);
796 DALI_TEST_EQUALS(extents.x, 10.0f, TEST_LOCATION);
797 DALI_TEST_EQUALS(extents.y, 10.0f, TEST_LOCATION);
798 DALI_TEST_EQUALS(extents.height, 10.0f, TEST_LOCATION);
799 DALI_TEST_EQUALS(extents.width, 10.0f, TEST_LOCATION);
801 bridge_extents = TestGetExtents(a_component->GetAddress(), Dali::Accessibility::CoordinateType::SCREEN);
802 DALI_TEST_EQUALS(std::get<0>(bridge_extents), 10, TEST_LOCATION);
803 DALI_TEST_EQUALS(std::get<1>(bridge_extents), 10, TEST_LOCATION);
804 DALI_TEST_EQUALS(std::get<2>(bridge_extents), 10, TEST_LOCATION);
805 DALI_TEST_EQUALS(std::get<3>(bridge_extents), 10, TEST_LOCATION);
807 extents = a_component->GetExtents(Dali::Accessibility::CoordinateType::WINDOW);
808 DALI_TEST_EQUALS(extents.x, 10.0f, TEST_LOCATION);
809 DALI_TEST_EQUALS(extents.y, 10.0f, TEST_LOCATION);
810 DALI_TEST_EQUALS(extents.height, 10.0f, TEST_LOCATION);
811 DALI_TEST_EQUALS(extents.width, 10.0f, TEST_LOCATION);
813 bridge_extents = TestGetExtents(a_component->GetAddress(), Dali::Accessibility::CoordinateType::WINDOW);
814 DALI_TEST_EQUALS(std::get<0>(bridge_extents), 10, TEST_LOCATION);
815 DALI_TEST_EQUALS(std::get<1>(bridge_extents), 10, TEST_LOCATION);
816 DALI_TEST_EQUALS(std::get<2>(bridge_extents), 10, TEST_LOCATION);
817 DALI_TEST_EQUALS(std::get<3>(bridge_extents), 10, TEST_LOCATION);
819 Dali::Accessibility::TestEnableSC(false);
824 int UtcDaliAccessibilityGetExtentsScreenAndWindowPositionDoNotMatch(void)
826 ToolkitTestApplication application;
828 Dali::Accessibility::TestEnableSC(true);
830 auto control = Control::New();
831 Stage::GetCurrent().GetRootLayer().Add(control);
832 auto window = Dali::DevelWindow::Get(control);
833 //window.SetPosition({33,33});
834 DevelWindow::SetPositionSize(window, PositionSize(33, 33, 480, 240));
836 control.SetProperty(Actor::Property::POSITION, Vector3(10, 10, 100));
837 control.SetProperty(Actor::Property::SIZE, Vector2(10, 10));
839 application.SendNotification();
840 application.Render(1);
842 auto a = Dali::Accessibility::Accessible::Get(control);
843 auto a_component = dynamic_cast<Dali::Accessibility::Component*>(a);
845 auto extents = a_component->GetExtents(Dali::Accessibility::CoordinateType::SCREEN);
846 DALI_TEST_EQUALS(extents.x, 38.0f, TEST_LOCATION);
847 DALI_TEST_EQUALS(extents.y, 38.0f, TEST_LOCATION);
848 DALI_TEST_EQUALS(extents.height, 10.0f, TEST_LOCATION);
849 DALI_TEST_EQUALS(extents.width, 10.0f, TEST_LOCATION);
851 auto bridge_extents = TestGetExtents(a_component->GetAddress(), Dali::Accessibility::CoordinateType::SCREEN);
852 DALI_TEST_EQUALS(std::get<0>(bridge_extents), 38, TEST_LOCATION);
853 DALI_TEST_EQUALS(std::get<1>(bridge_extents), 38, TEST_LOCATION);
854 DALI_TEST_EQUALS(std::get<2>(bridge_extents), 10, TEST_LOCATION);
855 DALI_TEST_EQUALS(std::get<3>(bridge_extents), 10, TEST_LOCATION);
857 extents = a_component->GetExtents(Dali::Accessibility::CoordinateType::WINDOW);
858 DALI_TEST_EQUALS(extents.x, 5.0f, TEST_LOCATION);
859 DALI_TEST_EQUALS(extents.y, 5.0f, TEST_LOCATION);
860 DALI_TEST_EQUALS(extents.height, 10.0f, TEST_LOCATION);
861 DALI_TEST_EQUALS(extents.width, 10.0f, TEST_LOCATION);
863 bridge_extents = TestGetExtents(a_component->GetAddress(), Dali::Accessibility::CoordinateType::WINDOW);
864 DALI_TEST_EQUALS(std::get<0>(bridge_extents), 5, TEST_LOCATION);
865 DALI_TEST_EQUALS(std::get<1>(bridge_extents), 5, TEST_LOCATION);
866 DALI_TEST_EQUALS(std::get<2>(bridge_extents), 10, TEST_LOCATION);
867 DALI_TEST_EQUALS(std::get<3>(bridge_extents), 10, TEST_LOCATION);
869 control.SetProperty(Dali::DevelActor::Property::POSITION_USES_ANCHOR_POINT, false);
870 application.SendNotification();
871 application.Render(1);
873 extents = a_component->GetExtents(Dali::Accessibility::CoordinateType::SCREEN);
874 DALI_TEST_EQUALS(extents.x, 43.0f, TEST_LOCATION);
875 DALI_TEST_EQUALS(extents.y, 43.0f, TEST_LOCATION);
876 DALI_TEST_EQUALS(extents.height, 10.0f, TEST_LOCATION);
877 DALI_TEST_EQUALS(extents.width, 10.0f, TEST_LOCATION);
879 bridge_extents = TestGetExtents(a_component->GetAddress(), Dali::Accessibility::CoordinateType::SCREEN);
880 DALI_TEST_EQUALS(std::get<0>(bridge_extents), 43, TEST_LOCATION);
881 DALI_TEST_EQUALS(std::get<1>(bridge_extents), 43, TEST_LOCATION);
882 DALI_TEST_EQUALS(std::get<2>(bridge_extents), 10, TEST_LOCATION);
883 DALI_TEST_EQUALS(std::get<3>(bridge_extents), 10, TEST_LOCATION);
885 extents = a_component->GetExtents(Dali::Accessibility::CoordinateType::WINDOW);
886 DALI_TEST_EQUALS(extents.x, 10.0f, TEST_LOCATION);
887 DALI_TEST_EQUALS(extents.y, 10.0f, TEST_LOCATION);
888 DALI_TEST_EQUALS(extents.height, 10.0f, TEST_LOCATION);
889 DALI_TEST_EQUALS(extents.width, 10.0f, TEST_LOCATION);
891 bridge_extents = TestGetExtents(a_component->GetAddress(), Dali::Accessibility::CoordinateType::WINDOW);
892 DALI_TEST_EQUALS(std::get<0>(bridge_extents), 10, TEST_LOCATION);
893 DALI_TEST_EQUALS(std::get<1>(bridge_extents), 10, TEST_LOCATION);
894 DALI_TEST_EQUALS(std::get<2>(bridge_extents), 10, TEST_LOCATION);
895 DALI_TEST_EQUALS(std::get<3>(bridge_extents), 10, TEST_LOCATION);
897 Dali::Accessibility::TestEnableSC(false);
902 int UtcDaliAccessibilityGetAlpha(void)
904 ToolkitTestApplication application;
906 Dali::Accessibility::TestEnableSC(true);
908 auto control = Control::New();
909 auto a = Dali::Accessibility::Accessible::Get(control);
910 auto a_component = dynamic_cast<Dali::Accessibility::Component*>(a);
912 DALI_TEST_EQUALS(0.0, a_component->GetAlpha(), TEST_LOCATION);
913 DALI_TEST_EQUALS(0.0, TestGetAlpha(a_component->GetAddress()), TEST_LOCATION);
915 Dali::Accessibility::TestEnableSC(false);
920 int UtcDaliAccessibilityGetMdiZOrder(void)
922 ToolkitTestApplication application;
924 Dali::Accessibility::TestEnableSC(true);
926 auto control = Control::New();
927 auto a = Dali::Accessibility::Accessible::Get(control);
928 auto a_component = dynamic_cast<Dali::Accessibility::Component*>(a);
930 DALI_TEST_EQUALS(0, static_cast<int>(a_component->GetMdiZOrder()), TEST_LOCATION);
931 DALI_TEST_EQUALS(0, TestGetMdiZOrder(a_component->GetAddress()), TEST_LOCATION);
933 Dali::Accessibility::TestEnableSC(false);
938 int UtcDaliAccessibilityAction(void)
940 ToolkitTestApplication application;
942 Dali::Accessibility::TestEnableSC(true);
944 auto control = Control::New();
945 auto a = Dali::Accessibility::Accessible::Get(control);
946 auto b = dynamic_cast<Dali::Accessibility::Action*>(a);
948 std::vector<std::string> actions{"activate", "accessibilityActivated", "ReadingSkipped", "ReadingCancelled", "ReadingStopped", "ReadingPaused", "ReadingResumed", "show", "hide"};
949 auto count = b->GetActionCount();
951 DALI_TEST_EQUALS(count, 9, TEST_LOCATION);
953 for(auto i = 0u; i < count; ++i)
955 DALI_TEST_CHECK(Dali::Accessibility::Find(actions, b->GetActionName(i)));
956 DALI_TEST_EQUALS(b->GetActionName(i), b->GetLocalizedActionName(i), TEST_LOCATION);
957 DALI_TEST_EQUALS(b->GetActionDescription(i), "", TEST_LOCATION);
958 DALI_TEST_EQUALS(b->GetActionKeyBinding(i), "", TEST_LOCATION);
961 // Empty strings should be returned for invalid indices
962 DALI_TEST_EQUALS(b->GetActionDescription(count), "", TEST_LOCATION);
963 DALI_TEST_EQUALS(b->GetActionName(count), "", TEST_LOCATION);
964 DALI_TEST_EQUALS(b->GetLocalizedActionName(count), "", TEST_LOCATION);
965 DALI_TEST_EQUALS(b->GetActionKeyBinding(count), "", TEST_LOCATION);
967 count = TestGetActionCount(b->GetAddress());
969 DALI_TEST_EQUALS(count, 9, TEST_LOCATION);
971 for(auto i = 0u; i < count; ++i)
973 DALI_TEST_CHECK(Dali::Accessibility::Find(actions, TestGetActionName(b->GetAddress(), i)));
974 DALI_TEST_EQUALS(TestGetActionName(b->GetAddress(), i), TestGetLocalizedActionName(b->GetAddress(), i), TEST_LOCATION);
975 DALI_TEST_EQUALS(TestGetActionDescription(b->GetAddress(), i), "", TEST_LOCATION);
976 DALI_TEST_EQUALS(TestGetActionKeyBinding(b->GetAddress(), i), "", TEST_LOCATION);
979 DALI_TEST_EQUALS(TestGetActionDescription(b->GetAddress(), count), "", TEST_LOCATION);
980 DALI_TEST_EQUALS(TestGetActionName(b->GetAddress(), count), "", TEST_LOCATION);
981 DALI_TEST_EQUALS(TestGetLocalizedActionName(b->GetAddress(), count), "", TEST_LOCATION);
982 DALI_TEST_EQUALS(TestGetActionKeyBinding(b->GetAddress(), count), "", TEST_LOCATION);
984 Dali::Accessibility::TestEnableSC(false);
989 int UtcDaliAccessibilityDoAction(void)
991 ToolkitTestApplication application;
993 Dali::Accessibility::TestEnableSC(true);
994 thread_local std::vector<bool> actions_done{false, false, false, false, false, false};
996 auto control = Control::New();
997 auto a = Dali::Accessibility::Accessible::Get(control);
998 auto b = dynamic_cast<Dali::Accessibility::Action*>(a);
999 std::vector<std::string> actions{"activate", "accessibilityActivated", "ReadingSkipped", "ReadingCancelled", "ReadingStopped", "ReadingPaused", "ReadingResumed", "show", "hide"};
1001 // Test calling action by name
1002 DALI_TEST_CHECK(b->DoAction(actions[2])); // ReadingSkipped
1003 DALI_TEST_CHECK(b->DoAction(actions[4])); // ReadingStopped
1004 DALI_TEST_CHECK(b->DoAction(actions[4])); // ReadingStopped
1006 // Negative test of calling action with not defined name
1007 DALI_TEST_CHECK(!b->DoAction("undefined"));
1009 DevelControl::AccessibilityReadingSkippedSignal(control).Connect([]() {
1010 actions_done[1] = true;
1012 DevelControl::AccessibilityReadingCancelledSignal(control).Connect([]() {
1013 actions_done[2] = true;
1015 DevelControl::AccessibilityReadingStoppedSignal(control).Connect([]() {
1016 actions_done[3] = true;
1018 DevelControl::AccessibilityReadingPausedSignal(control).Connect([]() {
1019 actions_done[4] = true;
1021 DevelControl::AccessibilityReadingResumedSignal(control).Connect([]() {
1022 actions_done[5] = true;
1024 DevelControl::AccessibilityActivateSignal(control).Connect([]() {
1025 actions_done[0] = true;
1028 // Test calling action by index
1029 DALI_TEST_CHECK(b->DoAction(1));
1030 DALI_TEST_CHECK(b->DoAction(2));
1031 DALI_TEST_CHECK(b->DoAction(3));
1032 DALI_TEST_CHECK(b->DoAction(4));
1033 DALI_TEST_CHECK(b->DoAction(5));
1034 DALI_TEST_CHECK(b->DoAction(6));
1036 for(auto i = 0u; i < actions_done.size(); ++i)
1038 DALI_TEST_CHECK(actions_done[i]);
1039 actions_done[i] = false;
1042 DALI_TEST_CHECK(TestDoAction(b->GetAddress(), 1));
1043 DALI_TEST_CHECK(TestDoAction(b->GetAddress(), 2));
1044 DALI_TEST_CHECK(TestDoAction(b->GetAddress(), 3));
1045 DALI_TEST_CHECK(TestDoAction(b->GetAddress(), 4));
1046 DALI_TEST_CHECK(TestDoAction(b->GetAddress(), 5));
1047 DALI_TEST_CHECK(TestDoAction(b->GetAddress(), 6));
1049 for(auto i = 0u; i < actions_done.size(); ++i)
1051 DALI_TEST_CHECK(actions_done[i]);
1052 actions_done[i] = false;
1055 DALI_TEST_CHECK(TestDoAction(b->GetAddress(), actions[1]));
1056 DALI_TEST_CHECK(TestDoAction(b->GetAddress(), actions[2]));
1057 DALI_TEST_CHECK(TestDoAction(b->GetAddress(), actions[3]));
1058 DALI_TEST_CHECK(TestDoAction(b->GetAddress(), actions[4]));
1059 DALI_TEST_CHECK(TestDoAction(b->GetAddress(), actions[5]));
1060 DALI_TEST_CHECK(TestDoAction(b->GetAddress(), actions[6]));
1062 for(auto i = 0u; i < actions_done.size(); ++i)
1063 DALI_TEST_CHECK(actions_done[i]);
1065 Dali::Accessibility::TestEnableSC(false);
1070 void TestVoidCallback()
1074 int UtcDaliAccessibilitySignals(void)
1076 ToolkitTestApplication application;
1077 ConnectionTracker connectionTracker;
1078 Control control = Control::New();
1080 DALI_TEST_CHECK(DevelControl::AccessibilityGetNameSignal(control).Empty());
1081 control.ConnectSignal(&connectionTracker, "getName", &TestVoidCallback);
1082 DALI_TEST_CHECK(!DevelControl::AccessibilityGetNameSignal(control).Empty());
1084 DALI_TEST_CHECK(DevelControl::AccessibilityGetDescriptionSignal(control).Empty());
1085 control.ConnectSignal(&connectionTracker, "getDescription", &TestVoidCallback);
1086 DALI_TEST_CHECK(!DevelControl::AccessibilityGetDescriptionSignal(control).Empty());
1088 DALI_TEST_CHECK(DevelControl::AccessibilityDoGestureSignal(control).Empty());
1089 control.ConnectSignal(&connectionTracker, "doGesture", &TestVoidCallback);
1090 DALI_TEST_CHECK(!DevelControl::AccessibilityDoGestureSignal(control).Empty());
1095 static void Wait(ToolkitTestApplication& application)
1097 application.SendNotification();
1098 application.Render(16);
1101 int UtcDaliAccessibilityScrollToChildScrollView(void)
1103 ToolkitTestApplication application;
1104 Dali::Accessibility::TestEnableSC(true);
1106 ScrollView scrollView = ScrollView::New();
1107 application.GetScene().Add(scrollView);
1109 PushButton actorA = PushButton::New();
1110 const Dali::Vector3 positionA = Vector3(100.0f, 400.0f, 0.0f);
1111 actorA.SetProperty(Dali::Actor::Property::POSITION, positionA);
1112 scrollView.Add(actorA);
1114 PushButton actorB = PushButton::New();
1115 const Dali::Vector3 positionB = Vector3(500.0f, 200.0f, 0.0f);
1116 actorB.SetProperty(Dali::Actor::Property::POSITION, positionB);
1117 scrollView.Add(actorB);
1119 TableView tableView = TableView::New(2, 2); // 2 by 2 grid.
1120 tableView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
1121 scrollView.Add(tableView);
1123 PushButton actorC = PushButton::New();
1124 actorC.SetProperty(Actor::Property::SIZE, Vector2(50.0f, 50.0f));
1125 tableView.AddChild(actorC, TableView::CellPosition(0, 0));
1127 PushButton actorD = PushButton::New();
1128 application.GetScene().Add(actorD);
1132 auto* accessibleParent = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(scrollView));
1133 DALI_TEST_CHECK(accessibleParent);
1134 auto* accessibleA = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(actorA));
1135 DALI_TEST_CHECK(accessibleA);
1136 auto* accessibleB = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(actorB));
1137 DALI_TEST_CHECK(accessibleB);
1138 auto* accessibleC = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(actorC));
1139 DALI_TEST_CHECK(accessibleC);
1141 accessibleA->GrabHighlight(); // == scrollView.ScrollTo(actorA)
1143 accessibleB->GrabHighlight(); // == scrollView.ScrollTo(actorB)
1146 // scrollView is ancestor of actorC
1147 // This should work without a crash
1148 accessibleC->GrabHighlight(); // == scrollView.ScrollTo(actorC)
1151 // negative testcase calling ScrollToChild using non-child actor
1152 accessibleParent->ScrollToChild(actorD);
1154 Dali::Accessibility::TestEnableSC(false);
1160 class TestItemFactory : public ItemFactory
1167 unsigned int GetNumberOfItems() override
1172 Dali::Actor NewItem(unsigned int itemId) override
1174 return TextLabel::New(std::to_string(itemId));
1179 int UtcDaliAccessibilityScrollToChildItemView(void)
1181 ToolkitTestApplication application;
1182 Dali::Accessibility::TestEnableSC(true);
1184 TestItemFactory factory;
1185 ItemView view = ItemView::New(factory);
1186 Dali::Vector3 vec(480.0f, 800.0f, 0.0f);
1187 ItemLayoutPtr layout = DefaultItemLayout::New(DefaultItemLayout::DEPTH);
1189 view.AddLayout(*layout);
1190 view.SetProperty(Actor::Property::SIZE, vec);
1192 application.GetScene().Add(view);
1193 layout->SetOrientation(ControlOrientation::Down);
1194 view.ActivateLayout(0, vec, 0.0f);
1198 auto* accessibleParent = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(view));
1199 DALI_TEST_CHECK(accessibleParent);
1200 auto* accessibleA = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(view.GetItem(0)));
1201 DALI_TEST_CHECK(accessibleA);
1202 auto* accessibleB = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(view.GetItem(1)));
1203 DALI_TEST_CHECK(accessibleB);
1205 accessibleA->GrabHighlight(); // == view.ScrollToItem(view.GetItemId(actorA))
1207 accessibleB->GrabHighlight(); // == view.ScrollToItem(view.GetItemId(actorB))
1210 Dali::Accessibility::TestEnableSC(false);
1214 int UtcDaliAccessibilityScrollToChildNonScrollable(void)
1216 ToolkitTestApplication application;
1217 Dali::Accessibility::TestEnableSC(true);
1219 TextLabel label = TextLabel::New("123");
1221 auto* accessible = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(label));
1222 DALI_TEST_CHECK(accessible);
1224 DALI_TEST_EQUALS(accessible->IsScrollable(), false, TEST_LOCATION);
1225 DALI_TEST_EQUALS(accessible->ScrollToChild({}), false, TEST_LOCATION);
1226 DALI_TEST_EQUALS(accessible->GetInternalActor(), label, TEST_LOCATION);
1228 Dali::Accessibility::TestEnableSC(false);
1232 int UtcDaliAccessibilityCheckHighlight(void)
1234 ToolkitTestApplication application;
1235 Dali::Accessibility::TestEnableSC(true);
1236 Dali::Accessibility::TestResetMoveOutedCalled();
1238 // Make precondition two children exist in parent area
1239 PushButton parentButton = PushButton::New();
1240 parentButton.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_TO_BOUNDING_BOX);
1241 parentButton.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
1242 parentButton.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
1243 parentButton.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, 0.0f));
1244 parentButton.SetProperty(Actor::Property::SIZE, Dali::Vector2(100.0f, 200.0f));
1245 application.GetScene().Add(parentButton);
1247 PushButton buttonA = PushButton::New();
1248 buttonA.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
1249 buttonA.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
1250 buttonA.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, 0.0f));
1251 buttonA.SetProperty(Actor::Property::SIZE, Dali::Vector2(100.0f, 100.0f));
1252 parentButton.Add(buttonA);
1254 PushButton buttonB = PushButton::New();
1255 buttonB.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
1256 buttonB.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
1257 buttonB.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, 100.0f));
1258 buttonB.SetProperty(Actor::Property::SIZE, Dali::Vector2(100.0f, 100.0f));
1259 parentButton.Add(buttonB);
1262 // Set highlight to first child (A) to enable movement tracking
1263 auto* accessible = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(buttonA));
1264 DALI_TEST_CHECK(accessible);
1265 accessible->GrabHighlight();
1268 // 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
1269 buttonA.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, -200.0f));
1271 // Need one more notificaiton to get correct updated position
1272 application.SendNotification();
1273 DALI_TEST_EQUALS(true, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);
1275 // Reset verdict data
1276 Dali::Accessibility::TestResetMoveOutedCalled();
1278 // Move first child (A) outside of parent area (both start and end position are outside of parent area) - no move outed event expected for A object
1279 buttonA.SetProperty(Dali::Actor::Property::POSITION, Dali::Vector2(0.0f, -300.0f));
1281 // Need one more notificaiton to get correct updated position
1282 application.SendNotification();
1283 DALI_TEST_EQUALS(false, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);
1285 // Reset verdict data
1286 Dali::Accessibility::TestResetMoveOutedCalled();
1288 // Set highlight to second child (B) to enable movement tracking
1289 accessible = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(buttonB));
1290 DALI_TEST_CHECK(accessible);
1291 accessible->GrabHighlight();
1294 // Move second child (B) inside of parent area (both start and end position are inside of parent area) - no move outed event expected for B object
1295 // B: (0,100) --> (0, 50)
1296 buttonB.SetProperty(Dali::Actor::Property::POSITION, Dali::Vector2(0.0f, 50.0f));
1298 // Need one more notificaiton to get correct updated position
1299 application.SendNotification();
1300 DALI_TEST_EQUALS(false, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);
1302 // Reset verdict data
1303 Dali::Accessibility::TestResetMoveOutedCalled();
1305 // Move second child (B) out of parent area through the parent's area right edge - single move outed event expected for B object and OUTGOING_BOTTOM_RIGHT direction
1306 buttonB.SetProperty(Actor::Property::POSITION, Dali::Vector2(300.0f, 100.0f));
1308 // Need one more notificaiton to get correct updated position
1309 application.SendNotification();
1310 DALI_TEST_EQUALS(true, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);
1312 // Reset verdict data
1313 Dali::Accessibility::TestResetMoveOutedCalled();
1315 // Move second child (B) back into parent area (start position is outside but end position is inside of parent area) - no move outed event expected for B object
1316 // B: (300,100) --> (0, 100)
1317 buttonB.SetProperty(Dali::Actor::Property::POSITION, Dali::Vector2(0.0f, 100.0f));
1319 // Need one more seding notificaiton to get correct updated position
1320 application.SendNotification();
1321 DALI_TEST_EQUALS(false, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);
1323 // Reset verdict data
1324 Dali::Accessibility::TestResetMoveOutedCalled();
1326 // Disable movement tracking on B by giving highlight to A
1327 accessible = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(buttonA));
1328 DALI_TEST_CHECK(accessible);
1329 accessible->GrabHighlight();
1332 // Move B (untracked) out of parent area through the parent's area right edge - no move outed event expected for B object
1333 // B: (0,100) --> (300, 100)
1334 buttonB.SetProperty(Dali::Actor::Property::POSITION, Dali::Vector2(300.0f, 100.0f));
1336 // Need one more seding notificaiton to get correct updated position
1337 application.SendNotification();
1338 DALI_TEST_EQUALS(false, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);
1340 Dali::Accessibility::TestEnableSC(false);
1344 int UtcDaliWebViewAccessible(void)
1346 ToolkitTestApplication application;
1348 auto webView = Dali::Toolkit::WebView::New();
1349 auto webViewAccessible = Dali::Accessibility::Accessible::Get(webView);
1351 DALI_TEST_CHECK(webViewAccessible);
1353 auto children = webViewAccessible->GetChildren();
1355 DALI_TEST_CHECK(children.empty());
1357 Dali::Accessibility::TestEnableSC(true);
1359 children = webViewAccessible->GetChildren();
1361 DALI_TEST_EQUALS(children.size(), 1u, TEST_LOCATION);
1363 auto* child = children[0];
1365 DALI_TEST_CHECK(child);
1366 DALI_TEST_CHECK(child->IsProxy());
1367 DALI_TEST_EQUALS(child->GetParent(), webViewAccessible, TEST_LOCATION);
1369 auto address = child->GetAddress();
1371 DALI_TEST_CHECK(address);
1372 DALI_TEST_NOT_EQUALS(address.GetBus(), webViewAccessible->GetAddress().GetBus(), 0.0f, TEST_LOCATION);
1374 Dali::Accessibility::TestEnableSC(false);
1376 children = webViewAccessible->GetChildren();
1378 DALI_TEST_CHECK(children.empty());