From 7418e7e4a8208e1aa95bb98b4055e3b7bc95fec1 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 27 Aug 2019 15:30:01 -0700 Subject: [PATCH 1/3] 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: Mon, 30 Sep 2019 14:56:36 -0700 Subject: [PATCH 2/3] reland Add iOS platform view mutation XCUITests to the scenario app((#11652)) --- .../framework/Source/FlutterPlatformViews.mm | 3 +- .../plugins/GeneratedPluginRegistrant.java | 23 +++ .../ios/Runner/GeneratedPluginRegistrant.h | 14 ++ .../ios/Runner/GeneratedPluginRegistrant.m | 12 ++ .../Scenarios.xcodeproj/project.pbxproj | 38 ++++ .../ios/Scenarios/Scenarios/AppDelegate.m | 56 ++++-- .../Scenarios/ScenariosUITests/GoldenImage.h | 26 +++ .../Scenarios/ScenariosUITests/GoldenImage.m | 94 ++++++++++ .../GoldenPlatformViewTests.h | 30 +++ .../GoldenPlatformViewTests.m | 68 +++++++ .../PlatformViewGoldenTestManager.h | 29 +++ .../PlatformViewGoldenTestManager.m | 41 +++++ .../ScenariosUITests/PlatformViewUITests.m | 174 +++++++++--------- ...form_view_clippath_iPhone SE_simulator.png | Bin 0 -> 24415 bytes ...form_view_cliprect_iPhone SE_simulator.png | Bin 0 -> 21381 bytes ...orm_view_cliprrect_iPhone SE_simulator.png | Bin 0 -> 23202 bytes ...tform_view_opacity_iPhone SE_simulator.png | Bin 0 -> 30120 bytes ...orm_view_transform_iPhone SE_simulator.png | Bin 0 -> 28021 bytes testing/scenario_app/lib/main.dart | 7 +- .../scenario_app/lib/src/platform_view.dart | 170 +++++++++++++++-- testing/scenario_app/pubspec.yaml | 1 + 21 files changed, 660 insertions(+), 126 deletions(-) create mode 100644 testing/scenario_app/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java create mode 100644 testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.h create mode 100644 testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.m 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 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 7cc3c44c04ff0..450fb8cd5e836 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 new]; + ChildClippingView* clippingView = + [[ChildClippingView alloc] initWithFrame:flutter_view_.get().bounds]; [clippingView addSubview:head]; head = clippingView; clipIndex++; diff --git a/testing/scenario_app/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/testing/scenario_app/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java new file mode 100644 index 0000000000000..d007606a44d83 --- /dev/null +++ b/testing/scenario_app/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java @@ -0,0 +1,23 @@ +package io.flutter.plugins; + +import io.flutter.plugin.common.PluginRegistry; + +/** + * Generated file. Do not edit. + */ +public final class GeneratedPluginRegistrant { + public static void registerWith(PluginRegistry registry) { + if (alreadyRegisteredWith(registry)) { + return; + } + } + + private static boolean alreadyRegisteredWith(PluginRegistry registry) { + final String key = GeneratedPluginRegistrant.class.getCanonicalName(); + if (registry.hasPlugin(key)) { + return true; + } + registry.registrarFor(key); + return false; + } +} diff --git a/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.h b/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.h new file mode 100644 index 0000000000000..3b700eb481958 --- /dev/null +++ b/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.h @@ -0,0 +1,14 @@ +// +// Generated file. Do not edit. +// + +#ifndef GeneratedPluginRegistrant_h +#define GeneratedPluginRegistrant_h + +#import + +@interface GeneratedPluginRegistrant : NSObject ++ (void)registerWithRegistry:(NSObject*)registry; +@end + +#endif /* GeneratedPluginRegistrant_h */ diff --git a/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.m b/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.m new file mode 100644 index 0000000000000..60dfa42b328db --- /dev/null +++ b/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.m @@ -0,0 +1,12 @@ +// +// Generated file. Do not edit. +// + +#import "GeneratedPluginRegistrant.h" + +@implementation GeneratedPluginRegistrant + ++ (void)registerWithRegistry:(NSObject*)registry { +} + +@end diff --git a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj index b6c77bab8781d..a95587c1a7fd0 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj +++ b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj @@ -30,6 +30,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 */; }; + 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 */ @@ -113,6 +121,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 = ""; }; + 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 */ @@ -200,9 +219,20 @@ 244EA6CF230DBE8900B2D26E /* golden_platform_view_D21AP.png */, 24D47D1C230CA2700069DD5E /* golden_platform_view_iPhone SE_simulator.png */, 24D47D1A230C79840069DD5E /* golden_platform_view_D211AP.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 */, + 6816DB9C231750ED00A51400 /* GoldenPlatformViewTests.h */, + 6816DB9D231750ED00A51400 /* GoldenPlatformViewTests.m */, + 6816DB9F2317573300A51400 /* GoldenImage.h */, + 6816DBA02317573300A51400 /* GoldenImage.m */, + 6816DBA22318358200A51400 /* PlatformViewGoldenTestManager.h */, + 6816DBA32318358200A51400 /* PlatformViewGoldenTestManager.m */, ); path = ScenariosUITests; sourceTree = ""; @@ -340,9 +370,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 */, 24D47D1D230CA2700069DD5E /* golden_platform_view_iPhone SE_simulator.png in Resources */, 244EA6D0230DBE8900B2D26E /* golden_platform_view_D21AP.png in Resources */, + 6816DBAC2318696600A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -375,6 +410,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 6816DBA12317573300A51400 /* GoldenImage.m in Sources */, + 6816DB9E231750ED00A51400 /* GoldenPlatformViewTests.m in Sources */, + 6816DBA42318358200A51400 /* PlatformViewGoldenTestManager.m in Sources */, 248D76EF22E388380012F0C1 /* PlatformViewUITests.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 6a419e99a7bc3..205ce79384c9c 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m +++ b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m @@ -25,27 +25,55 @@ - (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] initWithScenario:@"text_platform_view" - withCompletion:nil]; - [engine runWithEntrypoint:nil]; - - FlutterViewController* flutterViewController = - [[NoStatusBarFlutterViewController alloc] initWithEngine:engine nibName:nil bundle:nil]; - TextPlatformViewFactory* textPlatformViewFactory = - [[TextPlatformViewFactory alloc] initWithMessenger:flutterViewController.binaryMessenger]; - NSObject* registrar = - [flutterViewController.engine registrarForPlugin:@"scenarios/TextPlatformViewPlugin"]; - [registrar registerViewFactory:textPlatformViewFactory withId:@"scenarios/textPlatformView"]; - self.window.rootViewController = flutterViewController; + // The launchArgsMap should match the one in the `PlatformVieGoldenTestManager`. + 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 NSString* goldenTestName = nil; + [launchArgsMap + enumerateKeysAndObjectsUsingBlock:^(NSString* argument, NSString* testName, BOOL* stop) { + if ([[[NSProcessInfo processInfo] arguments] containsObject:argument]) { + goldenTestName = testName; + *stop = YES; + } + }]; + + if (goldenTestName) { + [self readyContextForPlatformViewTests:goldenTestName]; } else if ([[[NSProcessInfo processInfo] arguments] containsObject:@"--screen-before-flutter"]) { self.window.rootViewController = [[ScreenBeforeFlutter alloc] initWithEngineRunCompletion:nil]; } else { self.window.rootViewController = [[UIViewController alloc] init]; } - [self.window makeKeyAndVisible]; + [self.window makeKeyAndVisible]; return [super application:application didFinishLaunchingWithOptions:launchOptions]; } +- (void)readyContextForPlatformViewTests:(NSString*)scenarioIdentifier { + 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:[scenarioIdentifier 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/ScenariosUITests/GoldenImage.h b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h new file mode 100644 index 0000000000000..dead0c530e126 --- /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, copy, 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:(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..6dbcd8e73e72a --- /dev/null +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m @@ -0,0 +1,94 @@ +// 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" +#import +#include + +@interface GoldenImage () + +@end + +@implementation GoldenImage + +- (instancetype)initWithGoldenNamePrefix:(NSString*)prefix { + self = [super init]; + if (self) { + _goldenName = [prefix stringByAppendingString:_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; +} + +NS_INLINE 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; +} + +@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..de2b175368261 --- /dev/null +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h @@ -0,0 +1,30 @@ +// 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..80e2af25e3bff --- /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, copy) NSString* goldenName; +@property(nonatomic, strong) XCUIApplication* application; + +@property(nonatomic, strong) 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.launchArg ]; + [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..f138aea88da3f --- /dev/null +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.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 "GoldenImage.h" + +NS_ASSUME_NONNULL_BEGIN + +extern NSDictionary* launchArgsMap; + +// Manages a `GoldenPlatformViewTests`. +// +// 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, copy, nonatomic) NSString* identifier; +@property(readonly, copy, nonatomic) NSString* launchArg; + +// Initilize with launchArg. +// +// Crahes if the launchArg is not mapped in `Appdelegate.launchArgsMap`. +- (instancetype)initWithLaunchArg:(NSString*)launchArg; + +@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..9e512d5234889 --- /dev/null +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m @@ -0,0 +1,41 @@ +// 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; + +@end + +@implementation PlatformViewGoldenTestManager + +NSDictionary* launchArgsMap; + +- (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, ^{ + 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", + }; + }); + _identifier = launchArgsMap[launchArg]; + NSString* prefix = [NSString stringWithFormat:@"golden_%@_", _identifier]; + _goldenImage = [[GoldenImage alloc] initWithGoldenNamePrefix:prefix]; + _launchArg = launchArg; + } + return self; +} + +@end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m index e0982aaecd6e6..00708ecc282f4 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m @@ -2,123 +2,113 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import -#import -#include +#import "GoldenPlatformViewTests.h" -#import "../Scenarios/TextPlatformView.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] initWithLaunchArg:@"--platform-view"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkGolden]; +} + +@end + +// Clip Rect Tests +@interface PlatformViewMutationClipRectTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipRectTests - self.application = [[XCUIApplication alloc] init]; - self.application.launchArguments = @[ @"--platform-view" ]; - [self.application launch]; +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + PlatformViewGoldenTestManager* manager = + [[PlatformViewGoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprect"]; + return [super initWithManager:manager invocation:invocation]; } - (void)testPlatformView { + [self checkGolden]; +} + +@end + +@interface PlatformViewMutationClipRRectTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipRRectTests - 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; - [self addAttachment:attachment]; - - if (golden) { - XCTAttachment* goldenAttachment = [XCTAttachment attachmentWithImage:golden]; - 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.", - goldenName); - } - - XCTAssertTrue([self compareImage:golden toOther:screenshot.image]); +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + PlatformViewGoldenTestManager* manager = + [[PlatformViewGoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprrect"]; + return [super initWithManager:manager invocation:invocation]; } -- (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; +- (void)testPlatformView { + [self checkGolden]; } -- (BOOL)compareImage:(UIImage*)a toOther:(UIImage*)b { - CGImageRef imageRefA = [a CGImage]; - CGImageRef imageRefB = [b CGImage]; +@end - NSUInteger widthA = CGImageGetWidth(imageRefA); - NSUInteger heightA = CGImageGetHeight(imageRefA); - NSUInteger widthB = CGImageGetWidth(imageRefB); - NSUInteger heightB = CGImageGetHeight(imageRefB); +@interface PlatformViewMutationClipPathTests : GoldenPlatformViewTests - 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]; +@end - if (!rawA || !rawB) { - return NO; - } +@implementation PlatformViewMutationClipPathTests - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + PlatformViewGoldenTestManager* manager = + [[PlatformViewGoldenTestManager alloc] initWithLaunchArg:@"--platform-view-clippath"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkGolden]; +} + +@end - NSUInteger bytesPerRow = bytesPerPixel * widthA; - NSUInteger bitsPerComponent = 8; - CGContextRef contextA = - CGBitmapContextCreate(rawA.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, - colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); +@interface PlatformViewMutationTransformTests : GoldenPlatformViewTests - CGContextDrawImage(contextA, CGRectMake(0, 0, widthA, heightA), imageRefA); - CGContextRelease(contextA); +@end - CGContextRef contextB = - CGBitmapContextCreate(rawB.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, - colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); - CGColorSpaceRelease(colorSpace); +@implementation PlatformViewMutationTransformTests - CGContextDrawImage(contextB, CGRectMake(0, 0, widthA, heightA), imageRefB); - CGContextRelease(contextB); +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + PlatformViewGoldenTestManager* manager = + [[PlatformViewGoldenTestManager alloc] initWithLaunchArg:@"--platform-view-transform"]; + return [super initWithManager:manager invocation:invocation]; +} - if (memcmp(rawA.mutableBytes, rawB.mutableBytes, size)) { - return NO; - } +- (void)testPlatformView { + [self checkGolden]; +} - return YES; +@end + +@interface PlatformViewMutationOpacityTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationOpacityTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + PlatformViewGoldenTestManager* manager = + [[PlatformViewGoldenTestManager alloc] initWithLaunchArg:@"--platform-view-opacity"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [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 new file mode 100644 index 0000000000000000000000000000000000000000..8e776f220e84943877cec56192fc4de71ceed695 GIT binary patch literal 24415 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 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..94667b9a8254d4eb6a4044d8cde3d7dbfdca6607 GIT binary patch literal 23202 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 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..678c7fd6bc7bb0e4e7bbae28ebdaf53539e0e1d4 GIT binary patch literal 28021 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 DPa|d= literal 0 HcmV?d00001 diff --git a/testing/scenario_app/lib/main.dart b/testing/scenario_app/lib/main.dart index 11126afe69427..bbc16454470aa 100644 --- a/testing/scenario_app/lib/main.dart +++ b/testing/scenario_app/lib/main.dart @@ -16,7 +16,12 @@ import 'src/scenario.dart'; Map _scenarios = { 'animated_color_square': AnimatedColorSquareScenario(window), - 'text_platform_view': PlatformViewScenario(window, 'Hello from Scenarios (Platform View)'), + '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), 'poppable_screen': PoppableScreenScenario(window), }; diff --git a/testing/scenario_app/lib/src/platform_view.dart b/testing/scenario_app/lib/src/platform_view.dart index 4286469ce2937..354a2dcabf14d 100644 --- a/testing/scenario_app/lib/src/platform_view.dart +++ b/testing/scenario_app/lib/src/platform_view.dart @@ -4,8 +4,10 @@ import 'dart:convert'; import 'dart:io'; +import 'dart:math'; import 'dart:typed_data'; import 'dart:ui'; +import 'package:vector_math/vector_math_64.dart'; import 'scenario.dart'; @@ -26,13 +28,147 @@ 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) { + constructScenario(window, text, id); + } + + @override + void onBeginFrame(Duration duration) { + final SceneBuilder builder = SceneBuilder(); + + builder.pushOffset(0, 0); + + finishBuilderByAddingPlatformViewAndPicture(builder, 0); + } +} + +/// Platform view with clip rect. +class PlatformViewClipRectScenario extends Scenario + with _BasePlatformViewScenarioMixin { + /// Constructs 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(const Rect.fromLTRB(100, 100, 400, 400)); + finishBuilderByAddingPlatformViewAndPicture(builder, 1); + } +} + +/// Platform view with clip rrect. +class PlatformViewClipRRectScenario extends PlatformViewScenario { + /// Constructs 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( + 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 { + /// Constructs 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); + + // Create a path of rectangle with width of 200 and height of 300, starting from (100, 100). + // + // 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); + path.lineTo(350, 400); + path.cubicTo(400, 300, 300, 200, 350, 100); + path.close(); + builder.pushClipPath(path); + + finishBuilderByAddingPlatformViewAndPicture(builder, 3); + } +} + +/// Platform view with transform. +class PlatformViewTransformScenario extends PlatformViewScenario { + /// Constructs 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 Matrix4 matrix4 = Matrix4.identity() + ..rotateZ(1) + ..scale(0.5, 0.5, 1.0) + ..translate(1000.0, 100.0, 0.0); + + builder.pushTransform(matrix4.storage); + + finishBuilderByAddingPlatformViewAndPicture(builder, 4); + } +} + +/// Platform view with opacity. +class PlatformViewOpacityScenario extends PlatformViewScenario { + /// Constructs 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); + + finishBuilderByAddingPlatformViewAndPicture(builder, 5); + } +} + +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; @@ -40,7 +176,7 @@ class PlatformViewScenario extends 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) @@ -94,29 +230,27 @@ class PlatformViewScenario extends Scenario { ); } - int _textureId; - - @override - void onBeginFrame(Duration duration) { - final SceneBuilder builder = SceneBuilder(); - - builder.pushOffset(0, 0); - + // Add a platform view and a picture to the scene, then finish the `sceneBuilder`. + void finishBuilderByAddingPlatformViewAndPicture(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'); + 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)); + 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(); + sceneBuilder.addPicture(const Offset(300, 300), picture); + final Scene scene = sceneBuilder.build(); window.render(scene); scene.dispose(); } diff --git a/testing/scenario_app/pubspec.yaml b/testing/scenario_app/pubspec.yaml index 8748b51653ac9..f17ddb080a7dc 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: ^2.0.8 From 6723359271b28d9f2805719f5bd8e1590f94e721 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 30 Sep 2019 14:59:20 -0700 Subject: [PATCH 3/3] remove auto generated files --- .../plugins/GeneratedPluginRegistrant.java | 23 ------------------- .../ios/Runner/GeneratedPluginRegistrant.h | 14 ----------- .../ios/Runner/GeneratedPluginRegistrant.m | 12 ---------- 3 files changed, 49 deletions(-) delete mode 100644 testing/scenario_app/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java delete mode 100644 testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.h delete mode 100644 testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.m diff --git a/testing/scenario_app/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/testing/scenario_app/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java deleted file mode 100644 index d007606a44d83..0000000000000 --- a/testing/scenario_app/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.flutter.plugins; - -import io.flutter.plugin.common.PluginRegistry; - -/** - * Generated file. Do not edit. - */ -public final class GeneratedPluginRegistrant { - public static void registerWith(PluginRegistry registry) { - if (alreadyRegisteredWith(registry)) { - return; - } - } - - private static boolean alreadyRegisteredWith(PluginRegistry registry) { - final String key = GeneratedPluginRegistrant.class.getCanonicalName(); - if (registry.hasPlugin(key)) { - return true; - } - registry.registrarFor(key); - return false; - } -} diff --git a/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.h b/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.h deleted file mode 100644 index 3b700eb481958..0000000000000 --- a/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// Generated file. Do not edit. -// - -#ifndef GeneratedPluginRegistrant_h -#define GeneratedPluginRegistrant_h - -#import - -@interface GeneratedPluginRegistrant : NSObject -+ (void)registerWithRegistry:(NSObject*)registry; -@end - -#endif /* GeneratedPluginRegistrant_h */ diff --git a/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.m b/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.m deleted file mode 100644 index 60dfa42b328db..0000000000000 --- a/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.m +++ /dev/null @@ -1,12 +0,0 @@ -// -// Generated file. Do not edit. -// - -#import "GeneratedPluginRegistrant.h" - -@implementation GeneratedPluginRegistrant - -+ (void)registerWithRegistry:(NSObject*)registry { -} - -@end