Skip to content

Commit

Permalink
Follow up cleanup of some unit tests for right click handling. (flutt…
Browse files Browse the repository at this point in the history
  • Loading branch information
gaaclarke authored Jul 3, 2021
1 parent 2dacffa commit 679a7ad
Showing 1 changed file with 59 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,50 +17,69 @@ - (void)setUp {
self.continueAfterFailure = NO;
}

#ifdef __IPHONE_15_0
static BOOL performBoolSelector(id target, SEL selector) {
NSInvocation* invocation = [NSInvocation
invocationWithMethodSignature:[[target class] instanceMethodSignatureForSelector:selector]];
[invocation setSelector:selector];
[invocation setTarget:target];
[invocation invoke];
BOOL returnValue;
[invocation getReturnValue:&returnValue];
return returnValue;
}

// TODO(85810): Remove reflection in this test when Xcode version is upgraded to 13.
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
- (void)testPointerButtons {
if (@available(iOS 15, *)) {
XCTSkipUnless([XCUIDevice.sharedDevice supportsPointerInteraction],
"Device does not support pointer interaction");
XCUIApplication* app = [[XCUIApplication alloc] init];
app.launchArguments = @[ @"--pointer-events" ];
[app launch];
BOOL supportsPointerInteraction = NO;
SEL supportsPointerInteractionSelector = @selector(supportsPointerInteraction);
if ([XCUIDevice.sharedDevice respondsToSelector:supportsPointerInteractionSelector]) {
supportsPointerInteraction =
performBoolSelector(XCUIDevice.sharedDevice, supportsPointerInteractionSelector);
}
XCTSkipUnless(supportsPointerInteraction, "Device does not support pointer interaction.");
XCUIApplication* app = [[XCUIApplication alloc] init];
app.launchArguments = @[ @"--pointer-events" ];
[app launch];

NSPredicate* predicateToFindFlutterView =
[NSPredicate predicateWithBlock:^BOOL(id _Nullable evaluatedObject,
NSDictionary<NSString*, id>* _Nullable bindings) {
XCUIElement* element = evaluatedObject;
return [element.identifier hasPrefix:@"flutter_view"];
}];
XCUIElement* flutterView = [[app descendantsMatchingType:XCUIElementTypeAny]
elementMatchingPredicate:predicateToFindFlutterView];
if (![flutterView waitForExistenceWithTimeout:kSecondsToWaitForFlutterView]) {
NSLog(@"%@", app.debugDescription);
XCTFail(@"Failed due to not able to find any flutterView with %@ seconds",
@(kSecondsToWaitForFlutterView));
}
NSPredicate* predicateToFindFlutterView =
[NSPredicate predicateWithBlock:^BOOL(id _Nullable evaluatedObject,
NSDictionary<NSString*, id>* _Nullable bindings) {
XCUIElement* element = evaluatedObject;
return [element.identifier hasPrefix:@"flutter_view"];
}];
XCUIElement* flutterView = [[app descendantsMatchingType:XCUIElementTypeAny]
elementMatchingPredicate:predicateToFindFlutterView];
if (![flutterView waitForExistenceWithTimeout:kSecondsToWaitForFlutterView]) {
NSLog(@"%@", app.debugDescription);
XCTFail(@"Failed due to not able to find any flutterView with %@ seconds",
@(kSecondsToWaitForFlutterView));
}

XCTAssertNotNil(flutterView);
XCTAssertNotNil(flutterView);

[flutterView tap];
// Initial add event should have buttons = 0
XCTAssertTrue([app.textFields[@"PointerChange.add:0"] waitForExistenceWithTimeout:1],
@"PointerChange.add event did not occur");
// Normal tap should have buttons = 0, the flutter framework will ensure it has buttons = 1
XCTAssertTrue([app.textFields[@"PointerChange.down:0"] waitForExistenceWithTimeout:1],
@"PointerChange.down event did not occur for a normal tap");
XCTAssertTrue([app.textFields[@"PointerChange.up:0"] waitForExistenceWithTimeout:1],
@"PointerChange.up event did not occur for a normal tap");
[flutterView rightClick];
// Since each touch is its own device, we can't distinguish the other add event(s)
// Right click should have buttons = 2
XCTAssertTrue([app.textFields[@"PointerChange.down:2"] waitForExistenceWithTimeout:1],
@"PointerChange.down event did not occur for a right-click");
XCTAssertTrue([app.textFields[@"PointerChange.up:2"] waitForExistenceWithTimeout:1],
@"PointerChange.up event did not occur for a right-click");
NSLog(@"DebugDescriptionX: %@", app.debugDescription);
}
[flutterView tap];
// Initial add event should have buttons = 0
XCTAssertTrue([app.textFields[@"PointerChange.add:0"] waitForExistenceWithTimeout:1],
@"PointerChange.add event did not occur");
// Normal tap should have buttons = 0, the flutter framework will ensure it has buttons = 1
XCTAssertTrue([app.textFields[@"PointerChange.down:0"] waitForExistenceWithTimeout:1],
@"PointerChange.down event did not occur for a normal tap");
XCTAssertTrue([app.textFields[@"PointerChange.up:0"] waitForExistenceWithTimeout:1],
@"PointerChange.up event did not occur for a normal tap");
SEL rightClick = @selector(rightClick);
XCTAssertTrue([flutterView respondsToSelector:rightClick],
@"If supportsPointerInteraction is true, this should be true too.");
[flutterView performSelector:rightClick];
// Since each touch is its own device, we can't distinguish the other add event(s)
// Right click should have buttons = 2
XCTAssertTrue([app.textFields[@"PointerChange.down:2"] waitForExistenceWithTimeout:1],
@"PointerChange.down event did not occur for a right-click");
XCTAssertTrue([app.textFields[@"PointerChange.up:2"] waitForExistenceWithTimeout:1],
@"PointerChange.up event did not occur for a right-click");
}
#endif
#pragma clang diagnostic pop

@end

0 comments on commit 679a7ad

Please sign in to comment.