import 'dart:async'; import 'dart:io' show ProcessResult; import 'package:file/file.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/ios/mac.dart'; import 'package:flutter_tools/src/ios/simulators.dart'; import 'package:mockito/mockito.dart'; import 'package:platform/platform.dart'; import 'package:process/process.dart'; import 'package:test/test.dart'; import '../src/context.dart'; class MockXcode extends Mock implements Xcode {} class MockFile extends Mock implements File {} class MockProcessManager extends Mock implements ProcessManager {} void main() { final FakePlatform osx = new FakePlatform.fromPlatform(const LocalPlatform()); osx.operatingSystem = 'macos'; group('compareIosVersions', () { test('compares correctly', () { // This list must be sorted in ascending preference order final List<String> testList = <String>[ '8', '8.0', '8.1', '8.2', '9', '9.0', '9.1', '9.2', '10', '10.0', '10.1', ]; for (int i = 0; i < testList.length; i++) { expect(compareIosVersions(testList[i], testList[i]), 0); } for (int i = 0; i < testList.length - 1; i++) { for (int j = i + 1; j < testList.length; j++) { expect(compareIosVersions(testList[i], testList[j]), lessThan(0)); expect(compareIosVersions(testList[j], testList[i]), greaterThan(0)); } } }); }); group('compareIphoneVersions', () { test('compares correctly', () { // This list must be sorted in ascending preference order final List<String> testList = <String>[ 'com.apple.CoreSimulator.SimDeviceType.iPhone-4s', 'com.apple.CoreSimulator.SimDeviceType.iPhone-5', 'com.apple.CoreSimulator.SimDeviceType.iPhone-5s', 'com.apple.CoreSimulator.SimDeviceType.iPhone-6strange', 'com.apple.CoreSimulator.SimDeviceType.iPhone-6-Plus', 'com.apple.CoreSimulator.SimDeviceType.iPhone-6', 'com.apple.CoreSimulator.SimDeviceType.iPhone-6s-Plus', 'com.apple.CoreSimulator.SimDeviceType.iPhone-6s', ]; for (int i = 0; i < testList.length; i++) { expect(compareIphoneVersions(testList[i], testList[i]), 0); } for (int i = 0; i < testList.length - 1; i++) { for (int j = i + 1; j < testList.length; j++) { expect(compareIphoneVersions(testList[i], testList[j]), lessThan(0)); expect(compareIphoneVersions(testList[j], testList[i]), greaterThan(0)); } } }); }); group('IOSSimulator.isSupported', () { testUsingContext('Apple TV is unsupported', () { expect(new IOSSimulator('x', name: 'Apple TV').isSupported(), false); }, overrides: <Type, Generator>{ Platform: () => osx, }); testUsingContext('Apple Watch is unsupported', () { expect(new IOSSimulator('x', name: 'Apple Watch').isSupported(), false); }, overrides: <Type, Generator>{ Platform: () => osx, }); testUsingContext('iPad 2 is unsupported', () { expect(new IOSSimulator('x', name: 'iPad 2').isSupported(), false); }, overrides: <Type, Generator>{ Platform: () => osx, }); testUsingContext('iPad Retina is unsupported', () { expect(new IOSSimulator('x', name: 'iPad Retina').isSupported(), false); }, overrides: <Type, Generator>{ Platform: () => osx, }); testUsingContext('iPhone 5 is unsupported', () { expect(new IOSSimulator('x', name: 'iPhone 5').isSupported(), false); }, overrides: <Type, Generator>{ Platform: () => osx, }); testUsingContext('iPhone 5s is supported', () { expect(new IOSSimulator('x', name: 'iPhone 5s').isSupported(), true); }, overrides: <Type, Generator>{ Platform: () => osx, }); testUsingContext('iPhone SE is supported', () { expect(new IOSSimulator('x', name: 'iPhone SE').isSupported(), true); }, overrides: <Type, Generator>{ Platform: () => osx, }); testUsingContext('iPhone 7 Plus is supported', () { expect(new IOSSimulator('x', name: 'iPhone 7 Plus').isSupported(), true); }, overrides: <Type, Generator>{ Platform: () => osx, }); }); group('Simulator screenshot', () { MockXcode mockXcode; MockProcessManager mockProcessManager; IOSSimulator deviceUnderTest; setUp(() { mockXcode = new MockXcode(); mockProcessManager = new MockProcessManager(); // Let everything else return exit code 0 so process.dart doesn't crash. when( mockProcessManager.run(any, environment: null, workingDirectory: null) ).thenReturn( new Future<ProcessResult>.value(new ProcessResult(2, 0, '', '')) ); // Doesn't matter what the device is. deviceUnderTest = new IOSSimulator('x', name: 'iPhone SE'); }); testUsingContext( 'old Xcode doesn\'t support screenshot', () { when(mockXcode.xcodeMajorVersion).thenReturn(7); when(mockXcode.xcodeMinorVersion).thenReturn(1); expect(deviceUnderTest.supportsScreenshot, false); }, overrides: <Type, Generator>{Xcode: () => mockXcode} ); testUsingContext( 'Xcode 8.2+ supports screenshots', () async { when(mockXcode.xcodeMajorVersion).thenReturn(8); when(mockXcode.xcodeMinorVersion).thenReturn(2); expect(deviceUnderTest.supportsScreenshot, true); final MockFile mockFile = new MockFile(); when(mockFile.path).thenReturn(fs.path.join('some', 'path', 'to', 'screenshot.png')); await deviceUnderTest.takeScreenshot(mockFile); verify(mockProcessManager.run( <String>[ '/usr/bin/xcrun', 'simctl', 'io', 'x', 'screenshot', fs.path.join('some', 'path', 'to', 'screenshot.png'), ], environment: null, workingDirectory: null )); }, overrides: <Type, Generator>{ ProcessManager: () => mockProcessManager, // Test a real one. Screenshot doesn't require instance states. SimControl: () => new SimControl(), Xcode: () => mockXcode, } ); }); }