| // 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; |
| |
| static const CGFloat kStandardTimeOut = 60.0; |
| |
| @interface XCUIElement(KeyboardFocus) |
| @property (nonatomic, readonly) BOOL flt_hasKeyboardFocus; |
| @end |
| |
| @implementation XCUIElement(KeyboardFocus) |
| - (BOOL)flt_hasKeyboardFocus { |
| return [[self valueForKey:@"hasKeyboardFocus"] boolValue]; |
| } |
| @end |
| |
| @interface PlatformViewUITests : XCTestCase |
| @property (strong) XCUIApplication *app; |
| @end |
| |
| @implementation PlatformViewUITests |
| |
| - (void)setUp { |
| [super setUp]; |
| self.continueAfterFailure = NO; |
| |
| // Retry launching the app if it fails to launch. |
| // This is trying to fix a "failed to terminate" failure, which is likely a bug in Xcode. |
| // The solution is based on https://stackoverflow.com/questions/41872848/xctests-failing-to-launch-app-in-simulator-intermittently |
| int remainingLaunchCount = 10; |
| while (true) { |
| self.app = [[XCUIApplication alloc] init]; |
| [self.app launch]; |
| remainingLaunchCount -= 1; |
| [NSThread sleepForTimeInterval:3]; |
| if (self.app.exists) { |
| // success launch |
| break; |
| } |
| |
| if (remainingLaunchCount > 0) { |
| NSLog(@"Retry launch with remaining launch count %d", remainingLaunchCount); |
| [self.app terminate]; |
| [NSThread sleepForTimeInterval:3]; |
| continue; |
| } |
| |
| NSLog(@"Failed to launch"); |
| } |
| } |
| |
| - (void)tearDown { |
| [self.app terminate]; |
| [super tearDown]; |
| } |
| |
| - (void)testPlatformViewFocus { |
| XCUIElement *entranceButton = self.app.buttons[@"platform view focus test"]; |
| XCTAssertTrue([entranceButton waitForExistenceWithTimeout:kStandardTimeOut], @"The element tree is %@", self.app.debugDescription); |
| [entranceButton tap]; |
| |
| XCUIElement *platformView = self.app.textFields[@"platform_view[0]"]; |
| XCTAssertTrue([platformView waitForExistenceWithTimeout:kStandardTimeOut]); |
| XCUIElement *flutterTextField = self.app.textFields[@"Flutter Text Field"]; |
| XCTAssertTrue([flutterTextField waitForExistenceWithTimeout:kStandardTimeOut]); |
| |
| [flutterTextField tap]; |
| XCTAssertTrue([self.app.windows.element waitForExistenceWithTimeout:kStandardTimeOut]); |
| XCTAssertFalse(platformView.flt_hasKeyboardFocus); |
| XCTAssertTrue(flutterTextField.flt_hasKeyboardFocus); |
| |
| // Tapping on platformView should unfocus the previously focused flutterTextField |
| [platformView tap]; |
| XCTAssertTrue(platformView.flt_hasKeyboardFocus); |
| XCTAssertFalse(flutterTextField.flt_hasKeyboardFocus); |
| } |
| |
| @end |