calabash 2.0.0.pre11 → 2.0.0.prelegacy

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 (86) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +17 -5
  3. data/bin/calabash +4 -3
  4. data/lib/calabash/android/adb.rb +37 -34
  5. data/lib/calabash/android/application.rb +1 -1
  6. data/lib/calabash/android/build/builder.rb +1 -1
  7. data/lib/calabash/android/build/java_keystore.rb +1 -1
  8. data/lib/calabash/android/build/resigner.rb +1 -1
  9. data/lib/calabash/android/device.rb +46 -204
  10. data/lib/calabash/android/environment.rb +1 -14
  11. data/lib/calabash/android/gestures.rb +22 -6
  12. data/lib/calabash/android/interactions.rb +17 -14
  13. data/lib/calabash/android/legacy.rb +141 -4
  14. data/lib/calabash/android/lib/.irbrc +1 -9
  15. data/lib/calabash/android/lib/AndroidManifest.xml +2 -23
  16. data/lib/calabash/android/lib/TestServer.apk +0 -0
  17. data/lib/calabash/android/life_cycle.rb +3 -3
  18. data/lib/calabash/android/orientation.rb +8 -8
  19. data/lib/calabash/android/physical_buttons.rb +16 -19
  20. data/lib/calabash/android/server.rb +1 -6
  21. data/lib/calabash/android/text.rb +12 -12
  22. data/lib/calabash/android.rb +26 -92
  23. data/lib/calabash/application.rb +0 -3
  24. data/lib/calabash/cli/generate.rb +18 -8
  25. data/lib/calabash/cli/helpers.rb +9 -4
  26. data/lib/calabash/cli/run.rb +1 -1
  27. data/lib/calabash/console_helpers.rb +11 -179
  28. data/lib/calabash/device.rb +19 -4
  29. data/lib/calabash/gestures.rb +198 -292
  30. data/lib/calabash/http/retriable_client.rb +3 -18
  31. data/lib/calabash/http.rb +0 -1
  32. data/lib/calabash/interactions.rb +40 -3
  33. data/lib/calabash/ios/conditions.rb +1 -1
  34. data/lib/calabash/ios/console_helpers.rb +2 -2
  35. data/lib/calabash/ios/date_picker.rb +8 -10
  36. data/lib/calabash/ios/device/device_implementation.rb +21 -9
  37. data/lib/calabash/ios/device/gestures_mixin.rb +55 -53
  38. data/lib/calabash/ios/device/keyboard_mixin.rb +0 -21
  39. data/lib/calabash/ios/device/rotation_mixin.rb +65 -3
  40. data/lib/calabash/ios/device/text_mixin.rb +21 -0
  41. data/lib/calabash/ios/device.rb +1 -0
  42. data/lib/calabash/ios/gestures.rb +90 -24
  43. data/lib/calabash/ios/interactions.rb +6 -1
  44. data/lib/calabash/ios/lib/.irbrc +2 -9
  45. data/lib/calabash/ios/orientation.rb +8 -8
  46. data/lib/calabash/ios/runtime.rb +14 -14
  47. data/lib/calabash/ios/scroll.rb +17 -25
  48. data/lib/calabash/ios/slider.rb +18 -11
  49. data/lib/calabash/ios/text.rb +74 -20
  50. data/lib/calabash/ios/uia.rb +1 -1
  51. data/lib/calabash/ios.rb +16 -77
  52. data/lib/calabash/legacy.rb +6 -9
  53. data/lib/calabash/lib/skeleton/{Gemfile.skeleton → Gemfile} +0 -0
  54. data/lib/calabash/lib/skeleton/config/{cucumber.yml.skeleton → cucumber.yml} +0 -0
  55. data/lib/calabash/lib/skeleton/features/{sample.feature.skeleton → sample.feature} +0 -0
  56. data/lib/calabash/lib/skeleton/features/step_definitions/{sample_steps.rb.skeleton → calabash_steps.rb} +8 -8
  57. data/lib/calabash/lib/skeleton/features/support/{dry_run.rb.skeleton → dry_run.rb} +5 -2
  58. data/lib/calabash/lib/skeleton/features/support/{env.rb.skeleton → env.rb} +8 -2
  59. data/lib/calabash/lib/skeleton/features/support/hooks.rb +83 -0
  60. data/lib/calabash/life_cycle.rb +8 -16
  61. data/lib/calabash/location.rb +15 -14
  62. data/lib/calabash/orientation.rb +8 -8
  63. data/lib/calabash/page.rb +4 -1
  64. data/lib/calabash/screenshot.rb +3 -3
  65. data/lib/calabash/text.rb +19 -31
  66. data/lib/calabash/utility.rb +8 -41
  67. data/lib/calabash/version.rb +1 -1
  68. data/lib/calabash/wait.rb +192 -177
  69. data/lib/calabash.rb +10 -53
  70. metadata +32 -43
  71. data/lib/calabash/android/device/helper_application.rb +0 -95
  72. data/lib/calabash/android/lib/HelperApplication.apk +0 -0
  73. data/lib/calabash/android/lib/HelperApplicationTestServer.apk +0 -0
  74. data/lib/calabash/android/web.rb +0 -12
  75. data/lib/calabash/http/forwarding_client.rb +0 -23
  76. data/lib/calabash/internal.rb +0 -48
  77. data/lib/calabash/ios/automator/automator.rb +0 -217
  78. data/lib/calabash/ios/automator/coordinates.rb +0 -37
  79. data/lib/calabash/ios/automator/device_agent.rb +0 -379
  80. data/lib/calabash/ios/automator.rb +0 -9
  81. data/lib/calabash/ios/legacy.rb +0 -6
  82. data/lib/calabash/ios/web.rb +0 -10
  83. data/lib/calabash/lib/skeleton/features/support/hooks.rb.skeleton +0 -34
  84. data/lib/calabash/retry.rb +0 -33
  85. data/lib/calabash/stubs.rb +0 -21
  86. data/lib/calabash/web.rb +0 -44
@@ -1,6 +1,8 @@
1
1
  module Calabash
2
2
  # Methods for performing gestures. Gestures are taps, flicks, and pans.
3
- # All gestures execute "physical gestures" like human users would.
3
+ #
4
+ # Many gestures take an optional :duration. On iOS, the duration must be
5
+ # between 0.5 and 60 (seconds). This is a limitation of the UIAutomation API.
4
6
  #
5
7
  # @note All gestures have _undefined return values._ This is intentional.
6
8
  # Please do not rely on return values of gestures in your tests. For
@@ -29,24 +31,23 @@ module Calabash
29
31
  # | │ 4 │
30
32
  # ┴ └─────────────────────────────────────┘
31
33
  #
32
- # 1. cal.tap("* marked:'email'")
33
- # 2. cal.tap("* marked:'email'", at: {x: 0, y: 0})
34
- # 3. cal.tap("* marked:'email'", at: {x: 100, y: 0})
35
- # 4. cal.tap("* marked:'email'", at: {x: 50, y: 100})
34
+ # 1. tap("* marked:'email'")
35
+ # 2. tap("* marked:'email'", at: {x: 0, y: 0})
36
+ # 3. tap("* marked:'email'", at: {x: 100, y: 0})
37
+ # 4. tap("* marked:'email'", at: {x: 50, y: 100})
36
38
  #
37
39
  # @param [String, Hash, Calabash::Query] query A query describing the view
38
40
  # to tap.
39
- # @param [Hash] at (default: `{x: 50, y: 50}`) The point at which the
41
+ # @param [Hash] options Options for modifying the details of the touch.
42
+ # @option options [Hash] :at ({x: 50, y: 50}) The point at which the
40
43
  # gesture originates from. It is a percentage-based translation using
41
- # top-left `{x: 0, y: 0}` as the reference point.
44
+ # top-left `(0,0)` as the reference point.
42
45
  # @raise [ViewNotFoundError] If the `query` returns no results.
43
46
  # @raise [ArgumentError] If `query` is invalid.
44
- def tap(query, at: nil)
47
+ def tap(query, options={})
45
48
  Query.ensure_valid_query(query)
46
49
 
47
- options = {at: at || {x: 50, y: 50}}
48
-
49
- Calabash::Internal.with_default_device {|device| device.tap(Query.new(query), options)}
50
+ Device.default.tap(Query.new(query), options)
50
51
  end
51
52
 
52
53
  # Performs a **double_tap** on the first view that matches `query`.
@@ -55,18 +56,17 @@ module Calabash
55
56
  #
56
57
  # @param [String, Hash, Calabash::Query] query A query describing the view
57
58
  # to tap.
58
- # @param [Hash] at (default: `{x: 50, y: 50}`) The point at which the
59
+ # @param [Hash] options Options for modifying the details of the touch.
60
+ # @option options [Hash] :at ({x: 50, y: 50}) The point at which the
59
61
  # gesture originates from. It is a percentage-based translation using
60
- # top-left `{x: 0, y: 0}` as the reference point.
62
+ # top-left `(0,0)` as the reference point.
61
63
  #
62
64
  # @raise [ViewNotFoundError] If the `query` returns no results.
63
65
  # @raise [ArgumentError] If `query` is invalid.
64
- def double_tap(query, at: nil)
66
+ def double_tap(query, options={})
65
67
  Query.ensure_valid_query(query)
66
68
 
67
- options = {at: at || {x: 50, y: 50}}
68
-
69
- Calabash::Internal.with_default_device {|device| device.double_tap(Query.new(query), options)}
69
+ Device.default.double_tap(Query.new(query), options)
70
70
  end
71
71
 
72
72
  # Performs a **long_press** on the first view that matches `query`.
@@ -77,39 +77,33 @@ module Calabash
77
77
  # @see #tap
78
78
  #
79
79
  # @param [String] query A query describing the view to tap.
80
- # @param [Number] duration (default: 1.0) The amount of time in seconds to
80
+ # @param [Hash] options Options for modifying the details of the touch.
81
+ # @option options [Number] :duration (1.0) The amount of time in seconds to
81
82
  # press. On iOS, the duration must be between 0.5 and 60.
82
- # @param [Hash] at (default: `{x: 50, y: 50}`) The point at which the
83
- # gesture originates from. It is a percentage-based translation using
84
- # top-left `{x: 0, y: 0}` as the reference point.
85
83
  # @raise [ViewNotFoundError] If the `query` returns no results.
86
84
  # @raise [ArgumentError] If `query` is invalid.
87
- def long_press(query, duration: nil, at: nil)
85
+ # @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
86
+ def long_press(query, options={})
88
87
  Query.ensure_valid_query(query)
89
88
 
90
- options = {
91
- at: at || {x: 50, y: 50},
92
- duration: duration || 1.0
93
- }
94
-
95
- Calabash::Internal.with_default_device {|device| device.long_press(Query.new(query), options)}
89
+ Device.default.long_press(Query.new(query), options)
96
90
  end
97
91
 
98
- # Performs a **pan** inside the first view that matches `query`.
92
+ # Performs a **pan** on the first view that matches `query`.
99
93
  #
100
94
  # A pan is a straight line swipe that pauses at the final point
101
95
  # before releasing the gesture. This is the general purpose pan method. For
102
- # standardized pans see {pan_left}, {pan_right}, {pan_up}, and {pan_down}.
96
+ # standardized pans see `pan_left`, `pan_right`, `pan_up`, and `pan_down`.
103
97
  #
104
- # @example
105
- # # Consider a pan on a scrollable view. When the finger is is released,
106
- # # the velocity of the view is zero.
98
+ # Also known as **scroll** and **swipe**.
107
99
  #
108
100
  # @example
109
- # # A scrollable view displays the alphabet. Panning left will cause the
110
- # # view to scroll right.
101
+ # Consider a pan on a scrollable view. When the finger is is released,
102
+ # the velocity of the view is zero.
111
103
  #
112
- # cal.pan("* id:'alphabetView'", cal.pct(80, 80), cal.pct(20, 80))
104
+ # @example
105
+ # A scrollable view displays the alphabet. Panning left will cause the
106
+ # view to scroll right.
113
107
  #
114
108
  # Before After
115
109
  # ┌───────────┐ | ┌───────────┐
@@ -118,6 +112,15 @@ module Calabash
118
112
  # │ <───────┤ │ | │ │
119
113
  # └───────────┘ | └───────────┘
120
114
  #
115
+ # Apple's UIAutomation 'dragInsideWithOptions' is broken on iOS Simulators.
116
+ # Call `pan` on iOS Simulators >= iOS 7.0 will raise an error. See the
117
+ # iOS Scroll API for alternatives.
118
+ #
119
+ # @see Calabash::IOS::Scroll#scroll
120
+ # @see Calabash::IOS::Scroll#scroll_to_row
121
+ # @see Calabash::IOS::Scroll#scroll_to_row_with_mark
122
+ # @see Calabash::IOS::Scroll#scroll_to_item
123
+ # @see Calabash::IOS::Scroll#scroll_to_item_with_mark
121
124
  #
122
125
  # @param [String, Hash, Calabash::Query] query A query describing the view
123
126
  # to pan inside.
@@ -125,18 +128,19 @@ module Calabash
125
128
  # originates from.
126
129
  # @param [Hash] to `({:x, :y})` The point at which the gesture
127
130
  # ends.
128
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
129
- # gesture lasts.
131
+ #
132
+ # @param [Hash] options Options for modifying the details of the pan.
133
+ # @option options [Number] :duration (0.5) How many seconds the pan takes
134
+ # to complete. On iOS, the duration must be between 0.5 and 60.
135
+ #
130
136
  # @raise [ViewNotFoundError] If the `query` returns no results.
131
137
  # @raise [ArgumentError] If `query` is invalid.
132
- def pan(query, from, to, duration: nil)
138
+ # @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
139
+ # @raise [RuntimeError] If called on an iOS Simulator > iOS 7.
140
+ def pan(query, from, to, options={})
133
141
  Query.ensure_valid_query(query)
134
142
 
135
- options = {
136
- duration: duration || DEFAULT_PAN_OPTIONS[:duration]
137
- }
138
-
139
- Calabash::Internal.with_default_device {|device| device.pan(Query.new(query), from, to, options)}
143
+ Device.default.pan(Query.new(query), from, to, options)
140
144
  end
141
145
 
142
146
  # Performs a **pan** from the center of the first view that matches
@@ -145,8 +149,8 @@ module Calabash
145
149
  # Also known as **drag and drop**.
146
150
  #
147
151
  # @example
148
- # #Panning between two elements.
149
- # cal.pan_between("* id:'first'", "* id:'second'")
152
+ # Panning between two elements.
153
+ # `pan_between("* id:'first'", "* id:'second'")`
150
154
  #
151
155
  #
152
156
  # ┌───────────┐
@@ -166,137 +170,86 @@ module Calabash
166
170
  # │ │
167
171
  # └───────────┘
168
172
  #
169
- # @param [String, Hash, Calabash::Query] query_from A query describing the
170
- # view to pan *from*
171
- # @param [String, Hash, Calabash::Query] query_to A query describing the
172
- # view to pan *to*
173
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
174
- # gesture lasts.
173
+ # @option options [Number] :duration (1.0) How many seconds the swipe takes
174
+ # to complete.
175
175
  # @raise [ViewNotFoundError] If the `query_from` returns no results.
176
176
  # @raise [ViewNotFoundError] If the `query_to` returns no results.
177
177
  # @raise [ArgumentError] If `query_from` is invalid.
178
178
  # @raise [ArgumentError] If `query_to` is invalid.
179
- def pan_between(query_from, query_to, duration: nil)
179
+ # @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
180
+ def pan_between(query_from, query_to, options={})
180
181
  Query.ensure_valid_query(query_from)
181
182
  Query.ensure_valid_query(query_to)
182
183
 
183
- options = {
184
- duration: duration || DEFAULT_PAN_OPTIONS[:duration]
185
- }
186
-
187
- Calabash::Internal.with_default_device do |device|
188
- device.pan_between(Query.new(query_from), Query.new(query_to), options)
189
- end
184
+ Device.default.pan_between(Query.new(query_from), Query.new(query_to), options)
190
185
  end
191
186
 
192
- # Performs a **pan** heading _left_ inside the first view that matches
193
- # `query`.
187
+ # Performs a **pan** heading _left_ on the first view that matches `query`.
194
188
  #
195
189
  # @see #pan
196
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
197
- # gesture lasts.
198
- def pan_left(query, duration: nil)
199
- pan(query, {x: 90, y: 50}, {x: 10, y: 50}, duration: duration)
190
+ def pan_left(query, options={})
191
+ pan(query, {x: 90, y: 50}, {x: 10, y: 50}, options)
200
192
  end
201
193
 
202
- # Performs a **pan** heading _right_ inside the first view that matches
203
- # `query`.
194
+ # Performs a **pan** heading _right_ on the first view that matches `query`.
204
195
  #
205
196
  # @see #pan
206
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
207
- # gesture lasts.
208
- def pan_right(query, duration: nil)
209
- pan(query, {x: 10, y: 50}, {x: 90, y: 50}, duration: duration)
197
+ def pan_right(query, options={})
198
+ pan(query, {x: 10, y: 50}, {x: 90, y: 50}, options)
210
199
  end
211
200
 
212
- # Performs a **pan** heading _up_ inside the first view that matches
213
- # `query`.
201
+ # Performs a **pan** heading _up_ on the first view that matches `query`.
214
202
  #
215
203
  # @see #pan
216
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
217
- # gesture lasts.
218
- def pan_up(query, duration: nil)
219
- pan(query, {x: 50, y: 90}, {x: 50, y: 10}, duration: duration)
204
+ def pan_up(query, options={})
205
+ pan(query, {x: 50, y: 90}, {x: 50, y: 10}, options)
220
206
  end
221
207
 
222
- # Performs a **pan** heading _down_ inside the first view that matches
223
- # `query`.
208
+ # Performs a **pan** heading _down_ on the first view that matches `query`.
224
209
  #
225
210
  # @see #pan
226
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
227
- # gesture lasts.
228
- def pan_down(query, duration: nil)
229
- pan(query, {x: 50, y: 10}, {x: 50, y: 90}, duration: duration)
211
+ def pan_down(query, options={})
212
+ pan(query, {x: 50, y: 10}, {x: 50, y: 90}, options)
230
213
  end
231
214
 
232
215
  # Performs a **pan** heading _left_ on the screen.
233
216
  #
234
217
  # @see #pan
235
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
236
- # gesture lasts.
237
- def pan_screen_left(duration: nil)
238
- options = {
239
- duration: duration || DEFAULT_PAN_OPTIONS[:duration]
240
- }
241
-
218
+ def pan_screen_left(options={})
242
219
  pan_left('*', options)
243
220
  end
244
221
 
245
222
  # Performs a **pan** heading _right_ on the screen.
246
223
  #
247
224
  # @see #pan
248
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
249
- # gesture lasts.
250
- def pan_screen_right(duration: nil)
251
- options = {
252
- duration: duration || DEFAULT_PAN_OPTIONS[:duration]
253
- }
254
-
225
+ def pan_screen_right(options={})
255
226
  pan_right('*', options)
256
227
  end
257
228
 
258
229
  # Performs a **pan** heading _up_ on the screen.
259
230
  #
260
231
  # @see #pan
261
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
262
- # gesture lasts.
263
- def pan_screen_up(duration: nil)
264
- options = {
265
- duration: duration || DEFAULT_PAN_OPTIONS[:duration]
266
- }
267
-
232
+ def pan_screen_up(options={})
268
233
  _pan_screen_up(options)
269
234
  end
270
235
 
271
236
  # Performs a **pan** heading _down_ on the screen.
272
237
  #
273
238
  # @see #pan
274
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
275
- # gesture lasts.
276
- def pan_screen_down(duration: nil)
277
- options = {
278
- duration: duration || DEFAULT_PAN_OPTIONS[:duration]
279
- }
280
-
239
+ def pan_screen_down(options={})
281
240
  _pan_screen_down(options)
282
241
  end
283
242
 
284
- # Performs a **flick** inside the first view that matches `query`.
243
+ # Performs a **flick** on the first view that matches `query`.
285
244
  #
286
245
  # A flick is a straight line swipe that **lifts the finger while
287
246
  # the gesture is still in motion**. This will often cause scrollable
288
247
  # views to continue moving for some time after the gesture is released.
289
- #
290
- # It is likely that the gesture you want to automate is a {pan}, not a
291
- # flick.
292
- #
293
248
  # @see pan
294
249
  #
295
250
  # @example
296
- # # A scrollable view displays the alphabet. Flicking left will cause the
297
- # # view to scroll right.
298
- #
299
- # cal.flick("* id:'alphabetView'", cal.pct(80, 80), cal.pct(20, 80))
251
+ # A scrollable view displays the alphabet. Flicking left will cause the
252
+ # view to scroll right.
300
253
  #
301
254
  # Before After
302
255
  # ┌───────────┐ | ┌───────────┐
@@ -306,266 +259,219 @@ module Calabash
306
259
  # └───────────┘ | └───────────┘
307
260
  #
308
261
  # @param [String,Hash,Query] query A query describing the view to flick
309
- # inside.
262
+ # inside of.
310
263
  # @param [Hash] from `({:x, :y})` The point at which the gesture
311
264
  # originates from.
312
265
  # @param [Hash] to `({:x, :y})` The point at which the gesture
313
266
  # ends.
314
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
315
- # gesture lasts.
267
+ #
268
+ # @param [Hash] options Options for controlling the flick.
269
+ # @option options [Numeric] :duration The duration of the flick. On iOS,
270
+ # the duration must be between 0.5 and 60.
271
+ #
316
272
  # @raise [ViewNotFoundError] If the `query` returns no results.
317
273
  # @raise [ArgumentError] If `query` is invalid.
318
- def flick(query, from, to, duration: nil)
274
+ # @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
275
+ def flick(query, from, to, options={})
319
276
  Query.ensure_valid_query(query)
320
277
 
321
- options = {
322
- duration: duration || DEFAULT_PAN_OPTIONS[:duration]
323
- }
324
-
325
- Calabash::Internal.with_default_device do |device|
326
- device.flick(Query.new(query), from, to, options)
327
- end
278
+ Device.default.flick(Query.new(query), from, to, options)
328
279
  end
329
280
 
330
- # Performs a **flick** heading _left_ inside the first view that matches
331
- # `query`.
281
+ # Performs a **flick** heading _left_ on the first view that matches `query`.
332
282
  # @see #flick
333
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
334
- # gesture lasts.
335
- def flick_left(query, duration: nil)
336
- flick(query, {x: 90, y: 50}, {x: 10, y: 50}, duration: duration)
283
+ def flick_left(query, options={})
284
+ flick(query, {x: 90, y: 50}, {x: 10, y: 50}, options)
337
285
  end
338
286
 
339
- # Performs a **flick** heading _right_ inside the first view that matches
287
+ # Performs a **flick** heading _right_ on the first view that matches
340
288
  # `query`.
341
289
  # @see #flick
342
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
343
- # gesture lasts.
344
- def flick_right(query, duration: nil)
345
- flick(query, {x: 10, y: 50}, {x: 90, y: 50}, duration: duration)
290
+ def flick_right(query, options={})
291
+ flick(query, {x: 10, y: 50}, {x: 90, y: 50}, options)
346
292
  end
347
293
 
348
- # Performs a **flick** heading _up_ inside the first view that matches
349
- # `query`.
294
+ # Performs a **flick** heading _up_ on the first view that matches `query`.
350
295
  # @see #flick
351
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
352
- # gesture lasts.
353
- def flick_up(query, duration: nil)
354
- flick(query, {x: 50, y: 90}, {x: 50, y: 10}, duration: duration)
296
+ def flick_up(query, options={})
297
+ flick(query, {x: 50, y: 90}, {x: 50, y: 10}, options)
355
298
  end
356
299
 
357
- # Performs a **flick** heading _down_ inside the first view that matches
358
- # `query`.
300
+ # Performs a **flick** heading _down_ on the first view that matches `query`.
359
301
  # @see #flick
360
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
361
- # gesture lasts.
362
- def flick_down(query, duration: nil)
363
- flick(query, {x: 50, y: 10}, {x: 50, y: 90}, duration: duration)
302
+ def flick_down(query, options={})
303
+ flick(query, {x: 50, y: 10}, {x: 50, y: 90}, options)
364
304
  end
365
305
 
366
306
  # Performs a **flick** heading _left_ on the screen.
367
307
  # @see #flick
368
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
369
- # gesture lasts.
370
- def flick_screen_left(duration: nil)
371
- options = {
372
- duration: duration || DEFAULT_PAN_OPTIONS[:duration]
373
- }
374
-
308
+ def flick_screen_left(options={})
375
309
  flick_left('*', options)
376
310
  end
377
311
 
378
312
  # Performs a **flick** heading _right_ on the screen.
379
313
  # @see #flick
380
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
381
- # gesture lasts.
382
- def flick_screen_right(duration: nil)
383
- options = {
384
- duration: duration || DEFAULT_PAN_OPTIONS[:duration]
385
- }
386
-
314
+ def flick_screen_right(options={})
387
315
  flick_right('*', options)
388
316
  end
389
317
 
390
318
  # Performs a **flick** heading _up_ on the screen.
391
319
  # @see #flick
392
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
393
- # gesture lasts.
394
- def flick_screen_up(duration: nil)
395
- options = {
396
- duration: duration || DEFAULT_PAN_OPTIONS[:duration]
397
- }
398
-
320
+ def flick_screen_up(options={})
399
321
  _flick_screen_up(options)
400
322
  end
401
323
 
402
324
  # Performs a **flick** heading _down_ on the screen.
403
325
  # @see #flick
404
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
405
- # gesture lasts.
406
- def flick_screen_down(duration: nil)
407
- options = {
408
- duration: duration || DEFAULT_PAN_OPTIONS[:duration]
409
- }
410
-
326
+ def flick_screen_down(options={})
411
327
  _flick_screen_down(options)
412
328
  end
413
329
 
414
- # Performs a **pinch** outwards inside the first view match by `query`.
330
+ # Performs a **pinch** outwards on the first view match by `query`.
415
331
  #
416
- # The gestures will be similar to two fingers pressing down near the
417
- # center of the view and simultaneously moving towards the opposite corners
418
- # of the view
419
- #
420
- # @example
421
- # # We have a webview that we want to pinch out on
422
- #
423
- # cal.pinch_out("* id:'webView'")
424
- #
425
- # Application
426
- # ┌───────────────────────┐
427
- # │───────────────────────│
428
- # │ id: webview │
429
- # │ ┌─────────────────┐ │
430
- # │ │ ^ │ │
431
- # │ │ \ │ │
432
- # │ │ \ │ │
433
- # │ │ * * │ │
434
- # │ │ \ │ │
435
- # │ │ \ │ │
436
- # │ │ v │ │
437
- # │ └─────────────────┘ │
438
- # └───────────────────────┘
439
- #
440
- # @example
441
- # # We have a MapView rendering a map. We want to zoom it in.
442
- # # On iOS, we should pinch out to zoom in
443
- # # On Android, we should pinch in to zoom in.
332
+ # @param [String, Hash, Calabash::Query] query A query describing the view
333
+ # to pinch.
334
+ # @param [Hash] options Options for controlling the pinch.
335
+ # @option options [Numeric] :duration The duration of the pinch. On iOS,
336
+ # the duration must be between 0.5 and 60.
444
337
  #
445
- # if cal.android?
446
- # cal.pinch_in({class: "MapView"})
447
- # elsif cal.ios?
448
- # cal.pinch_out({class: "MapView"})
449
- # end
338
+ # @raise [ViewNotFoundError] If the `query` returns no results.
339
+ # @raise [ArgumentError] If `query` is invalid.
340
+ # @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
341
+ def pinch_out(query, options={})
342
+ Device.default.pinch(:out, query, options)
343
+ end
344
+
345
+ # Performs a **pinch** inwards on the first view match by `query`.
450
346
  #
451
347
  # @param [String, Hash, Calabash::Query] query A query describing the view
452
348
  # to pinch.
453
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
454
- # gesture lasts.
349
+ # @param [Hash] options Options for controlling the pinch.
350
+ # @option options [Numeric] :duration The duration of the pinch. On iOS,
351
+ # the duration must be between 0.5 and 60.
352
+ #
455
353
  # @raise [ViewNotFoundError] If the `query` returns no results.
456
354
  # @raise [ArgumentError] If `query` is invalid.
457
- def pinch_out(query, duration: nil)
458
- options = {
459
- duration: duration || DEFAULT_PAN_OPTIONS[:duration]
460
- }
461
-
462
- Calabash::Internal.with_default_device {|device| device.pinch(:out, query, options)}
355
+ # @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
356
+ def pinch_in(query, options={})
357
+ Device.default.pinch(:in, query, options)
463
358
  end
464
359
 
465
- # Performs a **pinch** inwards inside the first view match by `query`.
360
+ # Performs a **pinch** outwards on the screen.
466
361
  #
467
- # The gestures will be similar to two fingers pressing down in the opposite
468
- # corners of the view and simultaneously moving towards the center of the
469
- # view.
362
+ # @param [Hash] options Options for controlling the pinch.
363
+ # @option options [Numeric] :duration The duration of the pinch. On iOS,
364
+ # the duration must be between 0.5 and 60.
470
365
  #
471
- # @example
472
- # # We have a webview that we want to pinch in on
473
- #
474
- # cal.pinch_in("* id:'webView'")
475
- #
476
- # Application
477
- # ┌───────────────────────┐
478
- # │───────────────────────│
479
- # │ id: webview │
480
- # │ ┌─────────────────┐ │
481
- # │ │ * │ │
482
- # │ │ \ │ │
483
- # │ │ \ │ │
484
- # │ │ v ^ │ │
485
- # │ │ \ │ │
486
- # │ │ \ │ │
487
- # │ │ * │ │
488
- # │ └─────────────────┘ │
489
- # └───────────────────────┘
366
+ # @raise [ViewNotFoundError] If the `query` returns no results.
367
+ # @raise [ArgumentError] If `query` is invalid.
368
+ # @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
369
+ def pinch_screen_out(options={})
370
+ _pinch_screen(:out, options)
371
+ end
372
+
373
+ # Performs a **pinch** inwards on the screen.
490
374
  #
491
- # @example
492
- # # We have a MapView rendering a map. We want to zoom it in.
493
- # # On iOS, we should pinch out to zoom in
494
- # # On Android, we should pinch in to zoom in.
375
+ # @param [Hash] options Options for controlling the pinch.
376
+ # @option options [Numeric] :duration The duration of the pinch. On iOS,
377
+ # the duration must be between 0.5 and 60.
495
378
  #
496
- # if cal.android?
497
- # cal.pinch_in({class: "MapView"})
498
- # elsif cal.ios?
499
- # cal.pinch_out({class: "MapView"})
500
- # end
379
+ # @raise [ViewNotFoundError] If the `query` returns no results.
380
+ # @raise [ArgumentError] If `query` is invalid.
381
+ # @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
382
+ def pinch_screen_in(options={})
383
+ _pinch_screen(:in, options)
384
+ end
385
+
386
+ # Performs a **pinch** to zoom out.
501
387
  #
502
388
  # @param [String, Hash, Calabash::Query] query A query describing the view
503
389
  # to pinch.
504
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
505
- # gesture lasts.
390
+ # @param [Hash] options Options for controlling the pinch.
391
+ # @option options [Numeric] :duration The duration of the pinch. On iOS,
392
+ # the duration must be between 0.5 and 60.
393
+ #
506
394
  # @raise [ViewNotFoundError] If the `query` returns no results.
507
395
  # @raise [ArgumentError] If `query` is invalid.
508
- def pinch_in(query, duration: nil)
509
- options = {
510
- duration: duration || DEFAULT_PAN_OPTIONS[:duration]
511
- }
512
-
513
- Calabash::Internal.with_default_device {|device| device.pinch(:in, query, options)}
396
+ # @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
397
+ def pinch_to_zoom_out(query, options={})
398
+ _pinch_to_zoom(:out, query, options)
514
399
  end
515
400
 
516
- # Performs a **pinch** outwards on the screen.
401
+ # Performs a **pinch** to zoom in.
517
402
  #
518
- # @see #pinch_out
403
+ # @param [String, Hash, Calabash::Query] query A query describing the view
404
+ # to pinch.
405
+ # @param [Hash] options Options for controlling the pinch.
406
+ # @option options [Numeric] :duration The duration of the pinch. On iOS,
407
+ # the duration must be between 0.5 and 60.
519
408
  #
520
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
521
- # gesture lasts.
522
409
  # @raise [ViewNotFoundError] If the `query` returns no results.
523
410
  # @raise [ArgumentError] If `query` is invalid.
524
- def pinch_screen_out(duration: nil)
525
- options = {
526
- duration: duration || DEFAULT_PAN_OPTIONS[:duration]
527
- }
411
+ # @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
412
+ def pinch_to_zoom_in(query, options={})
413
+ _pinch_to_zoom(:in, query, options)
414
+ end
528
415
 
529
- _pinch_screen(:out, options)
416
+ # Performs a **pinch** on the screen to zoom in.
417
+ #
418
+ # @param [Hash] options Options for controlling the pinch.
419
+ # @option options [Numeric] :duration The duration of the pinch. On iOS,
420
+ # the duration must be between 0.5 and 60.
421
+ #
422
+ # @raise [ViewNotFoundError] If the `query` returns no results.
423
+ # @raise [ArgumentError] If `query` is invalid.
424
+ # @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
425
+ def pinch_screen_to_zoom_in(options={})
426
+ _pinch_screen_to_zoom(:in, options)
530
427
  end
531
428
 
532
- # Performs a **pinch** inwards on the screen.
429
+ # Performs a **pinch** on the screen to zoom out.
533
430
  #
534
- # @see #pinch_in
431
+ # @param [Hash] options Options for controlling the pinch.
432
+ # @option options [Numeric] :duration The duration of the pinch. On iOS,
433
+ # the duration must be between 0.5 and 60.
535
434
  #
536
- # @param [Number] duration (default: 1.0) The amount of time in seconds the
537
- # gesture lasts.
538
435
  # @raise [ViewNotFoundError] If the `query` returns no results.
539
436
  # @raise [ArgumentError] If `query` is invalid.
540
- def pinch_screen_in(duration: nil)
541
- options = {
542
- duration: duration || DEFAULT_PAN_OPTIONS[:duration]
543
- }
437
+ # @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
438
+ def pinch_screen_to_zoom_out(options={})
439
+ _pinch_screen_to_zoom(:out, options)
440
+ end
544
441
 
545
- _pinch_screen(:in, options)
442
+ # @!visibility private
443
+ def _pan_screen_up(options={})
444
+ abstract_method!
546
445
  end
547
446
 
548
447
  # @!visibility private
549
- define_method(:_pan_screen_up) do |options={}|
550
- abstract_method!(:_pan_screen_up)
448
+ def _pan_screen_down(options={})
449
+ abstract_method!
551
450
  end
552
451
 
553
452
  # @!visibility private
554
- define_method(:_pan_screen_down) do |options={}|
555
- abstract_method!(:_pan_screen_down)
453
+ def _flick_screen_up(options={})
454
+ abstract_method!
556
455
  end
557
456
 
558
457
  # @!visibility private
559
- define_method(:_flick_screen_up) do |options={}|
560
- abstract_method!(:_flick_screen_up)
458
+ def _flick_screen_down(options={})
459
+ abstract_method!
561
460
  end
562
461
 
563
462
  # @!visibility private
564
- define_method(:_flick_screen_down) do |options={}|
565
- abstract_method!(:_flick_screen_down)
463
+ def _pinch_screen(direction, options={})
464
+ abstract_method!
566
465
  end
567
466
 
568
467
  # @!visibility private
569
- DEFAULT_PAN_OPTIONS = {duration: 1}
468
+ def _pinch_to_zoom(direction, query, options={})
469
+ abstract_method!
470
+ end
471
+
472
+ # @!visibility private
473
+ def _pinch_screen_to_zoom(direction, options={})
474
+ abstract_method!
475
+ end
570
476
  end
571
477
  end