[dali_2.3.21] Merge branch 'devel/master'
[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 #include <automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/dbus-wrapper.h>
21
22 using namespace Dali::Toolkit;
23
24 void utc_dali_accessibility_controls_bridge_up_startup(void)
25 {
26   test_return_value = TET_UNDEF;
27   DBusWrapper::Install(std::unique_ptr<DBusWrapper>(new TestDBusWrapper));
28 }
29
30 void utc_dali_accessibility_controls_bridge_up_cleanup(void)
31 {
32   test_return_value = TET_PASS;
33   //DBusWrapper::Install({}) is a de-install
34   DBusWrapper::Install({});
35 }
36
37 namespace Dali
38 {
39 namespace Accessibility
40 {
41 std::ostream& operator<<(std::ostream& stream, const Address& address)
42 {
43   stream << address.ToString();
44   return stream;
45 }
46 } // namespace Accessibility
47 } // namespace Dali
48
49 int UtcDaliControlAccessibilityRaiseBridge(void)
50 {
51   DALI_TEST_CHECK(!Accessibility::IsUp());
52
53   ToolkitTestApplication application;
54
55   Dali::Accessibility::TestEnableSC(true);
56
57   DALI_TEST_CHECK(Accessibility::IsUp());
58
59   // auto wr = static_cast<TestDBusWrapper*>(DBusWrapper::Installed());
60   // for(auto &a : wr->daliMethods) {
61   //   const char *mt;
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";
65   //   else assert(0);
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);
67   // }
68
69   Dali::Accessibility::TestEnableSC(false);
70
71   DALI_TEST_CHECK(!Accessibility::IsUp());
72
73   END_TEST;
74 }
75
76 int UtcDaliControlAccessibilityName(void)
77 {
78   ToolkitTestApplication application;
79
80   auto control = Control::New();
81   Stage::GetCurrent().Add(control);
82
83   auto q = Dali::Accessibility::Accessible::Get(control);
84   DALI_TEST_CHECK(q);
85
86   DALI_TEST_EQUALS("", q->GetName(), TEST_LOCATION);
87
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);
91
92   auto nameChangeCallback = [](std::string& accessibilityName) { accessibilityName = "Accessibility_Name_With_Callback"; };
93
94   DevelControl::AccessibilityGetNameSignal(control).Connect(nameChangeCallback);
95
96   DALI_TEST_EQUALS("Accessibility_Name_With_Callback", q->GetName(), TEST_LOCATION);
97
98   Dali::Accessibility::TestEnableSC(true);
99
100   DALI_TEST_EQUALS("Accessibility_Name_With_Callback", TestGetName(q->GetAddress()), TEST_LOCATION);
101
102   DevelControl::AccessibilityGetNameSignal(control).Disconnect(nameChangeCallback);
103
104   auto i = dynamic_cast<Dali::Accessibility::Component*>(q);
105
106   DALI_TEST_CHECK(i);
107   i->GrabHighlight();
108
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);
112
113   //TODO test emission of name change signal
114   Dali::Accessibility::TestEnableSC(false);
115
116   END_TEST;
117 }
118
119 int UtcDaliControlAccessibilityDescription(void)
120 {
121   ToolkitTestApplication application;
122
123   auto control = Control::New();
124
125   auto q = Dali::Accessibility::Accessible::Get(control);
126   DALI_TEST_CHECK(q);
127
128   DALI_TEST_EQUALS("", q->GetDescription(), TEST_LOCATION);
129
130   control.SetProperty(DevelControl::Property::ACCESSIBILITY_DESCRIPTION, "Accessibility_Description");
131   DALI_TEST_EQUALS("Accessibility_Description", q->GetDescription(), TEST_LOCATION);
132
133   auto property = control.GetProperty(DevelControl::Property::ACCESSIBILITY_DESCRIPTION).Get<std::string>();
134   DALI_TEST_EQUALS("Accessibility_Description", property, TEST_LOCATION);
135
136   auto descriptionChangeCallback = [](std::string& accessibilityDescription) { accessibilityDescription = "Accessibility_Description_With_Callback"; };
137
138   DevelControl::AccessibilityGetDescriptionSignal(control).Connect(descriptionChangeCallback);
139
140   DALI_TEST_EQUALS("Accessibility_Description_With_Callback", q->GetDescription(), TEST_LOCATION);
141
142   Dali::Accessibility::TestEnableSC(true);
143
144   DALI_TEST_EQUALS("Accessibility_Description_With_Callback", TestGetDescription(q->GetAddress()), TEST_LOCATION);
145
146   DevelControl::AccessibilityGetDescriptionSignal(control).Disconnect(descriptionChangeCallback);
147
148   auto i = dynamic_cast<Dali::Accessibility::Component*>(q);
149
150   DALI_TEST_CHECK(i);
151   i->GrabHighlight();
152
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);
156
157   //TODO test emission of description change signal
158   Dali::Accessibility::TestEnableSC(false);
159
160   END_TEST;
161 }
162
163 int UtcDaliControlAccessibilityRole(void)
164 {
165   ToolkitTestApplication application;
166
167   auto control         = Control::New();
168   auto role_unknown    = Dali::Accessibility::Role::UNKNOWN;
169   auto role_pushbutton = Dali::Accessibility::Role::PUSH_BUTTON;
170
171   DALI_TEST_EQUALS(role_unknown, control.GetProperty(DevelControl::Property::ACCESSIBILITY_ROLE).Get<Dali::Accessibility::Role>(), TEST_LOCATION);
172
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);
176
177   Dali::Accessibility::TestEnableSC(true);
178   DALI_TEST_CHECK(q);
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);
182
183   control.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, role_pushbutton);
184
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);
188
189   Dali::Accessibility::TestEnableSC(false);
190
191   DALI_TEST_EQUALS(role_pushbutton, q->GetRole(), TEST_LOCATION);
192   DALI_TEST_EQUALS("push button", q->GetRoleName(), TEST_LOCATION);
193
194   END_TEST;
195 }
196
197 int UtcDaliControlAccessibilityRoleToggleButton(void)
198 {
199   ToolkitTestApplication application;
200
201   auto control = Dali::Toolkit::ToggleButton::New();
202   auto button  = Dali::Accessibility::Role::TOGGLE_BUTTON;
203
204   control.SetProperty(Toolkit::ToggleButton::Property::TOOLTIPS,
205                       Property::Array{"option1", "option2"});
206
207   Dali::Accessibility::TestEnableSC(true);
208
209   control.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, button);
210   auto q = Dali::Accessibility::Accessible::Get(control);
211
212   DALI_TEST_EQUALS(button, q->GetRole(), TEST_LOCATION);
213   DALI_TEST_EQUALS("toggle button", q->GetRoleName(), TEST_LOCATION);
214
215   Dali::Accessibility::States states = q->GetStates();
216   DALI_TEST_EQUALS(true, (bool)states[Dali::Accessibility::State::VISIBLE], TEST_LOCATION);
217
218   DALI_TEST_EQUALS("option1", q->GetDescription(), TEST_LOCATION);
219
220   auto i = dynamic_cast<Dali::Accessibility::Component*>(q);
221
222   DALI_TEST_CHECK(i);
223   i->GrabHighlight();
224
225   control.SetProperty(Toolkit::Button::Property::LABEL, "ToggleButton2");
226   DALI_TEST_EQUALS("ToggleButton2", TestGetName(q->GetAddress()), TEST_LOCATION);
227
228   Dali::Accessibility::TestEnableSC(false);
229
230   END_TEST;
231 }
232
233 int UtcDaliControlAccessibilityButtonLabel(void)
234 {
235   ToolkitTestApplication application;
236
237   auto control = Dali::Toolkit::PushButton::New();
238   auto button  = Dali::Accessibility::Role::PUSH_BUTTON;
239
240   Dali::Accessibility::TestEnableSC(true);
241
242   control.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, button);
243
244   auto q = Dali::Accessibility::Accessible::Get(control);
245   auto i = dynamic_cast<Dali::Accessibility::Component*>(q);
246
247   DALI_TEST_CHECK(i);
248   i->GrabHighlight();
249
250   control.SetProperty(Toolkit::Button::Property::LABEL, "Button2");
251
252   DALI_TEST_EQUALS("Button2", TestGetName(q->GetAddress()), TEST_LOCATION);
253
254   Dali::Accessibility::TestEnableSC(false);
255
256   END_TEST;
257 }
258
259 int UtcDaliControlAccessibilityState(void)
260 {
261   ToolkitTestApplication application;
262
263   auto control = Control::New();
264   auto q       = Dali::Accessibility::Accessible::Get(control);
265
266   Dali::Accessibility::TestEnableSC(true);
267
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);
271
272   Dali::Accessibility::TestEnableSC(false);
273
274   END_TEST;
275 }
276
277 int UtcDaliControlAccessibilityModal(void)
278 {
279   ToolkitTestApplication application;
280
281   auto control = Dali::Toolkit::Popup::New();
282   auto q       = Dali::Accessibility::Accessible::Get(control);
283
284   Dali::Accessibility::TestEnableSC(true);
285
286   auto states_by_bridge = Dali::Accessibility::States{TestGetStates(q->GetAddress())};
287   DALI_TEST_CHECK(states_by_bridge[Dali::Accessibility::State::MODAL]);
288
289   Dali::Accessibility::TestEnableSC(false);
290
291   END_TEST;
292 }
293
294 int UtcDaliControlAccessibilityHighlightable(void)
295 {
296   ToolkitTestApplication application;
297   auto                   control = Control::New();
298
299   auto highlightable = control.GetProperty<bool>(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE);
300   DALI_TEST_EQUALS(highlightable, false, TEST_LOCATION);
301
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);
306
307   auto q = Dali::Accessibility::Accessible::Get(control);
308
309   Dali::Accessibility::TestEnableSC(true);
310
311   auto states_by_bridge = Dali::Accessibility::States{TestGetStates(q->GetAddress())};
312   DALI_TEST_CHECK(!states_by_bridge[Dali::Accessibility::State::HIGHLIGHTABLE]);
313
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);
317
318   states_by_bridge = Dali::Accessibility::States{TestGetStates(q->GetAddress())};
319   DALI_TEST_CHECK(states_by_bridge[Dali::Accessibility::State::HIGHLIGHTABLE]);
320
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);
324
325   states_by_bridge = Dali::Accessibility::States{TestGetStates(q->GetAddress())};
326   DALI_TEST_CHECK(!states_by_bridge[Dali::Accessibility::State::HIGHLIGHTABLE]);
327
328   Dali::Accessibility::TestEnableSC(false);
329
330   END_TEST;
331 }
332
333 int UtcDaliControlAccessibilityHighlightBridgeUp(void)
334 {
335   ToolkitTestApplication application;
336
337   auto controla = Control::New();
338   auto controlb = Control::New();
339   controla.Add(controlb);
340
341   controla.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, true);
342   controlb.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, true);
343
344   Dali::Accessibility::TestEnableSC(true);
345
346   auto accessible_a = Dali::Accessibility::Accessible::Get(controla);
347   auto accessible_b = Dali::Accessibility::Accessible::Get(controlb);
348
349   auto a = dynamic_cast<Dali::Accessibility::Component*>(accessible_a);
350   auto b = dynamic_cast<Dali::Accessibility::Component*>(accessible_b);
351
352   auto states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
353   auto states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
354
355   DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
356   DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
357
358   DALI_TEST_EQUALS(true, DevelControl::GrabAccessibilityHighlight(controla), TEST_LOCATION);
359
360   states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
361   states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
362
363   DALI_TEST_CHECK(states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
364   DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
365
366   DALI_TEST_EQUALS(true, DevelControl::GrabAccessibilityHighlight(controlb), TEST_LOCATION);
367   DALI_TEST_EQUALS(true, DevelControl::GrabAccessibilityHighlight(controlb), TEST_LOCATION);
368
369   states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
370   states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
371
372   DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
373   DALI_TEST_CHECK(states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
374
375   DALI_TEST_EQUALS(false, DevelControl::ClearAccessibilityHighlight(controla), TEST_LOCATION);
376
377   states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
378   states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
379
380   DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
381   DALI_TEST_CHECK(states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
382
383   DALI_TEST_EQUALS(true, DevelControl::ClearAccessibilityHighlight(controlb), TEST_LOCATION);
384
385   states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
386   states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
387
388   DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
389   DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
390
391   DALI_TEST_CHECK(TestGrabHighlight(a->GetAddress()));
392
393   states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
394   states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
395
396   DALI_TEST_CHECK(states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
397   DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
398
399   DALI_TEST_CHECK(TestGrabHighlight(b->GetAddress()));
400
401   states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
402   states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
403
404   DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
405   DALI_TEST_CHECK(states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
406
407   DALI_TEST_CHECK(TestClearHighlight(b->GetAddress()));
408
409   states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a->GetAddress())};
410   states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b->GetAddress())};
411
412   DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::HIGHLIGHTED]);
413   DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::HIGHLIGHTED]);
414
415   Dali::Accessibility::TestEnableSC(false);
416
417   END_TEST;
418 }
419
420 int utcDaliAccessibilityControlAttributes(void)
421 {
422   ToolkitTestApplication application;
423   auto                   check_box_button = Toolkit::Control::New();
424
425   std::string value;
426
427   auto attributes     = check_box_button.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
428   auto attributes_map = attributes.GetMap();
429
430   auto position = attributes_map->Find("access_key1");
431   DALI_TEST_CHECK(!position);
432
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();
436
437   DALI_TEST_EQUALS((attributes_map->Find("access_key1"))->Get<std::string>(), "access_value1", TEST_LOCATION);
438
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();
442
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);
445
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();
449
450   DALI_TEST_EQUALS((attributes_map->Find("access_key2"))->Get<std::string>(), "access_value2_b", TEST_LOCATION);
451
452   DevelControl::RemoveAccessibilityAttribute(check_box_button, "access_key2");
453   attributes     = check_box_button.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
454   attributes_map = attributes.GetMap();
455
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);
458
459   Dali::Accessibility::TestEnableSC(true);
460
461   auto ptr                  = Dali::Accessibility::Accessible::Get(check_box_button);
462   auto attribute_map_bridge = TestGetAttributes(ptr->GetAddress());
463   auto counter              = 0u;
464
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)
470       ++counter;
471
472   DALI_TEST_EQUALS(counter, attribute_map_bridge.size(), TEST_LOCATION);
473
474   for(auto it : attribute_map_bridge)
475     DALI_TEST_EQUALS((attributes_map->Find(it.first))->Get<std::string>(), it.second, TEST_LOCATION);
476
477   DevelControl::ClearAccessibilityAttributes(check_box_button);
478   attributes     = check_box_button.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
479   attributes_map = attributes.GetMap();
480
481   position = attributes_map->Find("access_key1");
482   DALI_TEST_CHECK(!position);
483
484   position = attributes_map->Find("access_key2");
485   DALI_TEST_CHECK(!position);
486
487   Dali::Accessibility::TestEnableSC(false);
488
489   END_TEST;
490 }
491
492 int UtcDaliControlReadingInfoType(void)
493 {
494   ToolkitTestApplication application;
495   auto                   control = Control::New();
496
497   auto reading_info_type = DevelControl::GetAccessibilityReadingInfoType(control);
498
499   for(auto i = 0u; i < 4; ++i)
500     DALI_TEST_CHECK(reading_info_type[static_cast<Dali::Accessibility::ReadingInfoType>(i)]);
501
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;
506
507   DevelControl::SetAccessibilityReadingInfoType(control, reading_info_type);
508
509   reading_info_type = DevelControl::GetAccessibilityReadingInfoType(control);
510
511   for(auto i = 0u; i < 4; ++i)
512     DALI_TEST_CHECK(false == reading_info_type[static_cast<Dali::Accessibility::ReadingInfoType>(i)]);
513
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;
518
519   DevelControl::SetAccessibilityReadingInfoType(control, reading_info_type);
520
521   auto q = control.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
522   auto z = q.GetMap();
523
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)]);
528
529   END_TEST;
530 }
531
532 int UtcDaliControlDoGesture(void)
533 {
534   ToolkitTestApplication application;
535   auto                   control = Control::New();
536   Dali::Accessibility::TestEnableSC(true);
537
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};
541
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));
544
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;
548     else
549       gesture.second = false;
550   });
551
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));
554
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));
557
558   Dali::Accessibility::TestEnableSC(false);
559
560   END_TEST;
561 }
562
563 int UtcDaliAccessibilityRelation(void)
564 {
565   ToolkitTestApplication application;
566   Dali::Accessibility::TestEnableSC(true);
567
568   auto rel          = Accessibility::RelationType::FLOWS_TO;
569   auto control      = Control::New();
570   auto destination1 = Control::New();
571   auto destination2 = Control::New();
572
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);
578
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);
584
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();
589
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);
593
594   auto relationset_bridge = TestGetRelationSet(accessible->GetAddress());
595   DALI_TEST_CHECK(static_cast<uint32_t>(relationset[0].mRelationType) == std::get<0>(relationset_bridge[0]));
596
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]);
599
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);
604
605   DevelControl::ClearAccessibilityRelations(control);
606   relations = DevelControl::GetAccessibilityRelations(control);
607   DALI_TEST_EQUALS(relations.size(), 0u, TEST_LOCATION);
608
609   Dali::Accessibility::TestEnableSC(false);
610
611   END_TEST;
612 }
613
614 int UtcDaliAccessibilityParentChildren(void)
615 {
616   ToolkitTestApplication application;
617   Dali::Accessibility::TestEnableSC(true);
618
619   auto parent  = Control::New();
620   auto child_1 = Control::New();
621   auto child_2 = Control::New();
622
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);
626
627   auto children = TestGetChildren(parent_accessible->GetAddress());
628   DALI_TEST_EQUALS(children.size(), 0, TEST_LOCATION);
629
630   try
631   {
632     TestGetIndexInParent(child_1_accessible->GetAddress());
633     DALI_ABORT("Object has parent, test abort");
634   }
635   catch(TestDBusWrapper::error&)
636   {
637   }
638
639   try
640   {
641     TestGetChildAtIndex(parent_accessible->GetAddress(), -1);
642     DALI_ABORT("Positive index, test abort");
643   }
644   catch(TestDBusWrapper::error&)
645   {
646   }
647
648   DALI_TEST_EQUALS(parent_accessible->GetChildCount(), 0, TEST_LOCATION);
649
650   try
651   {
652     child_1_accessible->GetIndexInParent();
653     DALI_ABORT("Object has parent, test abort");
654   }
655   catch(const std::domain_error&)
656   {
657   }
658
659   parent.Add(child_1);
660   parent.Add(child_2);
661
662   children = TestGetChildren(parent_accessible->GetAddress());
663   DALI_TEST_EQUALS(children.size(), 2, TEST_LOCATION);
664
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);
667
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);
670
671   Dali::Accessibility::TestEnableSC(false);
672
673   END_TEST;
674 }
675
676 int UtcDaliAccessibilityGetLayer(void)
677 {
678   ToolkitTestApplication application;
679
680   Dali::Accessibility::TestEnableSC(true);
681
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);
688
689   Dali::Accessibility::TestEnableSC(false);
690
691   END_TEST;
692 }
693
694 int UtcDaliAccessibilityGrabFocus(void)
695 {
696   ToolkitTestApplication application;
697
698   Dali::Accessibility::TestEnableSC(true);
699
700   auto controla = Control::New();
701   auto controlb = Control::New();
702
703   Stage::GetCurrent().Add(controla);
704   Stage::GetCurrent().Add(controlb);
705
706   controla.SetProperty(Actor::Property::KEYBOARD_FOCUSABLE, true);
707   controlb.SetProperty(Actor::Property::KEYBOARD_FOCUSABLE, true);
708
709   auto a = Dali::Accessibility::Accessible::Get(controla);
710   auto b = Dali::Accessibility::Accessible::Get(controlb);
711
712   auto a_component = dynamic_cast<Dali::Accessibility::Component*>(a);
713   auto b_component = dynamic_cast<Dali::Accessibility::Component*>(b);
714
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())};
717
718   DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::FOCUSED]);
719   DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::FOCUSED]);
720
721   DALI_TEST_CHECK(a_component->GrabFocus());
722
723   states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a_component->GetAddress())};
724   states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b_component->GetAddress())};
725
726   DALI_TEST_CHECK(states_by_bridge_a[Dali::Accessibility::State::FOCUSED]);
727   DALI_TEST_CHECK(!states_by_bridge_b[Dali::Accessibility::State::FOCUSED]);
728
729   DALI_TEST_CHECK(TestGrabFocus(b_component->GetAddress()));
730
731   states_by_bridge_a = Dali::Accessibility::States{TestGetStates(a_component->GetAddress())};
732   states_by_bridge_b = Dali::Accessibility::States{TestGetStates(b_component->GetAddress())};
733
734   DALI_TEST_CHECK(!states_by_bridge_a[Dali::Accessibility::State::FOCUSED]);
735   DALI_TEST_CHECK(states_by_bridge_b[Dali::Accessibility::State::FOCUSED]);
736
737   Dali::Accessibility::TestEnableSC(false);
738
739   END_TEST;
740 }
741
742 int UtcDaliAccessibilityGetExtentsScreenAndWindowPositionMatch(void)
743 {
744   ToolkitTestApplication application;
745   tet_infoline("UtcDaliAccessibilityGetExtentsScreenAndWindowPositionMatch");
746
747   Dali::Accessibility::TestEnableSC(true);
748
749   auto control = Control::New();
750   Stage::GetCurrent().GetRootLayer().Add(control);
751
752   auto window = Dali::DevelWindow::Get(control);
753   DALI_TEST_CHECK(window);
754
755   //window.SetPosition({0,0});
756   DevelWindow::SetPositionSize(window, PositionSize(0, 0, 480, 240));
757
758   control.SetProperty(Actor::Property::POSITION, Vector3(10, 10, 100));
759   control.SetProperty(Actor::Property::SIZE, Vector2(10, 10));
760
761   application.SendNotification();
762   application.Render(1);
763
764   auto a           = Dali::Accessibility::Accessible::Get(control);
765   auto a_component = dynamic_cast<Dali::Accessibility::Component*>(a);
766
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);
772
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);
778
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);
784
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);
790
791   control.SetProperty(Dali::DevelActor::Property::POSITION_USES_ANCHOR_POINT, false);
792   application.SendNotification();
793   application.Render(1);
794
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);
800
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);
806
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);
812
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);
818
819   Dali::Accessibility::TestEnableSC(false);
820
821   END_TEST;
822 }
823
824 int UtcDaliAccessibilityGetExtentsScreenAndWindowPositionDoNotMatch(void)
825 {
826   ToolkitTestApplication application;
827
828   Dali::Accessibility::TestEnableSC(true);
829
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));
835
836   control.SetProperty(Actor::Property::POSITION, Vector3(10, 10, 100));
837   control.SetProperty(Actor::Property::SIZE, Vector2(10, 10));
838
839   application.SendNotification();
840   application.Render(1);
841
842   auto a           = Dali::Accessibility::Accessible::Get(control);
843   auto a_component = dynamic_cast<Dali::Accessibility::Component*>(a);
844
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);
850
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);
856
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);
862
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);
868
869   control.SetProperty(Dali::DevelActor::Property::POSITION_USES_ANCHOR_POINT, false);
870   application.SendNotification();
871   application.Render(1);
872
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);
878
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);
884
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);
890
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);
896
897   Dali::Accessibility::TestEnableSC(false);
898
899   END_TEST;
900 }
901
902 int UtcDaliAccessibilityGetAlpha(void)
903 {
904   ToolkitTestApplication application;
905
906   Dali::Accessibility::TestEnableSC(true);
907
908   auto control     = Control::New();
909   auto a           = Dali::Accessibility::Accessible::Get(control);
910   auto a_component = dynamic_cast<Dali::Accessibility::Component*>(a);
911
912   DALI_TEST_EQUALS(0.0, a_component->GetAlpha(), TEST_LOCATION);
913   DALI_TEST_EQUALS(0.0, TestGetAlpha(a_component->GetAddress()), TEST_LOCATION);
914
915   Dali::Accessibility::TestEnableSC(false);
916
917   END_TEST;
918 }
919
920 int UtcDaliAccessibilityGetMdiZOrder(void)
921 {
922   ToolkitTestApplication application;
923
924   Dali::Accessibility::TestEnableSC(true);
925
926   auto control     = Control::New();
927   auto a           = Dali::Accessibility::Accessible::Get(control);
928   auto a_component = dynamic_cast<Dali::Accessibility::Component*>(a);
929
930   DALI_TEST_EQUALS(0, static_cast<int>(a_component->GetMdiZOrder()), TEST_LOCATION);
931   DALI_TEST_EQUALS(0, TestGetMdiZOrder(a_component->GetAddress()), TEST_LOCATION);
932
933   Dali::Accessibility::TestEnableSC(false);
934
935   END_TEST;
936 }
937
938 int UtcDaliAccessibilityAction(void)
939 {
940   ToolkitTestApplication application;
941
942   Dali::Accessibility::TestEnableSC(true);
943
944   auto control = Control::New();
945   auto a       = Dali::Accessibility::Accessible::Get(control);
946   auto b       = dynamic_cast<Dali::Accessibility::Action*>(a);
947
948   std::vector<std::string> actions{"activate", "accessibilityActivated", "ReadingSkipped", "ReadingCancelled", "ReadingStopped", "ReadingPaused", "ReadingResumed", "show", "hide"};
949   auto                     count = b->GetActionCount();
950
951   DALI_TEST_EQUALS(count, 9, TEST_LOCATION);
952
953   for(auto i = 0u; i < count; ++i)
954   {
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);
959   }
960
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);
966
967   count = TestGetActionCount(b->GetAddress());
968
969   DALI_TEST_EQUALS(count, 9, TEST_LOCATION);
970
971   for(auto i = 0u; i < count; ++i)
972   {
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);
977   }
978
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);
983
984   Dali::Accessibility::TestEnableSC(false);
985
986   END_TEST;
987 }
988
989 int UtcDaliAccessibilityDoAction(void)
990 {
991   ToolkitTestApplication application;
992
993   Dali::Accessibility::TestEnableSC(true);
994   thread_local std::vector<bool> actions_done{false, false, false, false, false, false};
995
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"};
1000
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
1005
1006   // Negative test of calling action with not defined name
1007   DALI_TEST_CHECK(!b->DoAction("undefined"));
1008
1009   DevelControl::AccessibilityReadingSkippedSignal(control).Connect([]() {
1010     actions_done[1] = true;
1011   });
1012   DevelControl::AccessibilityReadingCancelledSignal(control).Connect([]() {
1013     actions_done[2] = true;
1014   });
1015   DevelControl::AccessibilityReadingStoppedSignal(control).Connect([]() {
1016     actions_done[3] = true;
1017   });
1018   DevelControl::AccessibilityReadingPausedSignal(control).Connect([]() {
1019     actions_done[4] = true;
1020   });
1021   DevelControl::AccessibilityReadingResumedSignal(control).Connect([]() {
1022     actions_done[5] = true;
1023   });
1024   DevelControl::AccessibilityActivateSignal(control).Connect([]() {
1025     actions_done[0] = true;
1026   });
1027
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));
1035
1036   for(auto i = 0u; i < actions_done.size(); ++i)
1037   {
1038     DALI_TEST_CHECK(actions_done[i]);
1039     actions_done[i] = false;
1040   }
1041
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));
1048
1049   for(auto i = 0u; i < actions_done.size(); ++i)
1050   {
1051     DALI_TEST_CHECK(actions_done[i]);
1052     actions_done[i] = false;
1053   }
1054
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]));
1061
1062   for(auto i = 0u; i < actions_done.size(); ++i)
1063     DALI_TEST_CHECK(actions_done[i]);
1064
1065   Dali::Accessibility::TestEnableSC(false);
1066
1067   END_TEST;
1068 }
1069
1070 void TestVoidCallback()
1071 {
1072 }
1073
1074 int UtcDaliAccessibilitySignals(void)
1075 {
1076   ToolkitTestApplication application;
1077   ConnectionTracker      connectionTracker;
1078   Control                control = Control::New();
1079
1080   DALI_TEST_CHECK(DevelControl::AccessibilityGetNameSignal(control).Empty());
1081   control.ConnectSignal(&connectionTracker, "getName", &TestVoidCallback);
1082   DALI_TEST_CHECK(!DevelControl::AccessibilityGetNameSignal(control).Empty());
1083
1084   DALI_TEST_CHECK(DevelControl::AccessibilityGetDescriptionSignal(control).Empty());
1085   control.ConnectSignal(&connectionTracker, "getDescription", &TestVoidCallback);
1086   DALI_TEST_CHECK(!DevelControl::AccessibilityGetDescriptionSignal(control).Empty());
1087
1088   DALI_TEST_CHECK(DevelControl::AccessibilityDoGestureSignal(control).Empty());
1089   control.ConnectSignal(&connectionTracker, "doGesture", &TestVoidCallback);
1090   DALI_TEST_CHECK(!DevelControl::AccessibilityDoGestureSignal(control).Empty());
1091
1092   END_TEST;
1093 }
1094
1095 static void Wait(ToolkitTestApplication& application)
1096 {
1097   application.SendNotification();
1098   application.Render(16);
1099 }
1100
1101 int UtcDaliAccessibilityScrollToChildScrollView(void)
1102 {
1103   ToolkitTestApplication application;
1104   Dali::Accessibility::TestEnableSC(true);
1105
1106   ScrollView scrollView = ScrollView::New();
1107   application.GetScene().Add(scrollView);
1108
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);
1113
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);
1118
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);
1122
1123   PushButton actorC = PushButton::New();
1124   actorC.SetProperty(Actor::Property::SIZE, Vector2(50.0f, 50.0f));
1125   tableView.AddChild(actorC, TableView::CellPosition(0, 0));
1126
1127   PushButton actorD = PushButton::New();
1128   application.GetScene().Add(actorD);
1129
1130   Wait(application);
1131
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);
1140
1141   accessibleA->GrabHighlight(); // == scrollView.ScrollTo(actorA)
1142   Wait(application);
1143   accessibleB->GrabHighlight(); // == scrollView.ScrollTo(actorB)
1144   Wait(application);
1145
1146   // scrollView is ancestor of actorC
1147   // This should work without a crash
1148   accessibleC->GrabHighlight(); // == scrollView.ScrollTo(actorC)
1149   Wait(application);
1150
1151   // negative testcase calling ScrollToChild using non-child actor
1152   accessibleParent->ScrollToChild(actorD);
1153
1154   Dali::Accessibility::TestEnableSC(false);
1155   END_TEST;
1156 }
1157
1158 namespace
1159 {
1160 class TestItemFactory : public ItemFactory
1161 {
1162 public:
1163   TestItemFactory()
1164   {
1165   }
1166
1167   unsigned int GetNumberOfItems() override
1168   {
1169     return 2;
1170   }
1171
1172   Dali::Actor NewItem(unsigned int itemId) override
1173   {
1174     return TextLabel::New(std::to_string(itemId));
1175   }
1176 };
1177 } // namespace
1178
1179 int UtcDaliAccessibilityScrollToChildItemView(void)
1180 {
1181   ToolkitTestApplication application;
1182   Dali::Accessibility::TestEnableSC(true);
1183
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);
1188
1189   view.AddLayout(*layout);
1190   view.SetProperty(Actor::Property::SIZE, vec);
1191
1192   application.GetScene().Add(view);
1193   layout->SetOrientation(ControlOrientation::Down);
1194   view.ActivateLayout(0, vec, 0.0f);
1195
1196   Wait(application);
1197
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);
1204
1205   accessibleA->GrabHighlight(); // == view.ScrollToItem(view.GetItemId(actorA))
1206   Wait(application);
1207   accessibleB->GrabHighlight(); // == view.ScrollToItem(view.GetItemId(actorB))
1208   Wait(application);
1209
1210   Dali::Accessibility::TestEnableSC(false);
1211   END_TEST;
1212 }
1213
1214 int UtcDaliAccessibilityScrollToChildNonScrollable(void)
1215 {
1216   ToolkitTestApplication application;
1217   Dali::Accessibility::TestEnableSC(true);
1218
1219   TextLabel label = TextLabel::New("123");
1220
1221   auto* accessible = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(label));
1222   DALI_TEST_CHECK(accessible);
1223
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);
1227
1228   Dali::Accessibility::TestEnableSC(false);
1229   END_TEST;
1230 }
1231
1232 int UtcDaliAccessibilityCheckHighlight(void)
1233 {
1234   ToolkitTestApplication application;
1235   Dali::Accessibility::TestEnableSC(true);
1236   Dali::Accessibility::TestResetMoveOutedCalled();
1237
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);
1246
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);
1253
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);
1260   Wait(application);
1261
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();
1266   Wait(application);
1267
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));
1270   Wait(application);
1271   // Need one more notificaiton to get correct updated position
1272   application.SendNotification();
1273   DALI_TEST_EQUALS(true, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);
1274
1275   // Reset verdict data
1276   Dali::Accessibility::TestResetMoveOutedCalled();
1277
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));
1280   Wait(application);
1281   // Need one more notificaiton to get correct updated position
1282   application.SendNotification();
1283   DALI_TEST_EQUALS(false, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);
1284
1285   // Reset verdict data
1286   Dali::Accessibility::TestResetMoveOutedCalled();
1287
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();
1292   Wait(application);
1293
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));
1297   Wait(application);
1298   // Need one more notificaiton to get correct updated position
1299   application.SendNotification();
1300   DALI_TEST_EQUALS(false, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);
1301
1302   // Reset verdict data
1303   Dali::Accessibility::TestResetMoveOutedCalled();
1304
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));
1307   Wait(application);
1308   // Need one more notificaiton to get correct updated position
1309   application.SendNotification();
1310   DALI_TEST_EQUALS(true, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);
1311
1312   // Reset verdict data
1313   Dali::Accessibility::TestResetMoveOutedCalled();
1314
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));
1318   Wait(application);
1319   // Need one more seding notificaiton to get correct updated position
1320   application.SendNotification();
1321   DALI_TEST_EQUALS(false, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);
1322
1323   // Reset verdict data
1324   Dali::Accessibility::TestResetMoveOutedCalled();
1325
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();
1330   Wait(application);
1331
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));
1335   Wait(application);
1336   // Need one more seding notificaiton to get correct updated position
1337   application.SendNotification();
1338   DALI_TEST_EQUALS(false, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION);
1339
1340   Dali::Accessibility::TestEnableSC(false);
1341   END_TEST;
1342 }
1343
1344 int UtcDaliWebViewAccessible(void)
1345 {
1346   ToolkitTestApplication application;
1347
1348   auto webView           = Dali::Toolkit::WebView::New();
1349   auto webViewAccessible = Dali::Accessibility::Accessible::Get(webView);
1350
1351   DALI_TEST_CHECK(webViewAccessible);
1352
1353   auto children = webViewAccessible->GetChildren();
1354
1355   DALI_TEST_CHECK(children.empty());
1356
1357   Dali::Accessibility::TestEnableSC(true);
1358
1359   children = webViewAccessible->GetChildren();
1360
1361   DALI_TEST_EQUALS(children.size(), 1u, TEST_LOCATION);
1362
1363   auto* child = children[0];
1364
1365   DALI_TEST_CHECK(child);
1366   DALI_TEST_CHECK(child->IsProxy());
1367   DALI_TEST_EQUALS(child->GetParent(), webViewAccessible, TEST_LOCATION);
1368
1369   auto address = child->GetAddress();
1370
1371   DALI_TEST_CHECK(address);
1372   DALI_TEST_NOT_EQUALS(address.GetBus(), webViewAccessible->GetAddress().GetBus(), 0.0f, TEST_LOCATION);
1373
1374   Dali::Accessibility::TestEnableSC(false);
1375
1376   children = webViewAccessible->GetChildren();
1377
1378   DALI_TEST_CHECK(children.empty());
1379
1380   END_TEST;
1381 }