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.
- checksums.yaml +4 -4
- data/README.md +17 -5
- data/bin/calabash +4 -3
- data/lib/calabash/android/adb.rb +37 -34
- data/lib/calabash/android/application.rb +1 -1
- data/lib/calabash/android/build/builder.rb +1 -1
- data/lib/calabash/android/build/java_keystore.rb +1 -1
- data/lib/calabash/android/build/resigner.rb +1 -1
- data/lib/calabash/android/device.rb +46 -204
- data/lib/calabash/android/environment.rb +1 -14
- data/lib/calabash/android/gestures.rb +22 -6
- data/lib/calabash/android/interactions.rb +17 -14
- data/lib/calabash/android/legacy.rb +141 -4
- data/lib/calabash/android/lib/.irbrc +1 -9
- data/lib/calabash/android/lib/AndroidManifest.xml +2 -23
- data/lib/calabash/android/lib/TestServer.apk +0 -0
- data/lib/calabash/android/life_cycle.rb +3 -3
- data/lib/calabash/android/orientation.rb +8 -8
- data/lib/calabash/android/physical_buttons.rb +16 -19
- data/lib/calabash/android/server.rb +1 -6
- data/lib/calabash/android/text.rb +12 -12
- data/lib/calabash/android.rb +26 -92
- data/lib/calabash/application.rb +0 -3
- data/lib/calabash/cli/generate.rb +18 -8
- data/lib/calabash/cli/helpers.rb +9 -4
- data/lib/calabash/cli/run.rb +1 -1
- data/lib/calabash/console_helpers.rb +11 -179
- data/lib/calabash/device.rb +19 -4
- data/lib/calabash/gestures.rb +198 -292
- data/lib/calabash/http/retriable_client.rb +3 -18
- data/lib/calabash/http.rb +0 -1
- data/lib/calabash/interactions.rb +40 -3
- data/lib/calabash/ios/conditions.rb +1 -1
- data/lib/calabash/ios/console_helpers.rb +2 -2
- data/lib/calabash/ios/date_picker.rb +8 -10
- data/lib/calabash/ios/device/device_implementation.rb +21 -9
- data/lib/calabash/ios/device/gestures_mixin.rb +55 -53
- data/lib/calabash/ios/device/keyboard_mixin.rb +0 -21
- data/lib/calabash/ios/device/rotation_mixin.rb +65 -3
- data/lib/calabash/ios/device/text_mixin.rb +21 -0
- data/lib/calabash/ios/device.rb +1 -0
- data/lib/calabash/ios/gestures.rb +90 -24
- data/lib/calabash/ios/interactions.rb +6 -1
- data/lib/calabash/ios/lib/.irbrc +2 -9
- data/lib/calabash/ios/orientation.rb +8 -8
- data/lib/calabash/ios/runtime.rb +14 -14
- data/lib/calabash/ios/scroll.rb +17 -25
- data/lib/calabash/ios/slider.rb +18 -11
- data/lib/calabash/ios/text.rb +74 -20
- data/lib/calabash/ios/uia.rb +1 -1
- data/lib/calabash/ios.rb +16 -77
- data/lib/calabash/legacy.rb +6 -9
- data/lib/calabash/lib/skeleton/{Gemfile.skeleton → Gemfile} +0 -0
- data/lib/calabash/lib/skeleton/config/{cucumber.yml.skeleton → cucumber.yml} +0 -0
- data/lib/calabash/lib/skeleton/features/{sample.feature.skeleton → sample.feature} +0 -0
- data/lib/calabash/lib/skeleton/features/step_definitions/{sample_steps.rb.skeleton → calabash_steps.rb} +8 -8
- data/lib/calabash/lib/skeleton/features/support/{dry_run.rb.skeleton → dry_run.rb} +5 -2
- data/lib/calabash/lib/skeleton/features/support/{env.rb.skeleton → env.rb} +8 -2
- data/lib/calabash/lib/skeleton/features/support/hooks.rb +83 -0
- data/lib/calabash/life_cycle.rb +8 -16
- data/lib/calabash/location.rb +15 -14
- data/lib/calabash/orientation.rb +8 -8
- data/lib/calabash/page.rb +4 -1
- data/lib/calabash/screenshot.rb +3 -3
- data/lib/calabash/text.rb +19 -31
- data/lib/calabash/utility.rb +8 -41
- data/lib/calabash/version.rb +1 -1
- data/lib/calabash/wait.rb +192 -177
- data/lib/calabash.rb +10 -53
- metadata +32 -43
- data/lib/calabash/android/device/helper_application.rb +0 -95
- data/lib/calabash/android/lib/HelperApplication.apk +0 -0
- data/lib/calabash/android/lib/HelperApplicationTestServer.apk +0 -0
- data/lib/calabash/android/web.rb +0 -12
- data/lib/calabash/http/forwarding_client.rb +0 -23
- data/lib/calabash/internal.rb +0 -48
- data/lib/calabash/ios/automator/automator.rb +0 -217
- data/lib/calabash/ios/automator/coordinates.rb +0 -37
- data/lib/calabash/ios/automator/device_agent.rb +0 -379
- data/lib/calabash/ios/automator.rb +0 -9
- data/lib/calabash/ios/legacy.rb +0 -6
- data/lib/calabash/ios/web.rb +0 -10
- data/lib/calabash/lib/skeleton/features/support/hooks.rb.skeleton +0 -34
- data/lib/calabash/retry.rb +0 -33
- data/lib/calabash/stubs.rb +0 -21
- data/lib/calabash/web.rb +0 -44
data/lib/calabash/ios/text.rb
CHANGED
@@ -3,21 +3,21 @@ module Calabash
|
|
3
3
|
# Methods for entering text and interacting with iOS keyboards.
|
4
4
|
module Text
|
5
5
|
# @!visibility private
|
6
|
-
|
6
|
+
def _enter_text(text)
|
7
7
|
wait_for_keyboard
|
8
8
|
existing_text = text_from_keyboard_first_responder
|
9
9
|
options = { existing_text: existing_text }
|
10
|
-
|
10
|
+
Device.default.uia_type_string(text, options)
|
11
11
|
end
|
12
12
|
|
13
13
|
# @!visibility private
|
14
|
-
|
14
|
+
def _enter_text_in(view, text)
|
15
15
|
tap(view)
|
16
16
|
enter_text(text)
|
17
17
|
end
|
18
18
|
|
19
19
|
# @!visibility private
|
20
|
-
|
20
|
+
def _clear_text
|
21
21
|
unless view_exists?("* isFirstResponder:1")
|
22
22
|
raise 'Cannot clear text. No view has focus'
|
23
23
|
end
|
@@ -26,7 +26,7 @@ module Calabash
|
|
26
26
|
end
|
27
27
|
|
28
28
|
# @!visibility private
|
29
|
-
|
29
|
+
def _clear_text_in(view)
|
30
30
|
unless keyboard_visible?
|
31
31
|
tap(view)
|
32
32
|
wait_for_keyboard
|
@@ -35,7 +35,6 @@ module Calabash
|
|
35
35
|
unless wait_for_view(view)['text'].empty?
|
36
36
|
tap(view)
|
37
37
|
tap("UICalloutBarButton marked:'Select All'")
|
38
|
-
sleep 0.5
|
39
38
|
tap_keyboard_delete_key
|
40
39
|
end
|
41
40
|
|
@@ -50,7 +49,7 @@ module Calabash
|
|
50
49
|
#
|
51
50
|
# @return [Boolean] Returns true if a keyboard is visible and docked.
|
52
51
|
def docked_keyboard_visible?
|
53
|
-
|
52
|
+
Device.default.docked_keyboard_visible?
|
54
53
|
end
|
55
54
|
|
56
55
|
# Returns true if an undocked keyboard is visible.
|
@@ -60,7 +59,7 @@ module Calabash
|
|
60
59
|
# @return [Boolean] Returns false if the device is not an iPad; all
|
61
60
|
# keyboards on the iPhone and iPod are docked.
|
62
61
|
def undocked_keyboard_visible?
|
63
|
-
|
62
|
+
Device.default.undocked_keyboard_visible?
|
64
63
|
end
|
65
64
|
|
66
65
|
# Returns true if a split keyboard is visible.
|
@@ -71,7 +70,7 @@ module Calabash
|
|
71
70
|
# @return [Boolean] Returns false if the device is not an iPad; all
|
72
71
|
# keyboards on the Phone and iPod are docked and not split.
|
73
72
|
def split_keyboard_visible?
|
74
|
-
|
73
|
+
Device.default.split_keyboard_visible?
|
75
74
|
end
|
76
75
|
|
77
76
|
# Touches the keyboard action key.
|
@@ -91,29 +90,86 @@ module Calabash
|
|
91
90
|
# @todo Refactor uia_route to a public API call
|
92
91
|
# @todo Move this documentation to the public method
|
93
92
|
# @!visibility private
|
94
|
-
|
93
|
+
def _tap_keyboard_action_key(action_key)
|
95
94
|
unless action_key.nil?
|
96
95
|
raise ArgumentError,
|
97
96
|
"An iOS keyboard does not have multiple action keys"
|
98
97
|
end
|
99
98
|
|
100
|
-
|
101
|
-
|
99
|
+
char_sequence = ESCAPED_KEYBOARD_CHARACTERS[:action]
|
100
|
+
Device.default.uia_route("uia.keyboard().typeString('#{char_sequence}')")
|
102
101
|
end
|
103
102
|
|
104
103
|
# @!visibility private
|
105
|
-
|
104
|
+
def _keyboard_visible?
|
106
105
|
docked_keyboard_visible? || undocked_keyboard_visible? || split_keyboard_visible?
|
107
106
|
end
|
108
107
|
|
109
108
|
# Touches the keyboard delete key.
|
109
|
+
#
|
110
|
+
# The 'delete' key difficult to find and touch because its behavior
|
111
|
+
# changes depending on the iOS version and keyboard type. Consider the
|
112
|
+
# following:
|
113
|
+
#
|
114
|
+
# On iOS 6, the 'delete' char code is _not_ \b.
|
115
|
+
# On iOS 7: The Delete char code is \b on non-numeric keyboards.
|
116
|
+
# On numeric keyboards, the delete key is a button on the
|
117
|
+
# the keyboard.
|
118
|
+
#
|
119
|
+
# By default, Calabash uses a raw UIAutomaton JavaScript call to tap the
|
120
|
+
# element named 'Delete'. This works well in English localizations for
|
121
|
+
# most keyboards. If you find that it does not work, use the options
|
122
|
+
# pass either an translation of 'Delete' for your localization or use the
|
123
|
+
# default the escaped keyboard character.
|
124
|
+
#
|
110
125
|
# @example
|
111
|
-
#
|
126
|
+
# # Uses UIAutomation to tap the 'Delete' key or button.
|
127
|
+
# tap_keyboard_delete_key
|
128
|
+
#
|
129
|
+
# # Types the \b key.
|
130
|
+
# tap_keyboard_delete_key({:use_escaped_char => true})
|
112
131
|
#
|
113
|
-
|
114
|
-
|
115
|
-
|
132
|
+
# # Types the \d key.
|
133
|
+
# tap_keyboard_delete_key({:use_escaped_char => '\d'})
|
134
|
+
#
|
135
|
+
# # Uses UIAutomation to tap the 'Slet' key or button.
|
136
|
+
# tap_keyboard_delete_key({:delete_key_label => 'Slet'})
|
137
|
+
#
|
138
|
+
# # Don't specify both options! If :use_escape_sequence is truthy,
|
139
|
+
# # Calabash will ignore the :delete_key_label and try to use an
|
140
|
+
# # escaped character sequence.
|
141
|
+
# tap_keyboard_delete_key({:use_escaped_char => true,
|
142
|
+
# :delete_key_label => 'Slet'})
|
143
|
+
#
|
144
|
+
# @param [Hash] options Alternative ways to tap the delete key.
|
145
|
+
# @option options [Boolean, String] :use_escaped_char (false) If true,
|
146
|
+
# delete by typing the \b character. If this value is truthy, but not
|
147
|
+
# 'true', they it is expected to be an alternative escaped character.
|
148
|
+
# @option options [String] :delete_key_label ('Delete') An alternative
|
149
|
+
# localization of 'Delete'.
|
150
|
+
# @todo Need translations of 'Delete' key.
|
151
|
+
def tap_keyboard_delete_key(options = {})
|
152
|
+
default_options =
|
153
|
+
{
|
154
|
+
use_escaped_char: false,
|
155
|
+
delete_key_label: 'Delete'
|
156
|
+
}
|
157
|
+
merged_options = default_options.merge(options)
|
158
|
+
|
159
|
+
use_escape_sequence = merged_options[:use_escaped_char]
|
160
|
+
if use_escape_sequence
|
161
|
+
if use_escape_sequence.to_s == 'true'
|
162
|
+
# Use the default \b
|
163
|
+
char_sequence = ESCAPED_KEYBOARD_CHARACTERS[:delete]
|
164
|
+
else
|
165
|
+
char_sequence = use_escape_sequence
|
166
|
+
end
|
167
|
+
return Device.default.uia_route("uia.keyboard().typeString('#{char_sequence}')")
|
116
168
|
end
|
169
|
+
|
170
|
+
delete_key_label = merged_options[:delete_key_label]
|
171
|
+
uia = "uia.keyboard().elements().firstWithName('#{delete_key_label}').tap()"
|
172
|
+
Device.default.uia_route(uia)
|
117
173
|
end
|
118
174
|
|
119
175
|
# Returns the the text in the first responder.
|
@@ -127,9 +183,7 @@ module Calabash
|
|
127
183
|
#
|
128
184
|
# @raise [RuntimeError] If there is no visible keyboard.
|
129
185
|
def text_from_keyboard_first_responder
|
130
|
-
|
131
|
-
device.text_from_keyboard_first_responder
|
132
|
-
end
|
186
|
+
Device.default.text_from_keyboard_first_responder
|
133
187
|
end
|
134
188
|
|
135
189
|
private
|
data/lib/calabash/ios/uia.rb
CHANGED
@@ -17,7 +17,7 @@ module Calabash
|
|
17
17
|
# uia("UIATarget.localTarget().frontMostApp().keyboard().buttons()['Delete']")
|
18
18
|
# uia("UIATarget.localTarget().frontMostApp().mainWindow().elements()")
|
19
19
|
def uia(script)
|
20
|
-
|
20
|
+
Device.default.evaluate_uia(script)
|
21
21
|
end
|
22
22
|
|
23
23
|
# Evaluates `script` after prefixing with "UIATarget.localTarget()"
|
data/lib/calabash/ios.rb
CHANGED
@@ -1,7 +1,21 @@
|
|
1
1
|
module Calabash
|
2
|
-
#
|
3
|
-
module
|
2
|
+
# Contains the iOS implementations of the Calabash APIs.
|
3
|
+
module IOS
|
4
4
|
require 'calabash'
|
5
|
+
include Calabash
|
6
|
+
|
7
|
+
# @!visibility private
|
8
|
+
def self.extended(base)
|
9
|
+
Calabash.send(:extended, base)
|
10
|
+
end
|
11
|
+
|
12
|
+
# @!visibility private
|
13
|
+
def self.included(base)
|
14
|
+
Calabash.send(:included, base)
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'calabash/ios/defaults'
|
18
|
+
extend Calabash::IOS::Defaults
|
5
19
|
|
6
20
|
require 'calabash/ios/environment'
|
7
21
|
require 'calabash/ios/application'
|
@@ -18,8 +32,6 @@ module Calabash
|
|
18
32
|
require 'calabash/ios/gestures'
|
19
33
|
require 'calabash/ios/slider'
|
20
34
|
require 'calabash/ios/date_picker'
|
21
|
-
require 'calabash/ios/automator'
|
22
|
-
require 'calabash/ios/web'
|
23
35
|
|
24
36
|
include Calabash::IOS::Conditions
|
25
37
|
include Calabash::IOS::Orientation
|
@@ -31,79 +43,6 @@ module Calabash
|
|
31
43
|
include Calabash::IOS::Gestures
|
32
44
|
include Calabash::IOS::Slider
|
33
45
|
include Calabash::IOS::DatePicker
|
34
|
-
include Calabash::IOS::Web
|
35
|
-
end
|
36
|
-
|
37
|
-
# Contains the iOS implementations of the Calabash APIs.
|
38
|
-
module IOS
|
39
|
-
require 'calabash'
|
40
|
-
# Hide from documentation
|
41
|
-
send(:include, Calabash)
|
42
|
-
|
43
|
-
# @!visibility private
|
44
|
-
def self.extended(base)
|
45
|
-
Calabash.send(:extended, base)
|
46
|
-
end
|
47
46
|
|
48
|
-
# @!visibility private
|
49
|
-
def self.included(base)
|
50
|
-
Calabash.send(:included, base)
|
51
|
-
end
|
52
|
-
|
53
|
-
include ::Calabash::IOSInternal
|
54
|
-
|
55
|
-
require 'calabash/ios/defaults'
|
56
|
-
extend Calabash::IOS::Defaults
|
57
|
-
|
58
|
-
require 'calabash/ios/legacy'
|
59
47
|
end
|
60
48
|
end
|
61
|
-
|
62
|
-
# @!visibility private
|
63
|
-
class CalabashIOSMethodsInternal
|
64
|
-
include ::Calabash::IOS
|
65
|
-
end
|
66
|
-
|
67
|
-
# @!visibility private
|
68
|
-
class CalabashIOSMethods < BasicObject
|
69
|
-
include ::Calabash::IOSInternal
|
70
|
-
|
71
|
-
instance_methods.each do |method_name|
|
72
|
-
define_method(method_name) do |*args, &block|
|
73
|
-
::CalabashIOSMethodsInternal.new.send(method_name, *args, &block)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
# Returns a object that exposes all of the public Calabash iOS API.
|
79
|
-
# This method should *always* be used to access the Calabash API. By default,
|
80
|
-
# all methods are executed using the default device and the default
|
81
|
-
# application.
|
82
|
-
#
|
83
|
-
# For iOS specific methods use {cal_android}. For cross-platform methods use
|
84
|
-
# {cal}.
|
85
|
-
#
|
86
|
-
# All iOS API methods are available with documentation in {Calabash::IOS}
|
87
|
-
#
|
88
|
-
# @see Calabash::IOS
|
89
|
-
#
|
90
|
-
# @return [Object] Instance responding to all Calabash iOS methods
|
91
|
-
# in the API.
|
92
|
-
def cal_ios
|
93
|
-
CalabashIOSMethods.new
|
94
|
-
end
|
95
|
-
|
96
|
-
# We also want to patch `cal` to invoke the iOS implementations
|
97
|
-
class CalabashMethodsInternal
|
98
|
-
include ::Calabash::IOS
|
99
|
-
|
100
|
-
instance_methods.each do |method_name|
|
101
|
-
define_method(method_name) do |*args, &block|
|
102
|
-
::CalabashIOSMethodsInternal.new.send(method_name, *args, &block)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
if defined?(::Calabash::AndroidInternal)
|
108
|
-
raise Calabash::RequiredBothPlatformsError, "Cannot require both calabash/android and calabash/ios"
|
109
|
-
end
|
data/lib/calabash/legacy.rb
CHANGED
@@ -1,10 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
end
|
6
|
-
|
7
|
-
if Calabash::Environment.variable('APP_PATH')
|
8
|
-
Calabash::Logger.warn("Deprecated use of old ENV variable 'APP_PATH'")
|
9
|
-
Calabash::Environment::APP_PATH = Calabash::Environment.variable('APP_PATH')
|
1
|
+
module Calabash
|
2
|
+
class Application
|
3
|
+
def md5_checksum
|
4
|
+
'samplechecksum'
|
5
|
+
end
|
6
|
+
end
|
10
7
|
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,10 +1,10 @@
|
|
1
1
|
Given(/^I have done a specific thing$/) do
|
2
2
|
# Sample step definition
|
3
3
|
# Example: (Given I am logged in)
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
4
|
+
# enter_text("* marked:'username'", USERNAME)
|
5
|
+
# enter_text("* marked:'password'", PASSWORD)
|
6
|
+
# touch("* marked:'login'")
|
7
|
+
# wait_for_view("* text:'Welcome #{USERNAME}'")
|
8
8
|
|
9
9
|
# Remember: any Ruby is allowed in your step definitions
|
10
10
|
did_something = true
|
@@ -17,13 +17,13 @@ end
|
|
17
17
|
When(/^I do something$/) do
|
18
18
|
# Sample step definition
|
19
19
|
# Example: When I create a new entry
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
20
|
+
# touch("* marked:'new_entry'")
|
21
|
+
# enter_text("* marked:'entry_title'", 'My Entry')
|
22
|
+
# touch("* marked:'submit'")
|
23
23
|
end
|
24
24
|
|
25
25
|
Then(/^something should happen$/) do
|
26
26
|
# Sample step definition
|
27
27
|
# Example: Then I should see the entry on my home page
|
28
|
-
#
|
28
|
+
# wait_for_view("* text:'My Entry'")
|
29
29
|
end
|
@@ -1,5 +1,8 @@
|
|
1
1
|
# Cucumber does not load env.rb when running a dry-run. As the pages inherit
|
2
2
|
# from Calabash::Page and assert that the scopes IOS and Android are defined,
|
3
|
-
# we should require calabash
|
3
|
+
# we should require calabash.
|
4
4
|
|
5
|
-
|
5
|
+
if ARGV.include?('--dry-run')
|
6
|
+
require 'calabash/android'
|
7
|
+
require 'calabash/ios'
|
8
|
+
end
|
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'calabash'
|
2
|
+
require 'calabash/android/application'
|
3
|
+
require 'calabash/ios/application'
|
2
4
|
|
3
5
|
platform = ENV['PLATFORM']
|
4
6
|
|
@@ -10,7 +12,7 @@ unless platform
|
|
10
12
|
elsif application.ios_application?
|
11
13
|
platform = 'ios'
|
12
14
|
else
|
13
|
-
raise "Application '#{application}' is neither an Android app
|
15
|
+
raise "Application '#{application}' is neither an Android app or an iOS app"
|
14
16
|
end
|
15
17
|
end
|
16
18
|
|
@@ -18,10 +20,14 @@ case platform
|
|
18
20
|
when 'android'
|
19
21
|
require 'calabash/android'
|
20
22
|
|
23
|
+
World(Calabash::Android)
|
24
|
+
|
21
25
|
Calabash::Android.setup_defaults!
|
22
26
|
when 'ios'
|
23
27
|
require 'calabash/ios'
|
24
28
|
|
29
|
+
World(Calabash::IOS)
|
30
|
+
|
25
31
|
Calabash::IOS.setup_defaults!
|
26
32
|
else
|
27
33
|
message = if platform.nil? || platform.empty?
|
@@ -34,7 +40,7 @@ case platform
|
|
34
40
|
[
|
35
41
|
'ERROR! Unable to start the cucumber test:',
|
36
42
|
message,
|
37
|
-
"Run cucumber with the ENV variable 'CAL_APP'
|
43
|
+
"Run cucumber with the ENV variable 'CAL_APP', or run cucumber using $ calabash run"
|
38
44
|
]
|
39
45
|
|
40
46
|
Calabash::Logger.error(failure_messages.join("\n"))
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'calabash'
|
2
|
+
|
3
|
+
Before do |scenario|
|
4
|
+
if scenario.respond_to?(:scenario_outline)
|
5
|
+
scenario = scenario.scenario_outline
|
6
|
+
end
|
7
|
+
|
8
|
+
AppLifeCycle.on_new_scenario(scenario)
|
9
|
+
|
10
|
+
start_app
|
11
|
+
end
|
12
|
+
|
13
|
+
After do
|
14
|
+
stop_app
|
15
|
+
end
|
16
|
+
|
17
|
+
module AppLifeCycle
|
18
|
+
# Since this is a module, the methods in the Cucumber World are not
|
19
|
+
# available inside the scope of this module. We can safely include Calabash
|
20
|
+
# because we will not affect the scope outside this module. The methods are
|
21
|
+
# loaded as class (static) methods.
|
22
|
+
class << self
|
23
|
+
include Calabash
|
24
|
+
end
|
25
|
+
|
26
|
+
DEFAULT_RESET_BETWEEN = #!DEFAULT_RESET_BETWEEN#! # Filled in by calabash generate
|
27
|
+
DEFAULT_RESET_METHOD = #!DEFAULT_RESET_METHOD#! # Filled in by calabash generate
|
28
|
+
|
29
|
+
RESET_BETWEEN = if Calabash::Environment.variable('RESET_BETWEEN')
|
30
|
+
Calabash::Environment.variable('RESET_BETWEEN').downcase.to_sym
|
31
|
+
else
|
32
|
+
DEFAULT_RESET_BETWEEN
|
33
|
+
end
|
34
|
+
|
35
|
+
RESET_METHOD = if Calabash::Environment.variable('RESET_METHOD')
|
36
|
+
Calabash::Environment.variable('RESET_METHOD').downcase.to_sym
|
37
|
+
else
|
38
|
+
DEFAULT_RESET_METHOD
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.on_new_scenario(scenario)
|
42
|
+
# Ensure the app is installed at the beginning of the test,
|
43
|
+
# if we never reset
|
44
|
+
if @last_feature.nil? && RESET_BETWEEN == :never
|
45
|
+
ensure_app_installed
|
46
|
+
end
|
47
|
+
|
48
|
+
if should_reset?(scenario)
|
49
|
+
reset
|
50
|
+
end
|
51
|
+
|
52
|
+
@last_feature = scenario.feature
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def self.should_reset?(scenario)
|
58
|
+
case RESET_BETWEEN
|
59
|
+
when :scenarios
|
60
|
+
true
|
61
|
+
when :features
|
62
|
+
scenario.feature != @last_feature
|
63
|
+
when :never
|
64
|
+
false
|
65
|
+
else
|
66
|
+
raise "Invalid reset between option '#{RESET_BETWEEN}'"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.reset
|
71
|
+
case RESET_METHOD
|
72
|
+
when :reinstall
|
73
|
+
install_app
|
74
|
+
when :clear
|
75
|
+
ensure_app_installed
|
76
|
+
clear_app_data
|
77
|
+
when '', nil
|
78
|
+
raise 'No reset method given'
|
79
|
+
else
|
80
|
+
raise "Invalid reset method '#{RESET_METHOD}'"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
data/lib/calabash/life_cycle.rb
CHANGED
@@ -38,13 +38,13 @@ module Calabash
|
|
38
38
|
raise 'No application given, and Calabash.default_application is not set'
|
39
39
|
end
|
40
40
|
|
41
|
-
|
41
|
+
Device.default.start_app(path_or_application, options.dup)
|
42
42
|
end
|
43
43
|
|
44
44
|
# Stop the app running on
|
45
45
|
# {Calabash::Defaults#default_server Calabash.default_server}
|
46
46
|
def stop_app
|
47
|
-
|
47
|
+
Device.default.stop_app
|
48
48
|
end
|
49
49
|
|
50
50
|
# Installs the given application. If the application is already installed,
|
@@ -67,7 +67,7 @@ module Calabash
|
|
67
67
|
raise 'No application given, and Calabash.default_application is not set'
|
68
68
|
end
|
69
69
|
|
70
|
-
|
70
|
+
Device.default.install_app(path_or_application)
|
71
71
|
end
|
72
72
|
|
73
73
|
# Installs the given application *if it is not already installed*. If no
|
@@ -90,7 +90,7 @@ module Calabash
|
|
90
90
|
raise 'No application given, and Calabash.default_application is not set'
|
91
91
|
end
|
92
92
|
|
93
|
-
|
93
|
+
Device.default.ensure_app_installed(path_or_application)
|
94
94
|
end
|
95
95
|
|
96
96
|
# Uninstalls the given application. Does nothing if the application is
|
@@ -108,7 +108,7 @@ module Calabash
|
|
108
108
|
raise 'No application given, and Calabash.default_application is not set'
|
109
109
|
end
|
110
110
|
|
111
|
-
|
111
|
+
Device.default.uninstall_app(path_or_application)
|
112
112
|
end
|
113
113
|
|
114
114
|
# Clears the contents of the given application. This is roughly equivalent to
|
@@ -126,7 +126,7 @@ module Calabash
|
|
126
126
|
raise 'No application given, and Calabash.default_application is not set'
|
127
127
|
end
|
128
128
|
|
129
|
-
|
129
|
+
Device.default.clear_app_data(path_or_application)
|
130
130
|
end
|
131
131
|
|
132
132
|
# Sends the current app to the background and resumes it after
|
@@ -150,17 +150,9 @@ module Calabash
|
|
150
150
|
true
|
151
151
|
end
|
152
152
|
|
153
|
-
# Attempts to reset the changes Calabash has made to the device.
|
154
|
-
#
|
155
|
-
# This method does nothing at the moment, but will be required to reset the
|
156
|
-
# device changes in the future.
|
157
|
-
def reset_device_changes
|
158
|
-
true
|
159
|
-
end
|
160
|
-
|
161
153
|
# @!visibility private
|
162
|
-
|
163
|
-
abstract_method!
|
154
|
+
def _send_current_app_to_background(for_seconds)
|
155
|
+
abstract_method!
|
164
156
|
end
|
165
157
|
end
|
166
158
|
end
|
data/lib/calabash/location.rb
CHANGED
@@ -5,39 +5,40 @@ module Calabash
|
|
5
5
|
# An API for setting the location of your app.
|
6
6
|
module Location
|
7
7
|
# Simulates gps location of the device/simulator.
|
8
|
+
# @note Seems UIAutomation is broken here on physical devices on iOS 7.1
|
8
9
|
#
|
9
10
|
# @example
|
10
|
-
#
|
11
|
+
# set_location({latitude: 48.8567, longitude: 2.3508})
|
11
12
|
#
|
12
13
|
# @example
|
13
|
-
#
|
14
|
+
# set_location(coordinates_for_place('The little mermaid, Copenhagen'))
|
14
15
|
#
|
15
|
-
# @param [
|
16
|
-
# @
|
17
|
-
#
|
18
|
-
def set_location(
|
19
|
-
unless
|
20
|
-
raise ArgumentError, "Expected
|
16
|
+
# @param [Hash] location The location to simulate.
|
17
|
+
# @raise [ArgumentError] If location is not a hash and does not contain a
|
18
|
+
# latitude and longitude key.
|
19
|
+
def set_location(location)
|
20
|
+
unless location.is_a?(Hash)
|
21
|
+
raise ArgumentError, "Expected location to be a Hash, not '#{location.class}'"
|
21
22
|
end
|
22
23
|
|
23
|
-
unless longitude
|
24
|
-
raise ArgumentError,
|
24
|
+
unless location[:latitude] || location[:longitude]
|
25
|
+
raise ArgumentError, 'You must supply :latitude and :longitude'
|
25
26
|
end
|
26
27
|
|
27
|
-
|
28
|
+
Device.default.set_location(location)
|
28
29
|
end
|
29
30
|
|
30
31
|
# Get the latitude and longitude for a certain place, resolved via Google
|
31
32
|
# maps api. This hash can be used in `set_location`.
|
32
33
|
#
|
33
34
|
# @example
|
34
|
-
#
|
35
|
+
# coordinates_for_place('The little mermaid, Copenhagen')
|
35
36
|
# # => {:latitude => 55.6760968, :longitude => 12.5683371}
|
36
37
|
#
|
37
38
|
# @return [Hash] Latitude and longitude for the given place
|
38
39
|
# @raise [RuntimeError] If the place cannot be found
|
39
|
-
def coordinates_for_place(
|
40
|
-
result = Geocoder.search(
|
40
|
+
def coordinates_for_place(place)
|
41
|
+
result = Geocoder.search(place)
|
41
42
|
|
42
43
|
if result.empty?
|
43
44
|
raise "No result found for '#{place}'"
|
data/lib/calabash/orientation.rb
CHANGED
@@ -62,23 +62,23 @@ module Calabash
|
|
62
62
|
end
|
63
63
|
|
64
64
|
# @!visibility private
|
65
|
-
|
66
|
-
abstract_method!
|
65
|
+
def _portrait?
|
66
|
+
abstract_method!
|
67
67
|
end
|
68
68
|
|
69
69
|
# @!visibility private
|
70
|
-
|
71
|
-
abstract_method!
|
70
|
+
def _landscape?
|
71
|
+
abstract_method!
|
72
72
|
end
|
73
73
|
|
74
74
|
# @!visibility private
|
75
|
-
|
76
|
-
abstract_method!
|
75
|
+
def _set_orientation_portrait
|
76
|
+
abstract_method!
|
77
77
|
end
|
78
78
|
|
79
79
|
# @!visibility private
|
80
|
-
|
81
|
-
abstract_method!
|
80
|
+
def _set_orientation_landscape
|
81
|
+
abstract_method!
|
82
82
|
end
|
83
83
|
end
|
84
84
|
end
|
data/lib/calabash/page.rb
CHANGED
@@ -8,6 +8,9 @@ module Calabash
|
|
8
8
|
# * https://github.com/calabash/calabash/tree/develop/samples/wordpress
|
9
9
|
# * https://github.com/calabash/calabash/tree/develop/samples/shared-page-logic
|
10
10
|
class Page
|
11
|
+
# For auto-completion
|
12
|
+
include Calabash
|
13
|
+
|
11
14
|
# @!visibility private
|
12
15
|
def self.inherited(subclass)
|
13
16
|
# Define the page into global scope
|
@@ -68,7 +71,7 @@ module Calabash
|
|
68
71
|
|
69
72
|
# Waits for the page trait to appear.
|
70
73
|
def await(options={})
|
71
|
-
|
74
|
+
wait_for_view(trait, options)
|
72
75
|
end
|
73
76
|
|
74
77
|
# @!visibility private
|