From 679a7adb3596eda32db966dfcbb225d110393687 Mon Sep 17 00:00:00 2001 From: gaaclarke <30870216+gaaclarke@users.noreply.github.com> Date: Fri, 2 Jul 2021 18:21:01 -0700 Subject: [PATCH] Follow up cleanup of some unit tests for right click handling. (#27152) --- .../ScenariosUITests/iPadGestureTests.m | 99 +++++++++++-------- 1 file changed, 59 insertions(+), 40 deletions(-) diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/iPadGestureTests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/iPadGestureTests.m index 2f6d9c9237f12..57149ea741831 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/iPadGestureTests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/iPadGestureTests.m @@ -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* _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* _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