calabash-cucumber 0.10.0.pre1 → 0.10.0.pre2

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 (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