blob: 75634f7d27f56243a1b03dff306f8fcbd50c07fe [file] [log] [blame]
// Copyright 2014 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
final class NativeUIKitSwiftExperimentUITests: XCTestCase {
override func setUpWithError() throws {
continueAfterFailure = false
}
@MainActor
@available(iOS 26.0, *)
func testMultipleScenes() throws {
let app = XCUIApplication()
app.terminate()
app.launch()
// Resize app so it's not full screen
let springboardApp = XCUIApplication(
bundleIdentifier: "com.apple.springboard"
)
let resizer = springboardApp.otherElements["resize-grabber"].firstMatch
let start = resizer.coordinate(withNormalizedOffset: CGVectorMake(0, 0))
let end = resizer.coordinate(withNormalizedOffset: CGVectorMake(-3, -3))
start.press(forDuration: 1, thenDragTo: end)
// Click button to create a new scene
let createSceneButton = app.buttons["New Scene"].firstMatch
XCTAssertTrue(createSceneButton.waitForExistence(timeout: 5))
createSceneButton.tap()
// Minimize one scene
springboardApp.buttons[
"window-controls:io.flutter.devicelab.xcode-uikit-swift"
].firstMatch.tap()
springboardApp.buttons["Minimize-button"].firstMatch.tap()
// Validate lifecycle events of original scene do not contain background event
let buttons = app.buttons.matching(identifier: "Get Lifecycle Events")
let originalSceneButton = buttons.element(boundBy: 1)
originalSceneButton.tap()
let expectedOriginalSceneEvents = [
"sceneWillConnect",
"sceneWillEnterForeground", "sceneDidBecomeActive",
"sceneWillResignActive", "sceneDidBecomeActive",
"sceneWillResignActive", "sceneDidBecomeActive",
]
let originalSceneEventsPredicate = NSPredicate(
format: "label == %@",
expectedOriginalSceneEvents.joined(separator: "\n")
)
let originalSceneEvents = app.staticTexts.element(
matching: originalSceneEventsPredicate
)
XCTAssertTrue(originalSceneEvents.waitForExistence(timeout: 5))
// Reopen it
springboardApp.icons["xcode_uikit_swift"].firstMatch.tap()
let predicate = NSPredicate(format: "label CONTAINS 'xcode_uikit_swift'")
let scenes = springboardApp.otherElements.matching(predicate)
let newScene = scenes.element(boundBy: 0)
let originalScene = scenes.element(boundBy: 1)
newScene.tap()
// Validate lifecycle events of new scene do contain background event
let newSceneButton = buttons.element(boundBy: 0)
XCTAssertTrue(newSceneButton.waitForExistence(timeout: 5))
newSceneButton.tap()
let expectedNewSceneEvents = [
"sceneWillConnect",
"sceneWillEnterForeground", "sceneDidBecomeActive",
"sceneWillResignActive", "sceneDidEnterBackground",
"sceneWillEnterForeground", "sceneDidBecomeActive",
]
let newSceneEventsPredicate = NSPredicate(
format: "label == %@",
expectedNewSceneEvents.joined(separator: "\n")
)
let newSceneEvents = app.staticTexts.element(
matching: newSceneEventsPredicate
)
XCTAssertTrue(newSceneEvents.waitForExistence(timeout: 5))
}
@MainActor
func testLifecycleEvents() throws {
let app = XCUIApplication()
app.launch()
let button = app.buttons["Get Lifecycle Events"].firstMatch
XCTAssertTrue(button.waitForExistence(timeout: 5))
button.tap()
let expectedStartEvents = [
"applicationDidFinishLaunchingWithOptions", "sceneWillConnect",
"sceneWillEnterForeground", "sceneDidBecomeActive",
]
let startEventsPredicate = NSPredicate(
format: "label == %@",
expectedStartEvents.joined(separator: "\n")
)
let startEventsElement = app.staticTexts.element(
matching: startEventsPredicate
)
XCTAssertTrue(startEventsElement.waitForExistence(timeout: 5))
// Background the app, then reactivate it and check the events again
XCUIDevice.shared.press(.home)
app.activate()
XCTAssertTrue(button.waitForExistence(timeout: 5))
button.tap()
let expectedEventsAfterBackgroundAndReactivate = [
"applicationDidFinishLaunchingWithOptions", "sceneWillConnect",
"sceneWillEnterForeground", "sceneDidBecomeActive",
"sceneWillResignActive", "sceneDidEnterBackground",
"sceneWillEnterForeground", "sceneDidBecomeActive",
]
let backgroundEventsPredicate = NSPredicate(
format: "label == %@",
expectedEventsAfterBackgroundAndReactivate.joined(separator: "\n")
)
let backgroundEventsElement = app.staticTexts.element(
matching: backgroundEventsPredicate
)
XCTAssertTrue(backgroundEventsElement.waitForExistence(timeout: 5))
}
}