[quick_actions]Migrate the XCUITests to Swift (#6425)

diff --git a/packages/quick_actions/quick_actions_ios/CHANGELOG.md b/packages/quick_actions/quick_actions_ios/CHANGELOG.md
index e002bd7..31fe438 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 47360fe..c853a19 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 = "<group>"; };
 		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 = "<group>"; };
 		686BE83125E58CCF00862533 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
 		7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
@@ -76,6 +75,7 @@
 		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		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 = "<group>"; };
 		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 = "<group>"; };
 		E0C09C28289C729D00E6977E /* FLTQuickActionsPluginTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLTQuickActionsPluginTests.m; sourceTree = "<group>"; };
 		E0C09C31289DBFCA00E6977E /* FLTShortcutStateManagerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLTShortcutStateManagerTests.m; sourceTree = "<group>"; };
 		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 = "<group>"; };
@@ -121,8 +121,8 @@
 		686BE82E25E58CCF00862533 /* RunnerUITests */ = {
 			isa = PBXGroup;
 			children = (
-				686BE82F25E58CCF00862533 /* RunnerUITests.m */,
 				686BE83125E58CCF00862533 /* Info.plist */,
+				E092A7F528D128EB005C7F67 /* RunnerUITests.swift */,
 			);
 			path = RunnerUITests;
 			sourceTree = "<group>";
@@ -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 0bad57f..0000000
--- 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 <XCTest/XCTest.h>
-#import <os/log.h>
-
-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 0000000..a59692e
--- /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)
+  }
+}