diff --git a/lib/simctl-list-parser.js b/lib/simctl-list-parser.js index f39325e..d8abbe3 100644 --- a/lib/simctl-list-parser.js +++ b/lib/simctl-list-parser.js @@ -51,6 +51,10 @@ SimctlListParser.prototype.parse = function(text) { return this._result; }; +SimctlListParser.prototype._clear = function() { + clearResult.apply(this); +}; + function clearResult() { this._result = { 'devices': [], diff --git a/spec/simctl-list-parser.spec.js b/spec/simctl-list-parser.spec.js index 68ab866..c5974f1 100644 --- a/spec/simctl-list-parser.spec.js +++ b/spec/simctl-list-parser.spec.js @@ -24,12 +24,13 @@ THE SOFTWARE. var SimCtlListParser = require('../lib/simctl-list-parser'); -describe('list-parser tests', function() { +describe('list-parser device type tests', function() { var parser = new SimCtlListParser(); var header = '== Device Types =='; beforeEach(function() { + parser._clear(); }); afterEach(function() { @@ -147,47 +148,209 @@ describe('list-parser tests', function() { }); }); -describe('list-parser test Runtimes', function() { +describe('list-parser runtimes test', function() { var parser = new SimCtlListParser(); + var header = '== Runtimes =='; beforeEach(function() { + parser._clear(); }); afterEach(function() { }); - it('test parse', function() { - expect(true).toBe(true); + it('test parse runtimes', function() { + var lines = [ + header, + 'iOS 8.4 (8.4 - 12H141) (com.apple.CoreSimulator.SimRuntime.iOS-8-4)', + 'iOS 9.3 (9.3 - 13E233) (com.apple.CoreSimulator.SimRuntime.iOS-9-3)', + 'iOS 10.0 (10.0 - 14A345) (com.apple.CoreSimulator.SimRuntime.iOS-10-0)', + 'tvOS 10.0 (10.0 - 14A345) (com.apple.CoreSimulator.SimRuntime.tvOS-10-0)', + 'watchOS 3.0 (10.0 - 14A345) (com.apple.CoreSimulator.SimRuntime.watchOS-3-0)' + ]; + + var result = parser.parse(lines.join('\n')); + expect(result.devicetypes.length).toEqual(0); + expect(result.devices.length).toEqual(0); + expect(result.runtimes.length).toEqual(5); + + expect(result.runtimes[0].name).toEqual('iOS 8.4'); + expect(result.runtimes[0].build).toEqual('8.4 - 12H141'); + expect(result.runtimes[0].id).toEqual('com.apple.CoreSimulator.SimRuntime.iOS-8-4'); + expect(result.runtimes[0].available).toEqual(true); + expect(result.runtimes[1].name).toEqual('iOS 9.3'); + expect(result.runtimes[1].build).toEqual('9.3 - 13E233'); + expect(result.runtimes[1].id).toEqual('com.apple.CoreSimulator.SimRuntime.iOS-9-3'); + expect(result.runtimes[1].available).toEqual(true); + expect(result.runtimes[2].name).toEqual('iOS 10.0'); + expect(result.runtimes[2].build).toEqual('10.0 - 14A345'); + expect(result.runtimes[2].id).toEqual('com.apple.CoreSimulator.SimRuntime.iOS-10-0'); + expect(result.runtimes[2].available).toEqual(true); + expect(result.runtimes[3].name).toEqual('tvOS 10.0'); + expect(result.runtimes[3].build).toEqual('10.0 - 14A345'); + expect(result.runtimes[3].id).toEqual('com.apple.CoreSimulator.SimRuntime.tvOS-10-0'); + expect(result.runtimes[3].available).toEqual(true); + expect(result.runtimes[4].name).toEqual('watchOS 3.0'); + expect(result.runtimes[4].build).toEqual('10.0 - 14A345'); + expect(result.runtimes[4].id).toEqual('com.apple.CoreSimulator.SimRuntime.watchOS-3-0'); + expect(result.runtimes[4].available).toEqual(true); }); }); describe('list-parser test Devices', function() { var parser = new SimCtlListParser(); + var header = '== Devices =='; beforeEach(function() { + parser._clear(); }); afterEach(function() { }); - it('test parse', function() { - expect(true).toBe(true); + it('test parse iPhone and iPad', function() { + var lines = [ + header, + '-- iOS 8.4 --', + ' Resizable iPad (E7348A97-6719-476F-B5A9-0C7F32336F0B) (Shutdown) (unavailable, device type profile not found)', + ' Resizable iPhone (6B3D08F5-6010-4934-8259-81F0F5F86E20) (Shutdown) (unavailable, device type profile not found)', + '-- iOS 9.3 --', + ' iPad Air 2 (9E3E156C-A96F-4D61-A2BB-D72F0BE2E7BB) (Shutdown)', + ' iPad Pro (5B0E98E8-517D-49A7-860A-B7F820DA9C23) (Shutdown)', + '-- iOS 10.0 --', + ' iPhone 6s (8C41DBA3-0F78-43FF-AE92-845D35DDD39D) (Shutdown)', + ' iPhone 6s Plus (1B4E1A98-2408-404A-BEFC-F723A6889A63) (Shutdown)', + ' iPhone 7 (87894360-0337-459E-816E-AE5EFD0A4570) (Shutdown)', + ' iPhone 7 Plus (8D85405B-96CA-4268-87D1-CE594567F5EF) (Shutdown)', + ' iPhone SE (175D9F25-0B08-4E4B-AD39-E3CBAC72CB4B) (Shutdown)', + ' iPad Pro (9.7 inch) (1C5590C8-8AE7-4C27-AD06-84C801702945) (Shutdown)', + ' iPad Pro (12.9 inch) (065BAEBF-1D7D-4B3B-B30D-79529356065B) (Shutdown)', + '-- tvOS 10.0 --', + ' Apple TV 1080p (1A360376-E68E-45C2-8DBB-48BF7C60B4FB) (Shutdown)', + '-- watchOS 3.0 --', + ' Apple Watch - 38mm (349DD23B-689C-43E4-A1F5-304C3E4DCFDD) (Shutdown)', + ' Apple Watch - 42mm (B932A73B-477F-47A7-AB29-1E98D3F9095C) (Shutdown)', + ' Apple Watch Series 2 - 38mm (B4BB8453-349F-4CBF-A5A9-87BE602DB13E) (Shutdown)', + ' Apple Watch Series 2 - 42mm (0C527828-EBF4-4FD0-A66B-200FE716EB37) (Shutdown)', + '-- Unavailable: com.apple.CoreSimulator.SimRuntime.iOS-9-1 --', + ' iPhone 4s (A27C69F5-1AFF-48D2-92B0-951F7E037E9C) (Shutdown) (unavailable, runtime profile not found)' + ]; + + var result = parser.parse(lines.join('\n')); + expect(result.devicetypes.length).toEqual(0); + expect(result.devices.length).toEqual(6); + expect(result.runtimes.length).toEqual(0); + + var device = result.devices[0]; + expect(device.runtime).toEqual('iOS 8.4'); + expect(device.devices[0].name).toEqual('Resizable iPad'); + expect(device.devices[0].id).toEqual('E7348A97-6719-476F-B5A9-0C7F32336F0B'); + expect(device.devices[0].state).toEqual('Shutdown'); + expect(device.devices[0].available).toEqual(false); + expect(device.devices[1].name).toEqual('Resizable iPhone'); + expect(device.devices[1].id).toEqual('6B3D08F5-6010-4934-8259-81F0F5F86E20'); + expect(device.devices[1].state).toEqual('Shutdown'); + expect(device.devices[1].available).toEqual(false); + + device = result.devices[1]; + expect(device.runtime).toEqual('iOS 9.3'); + expect(device.devices[0].name).toEqual('iPad Air 2'); + expect(device.devices[0].id).toEqual('9E3E156C-A96F-4D61-A2BB-D72F0BE2E7BB'); + expect(device.devices[0].state).toEqual('Shutdown'); + expect(device.devices[0].available).toEqual(true); + expect(device.devices[1].name).toEqual('iPad Pro'); + expect(device.devices[1].id).toEqual('5B0E98E8-517D-49A7-860A-B7F820DA9C23'); + expect(device.devices[1].state).toEqual('Shutdown'); + expect(device.devices[1].available).toEqual(true); + + device = result.devices[2]; + expect(device.runtime).toEqual('iOS 10.0'); + expect(device.devices[0].name).toEqual('iPhone 6s'); + expect(device.devices[0].id).toEqual('8C41DBA3-0F78-43FF-AE92-845D35DDD39D'); + expect(device.devices[0].state).toEqual('Shutdown'); + expect(device.devices[0].available).toEqual(true); + expect(device.devices[1].name).toEqual('iPhone 6s Plus'); + expect(device.devices[1].id).toEqual('1B4E1A98-2408-404A-BEFC-F723A6889A63'); + expect(device.devices[1].state).toEqual('Shutdown'); + expect(device.devices[1].available).toEqual(true); + expect(device.devices[2].name).toEqual('iPhone 7'); + expect(device.devices[2].id).toEqual('87894360-0337-459E-816E-AE5EFD0A4570'); + expect(device.devices[2].state).toEqual('Shutdown'); + expect(device.devices[2].available).toEqual(true); + expect(device.devices[3].name).toEqual('iPhone 7 Plus'); + expect(device.devices[3].id).toEqual('8D85405B-96CA-4268-87D1-CE594567F5EF'); + expect(device.devices[3].state).toEqual('Shutdown'); + expect(device.devices[3].available).toEqual(true); + expect(device.devices[4].name).toEqual('iPhone SE'); + expect(device.devices[4].id).toEqual('175D9F25-0B08-4E4B-AD39-E3CBAC72CB4B'); + expect(device.devices[4].state).toEqual('Shutdown'); + expect(device.devices[4].available).toEqual(true); + expect(device.devices[5].name).toEqual('iPad Pro (9.7 inch)'); + expect(device.devices[5].id).toEqual('1C5590C8-8AE7-4C27-AD06-84C801702945'); + expect(device.devices[5].state).toEqual('Shutdown'); + expect(device.devices[5].available).toEqual(true); + expect(device.devices[6].name).toEqual('iPad Pro (12.9 inch)'); + expect(device.devices[6].id).toEqual('065BAEBF-1D7D-4B3B-B30D-79529356065B'); + expect(device.devices[6].state).toEqual('Shutdown'); + expect(device.devices[6].available).toEqual(true); + + // tvOS ////////// + + device = result.devices[3]; + expect(device.runtime).toEqual('tvOS 10.0'); + expect(device.devices[0].name).toEqual('Apple TV 1080p'); + expect(device.devices[0].id).toEqual('1A360376-E68E-45C2-8DBB-48BF7C60B4FB'); + expect(device.devices[0].state).toEqual('Shutdown'); + expect(device.devices[0].available).toEqual(true); + + // watchOS ////////// + + device = result.devices[4]; + expect(device.runtime).toEqual('watchOS 3.0'); + expect(device.devices[0].name).toEqual('Apple Watch - 38mm'); + expect(device.devices[0].id).toEqual('349DD23B-689C-43E4-A1F5-304C3E4DCFDD'); + expect(device.devices[0].state).toEqual('Shutdown'); + expect(device.devices[0].available).toEqual(true); + expect(device.devices[1].name).toEqual('Apple Watch - 42mm'); + expect(device.devices[1].id).toEqual('B932A73B-477F-47A7-AB29-1E98D3F9095C'); + expect(device.devices[1].state).toEqual('Shutdown'); + expect(device.devices[1].available).toEqual(true); + expect(device.devices[2].name).toEqual('Apple Watch Series 2 - 38mm'); + expect(device.devices[2].id).toEqual('B4BB8453-349F-4CBF-A5A9-87BE602DB13E'); + expect(device.devices[2].state).toEqual('Shutdown'); + expect(device.devices[2].available).toEqual(true); + expect(device.devices[3].name).toEqual('Apple Watch Series 2 - 42mm'); + expect(device.devices[3].id).toEqual('0C527828-EBF4-4FD0-A66B-200FE716EB37'); + expect(device.devices[3].state).toEqual('Shutdown'); + expect(device.devices[3].available).toEqual(true); + + // Unavailable ////////// + + device = result.devices[5]; + expect(device.runtime).toEqual('Unavailable: com.apple.CoreSimulator.SimRuntime.iOS-9-1'); + expect(device.devices[0].name).toEqual('iPhone 4s'); + expect(device.devices[0].id).toEqual('A27C69F5-1AFF-48D2-92B0-951F7E037E9C'); + expect(device.devices[0].state).toEqual('Shutdown'); + expect(device.devices[0].available).toEqual(false); }); }); describe('list-parser test Device Pairs', function() { var parser = new SimCtlListParser(); + var header = '== Device Pairs =='; beforeEach(function() { + parser._clear(); }); afterEach(function() { }); it('test parse', function() { + // TODO: see https://github.com/phonegap/simctl/issues/3 expect(true).toBe(true); });