| // 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; |
| |
| self.app = [[XCUIApplication alloc] init]; |
| [self.app launch]; |
| } |
| |
| - (void)tearDown { |
| // This is trying to fix a "failed to terminate" failure, which is likely a bug in Xcode. |
| // In theory the terminate call is not necessary, but many has encountered this similar |
| // issue, and fixed it by terminating the app and relaunching it if needed for each test. |
| // Here we simply try terminating the app in tearDown, but if it does not work, |
| // then alternative solution is to terminate and relaunch the app. |
| [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 |