calabash-cucumber 0.19.2 → 0.20.0
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.
- checksums.yaml +4 -4
- data/dylibs/libCalabashDyn.dylib +0 -0
- data/dylibs/libCalabashDynSim.dylib +0 -0
- data/lib/calabash-cucumber.rb +9 -2
- data/lib/calabash-cucumber/abstract.rb +23 -0
- data/lib/calabash-cucumber/automator/automator.rb +158 -0
- data/lib/calabash-cucumber/automator/coordinates.rb +401 -0
- data/lib/calabash-cucumber/automator/device_agent.rb +424 -0
- data/lib/calabash-cucumber/automator/instruments.rb +441 -0
- data/lib/calabash-cucumber/connection_helpers.rb +1 -0
- data/lib/calabash-cucumber/core.rb +632 -138
- data/lib/calabash-cucumber/device_agent.rb +346 -0
- data/lib/calabash-cucumber/dot_dir.rb +1 -0
- data/lib/calabash-cucumber/environment.rb +1 -0
- data/lib/calabash-cucumber/environment_helpers.rb +4 -3
- data/lib/calabash-cucumber/http/http.rb +6 -4
- data/lib/calabash-cucumber/keyboard_helpers.rb +97 -679
- data/lib/calabash-cucumber/launcher.rb +107 -31
- data/lib/calabash-cucumber/log_tailer.rb +46 -0
- data/lib/calabash-cucumber/map.rb +7 -1
- data/lib/calabash-cucumber/rotation_helpers.rb +47 -139
- data/lib/calabash-cucumber/status_bar_helpers.rb +51 -20
- data/lib/calabash-cucumber/store/preferences.rb +3 -0
- data/lib/calabash-cucumber/uia.rb +333 -2
- data/lib/calabash-cucumber/usage_tracker.rb +2 -0
- data/lib/calabash-cucumber/version.rb +2 -2
- data/lib/calabash-cucumber/wait_helpers.rb +2 -0
- data/lib/calabash/formatters/html.rb +6 -1
- data/lib/frank-calabash.rb +10 -4
- data/scripts/.irbrc +3 -0
- data/staticlib/calabash.framework.zip +0 -0
- data/staticlib/libFrankCalabash.a +0 -0
- metadata +11 -6
- data/lib/calabash-cucumber/actions/instruments_actions.rb +0 -155
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3beda8dc174cf33416893af2d2e58ed4a18d58cb
|
4
|
+
data.tar.gz: 60902d11897fa82bccba3e46aa869b52f152b9cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 734473873f98af082e74350e287571804aacb5855adff80bec317eb5cc73083ee6f7da6055f58aba53b3a9e15e9b5a775434febd7dfa18c5785ae89203958d87
|
7
|
+
data.tar.gz: 033948ff96011ee84c325adad1d72ceeef5fb4e22fdc607cb88e725ff19a20a17c6c6f7c6ba5c011054ae4f06a2c88e62993bf0eb6122127374615928610d176
|
data/dylibs/libCalabashDyn.dylib
CHANGED
Binary file
|
Binary file
|
data/lib/calabash-cucumber.rb
CHANGED
@@ -1,16 +1,23 @@
|
|
1
|
+
require "calabash-cucumber/abstract"
|
1
2
|
require "calabash-cucumber/environment"
|
2
3
|
require "calabash-cucumber/logging"
|
4
|
+
require "calabash-cucumber/log_tailer"
|
3
5
|
require "calabash-cucumber/dot_dir"
|
4
6
|
require "calabash-cucumber/store/preferences"
|
5
7
|
require "calabash-cucumber/usage_tracker.rb"
|
6
8
|
require "calabash-cucumber/dylibs"
|
7
9
|
require "calabash-cucumber/http/http"
|
8
|
-
require
|
9
|
-
require
|
10
|
+
require "calabash-cucumber/automator/coordinates"
|
11
|
+
require "calabash-cucumber/automator/automator"
|
12
|
+
require "calabash-cucumber/automator/instruments"
|
13
|
+
require "calabash-cucumber/automator/device_agent"
|
10
14
|
require 'calabash-cucumber/keyboard_helpers'
|
11
15
|
require 'calabash-cucumber/keychain_helpers'
|
12
16
|
require 'calabash-cucumber/wait_helpers'
|
17
|
+
require "calabash-cucumber/device_agent"
|
13
18
|
require 'calabash-cucumber/operations'
|
19
|
+
require 'calabash-cucumber/core'
|
20
|
+
require 'calabash-cucumber/tests_helpers'
|
14
21
|
require 'calabash-cucumber/version'
|
15
22
|
require 'calabash-cucumber/date_picker'
|
16
23
|
require 'calabash-cucumber/ipad_1x_2x'
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
module Calabash
|
3
|
+
module Cucumber
|
4
|
+
# @!visibility private
|
5
|
+
module Abstract
|
6
|
+
|
7
|
+
# @!visibility private
|
8
|
+
class AbstractMethodError < StandardError; end
|
9
|
+
|
10
|
+
# @!visibility private
|
11
|
+
def abstract_method!
|
12
|
+
if Kernel.method_defined?(:caller_locations)
|
13
|
+
method_name = caller_locations.first.label
|
14
|
+
else
|
15
|
+
method_name = caller.first[/\`(.*)\'/, 1]
|
16
|
+
end
|
17
|
+
|
18
|
+
raise AbstractMethodError.new("Abstract method '#{method_name}'")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,158 @@
|
|
1
|
+
module Calabash
|
2
|
+
module Cucumber
|
3
|
+
# @!visibility private
|
4
|
+
module Automator
|
5
|
+
# @!visibility private
|
6
|
+
class Automator
|
7
|
+
|
8
|
+
require "calabash-cucumber/abstract"
|
9
|
+
include Calabash::Cucumber::Abstract
|
10
|
+
|
11
|
+
|
12
|
+
# @!visibility private
|
13
|
+
def initialize(*args)
|
14
|
+
abstract_method!
|
15
|
+
end
|
16
|
+
|
17
|
+
# @!visibility private
|
18
|
+
def name
|
19
|
+
abstract_method!
|
20
|
+
end
|
21
|
+
|
22
|
+
# @!visibility private
|
23
|
+
def stop
|
24
|
+
abstract_method!
|
25
|
+
end
|
26
|
+
|
27
|
+
# @!visibility private
|
28
|
+
def running?
|
29
|
+
abstract_method!
|
30
|
+
end
|
31
|
+
|
32
|
+
# @!visibility private
|
33
|
+
def client
|
34
|
+
abstract_method!
|
35
|
+
end
|
36
|
+
|
37
|
+
# @!visibility private
|
38
|
+
def touch(options)
|
39
|
+
abstract_method!
|
40
|
+
end
|
41
|
+
|
42
|
+
# @!visibility private
|
43
|
+
def double_tap(options)
|
44
|
+
abstract_method!
|
45
|
+
end
|
46
|
+
|
47
|
+
# @!visibility private
|
48
|
+
def two_finger_tap(options)
|
49
|
+
abstract_method!
|
50
|
+
end
|
51
|
+
|
52
|
+
# @!visibility private
|
53
|
+
def touch_hold(options)
|
54
|
+
abstract_method!
|
55
|
+
end
|
56
|
+
|
57
|
+
# @!visibility private
|
58
|
+
def flick(options)
|
59
|
+
abstract_method!
|
60
|
+
end
|
61
|
+
|
62
|
+
# @!visibility private
|
63
|
+
def swipe(direction, options={})
|
64
|
+
abstract_method!
|
65
|
+
end
|
66
|
+
|
67
|
+
# @!visibility private
|
68
|
+
#
|
69
|
+
# Callers must validate the options.
|
70
|
+
def pan(from_query, to_query, options={})
|
71
|
+
abstract_method!
|
72
|
+
end
|
73
|
+
|
74
|
+
# @!visibility private
|
75
|
+
#
|
76
|
+
# Callers must validate the options.
|
77
|
+
def pan_coordinates(from_point, to_point, options={})
|
78
|
+
abstract_method!
|
79
|
+
end
|
80
|
+
|
81
|
+
# @!visibility private
|
82
|
+
def pinch(in_or_out, options)
|
83
|
+
abstract_method!
|
84
|
+
end
|
85
|
+
|
86
|
+
# @!visibility private
|
87
|
+
def send_app_to_background(seconds)
|
88
|
+
abstract_method!
|
89
|
+
end
|
90
|
+
|
91
|
+
# @!visibility private
|
92
|
+
#
|
93
|
+
# It is the caller's responsibility to:
|
94
|
+
# 1. expect the keyboard is visible
|
95
|
+
# 2. escape the existing text
|
96
|
+
def enter_text_with_keyboard(string, options={})
|
97
|
+
abstract_method!
|
98
|
+
end
|
99
|
+
|
100
|
+
# @!visibility private
|
101
|
+
#
|
102
|
+
# Respond to keys like 'Delete' or 'Return'.
|
103
|
+
def char_for_keyboard_action(action_key)
|
104
|
+
abstract_method!
|
105
|
+
end
|
106
|
+
|
107
|
+
# @!visibility private
|
108
|
+
# It is the caller's responsibility to ensure the keyboard is visible.
|
109
|
+
def enter_char_with_keyboard(char)
|
110
|
+
abstract_method!
|
111
|
+
end
|
112
|
+
|
113
|
+
# @!visibility private
|
114
|
+
# It is the caller's responsibility to ensure the keyboard is visible.
|
115
|
+
def tap_keyboard_action_key
|
116
|
+
abstract_method!
|
117
|
+
end
|
118
|
+
|
119
|
+
# @!visibility private
|
120
|
+
# It is the caller's responsibility to ensure the keyboard is visible.
|
121
|
+
def tap_keyboard_delete_key
|
122
|
+
abstract_method!
|
123
|
+
end
|
124
|
+
|
125
|
+
# @!visibility private
|
126
|
+
#
|
127
|
+
# Legacy API - can we remove this method?
|
128
|
+
#
|
129
|
+
# It is the caller's responsibility to ensure the keyboard is visible.
|
130
|
+
def fast_enter_text(text)
|
131
|
+
abstract_method!
|
132
|
+
end
|
133
|
+
|
134
|
+
# @!visibility private
|
135
|
+
#
|
136
|
+
# Caller is responsible for limiting calls to iPads and waiting for the
|
137
|
+
# keyboard to disappear.
|
138
|
+
def dismiss_ipad_keyboard
|
139
|
+
abstract_method!
|
140
|
+
end
|
141
|
+
|
142
|
+
# @!visibility private
|
143
|
+
#
|
144
|
+
# Caller is responsible for providing a valid direction.
|
145
|
+
def rotate(direction)
|
146
|
+
abstract_method!
|
147
|
+
end
|
148
|
+
|
149
|
+
# @!visibility private
|
150
|
+
#
|
151
|
+
# Caller is responsible for normalizing and validating the position.
|
152
|
+
def rotate_home_button_to(position)
|
153
|
+
abstract_method!
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
@@ -0,0 +1,401 @@
|
|
1
|
+
|
2
|
+
module Calabash
|
3
|
+
module Cucumber
|
4
|
+
module Automator
|
5
|
+
# @!visibility private
|
6
|
+
class Coordinates
|
7
|
+
|
8
|
+
require "calabash-cucumber/map"
|
9
|
+
|
10
|
+
require "calabash-cucumber/status_bar_helpers"
|
11
|
+
include Calabash::Cucumber::StatusBarHelpers
|
12
|
+
|
13
|
+
# @!visibility private
|
14
|
+
attr_reader :element
|
15
|
+
|
16
|
+
# @!visibility private
|
17
|
+
def initialize(element)
|
18
|
+
@element = element
|
19
|
+
end
|
20
|
+
|
21
|
+
# @!visibility private
|
22
|
+
def self.left_point_for_full_screen_pan
|
23
|
+
coordinates = Coordinates.instance_without_element
|
24
|
+
{
|
25
|
+
x: coordinates.send(:min_x),
|
26
|
+
y: coordinates.send(:window)[:center_y]
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
# @!visibility private
|
31
|
+
def self.right_point_for_full_screen_pan
|
32
|
+
coordinates = Coordinates.instance_without_element
|
33
|
+
{
|
34
|
+
x: coordinates.send(:max_x),
|
35
|
+
y: coordinates.send(:window)[:center_y]
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
# @!visibility private
|
40
|
+
def self.top_point_for_full_screen_pan
|
41
|
+
coordinates = Coordinates.instance_without_element
|
42
|
+
{
|
43
|
+
x: coordinates.send(:window)[:center_x],
|
44
|
+
y: coordinates.send(:min_y)
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
# @!visibility private
|
49
|
+
def self.bottom_point_for_full_screen_pan
|
50
|
+
coordinates = Coordinates.instance_without_element
|
51
|
+
{
|
52
|
+
x: coordinates.send(:window)[:center_x],
|
53
|
+
y: coordinates.send(:max_y)
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
# @!visibility private
|
58
|
+
def self.points_for_full_screen_pan(direction)
|
59
|
+
case direction
|
60
|
+
when :left
|
61
|
+
start_point = Coordinates.right_point_for_full_screen_pan
|
62
|
+
end_point = Coordinates.left_point_for_full_screen_pan
|
63
|
+
when :right
|
64
|
+
start_point = Coordinates.left_point_for_full_screen_pan
|
65
|
+
end_point = Coordinates.right_point_for_full_screen_pan
|
66
|
+
when :up
|
67
|
+
start_point = Coordinates.bottom_point_for_full_screen_pan
|
68
|
+
end_point = Coordinates.top_point_for_full_screen_pan
|
69
|
+
when :down
|
70
|
+
start_point = Coordinates.top_point_for_full_screen_pan
|
71
|
+
end_point = Coordinates.bottom_point_for_full_screen_pan
|
72
|
+
else
|
73
|
+
raise ArgumentError,
|
74
|
+
"Direction #{direction} is not supported; use :left, :right, :top, :bottom"
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
{
|
79
|
+
start: start_point,
|
80
|
+
end: end_point
|
81
|
+
}
|
82
|
+
end
|
83
|
+
|
84
|
+
# @!visibility private
|
85
|
+
def left_point_for_full_view_pan
|
86
|
+
{
|
87
|
+
x: [min_x, element_origin[:x] + 10].max,
|
88
|
+
y: element_center[:y]
|
89
|
+
}
|
90
|
+
end
|
91
|
+
|
92
|
+
# @!visibility private
|
93
|
+
def right_point_for_full_view_pan
|
94
|
+
{
|
95
|
+
x: [max_x, element_origin[:x] + element_size[:width] - 10].min,
|
96
|
+
y: element_center[:y]
|
97
|
+
}
|
98
|
+
end
|
99
|
+
|
100
|
+
# @!visibility private
|
101
|
+
def top_point_for_full_view_pan
|
102
|
+
{
|
103
|
+
x: element_center[:x],
|
104
|
+
y: [min_y, (element_origin[:y] + 10)].max
|
105
|
+
}
|
106
|
+
end
|
107
|
+
|
108
|
+
# @!visibility private
|
109
|
+
def bottom_point_for_full_view_pan
|
110
|
+
{
|
111
|
+
x: element_center[:x],
|
112
|
+
y: [max_y, (element_origin[:y] + element_size[:height] - 10)].min
|
113
|
+
}
|
114
|
+
end
|
115
|
+
|
116
|
+
# @!visibility private
|
117
|
+
def points_for_full_view_pan(direction)
|
118
|
+
case direction
|
119
|
+
when :left
|
120
|
+
start_point = right_point_for_full_view_pan
|
121
|
+
end_point = left_point_for_full_view_pan
|
122
|
+
when :right
|
123
|
+
start_point = left_point_for_full_view_pan
|
124
|
+
end_point = right_point_for_full_view_pan
|
125
|
+
when :up
|
126
|
+
start_point = bottom_point_for_full_view_pan
|
127
|
+
end_point = top_point_for_full_view_pan
|
128
|
+
when :down
|
129
|
+
start_point = top_point_for_full_view_pan
|
130
|
+
end_point = bottom_point_for_full_view_pan
|
131
|
+
else
|
132
|
+
raise ArgumentError,
|
133
|
+
"Direction #{direction} is not supported; use :left, :right, :top, :bottom"
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
{
|
138
|
+
start: start_point,
|
139
|
+
end: end_point
|
140
|
+
}
|
141
|
+
end
|
142
|
+
|
143
|
+
# @!visibility private
|
144
|
+
def left_point_for_half_view_pan
|
145
|
+
{
|
146
|
+
x: [min_x, element_center[:x] - (element_size[:width]/4.0)].max,
|
147
|
+
y: element_center[:y]
|
148
|
+
}
|
149
|
+
end
|
150
|
+
|
151
|
+
# @!visibility private
|
152
|
+
def right_point_for_half_view_pan
|
153
|
+
{
|
154
|
+
x: [max_x, element_center[:x] + (element_size[:width]/4.0)].min,
|
155
|
+
y: element_center[:y]
|
156
|
+
}
|
157
|
+
end
|
158
|
+
|
159
|
+
# @!visibility private
|
160
|
+
def top_point_for_half_view_pan
|
161
|
+
{
|
162
|
+
x: element_center[:x],
|
163
|
+
y: [min_y, element_center[:y] - (element_size[:height]/4.0)].max
|
164
|
+
}
|
165
|
+
end
|
166
|
+
|
167
|
+
# @!visibility private
|
168
|
+
def bottom_point_for_half_view_pan
|
169
|
+
{
|
170
|
+
x: element_center[:x],
|
171
|
+
y: [max_y, element_center[:y] + (element_size[:height]/4.0)].min
|
172
|
+
}
|
173
|
+
end
|
174
|
+
|
175
|
+
# @!visibility private
|
176
|
+
def points_for_half_view_pan(direction)
|
177
|
+
case direction
|
178
|
+
when :left
|
179
|
+
start_point = right_point_for_half_view_pan
|
180
|
+
end_point = left_point_for_half_view_pan
|
181
|
+
when :right
|
182
|
+
start_point = left_point_for_half_view_pan
|
183
|
+
end_point = right_point_for_half_view_pan
|
184
|
+
when :up
|
185
|
+
start_point = bottom_point_for_half_view_pan
|
186
|
+
end_point = top_point_for_half_view_pan
|
187
|
+
when :down
|
188
|
+
start_point = top_point_for_half_view_pan
|
189
|
+
end_point = bottom_point_for_half_view_pan
|
190
|
+
else
|
191
|
+
raise ArgumentError,
|
192
|
+
"Direction #{direction} is not supported; use :left, :right, :top, :bottom"
|
193
|
+
|
194
|
+
end
|
195
|
+
|
196
|
+
{
|
197
|
+
start: start_point,
|
198
|
+
end: end_point
|
199
|
+
}
|
200
|
+
end
|
201
|
+
|
202
|
+
# @!visibility private
|
203
|
+
def left_point_for_small_view_pan
|
204
|
+
{
|
205
|
+
x: [min_x, element_center[:x] - (element_size[:width]/6.0)].max,
|
206
|
+
y: element_center[:y]
|
207
|
+
}
|
208
|
+
end
|
209
|
+
|
210
|
+
# @!visibility private
|
211
|
+
def right_point_for_small_view_pan
|
212
|
+
{
|
213
|
+
x: [max_x, element_center[:x] + (element_size[:width]/6.0)].min,
|
214
|
+
y: element_center[:y]
|
215
|
+
}
|
216
|
+
end
|
217
|
+
|
218
|
+
# @!visibility private
|
219
|
+
def top_point_for_small_view_pan
|
220
|
+
{
|
221
|
+
x: element_center[:x],
|
222
|
+
y: [min_y, element_center[:y] - (element_size[:height]/6.0)].max
|
223
|
+
}
|
224
|
+
end
|
225
|
+
|
226
|
+
# @!visibility private
|
227
|
+
def bottom_point_for_small_view_pan
|
228
|
+
{
|
229
|
+
x: element_center[:x],
|
230
|
+
y: [max_y, element_center[:y] + (element_size[:height]/6.0)].min
|
231
|
+
}
|
232
|
+
end
|
233
|
+
|
234
|
+
# @!visibility private
|
235
|
+
def points_for_small_view_pan(direction)
|
236
|
+
case direction
|
237
|
+
when :left
|
238
|
+
start_point = right_point_for_small_view_pan
|
239
|
+
end_point = left_point_for_small_view_pan
|
240
|
+
when :right
|
241
|
+
start_point = left_point_for_small_view_pan
|
242
|
+
end_point = right_point_for_small_view_pan
|
243
|
+
when :up
|
244
|
+
start_point = bottom_point_for_small_view_pan
|
245
|
+
end_point = top_point_for_small_view_pan
|
246
|
+
when :down
|
247
|
+
start_point = top_point_for_small_view_pan
|
248
|
+
end_point = bottom_point_for_small_view_pan
|
249
|
+
else
|
250
|
+
raise ArgumentError,
|
251
|
+
"Direction #{direction} is not supported; use :left, :right, :top, :bottom"
|
252
|
+
|
253
|
+
end
|
254
|
+
|
255
|
+
{
|
256
|
+
start: start_point,
|
257
|
+
end: end_point
|
258
|
+
}
|
259
|
+
end
|
260
|
+
|
261
|
+
# @!visibility private
|
262
|
+
def self.end_point_for_swipe(dir, element, force)
|
263
|
+
case dir
|
264
|
+
when :left
|
265
|
+
degrees = 0
|
266
|
+
when :up
|
267
|
+
degrees = 90
|
268
|
+
when :right
|
269
|
+
degrees = 180
|
270
|
+
when :down
|
271
|
+
degrees = 270
|
272
|
+
end
|
273
|
+
radians = degrees * Math::PI / 180.0
|
274
|
+
|
275
|
+
case force
|
276
|
+
when :light
|
277
|
+
scale_radius_by = 0.25
|
278
|
+
when :normal
|
279
|
+
scale_radius_by = 0.333
|
280
|
+
when :strong
|
281
|
+
scale_radius_by = 0.5
|
282
|
+
end
|
283
|
+
|
284
|
+
element_width = element["rect"]["width"]
|
285
|
+
element_height = element["rect"]["height"]
|
286
|
+
x_center = element["rect"]["center_x"]
|
287
|
+
y_center = element["rect"]["center_y"]
|
288
|
+
radius = ([element_width, element_height].min) * scale_radius_by
|
289
|
+
to_x = x_center - (radius * Math.cos(radians))
|
290
|
+
to_y = y_center - (radius * Math.sin(radians))
|
291
|
+
{ :x => to_x, :y => to_y }
|
292
|
+
end
|
293
|
+
|
294
|
+
private
|
295
|
+
|
296
|
+
# @!visibility private
|
297
|
+
def self.instance_without_element
|
298
|
+
Coordinates.new(nil)
|
299
|
+
end
|
300
|
+
|
301
|
+
# @!visibility private
|
302
|
+
def element_center
|
303
|
+
@element_center ||= begin
|
304
|
+
{
|
305
|
+
x: element["rect"]["center_x"],
|
306
|
+
y: element["rect"]["center_y"]
|
307
|
+
}
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
# @!visibility private
|
312
|
+
def element_origin
|
313
|
+
@element_origin ||= begin
|
314
|
+
{
|
315
|
+
x: element["rect"]["x"],
|
316
|
+
y: element["rect"]["y"]
|
317
|
+
}
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
# @!visibility private
|
322
|
+
def element_size
|
323
|
+
@element_size ||= begin
|
324
|
+
{
|
325
|
+
height: element["rect"]["height"],
|
326
|
+
width: element["rect"]["width"]
|
327
|
+
}
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
# @!visibility private
|
332
|
+
def query_wrapper(query, *args)
|
333
|
+
Calabash::Cucumber::Map.map(query, :query, *args)
|
334
|
+
end
|
335
|
+
|
336
|
+
# @!visibility private
|
337
|
+
def height_for_view(view_class)
|
338
|
+
element = query_wrapper(view_class).first
|
339
|
+
if element
|
340
|
+
element["rect"]["height"]
|
341
|
+
else
|
342
|
+
0
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
346
|
+
# @!visibility private
|
347
|
+
def status_bar_height
|
348
|
+
@status_bar_height ||= status_bar_details["frame"]["height"]
|
349
|
+
end
|
350
|
+
|
351
|
+
# @!visibility private
|
352
|
+
def nav_bar_height
|
353
|
+
@nav_bar_height ||= height_for_view("UINavigationBar")
|
354
|
+
end
|
355
|
+
|
356
|
+
# @!visibility private
|
357
|
+
def tab_bar_height
|
358
|
+
@tab_bar_height ||= height_for_view("UITabBar")
|
359
|
+
end
|
360
|
+
|
361
|
+
# @!visibility private
|
362
|
+
def toolbar_height
|
363
|
+
@toolbar_height ||= height_for_view("UIToolbar")
|
364
|
+
end
|
365
|
+
|
366
|
+
# @!visibility private
|
367
|
+
def window
|
368
|
+
@window ||= begin
|
369
|
+
element = query_wrapper("*").first
|
370
|
+
{
|
371
|
+
:height => element["rect"]["height"],
|
372
|
+
:width => element["rect"]["width"],
|
373
|
+
:center_x => element["rect"]["center_x"],
|
374
|
+
:center_y => element["rect"]["center_y"]
|
375
|
+
}
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
379
|
+
# @!visibility private
|
380
|
+
def min_y
|
381
|
+
@min_y ||= status_bar_height + nav_bar_height + 16
|
382
|
+
end
|
383
|
+
|
384
|
+
# @!visibility private
|
385
|
+
def max_y
|
386
|
+
@max_y ||= window[:height] - (tab_bar_height + toolbar_height + 16)
|
387
|
+
end
|
388
|
+
|
389
|
+
# @!visibility private
|
390
|
+
def min_x
|
391
|
+
10
|
392
|
+
end
|
393
|
+
|
394
|
+
# @!visibility private
|
395
|
+
def max_x
|
396
|
+
@max_x ||= window[:width] - 10
|
397
|
+
end
|
398
|
+
end
|
399
|
+
end
|
400
|
+
end
|
401
|
+
end
|