calabash-cucumber 0.9.169.pre5 → 0.9.169.pre6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/calabash-cucumber.gemspec +1 -1
- data/features-skeleton/support/01_launch.rb +5 -7
- data/lib/calabash-cucumber/actions/instruments_actions.rb +4 -0
- data/lib/calabash-cucumber/actions/playback_actions.rb +4 -0
- data/lib/calabash-cucumber/core.rb +14 -0
- data/lib/calabash-cucumber/launcher.rb +18 -16
- data/lib/calabash-cucumber/operations.rb +11 -1
- data/lib/calabash-cucumber/uia.rb +9 -0
- data/lib/calabash-cucumber/utils/simulator_accessibility.rb +126 -70
- data/lib/calabash-cucumber/version.rb +2 -2
- data/lib/calabash-cucumber/wait_helpers.rb +20 -14
- data/spec/bin/calabash_ios_sim_spec.rb +1 -1
- data/spec/launcher_spec.rb +100 -10
- data/spec/resources/enable-accessibility/6.1/.gitkeep +0 -0
- data/spec/resources/enable-accessibility/7.0.3-64/.gitkeep +0 -0
- data/spec/resources/enable-accessibility/7.0.3/.gitkeep +0 -0
- data/spec/resources/enable-accessibility/7.1-64/.gitkeep +0 -0
- data/spec/resources/enable-accessibility/7.1/.gitkeep +0 -0
- data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/LPSimpleExample-cal +0 -0
- data/spec/simulator_accessibility_spec.rb +129 -67
- metadata +48 -38
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 35ea078d42c9b70dfbdd979ea489e9f10b28d928
|
4
|
+
data.tar.gz: 075d9e64b5f26ff76fa490291c7f877609d199fd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3594493a413ac63b8d0dc459d792638495161b2331b456b2420bcf4b5ac63ed64b4186f4489b2de351ddb3d2a5dc825716f469f8f0646ea090ba57ecb5627e59
|
7
|
+
data.tar.gz: 17d36a67d16b288a5fbc56abe0612ba0090097b950ab254640e3ba7e3b54764a56b6400ed2d8150cae8b107bfa4048a642244562abd61e28e5b40e9e86e0e209
|
data/calabash-cucumber.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.add_dependency('json')
|
22
22
|
s.add_dependency('edn')
|
23
23
|
s.add_dependency('CFPropertyList')
|
24
|
-
s.add_dependency('sim_launcher', '~> 0.4.
|
24
|
+
s.add_dependency('sim_launcher', '~> 0.4.10')
|
25
25
|
s.add_dependency('slowhandcuke')
|
26
26
|
s.add_dependency('geocoder', '~>1.1.8')
|
27
27
|
s.add_dependency('httpclient', '~> 2.3.3')
|
@@ -4,13 +4,11 @@
|
|
4
4
|
# #
|
5
5
|
# When running calabash-ios tests at #
|
6
6
|
# www.xamarin.com/test-cloud #
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
# present when running at #
|
13
|
-
# Xamarin Test Cloud #
|
7
|
+
# the methods invoked by #
|
8
|
+
# CalabashLauncher are overriden. #
|
9
|
+
# It will automatically ensure #
|
10
|
+
# running on device, installing apps #
|
11
|
+
# etc. #
|
14
12
|
# #
|
15
13
|
########################################
|
16
14
|
|
@@ -13,6 +13,10 @@ class Calabash::Cucumber::InstrumentsActions
|
|
13
13
|
query_action(options, :uia_tap_offset)
|
14
14
|
end
|
15
15
|
|
16
|
+
def wait_tap(options)
|
17
|
+
uia_wait_tap(options[:query], options)
|
18
|
+
end
|
19
|
+
|
16
20
|
def double_tap(options)
|
17
21
|
query_action(options, :uia_double_tap_offset)
|
18
22
|
end
|
@@ -46,6 +46,10 @@ module Calabash
|
|
46
46
|
map(uiquery, :query, *args)
|
47
47
|
end
|
48
48
|
|
49
|
+
def q(uiquery, *args)
|
50
|
+
query(uiquery, *args)
|
51
|
+
end
|
52
|
+
|
49
53
|
# causes all views matched by the +query+ to briefly change colors making
|
50
54
|
# them visually identifiable.
|
51
55
|
#
|
@@ -81,6 +85,16 @@ module Calabash
|
|
81
85
|
query_action_with_options(:touch, uiquery, options)
|
82
86
|
end
|
83
87
|
|
88
|
+
def wait_tap(uiquery, options={})
|
89
|
+
_uiquery, options = extract_query_and_options(uiquery, options)
|
90
|
+
launcher.actions.wait_tap(options)
|
91
|
+
end
|
92
|
+
|
93
|
+
def t(uiquery, options={})
|
94
|
+
wait_tap(uiquery, options)
|
95
|
+
end
|
96
|
+
|
97
|
+
|
84
98
|
def double_tap(uiquery, options={})
|
85
99
|
query_action_with_options(:double_tap, uiquery, options)
|
86
100
|
end
|
@@ -232,23 +232,25 @@ class Calabash::Cucumber::Launcher
|
|
232
232
|
:launch_retries => 5
|
233
233
|
}
|
234
234
|
|
235
|
-
|
235
|
+
device_tgt = ENV['DEVICE_TARGET']
|
236
|
+
if run_with_instruments?(args)
|
237
|
+
if simulator_target?
|
238
|
+
args[:device_target] = device_tgt
|
239
|
+
args[:udid] = nil
|
240
|
+
else
|
241
|
+
if detect_connected_device? && (device_tgt.nil? || device_tgt.downcase == 'device')
|
242
|
+
device_tgt = RunLoop::Core.detect_connected_device
|
243
|
+
end
|
236
244
|
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
device_tgt = RunLoop::Core.detect_connected_device
|
245
|
+
if device_tgt
|
246
|
+
args[:device_target] = args[:udid] = device_tgt
|
247
|
+
end
|
241
248
|
end
|
249
|
+
end
|
242
250
|
|
243
|
-
|
244
|
-
args[:device_target] = args[:udid] = device_tgt
|
245
|
-
else
|
246
|
-
args[:device_target] = 'simulator'
|
247
|
-
end
|
248
|
-
else
|
251
|
+
if args[:device_target].nil?
|
249
252
|
args[:device_target] = 'simulator'
|
250
253
|
end
|
251
|
-
|
252
254
|
args
|
253
255
|
end
|
254
256
|
|
@@ -309,14 +311,14 @@ class Calabash::Cucumber::Launcher
|
|
309
311
|
args[:app] = File.expand_path(args[:app])
|
310
312
|
else
|
311
313
|
# args[:app] is not a directory so must be a bundle id
|
312
|
-
if args
|
314
|
+
if simulator_target?(args) ## bundle id set, but simulator target
|
313
315
|
args[:app] = app_path || detect_app_bundle_from_args(args)
|
314
316
|
end
|
315
317
|
end
|
316
318
|
end
|
317
319
|
|
318
320
|
unless args[:app]
|
319
|
-
if args
|
321
|
+
if simulator_target?(args)
|
320
322
|
device_xamarin_build_dir = 'iPhoneSimulator'
|
321
323
|
else
|
322
324
|
device_xamarin_build_dir = 'iPhone'
|
@@ -333,7 +335,7 @@ class Calabash::Cucumber::Launcher
|
|
333
335
|
|
334
336
|
|
335
337
|
if args[:privacy_settings]
|
336
|
-
if args
|
338
|
+
if simulator_target?(args)
|
337
339
|
update_privacy_settings(args[:bundle_id], args[:privacy_settings])
|
338
340
|
else
|
339
341
|
#Not supported on device
|
@@ -383,7 +385,7 @@ class Calabash::Cucumber::Launcher
|
|
383
385
|
|
384
386
|
# todo this method should be migrated to the Simulator Launcher
|
385
387
|
def detect_app_bundle_from_args(args)
|
386
|
-
if args
|
388
|
+
if simulator_target?(args)
|
387
389
|
device_xamarin_build_dir = 'iPhoneSimulator'
|
388
390
|
else
|
389
391
|
device_xamarin_build_dir = 'iPhone'
|
@@ -63,7 +63,17 @@ module Calabash
|
|
63
63
|
touch("view marked:'#{label}'", *args)
|
64
64
|
end
|
65
65
|
|
66
|
-
def tap(
|
66
|
+
def tap(hash_or_string, *args)
|
67
|
+
if hash_or_string.is_a?(String)
|
68
|
+
tap_mark(hash_or_string, *args)
|
69
|
+
elsif hash_or_string.respond_to?(:[])
|
70
|
+
wait_tap(hash_or_string[:query], hash_or_string)
|
71
|
+
else
|
72
|
+
raise(ArgumentError, "first parameter to tap must be a string or a hash. Was: #{hash_or_string.class}, #{hash_or_string}")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def tap_mark(label, *args)
|
67
77
|
simple_touch(label, *args)
|
68
78
|
end
|
69
79
|
|
@@ -19,6 +19,15 @@ module Calabash
|
|
19
19
|
res['results'].first
|
20
20
|
end
|
21
21
|
|
22
|
+
def uia_wait_tap(query, options={})
|
23
|
+
res = http({:method => :post, :path => 'uia-tap'}, {:query => query}.merge(options))
|
24
|
+
res = JSON.parse(res)
|
25
|
+
if res['outcome'] != 'SUCCESS'
|
26
|
+
raise "uia-tap action failed because: #{res['reason']}\n#{res['details']}"
|
27
|
+
end
|
28
|
+
res['results'].first
|
29
|
+
end
|
30
|
+
|
22
31
|
def uia_query(*queryparts)
|
23
32
|
#TODO escape '\n etc in query
|
24
33
|
uia_handle_command(:query, queryparts)
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'calabash-cucumber/utils/xctools'
|
2
2
|
require 'calabash-cucumber/utils/plist_buddy'
|
3
3
|
require 'sim_launcher'
|
4
|
+
require 'cfpropertylist'
|
4
5
|
|
5
6
|
module Calabash
|
6
7
|
module Cucumber
|
@@ -48,7 +49,7 @@ module Calabash
|
|
48
49
|
quit_simulator
|
49
50
|
sim_lib_path = File.join(simulator_app_support_dir(), 'Library')
|
50
51
|
FileUtils.rm_rf(sim_lib_path)
|
51
|
-
|
52
|
+
existing_simulator_support_sdk_dirs.each do |dir|
|
52
53
|
FileUtils.rm_rf(dir)
|
53
54
|
end
|
54
55
|
|
@@ -63,7 +64,7 @@ module Calabash
|
|
63
64
|
counter = 0
|
64
65
|
loop do
|
65
66
|
break if counter == 80
|
66
|
-
dirs =
|
67
|
+
dirs = existing_simulator_support_sdk_dirs
|
67
68
|
if dirs.count == 0
|
68
69
|
sleep(0.2)
|
69
70
|
else
|
@@ -88,13 +89,21 @@ module Calabash
|
|
88
89
|
# ~/Library/Application Support/iPhone Simulator/Library/7.0.3-64
|
89
90
|
# ~/Library/Application Support/iPhone Simulator/Library/7.1
|
90
91
|
#
|
92
|
+
# a simulator is 'possible' if the SDK is available in the Xcode version.
|
93
|
+
#
|
94
|
+
# this method merges (uniquely) the possible and existing SDKs.
|
95
|
+
#
|
91
96
|
# this method also hides the AXInspector.
|
97
|
+
#
|
92
98
|
# @param [Hash] opts controls the behavior of the method
|
93
99
|
# @option opts [Boolean] :verbose controls logging output
|
94
100
|
# @return [Boolean] true iff enabling accessibility worked on all sdk
|
95
101
|
# directories
|
96
102
|
def enable_accessibility_on_simulators(opts={})
|
97
|
-
|
103
|
+
possible = possible_simulator_support_sdk_dirs
|
104
|
+
existing = existing_simulator_support_sdk_dirs
|
105
|
+
dirs = (possible + existing).uniq
|
106
|
+
results = dirs.map do |dir|
|
98
107
|
enable_accessibility_in_sdk_dir(dir, opts)
|
99
108
|
end
|
100
109
|
results.all? { |elm| elm }
|
@@ -107,13 +116,14 @@ module Calabash
|
|
107
116
|
#
|
108
117
|
# WARNING: this will quit the simulator
|
109
118
|
#
|
110
|
-
# path = '
|
119
|
+
# path = '/6.1'
|
111
120
|
# enable_accessibility_in_sdk_dir(path)
|
112
121
|
#
|
113
122
|
# this method also hides the AXInspector.
|
114
123
|
#
|
115
|
-
# if the Library/Preferences/com.apple.Accessibility.plist does not exist
|
116
|
-
# this method
|
124
|
+
# if the Library/Preferences/com.apple.Accessibility.plist does not exist
|
125
|
+
# this method will create a Library/Preferences/com.apple.Accessibility.plist
|
126
|
+
# that (oddly) the Simulator will _not_ overwrite.
|
117
127
|
#
|
118
128
|
# @see enable_accessibility_on_simulators for the public API.
|
119
129
|
#
|
@@ -128,72 +138,47 @@ module Calabash
|
|
128
138
|
default_opts = {:verbose => false}
|
129
139
|
merged = default_opts.merge(opts)
|
130
140
|
|
131
|
-
|
141
|
+
quit_simulator
|
132
142
|
|
133
143
|
verbose = merged[:verbose]
|
134
|
-
|
135
144
|
sdk = File.basename(sim_app_support_sdk_dir)
|
136
145
|
msgs = ["cannot enable accessibility for #{sdk} SDK"]
|
137
|
-
unless File.exists?(plist_path)
|
138
|
-
if verbose
|
139
|
-
msgs << "expected plist to exist at #{plist_path}"
|
140
|
-
calabash_warn(msgs.join("\n"))
|
141
|
-
end
|
142
|
-
return false
|
143
|
-
end
|
144
146
|
|
145
|
-
|
147
|
+
plist_path = File.expand_path("#{sim_app_support_sdk_dir}/Library/Preferences/com.apple.Accessibility.plist")
|
146
148
|
|
147
149
|
hash = accessibility_properties_hash()
|
148
150
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
151
|
+
if File.exist?(plist_path)
|
152
|
+
res = hash.map do |hash_key, settings|
|
153
|
+
success = plist_set(settings[:key], settings[:type], settings[:value], plist_path)
|
154
|
+
unless success
|
155
|
+
if verbose
|
156
|
+
if settings[:type] == 'bool'
|
157
|
+
value = settings[:value] ? 'YES' : 'NO'
|
158
|
+
else
|
159
|
+
value = settings[:value]
|
160
|
+
end
|
161
|
+
msgs << "could not set #{hash_key} => '#{settings[:key]}' to #{value}"
|
162
|
+
calabash_warn(msgs.join("\n"))
|
163
|
+
end
|
164
|
+
end
|
165
|
+
success
|
153
166
|
end
|
154
|
-
|
167
|
+
res.all? { |elm| elm }
|
168
|
+
else
|
169
|
+
FileUtils.mkdir_p("#{sim_app_support_sdk_dir}/Library/Preferences")
|
170
|
+
plist = CFPropertyList::List.new
|
171
|
+
data = {}
|
172
|
+
# CFPropertyList gem is super wonky
|
173
|
+
# it matches Boolean to a string type with 'true/false' values
|
174
|
+
# - stick with PlistBuddy
|
175
|
+
# hash.each do |_, settings|
|
176
|
+
# data[settings[:key]] = settings[:value]
|
177
|
+
# end
|
178
|
+
plist.value = CFPropertyList.guess(data)
|
179
|
+
plist.save(plist_path, CFPropertyList::List::FORMAT_BINARY)
|
180
|
+
enable_accessibility_in_sdk_dir(sim_app_support_sdk_dir)
|
155
181
|
end
|
156
|
-
|
157
|
-
unless plist_set(hash[:app_access_enabled], 'bool', 'true', plist_path)
|
158
|
-
if verbose
|
159
|
-
msgs << "could not set '#{hash[:app_access_enabled]}' to YES"
|
160
|
-
calabash_warn(msgs.join("\n"))
|
161
|
-
end
|
162
|
-
return false
|
163
|
-
end
|
164
|
-
|
165
|
-
unless plist_set(hash[:automation_enabled], 'bool', 'true', plist_path)
|
166
|
-
if verbose
|
167
|
-
msgs << "could not set '#{hash[:automation_enabled]}' to YES"
|
168
|
-
calabash_warn(msgs.join("\n"))
|
169
|
-
end
|
170
|
-
return false
|
171
|
-
end
|
172
|
-
|
173
|
-
unless plist_set(hash[:inspector_showing], 'bool', 'false', plist_path)
|
174
|
-
if verbose
|
175
|
-
msgs << "could not set '#{hash[:inspector_showing]}' to NO"
|
176
|
-
calabash_warn(msgs.join("\n"))
|
177
|
-
end
|
178
|
-
return false
|
179
|
-
end
|
180
|
-
|
181
|
-
unless plist_set(hash[:inspector_full_size], 'bool', 'false', plist_path)
|
182
|
-
if verbose
|
183
|
-
msgs << "could not set '#{hash[:inspector_full_size]}' to NO"
|
184
|
-
calabash_warn(msgs.join("\n"))
|
185
|
-
end
|
186
|
-
return false
|
187
|
-
end
|
188
|
-
|
189
|
-
res = plist_set(hash[:inspector_frame], 'string', '{{270, -13}, {276, 166}}', plist_path)
|
190
|
-
unless res
|
191
|
-
if verbose
|
192
|
-
msgs << "could not set '#{hash[:inspector_frame]}'"
|
193
|
-
calabash_warn(msgs.join("\n"))
|
194
|
-
end
|
195
|
-
end
|
196
|
-
res
|
197
182
|
end
|
198
183
|
|
199
184
|
|
@@ -204,29 +189,50 @@ module Calabash
|
|
204
189
|
def accessibility_properties_hash
|
205
190
|
{
|
206
191
|
# this is required
|
207
|
-
:access_enabled => 'AccessibilityEnabled',
|
192
|
+
:access_enabled => {:key => 'AccessibilityEnabled',
|
193
|
+
:value => 'true',
|
194
|
+
:type => 'bool'},
|
208
195
|
# i _think_ this is legacy
|
209
|
-
:app_access_enabled => 'ApplicationAccessibilityEnabled',
|
196
|
+
:app_access_enabled => {:key => 'ApplicationAccessibilityEnabled',
|
197
|
+
:value => 'true',
|
198
|
+
:type => 'bool'},
|
210
199
|
|
211
200
|
# i don't know what this does
|
212
|
-
:automation_enabled => 'AutomationEnabled',
|
201
|
+
:automation_enabled => {:key => 'AutomationEnabled',
|
202
|
+
:value => 'true',
|
203
|
+
:type => 'bool'},
|
213
204
|
|
214
205
|
# determines if the Accessibility Inspector is showing
|
215
|
-
:inspector_showing => 'AXInspectorEnabled',
|
206
|
+
:inspector_showing => {:key => 'AXInspectorEnabled',
|
207
|
+
:value => 'false',
|
208
|
+
:type => 'bool'},
|
209
|
+
|
216
210
|
# controls if the Accessibility Inspector is expanded or not expanded
|
217
|
-
:inspector_full_size => 'AXInspector.enabled',
|
211
|
+
:inspector_full_size => {:key => 'AXInspector.enabled',
|
212
|
+
:value => 'false',
|
213
|
+
:type => 'bool'},
|
214
|
+
|
218
215
|
# controls the frame of the Accessibility Inspector
|
219
216
|
# this is a 'string' => {{0, 0}, {276, 166}}
|
220
|
-
:inspector_frame => 'AXInspector.frame'
|
217
|
+
:inspector_frame => {:key => 'AXInspector.frame',
|
218
|
+
:value => '{{270, -13}, {276, 166}}',
|
219
|
+
:type => 'string'}
|
221
220
|
}
|
222
221
|
end
|
223
222
|
|
224
|
-
# the absolute path
|
223
|
+
# the absolute path to the iPhone Simulator Application Support directory
|
225
224
|
# @return [String] absolute path
|
226
225
|
def simulator_app_support_dir
|
227
226
|
File.expand_path('~/Library/Application Support/iPhone Simulator')
|
228
227
|
end
|
229
228
|
|
229
|
+
# the absolute path to the SDK's com.apple.Accessibility.plist file
|
230
|
+
# @param [String] sdk_dir base path the SDK directory
|
231
|
+
# @return [String] an absolute path
|
232
|
+
def plist_path_with_sdk_dir(sdk_dir)
|
233
|
+
File.expand_path("#{sdk_dir}/Library/Preferences/com.apple.Accessibility.plist")
|
234
|
+
end
|
235
|
+
|
230
236
|
# returns a list of absolute paths the existing simulator directories.
|
231
237
|
#
|
232
238
|
# a simulator 'exists' if has an Application Support directory. for
|
@@ -238,13 +244,63 @@ module Calabash
|
|
238
244
|
# ~/Library/Application Support/iPhone Simulator/Library/7.1
|
239
245
|
#
|
240
246
|
# @return[Array<String>] a list of absolute paths to simulator directories
|
241
|
-
def
|
247
|
+
def existing_simulator_support_sdk_dirs
|
242
248
|
sim_app_support_path = simulator_app_support_dir()
|
243
249
|
Dir.glob("#{sim_app_support_path}/*").select { |path|
|
244
250
|
path =~ /(\d)\.(\d)\.?(\d)?(-64)?/
|
245
251
|
}
|
246
252
|
end
|
247
253
|
|
254
|
+
# returns a list of possible SDKs per Xcode version
|
255
|
+
#
|
256
|
+
# it is not enough to ask for the available sdks because of the new 64-bit
|
257
|
+
# variants that started to appear Xcode 5 and the potential for patch level
|
258
|
+
# versions.
|
259
|
+
#
|
260
|
+
# unfortunately, this method will need be maintained per Xcode version.
|
261
|
+
#
|
262
|
+
# @return [Array<String>] ex. ['6.1', '7.1', '7.0.3', '7.0.3-64']
|
263
|
+
def possible_simulator_sdks
|
264
|
+
sdk_detector = SimLauncher::SdkDetector.new
|
265
|
+
available = sdk_detector.available_sdk_versions
|
266
|
+
instruments_version = instruments(:version)
|
267
|
+
|
268
|
+
# in Xcode 5.1* SDK 7.0 ==> 7.0.3
|
269
|
+
if (instruments_version == '5.1' or instruments_version == '5.1.1') and available.include?('7.0')
|
270
|
+
available << '7.0.3'
|
271
|
+
available << '7.0.3-64'
|
272
|
+
end
|
273
|
+
|
274
|
+
if instruments_version == '5.1.1' and available.include?('7.1')
|
275
|
+
available << '7.1'
|
276
|
+
available << '7.1-64'
|
277
|
+
end
|
278
|
+
|
279
|
+
gem_compat_xcode_versions = ['5.1', '5.1.1']
|
280
|
+
unless gem_compat_xcode_versions.include?(instruments_version)
|
281
|
+
msg = ["expected Xcode instruments version to be '5.1' or '5.1.1'",
|
282
|
+
"but found version '#{instruments_version}'",
|
283
|
+
"Gem needs a manual update for Xcode #{instruments_version}!"].join("\n")
|
284
|
+
calabash_warn(msg)
|
285
|
+
end
|
286
|
+
|
287
|
+
# in Xcode 5.1* SDK 7.0 ==> 7.0.3 so we should not include '7.0'
|
288
|
+
# if the user's support directory already contains a 7.0 and 7.0-64 dir
|
289
|
+
# we will detect it by reading from disk.
|
290
|
+
(available - ['7.0']).uniq.sort
|
291
|
+
end
|
292
|
+
|
293
|
+
# return absolute paths to possible simulator support sdk dirs
|
294
|
+
#
|
295
|
+
# these directories may or may not exist
|
296
|
+
# @return [Array<String>] an array of absolute paths
|
297
|
+
def possible_simulator_support_sdk_dirs
|
298
|
+
base_dir = simulator_app_support_dir
|
299
|
+
possible_simulator_sdks.map { |sdk|
|
300
|
+
"#{base_dir}/#{sdk}"
|
301
|
+
}
|
302
|
+
end
|
303
|
+
|
248
304
|
end
|
249
305
|
end
|
250
306
|
end
|