simctl 1.5.7 → 1.5.8

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a2137ff6238a7df48b7b8fb23cf0716cbb968441
4
- data.tar.gz: ebdb0f71d80d78c42a3b4a778ca2f8ac52c0a46d
3
+ metadata.gz: 23e929d60bc574b9e16e479b4754d40fa393cda0
4
+ data.tar.gz: 06d72f6aca738f535b9517bdaacb3606ab17548b
5
5
  SHA512:
6
- metadata.gz: 6a0886c021874f170dffc8f2c9c22089b1bf051f21ed73d796331d83b62dc9c5e4b6d47747fb322f0a878df94374f2f8f7cfa64480b5b051930e1d01a0bce351
7
- data.tar.gz: 4711d5bdf29ddbb719c67f35a8783b378e8241f961923d9ac76bb4915290a3b69930c4a3bfc080ad099a4ab3449c87c8cb70c7afddea3e62362503b11997d429
6
+ metadata.gz: 37521cf964d7b1cc61c591beb0a77d2b0f0a54973d5a89ab10694aa9b7cb45329704d89064451ce22e36871bfb4296ca33c92b6894cb588c6cbf67fad43048d5
7
+ data.tar.gz: 83480c3189051338b6d75fd8601847111a4bf61b1e9d94d9421ab27e6e47d44aece6ea47ff8713a3c81a7ab8ef4a81d807bcc1f78a068c576c77a5a9bdbf24c3
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ # 1.5.8
2
+
3
+ * Support taking screenshots
4
+ * Breaking change: Remove `device.disable_keyboard_helpers!`
5
+ Use `device.settings.disable_keyboard_helpers!` instead
6
+
1
7
  # 1.5.7
2
8
 
3
9
  * Fix SimCtl::Runtime.latest
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- simctl (1.5.7)
4
+ simctl (1.5.8)
5
5
  CFPropertyList
6
6
  naturally
7
7
 
@@ -16,16 +16,14 @@ GEM
16
16
  term-ansicolor (~> 1.3)
17
17
  thor (~> 0.19.1)
18
18
  tins (~> 1.6.0)
19
+ diff-lcs (1.2.5)
19
20
  docile (1.1.5)
20
21
  domain_name (0.5.25)
21
22
  unf (>= 0.0.5, < 1.0.0)
22
23
  http-cookie (1.0.2)
23
24
  domain_name (~> 0.5)
24
25
  json (1.8.3)
25
- maxitest (1.5.4)
26
- minitest (>= 5.0.0, < 5.9.0)
27
26
  mime-types (2.99)
28
- minitest (5.8.5)
29
27
  naturally (2.1.0)
30
28
  netrc (0.11.0)
31
29
  rake (10.4.2)
@@ -33,7 +31,19 @@ GEM
33
31
  http-cookie (>= 1.0.2, < 2.0)
34
32
  mime-types (>= 1.16, < 3.0)
35
33
  netrc (~> 0.7)
36
- shoulda-context (1.2.1)
34
+ rspec (3.5.0)
35
+ rspec-core (~> 3.5.0)
36
+ rspec-expectations (~> 3.5.0)
37
+ rspec-mocks (~> 3.5.0)
38
+ rspec-core (3.5.4)
39
+ rspec-support (~> 3.5.0)
40
+ rspec-expectations (3.5.0)
41
+ diff-lcs (>= 1.2.0, < 2.0)
42
+ rspec-support (~> 3.5.0)
43
+ rspec-mocks (3.5.0)
44
+ diff-lcs (>= 1.2.0, < 2.0)
45
+ rspec-support (~> 3.5.0)
46
+ rspec-support (3.5.0)
37
47
  simplecov (0.11.1)
38
48
  docile (~> 1.1.0)
39
49
  json (~> 1.8)
@@ -52,9 +62,8 @@ PLATFORMS
52
62
 
53
63
  DEPENDENCIES
54
64
  coveralls
55
- maxitest
56
65
  rake
57
- shoulda-context
66
+ rspec
58
67
  simctl!
59
68
 
60
69
  BUNDLED WITH
data/README.md CHANGED
@@ -2,21 +2,21 @@
2
2
 
3
3
  [![Build Status](https://travis-ci.org/plu/simctl.svg?branch=master)](https://travis-ci.org/plu/simctl) [![Gem Version](https://badge.fury.io/rb/simctl.svg)](https://badge.fury.io/rb/simctl) [![Coverage Status](https://coveralls.io/repos/plu/simctl/badge.svg?branch=master&service=github)](https://coveralls.io/github/plu/simctl?branch=master)
4
4
 
5
- Ruby interface to xcrun simctl. Manage your iOS Simulators directly from a ruby script. This can be helpful for testing on different Simulators, see example project here: [plu/parallel_ios_tests](https://github.com/plu/parallel_ios_tests)
5
+ Ruby interface to xcrun simctl. Manage your iOS Simulators directly from a ruby script.
6
6
 
7
7
  ## Usage
8
8
 
9
9
  ```ruby
10
10
  require 'simctl'
11
11
 
12
- # Select the iOS 9.2 runtime
13
- runtime = SimCtl.runtime(name: 'iOS 9.2')
12
+ # Select the iOS 9.3 runtime
13
+ runtime = SimCtl.runtime(name: 'iOS 9.3')
14
14
 
15
15
  # Select the iPhone 5 device type
16
16
  devicetype = SimCtl.devicetype(name: 'iPhone 5')
17
17
 
18
18
  # Create a new device
19
- device = SimCtl.create_device 'Unit Tests @ iPhone 5 9.2', devicetype, runtime
19
+ device = SimCtl.create_device 'Unit Tests @ iPhone 5 9.3', devicetype, runtime
20
20
 
21
21
  # Launch a new Simulator.app instance
22
22
  device.launch!
data/Rakefile CHANGED
@@ -1,13 +1,8 @@
1
1
  #!/usr/bin/env rake
2
2
  require 'bundler/gem_tasks'
3
- require 'rake/testtask'
3
+ require 'rspec/core/rake_task'
4
4
 
5
- desc 'Execute simctl tests'
6
- Rake::TestTask.new(:test) do |t|
7
- t.libs << 'lib' << 'test'
8
- t.pattern = 'test/**/*_test.rb'
9
- t.verbose = true
10
- end
5
+ RSpec::Core::RakeTask.new(:rspec)
11
6
 
12
7
  desc 'Default: Execute simctl tests'
13
- task default: :test
8
+ task default: :rspec
data/lib/simctl.rb CHANGED
@@ -3,8 +3,13 @@ require 'simctl/device'
3
3
  require 'simctl/device_type'
4
4
  require 'simctl/list'
5
5
  require 'simctl/runtime'
6
+ require 'simctl/xcode_version'
6
7
 
7
8
  module SimCtl
9
+ class UnsupportedCommandError < StandardError; end
10
+ class DeviceTypeNotFound < StandardError; end
11
+ class RuntimeNotFound < StandardError; end
12
+
8
13
  @@default_timeout = 15
9
14
 
10
15
  class << self
@@ -3,14 +3,15 @@ require 'simctl/command/create'
3
3
  require 'simctl/command/delete'
4
4
  require 'simctl/command/erase'
5
5
  require 'simctl/command/install'
6
- require 'simctl/command/uninstall'
6
+ require 'simctl/command/io'
7
7
  require 'simctl/command/kill'
8
8
  require 'simctl/command/launch'
9
9
  require 'simctl/command/list'
10
+ require 'simctl/command/openurl'
10
11
  require 'simctl/command/rename'
11
12
  require 'simctl/command/reset'
12
13
  require 'simctl/command/shutdown'
13
- require 'simctl/command/openurl'
14
+ require 'simctl/command/uninstall'
14
15
  require 'simctl/executor'
15
16
  require 'shellwords'
16
17
 
@@ -22,15 +23,16 @@ module SimCtl
22
23
  include SimCtl::Command::Create
23
24
  include SimCtl::Command::Delete
24
25
  include SimCtl::Command::Erase
26
+ include SimCtl::Command::IO
25
27
  include SimCtl::Command::Install
26
- include SimCtl::Command::Uninstall
27
28
  include SimCtl::Command::Kill
28
29
  include SimCtl::Command::Launch
29
30
  include SimCtl::Command::List
31
+ include SimCtl::Command::OpenUrl
30
32
  include SimCtl::Command::Rename
31
33
  include SimCtl::Command::Reset
32
34
  include SimCtl::Command::Shutdown
33
- include SimCtl::Command::OpenUrl
35
+ include SimCtl::Command::Uninstall
34
36
 
35
37
  def device_set_path=(device_set_path)
36
38
  @device_set_path = File.expand_path(device_set_path)
@@ -3,8 +3,6 @@ require 'shellwords'
3
3
  module SimCtl
4
4
  class Command
5
5
  module Install
6
- COMMAND = %w[xcrun simctl install]
7
-
8
6
  # Installs an app on a device
9
7
  #
10
8
  # @param device [SimCtl::Device] the device the app should be installed on
@@ -0,0 +1,23 @@
1
+ require 'shellwords'
2
+
3
+ module SimCtl
4
+ class Command
5
+ module IO
6
+ # Saves a screenshot to a file
7
+ #
8
+ # @param device [SimCtl::Device] the device the screenshot should be taken from
9
+ # @param file Path where the screenshot should be saved to
10
+ # @param opts Optional hash that supports two keys:
11
+ # * type: Can be png, tiff, bmp, gif, jpeg (default is png)
12
+ # * display: Can be main or tv for iOS, tv for tvOS and main for watchOS
13
+ # @return [void]
14
+ def screenshot(device, file, opts={})
15
+ unless XcodeVersion.gte? '8.2'
16
+ raise UnsupportedCommandError.new('Needs at least Xcode 8.2')
17
+ end
18
+ optional_args = opts.map {|k,v| "--#{k}=#{Shellwords.shellescape(v)}"}
19
+ Executor.execute(command_for('io', device.udid, 'screenshot', *optional_args, Shellwords.shellescape(file)))
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,6 +1,4 @@
1
1
  module SimCtl
2
- class DeviceTypeNotFound < StandardError; end
3
- class RuntimeNotFound < StandardError; end
4
2
  class Command
5
3
  module List
6
4
  # Find a device
data/lib/simctl/device.rb CHANGED
@@ -30,14 +30,6 @@ module SimCtl
30
30
  @devicetype ||= SimCtl.devicetype(identifier: plist.deviceType)
31
31
  end
32
32
 
33
- # <b>DEPRECATED:</b> Please use <tt>device.settings.disable_keyboard_helpers!</tt> instead.
34
- # Disables the keyboard helpers
35
- #
36
- # @return [void]
37
- def disable_keyboard_helpers!
38
- settings.disable_keyboard_helpers!
39
- end
40
-
41
33
  # Erases the device
42
34
  #
43
35
  # @return [void]
@@ -112,6 +104,7 @@ module SimCtl
112
104
  # @return [void]
113
105
  def rename!(name)
114
106
  SimCtl.rename_device(self, name)
107
+ @name = name
115
108
  end
116
109
 
117
110
  # Resets the device
@@ -128,6 +121,17 @@ module SimCtl
128
121
  @runtime ||= SimCtl.runtime(identifier: plist.runtime)
129
122
  end
130
123
 
124
+ # Saves a screenshot to a file
125
+ #
126
+ # @param file Path where the screenshot should be saved to
127
+ # @param opts Optional hash that supports two keys:
128
+ # * type: Can be png, tiff, bmp, gif, jpeg (default is png)
129
+ # * display: Can be main or tv for iOS, tv for tvOS and main for watchOS
130
+ # @return [void]
131
+ def screenshot!(file, opts={})
132
+ SimCtl.screenshot(self, file, opts)
133
+ end
134
+
131
135
  # Returns the settings object
132
136
  #
133
137
  # @ return [SimCtl::DeviceSettings]
@@ -11,7 +11,7 @@ module SimCtl
11
11
  output = stdout.read
12
12
  if result.value.to_i > 0
13
13
  output = stderr.read if output.empty?
14
- raise StandardError.new(output)
14
+ raise RuntimeError.new(output)
15
15
  end
16
16
  return unless block_given?
17
17
  if looks_like_json?(output)
@@ -1,3 +1,3 @@
1
1
  module SimCtl
2
- VERSION = '1.5.7'
2
+ VERSION = '1.5.8'
3
3
  end
@@ -0,0 +1,11 @@
1
+ module SimCtl
2
+ module XcodeVersion
3
+ VERSION = Gem::Version.new(`xcodebuild -version`.scan(/Xcode (\S+)/).flatten.first)
4
+
5
+ class << self
6
+ def gte?(version)
7
+ return VERSION >= Gem::Version.new(version)
8
+ end
9
+ end
10
+ end
11
+ end
data/simctl.gemspec CHANGED
@@ -18,10 +18,9 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
19
19
  s.require_paths = ['lib']
20
20
 
21
- s.add_development_dependency 'rake'
22
- s.add_development_dependency 'maxitest'
23
- s.add_development_dependency 'shoulda-context'
24
21
  s.add_development_dependency 'coveralls'
22
+ s.add_development_dependency 'rake'
23
+ s.add_development_dependency 'rspec'
25
24
 
26
25
  s.add_dependency 'CFPropertyList'
27
26
  s.add_dependency 'naturally'
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,242 @@
1
+ require 'securerandom'
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe SimCtl, order: :defined do
5
+ before(:all) do
6
+ @name = SecureRandom.hex
7
+ @devicetype = SimCtl.devicetype(name: 'iPhone 5')
8
+ @runtime = SimCtl::Runtime.latest(:ios)
9
+ @device = SimCtl.create_device @name, @devicetype, @runtime
10
+ @device.wait! {|d| d.state == :shutdown}
11
+ end
12
+
13
+ after(:all) do
14
+ with_rescue { @device.kill! }
15
+ with_rescue { @device.wait! {|d| d.state == :shutdown} }
16
+ with_rescue { @device.delete! }
17
+ end
18
+
19
+ describe 'creating a device' do
20
+ it 'raises exception if devicetype lookup failed' do
21
+ expect { SimCtl.create_device @name, 'invalid devicetype', @runtime }.to raise_error SimCtl::DeviceTypeNotFound
22
+ end
23
+
24
+ it 'raises exception if runtime lookup failed' do
25
+ expect { SimCtl.create_device @name, @devicetype, 'invalid runtime' }.to raise_error SimCtl::RuntimeNotFound
26
+ end
27
+ end
28
+
29
+ describe 'device properties' do
30
+ it 'is a device' do
31
+ expect(@device).to be_kind_of SimCtl::Device
32
+ end
33
+
34
+ it 'has a name property' do
35
+ expect(@device.name).to be == @name
36
+ end
37
+
38
+ it 'has a devicetype property' do
39
+ expect(@device.devicetype).to be == @devicetype
40
+ end
41
+
42
+ it 'has a runtime property' do
43
+ expect(@device.runtime).to be == @runtime
44
+ end
45
+
46
+ it 'has a availability property' do
47
+ expect(@device.availability).not_to be_nil
48
+ end
49
+
50
+ it 'has a os property' do
51
+ expect(@device.os).not_to be_nil
52
+ end
53
+
54
+ it 'state is shutdown' do
55
+ expect(@device.state).to be == :shutdown
56
+ end
57
+ end
58
+
59
+ describe 'device settings' do
60
+ describe 'update hardware keyboard' do
61
+ it 'creates the preferences plist' do
62
+ File.delete(@device.path.preferences_plist) if File.exists?(@device.path.preferences_plist)
63
+ @device.settings.update_hardware_keyboard!(false)
64
+ expect(File).to exist(@device.path.preferences_plist)
65
+ end
66
+ end
67
+
68
+ describe 'disable keyboard helpers' do
69
+ it 'creates the preferences plist' do
70
+ File.delete(@device.path.preferences_plist) if File.exists?(@device.path.preferences_plist)
71
+ @device.settings.disable_keyboard_helpers!
72
+ expect(File).to exist(@device.path.preferences_plist)
73
+ end
74
+ end
75
+
76
+ describe 'setting the device language' do
77
+ it 'sets the device language' do
78
+ @device.settings.set_language('de')
79
+ end
80
+ end
81
+ end
82
+
83
+ describe 'finding the device' do
84
+ it 'finds the device by udid' do
85
+ expect(SimCtl.device(udid: @device.udid)).to be == @device
86
+ end
87
+
88
+ it 'finds the device by name' do
89
+ expect(SimCtl.device(name: @device.name)).to be == @device
90
+ end
91
+
92
+ unless SimCtl.device_set_path.nil?
93
+ it 'finds the device by runtime' do
94
+ expect(SimCtl.device(runtime: @device.runtime)).to be == @device
95
+ end
96
+
97
+ it 'finds the device by devicetype' do
98
+ expect(SimCtl.device(devicetype: @device.devicetype)).to be == @device
99
+ end
100
+
101
+ it 'finds the device by all given properties' do
102
+ expect(SimCtl.device(udid: @device.udid, name: @device.name, runtime: @device.runtime, devicetype: @device.devicetype)).to be == @device
103
+ end
104
+ end
105
+ end
106
+
107
+ describe 'renaming the device' do
108
+ it 'renames the device' do
109
+ @device.rename!('new name')
110
+ expect(@device.name).to be == 'new name'
111
+ expect(SimCtl.device(udid: @device.udid).name).to be == 'new name'
112
+ end
113
+ end
114
+
115
+ describe 'erasing the device' do
116
+ it 'erases the device' do
117
+ @device.erase!
118
+ end
119
+ end
120
+
121
+ describe 'launching the device' do
122
+ it 'launches the device' do
123
+ @device.launch!
124
+ @device.wait!{|d| d.state == :booted}
125
+ expect(@device.state).to be == :booted
126
+ end
127
+ end
128
+
129
+ describe 'launching a system app' do
130
+ it 'launches Safari' do
131
+ @device.launch_app!('com.apple.mobilesafari')
132
+ end
133
+ end
134
+
135
+ describe 'taking a screenshot' do
136
+ if SimCtl::XcodeVersion.gte? '8.2'
137
+ it 'takes a screenshot' do
138
+ file = File.join(Dir.mktmpdir, 'screenshot.png')
139
+ @device.screenshot!(file)
140
+ expect(File).to exist(file)
141
+ end
142
+ else
143
+ it 'raises exception' do
144
+ expect { @device.screenshot!('/tmp/foo.png') }.to raise_error SimCtl::UnsupportedCommandError
145
+ end
146
+ end
147
+ end
148
+
149
+ describe 'installing an app' do
150
+ before(:all) do
151
+ system 'cd spec/SampleApp && xcodebuild -sdk iphonesimulator >/dev/null 2>&1'
152
+ end
153
+
154
+ it 'installs SampleApp' do
155
+ @device.install!('spec/SampleApp/build/Release-iphonesimulator/SampleApp.app')
156
+ end
157
+ end
158
+
159
+ describe 'launching an app' do
160
+ it 'launches SampleApp' do
161
+ @device.launch_app!('com.github.plu.simctl.SampleApp')
162
+ end
163
+ end
164
+
165
+ describe 'uninstall an app' do
166
+ it 'uninstalls SampleApp' do
167
+ @device.uninstall!('com.github.plu.simctl.SampleApp')
168
+ end
169
+ end
170
+
171
+ describe 'opening a url' do
172
+ it 'opens some url' do
173
+ @device.open_url!('https://www.github.com')
174
+ end
175
+ end
176
+
177
+ describe 'killing the device' do
178
+ it 'state is booted' do
179
+ expect(@device.state).to be == :booted
180
+ end
181
+
182
+ it 'kills the device' do
183
+ @device.kill!
184
+ @device.wait!{|d| d.state == :shutdown}
185
+ end
186
+
187
+ it 'state is shutdown' do
188
+ expect(@device.state).to be == :shutdown
189
+ end
190
+ end
191
+
192
+ describe 'booting the device' do
193
+ it 'state is shutdown' do
194
+ expect(@device.state).to be == :shutdown
195
+ end
196
+
197
+ it 'boots the device' do
198
+ @device.boot!
199
+ @device.wait! {|d| d.state == :booted}
200
+ expect(@device.state).to be == :booted
201
+ end
202
+
203
+ it 'state is booted' do
204
+ expect(@device.state).to be == :booted
205
+ end
206
+ end
207
+
208
+ describe 'shutting down the device' do
209
+ it 'state is booted' do
210
+ expect(@device.state).to be == :booted
211
+ end
212
+
213
+ it 'shuts down the device' do
214
+ @device.shutdown!
215
+ @device.wait!{|d| d.state == :shutdown}
216
+ end
217
+
218
+ it 'state is shutdown' do
219
+ expect(@device.state).to be == :shutdown
220
+ end
221
+ end
222
+
223
+ describe 'resetting the device' do
224
+ it 'deletes the old device and creates a new one' do
225
+ new_device = @device.reset!
226
+ expect(new_device.name).to be == @device.name
227
+ expect(new_device.devicetype).to be == @device.devicetype
228
+ expect(new_device.runtime).to be == @device.runtime
229
+ expect(new_device.udid).not_to be == @device.udid
230
+ expect(SimCtl.device(udid: @device.udid)).to be_nil
231
+ @device = new_device
232
+ end
233
+ end
234
+
235
+ describe 'deleting the device' do
236
+ it 'deletes the device' do
237
+ device = SimCtl.create_device @name, @devicetype, @runtime
238
+ device.delete!
239
+ expect(SimCtl.device(udid: @device.udid)).to be_nil
240
+ end
241
+ end
242
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe SimCtl::Executor do
4
+ describe '#execute' do
5
+ it 'raises an exception' do
6
+ expect { SimCtl::Executor.execute(['xcrun simctl asdf']) }.to raise_error RuntimeError
7
+ end
8
+
9
+ it 'returns json' do
10
+ json = SimCtl::Executor.execute(["echo '{\"foo\":\"bar\"}'"]) do |result|
11
+ result
12
+ end
13
+ expect(json).to eql({'foo' => 'bar'})
14
+ end
15
+
16
+ it 'returns a string' do
17
+ string = SimCtl::Executor.execute(["echo 'hello world'"]) do |result|
18
+ result
19
+ end
20
+ expect(string).to eql('hello world')
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe SimCtl do
4
+ describe '#devicetype' do
5
+ it 'find device type by name' do
6
+ expect(SimCtl.devicetype(name: 'iPhone 5')).to be_kind_of SimCtl::DeviceType
7
+ end
8
+
9
+ it 'raise exception if device type is not found' do
10
+ expect { SimCtl.devicetype(name: 'iPhone 1') }.to raise_error SimCtl::DeviceTypeNotFound
11
+ end
12
+ end
13
+
14
+ describe '#list_devicetypes' do
15
+ it 'contains some devicetypes' do
16
+ expect(SimCtl.list_devicetypes.count).to be > 0
17
+ end
18
+
19
+ it 'is a SimCtl::DeviceType object' do
20
+ expect(SimCtl.list_devicetypes.first).to be_kind_of SimCtl::DeviceType
21
+ end
22
+
23
+ it 'parses identifier property' do
24
+ expect(SimCtl.list_devicetypes.first.identifier).not_to be_nil
25
+ end
26
+
27
+ it 'parses name property' do
28
+ expect(SimCtl.list_devicetypes.first.name).not_to be_nil
29
+ end
30
+ end
31
+
32
+ describe '#list_runtimes' do
33
+ it 'contains some runtimes' do
34
+ expect(SimCtl.list_runtimes.count).to be > 0
35
+ end
36
+
37
+ it 'is a SimCtl::Runtime object' do
38
+ expect(SimCtl.list_runtimes.first).to be_kind_of SimCtl::Runtime
39
+ end
40
+
41
+ it 'parses availability property' do
42
+ expect(SimCtl.list_runtimes.first.availability).not_to be_nil
43
+ end
44
+
45
+ it 'parses buildversion property' do
46
+ expect(SimCtl.list_runtimes.first.buildversion).not_to be_nil
47
+ end
48
+
49
+ it 'parses identifier property' do
50
+ expect(SimCtl.list_runtimes.first.identifier).not_to be_nil
51
+ end
52
+
53
+ it 'parses name property' do
54
+ expect(SimCtl.list_runtimes.first.name).not_to be_nil
55
+ end
56
+
57
+ it 'return latest ios runtime' do
58
+ expect(SimCtl::Runtime.latest(:ios)).to be_kind_of SimCtl::Runtime
59
+ end
60
+
61
+ it 'return latest tvos runtime' do
62
+ expect(SimCtl::Runtime.latest(:tvos)).to be_kind_of SimCtl::Runtime
63
+ end
64
+
65
+ it 'return latest watchos runtime' do
66
+ expect(SimCtl::Runtime.latest(:watchos)).to be_kind_of SimCtl::Runtime
67
+ end
68
+ end
69
+
70
+ describe '#runtime' do
71
+ it 'find runtime by name' do
72
+ expect(SimCtl.runtime(name: 'iOS 9.3')).to be_kind_of SimCtl::Runtime
73
+ end
74
+
75
+ it 'raise exception if runtime is not found' do
76
+ expect { SimCtl.runtime(name: 'iOS 17.0') }.to raise_error SimCtl::RuntimeNotFound
77
+ end
78
+
79
+ it 'finds the latest runtime' do
80
+ if SimCtl::XcodeVersion.gte?('8.2')
81
+ expect(SimCtl::Runtime.latest(:ios).version).to be == '10.2'
82
+ elsif SimCtl::XcodeVersion.gte?('8.1')
83
+ expect(SimCtl::Runtime.latest(:ios).version).to be == '10.1'
84
+ elsif SimCtl::XcodeVersion.gte?('8.0')
85
+ expect(SimCtl::Runtime.latest(:ios).version).to be == '10.0'
86
+ elsif SimCtl::XcodeVersion.gte?('7.3')
87
+ expect(SimCtl::Runtime.latest(:ios).version).to be == '9.3'
88
+ end
89
+ end
90
+ end
91
+
92
+ describe 'unknown method' do
93
+ it 'raise an exception' do
94
+ expect { SimCtl.foo }.to raise_error NoMethodError
95
+ end
96
+ end
97
+ end
@@ -1,15 +1,15 @@
1
- require 'test_helper'
1
+ require 'spec_helper'
2
2
 
3
- class SimCtl::ReadmeTest < Minitest::Test
4
- should 'execute example code from readme' do
5
- # Select the iOS 9.2 runtime
6
- runtime = SimCtl.runtime(name: 'iOS 9.2')
3
+ RSpec.describe SimCtl do
4
+ it 'executes example code from readme' do
5
+ # Select the iOS 9.3 runtime
6
+ runtime = SimCtl.runtime(name: 'iOS 9.3')
7
7
 
8
8
  # Select the iPhone 5 device type
9
9
  devicetype = SimCtl.devicetype(name: 'iPhone 5')
10
10
 
11
11
  # Create a new device
12
- device = SimCtl.create_device 'Unit Tests @ iPhone 5 9.2', devicetype, runtime
12
+ device = SimCtl.create_device 'Unit Tests @ iPhone 5 9.3', devicetype, runtime
13
13
 
14
14
  # Launch a new Simulator.app instance
15
15
  device.launch!
@@ -0,0 +1,36 @@
1
+ require 'coveralls'
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ add_filter 'spec'
5
+ end
6
+ Coveralls.wear!
7
+
8
+ $LOAD_PATH.push File.expand_path("../../lib", __FILE__)
9
+ require File.dirname(__FILE__) + '/../lib/simctl.rb'
10
+
11
+ if ENV['TRAVIS']
12
+ SimCtl.default_timeout = 300
13
+ end
14
+
15
+ unless ENV['CUSTOM_DEVICE_SET_PATH'] == 'false'
16
+ SimCtl.device_set_path = Dir.mktmpdir 'foo bar'
17
+ end
18
+
19
+ RSpec.configure do |config|
20
+ config.tty = true
21
+
22
+ config.expect_with :rspec do |c|
23
+ c.syntax = :expect
24
+ end
25
+
26
+ config.mock_with :rspec do |c|
27
+ c.syntax = :expect
28
+ end
29
+
30
+ def with_rescue(&block)
31
+ begin
32
+ block.class
33
+ rescue
34
+ end
35
+ end
36
+ end
metadata CHANGED
@@ -1,31 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simctl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.7
4
+ version: 1.5.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Johannes Plunien
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-14 00:00:00.000000000 Z
11
+ date: 2016-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rake
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: maxitest
14
+ name: coveralls
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
17
  - - ">="
@@ -39,7 +25,7 @@ dependencies:
39
25
  - !ruby/object:Gem::Version
40
26
  version: '0'
41
27
  - !ruby/object:Gem::Dependency
42
- name: shoulda-context
28
+ name: rake
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
31
  - - ">="
@@ -53,7 +39,7 @@ dependencies:
53
39
  - !ruby/object:Gem::Version
54
40
  version: '0'
55
41
  - !ruby/object:Gem::Dependency
56
- name: coveralls
42
+ name: rspec
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
45
  - - ">="
@@ -117,6 +103,7 @@ files:
117
103
  - lib/simctl/command/delete.rb
118
104
  - lib/simctl/command/erase.rb
119
105
  - lib/simctl/command/install.rb
106
+ - lib/simctl/command/io.rb
120
107
  - lib/simctl/command/kill.rb
121
108
  - lib/simctl/command/launch.rb
122
109
  - lib/simctl/command/list.rb
@@ -134,19 +121,20 @@ files:
134
121
  - lib/simctl/object.rb
135
122
  - lib/simctl/runtime.rb
136
123
  - lib/simctl/version.rb
124
+ - lib/simctl/xcode_version.rb
137
125
  - simctl.gemspec
138
- - test/SampleApp/.gitignore
139
- - test/SampleApp/SampleApp.xcodeproj/project.pbxproj
140
- - test/SampleApp/SampleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata
141
- - test/SampleApp/SampleApp/AppDelegate.h
142
- - test/SampleApp/SampleApp/AppDelegate.m
143
- - test/SampleApp/SampleApp/Info.plist
144
- - test/SampleApp/SampleApp/main.m
145
- - test/simctl/crud_test.rb
146
- - test/simctl/executor_test.rb
147
- - test/simctl/list_test.rb
148
- - test/simctl/readme_test.rb
149
- - test/test_helper.rb
126
+ - spec/SampleApp/.gitignore
127
+ - spec/SampleApp/SampleApp.xcodeproj/project.pbxproj
128
+ - spec/SampleApp/SampleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata
129
+ - spec/SampleApp/SampleApp/AppDelegate.h
130
+ - spec/SampleApp/SampleApp/AppDelegate.m
131
+ - spec/SampleApp/SampleApp/Info.plist
132
+ - spec/SampleApp/SampleApp/main.m
133
+ - spec/simctl/device_interaction_spec.rb
134
+ - spec/simctl/executor_spec.rb
135
+ - spec/simctl/list_spec.rb
136
+ - spec/simctl/readme_spec.rb
137
+ - spec/spec_helper.rb
150
138
  homepage: https://github.com/plu/simctl
151
139
  licenses:
152
140
  - MIT
@@ -172,15 +160,15 @@ signing_key:
172
160
  specification_version: 4
173
161
  summary: Ruby interface to xcrun simctl
174
162
  test_files:
175
- - test/SampleApp/.gitignore
176
- - test/SampleApp/SampleApp.xcodeproj/project.pbxproj
177
- - test/SampleApp/SampleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata
178
- - test/SampleApp/SampleApp/AppDelegate.h
179
- - test/SampleApp/SampleApp/AppDelegate.m
180
- - test/SampleApp/SampleApp/Info.plist
181
- - test/SampleApp/SampleApp/main.m
182
- - test/simctl/crud_test.rb
183
- - test/simctl/executor_test.rb
184
- - test/simctl/list_test.rb
185
- - test/simctl/readme_test.rb
186
- - test/test_helper.rb
163
+ - spec/SampleApp/.gitignore
164
+ - spec/SampleApp/SampleApp.xcodeproj/project.pbxproj
165
+ - spec/SampleApp/SampleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata
166
+ - spec/SampleApp/SampleApp/AppDelegate.h
167
+ - spec/SampleApp/SampleApp/AppDelegate.m
168
+ - spec/SampleApp/SampleApp/Info.plist
169
+ - spec/SampleApp/SampleApp/main.m
170
+ - spec/simctl/device_interaction_spec.rb
171
+ - spec/simctl/executor_spec.rb
172
+ - spec/simctl/list_spec.rb
173
+ - spec/simctl/readme_spec.rb
174
+ - spec/spec_helper.rb
@@ -1,137 +0,0 @@
1
- require 'securerandom'
2
- require 'test_helper'
3
-
4
- class SimCtl::CRUDTest < Minitest::Test
5
- order_dependent!
6
-
7
- udid = nil
8
- name = SecureRandom.hex
9
- devicetype = 'iPhone 5'
10
-
11
- should 'raise exception if devicetype lookup failed' do
12
- assert_raises { SimCtl.create_device SecureRandom.hex, 'invalid devicetype', SimCtl::Runtime.latest(:ios) }
13
- end
14
-
15
- should 'raise exception if runtime lookup failed' do
16
- assert_raises { SimCtl.create_device name, SimCtl::DeviceType.find(name: devicetype), 'invalid runtime' }
17
- end
18
-
19
- should '0100. create a new device' do
20
- device = SimCtl.create_device name, devicetype, SimCtl::Runtime.latest(:ios)
21
- device.wait! {|d| d.state == :shutdown}
22
- udid = device.udid
23
- end
24
-
25
- should '0200. find the device by udid' do
26
- device = SimCtl.device(udid: udid)
27
- assert_kind_of SimCtl::Device, device
28
- assert device.availability != nil
29
- assert device.name == name
30
- assert device.os != nil
31
- assert device.state != nil
32
- assert device.udid != nil
33
- end
34
-
35
- should '0300. find the device by name' do
36
- assert SimCtl.device(name: name).udid == udid
37
- assert SimCtl.device(name: name) == SimCtl.device(udid: udid)
38
- end
39
-
40
- should '0400. have devicetype property' do
41
- assert SimCtl.device(udid: udid).devicetype == SimCtl.devicetype(name: devicetype)
42
- end
43
-
44
- should '0500. have runtime property' do
45
- assert SimCtl.device(udid: udid).runtime == SimCtl::Runtime.latest(:ios)
46
- end
47
-
48
- should '0600. rename the device' do
49
- SimCtl.device(udid: udid).rename!('new name')
50
- assert SimCtl.device(udid: udid).name == 'new name'
51
- end
52
-
53
- should '0700. erase the device' do
54
- SimCtl.device(udid: udid).erase!
55
- end
56
-
57
- should '0800. launch the device' do
58
- device = SimCtl.device(udid: udid)
59
- device.launch!
60
- device.wait!{|d| d.state == :booted}
61
- end
62
-
63
- should '0810. launch safari' do
64
- device = SimCtl.device(udid: udid)
65
- device.launch_app!('com.apple.mobilesafari')
66
- end
67
-
68
- should '0820. install SampleApp' do
69
- system 'cd test/SampleApp && xcodebuild -sdk iphonesimulator >/dev/null 2>&1'
70
- device = SimCtl.device(udid: udid)
71
- device.install!('test/SampleApp/build/Release-iphonesimulator/SampleApp.app')
72
- end
73
-
74
- should '0830. launch SampleApp' do
75
- system 'cd test/SampleApp && xcodebuild -sdk iphonesimulator >/dev/null 2>&1'
76
- device = SimCtl.device(udid: udid)
77
- device.launch_app!('com.github.plu.simctl.SampleApp')
78
- end
79
-
80
- should '0840. open some url' do
81
- device = SimCtl.device(udid: udid)
82
- device.open_url!('https://www.github.com')
83
- end
84
-
85
- should '0850. uninstall SampleApp' do
86
- system 'cd test/SampleApp && xcodebuild -sdk iphonesimulator >/dev/null 2>&1'
87
- device = SimCtl.device(udid: udid)
88
- device.install!('test/SampleApp/build/Release-iphonesimulator/SampleApp.app')
89
- device.uninstall!('com.github.plu.simctl.SampleApp')
90
- end
91
-
92
- should '0900. kill the device' do
93
- device = SimCtl.device(udid: udid)
94
- assert device.kill!
95
- device.wait!{|d| d.state == :shutdown}
96
- end
97
-
98
- should '1000. boot the device' do
99
- device = SimCtl.device(udid: udid)
100
- device.boot!
101
- device.wait!{|d| d.state == :booted}
102
- end
103
-
104
- should '1100. shutdown the device' do
105
- device = SimCtl.device(udid: udid)
106
- device.shutdown!
107
- device.wait!{|d| d.state == :shutdown}
108
- end
109
-
110
- should '1200. disable keyboard helpers' do
111
- device = SimCtl.device(udid: udid)
112
- device.settings.disable_keyboard_helpers!
113
- assert File.exists?(device.path.preferences_plist)
114
- end
115
-
116
- should '1300. update hardware keyboard' do
117
- device = SimCtl.device(udid: udid)
118
- device.settings.update_hardware_keyboard!(false)
119
- assert File.exists?(device.path.preferences_plist)
120
- end
121
-
122
- should '9800. reset the device' do
123
- old_device = SimCtl.device(udid: udid)
124
- new_device = old_device.reset!
125
- assert old_device.name == new_device.name
126
- assert old_device.devicetype == new_device.devicetype
127
- assert old_device.runtime == new_device.runtime
128
- assert old_device.udid != new_device.udid
129
- udid = new_device.udid
130
- end
131
-
132
- should '9900. delete the device' do
133
- device = SimCtl.device(udid: udid)
134
- device.delete!
135
- assert_nil SimCtl.device(udid: udid)
136
- end
137
- end
@@ -1,22 +0,0 @@
1
- require 'securerandom'
2
- require 'test_helper'
3
-
4
- class SimCtl::ExecutorTest < Minitest::Test
5
- should 'raise exception' do
6
- assert_raises { SimCtl::Executor.execute(['xcrun simctl asdf']) }
7
- end
8
-
9
- should 'return json' do
10
- json = SimCtl::Executor.execute(["echo '{\"foo\":\"bar\"}'"]) do |result|
11
- result
12
- end
13
- assert json == {'foo' => 'bar'}
14
- end
15
-
16
- should 'return string' do
17
- string = SimCtl::Executor.execute(["echo 'hello world'"]) do |result|
18
- result
19
- end
20
- assert string == 'hello world'
21
- end
22
- end
@@ -1,86 +0,0 @@
1
- require 'test_helper'
2
-
3
- class SimCtl::ListTest < Minitest::Test
4
- context 'devicetype' do
5
- should 'find device type by name' do
6
- assert_kind_of SimCtl::DeviceType, SimCtl.devicetype(name: 'iPhone 5')
7
- end
8
-
9
- should 'raise exception if device type is not found' do
10
- assert_raises { SimCtl.devicetype(name: 'iPhone 1') }
11
- end
12
- end
13
-
14
- context 'list_devicetypes' do
15
- should 'contain some devicetypes' do
16
- assert SimCtl.list_devicetypes.count > 0
17
- end
18
-
19
- should 'be a SimCtl::DeviceType object' do
20
- assert_kind_of SimCtl::DeviceType, SimCtl.list_devicetypes.first
21
- end
22
-
23
- should 'parse identifier property' do
24
- assert SimCtl.list_devicetypes.first.identifier != nil
25
- end
26
-
27
- should 'parse name property' do
28
- assert SimCtl.list_devicetypes.first.name != nil
29
- end
30
- end
31
-
32
- context 'list_runtimes' do
33
- should 'contain some runtimes' do
34
- assert SimCtl.list_runtimes.count > 0
35
- end
36
-
37
- should 'be a SimCtl::Runtime object' do
38
- assert_kind_of SimCtl::Runtime, SimCtl.list_runtimes.first
39
- end
40
-
41
- should 'parse availability property' do
42
- assert SimCtl.list_runtimes.first.availability != nil
43
- end
44
-
45
- should 'parse buildversion property' do
46
- assert SimCtl.list_runtimes.first.buildversion != nil
47
- end
48
-
49
- should 'parse identifier property' do
50
- assert SimCtl.list_runtimes.first.identifier != nil
51
- end
52
-
53
- should 'parse name property' do
54
- assert SimCtl.list_runtimes.first.name != nil
55
- end
56
-
57
- should 'return latest ios runtime' do
58
- assert_kind_of SimCtl::Runtime, SimCtl::Runtime.latest(:ios)
59
- end
60
-
61
- should 'return latest tvos runtime' do
62
- assert_kind_of SimCtl::Runtime, SimCtl::Runtime.latest(:tvos)
63
- end
64
-
65
- should 'return latest watchos runtime' do
66
- assert_kind_of SimCtl::Runtime, SimCtl::Runtime.latest(:watchos)
67
- end
68
- end
69
-
70
- context 'runtime' do
71
- should 'find runtime by name' do
72
- assert_kind_of SimCtl::Runtime, SimCtl.runtime(name: 'iOS 9.3')
73
- end
74
-
75
- should 'raise exception if runtime is not found' do
76
- assert_raises { SimCtl.runtime(name: 'iOS 17.0') }
77
- end
78
- end
79
-
80
- context 'unknown method' do
81
- should 'raise an exception' do
82
- assert_raises { SimCtl.foo }
83
- end
84
- end
85
-
86
- end
data/test/test_helper.rb DELETED
@@ -1,16 +0,0 @@
1
- require 'coveralls'
2
- Coveralls.wear!
3
-
4
- require 'maxitest/autorun'
5
- require 'shoulda-context'
6
-
7
- $LOAD_PATH.push File.expand_path("../../lib", __FILE__)
8
- require File.dirname(__FILE__) + '/../lib/simctl.rb'
9
-
10
- if ENV['TRAVIS']
11
- SimCtl.default_timeout = 300
12
- end
13
-
14
- unless ENV['CUSTOM_DEVICE_SET_PATH'] == 'false'
15
- SimCtl.device_set_path = Dir.mktmpdir 'foo bar'
16
- end