AXElements 0.6.0beta2 → 0.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. data/.yardopts +1 -2
  2. data/README.markdown +152 -88
  3. data/Rakefile +8 -103
  4. data/docs/Debugging.markdown +9 -2
  5. data/docs/KeyboardEvents.markdown +114 -49
  6. data/docs/Setting.markdown +1 -0
  7. data/docs/images/next_version.png +0 -0
  8. data/ext/accessibility/key_coder/extconf.rb +22 -0
  9. data/ext/accessibility/key_coder/key_coder.c +113 -0
  10. data/lib/AXElements.rb +2 -0
  11. data/lib/accessibility/core.rb +897 -0
  12. data/lib/accessibility/debug.rb +168 -0
  13. data/lib/accessibility/dsl.rb +697 -0
  14. data/lib/accessibility/enumerators.rb +104 -0
  15. data/lib/accessibility/errors.rb +32 -0
  16. data/lib/accessibility/factory.rb +153 -0
  17. data/lib/accessibility/graph.rb +150 -0
  18. data/lib/{ax_elements/inspector.rb → accessibility/pp_inspector.rb} +39 -28
  19. data/lib/accessibility/qualifier.rb +158 -0
  20. data/lib/accessibility/string.rb +494 -0
  21. data/lib/accessibility/translator.rb +178 -0
  22. data/lib/accessibility/version.rb +7 -0
  23. data/lib/accessibility.rb +79 -0
  24. data/lib/ax/application.rb +234 -0
  25. data/lib/{ax_elements/elements → ax}/button.rb +2 -0
  26. data/lib/ax/element.rb +518 -0
  27. data/lib/{ax_elements/elements → ax}/radio_button.rb +2 -0
  28. data/lib/ax/row.rb +37 -0
  29. data/lib/{ax_elements/elements → ax}/static_text.rb +2 -0
  30. data/lib/ax/systemwide.rb +86 -0
  31. data/lib/ax_elements/awesome_print.rb +25 -0
  32. data/lib/ax_elements/exception_workaround.rb +8 -0
  33. data/lib/ax_elements/nsarray_compat.rb +64 -0
  34. data/lib/ax_elements/vendor/inflection_data.rb +65 -0
  35. data/lib/ax_elements/vendor/inflections.rb +172 -0
  36. data/lib/ax_elements/vendor/inflector.rb +306 -0
  37. data/lib/ax_elements.rb +14 -25
  38. data/lib/minitest/ax_elements.rb +112 -12
  39. data/lib/mouse.rb +72 -46
  40. data/lib/rspec/expectations/ax_elements.rb +133 -6
  41. data/rakelib/doc.rake +13 -0
  42. data/rakelib/ext.rake +61 -0
  43. data/rakelib/gem.rake +28 -0
  44. data/rakelib/test.rake +53 -0
  45. data/test/helper.rb +11 -97
  46. data/test/integration/accessibility/test_core.rb +18 -0
  47. data/test/integration/accessibility/test_debug.rb +44 -0
  48. data/test/integration/accessibility/test_dsl.rb +225 -0
  49. data/test/integration/accessibility/test_enumerators.rb +122 -0
  50. data/test/integration/accessibility/test_errors.rb +38 -0
  51. data/test/integration/accessibility/test_notifications.rb +22 -0
  52. data/test/integration/accessibility/test_qualifier.rb +148 -0
  53. data/test/integration/ax/test_application.rb +56 -0
  54. data/test/integration/ax/test_element.rb +46 -0
  55. data/test/integration/ax/test_row.rb +23 -0
  56. data/test/integration/ax_elements/test_nsarray_compat.rb +43 -0
  57. data/test/integration/minitest/test_ax_elements.rb +98 -0
  58. data/test/integration/rspec/expectations/test_ax_elements.rb +58 -0
  59. data/test/integration/test_mouse.rb +35 -0
  60. data/test/sanity/accessibility/test_core.rb +553 -0
  61. data/test/sanity/accessibility/test_debug.rb +63 -0
  62. data/test/sanity/accessibility/test_dsl.rb +75 -0
  63. data/test/sanity/accessibility/test_errors.rb +10 -0
  64. data/test/sanity/accessibility/test_factory.rb +88 -0
  65. data/test/sanity/accessibility/test_pp_inspector.rb +110 -0
  66. data/test/sanity/accessibility/test_qualifier.rb +13 -0
  67. data/test/sanity/accessibility/test_string.rb +238 -0
  68. data/test/sanity/accessibility/test_translator.rb +145 -0
  69. data/test/sanity/ax/test_application.rb +90 -0
  70. data/test/sanity/ax/test_element.rb +80 -0
  71. data/test/sanity/ax/test_systemwide.rb +66 -0
  72. data/test/sanity/ax_elements/test_nsarray_compat.rb +16 -0
  73. data/test/sanity/ax_elements/test_nsobject_inspect.rb +11 -0
  74. data/test/sanity/minitest/test_ax_elements.rb +15 -0
  75. data/test/sanity/rspec/expectations/test_ax_elements.rb +12 -0
  76. data/test/sanity/test_ax_elements.rb +10 -0
  77. data/test/sanity/test_mouse.rb +19 -0
  78. metadata +111 -93
  79. data/LICENSE.txt +0 -25
  80. data/ext/key_coder/extconf.rb +0 -6
  81. data/ext/key_coder/key_coder.m +0 -77
  82. data/lib/ax_elements/accessibility/enumerators.rb +0 -104
  83. data/lib/ax_elements/accessibility/graph.rb +0 -118
  84. data/lib/ax_elements/accessibility/language.rb +0 -347
  85. data/lib/ax_elements/accessibility/qualifier.rb +0 -73
  86. data/lib/ax_elements/accessibility.rb +0 -166
  87. data/lib/ax_elements/core.rb +0 -541
  88. data/lib/ax_elements/element.rb +0 -593
  89. data/lib/ax_elements/elements/application.rb +0 -88
  90. data/lib/ax_elements/elements/row.rb +0 -30
  91. data/lib/ax_elements/elements/systemwide.rb +0 -46
  92. data/lib/ax_elements/macruby_extensions.rb +0 -255
  93. data/lib/ax_elements/notification.rb +0 -37
  94. data/lib/ax_elements/version.rb +0 -9
  95. data/test/elements/test_application.rb +0 -72
  96. data/test/elements/test_row.rb +0 -27
  97. data/test/elements/test_systemwide.rb +0 -38
  98. data/test/test_accessibility.rb +0 -127
  99. data/test/test_blankness.rb +0 -26
  100. data/test/test_core.rb +0 -448
  101. data/test/test_element.rb +0 -939
  102. data/test/test_enumerators.rb +0 -81
  103. data/test/test_inspector.rb +0 -130
  104. data/test/test_language.rb +0 -157
  105. data/test/test_macruby_extensions.rb +0 -303
  106. data/test/test_mouse.rb +0 -5
  107. data/test/test_search_semantics.rb +0 -143
@@ -1,143 +0,0 @@
1
- ##
2
- # Integration level tests that make sure search semantics are working,
3
- # these are effectively the tests for Accessibility::Qualifier.
4
- class TestSearchSemantics < TestAX
5
-
6
- def app
7
- @@app ||= AX::Application.new REF, AX.attrs_of_element(REF)
8
- end
9
-
10
- def window
11
- @@window ||= app.attribute(:main_window)
12
- end
13
-
14
- def test_finds_things_one_level_deep
15
- assert_equal window, app.search(:standard_window)
16
- end
17
-
18
- def test_finds_things_two_levels_deep
19
- expected = app.attribute(:main_window).attribute(:close_button)
20
- assert_equal expected, app.search(:close_button)
21
- end
22
-
23
- def test_finds_even_with_no_filters
24
- assert_equal app.attribute(:menu_bar), app.search(:menu_bar)
25
- end
26
-
27
- def test_finds_with_a_filter
28
- assert_equal 'Yes', window.search(:button, title: 'Yes').attribute(:title)
29
- assert_equal 'No', window.search(:button, title: 'No') .attribute(:title)
30
- assert_equal 'Maybe So', window.search(:button, enabled: false).attribute(:title)
31
- end
32
-
33
- def test_uses_all_filters
34
- assert_nil window.search(:button, title: 'Maybe So', enabled: true)
35
- assert_equal 'Yes', window.search(:button, title: 'Yes', enabled: true).attribute(:title)
36
- end
37
-
38
- def test_returns_element_when_found
39
- assert_kind_of AX::Button, window.search(:button)
40
- assert_kind_of AX::Button, window.search(:buttons).first
41
- end
42
-
43
- def test_returns_nil_when_nothing_found
44
- assert_nil window.search(:what_you_call_it)
45
- assert_empty window.search(:what_you_call_its)
46
- end
47
-
48
- def test_searching_for_superclass_will_also_find_subclasses
49
- ret = window.search(:buttons).map &:class
50
- assert_includes ret, AX::CloseButton
51
- assert_includes ret, AX::FullScreenButton
52
- assert_includes ret, AX::SortButton
53
- end
54
-
55
- def test_searching_for_subclasses_will_not_find_superclasses
56
- ret = window.search(:full_screen_buttons)
57
- assert_equal 1, ret.size
58
- assert_instance_of AX::FullScreenButton, ret.first
59
- end
60
-
61
- def test_does_not_fault_when_element_does_not_respond_to_filter
62
- expected = window.attribute(:close_button)
63
- actual = window.search(:button, subrole: KAXCloseButtonSubrole)
64
- assert_equal expected, actual
65
- end
66
-
67
- # @note test is kind of lame since we only have one window
68
- # @note this test exists for legacy purposes, the actual
69
- # logic has since moved elsewhere but behavior should
70
- # remain
71
- def test_title_ui_element_filtering
72
- # case 1: classes match
73
- text = window.attribute(:children).find do |child|
74
- child.class == AX::StaticText
75
- end
76
- actual = app.search(:window, title_ui_element: text)
77
- assert_equal window, actual
78
-
79
- # case 2: classes do not match
80
- actual = app.search(:window, title_ui_element: 'AXElementsTester')
81
- assert_equal window, actual
82
- end
83
-
84
- # @note this test exists for legacy purposes, the actual
85
- # logic has since moved elsewhere but behavior should
86
- # remain
87
- def test_table_header_filtering
88
- area = window.attribute(:children).find do |child|
89
- child.class == AX::ScrollArea &&
90
- child.attributes.include?(KAXIdentifierAttribute) &&
91
- child.attribute(:identifier) == 'table'
92
- end
93
- table = area.attribute(:children).find { |child| child.class == AX::Table }
94
-
95
- # case 1: classes match
96
- column = table.attribute(:columns).first
97
- button = column.attribute(:header)
98
- search_result = table.search(:column, header: button)
99
- assert_equal column, search_result
100
-
101
- # case 2: classes do not match
102
- assert_equal 'One', table.search(:column, header: 'One').attribute(:header).attribute(:title)
103
- end
104
-
105
- # @note another legacy test
106
- def test_true_false_class_mismatch
107
- # since search does a class comparison to try and infer things,
108
- # it does not work with boolean values since they have different
109
- # classes, so we have another workaround for that case
110
- assert_nil window.search(:button, title: 'Maybe So', enabled: true)
111
- assert_nil window.search(:button, title: 'Really Long Button Title')
112
- end
113
-
114
- # @note another legacy test
115
- def test_nil_attribute_is_handled_as_special_case
116
- # some attributes store nil as their value, but the filter
117
- # might have been expecting string types, similar to how
118
- # we need to handle true/false classness...
119
-
120
- # case 0: expected and actual are nil
121
- assert_equal window, app.search(:window, default_button: nil)
122
-
123
- # case 1: actual value is nil does not explode
124
- button = window.attribute(:close_button)
125
- assert_nil app.search(:window, default_button: button)
126
-
127
- # case 2: expected value is nil does not explode
128
- assert_nil window.search(:button, parent: nil)
129
- end
130
-
131
- def test_nested_search_passes_filters_through
132
- filters = { title: 'Yes' }
133
- assert_equal window, app.search(:standard_window, button: filters)
134
- assert_equal window, app.search(:standard_windows, button: filters).first
135
- assert_equal window, app.search(:standard_window, button: NSDictionary.dictionary)
136
- end
137
-
138
- def test_nested_search_triggered_for_hash_filters # when filter is also an attribute
139
- assert_equal window, app.search(:standard_window, close_button: { enabled: true })
140
- assert_nil app.search(:standard_window, close_button: { enabled: false })
141
- end
142
-
143
- end