f0a8b1cdb8cdb8bb46157b81b5ad8cff88b3fa65
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-Accessibility-Controls-BridgeUp.cpp
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>
18 #include <cstdlib>
19
20 using namespace Dali::Toolkit;
21
22 void utc_dali_accessibility_controls_bridge_up_startup(void)
23 {
24   test_return_value = TET_UNDEF;
25   DBusWrapper::Install(std::unique_ptr<DBusWrapper>(new TestDBusWrapper));
26 }
27
28 void utc_dali_accessibility_controls_bridge_up_cleanup(void)
29 {
30   test_return_value = TET_PASS;
31   //DBusWrapper::Install({}) is a de-install
32   DBusWrapper::Install({});
33 }
34
35 namespace Dali
36 {
37 namespace Accessibility
38 {
39 std::ostream& operator<<(std::ostream& stream, const Address& address)
40 {
41   stream << address.ToString();
42   return stream;
43 }
44 } // namespace Accessibility
45 } // namespace Dali
46
47 int UtcDaliControlAccessibilityRaiseBridge(void)
48 {
49   DALI_TEST_CHECK(!Accessibility::IsUp());
50
51   ToolkitTestApplication application;
52
53   Dali::Accessibility::TestEnableSC(true);
54
55   DALI_TEST_CHECK(Accessibility::IsUp());
56
57   // auto wr = static_cast<TestDBusWrapper*>(DBusWrapper::Installed());
58   // for(auto &a : wr->daliMethods) {
59   //   const char *mt;
60   //   if (std::get<3>(a.first) == MethodType::Method) mt = "MethodType::Method";
61   //   else if (std::get<3>(a.first) == MethodType::Getter) mt = "MethodType::Getter";
62   //   else if (std::get<3>(a.first) == MethodType::Setter) mt = "MethodType::Setter";
63   //   else assert(0);
64   //   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);
65   // }
66
67   Dali::Accessibility::TestEnableSC(false);
68
69   DALI_TEST_CHECK(!Accessibility::IsUp());
70
71   END_TEST;
72 }
73
74 int UtcDaliControlAccessibilityName(void)
75 {
76   ToolkitTestApplication application;
77
78   auto control = Control::New();
79   Stage::GetCurrent().Add(control);
80
81   auto q = Dali::Accessibility::Accessible::Get(control);
82   DALI_TEST_CHECK(q);
83
84   DALI_TEST_EQUALS("", q->GetName(), TEST_LOCATION);
85
86   control.SetProperty(DevelControl::Property::ACCESSIBILITY_NAME, "Accessibility_Name");
87   DALI_TEST_EQUALS("Accessibility_Name", q->GetName(), TEST_LOCATION);
88   DALI_TEST_EQUALS(control.GetProperty(DevelControl::Property::ACCESSIBILITY_NAME).Get<std::string>(), "Accessibility_Name", TEST_LOCATION);
89
90   auto nameChangeCallback = [](std::string& accessibilityName) { accessibilityName = "Accessibility_Name_With_Callback"; };
91
92   DevelControl::AccessibilityGetNameSignal(control).Connect(nameChangeCallback);
93
94   DALI_TEST_EQUALS("Accessibility_Name_With_Callback", q->GetName(), TEST_LOCATION);
95
96   Dali::Accessibility::TestEnableSC(true);
97
98   DALI_TEST_EQUALS("Accessibility_Name_With_Callback", TestGetName(q->GetAddress()), TEST_LOCATION);
99
100   DevelControl::AccessibilityGetNameSignal(control).Disconnect(nameChangeCallback);
101
102   auto i = dynamic_cast<Dali::Accessibility::Component*>(q);
103
104   DALI_TEST_CHECK(i);
105   i->GrabHighlight();
106
107   control.SetProperty(DevelControl::Property::ACCESSIBILITY_NAME, "Changed_Accessiblity_Name");
108   DALI_TEST_EQUALS("Changed_Accessiblity_Name", q->GetName(), TEST_LOCATION);
109   DALI_TEST_EQUALS(control.GetProperty(DevelControl::Property::ACCESSIBILITY_NAME).Get<std::string>(), "Changed_Accessiblity_Name", TEST_LOCATION);
110
111   //TODO test emission of name change signal
112   Dali::Accessibility::TestEnableSC(false);
113
114   END_TEST;
115 }
116
117 int UtcDaliControlAccessibilityDescription(void)
118 {
119   ToolkitTestApplication application;
120
121   auto control = Control::New();
122
123   auto q = Dali::Accessibility::Accessible::Get(control);
124   DALI_TEST_CHECK(q);
125
126   DALI_TEST_EQUALS("", q->GetDescription(), TEST_LOCATION);
127
128   control.SetProperty(DevelControl::Property::ACCESSIBILITY_DESCRIPTION, "Accessibility_Description");
129   DALI_TEST_EQUALS("Accessibility_Description", q->GetDescription(), TEST_LOCATION);
130
131   auto property = control.GetProperty(DevelControl::Property::ACCESSIBILITY_DESCRIPTION).Get<std::string>();
132   DALI_TEST_EQUALS("Accessibility_Description", property, TEST_LOCATION);
133
134   auto descriptionChangeCallback = [](std::string& accessibilityDescription) { accessibilityDescription = "Accessibility_Description_With_Callback"; };
135
136   DevelControl::AccessibilityGetDescriptionSignal(control).Connect(descriptionChangeCallback);
137
138   DALI_TEST_EQUALS("Accessibility_Description_With_Callback", q->GetDescription(), TEST_LOCATION);
139
140   Dali::Accessibility::TestEnableSC(true);
141
142   DALI_TEST_EQUALS("Accessibility_Description_With_Callback", TestGetDescription(q->GetAddress()), TEST_LOCATION);
143
144   DevelControl::AccessibilityGetDescriptionSignal(control).Disconnect(descriptionChangeCallback);
145
146   auto i = dynamic_cast<Dali::Accessibility::Component*>(q);
147
148   DALI_TEST_CHECK(i);
149   i->GrabHighlight();
150
151   control.SetProperty(DevelControl::Property::ACCESSIBILITY_DESCRIPTION, "Changed_Accessiblity_Description");
152   DALI_TEST_EQUALS("Changed_Accessiblity_Description", q->GetDescription(), TEST_LOCATION);
153   DALI_TEST_EQUALS(control.GetProperty(DevelControl::Property::ACCESSIBILITY_DESCRIPTION).Get<std::string>(), "Changed_Accessiblity_Description", TEST_LOCATION);
154
155   //TODO test emission of description change signal
156   Dali::Accessibility::TestEnableSC(false);
157
158   END_TEST;
159 }
160
161 int UtcDaliControlAccessibilityRole(void)
162 {
163   ToolkitTestApplication application;
164
165   auto control         = Control::New();
166   auto role_unknown    = Dali::Accessibility::Role::UNKNOWN;
167   auto role_pushbutton = Dali::Accessibility::Role::PUSH_BUTTON;
168
169   DALI_TEST_EQUALS(role_unknown, control.GetProperty(DevelControl::Property::ACCESSIBILITY_ROLE).Get<Dali::Accessibility::Role>(), TEST_LOCATION);
170
171   auto q = Dali::Accessibility::Accessible::Get(control);
172   DALI_TEST_EQUALS(role_unknown, q->GetRole(), TEST_LOCATION);
173   DALI_TEST_EQUALS("unknown", q->GetRoleName(), TEST_LOCATION);
174
175   Dali::Accessibility::TestEnableSC(true);
176   DALI_TEST_CHECK(q);
177   DALI_TEST_EQUALS(static_cast<uint32_t>(role_unknown), TestGetRole(q->GetAddress()), TEST_LOCATION);
178   DALI_TEST_EQUALS("unknown", TestGetRoleName(q->GetAddress()), TEST_LOCATION);
179   DALI_TEST_EQUALS("unknown", TestGetLocalizedRoleName(q->GetAddress()), TEST_LOCATION);
180
181   control.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, role_pushbutton);
182
183   DALI_TEST_EQUALS(static_cast<uint32_t>(role_pushbutton), TestGetRole(q->GetAddress()), TEST_LOCATION);
184   DALI_TEST_EQUALS("push button", TestGetRoleName(q->GetAddress()), TEST_LOCATION);
185   DALI_TEST_EQUALS("push button", TestGetLocalizedRoleName(q->GetAddress()), TEST_LOCATION);
186
187   Dali::Accessibility::TestEnableSC(false);
188
189   DALI_TEST_EQUALS(role_pushbutton, q->GetRole(), TEST_LOCATION);
190   DALI_TEST_EQUALS("push button", q->GetRoleName(), TEST_LOCATION);
191
192   END_TEST;
193 }
194
195 int UtcDaliControlAccessibilityRoleToggleButton(void)
196 {
197   ToolkitTestApplication application;
198
199   auto control = Dali::Toolkit::ToggleButton::New();
200   auto button  = Dali::Accessibility::Role::TOGGLE_BUTTON;
201
202   control.SetProperty(Toolkit::ToggleButton::Property::TOOLTIPS,
203                       Property::Array{"option1", "option2"});
204
205   Dali::Accessibility::TestEnableSC(true);
206
207   control.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, button);
208   auto q = Dali::Accessibility::Accessible::Get(control);
209
210   DALI_TEST_EQUALS(button, q->GetRole(), TEST_LOCATION);
211   DALI_TEST_EQUALS("toggle button", q->GetRoleName(), TEST_LOCATION);
212
213   Dali::Accessibility::States states = q->GetStates();
214   DALI_TEST_EQUALS(true, (bool)states[Dali::Accessibility::State::VISIBLE], TEST_LOCATION);
215
216   DALI_TEST_EQUALS("option1", q->GetDescription(), TEST_LOCATION);
217
218   auto i = dynamic_cast<Dali::Accessibility::Component*>(q);
219
220   DALI_TEST_CHECK(i);
221   i->GrabHighlight();
222
223   control.SetProperty(Toolkit::Button::Property::LABEL, "ToggleButton2");
224   DALI_TEST_EQUALS("ToggleButton2", TestGetName(q->GetAddress()), TEST_LOCATION);
225
226   Dali::Accessibility::TestEnableSC(false);
227
228   END_TEST;
229 }
230
231 int UtcDaliControlAccessibilityButtonLabel(void)
232 {
233   ToolkitTestApplication application;
234
235   auto control = Dali::Toolkit::PushButton::New();
236   auto button  = Dali::Accessibility::Role::PUSH_BUTTON;
237
238   Dali::Accessibility::TestEnableSC(true);
239
240   control.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, button);
241
242   auto q = Dali::Accessibility::Accessible::Get(control);
243   auto i = dynamic_cast<Dali::Accessibility::Component*>(q);
244
245   DALI_TEST_CHECK(i);
246   i->GrabHighlight();
247
248   control.SetProperty(Toolkit::Button::Property::LABEL, "Button2");
249
250   DALI_TEST_EQUALS("Button2", TestGetName(q->GetAddress()), TEST_LOCATION);
251
252   Dali::Accessibility::TestEnableSC(false);
253
254   END_TEST;
255 }
256
257 int UtcDaliControlAccessibilityState(void)
258 {
259   ToolkitTestApplication application;
260
261   auto control = Control::New();
262   auto q       = Dali::Accessibility::Accessible::Get(control);
263
264   Dali::Accessibility::TestEnableSC(true);
265
266   auto states_by_bridge = Dali::Accessibility::States{TestGetStates(q->GetAddress())};
267   auto states           = DevelControl::GetAccessibilityStates(control);
268   DALI_TEST_CHECK(states_by_bridge == states);
269
270   Dali::Accessibility::TestEnableSC(false);
271
272   END_TEST;
273 }
274
275 int UtcDaliControlAccessibilityModal(void)
276 {
277   ToolkitTestApplication application;
278
279   auto control = Dali::Toolkit::Popup::New();
280   auto q       = Dali::Accessibility::Accessible::Get(control);
281
282   Dali::Accessibility::TestEnableSC(true);
283
284   auto states_by_bridge = Dali::Accessibility::States{TestGetStates(q->GetAddress())};
285   DALI_TEST_CHECK(states_by_bridge[Dali::Accessibility::State::MODAL]);
286
287   Dali::Accessibility::TestEnableSC(false);
288
289   END_TEST;
290 }
291
292 int UtcDaliControlAccessibilityHighlightable(void)
293 {
294   ToolkitTestApplication application;
295   auto                   control = Control::New();
296
297   auto highlightable = control.GetProperty<bool>(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE);
298   DALI_TEST_EQUALS(highlightable, false, TEST_LOCATION);
299
300   // negative testcase - trying to set unconvertible value
301   control.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, "deadbeef");
302   highlightable = control.GetProperty<bool>(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE);
303   DALI_TEST_EQUALS(highlightable, false, TEST_LOCATION);
304
305   auto q = Dali::Accessibility::Accessible::Get(control);
306
307   Dali::Accessibility::TestEnableSC(true);
308
309   auto states_by_bridge = Dali::Accessibility::States{TestGetStates(q->GetAddress())};
310   DALI_TEST_CHECK(!states_by_bridge[Dali::Accessibility::State::HIGHLIGHTABLE]);
311
312   control.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, true);
313   DALI_TEST_EQUALS(Property::BOOLEAN, control.GetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE).GetType(), TEST_LOCATION);
314   DALI_TEST_EQUALS(true, control.GetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE).Get<bool>(), TEST_LOCATION);
315
316   states_by_bridge = Dali::Accessibility::States{TestGetStates(q->GetAddress())};
317   DALI_TEST_CHECK(states_by_bridge[Dali::Accessibility::State::HIGHLIGHTABLE]);
318
319   control.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, false);
320   DALI_TEST_EQUALS(Property::BOOLEAN, control.GetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE).GetType(), TEST_LOCATION);
321   DALI_TEST_EQUALS(false, control.GetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE).Get<bool>(), TEST_LOCATION);
322
323   states_by_bridge = Dali::Accessibility::States{TestGetStates(q->GetAddress())};
324   DALI_TEST_CHECK(!states_by_bridge[Dali::Accessibility::State::HIGHLIGHTABLE]);
325
326   Dali::Accessibility::TestEnableSC(false);
327
328   END_TEST;
329 }
330
331 int UtcDaliControlAccessibilityHighlightBridgeUp(void)
332 {
333   ToolkitTestApplication application;
334
335   auto controla = Control::New();
336   auto controlb = Control::New();
337   controla.Add(controlb);
338
339   controla.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, true);
340   controlb.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, true);
341
342   Dali::Accessibility::TestEnableSC(true);
343
344   auto accessible_a = Dali::Accessibility::Accessible::Get(controla);
345   auto accessible_b = Dali::Accessibility::Accessible::Get(controlb);
346
347   auto a = dynamic_cast<Dali::Accessibility::Component*>(accessible_a);
348   auto b = dynamic_cast<Dali::Accessibility::Component*>(accessible_b);
349
350   auto states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
351   auto states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
352
353   DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
354   DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
355
356   DALI_TEST_EQUALS(true, DevelControl::GrabAccessibilityHighlight(controla), TEST_LOCATION);
357
358   states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
359   states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
360
361   DALI_TEST_CHECK(states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
362   DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
363
364   DALI_TEST_EQUALS(true, DevelControl::GrabAccessibilityHighlight(controlb), TEST_LOCATION);
365   DALI_TEST_EQUALS(true, DevelControl::GrabAccessibilityHighlight(controlb), TEST_LOCATION);
366
367   states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
368   states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
369
370   DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
371   DALI_TEST_CHECK(states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
372
373   DALI_TEST_EQUALS(false, DevelControl::ClearAccessibilityHighlight(controla), TEST_LOCATION);
374
375   states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
376   states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
377
378   DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
379   DALI_TEST_CHECK(states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
380
381   DALI_TEST_EQUALS(true, DevelControl::ClearAccessibilityHighlight(controlb), TEST_LOCATION);
382
383   states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
384   states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
385
386   DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
387   DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
388
389   DALI_TEST_CHECK(TestGrabHighlight(a->GetAddress()));
390
391   states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
392   states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
393
394   DALI_TEST_CHECK(states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
395   DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
396
397   DALI_TEST_CHECK(TestGrabHighlight(b->GetAddress()));
398
399   states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
400   states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
401
402   DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
403   DALI_TEST_CHECK(states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
404
405   DALI_TEST_CHECK(TestClearHighlight(b->GetAddress()));
406
407   states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
408   states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
409
410   DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
411   DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
412
413   Dali::Accessibility::TestEnableSC(false);
414
415   END_TEST;
416 }
417
418 int utcDaliAccessibilityControlAttributes(void)
419 {
420   ToolkitTestApplication application;
421   auto                   check_box_button = Toolkit::Control::New();
422
423   std::string value;
424
425   auto attributes     = check_box_button.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
426   auto attributes_map = attributes.GetMap();
427
428   auto position = attributes_map->Find("access_key1");
429   DALI_TEST_CHECK(!position);
430
431   DevelControl::AppendAccessibilityAttribute(check_box_button, "access_key1", "access_value1");
432   attributes     = check_box_button.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
433   attributes_map = attributes.GetMap();
434
435   DALI_TEST_EQUALS((attributes_map->Find("access_key1"))->Get<std::string>(), "access_value1", TEST_LOCATION);
436
437   DevelControl::AppendAccessibilityAttribute(check_box_button, "access_key2", "access_value2_a");
438   attributes     = check_box_button.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
439   attributes_map = attributes.GetMap();
440
441   DALI_TEST_EQUALS((attributes_map->Find("access_key1"))->Get<std::string>(), "access_value1", TEST_LOCATION);
442   DALI_TEST_EQUALS((attributes_map->Find("access_key2"))->Get<std::string>(), "access_value2_a", TEST_LOCATION);
443
444   DevelControl::AppendAccessibilityAttribute(check_box_button, "access_key2", "access_value2_b");
445   attributes     = check_box_button.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
446   attributes_map = attributes.GetMap();
447
448   DALI_TEST_EQUALS((attributes_map->Find("access_key2"))->Get<std::string>(), "access_value2_b", TEST_LOCATION);
449
450   DevelControl::RemoveAccessibilityAttribute(check_box_button, "access_key2");
451   attributes     = check_box_button.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
452   attributes_map = attributes.GetMap();
453
454   // In case when we are removing one of attributes the property is setting for NONE type.
455   DALI_TEST_EQUALS((attributes_map->Find("access_key2"))->GetType(), Property::NONE, TEST_LOCATION);
456
457   Dali::Accessibility::TestEnableSC(true);
458
459   auto ptr                  = Dali::Accessibility::Accessible::Get(check_box_button);
460   auto attribute_map_bridge = TestGetAttributes(ptr->GetAddress());
461   auto counter              = 0u;
462
463   // Refresh the attributes since ControlAccessible::GetAttributes() might have added something
464   attributes     = check_box_button.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
465   attributes_map = attributes.GetMap();
466   for(auto i = 0u; i < attributes_map->Count(); ++i)
467     if((attributes_map->GetValue(i)).GetType() != Property::NONE)
468       ++counter;
469
470   DALI_TEST_EQUALS(counter, attribute_map_bridge.size(), TEST_LOCATION);
471
472   for(auto it : attribute_map_bridge)
473     DALI_TEST_EQUALS((attributes_map->Find(it.first))->Get<std::string>(), it.second, TEST_LOCATION);
474
475   DevelControl::ClearAccessibilityAttributes(check_box_button);
476   attributes     = check_box_button.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
477   attributes_map = attributes.GetMap();
478
479   position = attributes_map->Find("access_key1");
480   DALI_TEST_CHECK(!position);
481
482   position = attributes_map->Find("access_key2");
483   DALI_TEST_CHECK(!position);
484
485   Dali::Accessibility::TestEnableSC(false);
486
487   END_TEST;
488 }
489
490 int UtcDaliControlReadingInfoType(void)
491 {
492   ToolkitTestApplication application;
493   auto                   control = Control::New();
494
495   auto reading_info_type = DevelControl::GetAccessibilityReadingInfoType(control);
496
497   for(auto i = 0u; i < 4; ++i)
498     DALI_TEST_CHECK(reading_info_type[static_cast<Dali::Accessibility::ReadingInfoType>(i)]);
499
500   reading_info_type[Dali::Accessibility::ReadingInfoType::DESCRIPTION] = false;
501   reading_info_type[Dali::Accessibility::ReadingInfoType::STATE]       = false;
502   reading_info_type[Dali::Accessibility::ReadingInfoType::NAME]        = false;
503   reading_info_type[Dali::Accessibility::ReadingInfoType::ROLE]        = false;
504
505   DevelControl::SetAccessibilityReadingInfoType(control, reading_info_type);
506
507   reading_info_type = DevelControl::GetAccessibilityReadingInfoType(control);
508
509   for(auto i = 0u; i < 4; ++i)
510     DALI_TEST_CHECK(false == reading_info_type[static_cast<Dali::Accessibility::ReadingInfoType>(i)]);
511
512   reading_info_type[Dali::Accessibility::ReadingInfoType::DESCRIPTION] = true;
513   reading_info_type[Dali::Accessibility::ReadingInfoType::STATE]       = true;
514   reading_info_type[Dali::Accessibility::ReadingInfoType::NAME]        = true;
515   reading_info_type[Dali::Accessibility::ReadingInfoType::ROLE]        = true;
516
517   DevelControl::SetAccessibilityReadingInfoType(control, reading_info_type);
518
519   auto q = control.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
520   auto z = q.GetMap();
521
522   DALI_TEST_EQUALS((z->Find("reading_info_type"))->Get<std::string>(), "name|role|description|state", TEST_LOCATION);
523   reading_info_type = DevelControl::GetAccessibilityReadingInfoType(control);
524   for(auto i = 0u; i < 4; ++i)
525     DALI_TEST_CHECK(reading_info_type[static_cast<Dali::Accessibility::ReadingInfoType>(i)]);
526
527   END_TEST;
528 }
529
530 int UtcDaliControlDoGesture(void)
531 {
532   ToolkitTestApplication application;
533   auto                   control = Control::New();
534   Dali::Accessibility::TestEnableSC(true);
535
536   auto accessible  = Dali::Accessibility::Accessible::Get(control);
537   auto gesture_one = Dali::Accessibility::GestureInfo{Dali::Accessibility::Gesture::ONE_FINGER_FLICK_LEFT, 600, 100, 500, 500, Dali::Accessibility::GestureState::BEGIN, 1000};
538   auto gesture_two = Dali::Accessibility::GestureInfo{Dali::Accessibility::Gesture::ONE_FINGER_FLICK_RIGHT, 600, 100, 500, 500, Dali::Accessibility::GestureState::BEGIN, 1000};
539
540   DALI_TEST_CHECK(!accessible->DoGesture(gesture_one));
541   DALI_TEST_CHECK(!TestDoGesture(accessible->GetAddress(), Dali::Accessibility::Gesture::ONE_FINGER_FLICK_LEFT, 600, 100, 500, 500, Dali::Accessibility::GestureState::BEGIN, 1000));
542
543   DevelControl::AccessibilityDoGestureSignal(control).Connect([](std::pair<Dali::Accessibility::GestureInfo, bool>& gesture) {
544     if(gesture.first.type == Dali::Accessibility::Gesture::ONE_FINGER_FLICK_LEFT)
545       gesture.second = true;
546     else
547       gesture.second = false;
548   });
549
550   DALI_TEST_CHECK(accessible->DoGesture(gesture_one));
551   DALI_TEST_CHECK(TestDoGesture(accessible->GetAddress(), Dali::Accessibility::Gesture::ONE_FINGER_FLICK_LEFT, 600, 100, 500, 500, Dali::Accessibility::GestureState::BEGIN, 1000));
552
553   DALI_TEST_CHECK(!accessible->DoGesture(gesture_two));
554   DALI_TEST_CHECK(!TestDoGesture(accessible->GetAddress(), Dali::Accessibility::Gesture::ONE_FINGER_FLICK_RIGHT, 600, 100, 500, 500, Dali::Accessibility::GestureState::BEGIN, 1000));
555
556   Dali::Accessibility::TestEnableSC(false);
557
558   END_TEST;
559 }
560
561 int UtcDaliAccessibilityRelation(void)
562 {
563   ToolkitTestApplication application;
564   Dali::Accessibility::TestEnableSC(true);
565
566   auto rel          = Accessibility::RelationType::FLOWS_TO;
567   auto control      = Control::New();
568   auto destination1 = Control::New();
569   auto destination2 = Control::New();
570
571   DevelControl::AppendAccessibilityRelation(control, destination1, rel);
572   auto relations = DevelControl::GetAccessibilityRelations(control);
573   DALI_TEST_EQUALS(relations.size(), 1u, TEST_LOCATION);
574   DALI_TEST_EQUALS(relations[0].mRelationType, rel, TEST_LOCATION);
575   DALI_TEST_EQUALS(relations[0].mTargets.size(), 1u, TEST_LOCATION);
576
577   DevelControl::AppendAccessibilityRelation(control, destination2, rel);
578   relations = DevelControl::GetAccessibilityRelations(control);
579   DALI_TEST_EQUALS(relations.size(), 1u, TEST_LOCATION);
580   DALI_TEST_EQUALS(relations[0].mRelationType, rel, TEST_LOCATION);
581   DALI_TEST_EQUALS(relations[0].mTargets.size(), 2u, TEST_LOCATION);
582
583   auto accessible              = Dali::Accessibility::Accessible::Get(control);
584   auto accessible_destination1 = Dali::Accessibility::Accessible::Get(destination1);
585   auto accessible_destination2 = Dali::Accessibility::Accessible::Get(destination2);
586   auto relationset             = accessible->GetRelationSet();
587
588   DALI_TEST_CHECK(relationset[0].mRelationType == rel);
589   DALI_TEST_CHECK(relationset[0].mTargets[0] == accessible_destination1 || relationset[0].mTargets[1] == accessible_destination1);
590   DALI_TEST_CHECK(relationset[0].mTargets[0] == accessible_destination2 || relationset[0].mTargets[1] == accessible_destination2);
591
592   auto relationset_bridge = TestGetRelationSet(accessible->GetAddress());
593   DALI_TEST_CHECK(static_cast<uint32_t>(relationset[0].mRelationType) == std::get<0>(relationset_bridge[0]));
594
595   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]);
596   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]);
597
598   DevelControl::RemoveAccessibilityRelation(control, destination2, rel);
599   relations = DevelControl::GetAccessibilityRelations(control);
600   DALI_TEST_EQUALS(relations.size(), 1u, TEST_LOCATION);
601   DALI_TEST_EQUALS(relations[0].mTargets.size(), 1u, TEST_LOCATION);
602
603   DevelControl::ClearAccessibilityRelations(control);
604   relations = DevelControl::GetAccessibilityRelations(control);
605   DALI_TEST_EQUALS(relations.size(), 0u, TEST_LOCATION);
606
607   Dali::Accessibility::TestEnableSC(false);
608
609   END_TEST;
610 }
611
612 int UtcDaliAccessibilityParentChildren(void)
613 {
614   ToolkitTestApplication application;
615   Dali::Accessibility::TestEnableSC(true);
616
617   auto parent  = Control::New();
618   auto child_1 = Control::New();
619   auto child_2 = Control::New();
620
621   auto parent_accessible  = Dali::Accessibility::Accessible::Get(parent);
622   auto child_1_accessible = Dali::Accessibility::Accessible::Get(child_1);
623   auto child_2_accessible = Dali::Accessibility::Accessible::Get(child_2);
624
625   auto children = TestGetChildren(parent_accessible->GetAddress());
626   DALI_TEST_EQUALS(children.size(), 0, TEST_LOCATION);
627
628   try
629   {
630     TestGetIndexInParent(child_1_accessible->GetAddress());
631     DALI_ABORT("Object has parent, test abort");
632   }
633   catch(TestDBusWrapper::error&)
634   {
635   }
636
637   try
638   {
639     TestGetChildAtIndex(parent_accessible->GetAddress(), -1);
640     DALI_ABORT("Positive index, test abort");
641   }
642   catch(TestDBusWrapper::error&)
643   {
644   }
645
646   DALI_TEST_EQUALS(parent_accessible->GetChildCount(), 0, TEST_LOCATION);
647
648   try
649   {
650     child_1_accessible->GetIndexInParent();
651     DALI_ABORT("Object has parent, test abort");
652   }
653   catch(const std::domain_error&)
654   {
655   }
656
657   parent.Add(child_1);
658   parent.Add(child_2);
659
660   children = TestGetChildren(parent_accessible->GetAddress());
661   DALI_TEST_EQUALS(children.size(), 2, TEST_LOCATION);
662
663   DALI_TEST_EQUALS(parent_accessible->GetAddress(), TestGetParent(child_1_accessible->GetAddress()), TEST_LOCATION);
664   DALI_TEST_EQUALS(child_2_accessible->GetAddress(), TestGetChildAtIndex(parent_accessible->GetAddress(), TestGetIndexInParent(child_2_accessible->GetAddress())), TEST_LOCATION);
665
666   DALI_TEST_EQUALS(parent_accessible, child_1_accessible->GetParent(), TEST_LOCATION);
667   DALI_TEST_EQUALS(child_2_accessible, parent_accessible->GetChildAtIndex(child_2_accessible->GetIndexInParent()), TEST_LOCATION);
668
669   Dali::Accessibility::TestEnableSC(false);
670
671   END_TEST;
672 }
673
674 int UtcDaliAccessibilityGetLayer(void)
675 {
676   ToolkitTestApplication application;
677
678   Dali::Accessibility::TestEnableSC(true);
679
680   auto control              = Control::New();
681   auto accessible_obj       = Dali::Accessibility::Accessible::Get(control);
682   auto accessible_component = dynamic_cast<Dali::Accessibility::Component*>(accessible_obj);
683   DALI_TEST_CHECK(accessible_component);
684   DALI_TEST_EQUALS(Dali::Accessibility::ComponentLayer::WINDOW, accessible_component->GetLayer(), TEST_LOCATION);
685   DALI_TEST_EQUALS(Dali::Accessibility::ComponentLayer::WINDOW, TestGetLayer(accessible_component->GetAddress()), TEST_LOCATION);
686
687   Dali::Accessibility::TestEnableSC(false);
688
689   END_TEST;
690 }
691
692 int UtcDaliAccessibilityGrabFocus(void)
693 {
694   ToolkitTestApplication application;
695
696   Dali::Accessibility::TestEnableSC(true);
697
698   auto controla = Control::New();
699   auto controlb = Control::New();
700
701   Stage::GetCurrent().Add(controla);
702   Stage::GetCurrent().Add(controlb);
703
704   controla.SetProperty(Actor::Property::KEYBOARD_FOCUSABLE, true);
705   controlb.SetProperty(Actor::Property::KEYBOARD_FOCUSABLE, true);
706
707   auto a = Dali::Accessibility::Accessible::Get(controla);
708   auto b = Dali::Accessibility::Accessible::Get(controlb);
709
710   auto a_component = dynamic_cast<Dali::Accessibility::Component*>(a);
711   auto b_component = dynamic_cast<Dali::Accessibility::Component*>(b);
712
713   auto states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a_component->GetAddress())};
714   auto states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b_component->GetAddress())};
715
716   DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::FOCUSED]);
717   DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::FOCUSED]);
718
719   DALI_TEST_CHECK(a_component->GrabFocus());
720
721   states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a_component->GetAddress())};
722   states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b_component->GetAddress())};
723
724   DALI_TEST_CHECK(states_by_bridge_a[Dali::Accessibility::State::FOCUSED]);
725   DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::FOCUSED]);
726
727   DALI_TEST_CHECK(TestGrabFocus(b_component->GetAddress()));
728
729   states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a_component->GetAddress())};
730   states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b_component->GetAddress())};
731
732   DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::FOCUSED]);
733   DALI_TEST_CHECK(states_by_bridge_b[Dali::Accessibility::State::FOCUSED]);
734
735   Dali::Accessibility::TestEnableSC(false);
736
737   END_TEST;
738 }
739
740 int UtcDaliAccessibilityGetExtentsScreenAndWindowPositionMatch(void)
741 {
742   ToolkitTestApplication application;
743   tet_infoline("UtcDaliAccessibilityGetExtentsScreenAndWindowPositionMatch");
744
745   Dali::Accessibility::TestEnableSC(true);
746
747   auto control = Control::New();
748   Stage::GetCurrent().GetRootLayer().Add(control);
749
750   auto window = Dali::DevelWindow::Get(control);
751   DALI_TEST_CHECK(window);
752
753   //window.SetPosition({0,0});
754   DevelWindow::SetPositionSize(window, PositionSize(0, 0, 480, 240));
755
756   control.SetProperty(Actor::Property::POSITION, Vector3(10, 10, 100));
757   control.SetProperty(Actor::Property::SIZE, Vector2(10, 10));
758
759   application.SendNotification();
760   application.Render(1);
761
762   auto a           = Dali::Accessibility::Accessible::Get(control);
763   auto a_component = dynamic_cast<Dali::Accessibility::Component*>(a);
764
765   auto extents = a_component->GetExtents(Dali::Accessibility::CoordinateType::SCREEN);
766   DALI_TEST_EQUALS(extents.x, 5.0f, TEST_LOCATION);
767   DALI_TEST_EQUALS(extents.y, 5.0f, TEST_LOCATION);
768   DALI_TEST_EQUALS(extents.height, 10.0f, TEST_LOCATION);
769   DALI_TEST_EQUALS(extents.width, 10.0f, TEST_LOCATION);
770
771   auto bridge_extents = TestGetExtents(a_component->GetAddress(), Dali::Accessibility::CoordinateType::SCREEN);
772   DALI_TEST_EQUALS(std::get<0>(bridge_extents), 5, TEST_LOCATION);
773   DALI_TEST_EQUALS(std::get<1>(bridge_extents), 5, TEST_LOCATION);
774   DALI_TEST_EQUALS(std::get<2>(bridge_extents), 10, TEST_LOCATION);
775   DALI_TEST_EQUALS(std::get<3>(bridge_extents), 10, TEST_LOCATION);
776
777   extents = a_component->GetExtents(Dali::Accessibility::CoordinateType::WINDOW);
778   DALI_TEST_EQUALS(extents.x, 5.0f, TEST_LOCATION);
779   DALI_TEST_EQUALS(extents.y, 5.0f, TEST_LOCATION);
780   DALI_TEST_EQUALS(extents.height, 10.0f, TEST_LOCATION);
781   DALI_TEST_EQUALS(extents.width, 10.0f, TEST_LOCATION);
782
783   bridge_extents = TestGetExtents(a_component->GetAddress(), Dali::Accessibility::CoordinateType::WINDOW);
784   DALI_TEST_EQUALS(std::get<0>(bridge_extents), 5, TEST_LOCATION);
785   DALI_TEST_EQUALS(std::get<1>(bridge_extents), 5, TEST_LOCATION);
786   DALI_TEST_EQUALS(std::get<2>(bridge_extents), 10, TEST_LOCATION);
787   DALI_TEST_EQUALS(std::get<3>(bridge_extents), 10, TEST_LOCATION);
788
789   control.SetProperty(Dali::DevelActor::Property::POSITION_USES_ANCHOR_POINT, false);
790   application.SendNotification();
791   application.Render(1);
792
793   extents = a_component->GetExtents(Dali::Accessibility::CoordinateType::SCREEN);
794   DALI_TEST_EQUALS(extents.x, 10.0f, TEST_LOCATION);
795   DALI_TEST_EQUALS(extents.y, 10.0f, TEST_LOCATION);
796   DALI_TEST_EQUALS(extents.height, 10.0f, TEST_LOCATION);
797   DALI_TEST_EQUALS(extents.width, 10.0f, TEST_LOCATION);
798
799   bridge_extents = TestGetExtents(a_component->GetAddress(), Dali::Accessibility::CoordinateType::SCREEN);
800   DALI_TEST_EQUALS(std::get<0>(bridge_extents), 10, TEST_LOCATION);
801   DALI_TEST_EQUALS(std::get<1>(bridge_extents), 10, TEST_LOCATION);
802   DALI_TEST_EQUALS(std::get<2>(bridge_extents), 10, TEST_LOCATION);
803   DALI_TEST_EQUALS(std::get<3>(bridge_extents), 10, TEST_LOCATION);
804
805   extents = a_component->GetExtents(Dali::Accessibility::CoordinateType::WINDOW);
806   DALI_TEST_EQUALS(extents.x, 10.0f, TEST_LOCATION);
807   DALI_TEST_EQUALS(extents.y, 10.0f, TEST_LOCATION);
808   DALI_TEST_EQUALS(extents.height, 10.0f, TEST_LOCATION);
809   DALI_TEST_EQUALS(extents.width, 10.0f, TEST_LOCATION);
810
811   bridge_extents = TestGetExtents(a_component->GetAddress(), Dali::Accessibility::CoordinateType::WINDOW);
812   DALI_TEST_EQUALS(std::get<0>(bridge_extents), 10, TEST_LOCATION);
813   DALI_TEST_EQUALS(std::get<1>(bridge_extents), 10, TEST_LOCATION);
814   DALI_TEST_EQUALS(std::get<2>(bridge_extents), 10, TEST_LOCATION);
815   DALI_TEST_EQUALS(std::get<3>(bridge_extents), 10, TEST_LOCATION);
816
817   Dali::Accessibility::TestEnableSC(false);
818
819   END_TEST;
820 }
821
822 int UtcDaliAccessibilityGetExtentsScreenAndWindowPositionDoNotMatch(void)
823 {
824   ToolkitTestApplication application;
825
826   Dali::Accessibility::TestEnableSC(true);
827
828   auto control = Control::New();
829   Stage::GetCurrent().GetRootLayer().Add(control);
830   auto window = Dali::DevelWindow::Get(control);
831   //window.SetPosition({33,33});
832   DevelWindow::SetPositionSize(window, PositionSize(33, 33, 480, 240));
833
834   control.SetProperty(Actor::Property::POSITION, Vector3(10, 10, 100));
835   control.SetProperty(Actor::Property::SIZE, Vector2(10, 10));
836
837   application.SendNotification();
838   application.Render(1);
839
840   auto a           = Dali::Accessibility::Accessible::Get(control);
841   auto a_component = dynamic_cast<Dali::Accessibility::Component*>(a);
842
843   auto extents = a_component->GetExtents(Dali::Accessibility::CoordinateType::SCREEN);
844   DALI_TEST_EQUALS(extents.x, 38.0f, TEST_LOCATION);
845   DALI_TEST_EQUALS(extents.y, 38.0f, TEST_LOCATION);
846   DALI_TEST_EQUALS(extents.height, 10.0f, TEST_LOCATION);
847   DALI_TEST_EQUALS(extents.width, 10.0f, TEST_LOCATION);
848
849   auto bridge_extents = TestGetExtents(a_component->GetAddress(), Dali::Accessibility::CoordinateType::SCREEN);
850   DALI_TEST_EQUALS(std::get<0>(bridge_extents), 38, TEST_LOCATION);
851   DALI_TEST_EQUALS(std::get<1>(bridge_extents), 38, TEST_LOCATION);
852   DALI_TEST_EQUALS(std::get<2>(bridge_extents), 10, TEST_LOCATION);
853   DALI_TEST_EQUALS(std::get<3>(bridge_extents), 10, TEST_LOCATION);
854
855   extents = a_component->GetExtents(Dali::Accessibility::CoordinateType::WINDOW);
856   DALI_TEST_EQUALS(extents.x, 5.0f, TEST_LOCATION);
857   DALI_TEST_EQUALS(extents.y, 5.0f, TEST_LOCATION);
858   DALI_TEST_EQUALS(extents.height, 10.0f, TEST_LOCATION);
859   DALI_TEST_EQUALS(extents.width, 10.0f, TEST_LOCATION);
860
861   bridge_extents = TestGetExtents(a_component->GetAddress(), Dali::Accessibility::CoordinateType::WINDOW);
862   DALI_TEST_EQUALS(std::get<0>(bridge_extents), 5, TEST_LOCATION);
863   DALI_TEST_EQUALS(std::get<1>(bridge_extents), 5, TEST_LOCATION);
864   DALI_TEST_EQUALS(std::get<2>(bridge_extents), 10, TEST_LOCATION);
865   DALI_TEST_EQUALS(std::get<3>(bridge_extents), 10, TEST_LOCATION);
866
867   control.SetProperty(Dali::DevelActor::Property::POSITION_USES_ANCHOR_POINT, false);
868   application.SendNotification();
869   application.Render(1);
870
871   extents = a_component->GetExtents(Dali::Accessibility::CoordinateType::SCREEN);
872   DALI_TEST_EQUALS(extents.x, 43.0f, TEST_LOCATION);
873   DALI_TEST_EQUALS(extents.y, 43.0f, TEST_LOCATION);
874   DALI_TEST_EQUALS(extents.height, 10.0f, TEST_LOCATION);
875   DALI_TEST_EQUALS(extents.width, 10.0f, TEST_LOCATION);
876
877   bridge_extents = TestGetExtents(a_component->GetAddress(), Dali::Accessibility::CoordinateType::SCREEN);
878   DALI_TEST_EQUALS(std::get<0>(bridge_extents), 43, TEST_LOCATION);
879   DALI_TEST_EQUALS(std::get<1>(bridge_extents), 43, TEST_LOCATION);
880   DALI_TEST_EQUALS(std::get<2>(bridge_extents), 10, TEST_LOCATION);
881   DALI_TEST_EQUALS(std::get<3>(bridge_extents), 10, TEST_LOCATION);
882
883   extents = a_component->GetExtents(Dali::Accessibility::CoordinateType::WINDOW);
884   DALI_TEST_EQUALS(extents.x, 10.0f, TEST_LOCATION);
885   DALI_TEST_EQUALS(extents.y, 10.0f, TEST_LOCATION);
886   DALI_TEST_EQUALS(extents.height, 10.0f, TEST_LOCATION);
887   DALI_TEST_EQUALS(extents.width, 10.0f, TEST_LOCATION);
888
889   bridge_extents = TestGetExtents(a_component->GetAddress(), Dali::Accessibility::CoordinateType::WINDOW);
890   DALI_TEST_EQUALS(std::get<0>(bridge_extents), 10, TEST_LOCATION);
891   DALI_TEST_EQUALS(std::get<1>(bridge_extents), 10, TEST_LOCATION);
892   DALI_TEST_EQUALS(std::get<2>(bridge_extents), 10, TEST_LOCATION);
893   DALI_TEST_EQUALS(std::get<3>(bridge_extents), 10, TEST_LOCATION);
894
895   Dali::Accessibility::TestEnableSC(false);
896
897   END_TEST;
898 }
899
900 int UtcDaliAccessibilityGetAlpha(void)
901 {
902   ToolkitTestApplication application;
903
904   Dali::Accessibility::TestEnableSC(true);
905
906   auto control     = Control::New();
907   auto a           = Dali::Accessibility::Accessible::Get(control);
908   auto a_component = dynamic_cast<Dali::Accessibility::Component*>(a);
909
910   DALI_TEST_EQUALS(0.0, a_component->GetAlpha(), TEST_LOCATION);
911   DALI_TEST_EQUALS(0.0, TestGetAlpha(a_component->GetAddress()), TEST_LOCATION);
912
913   Dali::Accessibility::TestEnableSC(false);
914
915   END_TEST;
916 }
917
918 int UtcDaliAccessibilityGetMdiZOrder(void)
919 {
920   ToolkitTestApplication application;
921
922   Dali::Accessibility::TestEnableSC(true);
923
924   auto control     = Control::New();
925   auto a           = Dali::Accessibility::Accessible::Get(control);
926   auto a_component = dynamic_cast<Dali::Accessibility::Component*>(a);
927
928   DALI_TEST_EQUALS(0, static_cast<int>(a_component->GetMdiZOrder()), TEST_LOCATION);
929   DALI_TEST_EQUALS(0, TestGetMdiZOrder(a_component->GetAddress()), TEST_LOCATION);
930
931   Dali::Accessibility::TestEnableSC(false);
932
933   END_TEST;
934 }
935
936 int UtcDaliAccessibilityAction(void)
937 {
938   ToolkitTestApplication application;
939
940   Dali::Accessibility::TestEnableSC(true);
941
942   auto control = Control::New();
943   auto a       = Dali::Accessibility::Accessible::Get(control);
944   auto b       = dynamic_cast<Dali::Accessibility::Action*>(a);
945
946   std::vector<std::string> actions{"activate", "accessibilityActivated", "ReadingSkipped", "ReadingCancelled", "ReadingStopped", "ReadingPaused", "ReadingResumed", "show", "hide"};
947   auto                     count = b->GetActionCount();
948
949   DALI_TEST_EQUALS(count, 9, TEST_LOCATION);
950
951   for(auto i = 0u; i < count; ++i)
952   {
953     DALI_TEST_CHECK(Dali::Accessibility::Find(actions, b->GetActionName(i)));
954     DALI_TEST_EQUALS(b->GetActionName(i), b->GetLocalizedActionName(i), TEST_LOCATION);
955     DALI_TEST_EQUALS(b->GetActionDescription(i), "", TEST_LOCATION);
956     DALI_TEST_EQUALS(b->GetActionKeyBinding(i), "", TEST_LOCATION);
957   }
958
959   // Empty strings should be returned for invalid indices
960   DALI_TEST_EQUALS(b->GetActionDescription(count), "", TEST_LOCATION);
961   DALI_TEST_EQUALS(b->GetActionName(count), "", TEST_LOCATION);
962   DALI_TEST_EQUALS(b->GetLocalizedActionName(count), "", TEST_LOCATION);
963   DALI_TEST_EQUALS(b->GetActionKeyBinding(count), "", TEST_LOCATION);
964
965   count = TestGetActionCount(b->GetAddress());
966
967   DALI_TEST_EQUALS(count, 9, TEST_LOCATION);
968
969   for(auto i = 0u; i < count; ++i)
970   {
971     DALI_TEST_CHECK(Dali::Accessibility::Find(actions, TestGetActionName(b->GetAddress(), i)));
972     DALI_TEST_EQUALS(TestGetActionName(b->GetAddress(), i), TestGetLocalizedActionName(b->GetAddress(), i), TEST_LOCATION);
973     DALI_TEST_EQUALS(TestGetActionDescription(b->GetAddress(), i), "", TEST_LOCATION);
974     DALI_TEST_EQUALS(TestGetActionKeyBinding(b->GetAddress(), i), "", TEST_LOCATION);
975   }
976
977   DALI_TEST_EQUALS(TestGetActionDescription(b->GetAddress(), count), "", TEST_LOCATION);
978   DALI_TEST_EQUALS(TestGetActionName(b->GetAddress(), count), "", TEST_LOCATION);
979   DALI_TEST_EQUALS(TestGetLocalizedActionName(b->GetAddress(), count), "", TEST_LOCATION);
980   DALI_TEST_EQUALS(TestGetActionKeyBinding(b->GetAddress(), count), "", TEST_LOCATION);
981
982   Dali::Accessibility::TestEnableSC(false);
983
984   END_TEST;
985 }
986
987 int UtcDaliAccessibilityDoAction(void)
988 {
989   ToolkitTestApplication application;
990
991   Dali::Accessibility::TestEnableSC(true);
992   thread_local std::vector<bool> actions_done{false, false, false, false, false, false};
993
994   auto                     control = Control::New();
995   auto                     a       = Dali::Accessibility::Accessible::Get(control);
996   auto                     b       = dynamic_cast<Dali::Accessibility::Action*>(a);
997   std::vector<std::string> actions{"activate", "accessibilityActivated", "ReadingSkipped", "ReadingCancelled", "ReadingStopped", "ReadingPaused", "ReadingResumed", "show", "hide"};
998
999   // Test calling action by name
1000   DALI_TEST_CHECK(b->DoAction(actions[2])); // ReadingSkipped
1001   DALI_TEST_CHECK(b->DoAction(actions[4])); // ReadingStopped
1002   DALI_TEST_CHECK(b->DoAction(actions[4])); // ReadingStopped
1003
1004   // Negative test of calling action with not defined name
1005   DALI_TEST_CHECK(!b->DoAction("undefined"));
1006
1007   DevelControl::AccessibilityReadingSkippedSignal(control).Connect([]() {
1008     actions_done[1] = true;
1009   });
1010   DevelControl::AccessibilityReadingCancelledSignal(control).Connect([]() {
1011     actions_done[2] = true;
1012   });
1013   DevelControl::AccessibilityReadingStoppedSignal(control).Connect([]() {
1014     actions_done[3] = true;
1015   });
1016   DevelControl::AccessibilityReadingPausedSignal(control).Connect([]() {
1017     actions_done[4] = true;
1018   });
1019   DevelControl::AccessibilityReadingResumedSignal(control).Connect([]() {
1020     actions_done[5] = true;
1021   });
1022   DevelControl::AccessibilityActivateSignal(control).Connect([]() {
1023     actions_done[0] = true;
1024   });
1025
1026   // Test calling action by index
1027   DALI_TEST_CHECK(b->DoAction(1));
1028   DALI_TEST_CHECK(b->DoAction(2));
1029   DALI_TEST_CHECK(b->DoAction(3));
1030   DALI_TEST_CHECK(b->DoAction(4));
1031   DALI_TEST_CHECK(b->DoAction(5));
1032   DALI_TEST_CHECK(b->DoAction(6));
1033
1034   for(auto i = 0u; i < actions_done.size(); ++i)
1035   {
1036     DALI_TEST_CHECK(actions_done[i]);
1037     actions_done[i] = false;
1038   }
1039
1040   DALI_TEST_CHECK(TestDoAction(b->GetAddress(), 1));
1041   DALI_TEST_CHECK(TestDoAction(b->GetAddress(), 2));
1042   DALI_TEST_CHECK(TestDoAction(b->GetAddress(), 3));
1043   DALI_TEST_CHECK(TestDoAction(b->GetAddress(), 4));
1044   DALI_TEST_CHECK(TestDoAction(b->GetAddress(), 5));
1045   DALI_TEST_CHECK(TestDoAction(b->GetAddress(), 6));
1046
1047   for(auto i = 0u; i < actions_done.size(); ++i)
1048   {
1049     DALI_TEST_CHECK(actions_done[i]);
1050     actions_done[i] = false;
1051   }
1052
1053   DALI_TEST_CHECK(TestDoAction(b->GetAddress(), actions[1]));
1054   DALI_TEST_CHECK(TestDoAction(b->GetAddress(), actions[2]));
1055   DALI_TEST_CHECK(TestDoAction(b->GetAddress(), actions[3]));
1056   DALI_TEST_CHECK(TestDoAction(b->GetAddress(), actions[4]));
1057   DALI_TEST_CHECK(TestDoAction(b->GetAddress(), actions[5]));
1058   DALI_TEST_CHECK(TestDoAction(b->GetAddress(), actions[6]));
1059
1060   for(auto i = 0u; i < actions_done.size(); ++i)
1061     DALI_TEST_CHECK(actions_done[i]);
1062
1063   Dali::Accessibility::TestEnableSC(false);
1064
1065   END_TEST;
1066 }
1067
1068 void TestVoidCallback()
1069 {
1070 }
1071
1072 int UtcDaliAccessibilitySignals(void)
1073 {
1074   ToolkitTestApplication application;
1075   ConnectionTracker      connectionTracker;
1076   Control                control = Control::New();
1077
1078   DALI_TEST_CHECK(DevelControl::AccessibilityGetNameSignal(control).Empty());
1079   control.ConnectSignal(&connectionTracker, "getName", &TestVoidCallback);
1080   DALI_TEST_CHECK(!DevelControl::AccessibilityGetNameSignal(control).Empty());
1081
1082   DALI_TEST_CHECK(DevelControl::AccessibilityGetDescriptionSignal(control).Empty());
1083   control.ConnectSignal(&connectionTracker, "getDescription", &TestVoidCallback);
1084   DALI_TEST_CHECK(!DevelControl::AccessibilityGetDescriptionSignal(control).Empty());
1085
1086   DALI_TEST_CHECK(DevelControl::AccessibilityDoGestureSignal(control).Empty());
1087   control.ConnectSignal(&connectionTracker, "doGesture", &TestVoidCallback);
1088   DALI_TEST_CHECK(!DevelControl::AccessibilityDoGestureSignal(control).Empty());
1089
1090   END_TEST;
1091 }
1092
1093 static void Wait(ToolkitTestApplication& application)
1094 {
1095   application.SendNotification();
1096   application.Render(16);
1097 }
1098
1099 int UtcDaliAccessibilityScrollToChildScrollView(void)
1100 {
1101   ToolkitTestApplication application;
1102   Dali::Accessibility::TestEnableSC(true);
1103
1104   ScrollView scrollView = ScrollView::New();
1105   application.GetScene().Add(scrollView);
1106
1107   PushButton          actorA    = PushButton::New();
1108   const Dali::Vector3 positionA = Vector3(100.0f, 400.0f, 0.0f);
1109   actorA.SetProperty(Dali::Actor::Property::POSITION, positionA);
1110   scrollView.Add(actorA);
1111
1112   PushButton          actorB    = PushButton::New();
1113   const Dali::Vector3 positionB = Vector3(500.0f, 200.0f, 0.0f);
1114   actorB.SetProperty(Dali::Actor::Property::POSITION, positionB);
1115   scrollView.Add(actorB);
1116
1117   TableView tableView = TableView::New(2, 2); // 2 by 2 grid.
1118   tableView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
1119   scrollView.Add(tableView);
1120
1121   PushButton actorC = PushButton::New();
1122   actorC.SetProperty(Actor::Property::SIZE, Vector2(50.0f, 50.0f));
1123   tableView.AddChild(actorC, TableView::CellPosition(0, 0));
1124
1125   PushButton actorD = PushButton::New();
1126   application.GetScene().Add(actorD);
1127
1128   Wait(application);
1129
1130   auto* accessibleParent = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(scrollView));
1131   DALI_TEST_CHECK(accessibleParent);
1132   auto* accessibleA = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(actorA));
1133   DALI_TEST_CHECK(accessibleA);
1134   auto* accessibleB = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(actorB));
1135   DALI_TEST_CHECK(accessibleB);
1136   auto* accessibleC = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(actorC));
1137   DALI_TEST_CHECK(accessibleC);
1138
1139   accessibleA->GrabHighlight(); // == scrollView.ScrollTo(actorA)
1140   Wait(application);
1141   accessibleB->GrabHighlight(); // == scrollView.ScrollTo(actorB)
1142   Wait(application);
1143
1144   // scrollView is ancestor of actorC
1145   // This should work without a crash
1146   accessibleC->GrabHighlight(); // == scrollView.ScrollTo(actorC)
1147   Wait(application);
1148
1149   // negative testcase calling ScrollToChild using non-child actor
1150   accessibleParent->ScrollToChild(actorD);
1151
1152   Dali::Accessibility::TestEnableSC(false);
1153   END_TEST;
1154 }
1155
1156 namespace
1157 {
1158 class TestItemFactory : public ItemFactory
1159 {
1160 public:
1161   TestItemFactory()
1162   {
1163   }
1164
1165   unsigned int GetNumberOfItems() override
1166   {
1167     return 2;
1168   }
1169
1170   Dali::Actor NewItem(unsigned int itemId) override
1171   {
1172     return TextLabel::New(std::to_string(itemId));
1173   }
1174 };
1175 } // namespace
1176
1177 int UtcDaliAccessibilityScrollToChildItemView(void)
1178 {
1179   ToolkitTestApplication application;
1180   Dali::Accessibility::TestEnableSC(true);
1181
1182   TestItemFactory factory;
1183   ItemView        view = ItemView::New(factory);
1184   Dali::Vector3   vec(480.0f, 800.0f, 0.0f);
1185   ItemLayoutPtr   layout = DefaultItemLayout::New(DefaultItemLayout::DEPTH);
1186
1187   view.AddLayout(*layout);
1188   view.SetProperty(Actor::Property::SIZE, vec);
1189
1190   application.GetScene().Add(view);
1191   layout->SetOrientation(ControlOrientation::Down);
1192   view.ActivateLayout(0, vec, 0.0f);
1193
1194   Wait(application);
1195
1196   auto* accessibleParent = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(view));
1197   DALI_TEST_CHECK(accessibleParent);
1198   auto* accessibleA = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(view.GetItem(0)));
1199   DALI_TEST_CHECK(accessibleA);
1200   auto* accessibleB = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(view.GetItem(1)));
1201   DALI_TEST_CHECK(accessibleB);
1202
1203   accessibleA->GrabHighlight(); // == view.ScrollToItem(view.GetItemId(actorA))
1204   Wait(application);
1205   accessibleB->GrabHighlight(); // == view.ScrollToItem(view.GetItemId(actorB))
1206   Wait(application);
1207
1208   Dali::Accessibility::TestEnableSC(false);
1209   END_TEST;
1210 }
1211
1212 int UtcDaliAccessibilityScrollToChildNonScrollable(void)
1213 {
1214   ToolkitTestApplication application;
1215   Dali::Accessibility::TestEnableSC(true);
1216
1217   TextLabel label = TextLabel::New("123");
1218
1219   auto* accessible = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(label));
1220   DALI_TEST_CHECK(accessible);
1221
1222   DALI_TEST_EQUALS(accessible->IsScrollable(), false, TEST_LOCATION);
1223   DALI_TEST_EQUALS(accessible->ScrollToChild({}), false, TEST_LOCATION);
1224   DALI_TEST_EQUALS(accessible->GetInternalActor(), label, TEST_LOCATION);
1225
1226   Dali::Accessibility::TestEnableSC(false);
1227   END_TEST;
1228 }
1229
1230 int UtcDaliAccessibilityCheckHighlight(void)
1231 {
1232   ToolkitTestApplication application;
1233   Dali::Accessibility::TestEnableSC(true);
1234   Dali::Accessibility::TestResetMoveOutedCalled();
1235
1236   // Make precondition two children exist in parent area
1237   PushButton parentButton = PushButton::New();
1238   parentButton.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_TO_BOUNDING_BOX);
1239   parentButton.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
1240   parentButton.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
1241   parentButton.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, 0.0f));
1242   parentButton.SetProperty(Actor::Property::SIZE, Dali::Vector2(100.0f, 200.0f));
1243   application.GetScene().Add(parentButton);
1244
1245   PushButton buttonA = PushButton::New();
1246   buttonA.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
1247   buttonA.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
1248   buttonA.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, 0.0f));
1249   buttonA.SetProperty(Actor::Property::SIZE, Dali::Vector2(100.0f, 100.0f));
1250   parentButton.Add(buttonA);
1251
1252   PushButton buttonB = PushButton::New();
1253   buttonB.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
1254   buttonB.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
1255   buttonB.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, 100.0f));
1256   buttonB.SetProperty(Actor::Property::SIZE, Dali::Vector2(100.0f, 100.0f));
1257   parentButton.Add(buttonB);
1258   Wait(application);
1259
1260   // Set highlight to first child (A) to enable movement tracking
1261   auto* accessible = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(buttonA));
1262   DALI_TEST_CHECK(accessible);
1263   accessible->GrabHighlight();
1264   Wait(application);
1265
1266   // 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
1267   buttonA.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, -200.0f));
1268   Wait(application);
1269   // Need one more notificaiton to get correct updated position
1270   application.SendNotification();
1271   DALI_TEST_EQUALS(true, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);
1272
1273   // Reset verdict data
1274   Dali::Accessibility::TestResetMoveOutedCalled();
1275
1276   // 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
1277   buttonA.SetProperty(Dali::Actor::Property::POSITION, Dali::Vector2(0.0f, -300.0f));
1278   Wait(application);
1279   // Need one more notificaiton to get correct updated position
1280   application.SendNotification();
1281   DALI_TEST_EQUALS(false, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);
1282
1283   // Reset verdict data
1284   Dali::Accessibility::TestResetMoveOutedCalled();
1285
1286   // Set highlight to second child (B) to enable movement tracking
1287   accessible = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(buttonB));
1288   DALI_TEST_CHECK(accessible);
1289   accessible->GrabHighlight();
1290   Wait(application);
1291
1292   // 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
1293   // B: (0,100) --> (0, 50)
1294   buttonB.SetProperty(Dali::Actor::Property::POSITION, Dali::Vector2(0.0f, 50.0f));
1295   Wait(application);
1296   // Need one more notificaiton to get correct updated position
1297   application.SendNotification();
1298   DALI_TEST_EQUALS(false, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);
1299
1300   // Reset verdict data
1301   Dali::Accessibility::TestResetMoveOutedCalled();
1302
1303   // 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
1304   buttonB.SetProperty(Actor::Property::POSITION, Dali::Vector2(300.0f, 100.0f));
1305   Wait(application);
1306   // Need one more notificaiton to get correct updated position
1307   application.SendNotification();
1308   DALI_TEST_EQUALS(true, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);
1309
1310   // Reset verdict data
1311   Dali::Accessibility::TestResetMoveOutedCalled();
1312
1313   // 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
1314   // B: (300,100) --> (0, 100)
1315   buttonB.SetProperty(Dali::Actor::Property::POSITION, Dali::Vector2(0.0f, 100.0f));
1316   Wait(application);
1317   // Need one more seding notificaiton to get correct updated position
1318   application.SendNotification();
1319   DALI_TEST_EQUALS(false, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);
1320
1321   // Reset verdict data
1322   Dali::Accessibility::TestResetMoveOutedCalled();
1323
1324   // Disable movement tracking on B by giving highlight to A
1325   accessible = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(buttonA));
1326   DALI_TEST_CHECK(accessible);
1327   accessible->GrabHighlight();
1328   Wait(application);
1329
1330   // Move B (untracked) out of parent area through the parent's area right edge - no move outed event expected for B object
1331   // B: (0,100) --> (300, 100)
1332   buttonB.SetProperty(Dali::Actor::Property::POSITION, Dali::Vector2(300.0f, 100.0f));
1333   Wait(application);
1334   // Need one more seding notificaiton to get correct updated position
1335   application.SendNotification();
1336   DALI_TEST_EQUALS(false, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);
1337
1338   Dali::Accessibility::TestEnableSC(false);
1339   END_TEST;
1340 }
1341
1342 int UtcDaliWebViewAccessible(void)
1343 {
1344   ToolkitTestApplication application;
1345
1346   auto webView           = Dali::Toolkit::WebView::New();
1347   auto webViewAccessible = Dali::Accessibility::Accessible::Get(webView);
1348
1349   DALI_TEST_CHECK(webViewAccessible);
1350
1351   auto children = webViewAccessible->GetChildren();
1352
1353   DALI_TEST_CHECK(children.empty());
1354
1355   // Enables accessibility
1356   Dali::Accessibility::TestEnableSC(true);
1357
1358   // Assuming the webengine lazy sets accessibility address on LoadUrl
1359   children = webViewAccessible->GetChildren();
1360   DALI_TEST_CHECK(children.empty());
1361
1362   // our test webengine sets accessibility address here
1363   webView.LoadUrl("http://www.somewhere.valid1.com");
1364
1365   children = webViewAccessible->GetChildren();
1366   DALI_TEST_EQUALS(children.size(), 1u, TEST_LOCATION);
1367
1368   auto* child = children[0];
1369
1370   DALI_TEST_CHECK(child);
1371   DALI_TEST_CHECK(child->IsProxy());
1372   DALI_TEST_EQUALS(child->GetParent(), webViewAccessible, TEST_LOCATION);
1373
1374   auto address = child->GetAddress();
1375
1376   DALI_TEST_CHECK(address);
1377   DALI_TEST_NOT_EQUALS(address.GetBus(), webViewAccessible->GetAddress().GetBus(), 0.0f, TEST_LOCATION);
1378
1379   Dali::Accessibility::TestEnableSC(false);
1380
1381   children = webViewAccessible->GetChildren();
1382
1383   DALI_TEST_CHECK(children.empty());
1384
1385   END_TEST;
1386 }