From c2ba4fe1630f6e798eaf1e434de79f41af90029e Mon Sep 17 00:00:00 2001 From: Siarhei Fedartsou Date: Tue, 13 Jun 2017 12:55:45 +0300 Subject: [PATCH 1/2] Implement Xcode 9 integration using XCTAttachement API --- FBSnapshotTestCase/FBSnapshotTestCase.m | 46 ++++++++++++++++++--- FBSnapshotTestCase/SwiftSupport.swift | 53 +++---------------------- 2 files changed, 46 insertions(+), 53 deletions(-) diff --git a/FBSnapshotTestCase/FBSnapshotTestCase.m b/FBSnapshotTestCase/FBSnapshotTestCase.m index f1fb547..37d0cf9 100644 --- a/FBSnapshotTestCase/FBSnapshotTestCase.m +++ b/FBSnapshotTestCase/FBSnapshotTestCase.m @@ -10,6 +10,7 @@ #import #import +#import @implementation FBSnapshotTestCase { @@ -111,17 +112,52 @@ - (NSString *)snapshotVerifyViewOrLayer:(id)viewOrLayer } } } - - if (!testSuccess) { - return [NSString stringWithFormat:@"Snapshot comparison failed: %@", errors.firstObject]; - } + + [self addAttachementsWithErrors:errors identifier:identifier]; + if (self.recordMode) { - return @"Test ran in record mode. Reference image is now saved. Disable record mode to perform an actual snapshot comparison!"; + if (errors.count > 0) { + return [NSString stringWithFormat:@"Snapshot comparison failed: %@", errors.firstObject]; + } else { + return @"Test ran in record mode. Reference image is now saved. Disable record mode to perform an actual snapshot comparison!"; + } + } else if (!testSuccess) { + return [NSString stringWithFormat:@"Snapshot comparison failed: %@", errors.firstObject]; } return nil; } +- (void) addAttachementsWithErrors:(NSArray*)errors identifier:(NSString*)identifier { +#ifdef __IPHONE_11_0 + if (self.recordMode) { + UIImage* image = [_snapshotController referenceImageForSelector:self.invocation.selector identifier:identifier error:nil]; + if (image) { + XCTAttachment* attachement = [XCTAttachment attachmentWithImage:image]; + attachement.name = @"Reference Image"; + [self addAttachment:attachement]; + } + } else if (errors.firstObject != nil) { + NSError* error = errors.firstObject; + if (error.userInfo[FBReferenceImageKey] != nil) { + XCTAttachment* attachement = [XCTAttachment attachmentWithImage:error.userInfo[FBReferenceImageKey]]; + attachement.name = @"Reference Image"; + [self addAttachment:attachement]; + } + if (error.userInfo[FBCapturedImageKey] != nil) { + XCTAttachment* attachement = [XCTAttachment attachmentWithImage:error.userInfo[FBCapturedImageKey]]; + attachement.name = @"Captured Image"; + [self addAttachment:attachement]; + } + if (error.userInfo[FBDiffedImageKey] != nil) { + XCTAttachment* attachement = [XCTAttachment attachmentWithImage:error.userInfo[FBDiffedImageKey]]; + attachement.name = @"Diffed Image"; + [self addAttachment:attachement]; + } + } +#endif +} + - (BOOL)compareSnapshotOfLayer:(CALayer *)layer referenceImagesDirectory:(NSString *)referenceImagesDirectory identifier:(NSString *)identifier diff --git a/FBSnapshotTestCase/SwiftSupport.swift b/FBSnapshotTestCase/SwiftSupport.swift index 471bb0d..f2da727 100644 --- a/FBSnapshotTestCase/SwiftSupport.swift +++ b/FBSnapshotTestCase/SwiftSupport.swift @@ -11,58 +11,15 @@ #if swift(>=3) public extension FBSnapshotTestCase { public func FBSnapshotVerifyView(_ view: UIView, identifier: String = "", suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), tolerance: CGFloat = 0, file: StaticString = #file, line: UInt = #line) { - FBSnapshotVerifyViewOrLayer(view, identifier: identifier, suffixes: suffixes, tolerance: tolerance, file: file, line: line) + if let errorDescription = snapshotVerifyViewOrLayer(view, identifier: identifier, suffixes: suffixes, tolerance: tolerance, defaultReferenceDirectory: FB_REFERENCE_IMAGE_DIR) { + XCTFail(errorDescription, file: file, line: line) + } } public func FBSnapshotVerifyLayer(_ layer: CALayer, identifier: String = "", suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), tolerance: CGFloat = 0, file: StaticString = #file, line: UInt = #line) { - FBSnapshotVerifyViewOrLayer(layer, identifier: identifier, suffixes: suffixes, tolerance: tolerance, file: file, line: line) - } - - private func FBSnapshotVerifyViewOrLayer(_ viewOrLayer: AnyObject, identifier: String = "", suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), tolerance: CGFloat = 0, file: StaticString = #file, line: UInt = #line) { - let envReferenceImageDirectory = self.getReferenceImageDirectory(withDefault: FB_REFERENCE_IMAGE_DIR) - var error: NSError? - var comparisonSuccess = false - - if let envReferenceImageDirectory = envReferenceImageDirectory { - for suffix in suffixes { - let referenceImagesDirectory = "\(envReferenceImageDirectory)\(suffix)" - if viewOrLayer.isKind(of: UIView.self) { - do { - try compareSnapshot(of: viewOrLayer as! UIView, referenceImagesDirectory: referenceImagesDirectory, identifier: identifier, tolerance: tolerance) - comparisonSuccess = true - } catch let error1 as NSError { - error = error1 - comparisonSuccess = false - } - } else if viewOrLayer.isKind(of: CALayer.self) { - do { - try compareSnapshot(of: viewOrLayer as! CALayer, referenceImagesDirectory: referenceImagesDirectory, identifier: identifier, tolerance: tolerance) - comparisonSuccess = true - } catch let error1 as NSError { - error = error1 - comparisonSuccess = false - } - } else { - assertionFailure("Only UIView and CALayer classes can be snapshotted") - } - - assert(recordMode == false, message: "Test ran in record mode. Reference image is now saved. Disable record mode to perform an actual snapshot comparison!", file: file, line: line) - - if comparisonSuccess || recordMode { - break - } - - assert(comparisonSuccess, message: "Snapshot comparison failed: \(error)", file: file, line: line) + if let errorDescription = snapshotVerifyViewOrLayer(layer, identifier: identifier, suffixes: suffixes, tolerance: tolerance, defaultReferenceDirectory: FB_REFERENCE_IMAGE_DIR) { + XCTFail(errorDescription, file: file, line: line) } - } else { - XCTFail("Missing value for referenceImagesDirectory - Set FB_REFERENCE_IMAGE_DIR as Environment variable in your scheme.") - } - } - - func assert(_ assertion: Bool, message: String, file: StaticString, line: UInt) { - if !assertion { - XCTFail(message, file: file, line: line) - } } } #else From d8d7100c83e08660a5b7c2455dc3e5cea1eebbff Mon Sep 17 00:00:00 2001 From: Siarhei Fedartsou Date: Thu, 22 Jun 2017 19:33:54 +0300 Subject: [PATCH 2/2] Add tvOS support for Xcode 9 integration & some cleanup --- FBSnapshotTestCase/FBSnapshotTestCase.m | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/FBSnapshotTestCase/FBSnapshotTestCase.m b/FBSnapshotTestCase/FBSnapshotTestCase.m index 37d0cf9..b4624b0 100644 --- a/FBSnapshotTestCase/FBSnapshotTestCase.m +++ b/FBSnapshotTestCase/FBSnapshotTestCase.m @@ -113,7 +113,7 @@ - (NSString *)snapshotVerifyViewOrLayer:(id)viewOrLayer } } - [self addAttachementsWithErrors:errors identifier:identifier]; + [self addAttachmentsWithErrors:errors identifier:identifier]; if (self.recordMode) { if (errors.count > 0) { @@ -128,29 +128,29 @@ - (NSString *)snapshotVerifyViewOrLayer:(id)viewOrLayer return nil; } -- (void) addAttachementsWithErrors:(NSArray*)errors identifier:(NSString*)identifier { -#ifdef __IPHONE_11_0 +- (void) addAttachmentsWithErrors:(NSArray *)errors identifier:(NSString *)identifier { +#if defined(__IPHONE_11_0) || defined(__TVOS_11_0) if (self.recordMode) { UIImage* image = [_snapshotController referenceImageForSelector:self.invocation.selector identifier:identifier error:nil]; if (image) { - XCTAttachment* attachement = [XCTAttachment attachmentWithImage:image]; + XCTAttachment *attachement = [XCTAttachment attachmentWithImage:image]; attachement.name = @"Reference Image"; [self addAttachment:attachement]; } } else if (errors.firstObject != nil) { - NSError* error = errors.firstObject; + NSError *error = errors.firstObject; if (error.userInfo[FBReferenceImageKey] != nil) { - XCTAttachment* attachement = [XCTAttachment attachmentWithImage:error.userInfo[FBReferenceImageKey]]; + XCTAttachment *attachement = [XCTAttachment attachmentWithImage:error.userInfo[FBReferenceImageKey]]; attachement.name = @"Reference Image"; [self addAttachment:attachement]; } if (error.userInfo[FBCapturedImageKey] != nil) { - XCTAttachment* attachement = [XCTAttachment attachmentWithImage:error.userInfo[FBCapturedImageKey]]; + XCTAttachment *attachement = [XCTAttachment attachmentWithImage:error.userInfo[FBCapturedImageKey]]; attachement.name = @"Captured Image"; [self addAttachment:attachement]; } if (error.userInfo[FBDiffedImageKey] != nil) { - XCTAttachment* attachement = [XCTAttachment attachmentWithImage:error.userInfo[FBDiffedImageKey]]; + XCTAttachment *attachement = [XCTAttachment attachmentWithImage:error.userInfo[FBDiffedImageKey]]; attachement.name = @"Diffed Image"; [self addAttachment:attachement]; }