calabash 1.2.1 → 1.9.9.pre1
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/CONTRIBUTING.md +39 -0
- data/LICENSE +204 -21
- data/README.md +36 -6
- data/VERSIONING.md +16 -0
- data/bin/calabash +95 -0
- data/lib/calabash.rb +185 -1
- data/lib/calabash/android.rb +64 -0
- data/lib/calabash/android/adb.rb +277 -0
- data/lib/calabash/android/application.rb +110 -0
- data/lib/calabash/android/build.rb +12 -0
- data/lib/calabash/android/build/application.rb +13 -0
- data/lib/calabash/android/build/build_error.rb +11 -0
- data/lib/calabash/android/build/builder.rb +119 -0
- data/lib/calabash/android/build/java_keystore.rb +177 -0
- data/lib/calabash/android/build/resigner.rb +56 -0
- data/lib/calabash/android/build/test_server.rb +27 -0
- data/lib/calabash/android/console_helpers.rb +44 -0
- data/lib/calabash/android/cucumber.rb +3 -0
- data/lib/calabash/android/device.rb +965 -0
- data/lib/calabash/android/environment.rb +470 -0
- data/lib/calabash/android/gestures.rb +369 -0
- data/lib/calabash/android/interactions.rb +45 -0
- data/lib/calabash/android/lib/.irbrc +55 -0
- data/lib/calabash/android/lib/AndroidManifest.xml +51 -0
- data/lib/calabash/android/lib/TestServer.apk +0 -0
- data/lib/calabash/android/lib/calmd5/arm64-v8a/calmd5 +0 -0
- data/lib/calabash/android/lib/calmd5/arm64-v8a/calmd5-pie +0 -0
- data/lib/calabash/android/lib/calmd5/armeabi-v7a/calmd5 +0 -0
- data/lib/calabash/android/lib/calmd5/armeabi-v7a/calmd5-pie +0 -0
- data/lib/calabash/android/lib/calmd5/armeabi/calmd5 +0 -0
- data/lib/calabash/android/lib/calmd5/armeabi/calmd5-pie +0 -0
- data/lib/calabash/android/lib/calmd5/mips/calmd5 +0 -0
- data/lib/calabash/android/lib/calmd5/mips/calmd5-pie +0 -0
- data/lib/calabash/android/lib/calmd5/mips64/calmd5 +0 -0
- data/lib/calabash/android/lib/calmd5/mips64/calmd5-pie +0 -0
- data/lib/calabash/android/lib/calmd5/x86/calmd5 +0 -0
- data/lib/calabash/android/lib/calmd5/x86/calmd5-pie +0 -0
- data/lib/calabash/android/lib/calmd5/x86_64/calmd5 +0 -0
- data/lib/calabash/android/lib/calmd5/x86_64/calmd5-pie +0 -0
- data/lib/calabash/android/lib/screenshot_taker.jar +0 -0
- data/lib/calabash/android/life_cycle.rb +37 -0
- data/lib/calabash/android/orientation.rb +30 -0
- data/lib/calabash/android/physical_buttons.rb +39 -0
- data/lib/calabash/android/screenshot.rb +9 -0
- data/lib/calabash/android/scroll.rb +5 -0
- data/lib/calabash/android/server.rb +10 -0
- data/lib/calabash/android/text.rb +54 -0
- data/lib/calabash/application.rb +74 -0
- data/lib/calabash/cli.rb +12 -0
- data/lib/calabash/cli/build.rb +33 -0
- data/lib/calabash/cli/console.rb +90 -0
- data/lib/calabash/cli/generate.rb +110 -0
- data/lib/calabash/cli/helpers.rb +130 -0
- data/lib/calabash/cli/resign.rb +33 -0
- data/lib/calabash/cli/run.rb +99 -0
- data/lib/calabash/cli/setup_keystore.rb +39 -0
- data/lib/calabash/color.rb +32 -0
- data/lib/calabash/console_helpers.rb +90 -0
- data/lib/calabash/defaults.rb +56 -0
- data/lib/calabash/device.rb +401 -0
- data/lib/calabash/environment.rb +75 -0
- data/lib/calabash/gestures.rb +384 -0
- data/lib/calabash/http.rb +8 -0
- data/lib/calabash/http/error.rb +15 -0
- data/lib/calabash/http/request.rb +42 -0
- data/lib/calabash/http/retriable_client.rb +156 -0
- data/lib/calabash/interactions.rb +105 -0
- data/lib/calabash/ios.rb +37 -0
- data/lib/calabash/ios/application.rb +119 -0
- data/lib/calabash/ios/conditions.rb +79 -0
- data/lib/calabash/ios/console_helpers.rb +72 -0
- data/lib/calabash/ios/device.rb +24 -0
- data/lib/calabash/ios/device/device_implementation.rb +779 -0
- data/lib/calabash/ios/device/gestures_mixin.rb +167 -0
- data/lib/calabash/ios/device/keyboard_mixin.rb +133 -0
- data/lib/calabash/ios/device/physical_device_mixin.rb +266 -0
- data/lib/calabash/ios/device/rotation_mixin.rb +124 -0
- data/lib/calabash/ios/device/routes/backdoor_route_mixin.rb +86 -0
- data/lib/calabash/ios/device/routes/condition_route_mixin.rb +62 -0
- data/lib/calabash/ios/device/routes/error.rb +8 -0
- data/lib/calabash/ios/device/routes/handle_route_mixin.rb +102 -0
- data/lib/calabash/ios/device/routes/map_route_mixin.rb +38 -0
- data/lib/calabash/ios/device/routes/playback_route_mixin.rb +70 -0
- data/lib/calabash/ios/device/routes/response_parser.rb +48 -0
- data/lib/calabash/ios/device/routes/uia_route_mixin.rb +238 -0
- data/lib/calabash/ios/device/runtime_attributes.rb +184 -0
- data/lib/calabash/ios/device/status_bar_mixin.rb +17 -0
- data/lib/calabash/ios/device/text_mixin.rb +19 -0
- data/lib/calabash/ios/device/uia_keyboard_mixin.rb +188 -0
- data/lib/calabash/ios/device/uia_mixin.rb +12 -0
- data/lib/calabash/ios/environment.rb +41 -0
- data/lib/calabash/ios/interactions.rb +10 -0
- data/lib/calabash/ios/lib/.irbrc +55 -0
- data/lib/calabash/ios/lib/recordings/rotate_left_home_down_ipad.base64 +2 -0
- data/lib/calabash/ios/lib/recordings/rotate_left_home_down_iphone.base64 +2 -0
- data/lib/calabash/ios/lib/recordings/rotate_left_home_left_ipad.base64 +2 -0
- data/lib/calabash/ios/lib/recordings/rotate_left_home_left_iphone.base64 +2 -0
- data/lib/calabash/ios/lib/recordings/rotate_left_home_right_ipad.base64 +2 -0
- data/lib/calabash/ios/lib/recordings/rotate_left_home_right_iphone.base64 +2 -0
- data/lib/calabash/ios/lib/recordings/rotate_left_home_up_ipad.base64 +2 -0
- data/lib/calabash/ios/lib/recordings/rotate_left_home_up_iphone.base64 +2 -0
- data/lib/calabash/ios/lib/recordings/rotate_right_home_down_ipad.base64 +2 -0
- data/lib/calabash/ios/lib/recordings/rotate_right_home_down_iphone.base64 +2 -0
- data/lib/calabash/ios/lib/recordings/rotate_right_home_left_ipad.base64 +2 -0
- data/lib/calabash/ios/lib/recordings/rotate_right_home_left_iphone.base64 +2 -0
- data/lib/calabash/ios/lib/recordings/rotate_right_home_right_ipad.base64 +2 -0
- data/lib/calabash/ios/lib/recordings/rotate_right_home_right_iphone.base64 +2 -0
- data/lib/calabash/ios/lib/recordings/rotate_right_home_up_ipad.base64 +2 -0
- data/lib/calabash/ios/lib/recordings/rotate_right_home_up_iphone.base64 +2 -0
- data/lib/calabash/ios/orientation.rb +117 -0
- data/lib/calabash/ios/scroll.rb +504 -0
- data/lib/calabash/ios/server.rb +73 -0
- data/lib/calabash/ios/text.rb +248 -0
- data/lib/calabash/ios/uia.rb +24 -0
- data/lib/calabash/lib/skeleton/config/cucumber.yml +6 -0
- data/lib/calabash/lib/skeleton/features/sample.feature +5 -0
- data/lib/calabash/lib/skeleton/features/step_definitions/calabash_steps.rb +29 -0
- data/lib/calabash/lib/skeleton/features/support/env.rb +54 -0
- data/lib/calabash/lib/skeleton/features/support/hooks.rb +83 -0
- data/lib/calabash/life_cycle.rb +111 -0
- data/lib/calabash/location.rb +51 -0
- data/lib/calabash/logger.rb +87 -0
- data/lib/calabash/orientation.rb +84 -0
- data/lib/calabash/page.rb +35 -0
- data/lib/calabash/patch.rb +14 -0
- data/lib/calabash/patch/array.rb +16 -0
- data/lib/calabash/patch/run_loop.rb +90 -0
- data/lib/calabash/query.rb +160 -0
- data/lib/calabash/query_result.rb +85 -0
- data/lib/calabash/screenshot.rb +89 -0
- data/lib/calabash/server.rb +16 -0
- data/lib/calabash/text.rb +76 -0
- data/lib/calabash/utility.rb +58 -0
- data/lib/calabash/version.rb +3 -1
- data/lib/calabash/wait.rb +474 -0
- metadata +462 -24
@@ -0,0 +1,124 @@
|
|
1
|
+
module Calabash
|
2
|
+
module IOS
|
3
|
+
|
4
|
+
# !@visibility private
|
5
|
+
module RotationMixin
|
6
|
+
|
7
|
+
def rotate(direction)
|
8
|
+
# If we are in the console, we want to be able to rotate without
|
9
|
+
# calling start_app. However, if the Device in the console has not
|
10
|
+
# connected with the server, the runtime attributes will not be
|
11
|
+
# available. It *might* make sense for the console to do this.
|
12
|
+
if defined?(IRB)
|
13
|
+
wait_for_server_to_start({:timeout => 1})
|
14
|
+
end
|
15
|
+
|
16
|
+
family = device_family
|
17
|
+
|
18
|
+
current_orientation = status_bar_orientation.to_sym
|
19
|
+
recording_name = nil
|
20
|
+
case direction
|
21
|
+
when :left
|
22
|
+
if current_orientation == :down
|
23
|
+
recording_name = 'left_home_down'
|
24
|
+
elsif current_orientation == :right
|
25
|
+
recording_name = 'left_home_right'
|
26
|
+
elsif current_orientation == :left
|
27
|
+
recording_name = 'left_home_left'
|
28
|
+
elsif current_orientation == :up
|
29
|
+
recording_name = 'left_home_up'
|
30
|
+
end
|
31
|
+
when :right
|
32
|
+
if current_orientation == :down
|
33
|
+
recording_name = 'right_home_down'
|
34
|
+
elsif current_orientation == :left
|
35
|
+
recording_name = 'right_home_left'
|
36
|
+
elsif current_orientation == :right
|
37
|
+
recording_name = 'right_home_right'
|
38
|
+
elsif current_orientation == :up
|
39
|
+
recording_name = 'right_home_up'
|
40
|
+
end
|
41
|
+
else
|
42
|
+
# Caller should have guarded us against this case.
|
43
|
+
raise ArgumentError, "Expected '#{direction}' to be :left or :right"
|
44
|
+
end
|
45
|
+
|
46
|
+
if family == 'iPad'
|
47
|
+
form_factor = 'ipad'
|
48
|
+
else
|
49
|
+
form_factor = 'iphone'
|
50
|
+
end
|
51
|
+
|
52
|
+
if recording_name.nil?
|
53
|
+
raise "Could not rotate device in direction '#{direction}' " \
|
54
|
+
"with orientation '#{current_orientation}'"
|
55
|
+
end
|
56
|
+
|
57
|
+
recording_name = "rotate_#{recording_name}"
|
58
|
+
playback_route(recording_name, form_factor)
|
59
|
+
end
|
60
|
+
|
61
|
+
# !@visibility private
|
62
|
+
# Caller must pass position one of these positions down, left, right, up
|
63
|
+
def rotate_home_button_to(position)
|
64
|
+
|
65
|
+
valid_positions = ['down', 'left', 'right', 'up']
|
66
|
+
unless valid_positions.include?(position)
|
67
|
+
raise ArgumentError,
|
68
|
+
"Expected '#{position}' to be on of #{valid_positions.join(', ')}"
|
69
|
+
end
|
70
|
+
|
71
|
+
# If we are in the console, we want to be able to rotate without
|
72
|
+
# calling start_app. However, if the Device in the console has not
|
73
|
+
# connected with the server, the runtime attributes will not be
|
74
|
+
# available. It *might* make sense for the console to do this.
|
75
|
+
if defined?(IRB)
|
76
|
+
wait_for_server_to_start({:timeout => 1})
|
77
|
+
end
|
78
|
+
|
79
|
+
orientation = status_bar_orientation
|
80
|
+
|
81
|
+
if orientation == position
|
82
|
+
return orientation
|
83
|
+
end
|
84
|
+
|
85
|
+
family = device_family
|
86
|
+
|
87
|
+
if family == 'iPad'
|
88
|
+
form_factor = 'ipad'
|
89
|
+
else
|
90
|
+
form_factor = 'iphone'
|
91
|
+
end
|
92
|
+
|
93
|
+
ROTATION_CANDIDATES.each do |recording_name|
|
94
|
+
playback_route(recording_name, form_factor)
|
95
|
+
|
96
|
+
# Wait for rotation animation.
|
97
|
+
timeout = 1.0
|
98
|
+
condition_route('NONE_ANIMATING', timeout, '*')
|
99
|
+
|
100
|
+
orientation = status_bar_orientation
|
101
|
+
if orientation == position
|
102
|
+
return orientation
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
orientation
|
107
|
+
end
|
108
|
+
|
109
|
+
private
|
110
|
+
|
111
|
+
ROTATION_CANDIDATES =
|
112
|
+
[
|
113
|
+
'rotate_left_home_down',
|
114
|
+
'rotate_left_home_left',
|
115
|
+
'rotate_left_home_right',
|
116
|
+
'rotate_left_home_up',
|
117
|
+
'rotate_right_home_down',
|
118
|
+
'rotate_right_home_left',
|
119
|
+
'rotate_right_home_right',
|
120
|
+
'rotate_right_home_up'
|
121
|
+
]
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Calabash
|
2
|
+
module IOS
|
3
|
+
|
4
|
+
# @!visibility private
|
5
|
+
class BackdoorError < StandardError; end
|
6
|
+
|
7
|
+
# @!visibility private
|
8
|
+
module Routes
|
9
|
+
# @!visibility private
|
10
|
+
module BackdoorRouteMixin
|
11
|
+
|
12
|
+
|
13
|
+
# @!visibility private
|
14
|
+
def backdoor(selector_name, *arguments)
|
15
|
+
request = make_backdoor_request(selector_name, arguments)
|
16
|
+
response = route_post_request(request)
|
17
|
+
handle_backdoor_response(selector_name, arguments, response)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def make_backdoor_parameters(selector_name, arguments)
|
23
|
+
if arguments.length > 1
|
24
|
+
message = 'Calabash iOS does not support backdoor selectors with ' \
|
25
|
+
"more than one argument. Received #{arguments}"
|
26
|
+
raise ArgumentError, message
|
27
|
+
end
|
28
|
+
|
29
|
+
if arguments.length < 1
|
30
|
+
message = 'Calabash iOS does not support backdoor selectors with no arguments.'
|
31
|
+
raise ArgumentError, message
|
32
|
+
end
|
33
|
+
|
34
|
+
unless selector_name.end_with?(':')
|
35
|
+
messages =
|
36
|
+
[
|
37
|
+
"Selector '#{selector_name}' is missing a trailing ':'",
|
38
|
+
'Valid backdoor selectors must take one argument.',
|
39
|
+
'',
|
40
|
+
'http://developer.xamarin.com/guides/testcloud/calabash/working-with/backdoors/#backdoor_in_iOS',
|
41
|
+
''
|
42
|
+
]
|
43
|
+
raise ArgumentError, messages.join("\n")
|
44
|
+
end
|
45
|
+
|
46
|
+
{
|
47
|
+
:selector => selector_name,
|
48
|
+
:arg => arguments.first
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
def make_backdoor_request(selector_name, arguments)
|
53
|
+
parameters = make_backdoor_parameters(selector_name, arguments)
|
54
|
+
begin
|
55
|
+
Calabash::HTTP::Request.request('backdoor', parameters)
|
56
|
+
rescue => e
|
57
|
+
raise RouteError, e
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def handle_backdoor_response(selector_name, arguments, response)
|
62
|
+
hash = parse_response_body(response)
|
63
|
+
|
64
|
+
outcome = hash['outcome']
|
65
|
+
|
66
|
+
case outcome
|
67
|
+
when 'FAILURE'
|
68
|
+
message = "Calling backdoor '#{selector_name}' with arguments '#{arguments}'" \
|
69
|
+
"failed because:\n\n#{hash['reason']}\n#{hash['details']}"
|
70
|
+
raise Calabash::IOS::RouteError, message
|
71
|
+
when 'SUCCESS'
|
72
|
+
# Legacy API: will be removed in iOS Server > 0.14.3
|
73
|
+
if hash.has_key?('results')
|
74
|
+
return hash['results']
|
75
|
+
else
|
76
|
+
return hash['result']
|
77
|
+
end
|
78
|
+
else
|
79
|
+
raise RouteError, "Server responded with an invalid outcome: '#{hash['outcome']}'"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Calabash
|
2
|
+
module IOS
|
3
|
+
# @!visibility private
|
4
|
+
module Routes
|
5
|
+
# @!visibility private
|
6
|
+
module ConditionRouteMixin
|
7
|
+
|
8
|
+
def condition_route(condition, timeout, query)
|
9
|
+
request = make_condition_request(condition, timeout, query)
|
10
|
+
response = route_post_request(request)
|
11
|
+
handle_condition_response(response)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
# server
|
17
|
+
# key default description
|
18
|
+
# :condition required
|
19
|
+
# :timeout optional * how long to wait
|
20
|
+
# :duration optional 0.2 time after which condition can be considered met
|
21
|
+
# :frequency optional 0.2 how often to check condition
|
22
|
+
# :query ! n/a apply condition to matched views
|
23
|
+
#
|
24
|
+
# * => 6.0 for none animating and 30.0 for network indicator
|
25
|
+
# ! => query is required for none animating!
|
26
|
+
#
|
27
|
+
# The :duration and :frequency are not part of the public API.
|
28
|
+
def make_condition_parameters(condition, timeout, query)
|
29
|
+
{
|
30
|
+
:condition => condition,
|
31
|
+
:timeout => timeout,
|
32
|
+
:query => query
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
def make_condition_request(condition, timeout, query)
|
37
|
+
parameters = make_condition_parameters(condition, timeout, query)
|
38
|
+
begin
|
39
|
+
Calabash::HTTP::Request.request('condition', parameters)
|
40
|
+
rescue => e
|
41
|
+
raise Calabash::IOS::RouteError, e
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def handle_condition_response(response)
|
46
|
+
hash = parse_response_body(response)
|
47
|
+
|
48
|
+
outcome = hash['outcome']
|
49
|
+
|
50
|
+
case outcome
|
51
|
+
when 'FAILURE'
|
52
|
+
false
|
53
|
+
when 'SUCCESS'
|
54
|
+
true
|
55
|
+
else
|
56
|
+
nil
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module Calabash
|
2
|
+
module IOS
|
3
|
+
# @!visibility private
|
4
|
+
module Routes
|
5
|
+
# @!visibility private
|
6
|
+
module HandleRouteMixin
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def route_post_request(request)
|
11
|
+
begin
|
12
|
+
http_client.post(request)
|
13
|
+
rescue => e
|
14
|
+
raise Calabash::IOS::RouteError, e
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def route_handle_response(response, query)
|
19
|
+
hash = parse_response_body(response)
|
20
|
+
|
21
|
+
outcome = hash['outcome']
|
22
|
+
|
23
|
+
case outcome
|
24
|
+
when 'FAILURE'
|
25
|
+
route_failure(hash, query)
|
26
|
+
when 'SUCCESS'
|
27
|
+
route_success(hash, query)
|
28
|
+
else
|
29
|
+
raise Calabash::IOS::RouteError, "Server responded with an invalid outcome: '#{hash['outcome']}'"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def route_failure(hash, query)
|
34
|
+
|
35
|
+
fetch_value = lambda do |key|
|
36
|
+
value = hash[key]
|
37
|
+
if value.nil? || value.empty?
|
38
|
+
'unknown'
|
39
|
+
else
|
40
|
+
value
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
reason = fetch_value.call('reason')
|
45
|
+
details = fetch_value.call('details')
|
46
|
+
raise Calabash::IOS::RouteError, "Map failed reason: '#{reason}' details: '#{details}' for query '#{query}'"
|
47
|
+
end
|
48
|
+
|
49
|
+
# TODO: handle invalid results
|
50
|
+
#
|
51
|
+
# So far, cases like this have been handled individually.
|
52
|
+
#
|
53
|
+
# Briar tests the 0.x behavior for every map call.
|
54
|
+
#
|
55
|
+
# These are the docs from 0.x assert_map_results
|
56
|
+
#
|
57
|
+
# # Asserts the result of a calabash `map` call and raises an error with
|
58
|
+
# # `msg` if no valid results are found.
|
59
|
+
# #
|
60
|
+
# # Casual gem users should never need to call this method; this is a
|
61
|
+
# # convenience method for gem maintainers.
|
62
|
+
# #
|
63
|
+
# # Raises an error if `map_results`:
|
64
|
+
# #
|
65
|
+
# # is an empty list #=> []
|
66
|
+
# # contains a '<VOID>' string #=> [ "<VOID>" ]
|
67
|
+
# # contains '*****' string #=> [ "*****" ]
|
68
|
+
# # contains a single nil #=> [ nil ]
|
69
|
+
# #
|
70
|
+
# # When evaluating whether a `map` call is successful it is important to
|
71
|
+
# # note that sometimes a <tt>[ nil ]</tt> or <tt>[nil, <val>, nil]</tt> is
|
72
|
+
# # a valid result.
|
73
|
+
# #
|
74
|
+
# # Consider a controller with 3 labels:
|
75
|
+
# #
|
76
|
+
# # label @ index 0 has text "foo"
|
77
|
+
# # label @ index 1 has text nil (the [label text] => nil)
|
78
|
+
# # label @ index 2 has text "bar"
|
79
|
+
# #
|
80
|
+
# # map('label', :text) => ['foo', nil, 'bar']
|
81
|
+
# # map('label index:1', :text) => [nil]
|
82
|
+
# #
|
83
|
+
# # In other cases, <tt>[ nil ]</tt> should be treated as an invalid result
|
84
|
+
# #
|
85
|
+
# # # invalid
|
86
|
+
# # > mark = 'mark does not exist'
|
87
|
+
# # > map('tableView', :scrollToRowWithMark, mark, args) => [ nil ]
|
88
|
+
# #
|
89
|
+
# # Here a <tt>[ nil ]</tt> should be considered invalid because the
|
90
|
+
# # the operation could not be performed because there is not row that
|
91
|
+
# # matches `mark`
|
92
|
+
def route_success(hash, query)
|
93
|
+
if query.nil?
|
94
|
+
hash['results']
|
95
|
+
else
|
96
|
+
Calabash::QueryResult.create(hash['results'], query)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Calabash
|
2
|
+
module IOS
|
3
|
+
# @!visibility private
|
4
|
+
module Routes
|
5
|
+
# @!visibility private
|
6
|
+
module MapRouteMixin
|
7
|
+
|
8
|
+
def map_route(query, method_name, *method_args)
|
9
|
+
request = make_map_request(query, method_name, *method_args)
|
10
|
+
response = route_post_request(request)
|
11
|
+
route_handle_response(response, query)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def make_map_parameters(query, method_name, *method_args)
|
17
|
+
{
|
18
|
+
:operation =>
|
19
|
+
{
|
20
|
+
:method_name => method_name,
|
21
|
+
:arguments => method_args
|
22
|
+
},
|
23
|
+
:query => query
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def make_map_request(query, method_name, *method_args)
|
28
|
+
parameters = make_map_parameters(query, method_name, *method_args)
|
29
|
+
begin
|
30
|
+
Calabash::HTTP::Request.request('map', parameters)
|
31
|
+
rescue => e
|
32
|
+
raise Calabash::IOS::RouteError, e
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Calabash
|
2
|
+
module IOS
|
3
|
+
module Routes
|
4
|
+
|
5
|
+
# !@visibility private
|
6
|
+
module PlaybackRouteMixin
|
7
|
+
|
8
|
+
# This is a Legacy API and is only used to support rotations.
|
9
|
+
#
|
10
|
+
# form_factor is iphone | ipad
|
11
|
+
#
|
12
|
+
# **NOTE** If we revive this API, move the call to
|
13
|
+
# recalibrate_after_rotation closer to the actually implementation of
|
14
|
+
# rotate; it is (probably?) not necessary for all recordings.
|
15
|
+
def playback_route(recording_name, form_factor)
|
16
|
+
request = make_playback_request(recording_name, form_factor)
|
17
|
+
response = route_post_request(request)
|
18
|
+
result = playback_route_handle_response(response)
|
19
|
+
|
20
|
+
# The first query after a rotation will have incorrect coordinates!
|
21
|
+
# We have to make a uia query to force an update.
|
22
|
+
recalibrate_after_rotation
|
23
|
+
result
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
PLAYBACK_DIR = File.expand_path(File.join(File.dirname(__FILE__),
|
29
|
+
'..', '..', 'lib', 'recordings'))
|
30
|
+
|
31
|
+
def path_to_recording(basename, form_factor)
|
32
|
+
name = "#{basename}_#{form_factor}.base64"
|
33
|
+
File.join(PLAYBACK_DIR, name)
|
34
|
+
end
|
35
|
+
|
36
|
+
def read_recording(path)
|
37
|
+
unless File.exist?(path)
|
38
|
+
raise "Expected file '#{path}' to exist. Can't load recording."
|
39
|
+
end
|
40
|
+
|
41
|
+
File.read(path)
|
42
|
+
end
|
43
|
+
|
44
|
+
def make_playback_parameters(data)
|
45
|
+
%Q|{"events":"#{data}"}|
|
46
|
+
end
|
47
|
+
|
48
|
+
def make_playback_request(recording_basename, form_factor)
|
49
|
+
path = path_to_recording(recording_basename, form_factor)
|
50
|
+
data = read_recording(path)
|
51
|
+
to_post = make_playback_parameters(data)
|
52
|
+
Calabash::HTTP::Request.new('play', to_post)
|
53
|
+
end
|
54
|
+
|
55
|
+
def playback_route_handle_response(response)
|
56
|
+
hash = parse_response_body(response)
|
57
|
+
if hash['outcome'] == 'SUCCESS'
|
58
|
+
hash['results']
|
59
|
+
else
|
60
|
+
raise "Playback failed because:\n#{hash['reason']}\n#{hash['details']}"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def recalibrate_after_rotation
|
65
|
+
uia_serialize_and_call(:query, 'window')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|