AXElements 0.6.0beta1

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 (54) hide show
  1. data/.yardopts +20 -0
  2. data/LICENSE.txt +25 -0
  3. data/README.markdown +150 -0
  4. data/Rakefile +109 -0
  5. data/docs/AccessibilityTips.markdown +119 -0
  6. data/docs/Acting.markdown +340 -0
  7. data/docs/Debugging.markdown +326 -0
  8. data/docs/Inspecting.markdown +255 -0
  9. data/docs/KeyboardEvents.markdown +57 -0
  10. data/docs/NewBehaviour.markdown +151 -0
  11. data/docs/Notifications.markdown +271 -0
  12. data/docs/Searching.markdown +250 -0
  13. data/docs/TestingExtensions.markdown +52 -0
  14. data/docs/images/AX.png +0 -0
  15. data/docs/images/all_the_buttons.jpg +0 -0
  16. data/docs/images/ui_hierarchy.dot +34 -0
  17. data/docs/images/ui_hierarchy.png +0 -0
  18. data/ext/key_coder/extconf.rb +6 -0
  19. data/ext/key_coder/key_coder.m +77 -0
  20. data/lib/ax_elements/accessibility/enumerators.rb +104 -0
  21. data/lib/ax_elements/accessibility/language.rb +347 -0
  22. data/lib/ax_elements/accessibility/qualifier.rb +73 -0
  23. data/lib/ax_elements/accessibility.rb +164 -0
  24. data/lib/ax_elements/core.rb +541 -0
  25. data/lib/ax_elements/element.rb +593 -0
  26. data/lib/ax_elements/elements/application.rb +88 -0
  27. data/lib/ax_elements/elements/button.rb +18 -0
  28. data/lib/ax_elements/elements/radio_button.rb +18 -0
  29. data/lib/ax_elements/elements/row.rb +30 -0
  30. data/lib/ax_elements/elements/static_text.rb +17 -0
  31. data/lib/ax_elements/elements/systemwide.rb +46 -0
  32. data/lib/ax_elements/inspector.rb +116 -0
  33. data/lib/ax_elements/macruby_extensions.rb +255 -0
  34. data/lib/ax_elements/notification.rb +37 -0
  35. data/lib/ax_elements/version.rb +9 -0
  36. data/lib/ax_elements.rb +30 -0
  37. data/lib/minitest/ax_elements.rb +19 -0
  38. data/lib/mouse.rb +185 -0
  39. data/lib/rspec/expectations/ax_elements.rb +15 -0
  40. data/test/elements/test_application.rb +72 -0
  41. data/test/elements/test_row.rb +27 -0
  42. data/test/elements/test_systemwide.rb +38 -0
  43. data/test/helper.rb +119 -0
  44. data/test/test_accessibility.rb +127 -0
  45. data/test/test_blankness.rb +26 -0
  46. data/test/test_core.rb +448 -0
  47. data/test/test_element.rb +939 -0
  48. data/test/test_enumerators.rb +81 -0
  49. data/test/test_inspector.rb +121 -0
  50. data/test/test_language.rb +157 -0
  51. data/test/test_macruby_extensions.rb +303 -0
  52. data/test/test_mouse.rb +5 -0
  53. data/test/test_search_semantics.rb +143 -0
  54. metadata +219 -0
@@ -0,0 +1,143 @@
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
metadata ADDED
@@ -0,0 +1,219 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: AXElements
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: 5
5
+ version: 0.6.0beta1
6
+ platform: ruby
7
+ authors:
8
+ - Mark Rada
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-09-29 00:00:00 -04:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activesupport
17
+ prerelease: false
18
+ requirement: !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: 3.1.0
24
+ type: :runtime
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ~>
29
+ - !ruby/object:Gem::Version
30
+ version: 3.1.0
31
+ - !ruby/object:Gem::Dependency
32
+ name: i18n
33
+ prerelease: false
34
+ requirement: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ~>
38
+ - !ruby/object:Gem::Version
39
+ version: 0.6.0
40
+ type: :runtime
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: 0.6.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: minitest
49
+ prerelease: false
50
+ requirement: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: "2.5"
56
+ type: :development
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: "2.5"
63
+ - !ruby/object:Gem::Dependency
64
+ name: yard
65
+ prerelease: false
66
+ requirement: !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ~>
70
+ - !ruby/object:Gem::Version
71
+ version: 0.7.2
72
+ type: :development
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ version: 0.7.2
79
+ - !ruby/object:Gem::Dependency
80
+ name: redcarpet
81
+ prerelease: false
82
+ requirement: !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: "1.17"
88
+ type: :development
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ~>
93
+ - !ruby/object:Gem::Version
94
+ version: "1.17"
95
+ description: 'AXElements is a DSL abstraction on top of the Mac OS X Accessibility
96
+ Framework
97
+
98
+ that allows code to be written in a very natural and declarative style that
99
+
100
+ describes user interactions.
101
+
102
+ '
103
+ email: mrada@marketcircle.com
104
+ executables: []
105
+ extensions:
106
+ - ext/key_coder/extconf.rb
107
+ extra_rdoc_files:
108
+ - docs/AccessibilityTips.markdown
109
+ - docs/Acting.markdown
110
+ - docs/Debugging.markdown
111
+ - docs/images/all_the_buttons.jpg
112
+ - docs/images/AX.png
113
+ - docs/images/ui_hierarchy.dot
114
+ - docs/images/ui_hierarchy.png
115
+ - docs/Inspecting.markdown
116
+ - docs/KeyboardEvents.markdown
117
+ - docs/NewBehaviour.markdown
118
+ - docs/Notifications.markdown
119
+ - docs/Searching.markdown
120
+ - docs/TestingExtensions.markdown
121
+ - .yardopts
122
+ - LICENSE.txt
123
+ - README.markdown
124
+ files:
125
+ - lib/ax_elements/accessibility/enumerators.rb
126
+ - lib/ax_elements/accessibility/language.rb
127
+ - lib/ax_elements/accessibility/qualifier.rb
128
+ - lib/ax_elements/accessibility.rb
129
+ - lib/ax_elements/core.rb
130
+ - lib/ax_elements/element.rb
131
+ - lib/ax_elements/elements/application.rb
132
+ - lib/ax_elements/elements/button.rb
133
+ - lib/ax_elements/elements/radio_button.rb
134
+ - lib/ax_elements/elements/row.rb
135
+ - lib/ax_elements/elements/static_text.rb
136
+ - lib/ax_elements/elements/systemwide.rb
137
+ - lib/ax_elements/inspector.rb
138
+ - lib/ax_elements/macruby_extensions.rb
139
+ - lib/ax_elements/notification.rb
140
+ - lib/ax_elements/version.rb
141
+ - lib/ax_elements.rb
142
+ - lib/minitest/ax_elements.rb
143
+ - lib/mouse.rb
144
+ - lib/rspec/expectations/ax_elements.rb
145
+ - ext/key_coder/extconf.rb
146
+ - ext/key_coder/key_coder.m
147
+ - Rakefile
148
+ - test/elements/test_application.rb
149
+ - test/elements/test_row.rb
150
+ - test/elements/test_systemwide.rb
151
+ - test/test_accessibility.rb
152
+ - test/test_blankness.rb
153
+ - test/test_core.rb
154
+ - test/test_element.rb
155
+ - test/test_enumerators.rb
156
+ - test/test_inspector.rb
157
+ - test/test_language.rb
158
+ - test/test_macruby_extensions.rb
159
+ - test/test_mouse.rb
160
+ - test/test_search_semantics.rb
161
+ - test/helper.rb
162
+ - docs/AccessibilityTips.markdown
163
+ - docs/Acting.markdown
164
+ - docs/Debugging.markdown
165
+ - docs/images/all_the_buttons.jpg
166
+ - docs/images/AX.png
167
+ - docs/images/ui_hierarchy.dot
168
+ - docs/images/ui_hierarchy.png
169
+ - docs/Inspecting.markdown
170
+ - docs/KeyboardEvents.markdown
171
+ - docs/NewBehaviour.markdown
172
+ - docs/Notifications.markdown
173
+ - docs/Searching.markdown
174
+ - docs/TestingExtensions.markdown
175
+ - .yardopts
176
+ - LICENSE.txt
177
+ - README.markdown
178
+ has_rdoc: true
179
+ homepage: http://github.com/Marketcircle/AXElements
180
+ licenses:
181
+ - BSD 3-clause
182
+ post_install_message:
183
+ rdoc_options: []
184
+ require_paths:
185
+ - lib
186
+ - ext
187
+ required_ruby_version: !ruby/object:Gem::Requirement
188
+ none: false
189
+ requirements:
190
+ - - '>='
191
+ - !ruby/object:Gem::Version
192
+ version: "0"
193
+ required_rubygems_version: !ruby/object:Gem::Requirement
194
+ none: false
195
+ requirements:
196
+ - - '>'
197
+ - !ruby/object:Gem::Version
198
+ version: 1.3.1
199
+ requirements: []
200
+ rubyforge_project:
201
+ rubygems_version: 1.4.2
202
+ signing_key:
203
+ specification_version: 3
204
+ summary: A DSL for automating GUI manipulation
205
+ test_files:
206
+ - test/elements/test_application.rb
207
+ - test/elements/test_row.rb
208
+ - test/elements/test_systemwide.rb
209
+ - test/test_accessibility.rb
210
+ - test/test_blankness.rb
211
+ - test/test_core.rb
212
+ - test/test_element.rb
213
+ - test/test_enumerators.rb
214
+ - test/test_inspector.rb
215
+ - test/test_language.rb
216
+ - test/test_macruby_extensions.rb
217
+ - test/test_mouse.rb
218
+ - test/test_search_semantics.rb
219
+ - test/helper.rb