xctasks 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/Gemfile.lock +1 -1
- data/README.md +59 -3
- data/Rakefile +5 -0
- data/lib/xctasks/test_task.rb +233 -89
- data/lib/xctasks/version.rb +1 -1
- data/spec/spec_helper.rb +11 -0
- data/spec/test_task_spec.rb +291 -0
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4e9db110bad3a10cdf968711f467637ea95f036
|
4
|
+
data.tar.gz: 73cf4abd0e9a47844c6281d9040f158c03c35af8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b8a8fd14a1c5721a0c9803bc58a9dd249bfb6329561d59f5a205e102e182e042616d310950038e1f87381b429fb8659206f53ead410854a34c17870afd1d3b46
|
7
|
+
data.tar.gz: 43b8207d2f6ff79db039201d318ecfe152f3f355e58a562ec3694b4afb64713a96e48c5622919429f04f5b14ebd7febc6c6b8e0daebfe59b1e52f97bec8e1b30
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0.0-
|
1
|
+
2.0.0-p451
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -17,11 +17,14 @@ XCTasks provides an interface for executing Xcode tests in a few ways using a un
|
|
17
17
|
```ruby
|
18
18
|
require 'xctasks/test_task'
|
19
19
|
XCTasks::TestTask.new(test: 'server:autostart') do |t|
|
20
|
-
t.workspace = 'LayerKit.xcworkspace'
|
21
|
-
t.ios_versions = %w{6.0 7.0}
|
22
|
-
t.schemes = { unit: 'LayerKit Tests' }
|
20
|
+
t.workspace = 'LayerKit.xcworkspace'
|
23
21
|
t.schemes_dir = 'Tests/Schemes' # Location where you store your shared schemes, will copy into workspace
|
24
22
|
t.runner = :xctool # or :xcodebuild/:xcpretty
|
23
|
+
|
24
|
+
t.subtask(unit: 'LayerKit Tests') do |s|
|
25
|
+
s.ios_versions = %w{7.0 7.1}
|
26
|
+
end
|
27
|
+
t.schemes = { unit: 'LayerKit Tests' }
|
25
28
|
end
|
26
29
|
```
|
27
30
|
|
@@ -37,6 +40,59 @@ rake test:unit:6.0 # Run unit tests against iOS Simulator 6.0
|
|
37
40
|
rake test:unit:7.0 # Run unit tests against iOS Simulator 7.0
|
38
41
|
```
|
39
42
|
|
43
|
+
#### Kiwi on iOS and OS X Example
|
44
|
+
|
45
|
+
The following example is taken from [TransitionKit](http://github.com/blakewatters/TransitionKit) and executes a
|
46
|
+
[Kiwi](https://github.com/allending/Kiwi) test suite on OS X and iOS.
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
require 'xctasks/test_task'
|
50
|
+
|
51
|
+
XCTasks::TestTask.new(:spec) do |t|
|
52
|
+
t.workspace = 'TransitionKit.xcworkspace'
|
53
|
+
t.schemes_dir = 'Specs/Schemes'
|
54
|
+
t.runner = :xcpretty
|
55
|
+
t.actions = %w{clean test}
|
56
|
+
|
57
|
+
t.subtask(ios: 'iOS Specs') do |s|
|
58
|
+
s.sdk = :iphonesimulator
|
59
|
+
end
|
60
|
+
|
61
|
+
t.subtask(osx: 'OS X Specs') do |s|
|
62
|
+
s.sdk = :macosx
|
63
|
+
end
|
64
|
+
end
|
65
|
+
```
|
66
|
+
|
67
|
+
#### Running Tests on Multiple Destinations
|
68
|
+
|
69
|
+
XCTasks supports a flexible syntax for specifying multiple destinations for your tests to execute on:
|
70
|
+
|
71
|
+
```ruby
|
72
|
+
XCTasks::TestTask.new(:spec) do |t|
|
73
|
+
t.workspace = 'LayerKit.xcworkspace'
|
74
|
+
t.runner = :xctool
|
75
|
+
|
76
|
+
t.subtask :functional do |s|
|
77
|
+
s.runner = :xcodebuild
|
78
|
+
s.scheme = 'Functional Tests'
|
79
|
+
|
80
|
+
# Run on iOS Simulator, iPad, latest iOS
|
81
|
+
s.destination do |d|
|
82
|
+
d.platform = :iossimulator
|
83
|
+
d.name = 'iPad'
|
84
|
+
d.os = :latest
|
85
|
+
end
|
86
|
+
|
87
|
+
# Specify a complete destination as a string
|
88
|
+
s.destination('platform=iOS Simulator,OS=7.1,name=iPhone Retina (4-inch)')
|
89
|
+
|
90
|
+
# Quickly specify a physical device destination
|
91
|
+
s.destination platform: :ios, id: '437750527b43cff55a46f42ae86dbf870c7591b1'
|
92
|
+
end
|
93
|
+
end
|
94
|
+
```
|
95
|
+
|
40
96
|
## Credits
|
41
97
|
|
42
98
|
Blake Watters
|
data/Rakefile
CHANGED
data/lib/xctasks/test_task.rb
CHANGED
@@ -2,11 +2,19 @@ require 'rake'
|
|
2
2
|
require 'rake/tasklib'
|
3
3
|
|
4
4
|
module XCTasks
|
5
|
+
module Command
|
6
|
+
def run(command, echo = true)
|
7
|
+
puts "Executing `#{command}`" if echo
|
8
|
+
system(command)
|
9
|
+
end
|
10
|
+
module_function :run
|
11
|
+
end
|
12
|
+
|
5
13
|
class TestReport
|
6
14
|
include Singleton
|
7
15
|
|
8
16
|
def initialize
|
9
|
-
@
|
17
|
+
@subtask_results = {}
|
10
18
|
@success = true
|
11
19
|
|
12
20
|
at_exit do
|
@@ -14,9 +22,9 @@ module XCTasks
|
|
14
22
|
end
|
15
23
|
end
|
16
24
|
|
17
|
-
def add_result(
|
18
|
-
@
|
19
|
-
@
|
25
|
+
def add_result(subtask, options, success)
|
26
|
+
@subtask_results[subtask] ||= {}
|
27
|
+
@subtask_results[subtask][options] = success
|
20
28
|
@success = false unless success
|
21
29
|
end
|
22
30
|
|
@@ -33,9 +41,9 @@ module XCTasks
|
|
33
41
|
end
|
34
42
|
|
35
43
|
def report
|
36
|
-
@
|
37
|
-
|
38
|
-
puts "\033[0;31m!! #{
|
44
|
+
@subtask_results.each do |subtask, options_results|
|
45
|
+
options_results.each do |options, success|
|
46
|
+
puts "\033[0;31m!! #{subtask.name} tests failed with options #{options}" unless success
|
39
47
|
end
|
40
48
|
end
|
41
49
|
puts "\033[0;32m** All tests executed successfully" if success?
|
@@ -44,56 +52,241 @@ module XCTasks
|
|
44
52
|
|
45
53
|
class TestTask < Rake::TaskLib
|
46
54
|
class Destination
|
55
|
+
# Common Keys
|
47
56
|
attr_accessor :platform, :name
|
48
57
|
|
58
|
+
# OS X attributes
|
59
|
+
attr_accessor :arch
|
60
|
+
|
61
|
+
# iOS keys
|
62
|
+
attr_accessor :id
|
63
|
+
|
64
|
+
# iOS Simulator keys
|
65
|
+
attr_accessor :os
|
66
|
+
|
67
|
+
def initialize(options = {})
|
68
|
+
options.each { |k,v| self[k] = v }
|
69
|
+
end
|
70
|
+
|
71
|
+
def platform=(platform)
|
72
|
+
valid_platforms = {osx: 'OS X', ios: 'iOS', iossimulator: 'iOS Simulator'}
|
73
|
+
raise ArgumentError, "Platform must be one of :osx, :ios, or :iossimulator" if platform.kind_of?(Symbol) && !valid_platforms.keys.include?(platform)
|
74
|
+
raise ArgumentError, "Platform must be one of 'OS X', 'iOS', or 'iOS Simulator'" if platform.kind_of?(String) && !valid_platforms.values.include?(platform)
|
75
|
+
@platform = platform.kind_of?(Symbol) ? valid_platforms[platform] : platform
|
76
|
+
end
|
77
|
+
|
78
|
+
def [](key)
|
79
|
+
send(key)
|
80
|
+
end
|
81
|
+
|
82
|
+
def []=(key, value)
|
83
|
+
send("#{key}=", value)
|
84
|
+
end
|
85
|
+
|
86
|
+
def to_s
|
87
|
+
keys = [:platform, :name, :arch, :id, :os].reject { |k| self[k].nil? }
|
88
|
+
keys.map { |k| "#{key_name(k)}='#{self[k].to_s.shellescape}'" }.join(',')
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
def key_name(attr)
|
93
|
+
attr == :os ? 'OS' : attr.to_s
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
class ConfigurationError < RuntimeError; end
|
98
|
+
class Configuration
|
99
|
+
SETTINGS = [:workspace, :schemes_dir, :sdk, :runner, :xctool_path,
|
100
|
+
:xcodebuild_path, :settings, :destinations, :actions,
|
101
|
+
:scheme, :ios_versions]
|
102
|
+
HELPERS = [:destination, :xctool?, :xcpretty?, :xcodebuild?]
|
103
|
+
|
104
|
+
# Configures delegations to pass through configuration accessor when extended
|
105
|
+
module Delegations
|
106
|
+
def self.extended(base)
|
107
|
+
base.extend Forwardable
|
108
|
+
accessors = SETTINGS.map { |attr| [attr, "#{attr}=".to_sym] }.flatten
|
109
|
+
base.def_delegators :@config, *accessors
|
110
|
+
base.def_delegators :@config, *HELPERS
|
111
|
+
end
|
112
|
+
end
|
113
|
+
attr_accessor(*SETTINGS)
|
114
|
+
|
49
115
|
def initialize
|
116
|
+
@sdk = :iphonesimulator
|
117
|
+
@schemes_dir = nil
|
118
|
+
@xctool_path = '/usr/local/bin/xctool'
|
119
|
+
@xcodebuild_path = '/usr/bin/xcodebuild'
|
120
|
+
@runner = :xcodebuild
|
121
|
+
@settings = {}
|
50
122
|
@platform = 'iOS Simulator'
|
51
|
-
@
|
123
|
+
@destinations = []
|
124
|
+
@actions = %w{clean build test}
|
125
|
+
end
|
126
|
+
|
127
|
+
def runner=(runner)
|
128
|
+
raise ConfigurationError, "Must be :xcodebuild, :xctool or :xcpretty" unless %w{xctool xcodebuild xcpretty}.include?(runner.to_s)
|
129
|
+
@runner = runner.to_sym
|
130
|
+
end
|
131
|
+
|
132
|
+
def sdk=(sdk)
|
133
|
+
raise ArgumentError, "Can only assign sdk from a String or Symbol" unless sdk.kind_of?(String) || sdk.kind_of?(Symbol)
|
134
|
+
@sdk = sdk.to_sym
|
135
|
+
end
|
136
|
+
|
137
|
+
def destination(specifier = {})
|
138
|
+
if specifier.kind_of?(String)
|
139
|
+
raise ArgumentError, "Cannot configure a destination via a block when a complete String specifier is provided" if block_given?
|
140
|
+
@destinations << specifier.shellescape
|
141
|
+
elsif specifier.kind_of?(Hash)
|
142
|
+
destination = Destination.new(specifier)
|
143
|
+
yield destination if block_given?
|
144
|
+
@destinations << destination
|
145
|
+
else
|
146
|
+
raise ArgumentError, "Cannot configure a destination with a #{specifier}"
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def validate!
|
151
|
+
raise ConfigurationError, "Cannot specify iOS versions with an SDK of :macosx" if sdk == :macosx && ios_versions
|
152
|
+
end
|
153
|
+
|
154
|
+
def xctool?
|
155
|
+
runner == :xctool
|
156
|
+
end
|
157
|
+
|
158
|
+
def xcodebuild?
|
159
|
+
runner == :xcodebuild
|
160
|
+
end
|
161
|
+
|
162
|
+
def xcpretty?
|
163
|
+
runner == :xcpretty
|
164
|
+
end
|
165
|
+
|
166
|
+
# Deep copy any nested structures
|
167
|
+
def dup
|
168
|
+
copy = super
|
169
|
+
copy.settings = settings.dup
|
170
|
+
copy.destinations = destinations.dup
|
171
|
+
return copy
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
class Subtask
|
176
|
+
extend Configuration::Delegations
|
177
|
+
include ::Rake::DSL if defined?(::Rake::DSL)
|
178
|
+
|
179
|
+
attr_reader :name, :config
|
180
|
+
|
181
|
+
def initialize(name_options, config)
|
182
|
+
@config = config.dup
|
183
|
+
self.name = name_options.kind_of?(Hash) ? name_options.keys.first : name_options.to_s
|
184
|
+
self.scheme = name_options.values.first if name_options.kind_of?(Hash)
|
185
|
+
end
|
186
|
+
|
187
|
+
def name=(name)
|
188
|
+
@name = name.to_s
|
189
|
+
end
|
190
|
+
|
191
|
+
def define_rake_tasks
|
192
|
+
@config.validate!
|
193
|
+
|
194
|
+
if namespaced?
|
195
|
+
namespace(name) do
|
196
|
+
ios_versions.each do |ios_version|
|
197
|
+
desc "Run #{name} tests against iOS Simulator #{ios_version} SDK"
|
198
|
+
task ios_version => :prepare do
|
199
|
+
run_tests(ios_version: ios_version)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
desc "Run #{name} tests against iOS Simulator #{ios_versions.join(', ')}"
|
205
|
+
task name => ios_versions.map { |ios_version| "#{name}:#{ios_version}" }
|
206
|
+
else
|
207
|
+
desc "Run #{name} tests"
|
208
|
+
task self.name => :prepare do
|
209
|
+
run_tests
|
210
|
+
end
|
211
|
+
end
|
52
212
|
end
|
53
213
|
|
54
|
-
|
55
|
-
|
214
|
+
private
|
215
|
+
|
216
|
+
def namespaced?
|
217
|
+
ios_versions && ios_versions.any?
|
218
|
+
end
|
219
|
+
|
220
|
+
def run_tests(options = {})
|
221
|
+
ios_version = options[:ios_version]
|
222
|
+
XCTasks::Command.run(%q{killall "iPhone Simulator"}, false) if sdk == :iphonesimulator
|
223
|
+
|
224
|
+
success = if xctool?
|
225
|
+
actions_arg << " -freshSimulator" if ios_version
|
226
|
+
Command.run("#{xctool_path} -workspace #{workspace} -scheme '#{scheme}' -sdk #{sdk}#{ios_version}#{destination_arg}#{actions_arg}#{settings_arg}".strip)
|
227
|
+
elsif xcodebuild?
|
228
|
+
Command.run("#{xcodebuild_path} -workspace #{workspace} -scheme '#{scheme}' -sdk #{sdk}#{ios_version}#{destination_arg}#{actions_arg}#{settings_arg}".strip)
|
229
|
+
elsif xcpretty?
|
230
|
+
Command.run("#{xcodebuild_path} -workspace #{workspace} -scheme '#{scheme}' -sdk #{sdk}#{ios_version}#{destination_arg}#{actions_arg}#{settings_arg} | xcpretty -c ; exit ${PIPESTATUS[0]}".strip)
|
231
|
+
end
|
232
|
+
|
233
|
+
XCTasks::TestReport.instance.add_result(self, options, success)
|
234
|
+
end
|
235
|
+
|
236
|
+
def settings_arg
|
237
|
+
if settings.any?
|
238
|
+
" " << settings.map { |k,v| "#{k}=#{v}"}.join(' ')
|
239
|
+
else
|
240
|
+
nil
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
def actions_arg
|
245
|
+
" " << actions.join(' ')
|
246
|
+
end
|
247
|
+
|
248
|
+
def destination_arg
|
249
|
+
if destinations.any?
|
250
|
+
" " << destinations.map { |d| "-destination #{d}" }.join(' ')
|
251
|
+
else
|
252
|
+
nil
|
253
|
+
end
|
56
254
|
end
|
57
255
|
end
|
58
256
|
|
59
257
|
include ::Rake::DSL if defined?(::Rake::DSL)
|
60
258
|
|
61
|
-
attr_reader :namespace_name, :prepare_dependency
|
62
|
-
|
63
|
-
attr_accessor :runner, :xctool_path, :xcodebuild_path
|
64
|
-
attr_accessor :ios_versions, :destination, :settings, :actions
|
259
|
+
attr_reader :namespace_name, :prepare_dependency, :config, :subtasks
|
260
|
+
extend Configuration::Delegations
|
65
261
|
|
66
262
|
def initialize(namespace_name = :test)
|
67
|
-
@namespace_name = namespace_name
|
68
|
-
@
|
69
|
-
@
|
70
|
-
@
|
71
|
-
@
|
72
|
-
@xcodebuild_path = '/usr/bin/xcodebuild'
|
73
|
-
@runner = :xcodebuild
|
74
|
-
@destination = "platform='iOS Simulator',name='iPhone Retina (4-inch)'"
|
75
|
-
@settings = {}
|
76
|
-
@platform = 'iOS Simulator'
|
77
|
-
@destination = Destination.new
|
78
|
-
@actions = %w{clean build test}
|
263
|
+
@namespace_name = namespace_name
|
264
|
+
@config = Configuration.new
|
265
|
+
@subtasks = []
|
266
|
+
@namespace_name = namespace_name.kind_of?(Hash) ? namespace_name.keys.first : namespace_name
|
267
|
+
@prepare_dependency = namespace_name.kind_of?(Hash) ? namespace_name.values.first : nil
|
79
268
|
|
80
269
|
yield self if block_given?
|
81
|
-
raise "A workspace must be configured" unless workspace
|
82
|
-
raise "At least one
|
83
|
-
|
270
|
+
raise ConfigurationError, "A workspace must be configured" unless workspace
|
271
|
+
raise ConfigurationError, "At least one subtask must be configured" if subtasks.empty?
|
272
|
+
define_rake_tasks
|
84
273
|
end
|
85
274
|
|
86
|
-
def
|
87
|
-
|
88
|
-
|
275
|
+
def subtasks=(subtasks)
|
276
|
+
if subtasks.kind_of?(Hash)
|
277
|
+
subtasks.each { |name, scheme| subtask(name => scheme) }
|
278
|
+
else
|
279
|
+
raise ArgumentError, "Cannot assign subtasks from a #{subtasks.class}"
|
280
|
+
end
|
89
281
|
end
|
90
282
|
|
91
|
-
def
|
92
|
-
|
93
|
-
|
283
|
+
def subtask(name_options)
|
284
|
+
subtask = Subtask.new(name_options, config)
|
285
|
+
yield subtask if block_given?
|
286
|
+
@subtasks << subtask
|
94
287
|
end
|
95
288
|
|
96
|
-
def
|
289
|
+
def define_rake_tasks
|
97
290
|
namespace self.namespace_name do
|
98
291
|
task (prepare_dependency ? { prepare: prepare_dependency} : :prepare ) do
|
99
292
|
if schemes_dir
|
@@ -102,63 +295,14 @@ module XCTasks
|
|
102
295
|
end
|
103
296
|
end
|
104
297
|
|
105
|
-
|
106
|
-
schemes.each do |scheme_namespace, scheme_name|
|
107
|
-
namespace scheme_namespace do
|
108
|
-
ios_versions.each do |ios_version|
|
109
|
-
desc "Run #{scheme_namespace} tests against iOS Simulator #{ios_version} SDK"
|
110
|
-
task ios_version => :prepare do
|
111
|
-
test_scheme(scheme_name, namespace: scheme_namespace, ios_version: ios_version)
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
desc "Run #{scheme_namespace} tests against iOS Simulator #{ios_versions.join(', ')}"
|
117
|
-
task scheme_namespace => ios_versions.map { |ios_version| "#{scheme_namespace}:#{ios_version}" }
|
118
|
-
end
|
298
|
+
subtasks.each { |subtask| subtask.define_rake_tasks }
|
119
299
|
end
|
120
300
|
|
121
|
-
|
122
|
-
|
301
|
+
subtask_names = subtasks.map { |subtask| subtask.name }
|
302
|
+
desc "Run all tests (#{subtask_names.join(', ')})"
|
303
|
+
task namespace_name => subtask_names.map { |subtask_name| "#{namespace_name}:#{subtask_name}" } do
|
123
304
|
XCTasks::TestReport.instance.report
|
124
305
|
end
|
125
306
|
end
|
126
|
-
|
127
|
-
private
|
128
|
-
def run(command)
|
129
|
-
puts "Executing `#{command}`"
|
130
|
-
system(command)
|
131
|
-
end
|
132
|
-
|
133
|
-
def test_scheme(scheme, options)
|
134
|
-
system(%q{killall "iPhone Simulator"})
|
135
|
-
namespace = options[:namespace]
|
136
|
-
ios_version = options[:ios_version]
|
137
|
-
test_sdk = "#{ios_version}"
|
138
|
-
|
139
|
-
settings_arg = settings.map { |k,v| "#{k}=#{v}"}.join(' ')
|
140
|
-
destination_arg = destination.to_arg(ios_version)
|
141
|
-
actions_arg = actions.join(' ')
|
142
|
-
success = if xctool?
|
143
|
-
run("#{xctool_path} -workspace #{workspace} -scheme '#{scheme}' -sdk iphonesimulator #{actions_arg} -freshSimulator -destination #{destination_arg} #{settings_arg}")
|
144
|
-
elsif xcodebuild?
|
145
|
-
run("#{xcodebuild_path} -workspace #{workspace} -scheme '#{scheme}' -sdk iphonesimulator #{actions_arg} -destination #{destination_arg} #{settings_arg}")
|
146
|
-
elsif xcpretty?
|
147
|
-
run("#{xcodebuild_path} -workspace #{workspace} -scheme '#{scheme}' -sdk iphonesimulator #{actions_arg} -destination #{destination_arg} #{settings_arg} | xcpretty -c ; exit ${PIPESTATUS[0]}")
|
148
|
-
end
|
149
|
-
XCTasks::TestReport.instance.add_result(namespace, ios_version, success)
|
150
|
-
end
|
151
|
-
|
152
|
-
def xctool?
|
153
|
-
runner == :xctool
|
154
|
-
end
|
155
|
-
|
156
|
-
def xcodebuild?
|
157
|
-
runner == :xcodebuild
|
158
|
-
end
|
159
|
-
|
160
|
-
def xcpretty?
|
161
|
-
runner == :xcpretty
|
162
|
-
end
|
163
307
|
end
|
164
308
|
end
|
data/lib/xctasks/version.rb
CHANGED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,291 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'xctasks/test_task'
|
3
|
+
|
4
|
+
describe XCTasks::TestTask do
|
5
|
+
before(:each) do
|
6
|
+
@commands = []
|
7
|
+
XCTasks::Command.stub(:run) do |command|
|
8
|
+
@commands << command
|
9
|
+
end
|
10
|
+
FileUtils::Verbose.stub(:mkdir_p) do |path|
|
11
|
+
@commands << "mkdir -p #{path}"
|
12
|
+
end
|
13
|
+
FileUtils::Verbose.stub(:cp) do |src, dst|
|
14
|
+
@commands << "cp #{src} #{dst}"
|
15
|
+
end
|
16
|
+
|
17
|
+
Rake.application = rake
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:rake) { Rake::Application.new }
|
21
|
+
|
22
|
+
describe 'simple task' do
|
23
|
+
let!(:task) do
|
24
|
+
XCTasks::TestTask.new do |t|
|
25
|
+
t.workspace = 'LayerKit.xcworkspace'
|
26
|
+
t.schemes_dir = 'Tests/Schemes'
|
27
|
+
t.runner = :xcpretty
|
28
|
+
t.subtasks = { unit: 'Unit Tests', functional: 'Functional Tests' }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it "configures the workspace" do
|
33
|
+
task.workspace.should == 'LayerKit.xcworkspace'
|
34
|
+
end
|
35
|
+
|
36
|
+
it "configures the schemes dir" do
|
37
|
+
task.schemes_dir.should == 'Tests/Schemes'
|
38
|
+
end
|
39
|
+
|
40
|
+
it "configures the runner" do
|
41
|
+
task.runner.should == :xcpretty
|
42
|
+
end
|
43
|
+
|
44
|
+
it "configures the tasks" do
|
45
|
+
expect(task.subtasks.count).to eq(2)
|
46
|
+
task.subtasks.map { |t| t.name }.should == ["unit", "functional"]
|
47
|
+
end
|
48
|
+
|
49
|
+
it "configures xcpretty for all tasks" do
|
50
|
+
task.subtasks.map { |t| t.runner }.should == [:xcpretty, :xcpretty]
|
51
|
+
end
|
52
|
+
|
53
|
+
describe 'tasks' do
|
54
|
+
describe 'spec:unit' do
|
55
|
+
subject { Rake.application['test:unit'] }
|
56
|
+
|
57
|
+
it "executes the appropriate commands" do
|
58
|
+
subject.invoke
|
59
|
+
@commands.should == ["mkdir -p LayerKit.xcworkspace/xcshareddata/xcschemes",
|
60
|
+
"cp [] LayerKit.xcworkspace/xcshareddata/xcschemes",
|
61
|
+
"killall \"iPhone Simulator\"",
|
62
|
+
"/usr/bin/xcodebuild -workspace LayerKit.xcworkspace -scheme 'Unit Tests' -sdk iphonesimulator clean build test | xcpretty -c ; exit ${PIPESTATUS[0]}"]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe 'spec:functional' do
|
67
|
+
subject { Rake.application['test:functional'] }
|
68
|
+
|
69
|
+
it "executes the appropriate commands" do
|
70
|
+
subject.invoke
|
71
|
+
@commands.should == ["mkdir -p LayerKit.xcworkspace/xcshareddata/xcschemes",
|
72
|
+
"cp [] LayerKit.xcworkspace/xcshareddata/xcschemes",
|
73
|
+
"killall \"iPhone Simulator\"",
|
74
|
+
"/usr/bin/xcodebuild -workspace LayerKit.xcworkspace -scheme 'Functional Tests' -sdk iphonesimulator clean build test | xcpretty -c ; exit ${PIPESTATUS[0]}"]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe 'advanced task' do
|
81
|
+
let!(:task) do
|
82
|
+
XCTasks::TestTask.new do |t|
|
83
|
+
t.workspace = 'LayerKit.xcworkspace'
|
84
|
+
t.runner = :xctool
|
85
|
+
|
86
|
+
t.subtask(unit: 'Unit Tests') do |s|
|
87
|
+
s.ios_versions = %w{7.0 7.1}
|
88
|
+
end
|
89
|
+
|
90
|
+
t.subtask :functional do |s|
|
91
|
+
s.runner = :xcodebuild
|
92
|
+
s.scheme = 'Functional Tests'
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context "when the task overrides base options" do
|
98
|
+
it "uses the original runner by default" do
|
99
|
+
subtask = task.subtasks.detect { |t| t.name == 'unit' }
|
100
|
+
subtask.runner.should == :xctool
|
101
|
+
end
|
102
|
+
|
103
|
+
it "respects the override" do
|
104
|
+
subtask = task.subtasks.detect { |t| t.name == 'functional' }
|
105
|
+
subtask.runner.should == :xcodebuild
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe 'tasks' do
|
110
|
+
describe 'test:unit' do
|
111
|
+
subject { Rake.application['test:unit'] }
|
112
|
+
|
113
|
+
it "executes the appropriate commands" do
|
114
|
+
subject.invoke
|
115
|
+
@commands.should == [
|
116
|
+
"killall \"iPhone Simulator\"",
|
117
|
+
"/usr/local/bin/xctool -workspace LayerKit.xcworkspace -scheme 'Unit Tests' -sdk iphonesimulator7.0 clean build test",
|
118
|
+
"killall \"iPhone Simulator\"",
|
119
|
+
"/usr/local/bin/xctool -workspace LayerKit.xcworkspace -scheme 'Unit Tests' -sdk iphonesimulator7.1 clean build test"
|
120
|
+
]
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
describe 'test:functional' do
|
125
|
+
subject { Rake.application['test:functional'] }
|
126
|
+
|
127
|
+
it "executes the appropriate commands" do
|
128
|
+
subject.invoke
|
129
|
+
@commands.should == [
|
130
|
+
"killall \"iPhone Simulator\"",
|
131
|
+
"/usr/bin/xcodebuild -workspace LayerKit.xcworkspace -scheme 'Functional Tests' -sdk iphonesimulator clean build test"
|
132
|
+
]
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
describe 'Destination Configuration' do
|
139
|
+
let!(:task) do
|
140
|
+
XCTasks::TestTask.new(:spec) do |t|
|
141
|
+
t.workspace = 'LayerKit.xcworkspace'
|
142
|
+
t.runner = :xctool
|
143
|
+
|
144
|
+
t.subtask(unit: 'Unit Tests') do |s|
|
145
|
+
s.ios_versions = %w{7.0 7.1}
|
146
|
+
end
|
147
|
+
|
148
|
+
t.subtask :functional do |s|
|
149
|
+
s.runner = :xcodebuild
|
150
|
+
s.scheme = 'Functional Tests'
|
151
|
+
s.destination do |d|
|
152
|
+
d.platform = :iossimulator
|
153
|
+
d.name = 'iPad'
|
154
|
+
d.os = :latest
|
155
|
+
end
|
156
|
+
s.destination('platform=iOS Simulator,OS=7.1,name=iPhone Retina (4-inch)')
|
157
|
+
s.destination platform: :ios, id: '437750527b43cff55a46f42ae86dbf870c7591b1'
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
describe 'spec:unit' do
|
163
|
+
subject { Rake.application['spec:unit'] }
|
164
|
+
|
165
|
+
it "executes the appropriate commands" do
|
166
|
+
subject.invoke
|
167
|
+
@commands.should == [
|
168
|
+
"killall \"iPhone Simulator\"",
|
169
|
+
"/usr/local/bin/xctool -workspace LayerKit.xcworkspace -scheme 'Unit Tests' -sdk iphonesimulator7.0 clean build test",
|
170
|
+
"killall \"iPhone Simulator\"",
|
171
|
+
"/usr/local/bin/xctool -workspace LayerKit.xcworkspace -scheme 'Unit Tests' -sdk iphonesimulator7.1 clean build test"
|
172
|
+
]
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
describe 'spec:functional' do
|
177
|
+
subject { Rake.application['spec:functional'] }
|
178
|
+
|
179
|
+
it "executes the appropriate commands" do
|
180
|
+
subject.invoke
|
181
|
+
@commands.should == [
|
182
|
+
"killall \"iPhone Simulator\"",
|
183
|
+
"/usr/bin/xcodebuild -workspace LayerKit.xcworkspace -scheme 'Functional Tests' -sdk iphonesimulator -destination platform='iOS\\ Simulator',name='iPad',OS='latest' -destination platform\\=iOS\\ Simulator,OS\\=7.1,name\\=iPhone\\ Retina\\ \\(4-inch\\) -destination platform='iOS',id='437750527b43cff55a46f42ae86dbf870c7591b1' clean build test"]
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
describe 'SDK Configuration' do
|
189
|
+
let!(:task) do
|
190
|
+
XCTasks::TestTask.new(:spec) do |t|
|
191
|
+
t.workspace = 'LayerKit.xcworkspace'
|
192
|
+
t.runner = :xctool
|
193
|
+
|
194
|
+
t.subtask(unit: 'Unit Tests') do |s|
|
195
|
+
s.sdk = :macosx
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
subject { Rake.application['spec:unit'] }
|
201
|
+
|
202
|
+
it "executes the appropriate commands" do
|
203
|
+
subject.invoke
|
204
|
+
@commands.should == ["/usr/local/bin/xctool -workspace LayerKit.xcworkspace -scheme 'Unit Tests' -sdk macosx clean build test"]
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
describe 'validations' do
|
209
|
+
it "raises an exception when an invalid value is assigned to the sdk" do
|
210
|
+
expect do
|
211
|
+
XCTasks::TestTask.new do |t|
|
212
|
+
t.sdk = []
|
213
|
+
end
|
214
|
+
end.to raise_error(ArgumentError, "Can only assign sdk from a String or Symbol")
|
215
|
+
end
|
216
|
+
|
217
|
+
context "when an invalid runner is specified" do
|
218
|
+
it "raises an exception" do
|
219
|
+
expect do
|
220
|
+
XCTasks::TestTask.new do |t|
|
221
|
+
t.runner = 'phantomjs'
|
222
|
+
end
|
223
|
+
end.to raise_error(XCTasks::TestTask::ConfigurationError, "Must be :xcodebuild, :xctool or :xcpretty")
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
context "when a workspace is not configured" do
|
228
|
+
it "raises an exception" do
|
229
|
+
expect do
|
230
|
+
XCTasks::TestTask.new do |t|
|
231
|
+
t.workspace = nil
|
232
|
+
end
|
233
|
+
end.to raise_error(XCTasks::TestTask::ConfigurationError, "A workspace must be configured")
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
context "when an SDK of macosx and ios versions is specified" do
|
238
|
+
it "raises an exception" do
|
239
|
+
expect do
|
240
|
+
XCTasks::TestTask.new do |t|
|
241
|
+
t.workspace = 'Workspace.workspace'
|
242
|
+
t.sdk = :macosx
|
243
|
+
t.ios_versions = %w{7.0}
|
244
|
+
t.subtasks = {unit: 'MyWorkspaceTests'}
|
245
|
+
end
|
246
|
+
end.to raise_error(XCTasks::TestTask::ConfigurationError, "Cannot specify iOS versions with an SDK of :macosx")
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
describe XCTasks::TestTask::Destination do
|
252
|
+
let(:destination) { XCTasks::TestTask::Destination.new }
|
253
|
+
|
254
|
+
describe '#platform=' do
|
255
|
+
it "allows assignment of :osx" do
|
256
|
+
destination.platform = :osx
|
257
|
+
expect(destination.platform).to eq('OS X')
|
258
|
+
end
|
259
|
+
|
260
|
+
it "allows assignment of 'OS X'" do
|
261
|
+
destination.platform = 'OS X'
|
262
|
+
expect(destination.platform).to eq('OS X')
|
263
|
+
end
|
264
|
+
|
265
|
+
it "allows assignment of :ios" do
|
266
|
+
destination.platform = :ios
|
267
|
+
expect(destination.platform).to eq('iOS')
|
268
|
+
end
|
269
|
+
|
270
|
+
it "allows assignment of 'iOS'" do
|
271
|
+
destination.platform = 'iOS'
|
272
|
+
expect(destination.platform).to eq('iOS')
|
273
|
+
end
|
274
|
+
|
275
|
+
it "allows assignment of :iossimulator" do
|
276
|
+
destination.platform = :iossimulator
|
277
|
+
expect(destination.platform).to eq('iOS Simulator')
|
278
|
+
end
|
279
|
+
|
280
|
+
it "allows assignment of 'iOS Simulator'" do
|
281
|
+
destination.platform = 'iOS Simulator'
|
282
|
+
expect(destination.platform).to eq('iOS Simulator')
|
283
|
+
end
|
284
|
+
|
285
|
+
it "disallows other values" do
|
286
|
+
expect { destination.platform = 'sdadsa' }.to raise_error(ArgumentError)
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
end
|
291
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xctasks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Blake Watters
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -139,6 +139,8 @@ files:
|
|
139
139
|
- lib/xctasks.rb
|
140
140
|
- lib/xctasks/test_task.rb
|
141
141
|
- lib/xctasks/version.rb
|
142
|
+
- spec/spec_helper.rb
|
143
|
+
- spec/test_task_spec.rb
|
142
144
|
- xctasks.gemspec
|
143
145
|
homepage: http://github.com/layerhq/xctasks
|
144
146
|
licenses:
|
@@ -164,4 +166,6 @@ rubygems_version: 2.2.2
|
|
164
166
|
signing_key:
|
165
167
|
specification_version: 4
|
166
168
|
summary: Provides a rich library of automation tasks for Xcode
|
167
|
-
test_files:
|
169
|
+
test_files:
|
170
|
+
- spec/spec_helper.rb
|
171
|
+
- spec/test_task_spec.rb
|