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
@@ -5,134 +5,175 @@ require 'calabash-cucumber/utils/logging'
5
5
  module Calabash
6
6
  module Cucumber
7
7
 
8
- # methods that describe the runtime environment
8
+ # Methods to expose the runtime environment and details about the device
9
+ # under test.
10
+ #
11
+ # @note
12
+ # The `OS` environmental variable has been deprecated. It should never
13
+ # be set.
9
14
  module EnvironmentHelpers
10
15
 
11
16
  include Calabash::Cucumber::Logging
12
17
 
13
- # returns +true+ if UIAutomation functions are available
18
+ # Are the uia* methods available?
14
19
  #
15
- # UIAutomation is only available if the app has been launched with
16
- # Instruments
20
+ # @note
21
+ # UIAutomation is only available if the app has been launched with
22
+ # instruments.
23
+ #
24
+ # @return [Boolean] Returns true if the app has been launched with
25
+ # instruments.
17
26
  def uia_available?
18
27
  Calabash::Cucumber::Launcher.instruments?
19
28
  end
20
29
 
21
- # returns +true+ if UIAutomation functions are not available
30
+ # Are the uia* methods un-available?
31
+ #
32
+ # @note
33
+ # UIAutomation is only available if the app has been launched with
34
+ # instruments.
22
35
  #
23
- # UIAutomation is only available if the app has been launched with
24
- # Instruments
36
+ # @return [Boolean] Returns true if the app has been not been launched with
37
+ # instruments.
25
38
  def uia_not_available?
26
39
  not uia_available?
27
40
  end
28
41
 
29
- # returns +true+ if cucumber is running in the test cloud
42
+ # Are we running in the Xamarin Test Cloud?
43
+ #
44
+ # @return [Boolean] Returns true if cucumber is running in the test cloud.
30
45
  def xamarin_test_cloud?
31
46
  ENV['XAMARIN_TEST_CLOUD'] == '1'
32
47
  end
33
48
 
34
- # returns the default Device
49
+ # Returns the default Device that is connected the current launcher.
50
+ #
51
+ # @return [Calabash::Cucumber::Device] An instance of Device.
35
52
  def default_device
36
53
  l = Calabash::Cucumber::Launcher.launcher_if_used
37
54
  l && l.device
38
55
  end
39
56
 
40
- # returns +true+ if the target device is an ipad
57
+ # Is the device under test an iPad?
41
58
  #
42
- # raises an error if the server cannot be reached
59
+ # @raise [RuntimeError] if the server cannot be reached
60
+ # @return [Boolean] true if device under test is an iPad.
43
61
  def ipad?
44
62
  _default_device_or_create().ipad?
45
63
  end
46
64
 
47
- # returns +true+ if the target device is an iphone
65
+ # Is the device under test an iPhone?
48
66
  #
49
- # raises an error if the server cannot be reached
67
+ # @raise [RuntimeError] if the server cannot be reached
68
+ # @return [Boolean] true if device under test is an iPhone.
50
69
  def iphone?
51
70
  _default_device_or_create().iphone?
52
71
  end
53
72
 
54
- # returns +true+ if the target device is an ipod
73
+ # Is the device under test an iPod?
55
74
  #
56
- # raises an error if the server cannot be reached
75
+ # @raise [RuntimeError] if the server cannot be reached
76
+ # @return [Boolean] true if device under test is an iPod.
57
77
  def ipod?
58
78
  _default_device_or_create().ipod?
59
79
  end
60
-
61
- # returns +true+ if the target device is an iphone or ipod
80
+
81
+ # Is the device under test an iPhone or iPod?
62
82
  #
63
- # raises an error if the server cannot be reached
83
+ # @raise [RuntimeError] if the server cannot be reached
84
+ # @return [Boolean] true if device under test is an iPhone or iPod.
64
85
  def device_family_iphone?
65
86
  iphone? or ipod?
66
87
  end
67
88
 
68
- # returns +true+ if the target device is a simulator (not a physical device)
89
+ # Is the device under test a simulator?
69
90
  #
70
- # raises an error if the server cannot be reached
91
+ # @raise [RuntimeError] if the server cannot be reached
92
+ # @return [Boolean] true if device under test is a simulator.
71
93
  def simulator?
72
94
  _default_device_or_create().simulator?
73
95
  end
74
96
 
75
- # returns +true+ if the target device or simulator is a 4in model
76
- #
77
- # raises an error if the server cannot be reached
97
+ # @deprecated 0.9.168 replaced with `iphone_4in?`
98
+ # @see #iphone_4in?
78
99
  def iphone_5?
79
100
  _deprecated('0.9.168', "use 'iphone_4in?' instead", :warn)
80
101
  iphone_4in?
81
102
  end
82
103
 
83
- # returns +true+ if the target device or simulator is a 4in model
104
+ # Does the device under test have 4in screen?
84
105
  #
85
- # raises an error if the server cannot be reached
106
+ # @raise [RuntimeError] if the server cannot be reached
107
+ # @return [Boolean] true if device under test has a 4in screen.
86
108
  def iphone_4in?
87
109
  _default_device_or_create().iphone_4in?
88
110
  end
89
111
 
90
- # returns +true+ if the OS major version is 5
112
+ # Is the device under test running iOS 5?
91
113
  #
92
- # raises an error if the server cannot be reached
114
+ # @note
115
+ # **WARNING:** The `OS` env variable has been deprecated and should
116
+ # never be set.
93
117
  #
94
- # WARNING: setting the +OS+ env variable will override the value returned
95
- # by querying the device
118
+ # @note
119
+ # **WARNING:* Setting the `OS` env variable will override the value returned
120
+ # by querying the device.
121
+ # @raise [RuntimeError] if the server cannot be reached
122
+ # @return [Boolean] true if device under test is running iOS 5
96
123
  def ios5?
97
124
  _OS_ENV.eql?(_canonical_os_version(:ios5)) || _default_device_or_create().ios5?
98
125
  end
99
126
 
100
- # returns +true+ if the OS major version is 6
127
+ # Is the device under test running iOS 6?
101
128
  #
102
- # raises an error if the server cannot be reached
129
+ # @note
130
+ # **WARNING:** The `OS` env variable has been deprecated and should
131
+ # never be set.
103
132
  #
104
- # WARNING: setting the +OS+ env variable will override the value returned
105
- # by querying the device
133
+ # @note
134
+ # **WARNING:* Setting the `OS` env variable will override the value returned
135
+ # by querying the device.
136
+ # @raise [RuntimeError] if the server cannot be reached
137
+ # @return [Boolean] true if device under test is running iOS 6
106
138
  def ios6?
107
139
  _OS_ENV.eql?(_canonical_os_version(:ios6)) || _default_device_or_create().ios6?
108
140
  end
109
141
 
110
142
 
111
- # returns +true+ if the OS major version is 7
143
+ # Is the device under test running iOS 7?
112
144
  #
113
- # raises an error if the server cannot be reached
145
+ # @note
146
+ # **WARNING:** The `OS` env variable has been deprecated and should
147
+ # never be set.
114
148
  #
115
- # WARNING: setting the +OS+ env variable will override the value returned
116
- # by querying the device
149
+ # @note
150
+ # **WARNING:* Setting the `OS` env variable will override the value returned
151
+ # by querying the device.
152
+ # @raise [RuntimeError] if the server cannot be reached
153
+ # @return [Boolean] true if device under test is running iOS 7
117
154
  def ios7?
118
155
  _OS_ENV.eql?(_canonical_os_version(:ios7)) || _default_device_or_create().ios7?
119
156
  end
120
157
 
121
- # returns +true+ if the app is an iphone app emulated on an ipad
158
+ # Is the app that is being tested an iPhone app emulated on an iPad?
159
+ #
160
+ # @see Calabash::Cucumber::IPad
122
161
  #
123
- # raises an error if the server cannot be reached
162
+ # @raise [RuntimeError] if the server cannot be reached
163
+ # @return [Boolean] true if app is being emulated on an iPad.
124
164
  def iphone_app_emulated_on_ipad?
125
165
  _default_device_or_create().iphone_app_emulated_on_ipad?
126
166
  end
127
167
 
128
168
  private
129
- # returns the device that is currently being tested against
169
+ # @!visibility private
170
+ # Returns the device that is currently being tested against.
130
171
  #
131
- # returns the +device+ attr of <tt>Calabash::Cucumber::Launcher</tt> if
132
- # it is defined. otherwise, creates a new <tt>Calabash::Cucumber::Device</tt>
172
+ # Returns the device attr of `Calabash::Cucumber::Launcher` if
173
+ # it is defined. otherwise, creates a new `Calabash::Cucumber::Device`
133
174
  # by querying the server.
134
- #
135
- # raises an error if the server cannot be reached
175
+ # @raise [RuntimeError] if the server cannot be reached
176
+ # @return [Calabash::Cucumber::Device] an instance of Device
136
177
  def _default_device_or_create
137
178
  device = default_device
138
179
  if device.nil?
@@ -141,17 +182,21 @@ module Calabash
141
182
  device
142
183
  end
143
184
 
144
- # returns the value of the environmental variable +OS+
185
+ # Returns the value of the environmental variable OS.
186
+ #
187
+ # @note
188
+ # The `OS` env has been deprecated for some time. It should never be set.
145
189
  def _OS_ENV
146
190
  ENV['OS']
147
191
  end
148
192
 
193
+ # @!visibility private
149
194
  CANONICAL_IOS_VERSIONS = {:ios5 => 'ios5',
150
195
  :ios6 => 'ios6',
151
196
  :ios7 => 'ios7'}
152
197
 
153
198
 
154
- # returns the canonical value iOS versions as strings
199
+ # Returns the canonical value iOS versions as strings.
155
200
  def _canonical_os_version(key)
156
201
  CANONICAL_IOS_VERSIONS[key]
157
202
  end
@@ -2,8 +2,19 @@ require 'fileutils'
2
2
 
3
3
  module Calabash
4
4
  module Cucumber
5
+
6
+ # A collection of methods that help you handle Step failures.
5
7
  module FailureHelpers
6
8
 
9
+ # Generates a screenshot of the app UI and saves to a file (prefer `screenshot_embed`).
10
+ # Increments a global counter of screenshots and adds the count to the filename (to ensure uniqueness).
11
+ #
12
+ # @see #screenshot_embed
13
+ # @param {Hash} options to control the details of where the screenshot is stored.
14
+ # @option options {String} :prefix (ENV['SCREENSHOT_PATH']) a prefix to prepend to the filename (e.g. 'screenshots/foo-').
15
+ # Uses ENV['SCREENSHOT_PATH'] if nil or '' if ENV['SCREENSHOT_PATH'] is nil
16
+ # @option options {String} :name ('screenshot') the base name and extension of the file (e.g. 'login.png')
17
+ # @return {String} path to the generated screenshot
7
18
  def screenshot(options={:prefix => nil, :name => nil})
8
19
  prefix = options[:prefix]
9
20
  name = options[:name]
@@ -27,17 +38,46 @@ module Calabash
27
38
  path
28
39
  end
29
40
 
41
+ # Generates a screenshot of the app UI and embeds the screenshots in all active cucumber reporters (using `embed`).
42
+ # Increments a global counter of screenshots and adds the count to the filename (to ensure uniqueness).
43
+ #
44
+ # @param {Hash} options to control the details of where the screenshot is stored.
45
+ # @option options {String} :prefix (ENV['SCREENSHOT_PATH']) a prefix to prepend to the filename (e.g. 'screenshots/foo-').
46
+ # Uses ENV['SCREENSHOT_PATH'] if nil or '' if ENV['SCREENSHOT_PATH'] is nil
47
+ # @option options {String} :name ('screenshot') the base name and extension of the file (e.g. 'login.png')
48
+ # @option options {String} :label (uses filename) the label to use in the Cucumber reporters
49
+ # @return {String} path to the generated screenshot
30
50
  def screenshot_embed(options={:prefix => nil, :name => nil, :label => nil})
31
51
  path = screenshot(options)
32
52
  filename = options[:label] || File.basename(path)
33
53
  embed(path, 'image/png', filename)
34
54
  end
35
55
 
56
+ # Generates a screenshot of the app UI by calling screenshot_embed and raises an error.
57
+ # Increments a global counter of screenshots and adds the count to the filename (to ensure uniqueness).
58
+ #
59
+ # @see #screenshot_embed
60
+ # @param {String} msg the message to use for the raised RuntimeError.
61
+ # @param {Hash} options to control the details of where the screenshot is stored.
62
+ # @option options {String} :prefix (ENV['SCREENSHOT_PATH']) a prefix to prepend to the filename (e.g. 'screenshots/foo-').
63
+ # Uses ENV['SCREENSHOT_PATH'] if nil or '' if ENV['SCREENSHOT_PATH'] is nil
64
+ # @option options {String} :name ('screenshot') the base name and extension of the file (e.g. 'login.png')
65
+ # @option options {String} :label (uses filename) the label to use in the Cucumber reporters
66
+ # @raise [RuntimeError] with `msg`
36
67
  def screenshot_and_raise(msg, options={:prefix => nil, :name => nil, :label => nil})
37
68
  screenshot_embed(options)
38
69
  raise(msg)
39
70
  end
40
71
 
72
+ # Calls `screenshot_and_raise(msg,options)`
73
+ # @see #screenshot_and_raise
74
+ # @param {String} msg the message to use for the raised RuntimeError.
75
+ # @param {Hash} options to control the details of where the screenshot is stored.
76
+ # @option options {String} :prefix (ENV['SCREENSHOT_PATH']) a prefix to prepend to the filename (e.g. 'screenshots/foo-').
77
+ # Uses ENV['SCREENSHOT_PATH'] if nil or '' if ENV['SCREENSHOT_PATH'] is nil
78
+ # @option options {String} :name ('screenshot') the base name and extension of the file (e.g. 'login.png')
79
+ # @option options {String} :label (uses filename) the label to use in the Cucumber reporters
80
+ # @raise [RuntimeError] with `msg`
41
81
  def fail(msg='Error. Check log for details.', options={:prefix => nil, :name => nil, :label => nil})
42
82
  screenshot_and_raise(msg, options)
43
83
  end
@@ -2,15 +2,20 @@ require 'httpclient'
2
2
 
3
3
  module Calabash
4
4
  module Cucumber
5
+
6
+ # @!visibility private
5
7
  module HTTPHelpers
6
8
 
9
+ # @!visibility private
7
10
  CAL_HTTP_RETRY_COUNT=3
11
+
12
+ # @!visibility private
8
13
  RETRYABLE_ERRORS = [HTTPClient::TimeoutError,
9
14
  HTTPClient::KeepAliveDisconnected,
10
15
  Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::ECONNABORTED,
11
16
  Errno::ETIMEDOUT]
12
17
 
13
-
18
+ # @!visibility private
14
19
  def http(options, data=nil)
15
20
  options[:uri] = url_for(options[:path])
16
21
  options[:method] = options[:method] || :get
@@ -26,7 +31,7 @@ module Calabash
26
31
  res
27
32
  end
28
33
 
29
-
34
+ # @!visibility private
30
35
  def url_for(verb)
31
36
  url = URI.parse(ENV['DEVICE_ENDPOINT']|| "http://localhost:37265")
32
37
  path = url.path
@@ -39,6 +44,7 @@ module Calabash
39
44
  url
40
45
  end
41
46
 
47
+ # @!visibility private
42
48
  def make_http_request(options)
43
49
  retryable_errors = options[:retryable_errors] || RETRYABLE_ERRORS
44
50
  CAL_HTTP_RETRY_COUNT.times do |count|
@@ -82,6 +88,7 @@ module Calabash
82
88
  end
83
89
  end
84
90
 
91
+ # @!visibility private
85
92
  def init_request(options={})
86
93
  http = HTTPClient.new
87
94
  http.connect_timeout = 30
@@ -1,29 +1,119 @@
1
1
  require 'calabash-cucumber/core'
2
2
  require 'calabash-cucumber/operations'
3
3
 
4
+ # The `IBase` class is a base class that can be used to easily implement page object classes on iOS (hence the I).
5
+ # Delegates to the cucumber World object for missing methods (e.g. embed or puts).
6
+ # Mixes in {Calabash::Cucumber::Operations}.
7
+ # For Calabash Android there is a corresponding `ABase`.
8
+ # For more detailed documentation on using the Page Object Pattern (POP) with Calabash, please see:
9
+ # {http://developer.xamarin.com/guides/testcloud/calabash/xplat-best-practices/}.
10
+ # Note we recommend using POP even if you're not targeting multiple platforms as it tends to lead to more maintainable
11
+ # test suites.
4
12
  class Calabash::IBase
5
13
  include Calabash::Cucumber::Operations
6
14
 
7
- attr_accessor :world, :transition_duration
15
+ # A reference to the Cucumber World variable.
16
+ # @!attribute [rw] world
17
+ # @return [Object] the Cucumber World instance
18
+ attr_accessor :world
8
19
 
20
+ # The number of seconds to allow for page complete animations _after_ this
21
+ # page trait becomes visible.
22
+ #
23
+ # @note By default, this value is _not_ used. To use this additional
24
+ # wait time, you need to include `:await_animation => true` in the options
25
+ # hash that is passed the `await` and `transition` methods.
26
+ #
27
+ # @see #trait
28
+ # @see #await
29
+ # @see #transition
30
+ #
31
+ # @!attribute [rw] transition_duration
32
+ # @return [Number] the number of seconds to allow for page transitions
33
+ attr_accessor :transition_duration
34
+
35
+ # Create a new page object.
36
+ #
37
+ # @param [Object] world the cucumber World object
38
+ # @param [Number] transition_duration the number of seconds to for page
39
+ # transitions
9
40
  def initialize(world, transition_duration=0.5)
10
41
  self.world = world
11
42
  self.transition_duration = transition_duration
12
43
  end
13
44
 
45
+ # Specifies a query that recognizes this page.
46
+ #
47
+ # @abstract
48
+ # @see #await
49
+ #
50
+ # In your subclass, you have two options to implement this abstract method.
51
+ #
52
+ # 1. Override the `trait` method.
53
+ # 2. Implement a `title` method.
54
+ #
55
+ # If you implement a `title` method, this method will return:
56
+ # `"navigationItemView marked:'#{self.title}'"`
57
+ #
58
+ # @note It is recommended that you override this method method in your in
59
+ # your subclasses (option 1 below). Relying on the UINavigationBar title is
60
+ # risky because Apple's UINavigationBar API changes often.
61
+ #
62
+ # @example
63
+ # "view marked:'home'"
64
+ #
65
+ # @example
66
+ # "tableView marked:'playlist'"
67
+ #
68
+ # @example
69
+ # "button marked:'login'"
70
+ #
71
+ # @return [String] a query string that identifies this page
72
+ # @raise [RuntimeError] if the subclass does not respond to `title` or
73
+ # the subclass does not override the `trait` method
14
74
  def trait
15
75
  raise "You should define a trait method or a title method" unless respond_to?(:title)
16
76
  "navigationItemView marked:'#{self.title}'"
17
77
  end
18
78
 
79
+ # Returns true if the current view shows this page's `trait`.
80
+ # @see #trait
81
+ # @return [Boolean] true if `element_exists(trait)`
19
82
  def current_page?
20
83
  element_exists(trait)
21
84
  end
22
85
 
86
+ # A variant of {Calabash::Cucumber::Core#page} that works inside page objects.
87
+ #
88
+ # @note It is assumed that `clz` will be a subclass of Calabash::IBase or will
89
+ # behave as such.
90
+ #
91
+ # @see Calabash::Cucumber::Core#page
92
+ # @see Calabash::IBase
93
+ # @param {Class} clz the page object class to instantiate (passing the cucumber world and `args`)
94
+ # @param {Array} args optional additional arguments to pass to the page object constructor
95
+ # @return {Object} a fresh instance of `Class clz` which has been passed a reference to the cucumber World object.
23
96
  def page(clz, *args)
24
97
  clz.new(world, *args)
25
98
  end
26
99
 
100
+ # Waits for this page's `trait` to become visible.
101
+ #
102
+ # After this page appears, you can optionally wait for
103
+ # `self.transition_duration` more seconds.
104
+ #
105
+ # @see Calabash::Cucumber::WaitHelpers#wait_for_element_exists
106
+ # @see Calabash::Cucumber::WaitHelpers#wait_for
107
+ # @see #trait
108
+ # @see #transition_duration
109
+ #
110
+ # @param {Hash} wait_opts options hash to pass to `wait_for_element_exists`
111
+ # (see {Calabash::Cucumber::WaitHelpers#wait_for} and
112
+ # {Calabash::Cucumber::WaitHelpers::DEFAULT_OPTS}).
113
+ # @option wait_opts [Boolean] :await_animation (false)
114
+ # if true, will wait for `self.transition_duration` after this page's
115
+ # `trait` appears
116
+ # @return {IBase} self
27
117
  def await(wait_opts={})
28
118
  wait_for_elements_exist([trait], wait_opts)
29
119
  unless wait_opts.has_key?(:await_animation) && !wait_opts[:await_animation]
@@ -32,24 +122,53 @@ class Calabash::IBase
32
122
  self
33
123
  end
34
124
 
35
- ##
36
- # Performs a transition from receiver page to another by performing a +:tap+ gesture
37
- # or a user specified +:action+.
38
- # Caller must supply a hash of options +transition_options+ to describe the transition.
39
- # Transition options may have the following keys
125
+ # Performs a transition from receiver page to another by performing a `tap`
126
+ # gesture or a user specified `action`.
127
+ #
128
+ # Callers must supply a hash of options `transition_options` to describe the
129
+ # transition.
130
+ #
131
+ # @note If a `tap` _and_ and `action` are defined, the `action` will be
132
+ # ignored.
133
+ #
134
+ # @note If `transition_options[:page]` is defined, then it is assumed its
135
+ # value will be a subclass of Calabash::IBase or will behave as such.
136
+ #
137
+ # @example Use this pattern to wait for `transition_duration` after the
138
+ # the target page's trait becomes visible.
40
139
  #
41
- # +:tap+: A uiquery used to perform a tap gesture to begin transition
42
- # +:action+: A proc to use begin transition (either :tap or :action must be supplied)
43
- # +:page+: A page object or page object class to transition to (target page). If a class is provided this
44
- # is instantiated using the +page+ method of self. If no +:page+ is supplied, +self+ is used.
45
- # +:await+: If specified and truthy will await the +:page+ after performing gesture (usually to wait
46
- # for animation to finish)
47
- # +:tap_options+: If +:tap+ is provided used to pass as options to touch
48
- # +:wait_options+: When awaiting target page, pass these options to the +await+ method
140
+ # opts = {:tap => "button marked:'login'",
141
+ # :wait_options => {:await_animation => true},
142
+ # :page => LoginPage}
143
+ # transition(opts)
49
144
  #
50
- # Returns the transition target page
145
+ # @param [Hash] transition_options options for controlling the transition
51
146
  #
52
- # Note it is assumed that the target page is a Calabash::IBase (or acts accordingly)
147
+ # @option transition_options [String] :tap
148
+ # A uiquery used to perform a tap gesture to begin transition.
149
+ #
150
+ # @option transition_options [Proc] :action
151
+ # A proc to use begin transition.
152
+ #
153
+ # @option transition_options [IBase,Class,nil] :page
154
+ # A page object or page object `class` to transition to (target page).
155
+ # If a `class` is provided it is instantiated using the `self.page` method.
156
+ # If no `page` is supplied, `self` is used.
157
+ #
158
+ # @option transition_options [Boolean] :await
159
+ # If true the `page`'s await will be called after performing the transition
160
+ # that triggers the transition. This is useful for waiting for animations to
161
+ # complete. Defaults to `true`.
162
+ #
163
+ # @option transition_options [Hash] :tap_options if a `tap` gesture is defined
164
+ # then these options will be passed to `touch`.
165
+ #
166
+ # @option transition_options [Hash] :wait_options if the :await key is true,
167
+ # then these options are passed to the `page.await` method.
168
+ #
169
+ # @return [IBase] the page that is transitioned to
170
+ # @raise [RuntimeError] if `transition_options` does not include a non-nil
171
+ # :tap or :action key
53
172
  def transition(transition_options={})
54
173
  uiquery = transition_options[:tap]
55
174
  action = transition_options[:action]
@@ -84,12 +203,12 @@ class Calabash::IBase
84
203
  page_obj
85
204
  end
86
205
 
206
+ # @!visibility private
87
207
  def await_screenshot(wait_opts={}, screenshot_opts={})
88
208
  await(wait_opts)
89
209
  screenshot_embed(screenshot_opts)
90
210
  end
91
211
 
92
-
93
212
  protected
94
213
  def method_missing(name, *args, &block)
95
214
  world.send(name, *args, &block)