| // 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 "GoldenTestManager.h" |
| #import <XCTest/XCTest.h> |
| |
| @interface GoldenTestManager () |
| |
| @property(readwrite, strong, nonatomic) GoldenImage* goldenImage; |
| |
| @end |
| |
| @implementation GoldenTestManager |
| |
| NSDictionary* launchArgsMap; |
| const double kDefaultRmseThreshold = 0.5; |
| |
| - (instancetype)initWithLaunchArg:(NSString*)launchArg { |
| self = [super init]; |
| if (self) { |
| // The launchArgsMap should match the one in the `PlatformVieGoldenTestManager`. |
| static NSDictionary<NSString*, NSString*>* launchArgsMap; |
| static dispatch_once_t onceToken; |
| dispatch_once(&onceToken, ^{ |
| launchArgsMap = @{ |
| @"--platform-view" : @"platform_view", |
| @"--platform-view-multiple" : @"platform_view_multiple", |
| @"--platform-view-multiple-background-foreground" : |
| @"platform_view_multiple_background_foreground", |
| @"--platform-view-cliprect" : @"platform_view_cliprect", |
| @"--platform-view-cliprrect" : @"platform_view_cliprrect", |
| @"--platform-view-large-cliprrect" : @"platform_view_large_cliprrect", |
| @"--platform-view-clippath" : @"platform_view_clippath", |
| @"--platform-view-cliprrect-with-transform" : @"platform_view_cliprrect_with_transform", |
| @"--platform-view-large-cliprrect-with-transform" : |
| @"platform_view_large_cliprrect_with_transform", |
| @"--platform-view-cliprect-with-transform" : @"platform_view_cliprect_with_transform", |
| @"--platform-view-clippath-with-transform" : @"platform_view_clippath_with_transform", |
| @"--platform-view-transform" : @"platform_view_transform", |
| @"--platform-view-opacity" : @"platform_view_opacity", |
| @"--platform-view-with-other-backdrop-filter" : @"platform_view_with_other_backdrop_filter", |
| @"--two-platform-views-with-other-backdrop-filter" : |
| @"two_platform_views_with_other_backdrop_filter", |
| @"--platform-view-with-negative-backdrop-filter" : |
| @"platform_view_with_negative_backdrop_filter", |
| @"--platform-view-rotate" : @"platform_view_rotate", |
| @"--non-full-screen-flutter-view-platform-view" : |
| @"non_full_screen_flutter_view_platform_view", |
| @"--bogus-font-text" : @"bogus_font_text", |
| @"--spawn-engine-works" : @"spawn_engine_works", |
| @"--platform-view-cliprect-after-moved" : @"platform_view_cliprect_after_moved", |
| @"--two-platform-view-clip-rect" : @"two_platform_view_clip_rect", |
| @"--two-platform-view-clip-rrect" : @"two_platform_view_clip_rrect", |
| @"--two-platform-view-clip-path" : @"two_platform_view_clip_path", |
| @"--app-extension" : @"app_extension", |
| @"--darwin-system-font" : @"darwin_system_font", |
| }; |
| }); |
| _identifier = launchArgsMap[launchArg]; |
| |
| NSString* impeller = @""; |
| NSNumber* enableImpeller = [[NSBundle bundleWithIdentifier:@"dev.flutter.ScenariosUITests"] |
| objectForInfoDictionaryKey:@"FLTEnableImpeller"]; |
| if (enableImpeller != nil) { |
| impeller = enableImpeller.boolValue ? @"impeller_" : @""; |
| } else { |
| NSLog(@"FLTEnableImpeller was nil"); |
| } |
| NSLog(@"impeller = '%@'", impeller); |
| |
| NSString* prefix = [NSString stringWithFormat:@"golden_%@_%@", _identifier, impeller]; |
| _goldenImage = [[GoldenImage alloc] initWithGoldenNamePrefix:prefix]; |
| _launchArg = launchArg; |
| } |
| return self; |
| } |
| |
| - (void)checkGoldenForTest:(XCTestCase*)test rmesThreshold:(double)rmesThreshold { |
| XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; |
| if (!_goldenImage.image) { |
| XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; |
| attachment.name = [_goldenImage.goldenName stringByAppendingString:@"_new.png"]; |
| attachment.lifetime = XCTAttachmentLifetimeKeepAlways; |
| [test addAttachment:attachment]; |
| // Instead of XCTFail because that definition changed between Xcode 11 and 12 whereas this impl |
| // is stable. |
| _XCTPrimitiveFail(test, |
| @"This test will fail - no golden named %@ found. " |
| @"Follow the steps in the README to add a new golden.", |
| _goldenImage.goldenName); |
| } |
| |
| if (![_goldenImage compareGoldenToImage:screenshot.image rmesThreshold:rmesThreshold]) { |
| XCTAttachment* screenshotAttachment = [XCTAttachment attachmentWithImage:screenshot.image]; |
| screenshotAttachment.name = [_goldenImage.goldenName stringByAppendingString:@"_actual.png"]; |
| screenshotAttachment.lifetime = XCTAttachmentLifetimeKeepAlways; |
| [test addAttachment:screenshotAttachment]; |
| |
| _XCTPrimitiveFail(test, |
| @"Goldens do not match. Follow the steps in the " |
| @"README to update golden named %@ if needed.", |
| _goldenImage.goldenName); |
| } |
| } |
| |
| @end |