calabash-android 0.5.1 → 0.5.2.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.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/bin/calabash-android-console.rb +24 -9
  4. data/bin/calabash-android-run.rb +4 -1
  5. data/bin/calabash-android-setup.rb +1 -1
  6. data/lib/calabash-android/deprecated_actions.map +8 -0
  7. data/lib/calabash-android/env.rb +30 -2
  8. data/lib/calabash-android/environment_helpers.rb +12 -0
  9. data/lib/calabash-android/gestures.rb +308 -0
  10. data/lib/calabash-android/helpers.rb +55 -6
  11. data/lib/calabash-android/java_keystore.rb +2 -1
  12. data/lib/calabash-android/lib/TestServer.apk +0 -0
  13. data/lib/calabash-android/operations.rb +901 -707
  14. data/lib/calabash-android/removed_actions.txt +4 -0
  15. data/lib/calabash-android/steps/date_picker_steps.rb +4 -4
  16. data/lib/calabash-android/steps/time_picker_steps.rb +3 -3
  17. data/lib/calabash-android/touch_helpers.rb +114 -18
  18. data/lib/calabash-android/version.rb +1 -1
  19. data/test-server/calabash-js/src/calabash.js +42 -1
  20. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/HttpServer.java +67 -2
  21. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/MultiTouchGesture.java +749 -0
  22. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/PressKey.java +85 -0
  23. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/text/HideSoftKeyboard.java +24 -2
  24. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/text/PressUserActionButton.java +128 -0
  25. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/QueryHelper.java +8 -1
  26. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/InvocationOperation.java +56 -9
  27. metadata +10 -8
  28. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/time/SetDateByContentDescription.java +0 -33
  29. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/time/SetDateByIndex.java +0 -24
  30. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/time/SetTimeByContentDescription.java +0 -34
  31. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/time/SetTimeByIndex.java +0 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: daf5c99e264d3b69f5429e1fe0e14de3e4e7a145
4
- data.tar.gz: 1d6538452dd8984a966286dfdf415c53d440f2ac
3
+ metadata.gz: ea9071972253360f02e1b1ed07308aca2b219e0e
4
+ data.tar.gz: 4b7f3b9df746943d83ebacf832da0a992b9a4ed2
5
5
  SHA512:
6
- metadata.gz: c40fd803a4d516ec0ac3d7276c85c294b063302ac256cba1c2369706a9a61fa2246992db8c31d162c25a482060dfa45c74cc16eb8fe98b957ff0091c89936d7a
7
- data.tar.gz: 666399f4f8597e263ee6e18579926d5435171452bba5735ca1b64c2a8d9654ed653608afea57ccb325805d1acd83dbc92615895c698b9f310d3f6e2a6ddf3cc4
6
+ metadata.gz: 4067273b985fec4f1c3cf4dfb0f2ac0ddc365f65bf406d82fb8cd03c1138229e8845791a84ea8b01a20449de0e025f441b9f5d06f44a6bd3a4a6fdcf73829a30
7
+ data.tar.gz: 760f7891db8314ad420179f5cb5e4219db7ac3738ea165032e14c534bb6472a9906ddde18e28a24d7abfdbf4d0f516d35b4e99f374b907abf7daf453d0af5034
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- calabash-android (0.5.1)
4
+ calabash-android (0.5.2.pre1)
5
5
  awesome_print
6
6
  cucumber
7
7
  escape (~> 0.0.4)
@@ -1,23 +1,38 @@
1
1
  def calabash_console(app_path = nil)
2
2
  test_server_path = test_server_path(app_path)
3
3
 
4
- unless ENV['IRBRC']
5
- ENV['IRBRC'] = File.join(File.dirname(__FILE__), '..', 'irbrc')
4
+
5
+ path = ENV['CALABASH_IRBRC']
6
+ unless path
7
+ if File.exist?('.irbrc')
8
+ path = File.expand_path('.irbrc')
9
+ end
10
+ end
11
+
12
+ unless path
13
+ path = File.expand_path(File.join(File.dirname(__FILE__), '..', 'irbrc'))
6
14
  end
7
15
 
8
- unless ENV["MAIN_ACTIVITY"]
9
- ENV["MAIN_ACTIVITY"] = main_activity(app_path)
16
+ ENV['IRBRC'] = path
17
+
18
+
19
+ unless ENV['MAIN_ACTIVITY']
20
+ ENV['MAIN_ACTIVITY'] = main_activity(app_path)
10
21
  end
11
22
 
12
- unless ENV["APP_PATH"]
13
- ENV["APP_PATH"] = app_path
23
+ unless ENV['APP_PATH']
24
+ ENV['APP_PATH'] = app_path
14
25
  end
15
26
 
16
- unless ENV["TEST_APP_PATH"]
17
- ENV["TEST_APP_PATH"] = test_server_path
27
+ unless ENV['TEST_APP_PATH']
28
+ ENV['TEST_APP_PATH'] = test_server_path
18
29
  end
19
30
 
20
31
  build_test_server_if_needed(app_path)
21
32
 
22
- system "#{RbConfig.ruby} -S irb"
33
+ puts 'Starting calabash-android console...'
34
+ puts "Loading #{ENV['IRBRC']}"
35
+ puts 'Running irb...'
36
+ exec('irb')
37
+
23
38
  end
@@ -16,7 +16,10 @@ def calabash_run(app_path = nil)
16
16
  build_test_server_if_needed(app_path)
17
17
 
18
18
  test_server_path = test_server_path(app_path)
19
- env = "MAIN_ACTIVITY=#{main_activity(app_path)} "\
19
+
20
+ main_activity = ENV['MAIN_ACTIVITY'] || main_activity(app_path)
21
+
22
+ env = "MAIN_ACTIVITY=#{main_activity} "\
20
23
  "APP_PATH=\"#{app_path}\" "\
21
24
  "TEST_APP_PATH=\"#{test_server_path}\""
22
25
  else
@@ -9,7 +9,7 @@ def calabash_setup
9
9
  ask_for_setting(:keystore_password, "Please enter the password for the keystore")
10
10
  ask_for_setting(:keystore_alias, "Please enter the alias")
11
11
 
12
- open('calabash_settings', 'w') do |f|
12
+ open('.calabash_settings', 'w') do |f|
13
13
  f.puts @settings.to_json
14
14
  end
15
15
  puts "Saved your settings to .calabash_settings. You can edit the settings manually or run this setup script again"
@@ -0,0 +1,8 @@
1
+ send_key_enter,press_enter_button
2
+ send_key_left,press_left_button
3
+ send_key_right,press_right_button
4
+ send_key_up,press_up_button
5
+ send_key_down,press_down_button
6
+ press_menu,press_menu_button
7
+ go_back,press_back_button
8
+ backdoor,backdoor(method_name, arguments)
@@ -1,3 +1,4 @@
1
+ require_relative 'helpers'
1
2
 
2
3
  class Env
3
4
  require 'win32/registry' if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
@@ -79,7 +80,28 @@ class Env
79
80
  end
80
81
 
81
82
  def self.zipalign_path
82
- %Q("#{android_home_path}/tools/zipalign")
83
+ zipalign_path = File.join(android_home_path, 'tools', zipalign_executable)
84
+
85
+ unless File.exists?(zipalign_path)
86
+ log "Did not find zipalign at '#{zipalign_path}'. Trying to find zipalign in tools directories."
87
+
88
+ tools_directories.each do |dir|
89
+ zipalign_path = File.join(dir, zipalign_executable)
90
+ break if File.exists?(zipalign_path)
91
+ end
92
+ end
93
+
94
+ if File.exists?(zipalign_path)
95
+ log "Found zipalign at '#{zipalign_path}'"
96
+ zipalign_path
97
+ else
98
+ log("Did not find zipalign in any of '#{tools_directories.join("','")}'.", true)
99
+ raise 'Could not find zipalign'
100
+ end
101
+ end
102
+
103
+ def self.zipalign_executable
104
+ is_windows? ? 'zipalign.exe' : 'zipalign'
83
105
  end
84
106
 
85
107
  def self.jarsigner_executable
@@ -107,10 +129,16 @@ class Env
107
129
  end
108
130
 
109
131
  def self.tools_dir
132
+ tools_dir = tools_directories.first
133
+ log "Found tools directory at '#{tools_dir}'"
134
+ tools_dir
135
+ end
136
+
137
+ def self.tools_directories
110
138
  Dir.chdir(android_home_path) do
111
139
  dirs = Dir["build-tools/*"] + Dir["platform-tools"]
112
140
  raise "Could not find tools directory in #{android_home_path}" if dirs.empty?
113
- File.expand_path(dirs.first)
141
+ dirs.map {|dir| File.expand_path(dir)}
114
142
  end
115
143
  end
116
144
 
@@ -0,0 +1,12 @@
1
+ module Calabash
2
+ module Android
3
+ module EnvironmentHelpers
4
+ # Are we running in the Xamarin Test Cloud?
5
+ #
6
+ # @return [Boolean] Returns true if cucumber is running in the test cloud.
7
+ def xamarin_test_cloud?
8
+ ENV['XAMARIN_TEST_CLOUD'] == '1'
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,308 @@
1
+ require 'json'
2
+
3
+ module Calabash
4
+ module Android
5
+ module Gestures
6
+ class MultiTouchGesture
7
+ attr_reader :gestures
8
+ attr_accessor :timeout
9
+
10
+ DEFAULT_TIMEOUT = 5
11
+
12
+ def initialize(gestures = [])
13
+ unless gestures.is_a?(Array)
14
+ gestures = [gestures]
15
+ end
16
+
17
+ @gestures = gestures
18
+ @timeout = (ENV['CALABASH_DEFAULT_TIMEOUT'] && ENV['CALABASH_DEFAULT_TIMEOUT'].to_i) || DEFAULT_TIMEOUT
19
+ end
20
+
21
+ def +(gesture_collection)
22
+ MultiTouchGesture.new(@gestures + gesture_collection.gestures)
23
+ end
24
+
25
+ def add_gesture
26
+ gestures = @gestures
27
+ MultiTouchGesture.new(gestures + gesture_collection.gestures)
28
+ end
29
+
30
+ def <<(gesture)
31
+ @gestures << gesture
32
+ end
33
+
34
+ def add_touch(touch, index=0)
35
+ gestures = @gestures
36
+ gestures[index] << touch
37
+ MultiTouchGesture.new(gestures)
38
+ end
39
+
40
+ def add_touch!(touch, index=0)
41
+ @gestures = add_touch(touch, index).gestures
42
+ end
43
+
44
+ def merge(multi_touch_gesture)
45
+ MultiTouchGesture.new(gestures.map.with_index {|gesture, index| gesture + multi_touch_gesture.gestures[index]})
46
+ end
47
+
48
+ def merge!(multi_touch_gesture)
49
+ @gestures = merge(multi_touch_gesture).gestures
50
+ end
51
+
52
+ def to_json(*object)
53
+ {
54
+ query_timeout: @timeout.to_f,
55
+ gestures: @gestures
56
+ }.to_json(*object)
57
+ end
58
+
59
+ def query_string=(query_string)
60
+ @gestures.each {|gesture| gesture.query_string=query_string}
61
+ end
62
+
63
+ def reset_query_string
64
+ @gestures.each {|gesture| gesture.reset_query_string}
65
+ end
66
+
67
+ def offset=(offset)
68
+ @gestures.each {|gesture| gesture.offset=offset}
69
+ end
70
+
71
+ def max_execution_time
72
+ (@gestures.map {|gesture| gesture.max_execution_time}).max
73
+ end
74
+ end
75
+
76
+ class Gesture
77
+ attr_reader :touches
78
+
79
+ def initialize(touches = [], query_string = nil)
80
+ unless touches.is_a?(Array)
81
+ touches = [touches]
82
+ end
83
+
84
+ @touches = []
85
+
86
+ touches.each do |touch|
87
+ @touches << Touch.new(touch)
88
+ end
89
+
90
+ @query_string = query_string
91
+ end
92
+
93
+ def from(touch)
94
+ to(touch)
95
+ end
96
+
97
+ def to(touch)
98
+ if touch.is_a?(Hash)
99
+ touch = Touch.new(touch)
100
+ end
101
+
102
+ unless (last_touch = @touches.last).nil?
103
+ touch.x ||= last_touch.x
104
+ touch.y ||= last_touch.y
105
+ end
106
+
107
+ Gesture.new(@touches << touch, @query_string)
108
+ end
109
+
110
+ def +(gesture)
111
+ Gesture.new(@touches + gesture.touches, @query_string)
112
+ end
113
+
114
+ def add_touch(touch)
115
+ touches = @touches
116
+ Gesture.new(touches << touch, @query_string)
117
+ end
118
+
119
+ def <<(touch)
120
+ @touches << touch
121
+ end
122
+
123
+ def to_json(*object)
124
+ {
125
+ query_string: @query_string,
126
+ touches: @touches
127
+ }.to_json(*object)
128
+ end
129
+
130
+ def query_string=(query_string)
131
+ @query_string = query_string
132
+ end
133
+
134
+ def reset_query_string
135
+ touches.each {|touch| touch.query_string=nil}
136
+ end
137
+
138
+ def offset=(offset)
139
+ @touches.each {|touch| touch.offset=offset}
140
+ end
141
+
142
+ def max_execution_time
143
+ (@touches.map {|touch| touch.wait + touch.time}).reduce(:+)
144
+ end
145
+
146
+ def self.with_parameters(multi_touch_gesture, params={})
147
+ multi_touch_gesture.query_string = params[:query_string] if params[:query_string]
148
+ multi_touch_gesture.timeout = params[:timeout] if params[:timeout]
149
+
150
+ multi_touch_gesture
151
+ end
152
+
153
+ def self.generate_tap(touch_hash)
154
+ MultiTouchGesture.new(Gesture.new(Touch.new(touch_hash)))
155
+ end
156
+
157
+ def self.tap(opt={})
158
+ touch = opt[:touch] || {}
159
+ touch[:x] ||= (opt[:x] || 50)
160
+ touch[:y] ||= (opt[:y] || 50)
161
+ touch[:time] ||= (opt[:time] || 0.2)
162
+ touch[:release] = touch[:release].nil? ? (opt[:release].nil? ? true : opt[:release]) : touch[:release]
163
+ touch[:wait] ||= (opt[:wait] || 0)
164
+ touch[:offset] ||= opt[:offset]
165
+
166
+ generate_tap(touch)
167
+ end
168
+
169
+ def self.double_tap(opt={})
170
+ self.tap(opt).merge(self.tap({wait: 0.1}.merge(opt)))
171
+ end
172
+
173
+ def self.generate_swipe(from_hash, to_hash, opt={})
174
+ from_params = from_hash.merge(opt).merge(opt[:from] || {})
175
+ to_params = {time: 0}.merge(to_hash).merge(opt[:to] || {})
176
+
177
+ if opt[:flick]
178
+ to_params.merge!(wait: 0)
179
+ else
180
+ to_params = {wait: 0.2}.merge(to_params)
181
+ end
182
+
183
+ self.tap({release: false}.merge(from_params)).merge(self.tap(to_params))
184
+ end
185
+
186
+ def self.swipe(direction, opt={})
187
+ from = {x: 50, y: 50}
188
+ to = {x: 50, y: 50}
189
+
190
+ case direction
191
+ when :left
192
+ from[:x] = 90
193
+ to[:x] = 10
194
+ when :right
195
+ from[:x] = 10
196
+ to[:x] = 90
197
+ when :up
198
+ from[:y] = 90
199
+ to[:y] = 10
200
+ when :down
201
+ from[:y] = 10
202
+ to[:y] = 90
203
+ else
204
+ raise "Cannot swipe in #{direction}"
205
+ end
206
+
207
+ opt[:time] ||= 0.3
208
+
209
+ generate_swipe(from, to, opt)
210
+ end
211
+
212
+ def self.generate_pinch_out(from_arr, to_arr, opt={})
213
+ self.generate_swipe(from_arr[0], to_arr[0], opt) + self.generate_swipe(from_arr[1], to_arr[1], opt)
214
+ end
215
+
216
+ def self.pinch(direction, opt={})
217
+ opt[:from] ||= []
218
+ opt[:from][0] = (opt[:from][0] || {}).merge(opt)
219
+ opt[:from][1] = (opt[:from][1] || {}).merge(opt)
220
+ opt[:to] ||= []
221
+ opt[:to][0] ||= {}
222
+ opt[:to][1] ||= {}
223
+
224
+ from = [{x: 40, y: 40}.merge(opt[:from][0]), {x: 60, y: 60}.merge(opt[:from][1])]
225
+ to = [{x: 10, y: 10}.merge(opt[:to][0]), {x: 90, y: 90}.merge(opt[:to][1])]
226
+
227
+ case direction
228
+ when :out
229
+
230
+ when :in
231
+ from,to = to,from
232
+ else
233
+ raise "Cannot pinch #{direction}"
234
+ end
235
+
236
+ generate_pinch_out(from, to)
237
+ end
238
+ end
239
+
240
+ class Touch
241
+ attr_accessor :x, :y, :offset_x, :offset_y, :wait, :time, :release, :query_string
242
+
243
+ def initialize(touch)
244
+ if touch.is_a?(Touch)
245
+ touch = touch.to_hash
246
+ end
247
+
248
+ touch[:offset] ||= {}
249
+ touch[:offset_x] ||= touch[:offset][:x]
250
+ touch[:offset_y] ||= touch[:offset][:y]
251
+
252
+ @x = touch[:x]
253
+ @y = touch[:y]
254
+ @offset_x = touch[:offset_x] || 0
255
+ @offset_y = touch[:offset_y] || 0
256
+ @wait = touch[:wait] || 0
257
+ @time = touch[:time] || 0
258
+ @release = touch[:release].nil? ? false : touch[:release]
259
+ @query_string = touch[:query_string]
260
+ end
261
+
262
+ def merge(touch)
263
+ Touch.new(to_hash.merge(touch.to_hash))
264
+ end
265
+
266
+ def to_hash
267
+ {
268
+ x: @x,
269
+ y: @y,
270
+ offset_x: @offset_x || 0,
271
+ offset_y: @offset_y || 0,
272
+ wait: @wait.to_f,
273
+ time: @time.to_f,
274
+ release: @release,
275
+ query_string: @query_string
276
+ }
277
+ end
278
+
279
+ def to_json(object = Hash)
280
+ to_hash.to_json(object)
281
+ end
282
+
283
+ def +(touch)
284
+ hash = to_hash
285
+ hash[:x] += touch.x
286
+ hash[:y] += touch.y
287
+ hash[:offset_x] += touch.offset_x
288
+ hash[:offset_y] += touch.offset_y
289
+ Touch.new(hash)
290
+ end
291
+
292
+ def -(touch)
293
+ hash = to_hash
294
+ hash[:x] -= touch.x
295
+ hash[:y] -= touch.y
296
+ hash[:offset_x] -= touch.offset_x
297
+ hash[:offset_y] -= touch.offset_y
298
+ Touch.new(hash)
299
+ end
300
+
301
+ def offset=(offset)
302
+ @offset_x = offset[:x]
303
+ @offset_y = offset[:y]
304
+ end
305
+ end
306
+ end
307
+ end
308
+ end