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.
- data/.yardopts +20 -0
- data/LICENSE.txt +25 -0
- data/README.markdown +150 -0
- data/Rakefile +109 -0
- data/docs/AccessibilityTips.markdown +119 -0
- data/docs/Acting.markdown +340 -0
- data/docs/Debugging.markdown +326 -0
- data/docs/Inspecting.markdown +255 -0
- data/docs/KeyboardEvents.markdown +57 -0
- data/docs/NewBehaviour.markdown +151 -0
- data/docs/Notifications.markdown +271 -0
- data/docs/Searching.markdown +250 -0
- data/docs/TestingExtensions.markdown +52 -0
- data/docs/images/AX.png +0 -0
- data/docs/images/all_the_buttons.jpg +0 -0
- data/docs/images/ui_hierarchy.dot +34 -0
- data/docs/images/ui_hierarchy.png +0 -0
- data/ext/key_coder/extconf.rb +6 -0
- data/ext/key_coder/key_coder.m +77 -0
- data/lib/ax_elements/accessibility/enumerators.rb +104 -0
- data/lib/ax_elements/accessibility/language.rb +347 -0
- data/lib/ax_elements/accessibility/qualifier.rb +73 -0
- data/lib/ax_elements/accessibility.rb +164 -0
- data/lib/ax_elements/core.rb +541 -0
- data/lib/ax_elements/element.rb +593 -0
- data/lib/ax_elements/elements/application.rb +88 -0
- data/lib/ax_elements/elements/button.rb +18 -0
- data/lib/ax_elements/elements/radio_button.rb +18 -0
- data/lib/ax_elements/elements/row.rb +30 -0
- data/lib/ax_elements/elements/static_text.rb +17 -0
- data/lib/ax_elements/elements/systemwide.rb +46 -0
- data/lib/ax_elements/inspector.rb +116 -0
- data/lib/ax_elements/macruby_extensions.rb +255 -0
- data/lib/ax_elements/notification.rb +37 -0
- data/lib/ax_elements/version.rb +9 -0
- data/lib/ax_elements.rb +30 -0
- data/lib/minitest/ax_elements.rb +19 -0
- data/lib/mouse.rb +185 -0
- data/lib/rspec/expectations/ax_elements.rb +15 -0
- data/test/elements/test_application.rb +72 -0
- data/test/elements/test_row.rb +27 -0
- data/test/elements/test_systemwide.rb +38 -0
- data/test/helper.rb +119 -0
- data/test/test_accessibility.rb +127 -0
- data/test/test_blankness.rb +26 -0
- data/test/test_core.rb +448 -0
- data/test/test_element.rb +939 -0
- data/test/test_enumerators.rb +81 -0
- data/test/test_inspector.rb +121 -0
- data/test/test_language.rb +157 -0
- data/test/test_macruby_extensions.rb +303 -0
- data/test/test_mouse.rb +5 -0
- data/test/test_search_semantics.rb +143 -0
- 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
|