calabash-cucumber 0.10.0.pre1 → 0.10.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. checksums.yaml +4 -4
  2. data/features/step_definitions/calabash_steps.rb +1 -1
  3. data/lib/calabash-cucumber/actions/instruments_actions.rb +15 -4
  4. data/lib/calabash-cucumber/actions/playback_actions.rb +12 -3
  5. data/lib/calabash-cucumber/connection.rb +3 -0
  6. data/lib/calabash-cucumber/connection_helpers.rb +4 -0
  7. data/lib/calabash-cucumber/core.rb +637 -83
  8. data/lib/calabash-cucumber/date_picker.rb +148 -29
  9. data/lib/calabash-cucumber/device.rb +160 -3
  10. data/lib/calabash-cucumber/environment_helpers.rb +91 -46
  11. data/lib/calabash-cucumber/failure_helpers.rb +40 -0
  12. data/lib/calabash-cucumber/http_helpers.rb +9 -2
  13. data/lib/calabash-cucumber/ibase.rb +136 -17
  14. data/lib/calabash-cucumber/ios7_operations.rb +13 -9
  15. data/lib/calabash-cucumber/ipad_1x_2x.rb +103 -48
  16. data/lib/calabash-cucumber/keyboard_helpers.rb +253 -144
  17. data/lib/calabash-cucumber/keychain_helpers.rb +46 -32
  18. data/lib/calabash-cucumber/launch/simulator_helper.rb +13 -12
  19. data/lib/calabash-cucumber/launch/simulator_launcher.rb +111 -78
  20. data/lib/calabash-cucumber/launcher.rb +265 -25
  21. data/lib/calabash-cucumber/map.rb +24 -22
  22. data/lib/calabash-cucumber/operations.rb +4 -160
  23. data/lib/calabash-cucumber/playback_helpers.rb +26 -0
  24. data/lib/calabash-cucumber/query_helpers.rb +12 -0
  25. data/lib/calabash-cucumber/rotation_helpers.rb +64 -8
  26. data/lib/calabash-cucumber/status_bar_helpers.rb +40 -3
  27. data/lib/calabash-cucumber/tests_helpers.rb +43 -14
  28. data/lib/calabash-cucumber/uia.rb +93 -9
  29. data/lib/calabash-cucumber/utils/logging.rb +30 -16
  30. data/lib/calabash-cucumber/utils/plist_buddy.rb +18 -19
  31. data/lib/calabash-cucumber/utils/simulator_accessibility.rb +41 -30
  32. data/lib/calabash-cucumber/utils/xctools.rb +31 -21
  33. data/lib/calabash-cucumber/version.rb +98 -2
  34. data/lib/calabash-cucumber/wait_helpers.rb +257 -77
  35. data/staticlib/calabash.framework.zip +0 -0
  36. metadata +64 -231
  37. data/.gitignore +0 -17
  38. data/CHANGES.txt +0 -1
  39. data/Gemfile +0 -4
  40. data/Rakefile +0 -72
  41. data/calabash-cucumber.gemspec +0 -36
  42. data/epl-v10.html +0 -261
  43. data/lib/calabash-cucumber/resources/cell_swipe_ios4_ipad.base64 +0 -51
  44. data/lib/calabash-cucumber/resources/cell_swipe_ios4_iphone.base64 +0 -51
  45. data/lib/calabash-cucumber/resources/cell_swipe_ios5_ipad.base64 +0 -74
  46. data/lib/calabash-cucumber/resources/cell_swipe_ios5_iphone.base64 +0 -74
  47. data/lib/calabash-cucumber/resources/double_tap_ios5_ipad.base64 +0 -15
  48. data/lib/calabash-cucumber/resources/double_tap_ios5_iphone.base64 +0 -15
  49. data/lib/calabash-cucumber/resources/double_tap_ios6_ipad.base64 +0 -22
  50. data/lib/calabash-cucumber/resources/double_tap_ios6_iphone.base64 +0 -22
  51. data/lib/calabash-cucumber/resources/pan_ios5_ipad.base64 +0 -199
  52. data/lib/calabash-cucumber/resources/pan_ios5_iphone.base64 +0 -199
  53. data/lib/calabash-cucumber/resources/pan_ios6_ipad.base64 +0 -206
  54. data/lib/calabash-cucumber/resources/pan_ios6_iphone.base64 +0 -206
  55. data/lib/calabash-cucumber/resources/pinch_in_ios4_ipad.base64 +0 -104
  56. data/lib/calabash-cucumber/resources/pinch_in_ios4_iphone.base64 +0 -104
  57. data/lib/calabash-cucumber/resources/pinch_in_ios5_ipad.base64 +0 -144
  58. data/lib/calabash-cucumber/resources/pinch_in_ios5_iphone.base64 +0 -144
  59. data/lib/calabash-cucumber/resources/pinch_in_ios6_ipad.base64 +0 -70
  60. data/lib/calabash-cucumber/resources/pinch_in_ios6_iphone.base64 +0 -70
  61. data/lib/calabash-cucumber/resources/pinch_out_ios5_ipad.base64 +0 -207
  62. data/lib/calabash-cucumber/resources/pinch_out_ios5_iphone.base64 +0 -207
  63. data/lib/calabash-cucumber/resources/pinch_out_ios6_ipad.base64 +0 -96
  64. data/lib/calabash-cucumber/resources/pinch_out_ios6_iphone.base64 +0 -96
  65. data/lib/calabash-cucumber/resources/rotate_left_home_down_ios4_ipad.base64 +0 -2
  66. data/lib/calabash-cucumber/resources/rotate_left_home_down_ios4_iphone.base64 +0 -2
  67. data/lib/calabash-cucumber/resources/rotate_left_home_down_ios5_ipad.base64 +0 -2
  68. data/lib/calabash-cucumber/resources/rotate_left_home_down_ios5_iphone.base64 +0 -2
  69. data/lib/calabash-cucumber/resources/rotate_left_home_left_ios4_ipad.base64 +0 -2
  70. data/lib/calabash-cucumber/resources/rotate_left_home_left_ios4_iphone.base64 +0 -2
  71. data/lib/calabash-cucumber/resources/rotate_left_home_left_ios5_ipad.base64 +0 -2
  72. data/lib/calabash-cucumber/resources/rotate_left_home_left_ios5_iphone.base64 +0 -2
  73. data/lib/calabash-cucumber/resources/rotate_left_home_right_ios4_ipad.base64 +0 -2
  74. data/lib/calabash-cucumber/resources/rotate_left_home_right_ios4_iphone.base64 +0 -2
  75. data/lib/calabash-cucumber/resources/rotate_left_home_right_ios5_ipad.base64 +0 -2
  76. data/lib/calabash-cucumber/resources/rotate_left_home_right_ios5_iphone.base64 +0 -2
  77. data/lib/calabash-cucumber/resources/rotate_left_home_up_ios4_ipad.base64 +0 -2
  78. data/lib/calabash-cucumber/resources/rotate_left_home_up_ios4_iphone.base64 +0 -2
  79. data/lib/calabash-cucumber/resources/rotate_left_home_up_ios5_ipad.base64 +0 -2
  80. data/lib/calabash-cucumber/resources/rotate_left_home_up_ios5_iphone.base64 +0 -2
  81. data/lib/calabash-cucumber/resources/rotate_right_home_down_ios4_ipad.base64 +0 -2
  82. data/lib/calabash-cucumber/resources/rotate_right_home_down_ios4_iphone.base64 +0 -2
  83. data/lib/calabash-cucumber/resources/rotate_right_home_down_ios5_ipad.base64 +0 -2
  84. data/lib/calabash-cucumber/resources/rotate_right_home_down_ios5_iphone.base64 +0 -2
  85. data/lib/calabash-cucumber/resources/rotate_right_home_left_ios4_ipad.base64 +0 -2
  86. data/lib/calabash-cucumber/resources/rotate_right_home_left_ios4_iphone.base64 +0 -2
  87. data/lib/calabash-cucumber/resources/rotate_right_home_left_ios5_ipad.base64 +0 -2
  88. data/lib/calabash-cucumber/resources/rotate_right_home_left_ios5_iphone.base64 +0 -2
  89. data/lib/calabash-cucumber/resources/rotate_right_home_right_ios4_ipad.base64 +0 -2
  90. data/lib/calabash-cucumber/resources/rotate_right_home_right_ios4_iphone.base64 +0 -2
  91. data/lib/calabash-cucumber/resources/rotate_right_home_right_ios5_ipad.base64 +0 -2
  92. data/lib/calabash-cucumber/resources/rotate_right_home_right_ios5_iphone.base64 +0 -2
  93. data/lib/calabash-cucumber/resources/rotate_right_home_up_ios4_ipad.base64 +0 -2
  94. data/lib/calabash-cucumber/resources/rotate_right_home_up_ios4_iphone.base64 +0 -2
  95. data/lib/calabash-cucumber/resources/rotate_right_home_up_ios5_ipad.base64 +0 -2
  96. data/lib/calabash-cucumber/resources/rotate_right_home_up_ios5_iphone.base64 +0 -2
  97. data/lib/calabash-cucumber/resources/swipe_down_ios5_ipad.base64 +0 -18
  98. data/lib/calabash-cucumber/resources/swipe_down_ios5_iphone.base64 +0 -31
  99. data/lib/calabash-cucumber/resources/swipe_down_ios6_ipad.base64 +0 -25
  100. data/lib/calabash-cucumber/resources/swipe_down_ios6_iphone.base64 +0 -25
  101. data/lib/calabash-cucumber/resources/swipe_left_hard_ios4_ipad.base64 +0 -15
  102. data/lib/calabash-cucumber/resources/swipe_left_hard_ios4_iphone.base64 +0 -15
  103. data/lib/calabash-cucumber/resources/swipe_left_ios4_ipad.base64 +0 -18
  104. data/lib/calabash-cucumber/resources/swipe_left_ios4_iphone.base64 +0 -18
  105. data/lib/calabash-cucumber/resources/swipe_left_ios5_ipad.base64 +0 -17
  106. data/lib/calabash-cucumber/resources/swipe_left_ios5_iphone.base64 +0 -34
  107. data/lib/calabash-cucumber/resources/swipe_left_ios6_ipad.base64 +0 -28
  108. data/lib/calabash-cucumber/resources/swipe_left_ios6_iphone.base64 +0 -28
  109. data/lib/calabash-cucumber/resources/swipe_right_hard_ios4_ipad.base64 +0 -17
  110. data/lib/calabash-cucumber/resources/swipe_right_hard_ios4_iphone.base64 +0 -17
  111. data/lib/calabash-cucumber/resources/swipe_right_ios4_ipad.base64 +0 -13
  112. data/lib/calabash-cucumber/resources/swipe_right_ios4_iphone.base64 +0 -13
  113. data/lib/calabash-cucumber/resources/swipe_right_ios5_ipad.base64 +0 -17
  114. data/lib/calabash-cucumber/resources/swipe_right_ios5_iphone.base64 +0 -17
  115. data/lib/calabash-cucumber/resources/swipe_right_ios6_ipad.base64 +0 -25
  116. data/lib/calabash-cucumber/resources/swipe_right_ios6_iphone.base64 +0 -25
  117. data/lib/calabash-cucumber/resources/swipe_up_ios5_ipad.base64 +0 -34
  118. data/lib/calabash-cucumber/resources/swipe_up_ios5_iphone.base64 +0 -28
  119. data/lib/calabash-cucumber/resources/swipe_up_ios6_ipad.base64 +0 -25
  120. data/lib/calabash-cucumber/resources/swipe_up_ios6_iphone.base64 +0 -25
  121. data/lib/calabash-cucumber/resources/touch_done_ios4_ipad.base64 +0 -7
  122. data/lib/calabash-cucumber/resources/touch_done_ios4_iphone.base64 +0 -9
  123. data/lib/calabash-cucumber/resources/touch_done_ios5_ipad.base64 +0 -7
  124. data/lib/calabash-cucumber/resources/touch_done_ios5_iphone.base64 +0 -9
  125. data/lib/calabash-cucumber/resources/touch_hold_ios5_ipad.base64 +0 -9
  126. data/lib/calabash-cucumber/resources/touch_hold_ios5_iphone.base64 +0 -9
  127. data/lib/calabash-cucumber/resources/touch_hold_ios6_ipad.base64 +0 -9
  128. data/lib/calabash-cucumber/resources/touch_hold_ios6_iphone.base64 +0 -9
  129. data/lib/calabash-cucumber/resources/touch_ios4_ipad.base64 +0 -9
  130. data/lib/calabash-cucumber/resources/touch_ios4_iphone.base64 +0 -9
  131. data/lib/calabash-cucumber/resources/touch_ios5_ipad.base64 +0 -9
  132. data/lib/calabash-cucumber/resources/touch_ios5_iphone.base64 +0 -9
  133. data/lib/calabash-cucumber/resources/touch_ios7_ipad.base64 +0 -9
  134. data/lib/calabash-cucumber/resources/touch_ios7_iphone.base64 +0 -9
  135. data/lib/calabash-cucumber/resources/wheel_down_ios4_ipad.base64 +0 -159
  136. data/lib/calabash-cucumber/resources/wheel_down_ios4_iphone.base64 +0 -159
  137. data/lib/calabash-cucumber/resources/wheel_down_ios5_ipad.base64 +0 -156
  138. data/lib/calabash-cucumber/resources/wheel_down_ios5_iphone.base64 +0 -156
  139. data/lib/calabash-cucumber/resources/wheel_up_ios4_ipad.base64 +0 -166
  140. data/lib/calabash-cucumber/resources/wheel_up_ios4_iphone.base64 +0 -166
  141. data/lib/calabash-cucumber/resources/wheel_up_ios5_ipad.base64 +0 -156
  142. data/lib/calabash-cucumber/resources/wheel_up_ios5_iphone.base64 +0 -156
  143. data/scripts/EmptyAppHack.app/Default-568h@2x.png +0 -0
  144. data/scripts/EmptyAppHack.app/Default.png +0 -0
  145. data/scripts/EmptyAppHack.app/Default@2x.png +0 -0
  146. data/scripts/EmptyAppHack.app/EmptyAppHack +0 -0
  147. data/scripts/EmptyAppHack.app/Info.plist +0 -0
  148. data/scripts/EmptyAppHack.app/PkgInfo +0 -1
  149. data/scripts/EmptyAppHack.app/en.lproj/InfoPlist.strings +0 -0
  150. data/scripts/com.example.plist +0 -0
  151. data/scripts/data/.GlobalPreferences.plist +0 -0
  152. data/scripts/reset_simulator.scpt +0 -0
  153. data/spec/bin/calabash_ios_sim_spec.rb +0 -24
  154. data/spec/launcher_spec.rb +0 -166
  155. data/spec/logging_spec.rb +0 -38
  156. data/spec/plist_buddy_spec.rb +0 -99
  157. data/spec/resources/enable-accessibility/6.1/.gitkeep +0 -0
  158. data/spec/resources/enable-accessibility/7.0.3-64/.gitkeep +0 -0
  159. data/spec/resources/enable-accessibility/7.0.3/.gitkeep +0 -0
  160. data/spec/resources/enable-accessibility/7.1-64/.gitkeep +0 -0
  161. data/spec/resources/enable-accessibility/7.1/.gitkeep +0 -0
  162. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/Default-568h@2x.png +0 -0
  163. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/Info.plist +0 -0
  164. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/LPSimpleExample-cal +0 -0
  165. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/PkgInfo +0 -1
  166. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/en.lproj/InfoPlist.strings +0 -0
  167. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/en.lproj/LPFirstViewController.nib +0 -0
  168. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/en.lproj/LPFirstViewController~ipad.nib +0 -0
  169. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/en.lproj/LPFourthViewController.nib +0 -0
  170. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/en.lproj/LPFourthViewController~ipad.nib +0 -0
  171. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/en.lproj/LPSecondViewController.nib +0 -0
  172. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/en.lproj/LPSecondViewController~ipad.nib +0 -0
  173. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/en.lproj/LPThirdViewController.nib +0 -0
  174. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/en.lproj/LPThirdViewController~ipad.nib +0 -0
  175. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/first.png +0 -0
  176. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/first@2x.png +0 -0
  177. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/second.png +0 -0
  178. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/second@2x.png +0 -0
  179. data/spec/resources/plist_buddy/com.example.plist +0 -0
  180. data/spec/resources/plist_buddy/com.testing.plist +0 -18
  181. data/spec/simulator_accessibility_spec.rb +0 -206
  182. data/spec/spec_helper.rb +0 -31
  183. data/spec/version_spec.rb +0 -13
  184. data/spec/xctools_spec.rb +0 -58
@@ -1,9 +1,18 @@
1
1
  require 'calabash-cucumber/utils/logging'
2
+
2
3
  module Calabash
3
4
  module Cucumber
4
- VERSION = '0.10.0.pre1'
5
+
6
+ # @!visibility public
7
+ # The Calabash iOS gem version.
8
+ VERSION = '0.10.0.pre2'
9
+
10
+ # @!visibility public
11
+ # The minimum required version of the calabash.framework or, for Xamarin
12
+ # users, the Calabash component.
5
13
  MIN_SERVER_VERSION = '0.10.0.pre1'
6
14
 
15
+ # @!visibility private
7
16
  def self.const_missing(const_name)
8
17
  if const_name == :FRAMEWORK_VERSION
9
18
  _deprecated('0.9.169', 'FRAMEWORK_VERSION has been deprecated - there is no replacement', :warn)
@@ -12,14 +21,58 @@ module Calabash
12
21
  raise(NameError, "uninitialized constant Calabash::Cucumber::#{const_name}")
13
22
  end
14
23
 
24
+ # A model of a release version that can be used to compare two version.
25
+ #
26
+ # Calabash tries very hard to comply with Semantic Versioning rules.
27
+ #
28
+ # However, our test workflow requires that we use `.pre` to denote
29
+ # pre-release versions instead of the recommended `-alpha`, `-beta`, or, `-pre`.
30
+ #
31
+ # Calabash version numbers will be in the form `<major>.<minor>.<patch>[.pre<N>]`.
32
+ #
33
+ # @see http://semver.org/
15
34
  class Version
16
35
 
36
+ # @!attribute [rw] major
37
+ # @return [Integer] the major version
17
38
  attr_accessor :major
39
+
40
+ # @!attribute [rw] minor
41
+ # @return [Integer] the minor version
18
42
  attr_accessor :minor
43
+
44
+ # @!attribute [rw] patch
45
+ # @return [Integer] the patch version
19
46
  attr_accessor :patch
47
+
48
+ # @!attribute [rw] pre
49
+ # @return [Boolean] true if this is a pre-release version
20
50
  attr_accessor :pre
51
+
52
+ # @!attribute [rw] pre_version
53
+ # @return [Integer] if this is a pre-release version, returns the
54
+ # pre-release version; otherwise this is nil
21
55
  attr_accessor :pre_version
22
56
 
57
+ # Creates a new Version instance with all the attributes set.
58
+ #
59
+ # @example
60
+ # version = Version.new(0.10.1)
61
+ # version.major => 0
62
+ # version.minor => 10
63
+ # version.patch => 1
64
+ # version.pre => false
65
+ # version.pre_release => nil
66
+ #
67
+ # @example
68
+ # version = Version.new(1.6.3.pre5)
69
+ # version.major => 1
70
+ # version.minor => 6
71
+ # version.patch => 3
72
+ # version.pre => true
73
+ # version.pre_release => 5
74
+ #
75
+ # @param [String] version the version string to parse.
23
76
  def initialize(version)
24
77
  tokens = version.split('.')
25
78
  count = tokens.count
@@ -32,36 +85,64 @@ module Calabash
32
85
  @major, @minor, @patch = version.split('.').map(&:to_i)
33
86
  end
34
87
 
88
+ # Returns an string representation of this version.
89
+ # @return [String] a string in the form `<major>.<minor>.<patch>[.pre<N>]`
35
90
  def to_s
36
91
  str = [@major, @minor, @patch].join('.')
37
92
  str = "#{str}.#{@pre}" if @pre
38
93
  str
39
94
  end
40
95
 
96
+ # Compare this version to another for equality.
97
+ # @param [Version] other the version to compare against
98
+ # @return [Boolean] true if this Version is the same as `other`
41
99
  def == (other)
42
100
  compare(self, other) == 0
43
101
  end
44
102
 
103
+ # Compare this version to another for inequality.
104
+ # @param [Version] other the version to compare against
105
+ # @return [Boolean] true if this Version is not the same as `other`
45
106
  def != (other)
46
107
  compare(self, other) != 0
47
108
  end
48
109
 
110
+ # Is this version less-than another version?
111
+ # @param [Version] other the version to compare against
112
+ # @return [Boolean] true if this Version is less-than `other`
49
113
  def < (other)
50
114
  compare(self, other) < 0
51
115
  end
52
116
 
117
+ # Is this version greater-than another version?
118
+ # @param [Version] other the version to compare against
119
+ # @return [Boolean] true if this Version is greater-than `other`
53
120
  def > (other)
54
121
  compare(self, other) > 0
55
122
  end
56
123
 
124
+ # Is this version less-than or equal to another version?
125
+ # @param [Version] other the version to compare against
126
+ # @return [Boolean] true if this Version is less-than or equal `other`
57
127
  def <= (other)
58
128
  compare(self, other) <= 0
59
129
  end
60
130
 
131
+ # Is this version greater-than or equal to another version?
132
+ # @param [Version] other the version to compare against
133
+ # @return [Boolean] true if this Version is greater-than or equal `other`
61
134
  def >= (other)
62
135
  compare(self, other) >= 0
63
136
  end
64
137
 
138
+ # Compare version `a` to version `b`.
139
+ #
140
+ # @example
141
+ # compare Version.new(0.10.0), Version.new(0.9.0) => 1
142
+ # compare Version.new(0.9.0), Version.new(0.10.0) => -1
143
+ # compare Version.new(0.9.0), Version.new(0.9.0) => 0
144
+ #
145
+ # @return [Integer] an integer `(-1, 1)`
65
146
  def compare(a, b)
66
147
 
67
148
  if a.major != b.major
@@ -93,12 +174,20 @@ module Calabash
93
174
  end
94
175
  end
95
176
 
177
+ # These are unit tests.
178
+ #
179
+ # $ ruby lib/calabash-cucumber/version.rb
180
+ #
181
+ # todo move to rspec
96
182
  if __FILE__ == $0
97
183
  require 'test/unit'
98
184
 
185
+ # @!visibility private
186
+ # Unit testing of Version class
99
187
  class LocalTest < Test::Unit::TestCase
100
188
  include Calabash::Cucumber
101
189
 
190
+ # @!visibility private
102
191
  def test_version
103
192
  a = Version.new('0.9.169')
104
193
  assert_equal(0, a.major)
@@ -108,18 +197,21 @@ if __FILE__ == $0
108
197
  assert_nil(a.pre_version)
109
198
  end
110
199
 
200
+ # @!visibility private
111
201
  def test_unnumbered_prerelease
112
202
  a = Version.new('0.9.169.pre')
113
203
  assert_equal('pre', a.pre)
114
204
  assert_nil(a.pre_version)
115
205
  end
116
206
 
207
+ # @!visibility private
117
208
  def test_numbered_prerelease
118
209
  a = Version.new('0.9.169.pre1')
119
210
  assert_equal('pre1', a.pre)
120
211
  assert_equal(1, a.pre_version)
121
212
  end
122
213
 
214
+ # @!visibility private
123
215
  def test_compare_equal
124
216
  a = Version.new('0.9.169')
125
217
  b = Version.new('0.9.169')
@@ -135,12 +227,12 @@ if __FILE__ == $0
135
227
 
136
228
  end
137
229
 
230
+ # @!visibility private
138
231
  def test_compare_not_equal
139
232
  a = Version.new('0.9.168')
140
233
  b = Version.new('0.9.169')
141
234
  assert(a != b)
142
235
 
143
-
144
236
  a = Version.new('0.9.169')
145
237
  b = Version.new('0.9.169.pre1')
146
238
  assert(a != b)
@@ -154,6 +246,7 @@ if __FILE__ == $0
154
246
  assert(a != b)
155
247
  end
156
248
 
249
+ # @!visibility private
157
250
  def test_compare_lt
158
251
  a = Version.new('0.9.168')
159
252
  b = Version.new('0.9.169')
@@ -172,6 +265,7 @@ if __FILE__ == $0
172
265
  assert(a < b)
173
266
  end
174
267
 
268
+ # @!visibility private
175
269
  def test_compare_gt
176
270
  a = Version.new('0.9.169')
177
271
  b = Version.new('0.9.168')
@@ -190,6 +284,7 @@ if __FILE__ == $0
190
284
  assert(a > b)
191
285
  end
192
286
 
287
+ # @!visibility private
193
288
  def test_compare_lte
194
289
  a = Version.new('0.9.168')
195
290
  b = Version.new('0.9.169')
@@ -198,6 +293,7 @@ if __FILE__ == $0
198
293
  assert(a <= b)
199
294
  end
200
295
 
296
+ # @!visibility private
201
297
  def test_compare_gte
202
298
  a = Version.new('0.9.169')
203
299
  b = Version.new('0.9.168')
@@ -5,28 +5,81 @@ require 'calabash-cucumber/utils/logging'
5
5
 
6
6
  module Calabash
7
7
  module Cucumber
8
+
9
+ # A collection of methods that help you wait for things.
8
10
  module WaitHelpers
9
11
  include Calabash::Cucumber::Logging
10
12
  include Calabash::Cucumber::Core
11
13
  include Calabash::Cucumber::TestsHelpers
12
14
 
15
+ # @!visibility private
13
16
  CLIENT_TIMEOUT_ADDITION = 5
14
17
 
18
+ # `WaitError` is the error type raised
19
+ # when a timeout occurs during a wait.
20
+ # To handle a timeout without causing test failure use
21
+ # @example
22
+ # begin
23
+ # ...
24
+ # rescue Calabash::Cucumber::WaitHelpers::WaitError => e
25
+ # ...
26
+ # end
27
+ #
15
28
  class WaitError < RuntimeError
16
29
  end
17
30
 
18
- CALABASH_CONDITIONS = {:none_animating => "NONE_ANIMATING",
19
- :no_network_indicator => "NO_NETWORK_INDICATOR"}
31
+ # Currently two conditions that can be
32
+ # waited for using `wait_for_condition`: `:none_animating` no UIKit object is animating
33
+ # and `:no_network_indicator` status bar network indicator not showing.
34
+ CALABASH_CONDITIONS = {:none_animating => 'NONE_ANIMATING',
35
+ :no_network_indicator => 'NO_NETWORK_INDICATOR'}
20
36
 
21
- # 'post_timeout' is the time to wait after a wait function returns true
37
+ # The default options used in the "wait*" methods
22
38
  DEFAULT_OPTS = {
23
- :timeout => 30,
24
- :retry_frequency => 0.3,
25
- :post_timeout => 0,
26
- :timeout_message => 'Timed out waiting...',
27
- :screenshot_on_error => true
39
+ # default upper limit on how long to wait
40
+ :timeout => 30,
41
+ # default polling frequency for waiting
42
+ :retry_frequency => 0.3,
43
+ # default extra wait after the condition becomes true
44
+ :post_timeout => 0,
45
+ # default message if timeout occurs
46
+ :timeout_message => 'Timed out waiting...',
47
+ # Calabash will generate a screenshot by default if waiting times out
48
+ :screenshot_on_error => true
28
49
  }.freeze
29
50
 
51
+ # Waits for a condition to be true. The condition is specified by a given block that is called repeatedly.
52
+ # If the block returns a 'trueish' value the condition is considered true and
53
+ # `wait_for` immediately returns.
54
+ # There is a `:timeout` option that specifies a maximum number of seconds to wait.
55
+ # If the given block doesn't return a 'trueish' value before the `:timeout` seconds has elapsed,
56
+ # the waiting fails and raises a {Calabash::Cucumber::WaitHelpers::WaitError} error.
57
+ #
58
+ # The `options` hash
59
+ # controls the details of waiting (see `options_or_timeout` below).
60
+ # {Calabash::Cucumber::WaitHelpers::DEFAULT_OPTS} specifies the default waiting options.
61
+ #
62
+ # `wait_for` is a low-level building-block for waiting and often there are higher-level
63
+ # waiting methods what use `wait_for` in their implementation (e.g. `wait_for_element_exists`).
64
+ # @see #wait_for_element_exists
65
+ #
66
+ # @example Waiting for an element (see also `wait_for_element_exists`)
67
+ # wait_for(timeout: 60,
68
+ # timeout_message: "Could not find 'Sign in' button") do
69
+ # element_exists("button marked:'Sign in'")
70
+ # end
71
+ # @param [Hash] options_or_timeout options for controlling the details of the wait.
72
+ # Note for backwards compatibility with old Calabash versions can also be a number which is
73
+ # then interpreted as a timeout.
74
+ # @option options_or_timeout [Numeric] :timeout (30) upper limit on how long to wait (in seconds)
75
+ # @option options_or_timeout [Numeric] :retry_frequency (0.3) how often to poll (i.e., call the given block)
76
+ # @option options_or_timeout [Numeric] :post_timeout (0) if positive, an extra wait is made after the condition
77
+ # is satisfied
78
+ # @option options_or_timeout [String] :timeout_message the error message to use if condition is not satisfied
79
+ # in time
80
+ # @option options_or_timeout [Boolean] :screenshot_on_error generate a screenshot on error
81
+ # @return [nil] when the condition is satisfied
82
+ # @raise [Calabash::Cucumber::WaitHelpers::WaitError] when the timeout is exceeded
30
83
  def wait_for(options_or_timeout=DEFAULT_OPTS, &block)
31
84
  #note Hash is preferred, number acceptable for backwards compat
32
85
  default_timeout = 30
@@ -54,29 +107,45 @@ module Calabash
54
107
  rescue WaitError => e
55
108
  msg = timeout_message || e
56
109
  if screenshot_on_error
57
- sleep(retry_frequency)
58
- return screenshot_and_retry(msg, &block)
110
+ sleep(retry_frequency)
111
+ return screenshot_and_retry(msg, &block)
59
112
  else
60
- raise wait_error(msg)
61
- end
113
+ raise wait_error(msg)
114
+ end
62
115
  rescue Exception => e
63
116
  handle_error_with_options(e, nil, screenshot_on_error)
64
117
  end
65
118
  end
66
119
 
67
- def screenshot_and_retry(msg, &block)
68
- path = screenshot
69
- res = yield
70
- # Validate after taking screenshot
71
- if res
72
- FileUtils.rm_f(path)
73
- return res
74
- else
75
- embed(path, 'image/png', msg)
76
- raise wait_error(msg)
77
- end
78
- end
79
-
120
+ # Repeatedly runs an action (for side-effects) until a condition is satisfied.
121
+ # Similar to `wait_for` but specifies both a condition to wait for and an action to repeatedly perform
122
+ # to make the condition true (e.g. scrolling). The return value of the action is ignored.
123
+ #
124
+ # The block represents the action and options :until or :until_exists specify the condition to wait for.
125
+ # Same options as `wait_for` can be provided.
126
+ #
127
+ # @see #wait_for
128
+ #
129
+ # @example Scrolling until we find an element
130
+ # wait_poll(timeout: 10,
131
+ # timeout_message: 'Unable to find "Example"',
132
+ # until_exists: "* marked:'Example'") do
133
+ # scroll("tableView", :down)
134
+ # end
135
+ #
136
+ # @example Win the battle
137
+ # wait_poll(timeout: 60,
138
+ # timeout_message: 'Defeat!',
139
+ # until: lambda { enemy_defeated? }) do
140
+ # launch_the_missiles!
141
+ # end
142
+ # @param [Hash] opts options for controlling the details of the wait in addition to the options specified below,
143
+ # all options in {Calabash::Cucumber::WaitHelpers::DEFAULT_OPTS} also apply and can be overridden.
144
+ # @option opts [Proc] :until if specified this lambda/Proc becomes the condition to wait for.
145
+ # @option opts [String] :until_exists if specified, a calabash query to wait for. Exactly one of `:until` and
146
+ # `:until_exists` must be specified
147
+ # @return [nil] when the condition is satisfied
148
+ # @raise [Calabash::Cucumber::WaitHelpers::WaitError] when the timeout is exceeded
80
149
  def wait_poll(opts, &block)
81
150
  test = opts[:until]
82
151
  if test.nil?
@@ -94,17 +163,72 @@ module Calabash
94
163
  end
95
164
  end
96
165
 
97
- #options for wait_for apply
166
+ # Waits for a Calabash query to return a non-empty result (typically a UI element to be visible).
167
+ # Uses `wait_for`.
168
+ # @see #wait_for
169
+ # @see Calabash::Cucumber::WaitHelpers::DEFAULT_OPTS
170
+ #
171
+ # @example Waiting for an element to be visible
172
+ # wait_for_element_exists("button marked:'foo'", timeout: 60)
173
+ # @param [String] element_query a Calabash query to wait for (i.e. `element_exists(element_query)`)
174
+ # @param [Hash] options options for controlling the details of the wait.
175
+ # The same options as {Calabash::Cucumber::WaitHelpers::DEFAULT_OPTS} apply.
176
+ # @return [nil] when the condition is satisfied
177
+ # @raise [Calabash::Cucumber::WaitHelpers::WaitError] when the timeout is exceeded
178
+ def wait_for_element_exists(element_query, options={})
179
+ options[:timeout_message] = options[:timeout_message] || "Timeout waiting for element: #{element_query}"
180
+ wait_for(options) { element_exists(element_query) }
181
+ end
182
+
183
+ # Waits for one or more Calabash queries to all return non-empty results (typically a UI elements to be visible).
184
+ # Uses `wait_for`.
185
+ # @see #wait_for
186
+ # @see #wait_for_element_exists
187
+ # @see Calabash::Cucumber::WaitHelpers::DEFAULT_OPTS
188
+ #
189
+ # @param [Array<String>] elements_arr an Array of Calabash queries to wait for (i.e. `element_exists(element_query)`)
190
+ # @param [Hash] options options for controlling the details of the wait.
191
+ # The same options as {Calabash::Cucumber::WaitHelpers::DEFAULT_OPTS} apply.
192
+ # @return [nil] when the condition is satisfied
193
+ # @raise [Calabash::Cucumber::WaitHelpers::WaitError] when the timeout is exceeded
98
194
  def wait_for_elements_exist(elements_arr, options={})
99
195
  if elements_arr.is_a?(String)
100
196
  elements_arr = [elements_arr]
101
197
  end
102
- options[:timeout_message] = options[:timeout_message] || "Timeout waiting for elements: #{elements_arr.join(",")}"
198
+ options[:timeout_message] = options[:timeout_message] || "Timeout waiting for elements: #{elements_arr.join(',')}"
103
199
  wait_for(options) do
104
200
  elements_arr.all? { |q| element_exists(q) }
105
201
  end
106
202
  end
107
- #options for wait_for apply
203
+
204
+ # Waits for a Calabash query to return an empty result (typically a UI element to disappear).
205
+ # Uses `wait_for`.
206
+ # @see #wait_for
207
+ # @see #wait_for_element_exists
208
+ # @see Calabash::Cucumber::WaitHelpers::DEFAULT_OPTS
209
+ #
210
+ # @param [String] element_query a Calabash query to be empty (i.e. `element_does_not_exist(element_query)`)
211
+ # @param [Hash] options options for controlling the details of the wait.
212
+ # The same options as {Calabash::Cucumber::WaitHelpers::DEFAULT_OPTS} apply.
213
+ # @return [nil] when the condition is satisfied
214
+ # @raise [Calabash::Cucumber::WaitHelpers::WaitError] when the timeout is exceeded
215
+ def wait_for_element_does_not_exists(element_query, options={})
216
+ options[:timeout_message] = options[:timeout_message] || "Timeout waiting for element to not exist: #{element_query}"
217
+ wait_for(options) { element_does_not_exist(element_query) }
218
+ end
219
+
220
+ # Waits for one or more Calabash queries to all return empty results (typically a UI elements to disappear).
221
+ # Uses `wait_for`.
222
+ # @see #wait_for
223
+ # @see #wait_for_element_exists
224
+ # @see #wait_for_element_does_not_exists
225
+ # @see Calabash::Cucumber::WaitHelpers::DEFAULT_OPTS
226
+ #
227
+ # @param [Array<String>] elements_arr an Array of Calabash queries to be empty (i.e. `element_does_not_exist(element_query)`)
228
+ # @param [Hash] options options for controlling the details of the wait.
229
+ # The same options as {Calabash::Cucumber::WaitHelpers::DEFAULT_OPTS} apply.
230
+ # @return [nil] when the condition is satisfied
231
+ # @raise [Calabash::Cucumber::WaitHelpers::WaitError] when the timeout is exceeded
108
232
  def wait_for_elements_do_not_exist(elements_arr, options={})
109
233
  if elements_arr.is_a?(String)
110
234
  elements_arr = [elements_arr]
@@ -115,6 +239,7 @@ module Calabash
115
239
  end
116
240
  end
117
241
 
242
+ # @!visibility private
118
243
  def wait_for_condition(options = {})
119
244
  timeout = options[:timeout]
120
245
  unless timeout && timeout > 0
@@ -142,13 +267,13 @@ module Calabash
142
267
 
143
268
  begin
144
269
  Timeout::timeout(timeout+CLIENT_TIMEOUT_ADDITION, WaitError) do
145
- res = http({:method => :post, :path => 'condition'},
146
- options)
147
- res = JSON.parse(res)
148
- unless res['outcome'] == 'SUCCESS'
149
- raise WaitError.new(res['reason'])
150
- end
151
- sleep(options[:post_timeout]) if options[:post_timeout] > 0
270
+ res = http({:method => :post, :path => 'condition'},
271
+ options)
272
+ res = JSON.parse(res)
273
+ unless res['outcome'] == 'SUCCESS'
274
+ raise WaitError.new(res['reason'])
275
+ end
276
+ sleep(options[:post_timeout]) if options[:post_timeout] > 0
152
277
  end
153
278
  rescue WaitError => e
154
279
  msg = timeout_message || e
@@ -168,75 +293,83 @@ module Calabash
168
293
  end
169
294
  end
170
295
 
296
+ # Waits for all elements to stop animating (EXPERIMENTAL).
297
+ # @param [Hash] options options for controlling the details of the wait.
298
+ # @option options [Numeric] :timeout (30) maximum time to wait
299
+ # @return [nil] when the condition is satisfied
300
+ # @raise [Calabash::Cucumber::WaitHelpers::WaitError] when the timeout is exceeded
171
301
  def wait_for_none_animating(options = {})
172
302
  options[:condition] = CALABASH_CONDITIONS[:none_animating]
173
303
  wait_for_condition(options)
174
304
  end
175
305
 
306
+ # Waits for the status-bar network indicator to stop animating (network activity done).
307
+ # @param [Hash] options options for controlling the details of the wait.
308
+ # @option options [Numeric] :timeout (30) maximum time to wait
309
+ # @return [nil] when the condition is satisfied
310
+ # @raise [Calabash::Cucumber::WaitHelpers::WaitError] when the timeout is exceeded
176
311
  def wait_for_no_network_indicator(options = {})
177
312
  options[:condition] = CALABASH_CONDITIONS[:no_network_indicator]
178
313
  wait_for_condition(options)
179
314
  end
180
315
 
181
- #may be called with a string (query) or an array of strings
316
+ # Combines waiting for elements and waiting for animations.
317
+ # @param [Array] done_queries Calabash queries to wait for (one or more).
318
+ # @param [Hash] check_options ({}) options used for `wait_for_elements_exists(done_queries, check_options)`
319
+ # @param [Hash] animation_options ({}) options used for `wait_for_none_animating(animation_options)`
182
320
  def wait_for_transition(done_queries, check_options={},animation_options={})
183
321
  done_queries = [*done_queries]
184
322
  wait_for_elements_exist(done_queries,check_options)
185
323
  wait_for_none_animating(animation_options)
186
324
  end
187
325
 
326
+ # Combines touching an element and `wait_for_transition`
327
+ # @see #wait_for_transition
328
+ # @param [String] touch_q the Calabash query to touch
329
+ # @param [Array] done_queries passed to `wait_for_transition`
330
+ # @param [Hash] check_options ({}) passed to `wait_for_transition`
331
+ # @param [Hash] animation_options ({}) passed to `wait_for_transition`
188
332
  def touch_transition(touch_q, done_queries,check_options={},animation_options={})
189
333
  touch(touch_q)
190
334
  wait_for_transition(done_queries,check_options,animation_options)
191
335
  end
192
336
 
193
- def handle_error_with_options(ex, timeout_message, screenshot_on_error)
194
- msg = (timeout_message || ex)
195
- if ex
196
- msg = "#{msg} (#{ex.class})"
197
- end
198
- if screenshot_on_error
199
- screenshot_and_raise msg
200
- else
201
- raise msg
202
- end
203
- end
204
-
205
- def wait_error(msg)
206
- (msg.is_a?(String) ? WaitError.new(msg) : msg)
207
- end
208
-
209
337
  # Performs a lambda action until the element (a query string) appears.
210
- # The default action is to do nothing.
338
+ # The default action is to do nothing. Similar to `wait_poll`.
339
+ #
340
+ # Raises an error if no uiquery is specified.
211
341
  #
212
- # Raises an error if no uiquery is specified. Same options as wait_for
213
- # which are timeout, retry frequency, post_timeout, timeout_message, and
214
- # screenshot on error.
342
+ # @see #wait_poll
215
343
  #
216
- # Example usage:
217
- # until_element_exists("Button", :action => lambda { swipe("up") })
344
+ # @example
345
+ # until_element_exists("button", :action => lambda { swipe("up") })
346
+ # @param [String] uiquery the Calabash query to wait for
347
+ # @param [Hash] opts options for controlling the details of the wait.
348
+ # The same options as {Calabash::Cucumber::WaitHelpers::DEFAULT_OPTS} apply.
218
349
  def until_element_exists(uiquery, opts = {})
219
- extra_opts = { :until_exists => uiquery, :action => lambda { ; } }
350
+ extra_opts = { :until_exists => uiquery, :action => lambda {} }
220
351
  opts = DEFAULT_OPTS.merge(extra_opts).merge(opts)
221
- wait_poll(opts) do
352
+ wait_poll(opts) do
222
353
  opts[:action].call
223
354
  end
224
355
  end
225
356
 
226
357
  # Performs a lambda action until the element (a query string) disappears.
227
- # The default action is to do nothing.
358
+ # The default action is to do nothing.
228
359
  #
229
- # Raises an error if no uiquery is specified. Same options as wait_for
230
- # which are timeout, retry frequency, post_timeout, timeout_message, and
231
- # screenshot on error.
360
+ # Raises an error if no uiquery is specified.
232
361
  #
233
- # Example usage:
234
- # until_element_does_not_exist("Button", :action => lambda { swipe("up") })
362
+ # @example
363
+ # until_element_does_not_exist("button", :action => lambda { swipe("up") })
364
+ # @see #wait_poll
365
+ # @param [String] uiquery the Calabash query to wait for disappearing.
366
+ # @param [Hash] opts options for controlling the details of the wait.
367
+ # The same options as {Calabash::Cucumber::WaitHelpers::DEFAULT_OPTS} apply.
235
368
  def until_element_does_not_exist(uiquery, opts = {})
236
- condition = lambda { element_exists(uiquery) ? false : true }
237
- extra_opts = { :until => condition, :action => lambda { ; } }
369
+ condition = lambda {element_does_not_exist(uiquery)}
370
+ extra_opts = { :until => condition, :action => lambda {} }
238
371
  opts = DEFAULT_OPTS.merge(extra_opts).merge(opts)
239
- wait_poll(opts) do
372
+ wait_poll(opts) do
240
373
  opts[:action].call
241
374
  end
242
375
  end
@@ -244,16 +377,63 @@ module Calabash
244
377
  # Performs a lambda action once the element exists.
245
378
  # The default behavior is to touch the specified element.
246
379
  #
247
- # Raises an error if no uiquery is specified. Same options as wait_for
248
- # which are timeout, retry frequency, post_timeout, timeout_message, and
249
- # screenshot on error.
380
+ # Raises an error if no uiquery is specified.
250
381
  #
251
- # Example usage: when_element_exists("Button", :timeout => 10)
382
+ # @example
383
+ # when_element_exists("button", :timeout => 10)
384
+ # @see #wait_for
385
+ # @param [String] uiquery the Calabash query to wait for.
386
+ # @param [Hash] opts options for controlling the details of the wait.
387
+ # The same options as {Calabash::Cucumber::WaitHelpers::DEFAULT_OPTS} apply.
252
388
  def when_element_exists(uiquery, opts = {})
253
- action = { :action => lambda { touch uiquery } }
254
- opts = DEFAULT_OPTS.merge(action).merge(opts)
255
- wait_for_elements_exist([uiquery], opts)
256
- opts[:action].call
389
+ action = opts[:action] || lambda { touch(uiquery) }
390
+ wait_for_element_exists(uiquery, opts)
391
+ action.call
392
+ end
393
+
394
+ # @!visibility private
395
+ def screenshot_and_retry(msg, &block)
396
+ path = screenshot
397
+ res = yield
398
+ # Validate after taking screenshot
399
+ if res
400
+ FileUtils.rm_f(path)
401
+ return res
402
+ else
403
+ embed(path, 'image/png', msg)
404
+ raise wait_error(msg)
405
+ end
406
+ end
407
+
408
+ # @!visibility private
409
+ # raises an error by raising a exception and conditionally takes a
410
+ # screenshot based on the value of +screenshot_on_error+.
411
+ # @param [Exception,nil] ex an exception to raise
412
+ # @param [String,nil] timeout_message the message of the raise
413
+ # @param [Boolean] screenshot_on_error if true takes a screenshot before
414
+ # raising an error
415
+ # @return [nil]
416
+ # @raise RuntimeError based on +ex+ and +timeout_message+
417
+ def handle_error_with_options(ex, timeout_message, screenshot_on_error)
418
+ msg = (timeout_message || ex)
419
+ if ex
420
+ msg = "#{msg} (#{ex.class})"
421
+ end
422
+ if screenshot_on_error
423
+ screenshot_and_raise msg
424
+ else
425
+ raise msg
426
+ end
427
+ end
428
+
429
+ # @private
430
+ # if +msg+ is a String, a new WaitError is returned. Otherwise +msg+
431
+ # itself is returned.
432
+ # @param [String,Object] msg a message to raise
433
+ # @return [WaitError] if +msg+ is a String, returns a new WaitError
434
+ # @return [Object] if +msg+ is anything else, returns +msg+
435
+ def wait_error(msg)
436
+ (msg.is_a?(String) ? WaitError.new(msg) : msg)
257
437
  end
258
438
 
259
439
  end