From 7418e7e4a8208e1aa95bb98b4055e3b7bc95fec1 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 27 Aug 2019 15:30:01 -0700 Subject: [PATCH 01/10] wait for platform view appear --- .../ScenariosUITests/PlatformViewUITests.m | 11 ++++++++++- .../golden_platform_view_D321AP.png | Bin 0 -> 98725 bytes 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_D321AP.png diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m index e0a929572b81e..e0982aaecd6e6 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m @@ -24,12 +24,21 @@ - (void)setUp { } - (void)testPlatformView { + + XCUIElement *element = self.application.textViews.firstMatch; + BOOL exists = [element waitForExistenceWithTimeout:5]; + if (!exists) { + XCTFail(@"It took longer than 3 second to find the platform view." + @"There might be issues with the platform view's construction, + @"or with how the scenario is built."); + } + NSBundle* bundle = [NSBundle bundleForClass:[self class]]; NSString* goldenName = [NSString stringWithFormat:@"golden_platform_view_%@", [self platformName]]; NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; - + XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; attachment.lifetime = XCTAttachmentLifetimeKeepAlways; diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_D321AP.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_D321AP.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc639f672890b3b83cd086c0447617e21785cf9 GIT binary patch literal 98725 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 Date: Wed, 28 Aug 2019 14:17:45 -0700 Subject: [PATCH 02/10] add uitest for all the available mutations --- .../framework/Source/FlutterPlatformViews.mm | 2 +- .../Scenarios.xcodeproj/project.pbxproj | 30 ++ .../ios/Scenarios/Scenarios/AppDelegate.m | 50 +-- .../Scenarios/Scenarios/TextPlatformView.m | 1 + .../PlatformViewMutationTests.m | 288 ++++++++++++++++++ .../ScenariosUITests/PlatformViewUITestUtil.h | 19 ++ .../ScenariosUITests/PlatformViewUITestUtil.m | 76 +++++ .../ScenariosUITests/PlatformViewUITests.m | 86 +----- ...form_view_clippath_iPhone SE_simulator.png | Bin 0 -> 27336 bytes ...form_view_cliprect_iPhone SE_simulator.png | Bin 0 -> 23290 bytes ...orm_view_cliprrect_iPhone SE_simulator.png | Bin 0 -> 26625 bytes ...tform_view_opacity_iPhone SE_simulator.png | Bin 0 -> 28019 bytes ...orm_view_transform_iPhone SE_simulator.png | Bin 0 -> 27591 bytes testing/scenario_app/lib/main.dart | 7 +- .../scenario_app/lib/src/platform_view.dart | 220 +++++++++++-- 15 files changed, 662 insertions(+), 117 deletions(-) create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewMutationTests.m create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.h create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.m create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_iPhone SE_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_iPhone SE_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_iPhone SE_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_opacity_iPhone SE_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_iPhone SE_simulator.png diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index 00a7c9ecda5bd..42e5dfc2d456a 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -252,7 +252,7 @@ } // If there were not enough existing clip views, add more. while (clipIndex < number_of_clips) { - ChildClippingView* clippingView = [ChildClippingView new]; + ChildClippingView* clippingView = [[ChildClippingView alloc] initWithFrame:flutter_view_.get().bounds]; [clippingView addSubview:head]; head = clippingView; clipIndex++; diff --git a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj index c7fe99847ea68..34b46f8f655a0 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj +++ b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj @@ -27,6 +27,13 @@ 24D47D1B230C79840069DD5E /* golden_platform_view_D211AP.png in Resources */ = {isa = PBXBuildFile; fileRef = 24D47D1A230C79840069DD5E /* golden_platform_view_D211AP.png */; }; 24D47D1D230CA2700069DD5E /* golden_platform_view_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 24D47D1C230CA2700069DD5E /* golden_platform_view_iPhone SE_simulator.png */; }; 24F1FB89230B4579005ACE7C /* TextPlatformView.m in Sources */ = {isa = PBXBuildFile; fileRef = 24F1FB87230B4579005ACE7C /* TextPlatformView.m */; }; + 6816DB8F2315E72D00A51400 /* PlatformViewUITestUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 6816DB8E2315E72D00A51400 /* PlatformViewUITestUtil.m */; }; + 6816DB912315E7E000A51400 /* PlatformViewMutationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6816DB902315E7E000A51400 /* PlatformViewMutationTests.m */; }; + 6816DB952316F67600A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DB922316F67500A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png */; }; + 6816DB962316F67600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DB932316F67600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png */; }; + 6816DB972316F67600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DB942316F67600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png */; }; + 6816DB99231717B600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DB98231717B600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png */; }; + 6816DB9B231723A700A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DB9A231723A700A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -105,6 +112,14 @@ 24D47D1E230CA4480069DD5E /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 24F1FB87230B4579005ACE7C /* TextPlatformView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TextPlatformView.m; sourceTree = ""; }; 24F1FB88230B4579005ACE7C /* TextPlatformView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextPlatformView.h; sourceTree = ""; }; + 6816DB8D2315E72D00A51400 /* PlatformViewUITestUtil.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlatformViewUITestUtil.h; sourceTree = ""; }; + 6816DB8E2315E72D00A51400 /* PlatformViewUITestUtil.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PlatformViewUITestUtil.m; sourceTree = ""; }; + 6816DB902315E7E000A51400 /* PlatformViewMutationTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PlatformViewMutationTests.m; sourceTree = ""; }; + 6816DB922316F67500A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_clippath_iPhone SE_simulator.png"; sourceTree = ""; }; + 6816DB932316F67600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprrect_iPhone SE_simulator.png"; sourceTree = ""; }; + 6816DB942316F67600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprect_iPhone SE_simulator.png"; sourceTree = ""; }; + 6816DB98231717B600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_transform_iPhone SE_simulator.png"; sourceTree = ""; }; + 6816DB9A231723A700A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_opacity_iPhone SE_simulator.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -187,9 +202,17 @@ 244EA6CF230DBE8900B2D26E /* golden_platform_view_D21AP.png */, 24D47D1C230CA2700069DD5E /* golden_platform_view_iPhone SE_simulator.png */, 24D47D1A230C79840069DD5E /* golden_platform_view_D211AP.png */, + 6816DB922316F67500A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png */, + 6816DB932316F67600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png */, + 6816DB942316F67600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png */, + 6816DB98231717B600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png */, + 6816DB9A231723A700A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png */, 248D76EE22E388380012F0C1 /* PlatformViewUITests.m */, 248D76F022E388380012F0C1 /* Info.plist */, 24D47D1E230CA4480069DD5E /* README.md */, + 6816DB8D2315E72D00A51400 /* PlatformViewUITestUtil.h */, + 6816DB8E2315E72D00A51400 /* PlatformViewUITestUtil.m */, + 6816DB902315E7E000A51400 /* PlatformViewMutationTests.m */, ); path = ScenariosUITests; sourceTree = ""; @@ -325,8 +348,13 @@ buildActionMask = 2147483647; files = ( 24D47D1B230C79840069DD5E /* golden_platform_view_D211AP.png in Resources */, + 6816DB972316F67600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png in Resources */, + 6816DB952316F67600A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png in Resources */, + 6816DB962316F67600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png in Resources */, + 6816DB99231717B600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png in Resources */, 24D47D1D230CA2700069DD5E /* golden_platform_view_iPhone SE_simulator.png in Resources */, 244EA6D0230DBE8900B2D26E /* golden_platform_view_D21AP.png in Resources */, + 6816DB9B231723A700A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -356,7 +384,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 6816DB912315E7E000A51400 /* PlatformViewMutationTests.m in Sources */, 248D76EF22E388380012F0C1 /* PlatformViewUITests.m in Sources */, + 6816DB8F2315E72D00A51400 /* PlatformViewUITestUtil.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m index 38e14bda4f359..2e497fe80f1c5 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m +++ b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m @@ -20,24 +20,17 @@ - (BOOL)application:(UIApplication*)application // This argument is used by the XCUITest for Platform Views so that the app // under test will create platform views. if ([[[NSProcessInfo processInfo] arguments] containsObject:@"--platform-view"]) { - FlutterEngine* engine = [[FlutterEngine alloc] initWithName:@"PlatformViewTest" project:nil]; - [engine runWithEntrypoint:nil]; - - FlutterViewController* flutterViewController = - [[NoStatusBarFlutterViewController alloc] initWithEngine:engine nibName:nil bundle:nil]; - [engine.binaryMessenger - setMessageHandlerOnChannel:@"scenario_status" - binaryMessageHandler:^(NSData* _Nullable message, FlutterBinaryReply _Nonnull reply) { - [engine.binaryMessenger - sendOnChannel:@"set_scenario" - message:[@"text_platform_view" dataUsingEncoding:NSUTF8StringEncoding]]; - }]; - TextPlatformViewFactory* textPlatformViewFactory = - [[TextPlatformViewFactory alloc] initWithMessenger:flutterViewController.binaryMessenger]; - NSObject* registrar = - [flutterViewController.engine registrarForPlugin:@"scenarios/TextPlatformViewPlugin"]; - [registrar registerViewFactory:textPlatformViewFactory withId:@"scenarios/textPlatformView"]; - self.window.rootViewController = flutterViewController; + [self readyContextForPlatformViewTests:@"text_platform_view"]; + } else if ([[[NSProcessInfo processInfo] arguments] containsObject:@"--platform-view-cliprect"]) { + [self readyContextForPlatformViewTests:@"platform_view_cliprect"]; + } else if ([[[NSProcessInfo processInfo] arguments] containsObject:@"--platform-view-cliprrect"]) { + [self readyContextForPlatformViewTests:@"platform_view_cliprrect"]; + } else if ([[[NSProcessInfo processInfo] arguments] containsObject:@"--platform-view-clippath"]) { + [self readyContextForPlatformViewTests:@"platform_view_clippath"]; + } else if ([[[NSProcessInfo processInfo] arguments] containsObject:@"--platform-view-transform"]) { + [self readyContextForPlatformViewTests:@"platform_view_transform"]; + } else if ([[[NSProcessInfo processInfo] arguments] containsObject:@"--platform-view-opacity"]) { + [self readyContextForPlatformViewTests:@"platform_view_opacity"]; } else { self.window.rootViewController = [[UIViewController alloc] init]; } @@ -46,4 +39,25 @@ - (BOOL)application:(UIApplication*)application return [super application:application didFinishLaunchingWithOptions:launchOptions]; } +- (void)readyContextForPlatformViewTests:(NSString *)scenarioMessage { + FlutterEngine* engine = [[FlutterEngine alloc] initWithName:@"PlatformViewTest" project:nil]; + [engine runWithEntrypoint:nil]; + + FlutterViewController* flutterViewController = + [[NoStatusBarFlutterViewController alloc] initWithEngine:engine nibName:nil bundle:nil]; + [engine.binaryMessenger + setMessageHandlerOnChannel:@"scenario_status" + binaryMessageHandler:^(NSData* _Nullable message, FlutterBinaryReply _Nonnull reply) { + [engine.binaryMessenger + sendOnChannel:@"set_scenario" + message:[scenarioMessage dataUsingEncoding:NSUTF8StringEncoding]]; + }]; + TextPlatformViewFactory* textPlatformViewFactory = + [[TextPlatformViewFactory alloc] initWithMessenger:flutterViewController.binaryMessenger]; + NSObject* registrar = + [flutterViewController.engine registrarForPlugin:@"scenarios/TextPlatformViewPlugin"]; + [registrar registerViewFactory:textPlatformViewFactory withId:@"scenarios/textPlatformView"]; + self.window.rootViewController = flutterViewController; +} + @end diff --git a/testing/scenario_app/ios/Scenarios/Scenarios/TextPlatformView.m b/testing/scenario_app/ios/Scenarios/Scenarios/TextPlatformView.m index c75b5c815d0d6..4e4eb792f9752 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios/TextPlatformView.m +++ b/testing/scenario_app/ios/Scenarios/Scenarios/TextPlatformView.m @@ -49,6 +49,7 @@ - (instancetype)initWithFrame:(CGRect)frame _textView.backgroundColor = UIColor.lightGrayColor; [_textView setFont:[UIFont systemFontOfSize:52]]; _textView.text = args; + _textView.accessibilityIdentifier = @"i am a textview"; } return self; } diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewMutationTests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewMutationTests.m new file mode 100644 index 0000000000000..c1f2e636bd04b --- /dev/null +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewMutationTests.m @@ -0,0 +1,288 @@ +// Copyright 2013 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 +#import "../Scenarios/TextPlatformView.h" +#import "PlatformViewUITestUtil.h" + +// Clip Rect Tests +@interface PlatformViewMutationClipRectTests : XCTestCase + +@property(nonatomic, strong) XCUIApplication* application; + +@end + +@implementation PlatformViewMutationClipRectTests + +- (void)setUp { + [super setUp]; + self.continueAfterFailure = NO; + + self.application = [[XCUIApplication alloc] init]; + self.application.launchArguments = @[@"--platform-view-cliprect"]; + [self.application launch]; +} + +- (void)testPlatformView { + + XCUIElement *element = self.application.textViews.firstMatch; + BOOL exists = [element waitForExistenceWithTimeout:kTimeToWaitForPlatformView]; + if (!exists) { + XCTFail(@"It took longer than %@ second to find the platform view." + @"There might be issues with the platform view's construction," + @"or with how the scenario is built.", @(kTimeToWaitForPlatformView)); + } + + NSBundle* bundle = [NSBundle bundleForClass:[self class]]; + NSString* goldenName = + [NSString stringWithFormat:@"golden_platform_view_cliprect_%@", [PlatformViewUITestUtil platformName]]; + NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; + UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; + + XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; + XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; + attachment.name = @"current screen shot"; + attachment.lifetime = XCTAttachmentLifetimeKeepAlways; + [self addAttachment:attachment]; + + if (golden) { + XCTAttachment* goldenAttachment = [XCTAttachment attachmentWithImage:golden]; + goldenAttachment.lifetime = XCTAttachmentLifetimeKeepAlways; + goldenAttachment.name = @"golden"; + [self addAttachment:goldenAttachment]; + } else { + XCTFail(@"This test will fail - no golden named %@ found. Follow the steps in the " + @"README to add a new golden.", + goldenName); + } + + XCTAssertTrue([PlatformViewUITestUtil compareImage:golden toOther:screenshot.image]); +} + +@end + +// Clip RRect Tests +@interface PlatformViewMutationClipRRectTests : XCTestCase + +@property(nonatomic, strong) XCUIApplication* application; + +@end + +@implementation PlatformViewMutationClipRRectTests + +- (void)setUp { + [super setUp]; + self.continueAfterFailure = NO; + + self.application = [[XCUIApplication alloc] init]; + self.application.launchArguments = @[@"--platform-view-cliprrect"]; + [self.application launch]; +} + +- (void)testPlatformView { + + XCUIElement *element = self.application.otherElements.firstMatch; + BOOL exists = [element waitForExistenceWithTimeout:kTimeToWaitForPlatformView]; + if (!exists) { + XCTFail(@"It took longer than %@ second to find the platform view." + @"There might be issues with the platform view's construction," + @"or with how the scenario is built.", @(kTimeToWaitForPlatformView)); + } + + NSBundle* bundle = [NSBundle bundleForClass:[self class]]; + NSString* goldenName = + [NSString stringWithFormat:@"golden_platform_view_cliprrect_%@", [PlatformViewUITestUtil platformName]]; + NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; + UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; + + XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; + XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; + attachment.name = @"current screen shot"; + attachment.lifetime = XCTAttachmentLifetimeKeepAlways; + [self addAttachment:attachment]; + + if (golden) { + XCTAttachment* goldenAttachment = [XCTAttachment attachmentWithImage:golden]; + goldenAttachment.lifetime = XCTAttachmentLifetimeKeepAlways; + goldenAttachment.name = @"golden"; + [self addAttachment:goldenAttachment]; + } else { + XCTFail(@"This test will fail - no golden named %@ found. Follow the steps in the " + @"README to add a new golden.", + goldenName); + } + + XCTAssertTrue([PlatformViewUITestUtil compareImage:golden toOther:screenshot.image]); +} + +@end + +// Clip Path Tests +@interface PlatformViewMutationClipPathTests : XCTestCase + +@property(nonatomic, strong) XCUIApplication* application; + +@end + +@implementation PlatformViewMutationClipPathTests + +- (void)setUp { + [super setUp]; + self.continueAfterFailure = NO; + + self.application = [[XCUIApplication alloc] init]; + self.application.launchArguments = @[@"--platform-view-clippath"]; + [self.application launch]; +} + +- (void)testPlatformView { + + XCUIElement *element = self.application.otherElements.firstMatch; + BOOL exists = [element waitForExistenceWithTimeout:kTimeToWaitForPlatformView]; + if (!exists) { + XCTFail(@"It took longer than %@ second to find the platform view." + @"There might be issues with the platform view's construction," + @"or with how the scenario is built.", @(kTimeToWaitForPlatformView)); + } + + NSBundle* bundle = [NSBundle bundleForClass:[self class]]; + NSString* goldenName = + [NSString stringWithFormat:@"golden_platform_view_clippath_%@", [PlatformViewUITestUtil platformName]]; + NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; + UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; + + XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; + XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; + attachment.name = @"current screen shot"; + attachment.lifetime = XCTAttachmentLifetimeKeepAlways; + [self addAttachment:attachment]; + + if (golden) { + XCTAttachment* goldenAttachment = [XCTAttachment attachmentWithImage:golden]; + goldenAttachment.lifetime = XCTAttachmentLifetimeKeepAlways; + goldenAttachment.name = @"golden"; + [self addAttachment:goldenAttachment]; + } else { + XCTFail(@"This test will fail - no golden named %@ found. Follow the steps in the " + @"README to add a new golden.", + goldenName); + } + + XCTAssertTrue([PlatformViewUITestUtil compareImage:golden toOther:screenshot.image]); +} + +@end + +// Transform tests +@interface PlatformViewMutationTransformTests : XCTestCase + +@property(nonatomic, strong) XCUIApplication* application; + +@end + +@implementation PlatformViewMutationTransformTests + +- (void)setUp { + [super setUp]; + self.continueAfterFailure = NO; + + self.application = [[XCUIApplication alloc] init]; + self.application.launchArguments = @[@"--platform-view-transform"]; + [self.application launch]; +} + +- (void)testPlatformView { + + XCUIElement *element = self.application.otherElements.firstMatch; + BOOL exists = [element waitForExistenceWithTimeout:kTimeToWaitForPlatformView]; + if (!exists) { + XCTFail(@"It took longer than %@ second to find the platform view." + @"There might be issues with the platform view's construction," + @"or with how the scenario is built.", @(kTimeToWaitForPlatformView)); + } + + NSBundle* bundle = [NSBundle bundleForClass:[self class]]; + NSString* goldenName = + [NSString stringWithFormat:@"golden_platform_view_transform_%@", [PlatformViewUITestUtil platformName]]; + NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; + UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; + + XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; + XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; + attachment.name = @"current screen shot"; + attachment.lifetime = XCTAttachmentLifetimeKeepAlways; + [self addAttachment:attachment]; + + if (golden) { + XCTAttachment* goldenAttachment = [XCTAttachment attachmentWithImage:golden]; + goldenAttachment.lifetime = XCTAttachmentLifetimeKeepAlways; + goldenAttachment.name = @"golden"; + [self addAttachment:goldenAttachment]; + } else { + XCTFail(@"This test will fail - no golden named %@ found. Follow the steps in the " + @"README to add a new golden.", + goldenName); + } + + XCTAssertTrue([PlatformViewUITestUtil compareImage:golden toOther:screenshot.image]); +} + +@end + +// Opacity tests +@interface PlatformViewMutationOpacityTests : XCTestCase + +@property(nonatomic, strong) XCUIApplication* application; + +@end + +@implementation PlatformViewMutationOpacityTests + +- (void)setUp { + [super setUp]; + self.continueAfterFailure = NO; + + self.application = [[XCUIApplication alloc] init]; + self.application.launchArguments = @[@"--platform-view-opacity"]; + [self.application launch]; +} + +- (void)testPlatformView { + + XCUIElement *element = self.application.textViews.firstMatch; + BOOL exists = [element waitForExistenceWithTimeout:kTimeToWaitForPlatformView]; + if (!exists) { + XCTFail(@"It took longer than %@ second to find the platform view." + @"There might be issues with the platform view's construction," + @"or with how the scenario is built.", @(kTimeToWaitForPlatformView)); + } + + + NSBundle* bundle = [NSBundle bundleForClass:[self class]]; + NSString* goldenName = + [NSString stringWithFormat:@"golden_platform_view_opacity_%@", [PlatformViewUITestUtil platformName]]; + NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; + UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; + + XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; + XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; + attachment.name = @"current screen shot"; + attachment.lifetime = XCTAttachmentLifetimeKeepAlways; + [self addAttachment:attachment]; + + if (golden) { + XCTAttachment* goldenAttachment = [XCTAttachment attachmentWithImage:golden]; + goldenAttachment.lifetime = XCTAttachmentLifetimeKeepAlways; + goldenAttachment.name = @"golden"; + [self addAttachment:goldenAttachment]; + } else { + XCTFail(@"This test will fail - no golden named %@ found. Follow the steps in the " + @"README to add a new golden.", + goldenName); + } + + XCTAssertTrue([PlatformViewUITestUtil compareImage:golden toOther:screenshot.image]); +} + +@end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.h b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.h new file mode 100644 index 0000000000000..4c02c360e8586 --- /dev/null +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.h @@ -0,0 +1,19 @@ +// Copyright 2013 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 + +NS_ASSUME_NONNULL_BEGIN + +extern const NSInteger kTimeToWaitForPlatformView; + +@interface PlatformViewUITestUtil : NSObject + ++ (NSString*)platformName; + ++ (BOOL)compareImage:(UIImage*)a toOther:(UIImage*)b; + +@end + +NS_ASSUME_NONNULL_END diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.m new file mode 100644 index 0000000000000..ed0185b7f7896 --- /dev/null +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.m @@ -0,0 +1,76 @@ +// Copyright 2013 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 "PlatformViewUITestUtil.h" +#include + +const NSInteger kTimeToWaitForPlatformView = 5; + +@implementation PlatformViewUITestUtil + ++ (NSString*)platformName { + NSString* simulatorName = + [[NSProcessInfo processInfo].environment objectForKey:@"SIMULATOR_DEVICE_NAME"]; + if (simulatorName) { + return [NSString stringWithFormat:@"%@_simulator", simulatorName]; + } + + size_t size; + sysctlbyname("hw.model", NULL, &size, NULL, 0); + char* answer = malloc(size); + sysctlbyname("hw.model", answer, &size, NULL, 0); + + NSString* results = [NSString stringWithCString:answer encoding:NSUTF8StringEncoding]; + free(answer); + return results; +} + ++ (BOOL)compareImage:(UIImage*)a toOther:(UIImage*)b { + CGImageRef imageRefA = [a CGImage]; + CGImageRef imageRefB = [b CGImage]; + + NSUInteger widthA = CGImageGetWidth(imageRefA); + NSUInteger heightA = CGImageGetHeight(imageRefA); + NSUInteger widthB = CGImageGetWidth(imageRefB); + NSUInteger heightB = CGImageGetHeight(imageRefB); + + if (widthA != widthB || heightA != heightB) { + return NO; + } + NSUInteger bytesPerPixel = 4; + NSUInteger size = widthA * heightA * bytesPerPixel; + NSMutableData* rawA = [NSMutableData dataWithLength:size]; + NSMutableData* rawB = [NSMutableData dataWithLength:size]; + + if (!rawA || !rawB) { + return NO; + } + + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + + NSUInteger bytesPerRow = bytesPerPixel * widthA; + NSUInteger bitsPerComponent = 8; + CGContextRef contextA = + CGBitmapContextCreate(rawA.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, + colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); + + CGContextDrawImage(contextA, CGRectMake(0, 0, widthA, heightA), imageRefA); + CGContextRelease(contextA); + + CGContextRef contextB = + CGBitmapContextCreate(rawB.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, + colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); + CGColorSpaceRelease(colorSpace); + + CGContextDrawImage(contextB, CGRectMake(0, 0, widthA, heightA), imageRefB); + CGContextRelease(contextB); + + if (memcmp(rawA.mutableBytes, rawB.mutableBytes, size)) { + return NO; + } + + return YES; +} + +@end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m index e0982aaecd6e6..ec2e42e5a35a5 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m @@ -4,9 +4,9 @@ #import #import -#include #import "../Scenarios/TextPlatformView.h" +#import "PlatformViewUITestUtil.h" @interface PlatformViewUITests : XCTestCase @property(nonatomic, strong) XCUIApplication* application; @@ -24,29 +24,31 @@ - (void)setUp { } - (void)testPlatformView { - - XCUIElement *element = self.application.textViews.firstMatch; - BOOL exists = [element waitForExistenceWithTimeout:5]; + XCUIElement* element = self.application.textViews.firstMatch; + BOOL exists = [element waitForExistenceWithTimeout:kTimeToWaitForPlatformView]; if (!exists) { - XCTFail(@"It took longer than 3 second to find the platform view." - @"There might be issues with the platform view's construction, - @"or with how the scenario is built."); + XCTFail(@"It took longer than %@ second to find the platform view." + @"There might be issues with the platform view's construction," + @"or with how the scenario is built.", + @(kTimeToWaitForPlatformView)); } NSBundle* bundle = [NSBundle bundleForClass:[self class]]; NSString* goldenName = - [NSString stringWithFormat:@"golden_platform_view_%@", [self platformName]]; + [NSString stringWithFormat:@"golden_platform_view_%@", [PlatformViewUITestUtil platformName]]; NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; - + XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; + attachment.name = @"current screen shot"; attachment.lifetime = XCTAttachmentLifetimeKeepAlways; [self addAttachment:attachment]; if (golden) { XCTAttachment* goldenAttachment = [XCTAttachment attachmentWithImage:golden]; goldenAttachment.lifetime = XCTAttachmentLifetimeKeepAlways; + goldenAttachment.name = @"golden"; [self addAttachment:goldenAttachment]; } else { XCTFail(@"This test will fail - no golden named %@ found. Follow the steps in the " @@ -54,71 +56,7 @@ - (void)testPlatformView { goldenName); } - XCTAssertTrue([self compareImage:golden toOther:screenshot.image]); -} - -- (NSString*)platformName { - NSString* simulatorName = - [[NSProcessInfo processInfo].environment objectForKey:@"SIMULATOR_DEVICE_NAME"]; - if (simulatorName) { - return [NSString stringWithFormat:@"%@_simulator", simulatorName]; - } - - size_t size; - sysctlbyname("hw.model", NULL, &size, NULL, 0); - char* answer = malloc(size); - sysctlbyname("hw.model", answer, &size, NULL, 0); - - NSString* results = [NSString stringWithCString:answer encoding:NSUTF8StringEncoding]; - free(answer); - return results; -} - -- (BOOL)compareImage:(UIImage*)a toOther:(UIImage*)b { - CGImageRef imageRefA = [a CGImage]; - CGImageRef imageRefB = [b CGImage]; - - NSUInteger widthA = CGImageGetWidth(imageRefA); - NSUInteger heightA = CGImageGetHeight(imageRefA); - NSUInteger widthB = CGImageGetWidth(imageRefB); - NSUInteger heightB = CGImageGetHeight(imageRefB); - - if (widthA != widthB || heightA != heightB) { - return NO; - } - NSUInteger bytesPerPixel = 4; - NSUInteger size = widthA * heightA * bytesPerPixel; - NSMutableData* rawA = [NSMutableData dataWithLength:size]; - NSMutableData* rawB = [NSMutableData dataWithLength:size]; - - if (!rawA || !rawB) { - return NO; - } - - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - - NSUInteger bytesPerRow = bytesPerPixel * widthA; - NSUInteger bitsPerComponent = 8; - CGContextRef contextA = - CGBitmapContextCreate(rawA.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, - colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); - - CGContextDrawImage(contextA, CGRectMake(0, 0, widthA, heightA), imageRefA); - CGContextRelease(contextA); - - CGContextRef contextB = - CGBitmapContextCreate(rawB.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, - colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); - CGColorSpaceRelease(colorSpace); - - CGContextDrawImage(contextB, CGRectMake(0, 0, widthA, heightA), imageRefB); - CGContextRelease(contextB); - - if (memcmp(rawA.mutableBytes, rawB.mutableBytes, size)) { - return NO; - } - - return YES; + XCTAssertTrue([PlatformViewUITestUtil compareImage:golden toOther:screenshot.image]); } @end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_iPhone SE_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_iPhone SE_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..015853fb6d2760b83a2674c6853fcf701e6c6409 GIT binary patch literal 27336 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 literal 0 HcmV?d00001 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_iPhone SE_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_iPhone SE_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..738122c4846a277c5266ed2e182e8a51da72213c GIT binary patch literal 23290 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 E3l&|Y(*OVf literal 0 HcmV?d00001 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_iPhone SE_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_iPhone SE_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..4706bbcd28f986e46342039c392dbef1e130a28c GIT binary patch literal 26625 zcmeIbc{J2}{69VTlmO)qdwg^R$T?rLtWQ<`LLz{bBxc4e53?-y6 zmKcngA=Q+@$TDM_8B55_n6Wg5S-CP$>Yu-kZL>#q!zY99k_!^9tQpfsRbQ#I0gchCTmJBEeEa*{ZBeO z08e*B{*bf46{6HX!Cm@hcSVqk`E8xM(u#@g^5NOj5kU=y1lu9~NqI=?d&}fJszn81Oa-WEEur{2Ce%amg?$Gz1E_h=OdJf5QU! zU3nY4&2aveh+xRJiwnhDS^eo9y3ay~@zg&?@{&poR1CKNgw;SCDO2BO<~q zz+fa2X@Wdt0t*iUA22sJ2k$=!K6ua=c*7VT4UM=IWekOH|Ix`}KgR>${^8fcBCf%p zhRS{~U4|hdAltSn2m0^l$2=ph1^&-SQ24^KfCYk;PrwIE_JjZH8)#~!yldeUek}kP zS=qn!0jv2p|1b9z#<2n`2mjwD^JAs+cY&o^ud)LFw{6y|&b%{n2Z3xsr;Z;xAEm-$ zuI$PTh&GzgSieH;?v!zEb zHImoy6q?gs&{mr2f&9?8ZT;`vX6|rV!cW(Z;xN2<9UVHUvJgBSeZo0`rKenLn zTNXxM@%D@@D8#+NA#I@_Ly%Z&VPrLrora*w!ht;dg+YMjsV^-rVd?aigcGE)q<*Kk>{;G7Myj=-@Xw)$ydyAxfG?`cQ z&=&Tt+3{DtPXwX2>jppErygN=waWx@i2(LK&;1Eb*Wp(|C zqo1c{ACiq8zPGn{mzz&?K=jmSBRnEnsPwXamMab)1YyJ8tsF)RVtk)MVrC)@zi(9Q z*r7E5o=~>My zqc&=p^_8Tw)Rh3pqSYkf1!HoS3n{-c`T!-Skp%g>**Qh>b~Uw5@B z({>Hy`&mLJ%!I~phl>+)5YD z8J`u9%KhqZI)hC@)57>ZoArR+)?aPfRF~ptQQ)0<$WztwFI(mgDIHI$=&(B+*z`&< z@>Yp&>XJ5HJp;0u`m`PSHdkO|>vu?XGz0E9_mDmN&{@#x{|f+~67=@AJ^@v+<0Ru3 zPq7{2>ozTKIXd(p{PT{qsv|?2atoF3Tuk_=W=lxDjM?>iLzktI6w>4(JV|{ z!Lio)cD=r~pg#Es=^qdPEu$!wtaEEDdHeN&CWa-M%hl?}SM#|*^IuCS`Z140wWE-h z)vV)#>j3$zydMv$@_vF|siK;)ax0?a-0+M0CeL`GI6z9`ZR6uXKgYiYJl=;B;uFZRMF6RW~LI4v&V!#$>D+U%}? zEHpg=N)w#~)CI=goLA!VU{Wp_O$Eme+$NP`Z+skV`TWy;u}|+NC%IhUWO83e0P%SZ zw@aR?#2fQ?#ppn3#TJ;=D=#E-AOJ_Cr@E2FlmM~}tB-;0(dICJW6f0JAG77-Y!jMQ zd4c@=^^5bU_79z_4xn0v+IIom?xA4GZZg8>r zi$bqz$?TRy{hG3KDq(X|?!z0hqR!2INnWF$_kd=eg)|S@t#Nnf*aTux z*V~zg^`rdwrrPm)U7Pl#c}F^Tmt1Ohyy@bEehHSMCA}ve+sN7vQSzsSI0F}J@fTcb zHJtH)Z2DLO;WqKcSH_td24kZ47?jTg^fPvT?Fxd^P(!HX(_JmXBLiuF>l8_p=_cpV zTE6x5$F-*tE8RQhiaqhc)!*CF9ChVASJy*Ebzjk}B?%;4wTOkL-qLOviwO})qc->2ghcB~stgW&US)0DAD-3nFJ{uL)1T<1p2 zl1+et_tp?B6N&7*49=!314Y!J@oZ#osGa%Lr{UpNJGTh=!K@yWY169E@vVUQlf3LS9n0_WU^qrsC^t%jm_-Tm#4+$?-^%N=SrT&^Y zc`Cl|@Yn$~BG{MNTp2OO3zv-3I3bt1gWg5)YvGEi$>c0=`7}nJ=8V)9oT0w>9o}eU z6a5GKZ}w!;9j3pY#HX(*1%~E+BO#I90seD%#mwC)F@s&*9{t_n*SVApj!}hMV<#E` zg-=hS5jd}-hu>+!`1&!`6%9D@TrbqJ1lQyqWW1+5u#-8Lp1NFkMtPFQ^u+iO0nb6Ekno-I6;dYI3;>IeRoR z5~<&Ymphp0owpWMyPVcav21t7v-+Y(RnT_&mA~i1?qH4HxY72Bm}dCV$2IpSSi<5C(>7hG;@^=B#QVU51C~6&ha6Cu!Ds5rr4q^Wb3S`sh`jGkiNJN z-E%0&+NGE{Gr|At3`4aW4|mhz!h6`3GxbCfi;$r-()WF(gI)IWUzIu@y3bE%;?Hd1 z%VZH*(KrRSL2_?9#ZKO*q#0qm{NHgM;+{iy^i-9m97m;wmJ0LpGZNF+y;3PruV)Q6 z?j03cXU+`O94SSbPt@f%em1h9OPobFv@l21>tk6Elerb0B!$e5U=(8Yy_FTv`I<=; z3ki`eK0cl^Or*o;&5mRwzq0h@R%BlrE7>8+3)wv*A0}P-%v;IrxHZSkv_hrLO&g41 zZ+Q3;2Jhv3#Gx-bS^Vr(OcH-;c_OCuWta&*I~P^H?Wpc7dWGz}VQX|!aE`M)k2`#Y zvsK$F?1D(OZ+a9wmho3joPF*`HqI4shDePbl|@Ors!^Anh#5|q)S+aWNer))B%K0d z$bxNbv%at}c6TLZYk6U?wQIT0{<$seqct7DlK=#B!<%X7y?wnkvg=-Wi@E3#YG9<< z7_r*T7lJ!0Ze-HU*6(DyM1bu>en5McBIeZ7F6H(_eX$)V?$%2*&4dKNe-Q%Mz=$frz zb)4{yb2ukMxg9=s3Rlb4Uh&c+z>Um7@Q*g!tf zdW{*HCo)(eBydb*^+Vn-Ys#l2T@d#un8159^%%F+^0Od@w|d%F z(4hmO`~y)s2-EdXtlUF#z*nz7y~L1liJ^3Q69KvofK5>jB03^n6GLR5v!mpunS7Jp zi51^2hsQ9eQ&swQvpSd?s8QW}qag>R4A5IL8SAWB zcTEb>hcfvknN$VWs@-68o6Mqhn9~ozZKMNfh{`^`sho}^9l}Xl1hto6ns-oFcUsa` z6Z#{KFXCI*$o;Q$-H09Xwf=m|f_^MTr`GR=NS~Y%d!+}=C{gf{B;4=3q z(ihMA4X6GJjF~fU7xQcG&)ONFq6<82@@qP5k5uIbzdjZTS6(JR(tU42I zq|K9~LPtYk+()84voq@bI%Op3pas3+JP4@TH`mt%$JgJR21 zBV=@Z5=WnQbOs`%)$Ew)#E}Tnxh%4ubXY8dMcIvW|82Q}3ATsaeH$mwQp{DY^pvKW zFw1+nz=gp>OdRhRQ!93En34<`uki*@B=i37$>gd#8n>QD@%xSpziroNz01#=i6p{5 zQ>woIw7CzX=wupqC0p0HiMr}6aJlyE*0~op89iz4>3}&`Gu>+lf~E$| zrVEoc3x6(R<*LUU-$`T%6CuTv2U^%uUbOGA3_@{c*ja_Oq;M?5a3V^yUQc+j42K@? zBK-?s#_+j14H87|0r7l`{bF9ptKq)q)^u(#HANczh2r&g9poL{e?m`qWz=!4(}SXe z-)X29ryy7yvViiebE4YsnBv1jF8Vh2GYHWKi)zrztV0E|UCFwtHuA~xMu9@kFv`&C z^(2dKFjX($56aRpa63`)j)tu$hC!^Cjc*#NDM0Hz@i`f)VlAB*&OBTFN=hYL5z61p z-C=If<%oqZx(&pw)Q?Ut3OpI|c8o_C()@W(drq+&qd zQ9NhC0dL`SKDGwoY0oLW1_YkvlDpyWR@z%q2o9?;#J!yp-!;h-4N%ZGv@F$g4G(*u zPtubV=VezHWPOMX`&sxtK|~V0Zh-T|YZIQNgP(YL z_p=#kaweg*^p3W$)*J5#xM}v7CI$jS8qg<%uia!-g5gpoDLH=@8IpEGAbJ2PHhQ>Pj@95kEV5+U;HpRdY}wo(!|N9g z;ILI4268d^xx8VRfsu(F6*L~E;n2LX+5^Ok_hN-$I%?*!z!|@bI8%WXk`513gzJA6 zc2xqx_xN1pyAIEAA|D}R`_i1z6ZL2mb$o&%d_t_JKIrhqzxD}t6VTX4a!v1Tem%8AQ3zuPx$=TOA*atWB<^(>XT}+(U6EJ{0 zN6;VHML|RK4g2IXuq?BTzzT( zX?1Lf^qQ9Yk&uUF9n1yK#6fe5jNW}WsSu?1PB92jv=v7FCDY$f!&jK0TvOiORu1SQ z_^wry7XHAen%@ifn>=eGB9V*>#N!{!0%DSg5P1;Mhzphv3WsRTn>b}fS>&iY9_o_;XPj+;0D(ccG zDrE4LJu%J~2HI-%IS`KEtXx+f82U}}5XvtD{Etw*PWPSxI$|a;*+IDq|J{^S-9~lV z9{m_t4Tj#Z4wVKGd9k}WlCuJP&)C?e1C$8*SjcrS#DP7SucS1Tq`_MYP+b4A(K90l z+qlAP8Q}WfSa?QP%BR5F(F2aP&P+XG_;8-_CBz=1tlF`C!v$xGpzfAm|K2$KJkfM~ z%{Y1chp(M$tfQupBTu9$Hqk)>V*aL!Tt1Z*uxFrD-=jpr=So!lU`6#5;p`_=;8fRS z>=8poQ9M9^^!C3VqG{0NXx6lTH?Q>JkU_?~TlM}5&ZgD^mKkb>*PVH&NSmLrn~0$F zI9}><1yXFbImCn2Ya2v-?Q$dTKWkMs31 z?1+Vw{_yW#a>iHbNxjfMHoaRwiOe2o*C=Q5U(fQ@>NN%Q*UwF^7vNhgB|Hs_w59@2 zYFt@}35d=<56P=QcGC%%;PFHQ)=wQ=!1O%pCjJ?Twt5_ZXFBo54p32iMi-fG~MZO&JcIS$h=$5QABrnjojjjv@#m%@;D6js1E6BX7u5 zq(&rBJ#4y9REmWZ19rI-r$C@aQOHCXqUg+Wbvs+VUS4;OfxX$$w0hc_H#W0RO|5L? zvlI&g#cd`t)Elo#8a6g_cp?X)QPj;dkdZJ?aBs0$dSwWdd*Jm6Ab_e=ijy)nM5G%C z-X5{Zj^TIX;rOI9QRd;2T$B*Z)4j_%^{Y1Itti!%eMvyeFh6iHq}jE(p5`cgQl_WA zPWl0%11G9qBL4lo%lQ`TcO7O25j4{kEd2U+{m{C5DylZ?fIVpXzWo(`-5b%#aftuhB%FS^E0Wsj&*E%;DH#_<7)=z7 z>+^hXvAYh03V*Is%o<>Jwm%YoJjna{7i!;7e{mm4J9OlfEJSdyFis!|MR_gj2e`1t zS?`maB2}(2FUb-*cC?|>jkX0tCPnopys=385*;Fyh0gg2hzz0k&=dfX^5MVm?zqVB z5d;8wnSnXY`CHE`ogI+){biTsU@i^K|GE+hjjGqw-va=1n_U`P_fM_|TV8(PIh`p) zMctzQyCcS_3OUhlkpeNORZNzMQ_z)TIL3w)N2|#%;oPEh6S6aSrf&;K11$Hl8=_ zpS_Llxwl~mmE2!{$WKrcOunX7W?!O(pif-(a>Yy5wMSLaLCj_X8oW6+mW6X`}PV!fxjAEmt zoZp?0^sDP-g(WZ~%Gi>2*EsJj*#c8?wUE$8VyFZ1JK&JF7=;Z!ytSp)xf+ zYSWe|8!`|u%uPcTB*q`n%21~l@4-aO)s7mE#T1P@-SuwERVSC;w-bqLc>$ssYvxF@ zllkx$5|fHp?JM!XXrGvCOEloKIhKtb(V@7|K?aE0Z1Fl48}ofW4!zXlPN;pm<~DW%c~vv6+Yt*5NriOL+7A9+z#dgFzTG*&Ry>B#R>_=2L5uAabH(4X+XaE&Q0D#>$4s> z0)EtTWG^?AY3dz9z?#cGJ7K#|OsDix9ITGz!*W9>zG}g$a&V{hs7fH+(p{f3PA~FA zr$>f1S+8~a9|qf+$K|*_ad8?af4BfSt4NlA`yHJ|`z8xvK6FJ&``S3bF zd}j!xJc_sepg%$}mX)MUPVEOv-)R#7>aRsSstgGM;t4EZmA()OODV!%pVm+(ZW+W5 z-}c|(s}NgCTA+H82R2-x$TT&L^qpjVuf7QSg@B=uYFVPW$GBP~@0y4fBVgjCX^L>@ zT)p<1@ff1$6vTA`rx3qw`S2x+jqHBLLRihykWC!R0zcaMO;o+M0~mDSxK->tF`o!$;C%0Beu0V8^|&go}OV05G>d&h@&U8}SN| zf~d{2%-i4;TL?$j66qez^@M%POr<|xC~1EZO!SNUQ(Is1eKnQ(!b;--&@jdZV# z60``UC1ub|Og=Pc(=I^X6K(()G~+VG`qib8o0?F*PaPilYcRcO7kl>O0V3ETN}6ZJ z?16lI4c+~;F&rQ{M9b^M-3V^rBOs>kpF9|p*-55GN*@+Qh4oz1PMb&Hn_9{(3DrRl z++Gjhu|FMb{OcDbklye!&V&y-*kbm*zBbw^61>evaPUyozKda)&5`@Q^`m+@bJ&<- zLC6Q<3jj9~3*noeRigvA2XHRt{0cz>c0SkhXt}f<)p+HGK~?`v&l)`MHG%(!I|uR? zTgDG2WNi+R)gw6c=cwwx^-4QZRO3WQ@`WVx!0tyR60}-6mPN{`RU&||}!8&I_VHm#};K5wS=@~K)GR`LiC70&ZP`Wz(%Q%yfy}<P>C9APXI4$ zyLUN4=5@W-ZeEAp*tQMK$$r2bjXQ(s%KCE0D^}&#%o5)bu?x*89dyKqod(HaInLGI*sYkV){74s+a|BPFX@ zr>?a9#_B3it1krKaz+yU}g z8>6gG$JfmOMOJtm9=6>!yIM6#B?Jm`6wxHWrM?RK;_d?^Zzqj7q|x9dEax#gc$~Yy;?T2>|=07*t@o=X&Xh( zwSr(nKm?T(Zv3e%zwHN86^BHY-VnR5E6V#M#!09!Ao5 zOsFyssY9MkATg|z)UtA%5bXrIdR;Fx#>4p zVco|`qgZa^FNuZw0Oma`TKGm_qNK?8;aTFs$&H(gpSj4{3d;hoh%XLI2FGN8#e64x zQqRh@#{Kdmvj~jx$*}dFcik2TUZ=SedE(8fmQlnH$pb12LTp%SJG88S@B_T@ z-bR9`qCcAE*(QqZFaiYN1-y)M@0=T6fAQ5^+aaV1*!|$-Gc-k?urJ`y>U#_FQ36rZ zH2}F4^Vnjyb0Q{^L%`rq9E#Og)RdSNZx4c6utaD~mw3&Be%YQ*_^46$^pFwjhQCaV zePf*;a{m~R1D%)qL1lm3BU1G=AReyrj0)4EE!MC)Y`hu(ik%&h-~Y|5qI%@_1%3W` zXX`BJD2$b|VFbPBi*mvdXa1ZTF=HQ;$98Bi zypb2HN3jkAlkv-3)8I5>Oh>Zkf3p8u_M}S59)_lkNWD%X$nu1e=IVgLljNkn+ge*9 zcPpkb*5rMjm1B;EK+#7s=xAB?#vgM{*r)oCz1-`$@ANZ5qscNOIekAK%6#yTWP&Ns z@79rXG_oXp1IVAAnwP^B)!2aHMt2C!YSE?eE+)9D)oo9@=;LTP{@i*@!yv=O8X#aT zehH(hA@Bkqq6B}F#4;NA*q9mLps>k7B7op>5}Qjc<}QFoIN=Ly}1_j{oS3!$LzUGx5y-JFY?=;bR4@Pc6cu(RU0##J3N*z5vBS93IT8s z*v;bVTiQOIA~BHmNh3=Lqp3mI&0VXz@u~kw-uU*`tm~CDB>!)i`M2x~!{adDu5J!8 zvb(E1aYmU|A`3lndzAUSjEJ@zX7BsXUJ8)QLjna+%NpBq)05`5Y?;;co$U`ymRSN4 z{?S!WF%19>u%?cFj|>Z$>1th>6HFybkY*3af<@W&i&^=0C&;z6yv5@@kpICMW5oGE zsWk{3vRcBIotDAushU0$XQM>~vgN>&cPv_`|1xd!D*>BpS^aj}<1QQwB6_Ag>znM) z|5SB+XKU8Y%3cP)3XJ+}&j%aK*5Rpux@EN)2DZfJdBsjXRNBX95e&h_dVux6$PyL{ z9@qP;P*|dQbOG2SzZ0w8Uf1mZ`THp&h^xF8Be`A;WKJ9LWEroem=*LG^)&60J*0aG zNY~(MffV24W!gNON?4cJAE$?rw$0nWSoyRO0x2uLIB=%_z?S(e4WMe4uGx85?DoM( zo?qoiuZ^Ue<|r8w{`!z0VBrCys-LS~@$`_{BlL`WZ};ihE23>}x6=N8%F*fcUy~Je zndY2qTzCvlFVqT9$lQ=}FPlzhx>4)(1Wj;lN$0d#w9?(|O>l*(Y<=GwjH>_=8rmdM z5tad}27(5HBJ|BO&Z2V#c*+`oP`>6cd{N2rfHbJX*vsg}H~#o(E$GDUGTj9eki8oy zH+QkPHeYe1G}-F_0JZLU;U5d?d-WbrR{qHG*?%VEI1m&Z-}PqEAUxY<2r|u089BD7 z?&kn}wyyE|((ua7T-y94(OXhHB^ddCY<7SO%sQ03(e@^_7QP#N_XpSpOOTB8NZV)W5%`95Gb<1@(fOL#K z4i7#m`p<&mZT(gI|J`AK&%XYxgc7pwGCi9pfL ziTj?{IE#IMQPbTBf)R!EFM*-P3u~~wzg&5fFkV>(lnZadw|6XVgXgBJ=RscOfer=# z1C|ZFYethg@pmVGoMopUYr>gK4YTP+OkcQ*Tr%EVZHR^`U9k|FHEVHW9JjQ|xg zW%&Rm0RqA)x|#0$!7K5>830f!OO}Vrs3u#|aW;#i18rhKg?e(18`*;o6x-3wwk)>E zUiEexh)%c(R46E_3AbjO7iGpm86{M-Bbf*{QIxH>k}*=w>#cY85tR~Cu|Uoj@K!-3 zV3zd9CyH+mycMnvesI;%dLA7=%FfGxqM}?*$kYoFHpmpoO(x7r&1c^Cti4*t_CFFf^)b}>kTAblt!Sk zw%Jt3^jcWLCe63jAUX@yRq|Zgoh5UhYYMU+g8pJGH@H( zM`>VXWvuz+`we(Sn&b~vwHj3&pQv9}Do5*5)(ZW!E*VIHP4zHHl^F=Sd%#H3Qy1ym z&XsGsbO8(${5>`m=s6vjlfxz#)L|sQuM8+spK5d?l{KZC!A@sY98^(l2R;zYA02T4 z`urIHUK+pWP1dT{mD8*V685D;J=2G)tbdEI+Xala>ogtU7V1&~_+`As;o8GxYmR1j zFyB-3kX|BM4p5W=gx*k>*O!1#8}4eZh;Q(&Jq-Yif>l6~+s5=k@u9$`U5Q)6PtJcX zaZE$+{7g?U?vx@O5);{t7BTZ@wOox_^?}a^Aw*MPLoWlvT=WIj^25Z9sd;Ja_qJdC z=fYmC1vr^uKc$E)Rrtc;Ov*&SG?_#&t7Y|gw9s1UGmvW zK6@VYFZpaBv%3^=*)D~dK$N=_TdS>DA`}2}WQj!qB`i@#hPF$5*;>OTk`N#~mzYu2 zB@zJu%u6H!0GF3Yge4L|nFLxQ5tc}VB@$sV9lAs!ERhIGSy&3iMXuO=+n_l9Q}wR@YVS6Lf#4~-7R&l( zR~?P_^&ML*wabWK_9XrIFALbR&aF;GDn7kf^Y>M4YhB;3s}{=%Nvdo58E*g83mWx< zMs}WCEJd8y7zQGf+7>Gn%~dq^oBj3M;xM@QWwXM^i*<^hRvwM7KK0XLHDK)Wt#vqD z#3H_RtW#-nc(GVX*uS?Q6o<}TEENn_UE>E`e`m1@(N{%dg1dKVsY|E&L(-N6c;Q=! d|Ce-iKd#*~=N|h^2MG8%^}FNo;@|vk{x9WRx%2=4 literal 0 HcmV?d00001 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_opacity_iPhone SE_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_opacity_iPhone SE_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..06a6ebb60886dc6e4281521b89bbdc6684744df6 GIT binary patch literal 28019 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 UdduGBe{FW`h}Yq&gTdGSA8n6;*Z=?k literal 0 HcmV?d00001 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_iPhone SE_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_iPhone SE_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..6ba484b39cd8abacced5a2534c8d332091c98a50 GIT binary patch literal 27591 zcmeIa`8(9_|2{m%$RIl@!XPQKv{V)jD48FeLdCd^SSRo;QrzJJ-mB_E zlwhz)M;J`~2@EELeO`V+6a0YFMI{gbMcb@bXg+){@-%ggW>)^tPfTYU?BZ?pl&o=S@($ z-o7pi>J=~`#N}~C3)4~AFHmY7!(ww5Oh?*+t*d`@bTlv z6_t)C9yuZpJ|XWH;^prYEbrwf^>>i}#yREU=j?k8>wnGL3k8kqbjdrwUrSOFn&^N2 z_jjHC*RK5UOkRHfwgon*2>nIzu!54}|BMa3stLWTZtQ!_1y!VV_x{bJ zsR&K}|60u7oo>AgwyMppsrWy~rp<0xCu0qRppp1cLOH z-K+H9YbK`ed;e$9{V3QK3v9jgze$jU(SHM=QAe4WlnSqlDEylc4LioVH8J?WQ#K^w zsbDXb4O$3z4Np7%ZvdW8hG^K=tidRQzpLiqfwla%V)PX_-0=#Fs@=aG5MWoi{tbXQ z!p{RcDpyM8`?oR#+V9^0+gtm4M%%ZxZIIi(2ExO37}<)9+Yxd*uR)o0J7sTIBTzxL zU1)9BkWhucUHM<$ZfZcwu-&h1x1vzzxZP!MV;ck4Kk=iMCw+A`tXI4fAf$vpVgU10biqE|hpguWDk=7Lu8k)@JV zX%0TAO_b&M$d2vjwi=P00!u!~ZpCDn@3v-$Vj^0R6^SnV#p3gC1x169_98h8r;@A;FS)pUA$h8j-JvW)*v4DmLYg(Wt1@ z>C-S`F}C~?2<^fS?Bb8MgEZPv7#<&4({R@{s0r7WO8((y{B94^}F?cDSly3bT$JxB{B(54F&4=q0@Zf7BD$W zK2gd0QKZXc${o25@2s_=s2a&>&$1DDr{!sBr@jDjx19x6d;F!KgQ(@OV%l3-CdH?3 z15L5hV}qfkr~M~?+PfLQ-bsm;(VFNVY3$vJ=dY^n<&rlJR&?ZussNi9KZ%A-!&?*( zzJgBSVs|cD%t_H>QI>u^K#`jM)tJqAjLlegyx1KbWsB#*ad$)xewk zpSKSTUrmM)Z?f#?z%}G8cf021T|PUv@~5EZGC8+va<#R_rMqz!qC7}wmdDBId&Zqa z@4<*>2ypm%;#Ky;Rk#-F%1fa>fewc-C+DjT?*}LPcgasOyxTsnDfbQkjs?e8#_qpi zt7>_0c>n#UBr~SWRk7;*&F|B3a#_W{rDCER+#Bey+zPK5>d*B4U%i*>QsuI!T{m;j zFQ07Fqp&_V{NxVyxf=s6i>8nweLow`oAH(%pRKkqhB;iY-t9t@bD$5hDtdYNe&p5o z;PpFjGd{JqI=t5tc1Q#p4Vi>G9}i4psNgU$l*6BoQ9Q7rNM3Aj<*cCKmV6I1(CHS| zF8<1Sw8@gugF~ZH(c;z42NVQNdjorBo{hHKuTQ^jwHGBBfmOVFK`>_O%zGDgD$SIL zi+q=#e!FSez46`~a#rEDYhi1P?W*EskG=|eww@m&n%1^oDBuLspJB;@J!3;05gNCo z$ywbstv~9jAZi&*pUK52FlH(!DP-G$&`{c1XX@cu?Ua3xJ*WW#8dh_QMEkoIP1*&g`143VKr@ z&=<~%Ei2Rj$BO!1L=Yt9Oib&i{f5W0)C@32=g7r97MvQC@ILeopScEO_EdT=N3(Nw z`J@zibG^npA&&0TBR<|HHQgOPRTXJ*`Tyf!!4+ z_7;XHN#q?Q%Ye)H&GH=XwL-mx{sGNI!QZ@8ZL`tUqXXO_`~*HpE`)?RUG zxAhG0Q)5t56XKGBs_A{{u~|E`6~8_!IwmlH@}-dzk74HHA^Td}=g5+0ocByx=_>Jd z-GDB43zv6jyL;1&k&o>1>-cXRayg}!dpj#4=2>;Rjy?DNa<%LE;d$FpU^FRt?`s$? zEmY&p56(SP>8Tq_N@0P|wXIn^UM)efhZC@ar%?AxNvCRacXzx`*VYNAge5(e>h)>T ziMqkH7BD;)hiCkudT%br#n2BkTP`>@ydP!eD%GrKOf1PVOI-6bZo1AdyCbbt{t?X2j@fv1FzDK>H9S-$h91`m*) zH%8SAktq00xgKrQMa|A|?m^EI`3imixp2jj+gYL4+N*)N=v$Mb(HC=4s$FH2%?@4be_-&Iv>hJhDnYPknuMEr;TF<)pBR`p4ZwN zbE!shjCIDC@u8MA!Hql2cA*pFKFb4}^Yg(C*Cs{}_IC{0c$nO*8B%e#z{9V-^4Zh_ zo_vo5LArO>d;A(wpw?TRoO}G4Btm<5PtY-OBih0f=VH#(_3699xjGYPSE3XnuHDVM zdI4|5?omE5F590Rq@9zk(?Dkg_INJpO6u*+*Bvf;71y8BJNntUI=xbS*hnV!aBMm! z$h&6d;7~Gb_N+@PNq&zb%}48G@yBY;kG%2rdHQ(hk^9_4?~sb?w};e(+(Vnh2fon? zlw+2w&oUonw^XjStwUtEx|sF=A6 zEC!`?2wXz_!yr32KXOqj%`TYS_+shC?gmyl?WOnPF+Dd%&-LAwNfGa`rM&PdnOOdO zSK+r>IGN*>IMO;~L{HB`MBLL(>}_}d4iQbI`Dzl!Gw$Zp7VQM%d%aIJRyMG8Z0(!( z4W_CaBIJn9r#1JZQ8L7hO0ta131?}ZvuWbBx#PdP+A|wi74NL{pZB+Q&yFO|R#SZt;YC4Mw~TOyag@&Uw+sYG%gj#jU6te^V;LS-u~po4%wAjoT3@_Rf9bsbZ914F9|dKM(JZk_c-*|>05 zD!YSU%iN9b*D;0*4WHq?t7AIZK4+g@G0m1s1a_ob`sblcq+G6@_aFbcpNZwyink&# z@&gBrN53Lk53#18^ogpPTpK>)-pW4qeBrBayQEdb;wv3_aqdYYpSiKs1x#mPX}b~q zjMcR_dOay3loR6#Mqt(0!G{F+DYX>2D5Vo3y;RmmM;V`-L*T^o1YC+q{edw;m) zR^fE!`^)8;n{HIMhdxc5xcPm^R`(8t&8w;fB#T4VN7i=K4~d-8UU(}0p;~h!f(d(0 zQiKO(BE>{u%DQlv^Gzt+oC6nW;@%}IW-Nmh?BN_z>8oapD7qI1qz9)u&p9OyS=^(v z;vEWkcic5m>$ANeCxI=uDV9Q`0)Q%HiG339!jiFj!zMpgeX@=^?HY>Lm895wZyk zmfbyDc`n+xdbK4zy2DsjC_+xV4^)y3!xK@TF7@QAN?@~YHG#t2oOE!o+@hm2YQM?S zpz5(FXSu?=UE;W##40>jtE=;q6s(UNoi1!m@ig8X!{d%tj%igy(J86?Tw04i@|HSO zi>mr(m@^4|U%KO9#7DpyA7#ABO%USQC|7J_5%Sm-*gf)lM3^=tRI*ctK{ov|#;rD} zN;c26DYp0dQc_9^@F{y@r7EHH_;nyS>I`tyzrKuHUW8xAFns$0dorZt!Ye)~YxYm{ z4e=>u3nhB>yl7^HJ0@ZS!7=Os$ME#x#8p8SM9qfT$oQ)gj+*tE9WKM-G*W9FhXdAc zHJB&pCh5chjU7zzdQcEXOH)ceb0G2S2c4$UA9Y%fy}hLVBm~BrvSX^&B{JtYJlExH#w!dJBu*biKj>+aP#pxT$@zxVSHv& z#XyyN>H4yH(Sj~50P0{ z!ECn5y)xe=O%OWdT$anXf+(fV-Sl-Mo%P=bqIuP)Df0sX z|0mNr#n#)ts4agYynH1iv%}p(!@2R3;LARc6VQ%!ASnzN1Rqf)O48Wyzp~f7D(u_G zdru2_9&wS;Ss58!^VTRe4)EAQD^lL@9R2!+{Pk$-wXiwMnr9*)EF>OF5mDS-?Acq(+__^K*8CRa zbECBN*6}X^#?i=+f;^0&P_FVK$=+oA#+4UVb0T43!y<~@xwxhAFqWj;q7*)b6geaD z)+cH@DnScSOO755UpX;7|_KeQKH&90hTgzRJV z)Fca8*!g_+%?((%X-@L`33`9DAaGw>#nCWNCt0kKff{ zzfz0+c|nnzTSqff!~{E7 zbes%|(NJjk{>@N)wTO4PH!Tsry78gB>S`N1ImWy9RsIYICfHPMI?o`zXuwQ_jbO?a z0(xj!&=Q$vL{sol?y&j$pK=|I)bYg-^ia)kXrcQ+jI1rn(H6akNn|9 z`enZsL66j4QXmZi67a9+DayDOI})!2zfwRK4a(x{U&^uXIb(~cNw5e#7CywU!zJSB zkLhu*(&YIU1a5#h#wtCdb^%1ach8HwrvHn3BfCp_X4f7VG%(cd0)B;(+f&8XqwZ%H zmme2MynEY+ALe|(?FNj9<3JMDcXiM79> zhP=DN*I3F%JS7g3FuUoE6ZgOE&R76QH;}0Utd1BbUJs> zM#}nhkM3NyIDcdf{7+eHRS~%$I3E*jZOC&204oxCa8|haE*?gPU9#KC%tGp>Q5RTi z`t%$`BV?4~{-1 zBF=NIYO#4TQ)h4gaxq4kYoJooP-pGsc@UF#+5$u*PwxKe981kt84@8%N9AjB=p;V! zmql1`-7D1+ac@EDEvZ1HH=e#3C8PDe(0zvu%k%p^9N@brz;}7Ri~5?OX-D~YNPOSv z*N_jjGL0Dnm&x7}`!Jm0OTVU~fbVF84>D^6^ad*AHd~u#AzPMJX{yDfD<2WsVLYxqfMU{e0=C>8}h;FC)3NLX4n$nWsuOzXN%8*(egTJXuH`CnZ7%4DJl1-uvw0_vK5Lm6$F1c*hHXEesVbHl(9!L5 zW-h5PI*F%?ImMoh=a%H402ZK}hWo%Z?HgXrKz^v!%NuX+;>JN3iVKZC?ON06N6Y+D zx&(Zq5}-Dt_M6qQ4zww`+{Q40;7vMa&&FEkuP+wbwA#D%3#oX6)zZ?!|0>9o9^dAg zC>9QdYhhK1tQJgv^K=z3zbf|M_~T5q-pBcj&GZNR!z|fZML*cu#x>@wDPs=RVR+$| zwlfc~lkW%Iv_)sqd3MKK)I}iu4}kSXJF2AGp=n9IO_}vVR?ab}U1avtzmx=34x7hN zEj@bUsFs0sqL4Y907eK873Dri`<0)uB-VZ^6W8z#zf!SO54Dj@-&?7cj38&hy#9r+ z<50I4nU-nu^yZp0L)z?+y(a{mfK%V2J$HLXq({`}BVN^L^Af-&(S0Bll$-k#h7Vp( zrK+N_(ZaV#)%5BdpXX(M;>gyB+3a@h(SzxlH9oZyLp>+e%T~SL@yqw{p?C~HM|$b( zm7lTryd$!KS9BxVlN?0ELa#1A5(=vxd2C+KCgUNxv6x=eDEQ1H(x+GSOp3p3u;iXr ze$;nvP#RB1yT$YfY`EF=evMw9!nAtcthr9Ucl4XQ@*T>KjXsLXZtEGG1+8AZ<6x>d z<(rYl`r*C7gD%5We~v>9@i_o$zxi^Z?;8^LD?27-Ng*$I?yC}hBPAwkV?n28&sGka zYw{MIt-&|2iEKvWX|`S7H3LyCDi!WF1BW%8bmf7Md(>hRVZ>^1jS(Z+dc$=Xt;wqb z{2bGupM79ZZOB;rBBvu<+_$`zN2#{F*`(z)_faIa(szBy{boJ)!2A3d)7topArD|g z33fFW%~OmFaT{u8Xyl^eWAxm5bvB00G8_h61t;8L?dsGNO`8o${XM502w|>izy!H$ zG#?DJ;cp9^Q+>tO3$k#I;;JuwCiCV}Cq8ew*{7-Molj_R)zV`v%WAb42;FA>ydOaR z`%nPUv#d#GsagB=^VXW2NqDy1+>)0{y>agNqp zG~d`4Lwb|wB@nCOHRap6ry;f73-a7k;4CF0CtX!pYCznth=sH6rT)&tlBa#I_Jw!7 z>J51autAyHIX))17D$9zb8o5&2NMI=7jaa0dUEk;HA-cA0&D+22RSIdG91gZ1*xNe zjlcCn)0#g}qxyHx8wlh*!92K{#p}kn$Qogx z&hKlI-$Ok~dyYPi&00%t4}89bH=3sYE}khfHR>*y3x;6*$F}`HmY=bL-2);+kd$He zGH#uRv34tS!iEDt!x>~PO1I0tKkElHm)-{z#VpxVek%i1PIknvL3vZ<_jon7L2xP> zkP6BvI#d!SIyq>=x$L}RP!@dor7H%GXapAJeA;cFG!}SsYaP?5oH(EBsTsS<<|L7~FEAQL6k~b3zGEt1qQcT34T-D66uG@r zUE)!r4fcJZ2Gy|%9orGWm}|~qwbHy0j-g6KGb-nPGgiY?aBDh{Yn(;HvMwr1E}f>{ zMZDhwcSbx`;DoRZH%&SKLoqLC-v&q72Sf%+^?EuKL)*sh3=TES;ab+bD`L8s;fPS4 zTPsQLqm8QtwwL>{K# zxAgr)sQU@!z$qViDX~xDd*$A*1`fUvw)j>}zs2@iN^nzV^H^?G;7nr#hS&08DJVrF zLHuDCe3g`A#W{YaMH^Ah-xa>lBckCDu~aYxSFv3i!*84zo=qC43>zMc)~VDT9%Eu< zye&KXA$6l7?#z1$csDrd+mHJ*FfSw9XI`_YbPW>EY}zVr{@D9{e^T$!c}@v~`WxKe z*s?phdjmS%lag+NY&|iu?f}X&5V}**{Qw5JzO-^zr}pK9uO|XDvgM6dckWw;A9%f_ z0%(dB?pp#qcK&URfL2iD)>-`=ZyV&33aW5jUaTnTMP5*lNo}r%Y8dY=dFrTYP2lA> z-hr>WhnP|BS#wym)j!^COaxNG`r6{I`a5eok~xy(!3ZcFt$l7iMO8`RV8ff zRWZXUg^^piyUZ!6#Rr!<;TDBH0}dkct~|rMRIU6BV9i<*YCy1*+w1o=?rpx_N)nRT z*V7%3j)lwpQ5(;Qv)&4HaipK{h7}f}lI}wBsW4hnxoR;)`c?p^3XFT9&BuuPLK#H7 zWUE}t&ShKaE4gIl*K(SC7qfRAtM5J>G*IQMHvcIxvd0_qh9O(l(OFUD{kK{8WDLw$ zza_Hfj=)J(CA5nzc1 zY8AYn3_;kF5VE6+_%iKHL7yTHspC)6!;|kg z62tl+`g6PlEFH&T{G*zx$`+f5+_#@Prjxs8*P*Wbwkb(ivBSR5Z_lO4H^eK|G^eaf zRO_4;>Lt8Gnq9~VxqGYf{J)ZISnj=lFArZ50AcB7IXg}l9i$JB*cCh zQc7sz`~Kz?GB<@sEW-bal~02-dGH2a*`@W)4CGaL>&uE6%;wVPnQSj$}oU$v)XJ{he_QGgkgT&)foou~ce;&0mZm&OIGG?&DcKHGo)7D>J& zOIUmUL85AC7|4#QxLxVQIFOhC&EQqqdqAa^x=}n9dwjGh25Y6cI^(S)KV96T?3o(| zp{!njcA7ooc_#u0B#oqg2y>Ic+fH z9*0#g-5z~ESolrd^-ugqsnjDAgP;IqwNjD3e;d@FW#8*CmrYuD^{vwO{B9IEnP1SU zS*6iG<(%3RMhO{th zzn@Dc_3cdGBbG$RExrWIgj>U&f2?+Im=Q?Lgk>v%BhE>sf^< z_BiURt`Kn8Zs8d0+&s#G!|9t)aiS-41o0;v!6)nC|IPWu+Y@pD6;5oLgBPP9(<5qT0Y!C*y*SNtCG0z9WV&$ag2at*k z(`Y#ZEF6J{!j!|7A7a-gFpA=FL9R)jULJNAuOtWju2H^R>8S-#DRY3Oj7{ewAI~K4 z@+hB38wE^~9Nck1#k-$UUm0SlBEGzoZceJ6cYBT=VF^dRHkO`mE`oSD6J{dBfe-77 zwE%w0VVzp3>yreFMh+X3ZMsI%a}KNn0K1E>{8_*%Q-!3unrlMV-lF;vpr zG~Ble1OZ*hd)zveCux(Gs^Z@Kt$-F!lVVCIXbeq;JL6q~ysmJ=1B7T_T^;zmssa)o zP?$IRU+a3V%a)BsHLS3;9>DqOl^?g|WxIG3!3U%abUP)cyjIdP852{Y-?xy_PuIw< zF&gErI`m}#tq8@^ZB&ifiGA<7qtU;Clfx!u5L~cs3FOaHgAl6AD&C8eCjoLr#Azf! zoKtn6(njsieM^-yYk)@=gea2Jdx~JYBQHoH9`aGeNKB8K6+4+w8VI5=a&J)Y-QRTs zOssbOG^{@F#+@F(pbZ4u_13KP3*HsK;I*M2Q}>P+ewMA2%kkpK4{JDL@&LA;)BPrQ zxMRBSRrl7@@o#F*3)F0HEv+y5>kovXDsH|p(9?(*Bql~C2UX{IB7*wMe1n@b9QuNDXzFEFs`#wNhd;T9 zZa}S)b;W-14tTVaC8q`#L+xKt;J~vq0lHQ(oH4BE8E@^H9O=|)4~n=I5Ck)3l(`{- z>j43#_P{VTb)_>Pm8fit@*&o9i&q^2ZL~q%Q`Z#!Z)(H6jkj_teXFpuWvy35?0u?8 zL(3&KS~)YT4q|EsZFf^5*vv4X@w*grlO!>uag2BhVFVBgCx9?IfyVpGT{P%}3-ydR zgeZf1s+5g+RmGdu4kEUeJqZf+UzxYXAUhT~P=}eCS!~y{gaa}pcYfjqw^#(XVW}4AYB-@tWEa)vH%rcUi=}me%_pN*^5^}{p(Uw z2k?U*d9^#Zi#>&=h&;OuE@~h$qy~>D3BHfSBaNzJ_&TSUVr!$U!_j>1rLYS zpqcHuWo7dvSmq(pph8Q#KS&%1*rD<4IBx12;#jAhGX* z&}bl6u=S2GrA@nH%mRJe&r`UX#OU?&J`3OSo4iC6DyHXJqGOty9&z_dfM9zUlnuM? z$@UhpTSdx_GZWp|fOtvnYwBkCne;pDRSnk$I(kw!D=n<@1_iT?6IMFygBAtm?zvdT z9K=kG#+ue{t$GR6!;`-*|FOYfG97dMLCkhy7sw22I5?1B0`wOR01z%IsT?WDYd6As zgh%wY>3ItQ6IyRHFk(@S1Po*v;4b9UxWV3colXP+cyPX171^}6(7ro!h*?~m-eug} z)S@9||G|e=C*<%wc()wFhQ(uY?JUZki7D@85kFkcW_O>Y2@`SXH$J4MzHJOf{ zGWA?Z>cKB%jztMt1ZT|@d5ME^5RgG=WyE9qQyIeRZFg%pXd`a2!17bjN52Z@dY1Gp z#pFgO9byRfWLM4)4K;l#Vkz-p+?&G#pMUX=6JF0xJvd12);I#Gcy=8y8r~&A1qi^N zRovim?(L*^`H>uYium~KJE`?I|7N=X}Z3a=P0c+qL&B%XEQqRD9_oSTp#lG%Dg zr!vS@l)g9F%=rrIKRU+MxEcBCTzAruW>x?fk+s`v4-zoRp9PTgE>Z)6m0o45GTL+T z)W!78YygvoOxa@iXDhrL=F3(p$MAKD+dxMN zX?KbQuT~xVYU3`yQzkXM-`6=}SY!oxcbEL8>SiV;;(Rb*3@~1FuM{4T@e8?$WMnY+ zAhx$cJp+?tpWl5OtpeX1+YHC|QY~S}>Ic|l!b^N+NTct`3*W+QdNLdptv2*$PPbMg zcF3V%Tpc}azyWyd(~y1*P`BG(FyoC|08LYehTm8}M%yEbH1snMNcloQl)3$@N7nHY zOS?T>m!~U?QdMVJQyv0bePZ(tM!m}YobhqtOoAz2Hvuh;c)Qv2g0Jt_?UQKaG2m)X z3>_za49)btmBd0ys#A7{@h9eUW9C#2x9`H^xZsjoYD17uwVYj7pUV1Tj-dequb?ku>)RxauR zBZ-?r+X%v0>!wj4-#$^E%0GioJY>DmNoSY4S6z%HkIRyK%eZeQ)-YPh&f@fI&Z$sQ zHzRV2OT#0*ad_y+QP8mEh-v_$F20*cA|W1cavsjp)!+f!KrZSI>WY__woT*cRXN$K zqtPetc<;Q{-@mcE>DkXIll;MactcNne*O%#Vy;p7OQ%;&L;{t_J#D59p#>knfqa-6 zW0ttxX}rP)#sWc28pI3;dgc8Ch-P_VousDUm*c~p1@+)?WV8FRhM`QIteOAo@iai#mdQQFE)fG^U zXKVJ0h1rQ-`D(TCOwl!U{cG`ktLF*|Is7!BLh7R(o7?01oWJ<@WG+fP#OI|C1IrLjBJm5BLNU2vsJ@_jLn7 z|Iw8e^jTUYQmBUZ*2h?=WTuPE{Fj3ok0-#oWV)P`>-2-86Oq>F#euL7fei6zB&cfPA*NYpBB)0g}$Eyot9#330X*ffIAI;Sw%j-l6&9 zLq&iP*{!`&#!>hD_^W{$NI|9M>?d}TmKCac(n9)u{7{F++h zYE>CLlzAg!?(P7WdrsNAfW#aMNdC{h#Ufq;PWQs@%^+>IZ;d#9;qC5K^hbv`y`iYDP2+msHJI#+*2&$Za~qJ0Z#hHwB@@luepZUX#PG zkdni{`#uT6dqQ4c3dpru5}_>LvApLXj;#cA;y3F%UL(_bX+a=k1=XJ`K_M*4HP!VT z$Kjn06@jm~+m9Djbl7l+^eET}P!?{S9Q>Y6;JOTG;wv`6_4~n^(%}G!xagc1$uZ1A zGNL;I7I_Hl+-I*`-yL((xkSA&4vc#x>gZOw{_0;wm4?N17BSchgX56 zR;_j?0SxFYhk*F}0WX8ch8wN5BK>);&J_T8jIu5ibMK8?#h-LEJnzZ-#Kv)cb11!k zVApM=6^r3(lk&5UBsdTey2MD$R#2uIwdS4UT96Gg_`8Cnp}-F7v3nKCKuw?z!9kf0 zT1ytl>D#T}5N-$aniV=D6D(wNR#b%-w;=Ai$ijN@jXa~^m5Lxv@8Eieky2yLIgOF^ zp>K-#GAF6M#ai9`p*O!y8ilr4m>Dn@^JzyX<5=pCi=ypG>de8Z1c>BXSr; zkwX?Nwl|#SCI;h;wR6L(IyE+|W+0IDE#ObnRWkZ^ophWz=Y|G`A~3+rc-rd051@#} zKM>T$&vpFI52c`4W*7Qc3jN-Lc2cW?_~yW77|tqWq`?W&nzb&4>cO@^+kfMYfbry; z-AoW``>~*|jJ(11J3D**>CwcfOUij68pHSe&S<0f#$G?<=`vf2N8=H8U*GHG*Z}`P zdm@a~oTjkAQxk@}@te){Kq_FWtvyKSROweOZPgBooUk(~?`;G0Nz{JO0$g3J*U2*{ zkvq}cNHgofMiEQyXwhQ7?gpTf5->VG(lavLp#iAS|NJ=Hc*TD}*3mdTaKF-fP|6=P zUdIT)r!dY^`+$z#DSAf0tI{XNx3iv$ZXHbK@Kyk-rdS@e1J{~9p9f`1udG)kR9#1* zk1{;VC;G^s(N>Gm@;FIAp93w7X@*7Wnw#L3uJnE$X-nk^;-=^wV>mbciXgU25X(>p z$Ywy6n~*afyaHXw!31aK=Yg}HnL$5A()QmsWcPdmCIBu5BLe!Y>(M7hdQHyJR9KWT zBrUaO12Qa&5fv+tUtUWO#Ko}^yc&HlhnGYrLjhldi zLmkoV1X`)jFTOPDrk==(ZM2Jy@qv-{$)jk}_S(tDP$l+}UFFv7nzSa; zr3nT zLX_pRoS@F;99UyQ#tTKnNi2KUp(l?CK$d-}fR_n?-iVsRC^5cww*Uktc<|J(3UXrb zFS*xvM25`Z%9*WJrkPy~B;nGBCw6p)M-8JTN*rS3KkQJ|#79I5!G&`W|G#J91v{IOTW_ zP>PU{Ods@ThA$0&&AjHZ>ia#u=db<&M3vpuU~BccL?F#Tr~QD}Vcs;q@nEDIy3^YBwqbf!!T-u3r4z?Y(Bg_*%~ zAAl1K_S1u82d!Y4tv7{H_aRKyIuW0DV}-lJu}U<%8opth;q4i7kCX;5O|eHGh9AL= zSP}(hdB*k8)Tvv|jR>TnBnV)9dley*mjyR%F8e|pF)0Cb>0$wfUIG?O(1SDFXTkCD zRo3&p`(Fdow?xza-peG|K&HbB;gwcd$C$hBR{@cS+q!Y$H4qe@?|68AO=?iQY@^go z*^_D0{eCsXpfXZf~-6HI%7a3W4-aGfyxJ~)R9OfH&nbths{3heoBERvN)G0Z%Pb~J&&BA}oFzvm^5Vz`)l-H--xM3D67++)4y zZ20JfG4+C8~aQ|KpW|9dX8BF?PvwB z8_4@33J7B_5DNn3Tx*CRpYKH$-ta#NbU|#csvy^Zkgz3F`ix*OYXD(s)ImotF4KX0 zHlA^Fl4b3Z>{UDnAi&8AWJ_xK-erU3{C-@l&Ah7I>VEdrRMkJ4ifUR90)o+KSb1+;O)FT8*g7-7J(x!^5?;y*fboW&OvQjoi_zO2*cXe5+*fljKAW*0I(h)roD1ZY?I(>HvLIgIY{z`TP%$D2h{#{zS8YZa6~y!zLjr1 zaS{M5r_@WZ1*>Vq;%c?X6@7>nfV|=dN4O~hW1BIs+hkg6s@hPVb-6jJrx?1tB~>?K z>MSZ~JdN^Ws#RQIbEE+`kp*XeQB3iz<3!m2$$U$0HHM|;kHJ;g z|7vRrYT)n__=wD( zKO5|nehx_;mCgW_^(>^zWL~^%Z$e2}`w1koY6Z{$^w+1mX3|=Gv@{6^_4M}v`NnrPKW;^XC;s{D@ z;+?pn42SiHzo6fid&~xKfg>C%ZVJG)ektS)TF$JEgX((;qz$XwP+?BuK9-v`` zusW(LusZ1J6XJzee|TnnDkmjVFS~yH*S=D$cUe%&^`ge2mbALRB!x4tao8r!|Pip<_VR zAS~E!g5>#h4%|=H7tcI?Hslfh&xQ=mLP*pPww?iky4@1{!~hyxYRWTPYSQmdyP#Ri z!K@jU`kP2IeKai-LLEUi)dC(e&D5F$$UyeeaC?@Tk@K36e)JL8&s#gK2+CbTUi-H% zulnkxKnDDIf|O2}GCA#x`pyazlHBi}L3=+94$9&+Px%FTVsE|i>~L;}$4}t$$d5w6 zsA+F)vL2wlD69euw__ok(46tWu{9y;@{c5nHgfUWFmwy=K-#$iC!R(4BF`MZ=kt&+ z>^4*-f|}rK!Ss&vC`4`RA*fxe2Di14UG>1&G%fbT`&j2^SB`t0feK0~xHjUFFwc{> zXi;q*N!t0sE)|GlY5^PRs3b+{r5!{ul>b&!z@tWCL@vZdI~D_s6*e3v%Oi(i$6aWCc^DdEw-m6q-8|fEJ8jW4kwBKckeFZzlJss0i;xK{<@R8< z9d-wzq4RA7_iAhR7_w-VEKV%biq z#O-2YyNuc{Ah%2B?WW;xZ?@eoZFi~LjpBbu#Qz1z#Kvae)Dr{@1|vFdc08t?E`>{u zLEIz+uB7o}VHyT!{{vPym{_To_De&s5d@wj6PUZK&q@A8S&()}HG4;rNIDth`T}8!+UN|0nqBZqA)A1}ZS$9YNfJojq-ID(9r*_5TOL CY|^p- literal 0 HcmV?d00001 diff --git a/testing/scenario_app/lib/main.dart b/testing/scenario_app/lib/main.dart index 18a64dab08327..08f55c724bdfe 100644 --- a/testing/scenario_app/lib/main.dart +++ b/testing/scenario_app/lib/main.dart @@ -15,7 +15,12 @@ import 'src/scenario.dart'; Map _scenarios = { 'animated_color_square': AnimatedColorSquareScenario(window), - 'text_platform_view': PlatformViewScenario(window, 'Hello from Scenarios (Platform View)'), + 'text_platform_view': PlatformViewScenario(window, 'Hello from Scenarios (Platform View)', id: 0), + 'platform_view_cliprect': PlatformViewClipRectScenario(window, 'PlatformViewClipRect', id: 1), + 'platform_view_cliprrect': PlatformViewClipRRectScenario(window, 'PlatformViewClipRRect', id: 2), + 'platform_view_clippath': PlatformViewClipPathScenario(window, 'PlatformViewClipPath', id: 3), + 'platform_view_transform': PlatformViewTransformScenario(window, 'PlatformViewTransform', id: 4), + 'platform_view_opacity': PlatformViewOpacityScenario(window, 'PlatformViewOpacity', id: 5), }; Scenario _currentScenario = _scenarios['animated_color_square']; diff --git a/testing/scenario_app/lib/src/platform_view.dart b/testing/scenario_app/lib/src/platform_view.dart index 4286469ce2937..d03bac836a387 100644 --- a/testing/scenario_app/lib/src/platform_view.dart +++ b/testing/scenario_app/lib/src/platform_view.dart @@ -6,6 +6,7 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; import 'dart:ui'; +import 'dart:math'; import 'scenario.dart'; @@ -26,14 +27,203 @@ List _to64(num value) { } /// A simple platform view. -class PlatformViewScenario extends Scenario { +class PlatformViewScenario extends Scenario with _BasePlatformViewScenarioMixin { /// Creates the PlatformView scenario. /// /// The [window] parameter must not be null. PlatformViewScenario(Window window, String text, {int id = 0}) : assert(window != null), super(window) { - const int _valueInt32 = 3; + constructScenario(window, text, id); + } + + @override + void onBeginFrame(Duration duration) { + final SceneBuilder builder = SceneBuilder(); + + builder.pushOffset(0, 0); + + addPlatformViewToSceneBuilder(builder, 0); + + final PictureRecorder recorder = PictureRecorder(); + final Canvas canvas = Canvas(recorder); + canvas.drawCircle(const Offset(50, 50), 50, Paint()..color = const Color(0xFFABCDEF)); + final Picture picture = recorder.endRecording(); + builder.addPicture(const Offset(300, 300), picture); + + final Scene scene = builder.build(); + window.render(scene); + scene.dispose(); + } +} + +/// Platform view with clip rect. +class PlatformViewClipRectScenario extends Scenario with _BasePlatformViewScenarioMixin { + + /// Constuct a platform view with clip rect scenario. + PlatformViewClipRectScenario(Window window, String text, {int id = 0}) + : assert(window != null), + super(window) { + constructScenario(window, text, id); + } + + @override + void onBeginFrame(Duration duration) { + final SceneBuilder builder = SceneBuilder(); + builder.pushOffset(0, 0); + builder.pushClipRect(Rect.fromLTRB(50, 50, 300, 300)); + addPlatformViewToSceneBuilder(builder, 1); + + final Scene scene = builder.build(); + window.render(scene); + scene.dispose(); + } +} + +/// Platform view with clip rrect. +class PlatformViewClipRRectScenario extends PlatformViewScenario { + + /// Constuct a platform view with clip rrect scenario. + PlatformViewClipRRectScenario(Window window, String text, {int id = 0}) : super(window, text, id: id); + + @override + void onBeginFrame(Duration duration) { + final SceneBuilder builder = SceneBuilder(); + + builder.pushOffset(0, 0); + builder.pushClipRRect(RRect.fromLTRBAndCorners(50, 50, 300, 300, topLeft:Radius.circular(15), topRight:Radius.circular(50), bottomLeft:Radius.circular(50))); + addPlatformViewToSceneBuilder(builder, 2); + final Scene scene = builder.build(); + window.render(scene); + scene.dispose(); + } +} + +/// Platform view with clip path. +class PlatformViewClipPathScenario extends PlatformViewScenario { + + /// Constuct a platform view with clip rrect scenario. + PlatformViewClipPathScenario(Window window, String text, {int id = 0}) : super(window, text, id: id); + + @override + void onBeginFrame(Duration duration) { + final SceneBuilder builder = SceneBuilder(); + + builder.pushOffset(0, 0); + Path path = Path(); + path.moveTo(200, 0); + path.lineTo(0, 200); + path.quadraticBezierTo(80, 400, 100, 300); + path.lineTo(300, 300); + path.cubicTo(350, 200, 380, 100, 300, 0); + path.close(); + builder.pushClipPath(path); + + addPlatformViewToSceneBuilder(builder, 3); + final Scene scene = builder.build(); + window.render(scene); + scene.dispose(); + } +} + +/// Platform view with transform. +class PlatformViewTransformScenario extends PlatformViewScenario { + + /// Constuct a platform view with transform scenario. + PlatformViewTransformScenario(Window window, String text, {int id = 0}) : super(window, text, id: id); + + @override + void onBeginFrame(Duration duration) { + final SceneBuilder builder = SceneBuilder(); + + builder.pushOffset(0, 0); + final Float64List matrix4 = Float64List(16); + + // set identify + matrix4[0] = 1.0; + matrix4[5] = 1.0; + matrix4[10] = 1.0; + matrix4[15] = 1.0; + + + // rotate for 1 degree radians + const double angle = 1; + final double cosAngle = cos(angle); + final double sinAngle = sin(angle); + final double r1 = matrix4[0] * cosAngle + matrix4[4] * sinAngle; + final double r2 = matrix4[1] * cosAngle + matrix4[5] * sinAngle; + final double r3 = matrix4[2] * cosAngle + matrix4[6] * sinAngle; + final double r4 = matrix4[3] * cosAngle + matrix4[7] * sinAngle; + final double r5 = matrix4[0] * -sinAngle + matrix4[4] * cosAngle; + final double r6 = matrix4[1] * -sinAngle + matrix4[5] * cosAngle; + final double r7 = matrix4[2] * -sinAngle + matrix4[6] * cosAngle; + final double r8 = matrix4[3] * -sinAngle + matrix4[7] * cosAngle; + matrix4[0] = r1; + matrix4[1] = r2; + matrix4[2] = r3; + matrix4[3] = r4; + matrix4[4] = r5; + matrix4[5] = r6; + matrix4[6] = r7; + matrix4[7] = r8; + + // scale both x and y by half. + const double sx = 0.5; + const double sy = 0.5; + + matrix4[0] *= sx; + matrix4[1] *= sx; + matrix4[2] *= sx; + matrix4[3] *= sx; + matrix4[4] *= sy; + matrix4[5] *= sy; + matrix4[6] *= sy; + matrix4[7] *= sy; + + // translate for (300, 300) + matrix4[12] += 300; + matrix4[13] += 300; + + builder.pushTransform(matrix4); + + addPlatformViewToSceneBuilder(builder, 4); + final Scene scene = builder.build(); + window.render(scene); + scene.dispose(); + } +} + +/// Platform view with opacity. +class PlatformViewOpacityScenario extends PlatformViewScenario { + + /// Constuct a platform view with transform scenario. + PlatformViewOpacityScenario(Window window, String text, {int id = 0}) : super(window, text, id: id); + + @override + void onBeginFrame(Duration duration) { + final SceneBuilder builder = SceneBuilder(); + + builder.pushOffset(0, 0); + builder.pushOpacity(150); + + addPlatformViewToSceneBuilder(builder, 5); + final Scene scene = builder.build(); + window.render(scene); + scene.dispose(); + } +} + +mixin _BasePlatformViewScenarioMixin on Scenario { + + int _textureId; + + /// Construct the platform view related scenario + /// + /// It prepare a TextPlatformView so it can be added to the SceneBuilder in `onBeginFrame`. + /// Call this method in the constructor of the platform view related scenarios + /// to perform necessary set up. + void constructScenario(Window window, String text, int id) { + const int _valueInt32 = 3; const int _valueFloat64 = 6; const int _valueString = 7; const int _valueUint8List = 8; @@ -94,30 +284,14 @@ class PlatformViewScenario extends Scenario { ); } - int _textureId; - - @override - void onBeginFrame(Duration duration) { - final SceneBuilder builder = SceneBuilder(); - - builder.pushOffset(0, 0); - + // Add a platform view to the `sceneBuilder`. + void addPlatformViewToSceneBuilder(SceneBuilder sceneBuilder, int viewId) { if (Platform.isIOS) { - builder.addPlatformView(0, width: 500, height: 500); + sceneBuilder.addPlatformView(viewId, width: 500, height: 500); } else if (Platform.isAndroid && _textureId != null) { - builder.addTexture(_textureId, offset: const Offset(150, 300), width: 500, height: 500); + sceneBuilder.addTexture(_textureId, offset: const Offset(150, 300), width: 500, height: 500); } else { throw UnsupportedError('Platform ${Platform.operatingSystem} is not supported'); } - - final PictureRecorder recorder = PictureRecorder(); - final Canvas canvas = Canvas(recorder); - canvas.drawCircle(const Offset(50, 50), 50, Paint()..color = const Color(0xFFABCDEF)); - final Picture picture = recorder.endRecording(); - builder.addPicture(const Offset(300, 300), picture); - - final Scene scene = builder.build(); - window.render(scene); - scene.dispose(); } -} +} \ No newline at end of file From 4edf7cdc743a14f92de86c1586fe0be3cdbc257d Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Wed, 28 Aug 2019 14:23:11 -0700 Subject: [PATCH 03/10] remove uncessary code --- testing/scenario_app/ios/Scenarios/Scenarios/TextPlatformView.m | 1 - 1 file changed, 1 deletion(-) diff --git a/testing/scenario_app/ios/Scenarios/Scenarios/TextPlatformView.m b/testing/scenario_app/ios/Scenarios/Scenarios/TextPlatformView.m index 4e4eb792f9752..c75b5c815d0d6 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios/TextPlatformView.m +++ b/testing/scenario_app/ios/Scenarios/Scenarios/TextPlatformView.m @@ -49,7 +49,6 @@ - (instancetype)initWithFrame:(CGRect)frame _textView.backgroundColor = UIColor.lightGrayColor; [_textView setFont:[UIFont systemFontOfSize:52]]; _textView.text = args; - _textView.accessibilityIdentifier = @"i am a textview"; } return self; } From df45e148caae3650e31b690a40a5cff4c8873908 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Wed, 28 Aug 2019 14:23:49 -0700 Subject: [PATCH 04/10] remove unnecssary golden --- .../golden_platform_view_D321AP.png | Bin 98725 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_D321AP.png diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_D321AP.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_D321AP.png deleted file mode 100644 index 4dc639f672890b3b83cd086c0447617e21785cf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98725 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 Date: Wed, 28 Aug 2019 14:31:22 -0700 Subject: [PATCH 05/10] formatting --- .../framework/Source/FlutterPlatformViews.mm | 3 +- .../ios/Scenarios/Scenarios/AppDelegate.m | 26 ++++---- .../PlatformViewMutationTests.m | 61 +++++++++---------- .../ScenariosUITests/PlatformViewUITestUtil.m | 10 +-- 4 files changed, 51 insertions(+), 49 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index 42e5dfc2d456a..be8574eb30249 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -252,7 +252,8 @@ } // If there were not enough existing clip views, add more. while (clipIndex < number_of_clips) { - ChildClippingView* clippingView = [[ChildClippingView alloc] initWithFrame:flutter_view_.get().bounds]; + ChildClippingView* clippingView = + [[ChildClippingView alloc] initWithFrame:flutter_view_.get().bounds]; [clippingView addSubview:head]; head = clippingView; clipIndex++; diff --git a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m index 2e497fe80f1c5..73db3d148c3d7 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m +++ b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m @@ -23,11 +23,13 @@ - (BOOL)application:(UIApplication*)application [self readyContextForPlatformViewTests:@"text_platform_view"]; } else if ([[[NSProcessInfo processInfo] arguments] containsObject:@"--platform-view-cliprect"]) { [self readyContextForPlatformViewTests:@"platform_view_cliprect"]; - } else if ([[[NSProcessInfo processInfo] arguments] containsObject:@"--platform-view-cliprrect"]) { + } else if ([[[NSProcessInfo processInfo] arguments] + containsObject:@"--platform-view-cliprrect"]) { [self readyContextForPlatformViewTests:@"platform_view_cliprrect"]; } else if ([[[NSProcessInfo processInfo] arguments] containsObject:@"--platform-view-clippath"]) { [self readyContextForPlatformViewTests:@"platform_view_clippath"]; - } else if ([[[NSProcessInfo processInfo] arguments] containsObject:@"--platform-view-transform"]) { + } else if ([[[NSProcessInfo processInfo] arguments] + containsObject:@"--platform-view-transform"]) { [self readyContextForPlatformViewTests:@"platform_view_transform"]; } else if ([[[NSProcessInfo processInfo] arguments] containsObject:@"--platform-view-opacity"]) { [self readyContextForPlatformViewTests:@"platform_view_opacity"]; @@ -39,23 +41,23 @@ - (BOOL)application:(UIApplication*)application return [super application:application didFinishLaunchingWithOptions:launchOptions]; } -- (void)readyContextForPlatformViewTests:(NSString *)scenarioMessage { +- (void)readyContextForPlatformViewTests:(NSString*)scenarioMessage { FlutterEngine* engine = [[FlutterEngine alloc] initWithName:@"PlatformViewTest" project:nil]; [engine runWithEntrypoint:nil]; FlutterViewController* flutterViewController = - [[NoStatusBarFlutterViewController alloc] initWithEngine:engine nibName:nil bundle:nil]; + [[NoStatusBarFlutterViewController alloc] initWithEngine:engine nibName:nil bundle:nil]; [engine.binaryMessenger - setMessageHandlerOnChannel:@"scenario_status" - binaryMessageHandler:^(NSData* _Nullable message, FlutterBinaryReply _Nonnull reply) { - [engine.binaryMessenger - sendOnChannel:@"set_scenario" - message:[scenarioMessage dataUsingEncoding:NSUTF8StringEncoding]]; - }]; + setMessageHandlerOnChannel:@"scenario_status" + binaryMessageHandler:^(NSData* _Nullable message, FlutterBinaryReply _Nonnull reply) { + [engine.binaryMessenger + sendOnChannel:@"set_scenario" + message:[scenarioMessage dataUsingEncoding:NSUTF8StringEncoding]]; + }]; TextPlatformViewFactory* textPlatformViewFactory = - [[TextPlatformViewFactory alloc] initWithMessenger:flutterViewController.binaryMessenger]; + [[TextPlatformViewFactory alloc] initWithMessenger:flutterViewController.binaryMessenger]; NSObject* registrar = - [flutterViewController.engine registrarForPlugin:@"scenarios/TextPlatformViewPlugin"]; + [flutterViewController.engine registrarForPlugin:@"scenarios/TextPlatformViewPlugin"]; [registrar registerViewFactory:textPlatformViewFactory withId:@"scenarios/textPlatformView"]; self.window.rootViewController = flutterViewController; } diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewMutationTests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewMutationTests.m index c1f2e636bd04b..13c3b75b476f8 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewMutationTests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewMutationTests.m @@ -20,23 +20,23 @@ - (void)setUp { self.continueAfterFailure = NO; self.application = [[XCUIApplication alloc] init]; - self.application.launchArguments = @[@"--platform-view-cliprect"]; + self.application.launchArguments = @[ @"--platform-view-cliprect" ]; [self.application launch]; } - (void)testPlatformView { - - XCUIElement *element = self.application.textViews.firstMatch; + XCUIElement* element = self.application.textViews.firstMatch; BOOL exists = [element waitForExistenceWithTimeout:kTimeToWaitForPlatformView]; if (!exists) { XCTFail(@"It took longer than %@ second to find the platform view." @"There might be issues with the platform view's construction," - @"or with how the scenario is built.", @(kTimeToWaitForPlatformView)); + @"or with how the scenario is built.", + @(kTimeToWaitForPlatformView)); } NSBundle* bundle = [NSBundle bundleForClass:[self class]]; - NSString* goldenName = - [NSString stringWithFormat:@"golden_platform_view_cliprect_%@", [PlatformViewUITestUtil platformName]]; + NSString* goldenName = [NSString + stringWithFormat:@"golden_platform_view_cliprect_%@", [PlatformViewUITestUtil platformName]]; NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; @@ -76,23 +76,23 @@ - (void)setUp { self.continueAfterFailure = NO; self.application = [[XCUIApplication alloc] init]; - self.application.launchArguments = @[@"--platform-view-cliprrect"]; + self.application.launchArguments = @[ @"--platform-view-cliprrect" ]; [self.application launch]; } - (void)testPlatformView { - - XCUIElement *element = self.application.otherElements.firstMatch; + XCUIElement* element = self.application.otherElements.firstMatch; BOOL exists = [element waitForExistenceWithTimeout:kTimeToWaitForPlatformView]; if (!exists) { XCTFail(@"It took longer than %@ second to find the platform view." @"There might be issues with the platform view's construction," - @"or with how the scenario is built.", @(kTimeToWaitForPlatformView)); + @"or with how the scenario is built.", + @(kTimeToWaitForPlatformView)); } NSBundle* bundle = [NSBundle bundleForClass:[self class]]; - NSString* goldenName = - [NSString stringWithFormat:@"golden_platform_view_cliprrect_%@", [PlatformViewUITestUtil platformName]]; + NSString* goldenName = [NSString + stringWithFormat:@"golden_platform_view_cliprrect_%@", [PlatformViewUITestUtil platformName]]; NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; @@ -132,23 +132,23 @@ - (void)setUp { self.continueAfterFailure = NO; self.application = [[XCUIApplication alloc] init]; - self.application.launchArguments = @[@"--platform-view-clippath"]; + self.application.launchArguments = @[ @"--platform-view-clippath" ]; [self.application launch]; } - (void)testPlatformView { - - XCUIElement *element = self.application.otherElements.firstMatch; + XCUIElement* element = self.application.otherElements.firstMatch; BOOL exists = [element waitForExistenceWithTimeout:kTimeToWaitForPlatformView]; if (!exists) { XCTFail(@"It took longer than %@ second to find the platform view." @"There might be issues with the platform view's construction," - @"or with how the scenario is built.", @(kTimeToWaitForPlatformView)); + @"or with how the scenario is built.", + @(kTimeToWaitForPlatformView)); } NSBundle* bundle = [NSBundle bundleForClass:[self class]]; - NSString* goldenName = - [NSString stringWithFormat:@"golden_platform_view_clippath_%@", [PlatformViewUITestUtil platformName]]; + NSString* goldenName = [NSString + stringWithFormat:@"golden_platform_view_clippath_%@", [PlatformViewUITestUtil platformName]]; NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; @@ -188,23 +188,23 @@ - (void)setUp { self.continueAfterFailure = NO; self.application = [[XCUIApplication alloc] init]; - self.application.launchArguments = @[@"--platform-view-transform"]; + self.application.launchArguments = @[ @"--platform-view-transform" ]; [self.application launch]; } - (void)testPlatformView { - - XCUIElement *element = self.application.otherElements.firstMatch; + XCUIElement* element = self.application.otherElements.firstMatch; BOOL exists = [element waitForExistenceWithTimeout:kTimeToWaitForPlatformView]; if (!exists) { XCTFail(@"It took longer than %@ second to find the platform view." @"There might be issues with the platform view's construction," - @"or with how the scenario is built.", @(kTimeToWaitForPlatformView)); + @"or with how the scenario is built.", + @(kTimeToWaitForPlatformView)); } NSBundle* bundle = [NSBundle bundleForClass:[self class]]; - NSString* goldenName = - [NSString stringWithFormat:@"golden_platform_view_transform_%@", [PlatformViewUITestUtil platformName]]; + NSString* goldenName = [NSString + stringWithFormat:@"golden_platform_view_transform_%@", [PlatformViewUITestUtil platformName]]; NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; @@ -244,24 +244,23 @@ - (void)setUp { self.continueAfterFailure = NO; self.application = [[XCUIApplication alloc] init]; - self.application.launchArguments = @[@"--platform-view-opacity"]; + self.application.launchArguments = @[ @"--platform-view-opacity" ]; [self.application launch]; } - (void)testPlatformView { - - XCUIElement *element = self.application.textViews.firstMatch; + XCUIElement* element = self.application.textViews.firstMatch; BOOL exists = [element waitForExistenceWithTimeout:kTimeToWaitForPlatformView]; if (!exists) { XCTFail(@"It took longer than %@ second to find the platform view." @"There might be issues with the platform view's construction," - @"or with how the scenario is built.", @(kTimeToWaitForPlatformView)); + @"or with how the scenario is built.", + @(kTimeToWaitForPlatformView)); } - NSBundle* bundle = [NSBundle bundleForClass:[self class]]; - NSString* goldenName = - [NSString stringWithFormat:@"golden_platform_view_opacity_%@", [PlatformViewUITestUtil platformName]]; + NSString* goldenName = [NSString + stringWithFormat:@"golden_platform_view_opacity_%@", [PlatformViewUITestUtil platformName]]; NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.m index ed0185b7f7896..43c1a87642dad 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.m @@ -11,7 +11,7 @@ @implementation PlatformViewUITestUtil + (NSString*)platformName { NSString* simulatorName = - [[NSProcessInfo processInfo].environment objectForKey:@"SIMULATOR_DEVICE_NAME"]; + [[NSProcessInfo processInfo].environment objectForKey:@"SIMULATOR_DEVICE_NAME"]; if (simulatorName) { return [NSString stringWithFormat:@"%@_simulator", simulatorName]; } @@ -52,15 +52,15 @@ + (BOOL)compareImage:(UIImage*)a toOther:(UIImage*)b { NSUInteger bytesPerRow = bytesPerPixel * widthA; NSUInteger bitsPerComponent = 8; CGContextRef contextA = - CGBitmapContextCreate(rawA.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, - colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); + CGBitmapContextCreate(rawA.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, + colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGContextDrawImage(contextA, CGRectMake(0, 0, widthA, heightA), imageRefA); CGContextRelease(contextA); CGContextRef contextB = - CGBitmapContextCreate(rawB.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, - colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); + CGBitmapContextCreate(rawB.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, + colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGColorSpaceRelease(colorSpace); CGContextDrawImage(contextB, CGRectMake(0, 0, widthA, heightA), imageRefB); From 5be3a9e4622402d6a6606a81dfd045182c62b87f Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 29 Aug 2019 13:14:33 -0700 Subject: [PATCH 06/10] review fixes --- .../Scenarios.xcodeproj/project.pbxproj | 68 +++-- .../ios/Scenarios/Scenarios/AppDelegate.m | 1 + .../Scenarios/ScenariosUITests/GoldenImage.h | 26 ++ .../Scenarios/ScenariosUITests/GoldenImage.m | 102 +++++++ .../GoldenPlatformViewTests.h | 29 ++ .../GoldenPlatformViewTests.m | 68 +++++ .../PlatformViewGoldenTestManager.h | 26 ++ .../PlatformViewGoldenTestManager.m | 59 ++++ .../PlatformViewMutationTests.m | 287 ------------------ .../ScenariosUITests/PlatformViewUITestUtil.h | 19 -- .../ScenariosUITests/PlatformViewUITestUtil.m | 76 ----- .../ScenariosUITests/PlatformViewUITests.m | 142 ++++++--- ...form_view_clippath_iPhone SE_simulator.png | Bin 27336 -> 24415 bytes ...form_view_cliprect_iPhone SE_simulator.png | Bin 23290 -> 21381 bytes ...orm_view_cliprrect_iPhone SE_simulator.png | Bin 26625 -> 23202 bytes ...tform_view_opacity_iPhone SE_simulator.png | Bin 28019 -> 30120 bytes ...orm_view_transform_iPhone SE_simulator.png | Bin 27591 -> 28020 bytes .../scenario_app/lib/src/platform_view.dart | 182 +++++------ testing/scenario_app/pubspec.yaml | 1 + 19 files changed, 522 insertions(+), 564 deletions(-) create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.h create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewMutationTests.m delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.h delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.m diff --git a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj index 34b46f8f655a0..841effcbc8d23 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj +++ b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj @@ -27,13 +27,14 @@ 24D47D1B230C79840069DD5E /* golden_platform_view_D211AP.png in Resources */ = {isa = PBXBuildFile; fileRef = 24D47D1A230C79840069DD5E /* golden_platform_view_D211AP.png */; }; 24D47D1D230CA2700069DD5E /* golden_platform_view_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 24D47D1C230CA2700069DD5E /* golden_platform_view_iPhone SE_simulator.png */; }; 24F1FB89230B4579005ACE7C /* TextPlatformView.m in Sources */ = {isa = PBXBuildFile; fileRef = 24F1FB87230B4579005ACE7C /* TextPlatformView.m */; }; - 6816DB8F2315E72D00A51400 /* PlatformViewUITestUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 6816DB8E2315E72D00A51400 /* PlatformViewUITestUtil.m */; }; - 6816DB912315E7E000A51400 /* PlatformViewMutationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6816DB902315E7E000A51400 /* PlatformViewMutationTests.m */; }; - 6816DB952316F67600A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DB922316F67500A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png */; }; - 6816DB962316F67600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DB932316F67600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png */; }; - 6816DB972316F67600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DB942316F67600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png */; }; - 6816DB99231717B600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DB98231717B600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png */; }; - 6816DB9B231723A700A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DB9A231723A700A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png */; }; + 6816DB9E231750ED00A51400 /* GoldenPlatformViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6816DB9D231750ED00A51400 /* GoldenPlatformViewTests.m */; }; + 6816DBA12317573300A51400 /* GoldenImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 6816DBA02317573300A51400 /* GoldenImage.m */; }; + 6816DBA42318358200A51400 /* PlatformViewGoldenTestManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6816DBA32318358200A51400 /* PlatformViewGoldenTestManager.m */; }; + 6816DBAA2318696600A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DBA52318696600A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png */; }; + 6816DBAB2318696600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DBA62318696600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png */; }; + 6816DBAC2318696600A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DBA72318696600A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png */; }; + 6816DBAD2318696600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DBA82318696600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png */; }; + 6816DBAE2318696600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DBA92318696600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -112,14 +113,17 @@ 24D47D1E230CA4480069DD5E /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 24F1FB87230B4579005ACE7C /* TextPlatformView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TextPlatformView.m; sourceTree = ""; }; 24F1FB88230B4579005ACE7C /* TextPlatformView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextPlatformView.h; sourceTree = ""; }; - 6816DB8D2315E72D00A51400 /* PlatformViewUITestUtil.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlatformViewUITestUtil.h; sourceTree = ""; }; - 6816DB8E2315E72D00A51400 /* PlatformViewUITestUtil.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PlatformViewUITestUtil.m; sourceTree = ""; }; - 6816DB902315E7E000A51400 /* PlatformViewMutationTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PlatformViewMutationTests.m; sourceTree = ""; }; - 6816DB922316F67500A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_clippath_iPhone SE_simulator.png"; sourceTree = ""; }; - 6816DB932316F67600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprrect_iPhone SE_simulator.png"; sourceTree = ""; }; - 6816DB942316F67600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprect_iPhone SE_simulator.png"; sourceTree = ""; }; - 6816DB98231717B600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_transform_iPhone SE_simulator.png"; sourceTree = ""; }; - 6816DB9A231723A700A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_opacity_iPhone SE_simulator.png"; sourceTree = ""; }; + 6816DB9C231750ED00A51400 /* GoldenPlatformViewTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GoldenPlatformViewTests.h; sourceTree = ""; }; + 6816DB9D231750ED00A51400 /* GoldenPlatformViewTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoldenPlatformViewTests.m; sourceTree = ""; }; + 6816DB9F2317573300A51400 /* GoldenImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GoldenImage.h; sourceTree = ""; }; + 6816DBA02317573300A51400 /* GoldenImage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoldenImage.m; sourceTree = ""; }; + 6816DBA22318358200A51400 /* PlatformViewGoldenTestManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlatformViewGoldenTestManager.h; sourceTree = ""; }; + 6816DBA32318358200A51400 /* PlatformViewGoldenTestManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PlatformViewGoldenTestManager.m; sourceTree = ""; }; + 6816DBA52318696600A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_clippath_iPhone SE_simulator.png"; sourceTree = ""; }; + 6816DBA62318696600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_transform_iPhone SE_simulator.png"; sourceTree = ""; }; + 6816DBA72318696600A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_opacity_iPhone SE_simulator.png"; sourceTree = ""; }; + 6816DBA82318696600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprect_iPhone SE_simulator.png"; sourceTree = ""; }; + 6816DBA92318696600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprrect_iPhone SE_simulator.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -202,17 +206,20 @@ 244EA6CF230DBE8900B2D26E /* golden_platform_view_D21AP.png */, 24D47D1C230CA2700069DD5E /* golden_platform_view_iPhone SE_simulator.png */, 24D47D1A230C79840069DD5E /* golden_platform_view_D211AP.png */, - 6816DB922316F67500A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png */, - 6816DB932316F67600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png */, - 6816DB942316F67600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png */, - 6816DB98231717B600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png */, - 6816DB9A231723A700A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png */, + 6816DBA52318696600A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png */, + 6816DBA82318696600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png */, + 6816DBA92318696600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png */, + 6816DBA72318696600A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png */, + 6816DBA62318696600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png */, 248D76EE22E388380012F0C1 /* PlatformViewUITests.m */, 248D76F022E388380012F0C1 /* Info.plist */, 24D47D1E230CA4480069DD5E /* README.md */, - 6816DB8D2315E72D00A51400 /* PlatformViewUITestUtil.h */, - 6816DB8E2315E72D00A51400 /* PlatformViewUITestUtil.m */, - 6816DB902315E7E000A51400 /* PlatformViewMutationTests.m */, + 6816DB9C231750ED00A51400 /* GoldenPlatformViewTests.h */, + 6816DB9D231750ED00A51400 /* GoldenPlatformViewTests.m */, + 6816DB9F2317573300A51400 /* GoldenImage.h */, + 6816DBA02317573300A51400 /* GoldenImage.m */, + 6816DBA22318358200A51400 /* PlatformViewGoldenTestManager.h */, + 6816DBA32318358200A51400 /* PlatformViewGoldenTestManager.m */, ); path = ScenariosUITests; sourceTree = ""; @@ -347,14 +354,14 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 6816DBAE2318696600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png in Resources */, + 6816DBAB2318696600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png in Resources */, + 6816DBAA2318696600A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png in Resources */, + 6816DBAD2318696600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png in Resources */, 24D47D1B230C79840069DD5E /* golden_platform_view_D211AP.png in Resources */, - 6816DB972316F67600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png in Resources */, - 6816DB952316F67600A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png in Resources */, - 6816DB962316F67600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png in Resources */, - 6816DB99231717B600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png in Resources */, 24D47D1D230CA2700069DD5E /* golden_platform_view_iPhone SE_simulator.png in Resources */, 244EA6D0230DBE8900B2D26E /* golden_platform_view_D21AP.png in Resources */, - 6816DB9B231723A700A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png in Resources */, + 6816DBAC2318696600A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -384,9 +391,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6816DB912315E7E000A51400 /* PlatformViewMutationTests.m in Sources */, + 6816DBA12317573300A51400 /* GoldenImage.m in Sources */, + 6816DB9E231750ED00A51400 /* GoldenPlatformViewTests.m in Sources */, + 6816DBA42318358200A51400 /* PlatformViewGoldenTestManager.m in Sources */, 248D76EF22E388380012F0C1 /* PlatformViewUITests.m in Sources */, - 6816DB8F2315E72D00A51400 /* PlatformViewUITestUtil.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m index 73db3d148c3d7..eda25c70a93d6 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m +++ b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m @@ -36,6 +36,7 @@ - (BOOL)application:(UIApplication*)application } else { self.window.rootViewController = [[UIViewController alloc] init]; } + [self.window makeKeyAndVisible]; return [super application:application didFinishLaunchingWithOptions:launchOptions]; diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h new file mode 100644 index 0000000000000..902d993c3cce7 --- /dev/null +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h @@ -0,0 +1,26 @@ +// Copyright 2013 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 + +NS_ASSUME_NONNULL_BEGIN + +@interface GoldenImage : NSObject + +@property (readonly, strong, nonatomic) NSString *goldenName; +@property (readonly, strong, nonatomic) UIImage *image; + +// Initilize with the golden file's prefix. +// +// Create an image from a golden file named prefix+devicemodel. +- (instancetype)initWithGoldenNamePrefix:(NSString *)prefix; + +// Compare this GoldenImage to `image`. +// +// Return YES if the `image` of this GoldenImage have the same pixels of provided `image`. +- (BOOL)compareGoldenToImage:(nonnull UIImage *)image; + +@end + +NS_ASSUME_NONNULL_END diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m new file mode 100644 index 0000000000000..3ba49f0a3b761 --- /dev/null +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m @@ -0,0 +1,102 @@ +// Copyright 2013 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 "GoldenImage.h" +#include +#import + +@interface GoldenImage() + +@property (readwrite, strong, nonatomic) NSString *goldenName; +@property (readwrite, strong, nonatomic) UIImage *image; +@property (strong, nonatomic) NSString *platformName; + +@end + +@implementation GoldenImage + +- (instancetype)initWithGoldenNamePrefix:(NSString *)prefix +{ + self = [super init]; + if (self) { + _goldenName = [prefix stringByAppendingString:self.platformName]; + NSBundle* bundle = [NSBundle bundleForClass:[self class]]; + NSURL* goldenURL = [bundle URLForResource:_goldenName withExtension:@"png"]; + NSData *data = [NSData dataWithContentsOfURL:goldenURL]; + _image = [[UIImage alloc] initWithData:data]; + } + return self; +} + +- (BOOL)compareGoldenToImage:(UIImage *)image { + if (!self.image || !image) { + return NO; + } + CGImageRef imageRefA = [self.image CGImage]; + CGImageRef imageRefB = [image CGImage]; + + NSUInteger widthA = CGImageGetWidth(imageRefA); + NSUInteger heightA = CGImageGetHeight(imageRefA); + NSUInteger widthB = CGImageGetWidth(imageRefB); + NSUInteger heightB = CGImageGetHeight(imageRefB); + + if (widthA != widthB || heightA != heightB) { + return NO; + } + NSUInteger bytesPerPixel = 4; + NSUInteger size = widthA * heightA * bytesPerPixel; + NSMutableData* rawA = [NSMutableData dataWithLength:size]; + NSMutableData* rawB = [NSMutableData dataWithLength:size]; + + if (!rawA || !rawB) { + return NO; + } + + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + + NSUInteger bytesPerRow = bytesPerPixel * widthA; + NSUInteger bitsPerComponent = 8; + CGContextRef contextA = + CGBitmapContextCreate(rawA.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, + colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); + + CGContextDrawImage(contextA, CGRectMake(0, 0, widthA, heightA), imageRefA); + CGContextRelease(contextA); + + CGContextRef contextB = + CGBitmapContextCreate(rawB.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, + colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); + CGColorSpaceRelease(colorSpace); + + CGContextDrawImage(contextB, CGRectMake(0, 0, widthA, heightA), imageRefB); + CGContextRelease(contextB); + + if (memcmp(rawA.mutableBytes, rawB.mutableBytes, size)) { + return NO; + } + + return YES; +} + +- (NSString *)platformName { + if (!_platformName) { + NSString* simulatorName = + [[NSProcessInfo processInfo].environment objectForKey:@"SIMULATOR_DEVICE_NAME"]; + if (simulatorName) { + return [NSString stringWithFormat:@"%@_simulator", simulatorName]; + } + + size_t size; + sysctlbyname("hw.model", NULL, &size, NULL, 0); + char* answer = malloc(size); + sysctlbyname("hw.model", answer, &size, NULL, 0); + + NSString* results = [NSString stringWithCString:answer encoding:NSUTF8StringEncoding]; + free(answer); + _platformName = results; + } + return _platformName; +} + +@end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h new file mode 100644 index 0000000000000..ec06530a8c2a5 --- /dev/null +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h @@ -0,0 +1,29 @@ +// Copyright 2013 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 +#import "PlatformViewGoldenTestManager.h" + +NS_ASSUME_NONNULL_BEGIN + +// The base class of all the PlatformView golden tests. +// +// A new PlatformView golden tests can subclass this and override the `-initiWithInvocation:` method, +// which then retun the `-initWithManager:invocation:` +// +// Then in any test method, call `checkGolden` to perform the golden test. +// +// This base class doesn't run any test case on its own. +@interface GoldenPlatformViewTests : XCTestCase + +// Initialize with a `PlatformViewGoldenTestManager`. +- (instancetype)initWithManager:(PlatformViewGoldenTestManager *)manager invocation:(NSInvocation *)invocation; + +// Take a sceenshot of the test app and check it has the same pixels with goldenImage inside the +// `PlatformViewGoldenTestManager`. +- (void)checkGolden; + +@end + +NS_ASSUME_NONNULL_END diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m new file mode 100644 index 0000000000000..50805625f11fc --- /dev/null +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m @@ -0,0 +1,68 @@ +// Copyright 2013 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 "GoldenPlatformViewTests.h" +#include +#import "PlatformViewGoldenTestManager.h" + +static const NSInteger kSecondsToWaitForPlatformView = 30; + +@interface GoldenPlatformViewTests() + +@property(nonatomic, strong) NSString* launchArguments; +@property (copy) NSString* goldenName; +@property(nonatomic, strong) XCUIApplication* application; + +@property (strong, nonatomic)PlatformViewGoldenTestManager *manager; + +@end + +@implementation GoldenPlatformViewTests + +- (instancetype)initWithManager:(PlatformViewGoldenTestManager *)manager invocation:(NSInvocation *)invocation { + self = [super initWithInvocation:invocation]; + _manager = manager; + return self; +} + +- (void)setUp { + [super setUp]; + self.continueAfterFailure = NO; + + self.application = [[XCUIApplication alloc] init]; + self.application.launchArguments = self.manager.launchArgs; + [self.application launch]; +} + +// Note: don't prefix with "test" or GoldenPlatformViewTests will run instead of the subclasses. +- (void)checkGolden { + XCUIElement* element = self.application.textViews.firstMatch; + BOOL exists = [element waitForExistenceWithTimeout:kSecondsToWaitForPlatformView]; + if (!exists) { + XCTFail(@"It took longer than %@ second to find the platform view." + @"There might be issues with the platform view's construction," + @"or with how the scenario is built.", + @(kSecondsToWaitForPlatformView)); + } + + GoldenImage *golden = self.manager.goldenImage; + + XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; + XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; + attachment.lifetime = XCTAttachmentLifetimeKeepAlways; + [self addAttachment:attachment]; + + if (golden.image) { + XCTAttachment* goldenAttachment = [XCTAttachment attachmentWithImage:golden.image]; + goldenAttachment.lifetime = XCTAttachmentLifetimeKeepAlways; + [self addAttachment:goldenAttachment]; + } else { + XCTFail(@"This test will fail - no golden named %@ found. Follow the steps in the " + @"README to add a new golden.", + golden.goldenName); + } + + XCTAssertTrue([golden compareGoldenToImage:screenshot.image]); +} +@end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.h b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.h new file mode 100644 index 0000000000000..8f0ed009a0b15 --- /dev/null +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.h @@ -0,0 +1,26 @@ +// Copyright 2013 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 +#import "GoldenImage.h" + +NS_ASSUME_NONNULL_BEGIN + +// Manages a `GoldenPlatformViewTests`. +// +// It creates the correct GoldenImage based on the `identifer`. +// It also generates the correct launchArgs to launch the associate platform view scenario. +@interface PlatformViewGoldenTestManager : NSObject + +@property (readonly, strong, nonatomic) GoldenImage *goldenImage; +@property (readonly, strong, nonatomic) NSArray *launchArgs; + +// Initilize with identifier. +// +// Crahes if the identifier is not mapped in `launchArgsMap` inside PlatformViewGoldenTestManager.m +- (instancetype)initWithIdentifier:(nonnull NSString *)identifier; + +@end + +NS_ASSUME_NONNULL_END diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m new file mode 100644 index 0000000000000..eecd0feb54def --- /dev/null +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m @@ -0,0 +1,59 @@ +// Copyright 2013 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 "PlatformViewGoldenTestManager.h" + +@interface PlatformViewGoldenTestManager() + +@property (readwrite, strong, nonatomic) GoldenImage *goldenImage; +@property (readwrite, strong, nonatomic) NSArray *launchArgs; + +// Maps the `identifier` to the launch args for the platform view test associated with this `GoldenImage` +@property (class, nonatomic, strong) NSDictionary *launchArgsMap; + +@end + +@implementation PlatformViewGoldenTestManager + +static NSDictionary* _launchArgsMap; + ++ (void)initialize +{ + if (self == [PlatformViewGoldenTestManager class]) { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [self setLaunchArgsMap:@{ + @"platform_view": @[@"--platform-view"], + @"platform_view_cliprect": @[@"--platform-view-cliprect" ], + @"platform_view_cliprrect": @[@"--platform-view-cliprrect"], + @"platform_view_clippath": @[@"--platform-view-clippath" ], + @"platform_view_transform": @[@"--platform-view-transform"], + @"platform_view_opacity": @[@"--platform-view-opacity"], + }]; + }); + } +} + ++ (NSDictionary *)launchArgsMap { + return _launchArgsMap; +} + ++ (void)setLaunchArgsMap:(NSDictionary *)launchArgsMap { + _launchArgsMap = launchArgsMap; +} + +- (instancetype)initWithIdentifier:(NSString *)identifier +{ + self = [super init]; + if (self) { + _launchArgs = [PlatformViewGoldenTestManager launchArgsMap][identifier]; + NSString *prefix = [NSString stringWithFormat:@"golden_%@_", identifier]; + _goldenImage = [[GoldenImage alloc] initWithGoldenNamePrefix:prefix]; + } + return self; +} + + +@end + diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewMutationTests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewMutationTests.m deleted file mode 100644 index 13c3b75b476f8..0000000000000 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewMutationTests.m +++ /dev/null @@ -1,287 +0,0 @@ -// Copyright 2013 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 -#import "../Scenarios/TextPlatformView.h" -#import "PlatformViewUITestUtil.h" - -// Clip Rect Tests -@interface PlatformViewMutationClipRectTests : XCTestCase - -@property(nonatomic, strong) XCUIApplication* application; - -@end - -@implementation PlatformViewMutationClipRectTests - -- (void)setUp { - [super setUp]; - self.continueAfterFailure = NO; - - self.application = [[XCUIApplication alloc] init]; - self.application.launchArguments = @[ @"--platform-view-cliprect" ]; - [self.application launch]; -} - -- (void)testPlatformView { - XCUIElement* element = self.application.textViews.firstMatch; - BOOL exists = [element waitForExistenceWithTimeout:kTimeToWaitForPlatformView]; - if (!exists) { - XCTFail(@"It took longer than %@ second to find the platform view." - @"There might be issues with the platform view's construction," - @"or with how the scenario is built.", - @(kTimeToWaitForPlatformView)); - } - - NSBundle* bundle = [NSBundle bundleForClass:[self class]]; - NSString* goldenName = [NSString - stringWithFormat:@"golden_platform_view_cliprect_%@", [PlatformViewUITestUtil platformName]]; - NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; - UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; - - XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; - XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; - attachment.name = @"current screen shot"; - attachment.lifetime = XCTAttachmentLifetimeKeepAlways; - [self addAttachment:attachment]; - - if (golden) { - XCTAttachment* goldenAttachment = [XCTAttachment attachmentWithImage:golden]; - goldenAttachment.lifetime = XCTAttachmentLifetimeKeepAlways; - goldenAttachment.name = @"golden"; - [self addAttachment:goldenAttachment]; - } else { - XCTFail(@"This test will fail - no golden named %@ found. Follow the steps in the " - @"README to add a new golden.", - goldenName); - } - - XCTAssertTrue([PlatformViewUITestUtil compareImage:golden toOther:screenshot.image]); -} - -@end - -// Clip RRect Tests -@interface PlatformViewMutationClipRRectTests : XCTestCase - -@property(nonatomic, strong) XCUIApplication* application; - -@end - -@implementation PlatformViewMutationClipRRectTests - -- (void)setUp { - [super setUp]; - self.continueAfterFailure = NO; - - self.application = [[XCUIApplication alloc] init]; - self.application.launchArguments = @[ @"--platform-view-cliprrect" ]; - [self.application launch]; -} - -- (void)testPlatformView { - XCUIElement* element = self.application.otherElements.firstMatch; - BOOL exists = [element waitForExistenceWithTimeout:kTimeToWaitForPlatformView]; - if (!exists) { - XCTFail(@"It took longer than %@ second to find the platform view." - @"There might be issues with the platform view's construction," - @"or with how the scenario is built.", - @(kTimeToWaitForPlatformView)); - } - - NSBundle* bundle = [NSBundle bundleForClass:[self class]]; - NSString* goldenName = [NSString - stringWithFormat:@"golden_platform_view_cliprrect_%@", [PlatformViewUITestUtil platformName]]; - NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; - UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; - - XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; - XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; - attachment.name = @"current screen shot"; - attachment.lifetime = XCTAttachmentLifetimeKeepAlways; - [self addAttachment:attachment]; - - if (golden) { - XCTAttachment* goldenAttachment = [XCTAttachment attachmentWithImage:golden]; - goldenAttachment.lifetime = XCTAttachmentLifetimeKeepAlways; - goldenAttachment.name = @"golden"; - [self addAttachment:goldenAttachment]; - } else { - XCTFail(@"This test will fail - no golden named %@ found. Follow the steps in the " - @"README to add a new golden.", - goldenName); - } - - XCTAssertTrue([PlatformViewUITestUtil compareImage:golden toOther:screenshot.image]); -} - -@end - -// Clip Path Tests -@interface PlatformViewMutationClipPathTests : XCTestCase - -@property(nonatomic, strong) XCUIApplication* application; - -@end - -@implementation PlatformViewMutationClipPathTests - -- (void)setUp { - [super setUp]; - self.continueAfterFailure = NO; - - self.application = [[XCUIApplication alloc] init]; - self.application.launchArguments = @[ @"--platform-view-clippath" ]; - [self.application launch]; -} - -- (void)testPlatformView { - XCUIElement* element = self.application.otherElements.firstMatch; - BOOL exists = [element waitForExistenceWithTimeout:kTimeToWaitForPlatformView]; - if (!exists) { - XCTFail(@"It took longer than %@ second to find the platform view." - @"There might be issues with the platform view's construction," - @"or with how the scenario is built.", - @(kTimeToWaitForPlatformView)); - } - - NSBundle* bundle = [NSBundle bundleForClass:[self class]]; - NSString* goldenName = [NSString - stringWithFormat:@"golden_platform_view_clippath_%@", [PlatformViewUITestUtil platformName]]; - NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; - UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; - - XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; - XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; - attachment.name = @"current screen shot"; - attachment.lifetime = XCTAttachmentLifetimeKeepAlways; - [self addAttachment:attachment]; - - if (golden) { - XCTAttachment* goldenAttachment = [XCTAttachment attachmentWithImage:golden]; - goldenAttachment.lifetime = XCTAttachmentLifetimeKeepAlways; - goldenAttachment.name = @"golden"; - [self addAttachment:goldenAttachment]; - } else { - XCTFail(@"This test will fail - no golden named %@ found. Follow the steps in the " - @"README to add a new golden.", - goldenName); - } - - XCTAssertTrue([PlatformViewUITestUtil compareImage:golden toOther:screenshot.image]); -} - -@end - -// Transform tests -@interface PlatformViewMutationTransformTests : XCTestCase - -@property(nonatomic, strong) XCUIApplication* application; - -@end - -@implementation PlatformViewMutationTransformTests - -- (void)setUp { - [super setUp]; - self.continueAfterFailure = NO; - - self.application = [[XCUIApplication alloc] init]; - self.application.launchArguments = @[ @"--platform-view-transform" ]; - [self.application launch]; -} - -- (void)testPlatformView { - XCUIElement* element = self.application.otherElements.firstMatch; - BOOL exists = [element waitForExistenceWithTimeout:kTimeToWaitForPlatformView]; - if (!exists) { - XCTFail(@"It took longer than %@ second to find the platform view." - @"There might be issues with the platform view's construction," - @"or with how the scenario is built.", - @(kTimeToWaitForPlatformView)); - } - - NSBundle* bundle = [NSBundle bundleForClass:[self class]]; - NSString* goldenName = [NSString - stringWithFormat:@"golden_platform_view_transform_%@", [PlatformViewUITestUtil platformName]]; - NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; - UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; - - XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; - XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; - attachment.name = @"current screen shot"; - attachment.lifetime = XCTAttachmentLifetimeKeepAlways; - [self addAttachment:attachment]; - - if (golden) { - XCTAttachment* goldenAttachment = [XCTAttachment attachmentWithImage:golden]; - goldenAttachment.lifetime = XCTAttachmentLifetimeKeepAlways; - goldenAttachment.name = @"golden"; - [self addAttachment:goldenAttachment]; - } else { - XCTFail(@"This test will fail - no golden named %@ found. Follow the steps in the " - @"README to add a new golden.", - goldenName); - } - - XCTAssertTrue([PlatformViewUITestUtil compareImage:golden toOther:screenshot.image]); -} - -@end - -// Opacity tests -@interface PlatformViewMutationOpacityTests : XCTestCase - -@property(nonatomic, strong) XCUIApplication* application; - -@end - -@implementation PlatformViewMutationOpacityTests - -- (void)setUp { - [super setUp]; - self.continueAfterFailure = NO; - - self.application = [[XCUIApplication alloc] init]; - self.application.launchArguments = @[ @"--platform-view-opacity" ]; - [self.application launch]; -} - -- (void)testPlatformView { - XCUIElement* element = self.application.textViews.firstMatch; - BOOL exists = [element waitForExistenceWithTimeout:kTimeToWaitForPlatformView]; - if (!exists) { - XCTFail(@"It took longer than %@ second to find the platform view." - @"There might be issues with the platform view's construction," - @"or with how the scenario is built.", - @(kTimeToWaitForPlatformView)); - } - - NSBundle* bundle = [NSBundle bundleForClass:[self class]]; - NSString* goldenName = [NSString - stringWithFormat:@"golden_platform_view_opacity_%@", [PlatformViewUITestUtil platformName]]; - NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; - UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; - - XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; - XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; - attachment.name = @"current screen shot"; - attachment.lifetime = XCTAttachmentLifetimeKeepAlways; - [self addAttachment:attachment]; - - if (golden) { - XCTAttachment* goldenAttachment = [XCTAttachment attachmentWithImage:golden]; - goldenAttachment.lifetime = XCTAttachmentLifetimeKeepAlways; - goldenAttachment.name = @"golden"; - [self addAttachment:goldenAttachment]; - } else { - XCTFail(@"This test will fail - no golden named %@ found. Follow the steps in the " - @"README to add a new golden.", - goldenName); - } - - XCTAssertTrue([PlatformViewUITestUtil compareImage:golden toOther:screenshot.image]); -} - -@end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.h b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.h deleted file mode 100644 index 4c02c360e8586..0000000000000 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.h +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2013 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 - -NS_ASSUME_NONNULL_BEGIN - -extern const NSInteger kTimeToWaitForPlatformView; - -@interface PlatformViewUITestUtil : NSObject - -+ (NSString*)platformName; - -+ (BOOL)compareImage:(UIImage*)a toOther:(UIImage*)b; - -@end - -NS_ASSUME_NONNULL_END diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.m deleted file mode 100644 index 43c1a87642dad..0000000000000 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITestUtil.m +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2013 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 "PlatformViewUITestUtil.h" -#include - -const NSInteger kTimeToWaitForPlatformView = 5; - -@implementation PlatformViewUITestUtil - -+ (NSString*)platformName { - NSString* simulatorName = - [[NSProcessInfo processInfo].environment objectForKey:@"SIMULATOR_DEVICE_NAME"]; - if (simulatorName) { - return [NSString stringWithFormat:@"%@_simulator", simulatorName]; - } - - size_t size; - sysctlbyname("hw.model", NULL, &size, NULL, 0); - char* answer = malloc(size); - sysctlbyname("hw.model", answer, &size, NULL, 0); - - NSString* results = [NSString stringWithCString:answer encoding:NSUTF8StringEncoding]; - free(answer); - return results; -} - -+ (BOOL)compareImage:(UIImage*)a toOther:(UIImage*)b { - CGImageRef imageRefA = [a CGImage]; - CGImageRef imageRefB = [b CGImage]; - - NSUInteger widthA = CGImageGetWidth(imageRefA); - NSUInteger heightA = CGImageGetHeight(imageRefA); - NSUInteger widthB = CGImageGetWidth(imageRefB); - NSUInteger heightB = CGImageGetHeight(imageRefB); - - if (widthA != widthB || heightA != heightB) { - return NO; - } - NSUInteger bytesPerPixel = 4; - NSUInteger size = widthA * heightA * bytesPerPixel; - NSMutableData* rawA = [NSMutableData dataWithLength:size]; - NSMutableData* rawB = [NSMutableData dataWithLength:size]; - - if (!rawA || !rawB) { - return NO; - } - - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - - NSUInteger bytesPerRow = bytesPerPixel * widthA; - NSUInteger bitsPerComponent = 8; - CGContextRef contextA = - CGBitmapContextCreate(rawA.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, - colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); - - CGContextDrawImage(contextA, CGRectMake(0, 0, widthA, heightA), imageRefA); - CGContextRelease(contextA); - - CGContextRef contextB = - CGBitmapContextCreate(rawB.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, - colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); - CGColorSpaceRelease(colorSpace); - - CGContextDrawImage(contextB, CGRectMake(0, 0, widthA, heightA), imageRefB); - CGContextRelease(contextB); - - if (memcmp(rawA.mutableBytes, rawB.mutableBytes, size)) { - return NO; - } - - return YES; -} - -@end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m index ec2e42e5a35a5..625640a97b05e 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m @@ -2,61 +2,113 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import -#import +#import "GoldenPlatformViewTests.h" -#import "../Scenarios/TextPlatformView.h" -#import "PlatformViewUITestUtil.h" +@interface PlatformViewUITests : GoldenPlatformViewTests -@interface PlatformViewUITests : XCTestCase -@property(nonatomic, strong) XCUIApplication* application; @end @implementation PlatformViewUITests -- (void)setUp { - [super setUp]; - self.continueAfterFailure = NO; +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + PlatformViewGoldenTestManager* manager = + [[PlatformViewGoldenTestManager alloc] initWithIdentifier:@"platform_view"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkGolden]; +} + +@end + +// Clip Rect Tests +@interface PlatformViewMutationClipRectTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipRectTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + PlatformViewGoldenTestManager* manager = + [[PlatformViewGoldenTestManager alloc] initWithIdentifier:@"platform_view_cliprect"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkGolden]; +} + +@end + +@interface PlatformViewMutationClipRRectTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipRRectTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + PlatformViewGoldenTestManager* manager = + [[PlatformViewGoldenTestManager alloc] initWithIdentifier:@"platform_view_cliprrect"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkGolden]; +} + +@end + +@interface PlatformViewMutationClipPathTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipPathTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + PlatformViewGoldenTestManager* manager = + [[PlatformViewGoldenTestManager alloc] initWithIdentifier:@"platform_view_clippath"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkGolden]; +} + +@end + +@interface PlatformViewMutationTransformTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationTransformTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + PlatformViewGoldenTestManager* manager = + [[PlatformViewGoldenTestManager alloc] initWithIdentifier:@"platform_view_transform"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkGolden]; +} + +@end + +@interface PlatformViewMutationOpacityTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationOpacityTests - self.application = [[XCUIApplication alloc] init]; - self.application.launchArguments = @[ @"--platform-view" ]; - [self.application launch]; +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + PlatformViewGoldenTestManager* manager = + [[PlatformViewGoldenTestManager alloc] initWithIdentifier:@"platform_view_opacity"]; + return [super initWithManager:manager invocation:invocation]; } - (void)testPlatformView { - XCUIElement* element = self.application.textViews.firstMatch; - BOOL exists = [element waitForExistenceWithTimeout:kTimeToWaitForPlatformView]; - if (!exists) { - XCTFail(@"It took longer than %@ second to find the platform view." - @"There might be issues with the platform view's construction," - @"or with how the scenario is built.", - @(kTimeToWaitForPlatformView)); - } - - NSBundle* bundle = [NSBundle bundleForClass:[self class]]; - NSString* goldenName = - [NSString stringWithFormat:@"golden_platform_view_%@", [PlatformViewUITestUtil platformName]]; - NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; - UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; - - XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; - XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; - attachment.name = @"current screen shot"; - attachment.lifetime = XCTAttachmentLifetimeKeepAlways; - [self addAttachment:attachment]; - - if (golden) { - XCTAttachment* goldenAttachment = [XCTAttachment attachmentWithImage:golden]; - goldenAttachment.lifetime = XCTAttachmentLifetimeKeepAlways; - goldenAttachment.name = @"golden"; - [self addAttachment:goldenAttachment]; - } else { - XCTFail(@"This test will fail - no golden named %@ found. Follow the steps in the " - @"README to add a new golden.", - goldenName); - } - - XCTAssertTrue([PlatformViewUITestUtil compareImage:golden toOther:screenshot.image]); + [self checkGolden]; } @end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_iPhone SE_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_iPhone SE_simulator.png index 015853fb6d2760b83a2674c6853fcf701e6c6409..8e776f220e84943877cec56192fc4de71ceed695 100644 GIT binary patch literal 24415 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 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_iPhone SE_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_iPhone SE_simulator.png index 738122c4846a277c5266ed2e182e8a51da72213c..90494129032151b1d2fe2a6334f38ef726435b3b 100644 GIT binary patch literal 21381 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 literal 23290 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 E3l&|Y(*OVf diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_iPhone SE_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_iPhone SE_simulator.png index 4706bbcd28f986e46342039c392dbef1e130a28c..94667b9a8254d4eb6a4044d8cde3d7dbfdca6607 100644 GIT binary patch literal 23202 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 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_opacity_iPhone SE_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_opacity_iPhone SE_simulator.png index 06a6ebb60886dc6e4281521b89bbdc6684744df6..32e0a179a5c6c8aefad0735c61b127ab2bd3d3db 100644 GIT binary patch literal 30120 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 literal 28019 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 UdduGBe{FW`h}Yq&gTdGSA8n6;*Z=?k diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_iPhone SE_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_iPhone SE_simulator.png index 6ba484b39cd8abacced5a2534c8d332091c98a50..2d86ee45cca3e4540b6a2b66d6d2702db41238fc 100644 GIT binary patch literal 28020 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 literal 27591 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 CY|^p- diff --git a/testing/scenario_app/lib/src/platform_view.dart b/testing/scenario_app/lib/src/platform_view.dart index d03bac836a387..529f4c7b3638d 100644 --- a/testing/scenario_app/lib/src/platform_view.dart +++ b/testing/scenario_app/lib/src/platform_view.dart @@ -6,7 +6,7 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; import 'dart:ui'; -import 'dart:math'; +import 'package:vector_math/vector_math.dart'; import 'scenario.dart'; @@ -27,7 +27,8 @@ List _to64(num value) { } /// A simple platform view. -class PlatformViewScenario extends Scenario with _BasePlatformViewScenarioMixin { +class PlatformViewScenario extends Scenario + with _BasePlatformViewScenarioMixin { /// Creates the PlatformView scenario. /// /// The [window] parameter must not be null. @@ -43,24 +44,14 @@ class PlatformViewScenario extends Scenario with _BasePlatformViewScenarioMixin builder.pushOffset(0, 0); - addPlatformViewToSceneBuilder(builder, 0); - - final PictureRecorder recorder = PictureRecorder(); - final Canvas canvas = Canvas(recorder); - canvas.drawCircle(const Offset(50, 50), 50, Paint()..color = const Color(0xFFABCDEF)); - final Picture picture = recorder.endRecording(); - builder.addPicture(const Offset(300, 300), picture); - - final Scene scene = builder.build(); - window.render(scene); - scene.dispose(); + finishBuilderByAddingPlatformViewAndPicture(builder, 0); } } /// Platform view with clip rect. -class PlatformViewClipRectScenario extends Scenario with _BasePlatformViewScenarioMixin { - - /// Constuct a platform view with clip rect scenario. +class PlatformViewClipRectScenario extends Scenario + with _BasePlatformViewScenarioMixin { + /// Constuct a platform view with clip rect scenario. PlatformViewClipRectScenario(Window window, String text, {int id = 0}) : assert(window != null), super(window) { @@ -71,133 +62,99 @@ class PlatformViewClipRectScenario extends Scenario with _BasePlatformViewScenar void onBeginFrame(Duration duration) { final SceneBuilder builder = SceneBuilder(); builder.pushOffset(0, 0); - builder.pushClipRect(Rect.fromLTRB(50, 50, 300, 300)); - addPlatformViewToSceneBuilder(builder, 1); - - final Scene scene = builder.build(); - window.render(scene); - scene.dispose(); + builder.pushClipRect(const Rect.fromLTRB(100, 100, 400, 400)); + finishBuilderByAddingPlatformViewAndPicture(builder, 1); } } /// Platform view with clip rrect. class PlatformViewClipRRectScenario extends PlatformViewScenario { - /// Constuct a platform view with clip rrect scenario. - PlatformViewClipRRectScenario(Window window, String text, {int id = 0}) : super(window, text, id: id); + PlatformViewClipRRectScenario(Window window, String text, {int id = 0}) + : super(window, text, id: id); @override void onBeginFrame(Duration duration) { final SceneBuilder builder = SceneBuilder(); builder.pushOffset(0, 0); - builder.pushClipRRect(RRect.fromLTRBAndCorners(50, 50, 300, 300, topLeft:Radius.circular(15), topRight:Radius.circular(50), bottomLeft:Radius.circular(50))); - addPlatformViewToSceneBuilder(builder, 2); - final Scene scene = builder.build(); - window.render(scene); - scene.dispose(); + builder.pushClipRRect( + RRect.fromLTRBAndCorners( + 100, + 100, + 400, + 400, + topLeft: const Radius.circular(15), + topRight: const Radius.circular(50), + bottomLeft: const Radius.circular(50), + ), + ); + finishBuilderByAddingPlatformViewAndPicture(builder, 2); } } /// Platform view with clip path. class PlatformViewClipPathScenario extends PlatformViewScenario { - /// Constuct a platform view with clip rrect scenario. - PlatformViewClipPathScenario(Window window, String text, {int id = 0}) : super(window, text, id: id); + PlatformViewClipPathScenario(Window window, String text, {int id = 0}) + : super(window, text, id: id); @override void onBeginFrame(Duration duration) { final SceneBuilder builder = SceneBuilder(); builder.pushOffset(0, 0); + + // Create a path of rectangle with width of 200 and height of 300, starting from (100, 100). + // + // The left side of the rectangle becomes a symmetric curve towards the left. + // The right side of the rectangle becomes a double curve. From top of bottom of the curve, it goes left then right. + // _______ + // | | + // | | + // | | + // | | + // |______| Path path = Path(); - path.moveTo(200, 0); - path.lineTo(0, 200); - path.quadraticBezierTo(80, 400, 100, 300); - path.lineTo(300, 300); - path.cubicTo(350, 200, 380, 100, 300, 0); + path.moveTo(100, 100); + path.quadraticBezierTo(50, 250, 100, 400); + path.lineTo(350, 400); + path.cubicTo(400, 300, 300, 200, 350, 100); path.close(); builder.pushClipPath(path); - addPlatformViewToSceneBuilder(builder, 3); - final Scene scene = builder.build(); - window.render(scene); - scene.dispose(); + finishBuilderByAddingPlatformViewAndPicture(builder, 3); } } /// Platform view with transform. class PlatformViewTransformScenario extends PlatformViewScenario { - /// Constuct a platform view with transform scenario. - PlatformViewTransformScenario(Window window, String text, {int id = 0}) : super(window, text, id: id); + PlatformViewTransformScenario(Window window, String text, {int id = 0}) + : super(window, text, id: id); @override void onBeginFrame(Duration duration) { final SceneBuilder builder = SceneBuilder(); builder.pushOffset(0, 0); - final Float64List matrix4 = Float64List(16); + final Matrix4 matrix4 = Matrix4.identity(); + matrix4.rotateZ(1.0); + matrix4.scale(0.5, 0.5, 1.0); + matrix4.translate(1000.0, 100.0, 0.0); - // set identify - matrix4[0] = 1.0; - matrix4[5] = 1.0; - matrix4[10] = 1.0; - matrix4[15] = 1.0; + final Float64List matrix4_64 = Float64List.fromList(matrix4.storage); + builder.pushTransform(matrix4_64); - - // rotate for 1 degree radians - const double angle = 1; - final double cosAngle = cos(angle); - final double sinAngle = sin(angle); - final double r1 = matrix4[0] * cosAngle + matrix4[4] * sinAngle; - final double r2 = matrix4[1] * cosAngle + matrix4[5] * sinAngle; - final double r3 = matrix4[2] * cosAngle + matrix4[6] * sinAngle; - final double r4 = matrix4[3] * cosAngle + matrix4[7] * sinAngle; - final double r5 = matrix4[0] * -sinAngle + matrix4[4] * cosAngle; - final double r6 = matrix4[1] * -sinAngle + matrix4[5] * cosAngle; - final double r7 = matrix4[2] * -sinAngle + matrix4[6] * cosAngle; - final double r8 = matrix4[3] * -sinAngle + matrix4[7] * cosAngle; - matrix4[0] = r1; - matrix4[1] = r2; - matrix4[2] = r3; - matrix4[3] = r4; - matrix4[4] = r5; - matrix4[5] = r6; - matrix4[6] = r7; - matrix4[7] = r8; - - // scale both x and y by half. - const double sx = 0.5; - const double sy = 0.5; - - matrix4[0] *= sx; - matrix4[1] *= sx; - matrix4[2] *= sx; - matrix4[3] *= sx; - matrix4[4] *= sy; - matrix4[5] *= sy; - matrix4[6] *= sy; - matrix4[7] *= sy; - - // translate for (300, 300) - matrix4[12] += 300; - matrix4[13] += 300; - - builder.pushTransform(matrix4); - - addPlatformViewToSceneBuilder(builder, 4); - final Scene scene = builder.build(); - window.render(scene); - scene.dispose(); + finishBuilderByAddingPlatformViewAndPicture(builder, 4); } } /// Platform view with opacity. class PlatformViewOpacityScenario extends PlatformViewScenario { - /// Constuct a platform view with transform scenario. - PlatformViewOpacityScenario(Window window, String text, {int id = 0}) : super(window, text, id: id); + PlatformViewOpacityScenario(Window window, String text, {int id = 0}) + : super(window, text, id: id); @override void onBeginFrame(Duration duration) { @@ -206,15 +163,11 @@ class PlatformViewOpacityScenario extends PlatformViewScenario { builder.pushOffset(0, 0); builder.pushOpacity(150); - addPlatformViewToSceneBuilder(builder, 5); - final Scene scene = builder.build(); - window.render(scene); - scene.dispose(); + finishBuilderByAddingPlatformViewAndPicture(builder, 5); } } mixin _BasePlatformViewScenarioMixin on Scenario { - int _textureId; /// Construct the platform view related scenario @@ -223,14 +176,15 @@ mixin _BasePlatformViewScenarioMixin on Scenario { /// Call this method in the constructor of the platform view related scenarios /// to perform necessary set up. void constructScenario(Window window, String text, int id) { - const int _valueInt32 = 3; + const int _valueInt32 = 3; const int _valueFloat64 = 6; const int _valueString = 7; const int _valueUint8List = 8; const int _valueMap = 13; final Uint8List message = Uint8List.fromList([ _valueString, - 'create'.length, // this is safe as long as these are all single byte characters. + 'create' + .length, // this is safe as long as these are all single byte characters. ...utf8.encode('create'), _valueMap, if (Platform.isIOS) @@ -284,14 +238,28 @@ mixin _BasePlatformViewScenarioMixin on Scenario { ); } - // Add a platform view to the `sceneBuilder`. - void addPlatformViewToSceneBuilder(SceneBuilder sceneBuilder, int viewId) { + // Add a platform view and a picture to the scene, then finish the `sceneBuilder`. + void finishBuilderByAddingPlatformViewAndPicture(SceneBuilder sceneBuilder, int viewId) { if (Platform.isIOS) { sceneBuilder.addPlatformView(viewId, width: 500, height: 500); } else if (Platform.isAndroid && _textureId != null) { - sceneBuilder.addTexture(_textureId, offset: const Offset(150, 300), width: 500, height: 500); + sceneBuilder.addTexture(_textureId, + offset: const Offset(150, 300), width: 500, height: 500); } else { - throw UnsupportedError('Platform ${Platform.operatingSystem} is not supported'); + throw UnsupportedError( + 'Platform ${Platform.operatingSystem} is not supported'); } + final PictureRecorder recorder = PictureRecorder(); + final Canvas canvas = Canvas(recorder); + canvas.drawCircle( + const Offset(50, 50), + 50, + Paint()..color = const Color(0xFFABCDEF), + ); + final Picture picture = recorder.endRecording(); + sceneBuilder.addPicture(const Offset(300, 300), picture); + final Scene scene = sceneBuilder.build(); + window.render(scene); + scene.dispose(); } -} \ No newline at end of file +} diff --git a/testing/scenario_app/pubspec.yaml b/testing/scenario_app/pubspec.yaml index 8748b51653ac9..6fb607708d6f3 100644 --- a/testing/scenario_app/pubspec.yaml +++ b/testing/scenario_app/pubspec.yaml @@ -8,3 +8,4 @@ dependencies: path: ../../../out/host_debug_unopt/gen/dart-pkg/sky_engine sky_services: path: ../../../out/host_debug_unopt/gen/dart-pkg/sky_services + vector_math: any From a2dafee10b65ae84f7adbfc94cc48c55b87712ad Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 29 Aug 2019 13:21:18 -0700 Subject: [PATCH 07/10] formatting --- .../Scenarios/ScenariosUITests/GoldenImage.h | 8 ++-- .../Scenarios/ScenariosUITests/GoldenImage.m | 29 +++++++------- .../GoldenPlatformViewTests.h | 7 ++-- .../GoldenPlatformViewTests.m | 11 +++--- .../PlatformViewGoldenTestManager.h | 6 +-- .../PlatformViewGoldenTestManager.m | 39 +++++++++---------- 6 files changed, 49 insertions(+), 51 deletions(-) diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h index 902d993c3cce7..c9cb6f8f55569 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h @@ -8,18 +8,18 @@ NS_ASSUME_NONNULL_BEGIN @interface GoldenImage : NSObject -@property (readonly, strong, nonatomic) NSString *goldenName; -@property (readonly, strong, nonatomic) UIImage *image; +@property(readonly, strong, nonatomic) NSString* goldenName; +@property(readonly, strong, nonatomic) UIImage* image; // Initilize with the golden file's prefix. // // Create an image from a golden file named prefix+devicemodel. -- (instancetype)initWithGoldenNamePrefix:(NSString *)prefix; +- (instancetype)initWithGoldenNamePrefix:(NSString*)prefix; // Compare this GoldenImage to `image`. // // Return YES if the `image` of this GoldenImage have the same pixels of provided `image`. -- (BOOL)compareGoldenToImage:(nonnull UIImage *)image; +- (BOOL)compareGoldenToImage:(nonnull UIImage*)image; @end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m index 3ba49f0a3b761..a3b8e21622f9a 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m @@ -3,33 +3,32 @@ // found in the LICENSE file. #import "GoldenImage.h" -#include #import +#include -@interface GoldenImage() +@interface GoldenImage () -@property (readwrite, strong, nonatomic) NSString *goldenName; -@property (readwrite, strong, nonatomic) UIImage *image; -@property (strong, nonatomic) NSString *platformName; +@property(readwrite, strong, nonatomic) NSString* goldenName; +@property(readwrite, strong, nonatomic) UIImage* image; +@property(strong, nonatomic) NSString* platformName; @end @implementation GoldenImage -- (instancetype)initWithGoldenNamePrefix:(NSString *)prefix -{ +- (instancetype)initWithGoldenNamePrefix:(NSString*)prefix { self = [super init]; if (self) { _goldenName = [prefix stringByAppendingString:self.platformName]; NSBundle* bundle = [NSBundle bundleForClass:[self class]]; NSURL* goldenURL = [bundle URLForResource:_goldenName withExtension:@"png"]; - NSData *data = [NSData dataWithContentsOfURL:goldenURL]; + NSData* data = [NSData dataWithContentsOfURL:goldenURL]; _image = [[UIImage alloc] initWithData:data]; } return self; } -- (BOOL)compareGoldenToImage:(UIImage *)image { +- (BOOL)compareGoldenToImage:(UIImage*)image { if (!self.image || !image) { return NO; } @@ -58,15 +57,15 @@ - (BOOL)compareGoldenToImage:(UIImage *)image { NSUInteger bytesPerRow = bytesPerPixel * widthA; NSUInteger bitsPerComponent = 8; CGContextRef contextA = - CGBitmapContextCreate(rawA.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, - colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); + CGBitmapContextCreate(rawA.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, + colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGContextDrawImage(contextA, CGRectMake(0, 0, widthA, heightA), imageRefA); CGContextRelease(contextA); CGContextRef contextB = - CGBitmapContextCreate(rawB.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, - colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); + CGBitmapContextCreate(rawB.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, + colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGColorSpaceRelease(colorSpace); CGContextDrawImage(contextB, CGRectMake(0, 0, widthA, heightA), imageRefB); @@ -79,10 +78,10 @@ - (BOOL)compareGoldenToImage:(UIImage *)image { return YES; } -- (NSString *)platformName { +- (NSString*)platformName { if (!_platformName) { NSString* simulatorName = - [[NSProcessInfo processInfo].environment objectForKey:@"SIMULATOR_DEVICE_NAME"]; + [[NSProcessInfo processInfo].environment objectForKey:@"SIMULATOR_DEVICE_NAME"]; if (simulatorName) { return [NSString stringWithFormat:@"%@_simulator", simulatorName]; } diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h index ec06530a8c2a5..de2b175368261 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h @@ -9,8 +9,8 @@ NS_ASSUME_NONNULL_BEGIN // The base class of all the PlatformView golden tests. // -// A new PlatformView golden tests can subclass this and override the `-initiWithInvocation:` method, -// which then retun the `-initWithManager:invocation:` +// A new PlatformView golden tests can subclass this and override the `-initiWithInvocation:` +// method, which then retun the `-initWithManager:invocation:` // // Then in any test method, call `checkGolden` to perform the golden test. // @@ -18,7 +18,8 @@ NS_ASSUME_NONNULL_BEGIN @interface GoldenPlatformViewTests : XCTestCase // Initialize with a `PlatformViewGoldenTestManager`. -- (instancetype)initWithManager:(PlatformViewGoldenTestManager *)manager invocation:(NSInvocation *)invocation; +- (instancetype)initWithManager:(PlatformViewGoldenTestManager*)manager + invocation:(NSInvocation*)invocation; // Take a sceenshot of the test app and check it has the same pixels with goldenImage inside the // `PlatformViewGoldenTestManager`. diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m index 50805625f11fc..39439b3d92f38 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m @@ -8,19 +8,20 @@ static const NSInteger kSecondsToWaitForPlatformView = 30; -@interface GoldenPlatformViewTests() +@interface GoldenPlatformViewTests () @property(nonatomic, strong) NSString* launchArguments; -@property (copy) NSString* goldenName; +@property(copy) NSString* goldenName; @property(nonatomic, strong) XCUIApplication* application; -@property (strong, nonatomic)PlatformViewGoldenTestManager *manager; +@property(strong, nonatomic) PlatformViewGoldenTestManager* manager; @end @implementation GoldenPlatformViewTests -- (instancetype)initWithManager:(PlatformViewGoldenTestManager *)manager invocation:(NSInvocation *)invocation { +- (instancetype)initWithManager:(PlatformViewGoldenTestManager*)manager + invocation:(NSInvocation*)invocation { self = [super initWithInvocation:invocation]; _manager = manager; return self; @@ -46,7 +47,7 @@ - (void)checkGolden { @(kSecondsToWaitForPlatformView)); } - GoldenImage *golden = self.manager.goldenImage; + GoldenImage* golden = self.manager.goldenImage; XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.h b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.h index 8f0ed009a0b15..37d9726cbe58a 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.h +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.h @@ -13,13 +13,13 @@ NS_ASSUME_NONNULL_BEGIN // It also generates the correct launchArgs to launch the associate platform view scenario. @interface PlatformViewGoldenTestManager : NSObject -@property (readonly, strong, nonatomic) GoldenImage *goldenImage; -@property (readonly, strong, nonatomic) NSArray *launchArgs; +@property(readonly, strong, nonatomic) GoldenImage* goldenImage; +@property(readonly, strong, nonatomic) NSArray* launchArgs; // Initilize with identifier. // // Crahes if the identifier is not mapped in `launchArgsMap` inside PlatformViewGoldenTestManager.m -- (instancetype)initWithIdentifier:(nonnull NSString *)identifier; +- (instancetype)initWithIdentifier:(nonnull NSString*)identifier; @end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m index eecd0feb54def..922560b8b5b47 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m @@ -4,13 +4,14 @@ #import "PlatformViewGoldenTestManager.h" -@interface PlatformViewGoldenTestManager() +@interface PlatformViewGoldenTestManager () -@property (readwrite, strong, nonatomic) GoldenImage *goldenImage; -@property (readwrite, strong, nonatomic) NSArray *launchArgs; +@property(readwrite, strong, nonatomic) GoldenImage* goldenImage; +@property(readwrite, strong, nonatomic) NSArray* launchArgs; -// Maps the `identifier` to the launch args for the platform view test associated with this `GoldenImage` -@property (class, nonatomic, strong) NSDictionary *launchArgsMap; +// Maps the `identifier` to the launch args for the platform view test associated with this +// `GoldenImage` +@property(class, nonatomic, strong) NSDictionary* launchArgsMap; @end @@ -18,42 +19,38 @@ @implementation PlatformViewGoldenTestManager static NSDictionary* _launchArgsMap; -+ (void)initialize -{ ++ (void)initialize { if (self == [PlatformViewGoldenTestManager class]) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ [self setLaunchArgsMap:@{ - @"platform_view": @[@"--platform-view"], - @"platform_view_cliprect": @[@"--platform-view-cliprect" ], - @"platform_view_cliprrect": @[@"--platform-view-cliprrect"], - @"platform_view_clippath": @[@"--platform-view-clippath" ], - @"platform_view_transform": @[@"--platform-view-transform"], - @"platform_view_opacity": @[@"--platform-view-opacity"], - }]; + @"platform_view" : @[ @"--platform-view" ], + @"platform_view_cliprect" : @[ @"--platform-view-cliprect" ], + @"platform_view_cliprrect" : @[ @"--platform-view-cliprrect" ], + @"platform_view_clippath" : @[ @"--platform-view-clippath" ], + @"platform_view_transform" : @[ @"--platform-view-transform" ], + @"platform_view_opacity" : @[ @"--platform-view-opacity" ], + }]; }); } } -+ (NSDictionary *)launchArgsMap { ++ (NSDictionary*)launchArgsMap { return _launchArgsMap; } -+ (void)setLaunchArgsMap:(NSDictionary *)launchArgsMap { ++ (void)setLaunchArgsMap:(NSDictionary*)launchArgsMap { _launchArgsMap = launchArgsMap; } -- (instancetype)initWithIdentifier:(NSString *)identifier -{ +- (instancetype)initWithIdentifier:(NSString*)identifier { self = [super init]; if (self) { _launchArgs = [PlatformViewGoldenTestManager launchArgsMap][identifier]; - NSString *prefix = [NSString stringWithFormat:@"golden_%@_", identifier]; + NSString* prefix = [NSString stringWithFormat:@"golden_%@_", identifier]; _goldenImage = [[GoldenImage alloc] initWithGoldenNamePrefix:prefix]; } return self; } - @end - From 4ed4a6c0da261fa106e76ca95bd0544f22b82672 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 29 Aug 2019 14:24:10 -0700 Subject: [PATCH 08/10] review fixes(dart) --- .../scenario_app/lib/src/platform_view.dart | 35 +++++++------------ testing/scenario_app/pubspec.yaml | 2 +- 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/testing/scenario_app/lib/src/platform_view.dart b/testing/scenario_app/lib/src/platform_view.dart index 529f4c7b3638d..ea71f2eb496c3 100644 --- a/testing/scenario_app/lib/src/platform_view.dart +++ b/testing/scenario_app/lib/src/platform_view.dart @@ -6,7 +6,7 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; import 'dart:ui'; -import 'package:vector_math/vector_math.dart'; +import 'package:vector_math/vector_math_64.dart'; import 'scenario.dart'; @@ -51,7 +51,7 @@ class PlatformViewScenario extends Scenario /// Platform view with clip rect. class PlatformViewClipRectScenario extends Scenario with _BasePlatformViewScenarioMixin { - /// Constuct a platform view with clip rect scenario. + /// Constructs a platform view with clip rect scenario. PlatformViewClipRectScenario(Window window, String text, {int id = 0}) : assert(window != null), super(window) { @@ -69,7 +69,7 @@ class PlatformViewClipRectScenario extends Scenario /// Platform view with clip rrect. class PlatformViewClipRRectScenario extends PlatformViewScenario { - /// Constuct a platform view with clip rrect scenario. + /// Constructs a platform view with clip rrect scenario. PlatformViewClipRRectScenario(Window window, String text, {int id = 0}) : super(window, text, id: id); @@ -95,7 +95,7 @@ class PlatformViewClipRRectScenario extends PlatformViewScenario { /// Platform view with clip path. class PlatformViewClipPathScenario extends PlatformViewScenario { - /// Constuct a platform view with clip rrect scenario. + /// Constructs a platform view with clip rrect scenario. PlatformViewClipPathScenario(Window window, String text, {int id = 0}) : super(window, text, id: id); @@ -107,14 +107,7 @@ class PlatformViewClipPathScenario extends PlatformViewScenario { // Create a path of rectangle with width of 200 and height of 300, starting from (100, 100). // - // The left side of the rectangle becomes a symmetric curve towards the left. - // The right side of the rectangle becomes a double curve. From top of bottom of the curve, it goes left then right. - // _______ - // | | - // | | - // | | - // | | - // |______| + // Refer to "../../ios/Scenarios/Scenarios/ScenariosUITests/golden_platform_view_clippath_iPhone SE_simulator.png" for the exact path after clipping. Path path = Path(); path.moveTo(100, 100); path.quadraticBezierTo(50, 250, 100, 400); @@ -129,7 +122,7 @@ class PlatformViewClipPathScenario extends PlatformViewScenario { /// Platform view with transform. class PlatformViewTransformScenario extends PlatformViewScenario { - /// Constuct a platform view with transform scenario. + /// Constructs a platform view with transform scenario. PlatformViewTransformScenario(Window window, String text, {int id = 0}) : super(window, text, id: id); @@ -138,13 +131,12 @@ class PlatformViewTransformScenario extends PlatformViewScenario { final SceneBuilder builder = SceneBuilder(); builder.pushOffset(0, 0); - final Matrix4 matrix4 = Matrix4.identity(); - matrix4.rotateZ(1.0); - matrix4.scale(0.5, 0.5, 1.0); - matrix4.translate(1000.0, 100.0, 0.0); + final Matrix4 matrix4 = Matrix4.identity() + ..rotateZ(1.0) + ..scale(0.5, 0.5, 1.0) + ..translate(1000.0, 100.0, 0.0); - final Float64List matrix4_64 = Float64List.fromList(matrix4.storage); - builder.pushTransform(matrix4_64); + builder.pushTransform(matrix4.storage); finishBuilderByAddingPlatformViewAndPicture(builder, 4); } @@ -152,7 +144,7 @@ class PlatformViewTransformScenario extends PlatformViewScenario { /// Platform view with opacity. class PlatformViewOpacityScenario extends PlatformViewScenario { - /// Constuct a platform view with transform scenario. + /// Constructs a platform view with transform scenario. PlatformViewOpacityScenario(Window window, String text, {int id = 0}) : super(window, text, id: id); @@ -183,8 +175,7 @@ mixin _BasePlatformViewScenarioMixin on Scenario { const int _valueMap = 13; final Uint8List message = Uint8List.fromList([ _valueString, - 'create' - .length, // this is safe as long as these are all single byte characters. + 'create'.length, // this won't work if we use multi-byte characters. ...utf8.encode('create'), _valueMap, if (Platform.isIOS) diff --git a/testing/scenario_app/pubspec.yaml b/testing/scenario_app/pubspec.yaml index 6fb607708d6f3..f17ddb080a7dc 100644 --- a/testing/scenario_app/pubspec.yaml +++ b/testing/scenario_app/pubspec.yaml @@ -8,4 +8,4 @@ dependencies: path: ../../../out/host_debug_unopt/gen/dart-pkg/sky_engine sky_services: path: ../../../out/host_debug_unopt/gen/dart-pkg/sky_services - vector_math: any + vector_math: ^2.0.8 From 285ffc23ad0fb8e42a9f3c44f8a24123f7174950 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 29 Aug 2019 17:12:38 -0700 Subject: [PATCH 09/10] review fixes --- .../ios/Scenarios/Scenarios/AppDelegate.m | 41 +++++++++------ .../Scenarios/ScenariosUITests/GoldenImage.h | 4 +- .../Scenarios/ScenariosUITests/GoldenImage.m | 37 ++++++------- .../GoldenPlatformViewTests.m | 7 ++- .../PlatformViewGoldenTestManager.h | 15 +++--- .../PlatformViewGoldenTestManager.m | 49 ++++++------------ .../ScenariosUITests/PlatformViewUITests.m | 12 ++--- ...orm_view_transform_iPhone SE_simulator.png | Bin 28020 -> 28021 bytes testing/scenario_app/lib/main.dart | 2 +- .../scenario_app/lib/src/platform_view.dart | 7 +-- 10 files changed, 81 insertions(+), 93 deletions(-) diff --git a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m index eda25c70a93d6..f24e542e1262a 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m +++ b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m @@ -19,21 +19,28 @@ - (BOOL)application:(UIApplication*)application // This argument is used by the XCUITest for Platform Views so that the app // under test will create platform views. - if ([[[NSProcessInfo processInfo] arguments] containsObject:@"--platform-view"]) { - [self readyContextForPlatformViewTests:@"text_platform_view"]; - } else if ([[[NSProcessInfo processInfo] arguments] containsObject:@"--platform-view-cliprect"]) { - [self readyContextForPlatformViewTests:@"platform_view_cliprect"]; - } else if ([[[NSProcessInfo processInfo] arguments] - containsObject:@"--platform-view-cliprrect"]) { - [self readyContextForPlatformViewTests:@"platform_view_cliprrect"]; - } else if ([[[NSProcessInfo processInfo] arguments] containsObject:@"--platform-view-clippath"]) { - [self readyContextForPlatformViewTests:@"platform_view_clippath"]; - } else if ([[[NSProcessInfo processInfo] arguments] - containsObject:@"--platform-view-transform"]) { - [self readyContextForPlatformViewTests:@"platform_view_transform"]; - } else if ([[[NSProcessInfo processInfo] arguments] containsObject:@"--platform-view-opacity"]) { - [self readyContextForPlatformViewTests:@"platform_view_opacity"]; - } else { + // The launchArgsMap should match the one in the `PlatformVieGoldenTestManager`. + static NSDictionary* launchArgsMap; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + launchArgsMap = @{ + @"--platform-view" : @"platform_view", + @"--platform-view-cliprect" : @"platform_view_cliprect", + @"--platform-view-cliprrect" : @"platform_view_cliprrect", + @"--platform-view-clippath" : @"platform_view_clippath", + @"--platform-view-transform" : @"platform_view_transform", + @"--platform-view-opacity" : @"platform_view_opacity", + }; + }); + BOOL hasGoldenLaunchArg = NO; + for (NSString* key in launchArgsMap.allKeys) { + if ([[[NSProcessInfo processInfo] arguments] containsObject:key]) { + [self readyContextForPlatformViewTests:launchArgsMap[key]]; + hasGoldenLaunchArg = YES; + break; + } + } + if (!hasGoldenLaunchArg) { self.window.rootViewController = [[UIViewController alloc] init]; } @@ -42,7 +49,7 @@ - (BOOL)application:(UIApplication*)application return [super application:application didFinishLaunchingWithOptions:launchOptions]; } -- (void)readyContextForPlatformViewTests:(NSString*)scenarioMessage { +- (void)readyContextForPlatformViewTests:(NSString*)scenarioIdentifier { FlutterEngine* engine = [[FlutterEngine alloc] initWithName:@"PlatformViewTest" project:nil]; [engine runWithEntrypoint:nil]; @@ -53,7 +60,7 @@ - (void)readyContextForPlatformViewTests:(NSString*)scenarioMessage { binaryMessageHandler:^(NSData* _Nullable message, FlutterBinaryReply _Nonnull reply) { [engine.binaryMessenger sendOnChannel:@"set_scenario" - message:[scenarioMessage dataUsingEncoding:NSUTF8StringEncoding]]; + message:[scenarioIdentifier dataUsingEncoding:NSUTF8StringEncoding]]; }]; TextPlatformViewFactory* textPlatformViewFactory = [[TextPlatformViewFactory alloc] initWithMessenger:flutterViewController.binaryMessenger]; diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h index c9cb6f8f55569..dead0c530e126 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h @@ -8,7 +8,7 @@ NS_ASSUME_NONNULL_BEGIN @interface GoldenImage : NSObject -@property(readonly, strong, nonatomic) NSString* goldenName; +@property(readonly, copy, nonatomic) NSString* goldenName; @property(readonly, strong, nonatomic) UIImage* image; // Initilize with the golden file's prefix. @@ -19,7 +19,7 @@ NS_ASSUME_NONNULL_BEGIN // Compare this GoldenImage to `image`. // // Return YES if the `image` of this GoldenImage have the same pixels of provided `image`. -- (BOOL)compareGoldenToImage:(nonnull UIImage*)image; +- (BOOL)compareGoldenToImage:(UIImage*)image; @end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m index a3b8e21622f9a..6dbcd8e73e72a 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m @@ -8,10 +8,6 @@ @interface GoldenImage () -@property(readwrite, strong, nonatomic) NSString* goldenName; -@property(readwrite, strong, nonatomic) UIImage* image; -@property(strong, nonatomic) NSString* platformName; - @end @implementation GoldenImage @@ -19,7 +15,7 @@ @implementation GoldenImage - (instancetype)initWithGoldenNamePrefix:(NSString*)prefix { self = [super init]; if (self) { - _goldenName = [prefix stringByAppendingString:self.platformName]; + _goldenName = [prefix stringByAppendingString:_platformName()]; NSBundle* bundle = [NSBundle bundleForClass:[self class]]; NSURL* goldenURL = [bundle URLForResource:_goldenName withExtension:@"png"]; NSData* data = [NSData dataWithContentsOfURL:goldenURL]; @@ -78,24 +74,21 @@ - (BOOL)compareGoldenToImage:(UIImage*)image { return YES; } -- (NSString*)platformName { - if (!_platformName) { - NSString* simulatorName = - [[NSProcessInfo processInfo].environment objectForKey:@"SIMULATOR_DEVICE_NAME"]; - if (simulatorName) { - return [NSString stringWithFormat:@"%@_simulator", simulatorName]; - } - - size_t size; - sysctlbyname("hw.model", NULL, &size, NULL, 0); - char* answer = malloc(size); - sysctlbyname("hw.model", answer, &size, NULL, 0); - - NSString* results = [NSString stringWithCString:answer encoding:NSUTF8StringEncoding]; - free(answer); - _platformName = results; +NS_INLINE NSString* _platformName() { + NSString* simulatorName = + [[NSProcessInfo processInfo].environment objectForKey:@"SIMULATOR_DEVICE_NAME"]; + if (simulatorName) { + return [NSString stringWithFormat:@"%@_simulator", simulatorName]; } - return _platformName; + + size_t size; + sysctlbyname("hw.model", NULL, &size, NULL, 0); + char* answer = malloc(size); + sysctlbyname("hw.model", answer, &size, NULL, 0); + + NSString* results = [NSString stringWithCString:answer encoding:NSUTF8StringEncoding]; + free(answer); + return results; } @end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m index 39439b3d92f38..80e2af25e3bff 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m @@ -10,11 +10,10 @@ @interface GoldenPlatformViewTests () -@property(nonatomic, strong) NSString* launchArguments; -@property(copy) NSString* goldenName; +@property(nonatomic, copy) NSString* goldenName; @property(nonatomic, strong) XCUIApplication* application; -@property(strong, nonatomic) PlatformViewGoldenTestManager* manager; +@property(nonatomic, strong) PlatformViewGoldenTestManager* manager; @end @@ -32,7 +31,7 @@ - (void)setUp { self.continueAfterFailure = NO; self.application = [[XCUIApplication alloc] init]; - self.application.launchArguments = self.manager.launchArgs; + self.application.launchArguments = @[ self.manager.launchArg ]; [self.application launch]; } diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.h b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.h index 37d9726cbe58a..f138aea88da3f 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.h +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.h @@ -7,19 +7,22 @@ NS_ASSUME_NONNULL_BEGIN +extern NSDictionary* launchArgsMap; + // Manages a `GoldenPlatformViewTests`. // -// It creates the correct GoldenImage based on the `identifer`. -// It also generates the correct launchArgs to launch the associate platform view scenario. +// It creates the correct `identifer` based on the `launchArg`. +// It also generates the correct GoldenImage based on the `identifier`. @interface PlatformViewGoldenTestManager : NSObject @property(readonly, strong, nonatomic) GoldenImage* goldenImage; -@property(readonly, strong, nonatomic) NSArray* launchArgs; +@property(readonly, copy, nonatomic) NSString* identifier; +@property(readonly, copy, nonatomic) NSString* launchArg; -// Initilize with identifier. +// Initilize with launchArg. // -// Crahes if the identifier is not mapped in `launchArgsMap` inside PlatformViewGoldenTestManager.m -- (instancetype)initWithIdentifier:(nonnull NSString*)identifier; +// Crahes if the launchArg is not mapped in `Appdelegate.launchArgsMap`. +- (instancetype)initWithLaunchArg:(NSString*)launchArg; @end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m index 922560b8b5b47..2fa8c03bdf4d4 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m @@ -7,48 +7,33 @@ @interface PlatformViewGoldenTestManager () @property(readwrite, strong, nonatomic) GoldenImage* goldenImage; -@property(readwrite, strong, nonatomic) NSArray* launchArgs; - -// Maps the `identifier` to the launch args for the platform view test associated with this -// `GoldenImage` -@property(class, nonatomic, strong) NSDictionary* launchArgsMap; @end @implementation PlatformViewGoldenTestManager -static NSDictionary* _launchArgsMap; +NSDictionary* launchArgsMap; -+ (void)initialize { - if (self == [PlatformViewGoldenTestManager class]) { +- (instancetype)initWithLaunchArg:(NSString*)launchArg { + self = [super init]; + if (self) { + // The launchArgsMap should match the one in the `PlatformVieGoldenTestManager`. + static NSDictionary* launchArgsMap; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - [self setLaunchArgsMap:@{ - @"platform_view" : @[ @"--platform-view" ], - @"platform_view_cliprect" : @[ @"--platform-view-cliprect" ], - @"platform_view_cliprrect" : @[ @"--platform-view-cliprrect" ], - @"platform_view_clippath" : @[ @"--platform-view-clippath" ], - @"platform_view_transform" : @[ @"--platform-view-transform" ], - @"platform_view_opacity" : @[ @"--platform-view-opacity" ], - }]; + launchArgsMap = @{ + @"--platform-view" : @"platform_view", + @"--platform-view-cliprect" : @"platform_view_cliprect", + @"--platform-view-cliprrect" : @"platform_view_cliprrect", + @"--platform-view-clippath" : @"platform_view_clippath", + @"--platform-view-transform" : @"platform_view_transform", + @"--platform-view-opacity" : @"platform_view_opacity", + }; }); - } -} - -+ (NSDictionary*)launchArgsMap { - return _launchArgsMap; -} - -+ (void)setLaunchArgsMap:(NSDictionary*)launchArgsMap { - _launchArgsMap = launchArgsMap; -} - -- (instancetype)initWithIdentifier:(NSString*)identifier { - self = [super init]; - if (self) { - _launchArgs = [PlatformViewGoldenTestManager launchArgsMap][identifier]; - NSString* prefix = [NSString stringWithFormat:@"golden_%@_", identifier]; + _identifier = launchArgsMap[launchArg]; + NSString* prefix = [NSString stringWithFormat:@"golden_%@_", _identifier]; _goldenImage = [[GoldenImage alloc] initWithGoldenNamePrefix:prefix]; + _launchArg = launchArg; } return self; } diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m index 625640a97b05e..00708ecc282f4 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m @@ -12,7 +12,7 @@ @implementation PlatformViewUITests - (instancetype)initWithInvocation:(NSInvocation*)invocation { PlatformViewGoldenTestManager* manager = - [[PlatformViewGoldenTestManager alloc] initWithIdentifier:@"platform_view"]; + [[PlatformViewGoldenTestManager alloc] initWithLaunchArg:@"--platform-view"]; return [super initWithManager:manager invocation:invocation]; } @@ -31,7 +31,7 @@ @implementation PlatformViewMutationClipRectTests - (instancetype)initWithInvocation:(NSInvocation*)invocation { PlatformViewGoldenTestManager* manager = - [[PlatformViewGoldenTestManager alloc] initWithIdentifier:@"platform_view_cliprect"]; + [[PlatformViewGoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprect"]; return [super initWithManager:manager invocation:invocation]; } @@ -49,7 +49,7 @@ @implementation PlatformViewMutationClipRRectTests - (instancetype)initWithInvocation:(NSInvocation*)invocation { PlatformViewGoldenTestManager* manager = - [[PlatformViewGoldenTestManager alloc] initWithIdentifier:@"platform_view_cliprrect"]; + [[PlatformViewGoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprrect"]; return [super initWithManager:manager invocation:invocation]; } @@ -67,7 +67,7 @@ @implementation PlatformViewMutationClipPathTests - (instancetype)initWithInvocation:(NSInvocation*)invocation { PlatformViewGoldenTestManager* manager = - [[PlatformViewGoldenTestManager alloc] initWithIdentifier:@"platform_view_clippath"]; + [[PlatformViewGoldenTestManager alloc] initWithLaunchArg:@"--platform-view-clippath"]; return [super initWithManager:manager invocation:invocation]; } @@ -85,7 +85,7 @@ @implementation PlatformViewMutationTransformTests - (instancetype)initWithInvocation:(NSInvocation*)invocation { PlatformViewGoldenTestManager* manager = - [[PlatformViewGoldenTestManager alloc] initWithIdentifier:@"platform_view_transform"]; + [[PlatformViewGoldenTestManager alloc] initWithLaunchArg:@"--platform-view-transform"]; return [super initWithManager:manager invocation:invocation]; } @@ -103,7 +103,7 @@ @implementation PlatformViewMutationOpacityTests - (instancetype)initWithInvocation:(NSInvocation*)invocation { PlatformViewGoldenTestManager* manager = - [[PlatformViewGoldenTestManager alloc] initWithIdentifier:@"platform_view_opacity"]; + [[PlatformViewGoldenTestManager alloc] initWithLaunchArg:@"--platform-view-opacity"]; return [super initWithManager:manager invocation:invocation]; } diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_iPhone SE_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_iPhone SE_simulator.png index 2d86ee45cca3e4540b6a2b66d6d2702db41238fc..678c7fd6bc7bb0e4e7bbae28ebdaf53539e0e1d4 100644 GIT binary patch literal 28021 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 DPa|d= literal 28020 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 diff --git a/testing/scenario_app/lib/main.dart b/testing/scenario_app/lib/main.dart index 08f55c724bdfe..1ce7389ed328a 100644 --- a/testing/scenario_app/lib/main.dart +++ b/testing/scenario_app/lib/main.dart @@ -15,7 +15,7 @@ import 'src/scenario.dart'; Map _scenarios = { 'animated_color_square': AnimatedColorSquareScenario(window), - 'text_platform_view': PlatformViewScenario(window, 'Hello from Scenarios (Platform View)', id: 0), + 'platform_view': PlatformViewScenario(window, 'Hello from Scenarios (Platform View)', id: 0), 'platform_view_cliprect': PlatformViewClipRectScenario(window, 'PlatformViewClipRect', id: 1), 'platform_view_cliprrect': PlatformViewClipRRectScenario(window, 'PlatformViewClipRRect', id: 2), 'platform_view_clippath': PlatformViewClipPathScenario(window, 'PlatformViewClipPath', id: 3), diff --git a/testing/scenario_app/lib/src/platform_view.dart b/testing/scenario_app/lib/src/platform_view.dart index ea71f2eb496c3..354a2dcabf14d 100644 --- a/testing/scenario_app/lib/src/platform_view.dart +++ b/testing/scenario_app/lib/src/platform_view.dart @@ -4,6 +4,7 @@ import 'dart:convert'; import 'dart:io'; +import 'dart:math'; import 'dart:typed_data'; import 'dart:ui'; import 'package:vector_math/vector_math_64.dart'; @@ -132,9 +133,9 @@ class PlatformViewTransformScenario extends PlatformViewScenario { builder.pushOffset(0, 0); final Matrix4 matrix4 = Matrix4.identity() - ..rotateZ(1.0) - ..scale(0.5, 0.5, 1.0) - ..translate(1000.0, 100.0, 0.0); + ..rotateZ(1) + ..scale(0.5, 0.5, 1.0) + ..translate(1000.0, 100.0, 0.0); builder.pushTransform(matrix4.storage); From b4dbcc01ae6f479a8377f64f1e1d1d628596b3cd Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Sat, 14 Sep 2019 22:56:00 +0800 Subject: [PATCH 10/10] review fixes --- .../ios/Scenarios/Scenarios/AppDelegate.m | 32 ++++++++----------- .../PlatformViewGoldenTestManager.m | 2 +- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m index f24e542e1262a..7d0862ca97143 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m +++ b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m @@ -20,26 +20,22 @@ - (BOOL)application:(UIApplication*)application // This argument is used by the XCUITest for Platform Views so that the app // under test will create platform views. // The launchArgsMap should match the one in the `PlatformVieGoldenTestManager`. - static NSDictionary* launchArgsMap; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - launchArgsMap = @{ - @"--platform-view" : @"platform_view", - @"--platform-view-cliprect" : @"platform_view_cliprect", - @"--platform-view-cliprrect" : @"platform_view_cliprrect", - @"--platform-view-clippath" : @"platform_view_clippath", - @"--platform-view-transform" : @"platform_view_transform", - @"--platform-view-opacity" : @"platform_view_opacity", - }; - }); - BOOL hasGoldenLaunchArg = NO; - for (NSString* key in launchArgsMap.allKeys) { - if ([[[NSProcessInfo processInfo] arguments] containsObject:key]) { - [self readyContextForPlatformViewTests:launchArgsMap[key]]; + NSDictionary* launchArgsMap = @{ + @"--platform-view" : @"platform_view", + @"--platform-view-cliprect" : @"platform_view_cliprect", + @"--platform-view-cliprrect" : @"platform_view_cliprrect", + @"--platform-view-clippath" : @"platform_view_clippath", + @"--platform-view-transform" : @"platform_view_transform", + @"--platform-view-opacity" : @"platform_view_opacity", + }; + __block BOOL hasGoldenLaunchArg = NO; + [launchArgsMap enumerateKeysAndObjectsUsingBlock:^(NSString* argument, NSString* testName, BOOL *stop) { + if ([[[NSProcessInfo processInfo] arguments] containsObject:argument]) { + [self readyContextForPlatformViewTests:testName]; hasGoldenLaunchArg = YES; - break; + *stop = YES; } - } + }]; if (!hasGoldenLaunchArg) { self.window.rootViewController = [[UIViewController alloc] init]; } diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m index 2fa8c03bdf4d4..29c6d09a14d85 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m @@ -18,7 +18,7 @@ - (instancetype)initWithLaunchArg:(NSString*)launchArg { self = [super init]; if (self) { // The launchArgsMap should match the one in the `PlatformVieGoldenTestManager`. - static NSDictionary* launchArgsMap; + static NSDictionary* launchArgsMap; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ launchArgsMap = @{