115 lines
4.1 KiB
Plaintext
115 lines
4.1 KiB
Plaintext
#import <Flutter/Flutter.h>
|
|
#import <UIKit/UIKit.h>
|
|
#import <XCTest/XCTest.h>
|
|
|
|
@interface FlutterTextInputView : UIView
|
|
@property(nonatomic, readonly) UITextField* tvosTextInputProxy;
|
|
@end
|
|
|
|
@interface FlutterTextInputPlugin : NSObject
|
|
@property(nonatomic, weak) UIViewController* viewController;
|
|
- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result;
|
|
- (UIView<UITextInput>*)textInputView;
|
|
@end
|
|
|
|
@interface FlutterEngine (NativeTextInputTests)
|
|
- (FlutterTextInputPlugin*)textInputPlugin;
|
|
@end
|
|
|
|
@interface FlutterViewController (NativeTextInputTests)
|
|
@property(nonatomic, assign, getter=isTvosNativeTextInputActive) BOOL tvosNativeTextInputActive;
|
|
@end
|
|
|
|
@interface FlutterNativeTextInputTests : XCTestCase
|
|
@end
|
|
|
|
@implementation FlutterNativeTextInputTests {
|
|
FlutterEngine* _engine;
|
|
FlutterViewController* _flutterViewController;
|
|
UIWindow* _window;
|
|
FlutterTextInputPlugin* _textInputPlugin;
|
|
}
|
|
|
|
- (void)setUp {
|
|
[super setUp];
|
|
id<UIApplicationDelegate> appDelegate = UIApplication.sharedApplication.delegate;
|
|
_window = appDelegate.window;
|
|
_flutterViewController = (FlutterViewController*)_window.rootViewController;
|
|
XCTAssertTrue([_flutterViewController isKindOfClass:[FlutterViewController class]]);
|
|
_engine = _flutterViewController.engine;
|
|
_textInputPlugin = [_engine textInputPlugin];
|
|
XCTAssertNotNil(_textInputPlugin);
|
|
}
|
|
- (void)tearDown {
|
|
[self invokeTextInput:@"TextInput.hide" arguments:nil];
|
|
[self invokeTextInput:@"TextInput.clearClient" arguments:nil];
|
|
_textInputPlugin = nil;
|
|
_engine = nil;
|
|
_flutterViewController = nil;
|
|
_window = nil;
|
|
[super tearDown];
|
|
}
|
|
|
|
- (void)testPackagedEngineUsesRealUITextFieldProxyAndNativeSessionRouting {
|
|
[self invokeTextInput:@"TextInput.setClient"
|
|
arguments:@[
|
|
@123,
|
|
@{
|
|
@"inputType" : @{@"name" : @"TextInputType.url"},
|
|
@"keyboardAppearance" : @"Brightness.dark",
|
|
@"obscureText" : @NO,
|
|
@"inputAction" : @"TextInputAction.done",
|
|
@"smartDashesType" : @"0",
|
|
@"smartQuotesType" : @"0",
|
|
@"autocorrect" : @NO,
|
|
@"enableInteractiveSelection" : @YES,
|
|
},
|
|
]];
|
|
[self invokeTextInput:@"TextInput.setEditingState"
|
|
arguments:@{
|
|
@"text" : @"plezy.local",
|
|
@"selectionBase" : @2,
|
|
@"selectionExtent" : @7,
|
|
@"selectionAffinity" : @"TextAffinity.downstream",
|
|
@"composingBase" : @(-1),
|
|
@"composingExtent" : @(-1),
|
|
}];
|
|
|
|
FlutterTextInputView* inputView = (FlutterTextInputView*)[_textInputPlugin textInputView];
|
|
UITextField* proxy = inputView.tvosTextInputProxy;
|
|
XCTAssertNotNil(proxy);
|
|
XCTAssertEqualObjects(proxy.text, @"plezy.local");
|
|
XCTAssertEqual(proxy.keyboardType, UIKeyboardTypeURL);
|
|
XCTAssertEqual(proxy.returnKeyType, UIReturnKeyDone);
|
|
XCTAssertEqual(proxy.autocorrectionType, UITextAutocorrectionTypeNo);
|
|
XCTAssertEqual([proxy offsetFromPosition:proxy.beginningOfDocument toPosition:proxy.selectedTextRange.start], 2);
|
|
XCTAssertEqual([proxy offsetFromPosition:proxy.beginningOfDocument toPosition:proxy.selectedTextRange.end], 7);
|
|
|
|
[self invokeTextInput:@"TextInput.show" arguments:nil];
|
|
[self waitForMainRunLoop];
|
|
XCTAssertTrue(proxy.isFirstResponder);
|
|
XCTAssertTrue(_flutterViewController.tvosNativeTextInputActive);
|
|
|
|
[self invokeTextInput:@"TextInput.hide" arguments:nil];
|
|
[self waitForMainRunLoop];
|
|
XCTAssertFalse(proxy.isFirstResponder);
|
|
XCTAssertFalse(_flutterViewController.tvosNativeTextInputActive);
|
|
}
|
|
|
|
- (void)invokeTextInput:(NSString*)method arguments:(id)arguments {
|
|
FlutterMethodCall* call = [FlutterMethodCall methodCallWithMethodName:method arguments:arguments];
|
|
[_textInputPlugin handleMethodCall:call
|
|
result:^(id result){
|
|
}];
|
|
}
|
|
|
|
- (void)waitForMainRunLoop {
|
|
XCTestExpectation* expectation = [self expectationWithDescription:@"main run loop"];
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
[expectation fulfill];
|
|
});
|
|
[self waitForExpectations:@[ expectation ] timeout:2];
|
|
}
|
|
|
|
@end
|