AXElements 1.0.0.alpha11 → 1.0.0.beta

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 (48) hide show
  1. data/History.markdown +11 -1
  2. data/README.markdown +10 -8
  3. data/Rakefile +1 -1
  4. data/lib/accessibility/dsl.rb +5 -2
  5. data/lib/accessibility/factory.rb +134 -78
  6. data/lib/accessibility/qualifier.rb +2 -0
  7. data/lib/accessibility/system_info.rb +82 -17
  8. data/lib/accessibility/translator.rb +17 -17
  9. data/lib/accessibility/version.rb +1 -1
  10. data/lib/ax/application.rb +11 -16
  11. data/lib/ax/element.rb +21 -34
  12. data/lib/ax/systemwide.rb +2 -2
  13. data/lib/ax_elements.rb +7 -1
  14. data/lib/ax_elements/active_support_selections.rb +10 -0
  15. data/lib/ax_elements/mri.rb +57 -0
  16. data/lib/ax_elements/nsarray_compat.rb +97 -17
  17. data/rakelib/gem.rake +12 -3
  18. data/rakelib/test.rake +0 -6
  19. data/test/helper.rb +10 -20
  20. data/test/integration/accessibility/test_dsl.rb +6 -14
  21. data/test/integration/accessibility/test_enumerators.rb +0 -1
  22. data/test/integration/accessibility/test_graph.rb +1 -0
  23. data/test/integration/accessibility/test_qualifier.rb +2 -2
  24. data/test/integration/ax/test_application.rb +2 -2
  25. data/test/sanity/accessibility/test_factory.rb +2 -2
  26. data/test/sanity/accessibility/test_pretty_printer.rb +2 -2
  27. data/test/sanity/ax/test_application.rb +1 -1
  28. data/test/sanity/ax/test_element.rb +2 -2
  29. data/test/sanity/ax_elements/test_nsobject_inspect.rb +4 -2
  30. metadata +28 -36
  31. data/ext/accessibility/core/core.c +0 -26
  32. data/lib/accessibility/core.rb +0 -943
  33. data/lib/accessibility/highlighter.rb +0 -86
  34. data/lib/accessibility/statistics.rb +0 -57
  35. data/lib/ax_elements/core_graphics_workaround.rb +0 -7
  36. data/lib/ax_elements/vendor/inflection_data.rb +0 -66
  37. data/lib/ax_elements/vendor/inflections.rb +0 -176
  38. data/lib/ax_elements/vendor/inflector.rb +0 -306
  39. data/lib/minitest/ax_elements.rb +0 -180
  40. data/lib/rspec/expectations/ax_elements.rb +0 -234
  41. data/test/integration/accessibility/test_core.rb +0 -18
  42. data/test/integration/minitest/test_ax_elements.rb +0 -89
  43. data/test/integration/rspec/expectations/test_ax_elements.rb +0 -102
  44. data/test/sanity/accessibility/test_highlighter.rb +0 -56
  45. data/test/sanity/accessibility/test_statistics.rb +0 -57
  46. data/test/sanity/minitest/test_ax_elements.rb +0 -17
  47. data/test/sanity/rspec/expectations/test_ax_elements.rb +0 -15
  48. data/test/test_core.rb +0 -454
@@ -1,102 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- require 'test/integration/helper'
3
- require 'rspec/expectations/ax_elements'
4
-
5
- class TestRSpecMatchers < MiniTest::Unit::TestCase
6
-
7
-
8
- def test_have_child_should_failure_message
9
- e = app.main_window.slider
10
- m = have_child(:window)
11
-
12
- refute m.matches?(e)
13
- assert_equal "Expected #{e.inspect} to have child Window", m.failure_message_for_should
14
- end
15
-
16
- def test_have_child_should_not_failure_message
17
- e = app.window
18
- m = have_child(:window)
19
-
20
- refute m.does_not_match?(app)
21
- assert_equal "Expected #{app.inspect} to NOT have child #{e.inspect}", m.failure_message_for_should_not
22
- end
23
-
24
- def test_have_child_description
25
- m = have_child(:window) { }
26
- assert_equal 'should have a child that matches Window[✔]', m.description
27
- end
28
-
29
-
30
-
31
- def test_have_descendent_should_failure_message
32
- m = have_descendent(:button)
33
- e = app.main_window.slider
34
-
35
- refute m.matches?(e)
36
- assert_equal "Expected #{e.inspect} to have descendent Button", m.failure_message_for_should
37
- end
38
-
39
- def test_have_descendent_should_not_failure_message
40
- m = have_descendant(:window)
41
- e = app.window
42
-
43
- refute m.does_not_match?(app)
44
- assert_equal "Expected #{app.inspect} to NOT have descendent #{e.inspect}", m.failure_message_for_should_not
45
- end
46
-
47
- def test_have_descendent_description
48
- m = have_descendent(:button)
49
- assert_equal 'should have a descendent matching Button', m.description
50
- end
51
-
52
-
53
-
54
- def test_shortly_have_child_should_failure_message
55
- m = shortly_have_child(:button, timeout: 0) { }
56
- e = app.main_window.slider
57
-
58
- refute m.matches?(e)
59
- assert_equal "Expected #{e.inspect} to have child Button[✔] before a timeout occurred",
60
- m.failure_message_for_should
61
- end
62
-
63
- def test_shortly_have_child_should_not_failure_message
64
- m = shortly_have_child(:window)
65
- e = app
66
-
67
- refute m.does_not_match?(e)
68
- assert_equal "Expected #{e.inspect} to NOT have child #{e.window.inspect} before a timeout occurred",
69
- m.failure_message_for_should_not
70
- end
71
-
72
- def test_shortly_have_child_description
73
- m = shortly_have_child(:button)
74
- assert_equal 'should have a child that matches Button before a timeout occurs', m.description
75
- end
76
-
77
-
78
-
79
- def test_shortly_have_descendent_should_failure_message
80
- m = shortly_have_descendent(:button, timeout: 0)
81
- e = app.main_window.slider
82
-
83
- refute m.matches?(e)
84
- assert_equal "Expected #{e.inspect} to have descendent Button before a timeout occurred",
85
- m.failure_message_for_should
86
- end
87
-
88
- def test_shortly_have_descendent_should_not_failure_message
89
- m = shortly_have_descendent(:window)
90
- e = app
91
-
92
- refute m.does_not_match?(e)
93
- assert_equal "Expected #{e.inspect} to NOT have descendent #{e.window.inspect} before a timeout occurred",
94
- m.failure_message_for_should_not
95
- end
96
-
97
- def test_shortly_have_descendent_description
98
- m = shortly_have_descendent(:button)
99
- assert_equal 'should have a descendent matching Button before a timeout occurs', m.description
100
- end
101
-
102
- end
@@ -1,56 +0,0 @@
1
- require 'test/runner'
2
- require 'accessibility/highlighter'
3
-
4
- class TestHighlighter < MiniTest::Unit::TestCase
5
-
6
- def bounds
7
- CGRectMake(100, 100, 100, 100)
8
- end
9
-
10
- def test_highlight_returns_created_window
11
- w = Accessibility::Highlighter.new bounds
12
- assert_kind_of NSWindow, w
13
- assert_respond_to w, :stop
14
- ensure
15
- w.close if w
16
- end
17
-
18
- def test_highlight_can_take_a_timeout
19
- w = Accessibility::Highlighter.new bounds, timeout: 0.1
20
- assert w.visible?
21
- sleep 0.15
22
- refute w.visible? # Not exactly the assertion I want, but close enough
23
- ensure
24
- w.close if w
25
- end
26
-
27
- def test_highlight_can_have_custom_colour
28
- w = Accessibility::Highlighter.new bounds, color: NSColor.cyanColor
29
- assert w.backgroundColor == NSColor.cyanColor
30
- w.close
31
-
32
- # test both spellings of colour
33
- w = Accessibility::Highlighter.new bounds, colour: NSColor.purpleColor
34
- assert w.backgroundColor == NSColor.purpleColor
35
- end
36
-
37
- def test_highlight_highlights_correct_rect
38
- w = Accessibility::Highlighter.new bounds
39
- assert_equal w.frame, bounds.flip!
40
- end
41
-
42
- end
43
-
44
- class TestCGRectExtensions < MiniTest::Unit::TestCase
45
-
46
- def test_flipping
47
- size = NSScreen.mainScreen.frame.size
48
- assert_equal CGRectMake(0, size.height, 0, 0), CGRectZero.dup.flip!
49
- assert_equal CGRectMake(100, size.height-200, 100, 100), CGRectMake(100,100,100,100).flip!
50
- end
51
-
52
- def test_flipping_twice_returns_to_original
53
- assert_equal CGRectZero.dup, CGRectZero.dup.flip!.flip!
54
- end
55
-
56
- end
@@ -1,57 +0,0 @@
1
- require 'test/runner'
2
- require 'accessibility/statistics'
3
-
4
- class TestAccessibilityStatistics < MiniTest::Unit::TestCase
5
-
6
- def setup
7
- @stats = Accessibility::Statistics.new
8
- @q = @stats.instance_variable_get :@q
9
- @s = @stats.instance_variable_get :@stats
10
- end
11
-
12
- def test_global_constant
13
- assert_instance_of Accessibility::Statistics, STATS
14
- end
15
-
16
- def test_collects_stats
17
- assert_equal 0, @s[:pie]
18
- assert_equal 0, @s[:cake]
19
- @stats.increment :cake
20
- @q.sync { }
21
- assert_equal 1, @s[:cake]
22
- assert_equal 0, @s[:pie]
23
- @stats.increment :cake
24
- @q.sync { }
25
- assert_equal 2, @s[:cake]
26
- assert_equal 0, @s[:pie]
27
- @stats.increment :pie
28
- @q.sync { }
29
- assert_equal 2, @s[:cake]
30
- assert_equal 1, @s[:pie]
31
- end
32
-
33
- def test_concurrency
34
- loops = 1_000_000
35
- loops.times do @stats.increment :pie end
36
- @q.sync { }
37
- assert_equal loops, @s[:pie]
38
- end
39
-
40
- def test_to_s
41
- 100.times do @stats.increment :cake end
42
- 2.times do @stats.increment :pie end
43
- 50.times do @stats.increment :long_attribute_name end
44
- expected = <<-EOS
45
- ######################
46
- # AX Call Statistics #
47
- ######################
48
- cake...................100
49
- long_attribute_name.....50
50
- pie......................2
51
- EOS
52
- assert_equal expected, @stats.to_s
53
- end
54
-
55
- # @todo bench_increment
56
-
57
- end
@@ -1,17 +0,0 @@
1
- require 'test/runner'
2
- require 'minitest/ax_elements'
3
-
4
- class TestMiniTestAssertions < MiniTest::Unit::TestCase
5
-
6
- def test_methods_are_loaded
7
- assert_respond_to self, :assert_has_child
8
- assert_respond_to self, :assert_has_descendent
9
- assert_respond_to self, :assert_has_descendant
10
- assert_respond_to self, :assert_shortly_has
11
- assert_respond_to self, :refute_has_child
12
- assert_respond_to self, :refute_has_descendent
13
- assert_respond_to self, :refute_has_descendant
14
- assert_respond_to self, :refute_shortly_has
15
- end
16
-
17
- end
@@ -1,15 +0,0 @@
1
- require 'test/runner'
2
- require 'rspec/expectations/ax_elements'
3
-
4
- class TestRSpecMatchers < MiniTest::Unit::TestCase
5
-
6
- def test_defined
7
- assert TopLevel.method(:have_child)
8
- assert TopLevel.method(:have_descendent)
9
- assert TopLevel.method(:have_descendant)
10
- assert TopLevel.method(:shortly_have_child)
11
- assert TopLevel.method(:shortly_have_descendent)
12
- assert TopLevel.method(:shortly_have_descendant)
13
- end
14
-
15
- end
data/test/test_core.rb DELETED
@@ -1,454 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- require 'test/helper'
4
- require 'accessibility/core'
5
-
6
-
7
- class TestAccessibilityElement < MiniTest::Unit::TestCase
8
-
9
- def child name
10
- window.children.find { |item|
11
- (block_given? ? yield(item) : true) if item.role == name
12
- }
13
- end
14
-
15
- def app; @@app ||= REF end
16
- def window; @@window ||= app.attribute(KAXWindowsAttribute).first end
17
- def slider; @@slider ||= child KAXSliderRole end
18
- def check_box; @@check_box ||= child KAXCheckBoxRole end
19
- def pop_up; @@pop_up ||= child KAXPopUpButtonRole end
20
- def search_box; @@search_box ||= child KAXTextFieldRole end
21
- def static_text; @@static_text ||= child(KAXStaticTextRole) { |x| x.value.match /My Little Pony/ } end
22
- def yes_button; @@yes_button ||= child(KAXButtonRole) { |x| x.attribute(KAXTitleAttribute) == 'Yes' } end
23
- def bye_button; @@bye_button ||= child(KAXButtonRole) { |x| x.attribute(KAXTitleAttribute) == 'Bye!' } end
24
- def no_button; @@no_button ||= child(KAXButtonRole) { |x| x.attribute(KAXTitleAttribute) == 'No' } end
25
- def web_area; @@web_area ||= child("AXScrollArea") { |x| x.attribute('AXDescription' ) == 'Test Web Area' }.children.first end
26
- def text_area; @@text_area ||= child("AXScrollArea") { |x| x.attributes.include?('AXIdentifier') && x.attribute('AXIdentifier') == 'Text Area' }.children.first end
27
-
28
- def invalid_ref
29
- bye_button # guarantee that it is cached
30
- @@dead ||= no_button.perform KAXPressAction
31
- bye_button
32
- end
33
-
34
-
35
- def test_equality
36
- assert_equal app, app
37
- assert_equal app, REF
38
- assert_equal window, window
39
- refute_equal app, window
40
- end
41
-
42
- ##
43
- # AFAICT every accessibility object **MUST** have attributes, so
44
- # there are no tests to check what happens when they do not exist;
45
- # though I am quite sure that AXElements will raise an exception.
46
-
47
- def test_attributes
48
- attrs = app.attributes
49
- assert_includes attrs, KAXRoleAttribute
50
- assert_includes attrs, KAXChildrenAttribute
51
- assert_includes attrs, KAXTitleAttribute
52
- assert_includes attrs, KAXMenuBarAttribute
53
-
54
- assert_empty invalid_ref.attributes, 'Dead elements should have no attrs'
55
- end
56
-
57
- def test_attribute
58
- assert_equal 'AXElementsTester', window.attribute(KAXTitleAttribute )
59
- assert_equal false, window.attribute(KAXFocusedAttribute)
60
- assert_equal CGSize.new(555,529), window.attribute(KAXSizeAttribute )
61
- assert_equal app, window.attribute(KAXParentAttribute )
62
- assert_equal 10..19, window.attribute("AXPie" )
63
-
64
- assert_nil window.attribute(KAXGrowAreaAttribute), 'KAXErrorNoValue == nil'
65
-
66
- assert_nil invalid_ref.attribute(KAXRoleAttribute), 'Dead element == nil'
67
- assert_nil invalid_ref.attribute(KAXChildrenAttribute)
68
-
69
- assert_raises(ArgumentError) { app.attribute('MADE_UP_ATTR') }
70
- end
71
-
72
- def test_role
73
- assert_equal KAXApplicationRole, app.role
74
- assert_equal KAXWindowRole, window.role
75
- end
76
-
77
- def test_subrole
78
- assert_equal KAXStandardWindowSubrole, window.subrole
79
- assert_nil web_area.subrole
80
- end
81
-
82
- def test_children
83
- assert_equal app.attribute(KAXChildrenAttribute), app.children
84
- end
85
-
86
- def test_value
87
- assert_equal check_box.attribute(KAXValueAttribute), check_box.value
88
- assert_equal slider.attribute(KAXValueAttribute), slider.value
89
- end
90
-
91
- def test_pid
92
- assert_equal PID, app.pid
93
- assert_equal PID, window.pid
94
- assert_equal 0, Accessibility::Element.system_wide.pid # special case
95
- end
96
-
97
- def test_invalid?
98
- assert_equal false, app.invalid?
99
- assert_equal true, invalid_ref.invalid?
100
- assert_equal false, window.invalid?
101
- end
102
-
103
- def test_size_of
104
- assert_equal app.children.size, app.size_of(KAXChildrenAttribute)
105
- assert_equal 0, pop_up.size_of(KAXChildrenAttribute)
106
-
107
- assert_equal 0, invalid_ref.size_of(KAXChildrenAttribute), 'Dead == 0'
108
- end
109
-
110
- def test_writable?
111
- refute app.writable? KAXTitleAttribute
112
- assert window.writable? KAXMainAttribute
113
-
114
- refute invalid_ref.writable?(KAXRoleAttribute), 'Dead is always false'
115
- end
116
-
117
- def test_set_number
118
- [25, 75, 50].each do |number|
119
- assert_equal number, slider.set(KAXValueAttribute, number)
120
- assert_equal number, slider.value
121
- end
122
- end
123
-
124
- def test_set_string
125
- [Time.now.to_s, ''].each do |string|
126
- assert_equal string, search_box.set(KAXValueAttribute, string)
127
- assert_equal string, search_box.value
128
- end
129
- end
130
-
131
- def test_set_wrapped
132
- text_area.set KAXValueAttribute, 'hey-o'
133
-
134
- text_area.set KAXSelectedTextRangeAttribute, 0..3
135
- assert_equal 0..3, text_area.attribute(KAXSelectedTextRangeAttribute)
136
-
137
- text_area.set KAXSelectedTextRangeAttribute, 1...4
138
- assert_equal 1..3, text_area.attribute(KAXSelectedTextRangeAttribute)
139
- ensure
140
- text_area.set KAXValueAttribute, ''
141
- end
142
-
143
- def test_set_attr_handles_errors
144
- assert_raises(ArgumentError) { app.set 'FAKE', true }
145
- assert_raises(ArgumentError) { invalid_ref.set KAXTitleAttribute, 'hi' }
146
- end
147
-
148
- def test_parameterized_attributes
149
- assert_empty app.parameterized_attributes
150
-
151
- attrs = static_text.parameterized_attributes
152
- assert_includes attrs, KAXStringForRangeParameterizedAttribute
153
- assert_includes attrs, KAXLineForIndexParameterizedAttribute
154
- assert_includes attrs, KAXBoundsForRangeParameterizedAttribute
155
-
156
- assert_empty invalid_ref.parameterized_attributes, 'Dead should always be empty'
157
- end
158
-
159
- def test_parameterized_attribute
160
- expected = 'My Li'
161
-
162
- attr = static_text.parameterized_attribute(KAXStringForRangeParameterizedAttribute, 0..4)
163
- assert_equal expected, attr
164
-
165
- attr = static_text.parameterized_attribute(KAXAttributedStringForRangeParameterizedAttribute, 0..4)
166
- assert_equal expected, attr.string
167
-
168
- assert_nil invalid_ref.parameterized_attribute(KAXStringForRangeParameterizedAttribute, 0..0),
169
- 'dead elements should return nil for any parameterized attribute'
170
-
171
- # Should add a test case to test the no value case, but it will have
172
- # to be fabricated in the test app.
173
-
174
- assert_raises(ArgumentError) {
175
- app.parameterized_attribute(KAXStringForRangeParameterizedAttribute, 0..1)
176
- }
177
- end
178
-
179
- def test_actions
180
- assert_empty app.actions
181
- assert_equal [KAXPressAction], yes_button.actions
182
- end
183
-
184
- def test_perform_action
185
- 2.times do # twice so it should be back where it started
186
- val = check_box.value
187
- check_box.perform KAXPressAction
188
- refute_equal val, check_box.value
189
- end
190
-
191
- val = slider.value
192
- slider.perform KAXIncrementAction
193
- assert slider.value > val
194
-
195
- val = slider.value
196
- slider.perform KAXDecrementAction
197
- assert slider.value < val
198
-
199
- assert_raises(ArgumentError) { app.perform nil }
200
- end
201
-
202
- ##
203
- # The keyboard simulation stuff is a bit weird...
204
-
205
- def test_post
206
- events = [[0x56,true], [0x56,false], [0x54,true], [0x54,false]]
207
- string = '42'
208
-
209
- search_box.set KAXFocusedAttribute, true
210
- app.post events
211
-
212
- assert_equal string, search_box.value
213
-
214
- ensure # reset for next test
215
- search_box.set KAXValueAttribute, ''
216
- end
217
-
218
- def test_key_rate
219
- assert_equal 0.009, Accessibility::Element.key_rate
220
- [
221
- [0.9, :very_slow],
222
- [0.09, :slow],
223
- [0.009, :normal],
224
- [0.0009, :fast],
225
- [0.00009, :zomg]
226
- ].each do |num, name|
227
- Accessibility::Element.key_rate = name
228
- assert_equal num, Accessibility::Element.key_rate
229
- end
230
- ensure
231
- Accessibility::Element.key_rate = :default
232
- end
233
-
234
- def test_element_at
235
- point = no_button.attribute(KAXPositionAttribute)
236
-
237
- element = app.element_at point
238
- assert_equal no_button, element, "#{no_button.inspect} and #{element.inspect}"
239
-
240
- element = Accessibility::Element.system_wide.element_at point
241
- assert_equal no_button, element, "#{no_button.inspect} and #{element.inspect}"
242
-
243
- assert_respond_to element, :role
244
-
245
- # skip 'Need to find a way to guarantee an empty spot on the screen to return nil'
246
- # test manually for now :(
247
- end
248
-
249
- def test_application_for
250
- assert_equal app, Accessibility::Element.application_for(PID)
251
-
252
- assert_raises(ArgumentError) { Accessibility::Element.application_for 0 }
253
- end
254
-
255
- def test_system_wide
256
- assert_equal AXUIElementCreateSystemWide(), Accessibility::Element.system_wide
257
- end
258
-
259
- def test_application
260
- assert_equal app, app.application
261
- assert_equal app, window.application
262
- end
263
-
264
- def test_set_timeout_for
265
- assert_equal 10, app.set_timeout_to(10)
266
- assert_equal 0, app.set_timeout_to(0)
267
- end
268
-
269
-
270
-
271
- def assert_error args, should_raise: klass, with_fragments: msgs
272
- e = assert_raises(klass) { (@derp || app).handle_error *args }
273
- assert_match /test_core.rb:272/, e.backtrace.first unless RUNNING_COMPILED
274
- msgs.each { |msg| assert_match msg, e.message }
275
- end
276
-
277
- def test_handle_errors
278
- app_inspect = Regexp.new(Regexp.escape(app.inspect))
279
-
280
- assert_error [KAXErrorFailure],
281
- should_raise: RuntimeError,
282
- with_fragments: [/system failure/, app_inspect]
283
-
284
- assert_error [KAXErrorIllegalArgument],
285
- should_raise: ArgumentError,
286
- with_fragments: [/is not an AXUIElementRef/, app_inspect]
287
-
288
- assert_error [KAXErrorIllegalArgument, :cake],
289
- should_raise: ArgumentError,
290
- with_fragments: [/is not a legal argument/, /the element/, app_inspect, /cake/]
291
-
292
- assert_error [KAXErrorIllegalArgument, 'cake', 'chocolate'],
293
- should_raise: ArgumentError,
294
- with_fragments: [/can't get\/set "cake" with\/to "chocolate"/, app_inspect]
295
-
296
- p = CGPoint.new(1,3)
297
- assert_error [KAXErrorIllegalArgument, p, nil, nil],
298
- should_raise: ArgumentError,
299
- with_fragments: [/The point #{p.inspect}/, app_inspect]
300
-
301
- assert_error [KAXErrorInvalidUIElement],
302
- should_raise: ArgumentError,
303
- with_fragments: [/no longer a valid reference/, app_inspect]
304
-
305
- assert_error [KAXErrorInvalidUIElementObserver, :pie, :cake],
306
- should_raise: ArgumentError,
307
- with_fragments: [/no longer support/]
308
-
309
- assert_error [KAXErrorCannotComplete],
310
- should_raise: RuntimeError,
311
- with_fragments: [/An unspecified error/, app_inspect, /:\(/]
312
-
313
- @derp = Accessibility::Element.application_for pid_for 'com.apple.finder'
314
- def @derp.pid; false end
315
- assert_error [KAXErrorCannotComplete],
316
- should_raise: RuntimeError,
317
- with_fragments: [/Application for pid/, /Maybe it crashed\?/]
318
- @derp = nil
319
-
320
- assert_error [KAXErrorAttributeUnsupported, :cake],
321
- should_raise: ArgumentError,
322
- with_fragments: [/does not have/, /:cake attribute/, app_inspect]
323
-
324
- assert_error [KAXErrorActionUnsupported, :pie],
325
- should_raise: ArgumentError,
326
- with_fragments: [/does not have/, /:pie action/, app_inspect]
327
-
328
- assert_error [KAXErrorNotificationUnsupported, :cheese],
329
- should_raise: ArgumentError,
330
- with_fragments: [/no longer support/]
331
-
332
- assert_error [KAXErrorNotImplemented],
333
- should_raise: NotImplementedError,
334
- with_fragments: [/does not work with AXAPI/, app_inspect]
335
-
336
- assert_error [KAXErrorNotificationAlreadyRegistered, :lamp],
337
- should_raise: ArgumentError,
338
- with_fragments: [/no longer support/]
339
-
340
- assert_error [KAXErrorNotificationNotRegistered, :peas],
341
- should_raise: RuntimeError,
342
- with_fragments: [/no longer support/]
343
-
344
- assert_error [KAXErrorAPIDisabled],
345
- should_raise: RuntimeError,
346
- with_fragments: [/AXAPI has been disabled/]
347
-
348
- assert_error [KAXErrorNoValue],
349
- should_raise: RuntimeError,
350
- with_fragments: [/internal error/]
351
-
352
- assert_error [KAXErrorParameterizedAttributeUnsupported, :oscar],
353
- should_raise: ArgumentError,
354
- with_fragments: [/does not have/, /:oscar parameterized attribute/, app_inspect]
355
-
356
- assert_error [KAXErrorNotEnoughPrecision],
357
- should_raise: RuntimeError,
358
- with_fragments: [/not enough precision/, '¯\(°_o)/¯']
359
-
360
- exception = assert_raises(RuntimeError) { app.send(:handle_error, 0) }
361
- assert_match /assertion failed/, exception.message
362
-
363
- assert_error [99],
364
- should_raise: RuntimeError,
365
- with_fragments: [/unknown error code/, /99/, app_inspect]
366
- end
367
-
368
- end
369
-
370
-
371
- class TestToAXToRubyHooks < MiniTest::Unit::TestCase
372
-
373
- def test_to_ax
374
- value = CGPointZero.to_ax
375
- ptr = Pointer.new CGPoint.type
376
- AXValueGetValue(value, 1, ptr)
377
- assert_equal CGPointZero, ptr.value, 'point makes a value'
378
-
379
- value = CGSizeZero.to_ax
380
- ptr = Pointer.new CGSize.type
381
- AXValueGetValue(value, 2, ptr)
382
- assert_equal CGSizeZero, ptr.value, 'size makes a value'
383
-
384
- value = CGRectZero.to_ax
385
- ptr = Pointer.new CGRect.type
386
- AXValueGetValue(value, 3, ptr)
387
- assert_equal CGRectZero, ptr.value, 'rect makes a value'
388
-
389
- range = CFRange.new(5, 4)
390
- value = range.to_ax
391
- ptr = Pointer.new CFRange.type
392
- AXValueGetValue(value, 4, ptr)
393
- assert_equal range, ptr.value, 'range makes a value'
394
-
395
- assert_equal CFRangeMake(1,10).to_ax, (1..10 ).to_ax
396
- assert_equal CFRangeMake(1, 9).to_ax, (1...10 ).to_ax
397
- assert_equal CFRangeMake(0, 3).to_ax, (0..2 ).to_ax
398
-
399
- assert_raises(ArgumentError) { (1..-10).to_ax }
400
- assert_raises(ArgumentError) { (-5...10).to_ax }
401
- assert_raises(NotImplementedError) { NSEdgeInsets.new.to_ax }
402
-
403
- assert_equal Object, Object.to_ax
404
- assert_equal 10, 10.to_ax
405
- end
406
-
407
- def test_to_ruby
408
- assert_equal CGPointZero, CGPointZero .to_ax.to_ruby
409
- assert_equal CGSize.new(10,10), CGSize.new(10,10) .to_ax.to_ruby
410
- assert_equal CGRectMake(1,2,3,4), CGRectMake(1,2,3,4).to_ax.to_ruby
411
- assert_equal 1..10, CFRange.new(1, 10) .to_ax.to_ruby
412
- assert_equal Range.new(1,10), CFRange.new(1,10) .to_ax.to_ruby
413
- assert_equal Object, Object.to_ruby
414
- end
415
-
416
- end
417
-
418
-
419
- class TestMiscCoreExtensions < MiniTest::Unit::TestCase
420
-
421
- def test_to_point
422
- p = CGPoint.new(2,3)
423
- assert_equal p, p.to_point
424
-
425
- p = CGPoint.new(1,3)
426
- assert_equal p, p.to_a.to_point
427
- end
428
-
429
- def test_to_size
430
- s = CGSize.new(2,4)
431
- assert_equal s, s.to_a.to_size
432
- end
433
-
434
- def test_to_rect
435
- r = CGRectMake(6, 7, 8, 9)
436
- assert_equal r, r.to_a.map(&:to_a).flatten.to_rect
437
- end
438
-
439
- def test_to_url
440
- site = 'http://marketcircle.com/'
441
- url = site.to_url
442
- refute_nil url
443
- assert_equal NSURL.URLWithString(site), url
444
-
445
- file = 'file://localhost/Applications/Calculator.app/'
446
- url = file.to_url
447
- refute_nil url
448
- assert_equal NSURL.fileURLWithPath('/Applications/Calculator.app/'), url
449
-
450
- void = "not a url at all"
451
- assert_nil void.to_url
452
- end
453
-
454
- end