diff --git a/packages/quick_actions/quick_actions_ios/CHANGELOG.md b/packages/quick_actions/quick_actions_ios/CHANGELOG.md index e002bd70ac09..31fe43832d2f 100644 --- a/packages/quick_actions/quick_actions_ios/CHANGELOG.md +++ b/packages/quick_actions/quick_actions_ios/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Migrates `RunnerUITests` to Swift. + ## 1.0.1 * Removes custom modulemap file with "Test" submodule and private headers for Swift migration. diff --git a/packages/quick_actions/quick_actions_ios/example/ios/Runner.xcodeproj/project.pbxproj b/packages/quick_actions/quick_actions_ios/example/ios/Runner.xcodeproj/project.pbxproj index 47360fe51a70..c853a197ca9b 100644 --- a/packages/quick_actions/quick_actions_ios/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/quick_actions/quick_actions_ios/example/ios/Runner.xcodeproj/project.pbxproj @@ -10,13 +10,13 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 2632072169FF635893D8EB4D /* libPods-RunnerTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 436668746754BEEA28B76E55 /* libPods-RunnerTests.a */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 686BE83025E58CCF00862533 /* RunnerUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 686BE82F25E58CCF00862533 /* RunnerUITests.m */; }; 6A841C2B6AED5CF8DB2A1894 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C35AD3650AB6BF850E016715 /* libPods-Runner.a */; }; 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + E092A7F628D128EB005C7F67 /* RunnerUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E092A7F528D128EB005C7F67 /* RunnerUITests.swift */; }; E0C09C29289C729D00E6977E /* FLTQuickActionsPluginTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E0C09C28289C729D00E6977E /* FLTQuickActionsPluginTests.m */; }; E0C09C32289DBFCA00E6977E /* FLTShortcutStateManagerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E0C09C31289DBFCA00E6977E /* FLTShortcutStateManagerTests.m */; }; /* End PBXBuildFile section */ @@ -60,7 +60,6 @@ 436668746754BEEA28B76E55 /* libPods-RunnerTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RunnerTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 5278439583922091276A37C9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 686BE82D25E58CCF00862533 /* RunnerUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 686BE82F25E58CCF00862533 /* RunnerUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RunnerUITests.m; sourceTree = ""; }; 686BE83125E58CCF00862533 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; @@ -76,6 +75,7 @@ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9D27FE1F0F21D4D47DDA16DE /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; C35AD3650AB6BF850E016715 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + E092A7F528D128EB005C7F67 /* RunnerUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerUITests.swift; sourceTree = ""; }; E0C09C28289C729D00E6977E /* FLTQuickActionsPluginTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLTQuickActionsPluginTests.m; sourceTree = ""; }; E0C09C31289DBFCA00E6977E /* FLTShortcutStateManagerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLTShortcutStateManagerTests.m; sourceTree = ""; }; F0609304FBCAEC2289164BD5 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; @@ -121,8 +121,8 @@ 686BE82E25E58CCF00862533 /* RunnerUITests */ = { isa = PBXGroup; children = ( - 686BE82F25E58CCF00862533 /* RunnerUITests.m */, 686BE83125E58CCF00862533 /* Info.plist */, + E092A7F528D128EB005C7F67 /* RunnerUITests.swift */, ); path = RunnerUITests; sourceTree = ""; @@ -281,6 +281,7 @@ }; 686BE82C25E58CCF00862533 = { CreatedOnToolsVersion = 12.4; + LastSwiftMigration = 1330; ProvisioningStyle = Automatic; TestTargetID = 97C146ED1CF9000F007C117D; }; @@ -424,7 +425,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 686BE83025E58CCF00862533 /* RunnerUITests.m in Sources */, + E092A7F628D128EB005C7F67 /* RunnerUITests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -512,6 +513,7 @@ buildSettings = { CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; @@ -529,6 +531,8 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.google.RunnerUITests; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_TARGET_NAME = Runner; }; @@ -539,6 +543,7 @@ buildSettings = { CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; @@ -555,6 +560,7 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.google.RunnerUITests; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_TARGET_NAME = Runner; }; diff --git a/packages/quick_actions/quick_actions_ios/example/ios/RunnerUITests/RunnerUITests.m b/packages/quick_actions/quick_actions_ios/example/ios/RunnerUITests/RunnerUITests.m deleted file mode 100644 index 0bad57f886de..000000000000 --- a/packages/quick_actions/quick_actions_ios/example/ios/RunnerUITests/RunnerUITests.m +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import - -static const int kElementWaitingTime = 30; - -@interface RunnerUITests : XCTestCase - -@end - -@implementation RunnerUITests { - XCUIApplication *_exampleApp; -} - -- (void)setUp { - [super setUp]; - self.continueAfterFailure = NO; - _exampleApp = [[XCUIApplication alloc] init]; -} - -- (void)tearDown { - [super tearDown]; - [_exampleApp terminate]; - _exampleApp = nil; -} - -- (void)testQuickActionWithFreshStart { - XCUIApplication *springboard = - [[XCUIApplication alloc] initWithBundleIdentifier:@"com.apple.springboard"]; - XCUIElement *quickActionsAppIcon = springboard.icons[@"quick_actions_example"]; - if (![quickActionsAppIcon waitForExistenceWithTimeout:kElementWaitingTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", springboard.debugDescription); - XCTFail(@"Failed due to not able to find the example app from springboard with %@ seconds", - @(kElementWaitingTime)); - } - - [quickActionsAppIcon pressForDuration:2]; - XCUIElement *actionTwo = springboard.buttons[@"Action two"]; - if (![actionTwo waitForExistenceWithTimeout:kElementWaitingTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", springboard.debugDescription); - XCTFail(@"Failed due to not able to find the actionTwo button from springboard with %@ seconds", - @(kElementWaitingTime)); - } - - [actionTwo tap]; - - XCUIElement *actionTwoConfirmation = _exampleApp.otherElements[@"action_two"]; - if (![actionTwoConfirmation waitForExistenceWithTimeout:kElementWaitingTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", springboard.debugDescription); - XCTFail(@"Failed due to not able to find the actionTwoConfirmation in the app with %@ seconds", - @(kElementWaitingTime)); - } - XCTAssertTrue(actionTwoConfirmation.exists); -} - -- (void)testQuickActionWhenAppIsInBackground { - [_exampleApp launch]; - - XCUIElement *actionsReady = _exampleApp.otherElements[@"actions ready"]; - if (![actionsReady waitForExistenceWithTimeout:kElementWaitingTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", _exampleApp.debugDescription); - XCTFail(@"Failed due to not able to find the actionsReady in the app with %@ seconds", - @(kElementWaitingTime)); - } - - [[XCUIDevice sharedDevice] pressButton:XCUIDeviceButtonHome]; - - XCUIApplication *springboard = - [[XCUIApplication alloc] initWithBundleIdentifier:@"com.apple.springboard"]; - XCUIElement *quickActionsAppIcon = springboard.icons[@"quick_actions_example"]; - if (![quickActionsAppIcon waitForExistenceWithTimeout:kElementWaitingTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", springboard.debugDescription); - XCTFail(@"Failed due to not able to find the example app from springboard with %@ seconds", - @(kElementWaitingTime)); - } - - [quickActionsAppIcon pressForDuration:2]; - XCUIElement *actionOne = springboard.buttons[@"Action one"]; - if (![actionOne waitForExistenceWithTimeout:kElementWaitingTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", springboard.debugDescription); - XCTFail(@"Failed due to not able to find the actionOne button from springboard with %@ seconds", - @(kElementWaitingTime)); - } - - [actionOne tap]; - - XCUIElement *actionOneConfirmation = _exampleApp.otherElements[@"action_one"]; - if (![actionOneConfirmation waitForExistenceWithTimeout:kElementWaitingTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", springboard.debugDescription); - XCTFail(@"Failed due to not able to find the actionOneConfirmation in the app with %@ seconds", - @(kElementWaitingTime)); - } - XCTAssertTrue(actionOneConfirmation.exists); -} - -@end diff --git a/packages/quick_actions/quick_actions_ios/example/ios/RunnerUITests/RunnerUITests.swift b/packages/quick_actions/quick_actions_ios/example/ios/RunnerUITests/RunnerUITests.swift new file mode 100644 index 000000000000..a59692e7639d --- /dev/null +++ b/packages/quick_actions/quick_actions_ios/example/ios/RunnerUITests/RunnerUITests.swift @@ -0,0 +1,96 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import XCTest + +private let elementWaitingTime: TimeInterval = 30 + +class RunnerUITests: XCTestCase { + + private var exampleApp: XCUIApplication! + + override func setUp() { + super.setUp() + self.continueAfterFailure = false + exampleApp = XCUIApplication() + } + + override func tearDown() { + super.tearDown() + exampleApp.terminate() + exampleApp = nil + } + + func testQuickActionWithFreshStart() { + let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard") + let quickActionsAppIcon = springboard.icons["quick_actions_example"] + if !quickActionsAppIcon.waitForExistence(timeout: elementWaitingTime) { + XCTFail( + "Failed due to not able to find the example app from springboard with \(elementWaitingTime) seconds. Springboard debug description: \(springboard.debugDescription)" + ) + } + + quickActionsAppIcon.press(forDuration: 2) + + let actionTwo = springboard.buttons["Action two"] + if !actionTwo.waitForExistence(timeout: elementWaitingTime) { + XCTFail( + "Failed due to not able to find the actionTwo button from springboard with \(elementWaitingTime) seconds. Springboard debug description: \(springboard.debugDescription)" + ) + } + + actionTwo.tap() + + let actionTwoConfirmation = exampleApp.otherElements["action_two"] + if !actionTwoConfirmation.waitForExistence(timeout: elementWaitingTime) { + XCTFail( + "Failed due to not able to find the actionTwoConfirmation in the app with \(elementWaitingTime) seconds. Springboard debug description: \(springboard.debugDescription)" + ) + } + + XCTAssert(actionTwoConfirmation.exists) + } + + func testQuickActionWhenAppIsInBackground() { + exampleApp.launch() + + let actionsReady = exampleApp.otherElements["actions ready"] + + if !actionsReady.waitForExistence(timeout: elementWaitingTime) { + XCTFail( + "Failed due to not able to find the actionsReady in the app with \(elementWaitingTime) seconds. App debug description: \(exampleApp.debugDescription)" + ) + } + + XCUIDevice.shared.press(.home) + + let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard") + let quickActionsAppIcon = springboard.icons["quick_actions_example"] + if !quickActionsAppIcon.waitForExistence(timeout: elementWaitingTime) { + XCTFail( + "Failed due to not able to find the example app from springboard with \(elementWaitingTime) seconds. Springboard debug description: \(springboard.debugDescription)" + ) + } + + quickActionsAppIcon.press(forDuration: 2) + + let actionOne = springboard.buttons["Action one"] + if !actionOne.waitForExistence(timeout: elementWaitingTime) { + XCTFail( + "Failed due to not able to find the actionOne button from springboard with \(elementWaitingTime) seconds. Springboard debug description: \(springboard.debugDescription)" + ) + } + + actionOne.tap() + + let actionOneConfirmation = exampleApp.otherElements["action_one"] + if !actionOneConfirmation.waitForExistence(timeout: elementWaitingTime) { + XCTFail( + "Failed due to not able to find the actionOneConfirmation in the app with \(elementWaitingTime) seconds. Springboard debug description: \(springboard.debugDescription)" + ) + } + + XCTAssert(actionOneConfirmation.exists) + } +}