blob: ac55da74642bbf87ae9158eaa6cc651c32773ec9 [file] [log] [blame]
// 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