From b15fa36291fff59f6665a8ba50a1d777d02f903b Mon Sep 17 00:00:00 2001 From: Nicholas Entin Date: Mon, 14 Aug 2023 21:04:54 -0700 Subject: [PATCH] Add imprecise comparison variants to iOSSnapshotTestCase extension This adds variants of the `SnapshotVerify*(...)` methods that allow for imprecise comparisons, i.e. using the `perPixelTolerance` and `overallTolerance` parameters. ## Why is this necessary? Adding tolerances has been a highly requested feature (see #63) to work around some simulator changes introduced in iOS 13. Historically the simulator has supported CPU-based rendering, giving us very stable image representations of views that we can compare pixel-by-pixel. Unfortunately, with iOS 13, Apple changed the simulator to use exclusively GPU-based rendering, which means that the resulting snapshots may differ slightly across machines (see uber/ios-snapshot-test-case#109). The negative effects of this were mitigated in iOSSnapshotTestCase by adding two tolerances to snapshot comparisons: a **per-pixel tolerance** that controls how close in color two pixels need to be to count as unchanged and an **overall tolerance** that controls what portion of pixels between two images need to be the same (based on the per-pixel calculation) for the images to be considered unchanged. Setting these tolerances to non-zero values enables engineers to record tests on one machine and run them on another (e.g. record new reference images on their laptop and then run tests on CI) without worrying about the tests failing due to differences in GPU rendering. This is great in theory, but from our testing we've found even the lowest tolerance values to consistently handle GPU differences between machine types let through a significant number of visual regressions. In other words, there is no magic tolerance threshold that avoids false negatives based on GPU rendering and also avoids false positives based on minor visual regressions. This is especially true for accessibility snapshots. To start, tolerances seem to be more reliable when applied to relatively small snapshot images, but accessibility snapshots tend to be fairly large since they include both the view and the legend. Additionally, the text in the legend can change meaningfully and reflect only a small number of pixel changes. For example, I ran a test of full screen snapshot on an iPhone 12 Pro with two columns of legend. Even an overall tolerance of only `0.0001` (0.01%) was enough to let through a regression where one of the elements lost its `.link` trait (represented by the text "Link." appended to the element's description in the snapshot). But this low a tolerance _wasn't_ enough to handle the GPU rendering differences between a MacBook Pro and a Mac Mini. This is a simplified example since it only uses `overallTolerance`, not `perPixelTolerance`, but we've found many similar situations arise even with the combination. Some teams have developed infrastructure to allow snapshots to run on the same hardware consistently and have built a developer process around that infrastructure, but many others have accepted tolerances as a necessity today. ## Why create separate "imprecise" variants? The simplest approach to adding tolerances would be adding the `perPixelTolerance` and `overallTolerance` parameters to the existing snapshot methods, however I feel adding separate methods with an "imprecise" prefix is better in the long run. The naming is motivated by the idea that **it needs to be very obvious when what you're doing might result in unexpected/undesirable behavior**. In other words, when using one of the core snapshot methods, you should have extremely high confidence that a test passing means there's no regressions. When you use an "imprecise" variant, it's up to you to set your confidence levels according to your chosen tolerances. This is similar to the "unsafe" terminology around memory in the Swift API. You should generally feel very confident in the memory safety of your code, but any time you see "unsafe" it's a sign to be extra careful and not gather unwarranted confidence from the compiler. Longer term, I'm hopeful we can find alternative comparison algorithms that allow for GPU rendering differences without opening the door to regressions. We can integrate these into the core snapshot methods as long as they do not introduce opportunities for regressions, or add additional comparison variants to iterate on different approaches. --- .../project.pbxproj | 4 + .../SnapshotTests/ImpreciseObjectiveCTests.m | 92 +++++++++ ...hActivationPointAlways_13_7_375x812@3x.png | Bin 0 -> 22954 bytes ...hActivationPointAlways_14_5_390x844@3x.png | Bin 0 -> 22899 bytes ...hIdentifier_identifier_13_7_375x812@3x.png | Bin 0 -> 21705 bytes ...hIdentifier_identifier_14_5_390x844@3x.png | Bin 0 -> 21678 bytes .../testSimpleView_13_7_375x812@3x.png | Bin 0 -> 21705 bytes .../testSimpleView_14_5_390x844@3x.png | Bin 0 -> 21678 bytes ...ViewWithInvertedColors_13_7_375x812@3x.png | Bin 0 -> 3598 bytes ...ViewWithInvertedColors_14_5_390x844@3x.png | Bin 0 -> 3598 bytes .../FBSnapshotTestCase_Accessibility.h | 20 +- ...BSnapshotTestCase_ImpreciseAccessibility.h | 63 ++++++ .../FBSnapshotTestCase+Accessibility.swift | 2 +- ...pshotTestCase+ImpreciseAccessibility.swift | 179 ++++++++++++++++++ .../FBSnapshotTestCase+ObjCSupport.swift | 47 +++-- 15 files changed, 382 insertions(+), 25 deletions(-) create mode 100644 Example/SnapshotTests/ImpreciseObjectiveCTests.m create mode 100644 Example/SnapshotTests/ReferenceImages/_64/ImpreciseObjectiveCTests/testSimpleViewWithActivationPointAlways_13_7_375x812@3x.png create mode 100644 Example/SnapshotTests/ReferenceImages/_64/ImpreciseObjectiveCTests/testSimpleViewWithActivationPointAlways_14_5_390x844@3x.png create mode 100644 Example/SnapshotTests/ReferenceImages/_64/ImpreciseObjectiveCTests/testSimpleViewWithIdentifier_identifier_13_7_375x812@3x.png create mode 100644 Example/SnapshotTests/ReferenceImages/_64/ImpreciseObjectiveCTests/testSimpleViewWithIdentifier_identifier_14_5_390x844@3x.png create mode 100644 Example/SnapshotTests/ReferenceImages/_64/ImpreciseObjectiveCTests/testSimpleView_13_7_375x812@3x.png create mode 100644 Example/SnapshotTests/ReferenceImages/_64/ImpreciseObjectiveCTests/testSimpleView_14_5_390x844@3x.png create mode 100644 Example/SnapshotTests/ReferenceImages/_64/ImpreciseObjectiveCTests/testViewWithInvertedColors_13_7_375x812@3x.png create mode 100644 Example/SnapshotTests/ReferenceImages/_64/ImpreciseObjectiveCTests/testViewWithInvertedColors_14_5_390x844@3x.png create mode 100644 Sources/AccessibilitySnapshot/iOSSnapshotTestCase/ObjC/include/FBSnapshotTestCase_ImpreciseAccessibility.h create mode 100644 Sources/AccessibilitySnapshot/iOSSnapshotTestCase/Swift/FBSnapshotTestCase+ImpreciseAccessibility.swift diff --git a/Example/AccessibilitySnapshot.xcodeproj/project.pbxproj b/Example/AccessibilitySnapshot.xcodeproj/project.pbxproj index f10f78b8..996ea405 100644 --- a/Example/AccessibilitySnapshot.xcodeproj/project.pbxproj +++ b/Example/AccessibilitySnapshot.xcodeproj/project.pbxproj @@ -20,6 +20,7 @@ 3D3F2E142263E6B900F7608E /* InvertColorsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3F2E132263E6B900F7608E /* InvertColorsViewController.swift */; }; 3D3F2E162263E94D00F7608E /* InvertColorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3F2E152263E94D00F7608E /* InvertColorsTests.swift */; }; 3D4674682116A3F100278B57 /* ViewAccessibilityPropertiesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D4674672116A3F100278B57 /* ViewAccessibilityPropertiesViewController.swift */; }; + 3D9334942A8B2E520078A142 /* ImpreciseObjectiveCTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D9334932A8B2E520078A142 /* ImpreciseObjectiveCTests.m */; }; 3D9894F9213509C8006C16F6 /* DescriptionEdgeCasesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D9894F8213509C8006C16F6 /* DescriptionEdgeCasesViewController.swift */; }; 3DA12A3222405B9E00EB3C33 /* DataTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DA12A3122405B9E00EB3C33 /* DataTableViewController.swift */; }; 3DBAC28722406EBB00EF4D0A /* AccessibilityContainersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DBAC28622406EBB00EF4D0A /* AccessibilityContainersTests.swift */; }; @@ -94,6 +95,7 @@ 3D4674672116A3F100278B57 /* ViewAccessibilityPropertiesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewAccessibilityPropertiesViewController.swift; sourceTree = ""; }; 3D881956246E03C00061DA6A /* UnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3D88195A246E03C00061DA6A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 3D9334932A8B2E520078A142 /* ImpreciseObjectiveCTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ImpreciseObjectiveCTests.m; sourceTree = ""; }; 3D9894F8213509C8006C16F6 /* DescriptionEdgeCasesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DescriptionEdgeCasesViewController.swift; sourceTree = ""; }; 3DA12A3122405B9E00EB3C33 /* DataTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataTableViewController.swift; sourceTree = ""; }; 3DBAC28622406EBB00EF4D0A /* AccessibilityContainersTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilityContainersTests.swift; sourceTree = ""; }; @@ -294,6 +296,7 @@ isa = PBXGroup; children = ( 3D13DB512221124000066519 /* ObjectiveCTests.m */, + 3D9334932A8B2E520078A142 /* ImpreciseObjectiveCTests.m */, 3DBAC28622406EBB00EF4D0A /* AccessibilityContainersTests.swift */, 607FACEB1AFB9204008FA782 /* AccessibilityPropertiesTests.swift */, 3D39BFAF2239BC42009C3EF4 /* ActivationPointTests.swift */, @@ -637,6 +640,7 @@ 3D220A2B252AF72900359C1E /* AccessibleContainerView.swift in Sources */, 1635CE4E251EAC6700907101 /* SnapshotTestingTests.swift in Sources */, 3DBEAA5D2223C0CE00FAE61D /* SwitchControlsTests.swift in Sources */, + 3D9334942A8B2E520078A142 /* ImpreciseObjectiveCTests.m in Sources */, 3DF46500220D5FB00048D446 /* ElementSelectionTests.swift in Sources */, 3DBAC28722406EBB00EF4D0A /* AccessibilityContainersTests.swift in Sources */, 3DC488392212B40C006D1E15 /* ModalTests.swift in Sources */, diff --git a/Example/SnapshotTests/ImpreciseObjectiveCTests.m b/Example/SnapshotTests/ImpreciseObjectiveCTests.m new file mode 100644 index 00000000..ed56084d --- /dev/null +++ b/Example/SnapshotTests/ImpreciseObjectiveCTests.m @@ -0,0 +1,92 @@ +// +// Copyright 2023 Block Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +@import AccessibilitySnapshot; +@import FBSnapshotTestCase; +@import XCTest; + + +@interface ImpreciseObjectiveCTests : FBSnapshotTestCase + +@end + + +@implementation ImpreciseObjectiveCTests + +- (void)setUp; +{ + [super setUp]; + + self.fileNameOptions = FBSnapshotTestCaseFileNameIncludeOptionOS | FBSnapshotTestCaseFileNameIncludeOptionScreenSize | FBSnapshotTestCaseFileNameIncludeOptionScreenScale; +} + +- (void)testSimpleView; +{ + UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 50)]; + + UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(25, 10, 150, 30)]; + label.text = @"Objective-C Snapshot"; + label.textColor = [UIColor redColor]; + label.font = [UIFont systemFontOfSize:12]; + label.textAlignment = NSTextAlignmentCenter; + [view addSubview:label]; + + SnapshotImpreciseVerifyAccessibility(view, nil, 0, 0); +} + +- (void)testSimpleViewWithIdentifier; +{ + UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 50)]; + + UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(25, 10, 150, 30)]; + label.text = @"Objective-C Snapshot"; + label.textColor = [UIColor redColor]; + label.font = [UIFont systemFontOfSize:12]; + label.textAlignment = NSTextAlignmentCenter; + [view addSubview:label]; + + SnapshotImpreciseVerifyAccessibility(view, @"identifier", 0, 0); +} + +- (void)testSimpleViewWithActivationPointAlways; +{ + UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 50)]; + + UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(25, 10, 150, 30)]; + label.text = @"Objective-C Snapshot"; + label.textColor = [UIColor redColor]; + label.font = [UIFont systemFontOfSize:12]; + label.textAlignment = NSTextAlignmentCenter; + [view addSubview:label]; + + SnapshotImpreciseVerifyAccessibilityWithOptions(view, nil, YES, YES, 0, 0); +} + +- (void)testViewWithInvertedColors; +{ + UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; + [view setBackgroundColor:[UIColor redColor]]; + + UIView *subview = [[UIView alloc] initWithFrame:CGRectMake(25, 25, 50, 50)]; + [subview setBackgroundColor:[UIColor greenColor]]; + + [subview setAccessibilityIgnoresInvertColors:YES]; + [view addSubview:subview]; + + SnapshotImpreciseVerifyWithInvertedColors(view, nil, 0, 0); +} + +@end diff --git a/Example/SnapshotTests/ReferenceImages/_64/ImpreciseObjectiveCTests/testSimpleViewWithActivationPointAlways_13_7_375x812@3x.png b/Example/SnapshotTests/ReferenceImages/_64/ImpreciseObjectiveCTests/testSimpleViewWithActivationPointAlways_13_7_375x812@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..31861f2d2fee01819569c3413c03ba9b6186b752 GIT binary patch literal 22954 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 literal 0 HcmV?d00001 diff --git a/Example/SnapshotTests/ReferenceImages/_64/ImpreciseObjectiveCTests/testSimpleViewWithIdentifier_identifier_14_5_390x844@3x.png b/Example/SnapshotTests/ReferenceImages/_64/ImpreciseObjectiveCTests/testSimpleViewWithIdentifier_identifier_14_5_390x844@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a38acfa94d7fe78ff0d587caed4bb50003b6322d GIT binary patch literal 21678 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 literal 0 HcmV?d00001 diff --git a/Example/SnapshotTests/ReferenceImages/_64/ImpreciseObjectiveCTests/testSimpleView_14_5_390x844@3x.png b/Example/SnapshotTests/ReferenceImages/_64/ImpreciseObjectiveCTests/testSimpleView_14_5_390x844@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a38acfa94d7fe78ff0d587caed4bb50003b6322d GIT binary patch literal 21678 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 z literal 0 HcmV?d00001 diff --git a/Example/SnapshotTests/ReferenceImages/_64/ImpreciseObjectiveCTests/testViewWithInvertedColors_14_5_390x844@3x.png b/Example/SnapshotTests/ReferenceImages/_64/ImpreciseObjectiveCTests/testViewWithInvertedColors_14_5_390x844@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f7d5b9fcd420b3b65900b0e940ce784b77471683 GIT binary patch literal 3598 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4mO}jWo=(6kYX$ja(7}_cTVOdkW-Nw;hE;^ z%b*2hb1<+lN-?m4lmM|EqcoiD#;C!-3>If%U}(=|V1cUf1JWRH1BgL-AT;v=MyP6_ z*a9Y)YDS#}%m_9}Tj-m8CP0d_z$3DlfkDv%gc)6@872S)Winm-Lx42ULNJ&HBsG8- zL<2Ef<;rzeCjn_!PZ!6K3dT2A9lMwu1ehKE|IaM{+sN45rgtRTm~W%n-wK=g{_&Cq z2M)9}c6w`tdbcvN#j%M@J9~IA8Q0u!kXa(rK-$1g*nJCV)~FMP zK`7X7jFtZ{ea@X}zMn(lzPrx({Qq1MYkv3tH3@m{`C#gS?XmoS_idPDfBN$z2j#{i z4?ae=PG!hQC|$-P)OqxMzAQ?>zbj${CZ`uRvl>h%dXGiA)E0k@Z3gzuJ z$1D~{9_9l-|1VdcEx#tAR6x%uZ`n(YtDkJn|K3-(|LlXGDNo&*_WM1Eu74(%I#uC^ zDJX~AgY$HvDuazar-_gUkKFvw2+jt!uyij4!-|?Pkc952#AuL=CIPZGfaCJkPb|snIJ65k3W3xhToF$i^E&dn@~ z literal 0 HcmV?d00001 diff --git a/Sources/AccessibilitySnapshot/iOSSnapshotTestCase/ObjC/include/FBSnapshotTestCase_Accessibility.h b/Sources/AccessibilitySnapshot/iOSSnapshotTestCase/ObjC/include/FBSnapshotTestCase_Accessibility.h index 5fc42492..007f5999 100644 --- a/Sources/AccessibilitySnapshot/iOSSnapshotTestCase/ObjC/include/FBSnapshotTestCase_Accessibility.h +++ b/Sources/AccessibilitySnapshot/iOSSnapshotTestCase/ObjC/include/FBSnapshotTestCase_Accessibility.h @@ -1,5 +1,5 @@ // -// Copyright 2019 Square Inc. +// Copyright 2023 Block Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -18,11 +18,11 @@ {\ _Pragma("clang diagnostic push")\ _Pragma("clang diagnostic ignored \"-Wundeclared-selector\"")\ - SEL selector = @selector(snapshotVerifyAccessibility:identifier:);\ + SEL selector = @selector(snapshotVerifyAccessibility:identifier:perPixelTolerance:overallTolerance:);\ _Pragma("clang diagnostic pop")\ - typedef NSString * (*SnapshotMethod)(id, SEL, UIView *, NSString *);\ + typedef NSString * (*SnapshotMethod)(id, SEL, UIView *, NSString *, CGFloat, CGFloat);\ SnapshotMethod snapshotVerifyAccessibility = (SnapshotMethod)[self methodForSelector:selector];\ - NSString *errorDescription = snapshotVerifyAccessibility(self, selector, view__, identifier__ ?: @"");\ + NSString *errorDescription = snapshotVerifyAccessibility(self, selector, view__, identifier__ ?: @"", 0, 0);\ if (errorDescription == nil) {\ XCTAssertTrue(YES);\ } else {\ @@ -34,11 +34,11 @@ {\ _Pragma("clang diagnostic push")\ _Pragma("clang diagnostic ignored \"-Wundeclared-selector\"")\ - SEL selector = @selector(snapshotVerifyAccessibility:identifier:showActivationPoints:useMonochromeSnapshot:);\ + SEL selector = @selector(snapshotVerifyAccessibility:identifier:showActivationPoints:useMonochromeSnapshot:perPixelTolerance:overallTolerance:);\ _Pragma("clang diagnostic pop")\ - typedef NSString * (*SnapshotMethod)(id, SEL, UIView *, NSString *, BOOL, BOOL);\ + typedef NSString * (*SnapshotMethod)(id, SEL, UIView *, NSString *, BOOL, BOOL, CGFloat, CGFloat);\ SnapshotMethod snapshotVerifyAccessibility = (SnapshotMethod)[self methodForSelector:selector];\ - NSString *errorDescription = snapshotVerifyAccessibility(self, selector, view__, identifier__ ?: @"", showActivationPoints__, useMonochromeSnapshot__);\ + NSString *errorDescription = snapshotVerifyAccessibility(self, selector, view__, identifier__ ?: @"", showActivationPoints__, useMonochromeSnapshot__, 0, 0);\ if (errorDescription == nil) {\ XCTAssertTrue(YES);\ } else {\ @@ -50,11 +50,11 @@ {\ _Pragma("clang diagnostic push")\ _Pragma("clang diagnostic ignored \"-Wundeclared-selector\"")\ - SEL selector = @selector(snapshotVerifyWithInvertedColors:identifier:);\ + SEL selector = @selector(snapshotVerifyWithInvertedColors:identifier:perPixelTolerance:overallTolerance:);\ _Pragma("clang diagnostic pop")\ - typedef NSString * (*SnapshotMethod)(id, SEL, UIView *, NSString *);\ + typedef NSString * (*SnapshotMethod)(id, SEL, UIView *, NSString *, CGFloat, CGFloat);\ SnapshotMethod snapshotVerifyWithInvertedColors = (SnapshotMethod)[self methodForSelector:selector];\ - NSString *errorDescription = snapshotVerifyWithInvertedColors(self, selector, view__, identifier__ ?: @"");\ + NSString *errorDescription = snapshotVerifyWithInvertedColors(self, selector, view__, identifier__ ?: @"", 0, 0);\ if (errorDescription == nil) {\ XCTAssertTrue(YES);\ } else {\ diff --git a/Sources/AccessibilitySnapshot/iOSSnapshotTestCase/ObjC/include/FBSnapshotTestCase_ImpreciseAccessibility.h b/Sources/AccessibilitySnapshot/iOSSnapshotTestCase/ObjC/include/FBSnapshotTestCase_ImpreciseAccessibility.h new file mode 100644 index 00000000..eedb2372 --- /dev/null +++ b/Sources/AccessibilitySnapshot/iOSSnapshotTestCase/ObjC/include/FBSnapshotTestCase_ImpreciseAccessibility.h @@ -0,0 +1,63 @@ +// +// Copyright 2023 Block Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#define SnapshotImpreciseVerifyAccessibility(view__, identifier__, perPixelTolerance__, overallTolerance__)\ + {\ + _Pragma("clang diagnostic push")\ + _Pragma("clang diagnostic ignored \"-Wundeclared-selector\"")\ + SEL selector = @selector(snapshotVerifyAccessibility:identifier:perPixelTolerance:overallTolerance:);\ + _Pragma("clang diagnostic pop")\ + typedef NSString * (*SnapshotMethod)(id, SEL, UIView *, NSString *, CGFloat, CGFloat);\ + SnapshotMethod snapshotVerifyAccessibility = (SnapshotMethod)[self methodForSelector:selector];\ + NSString *errorDescription = snapshotVerifyAccessibility(self, selector, view__, identifier__ ?: @"", perPixelTolerance__, overallTolerance__);\ + if (errorDescription == nil) {\ + XCTAssertTrue(YES);\ + } else {\ + XCTFail("%@", errorDescription);\ + }\ + } + +#define SnapshotImpreciseVerifyAccessibilityWithOptions(view__, identifier__, showActivationPoints__, useMonochromeSnapshot__, perPixelTolerance__, overallTolerance__)\ + {\ + _Pragma("clang diagnostic push")\ + _Pragma("clang diagnostic ignored \"-Wundeclared-selector\"")\ + SEL selector = @selector(snapshotVerifyAccessibility:identifier:showActivationPoints:useMonochromeSnapshot:perPixelTolerance:overallTolerance:);\ + _Pragma("clang diagnostic pop")\ + typedef NSString * (*SnapshotMethod)(id, SEL, UIView *, NSString *, BOOL, BOOL, CGFloat, CGFloat);\ + SnapshotMethod snapshotVerifyAccessibility = (SnapshotMethod)[self methodForSelector:selector];\ + NSString *errorDescription = snapshotVerifyAccessibility(self, selector, view__, identifier__ ?: @"", showActivationPoints__, useMonochromeSnapshot__, perPixelTolerance__, overallTolerance__);\ + if (errorDescription == nil) {\ + XCTAssertTrue(YES);\ + } else {\ + XCTFail("%@", errorDescription);\ + }\ + } + +#define SnapshotImpreciseVerifyWithInvertedColors(view__, identifier__, perPixelTolerance__, overallTolerance__)\ + {\ + _Pragma("clang diagnostic push")\ + _Pragma("clang diagnostic ignored \"-Wundeclared-selector\"")\ + SEL selector = @selector(snapshotVerifyWithInvertedColors:identifier:perPixelTolerance:overallTolerance:);\ + _Pragma("clang diagnostic pop")\ + typedef NSString * (*SnapshotMethod)(id, SEL, UIView *, NSString *, CGFloat, CGFloat);\ + SnapshotMethod snapshotVerifyWithInvertedColors = (SnapshotMethod)[self methodForSelector:selector];\ + NSString *errorDescription = snapshotVerifyWithInvertedColors(self, selector, view__, identifier__ ?: @"", perPixelTolerance__, overallTolerance__);\ + if (errorDescription == nil) {\ + XCTAssertTrue(YES);\ + } else {\ + XCTFail("%@", errorDescription);\ + }\ + } diff --git a/Sources/AccessibilitySnapshot/iOSSnapshotTestCase/Swift/FBSnapshotTestCase+Accessibility.swift b/Sources/AccessibilitySnapshot/iOSSnapshotTestCase/Swift/FBSnapshotTestCase+Accessibility.swift index 5758337b..bf748721 100644 --- a/Sources/AccessibilitySnapshot/iOSSnapshotTestCase/Swift/FBSnapshotTestCase+Accessibility.swift +++ b/Sources/AccessibilitySnapshot/iOSSnapshotTestCase/Swift/FBSnapshotTestCase+Accessibility.swift @@ -1,5 +1,5 @@ // -// Copyright 2019 Square Inc. +// Copyright 2023 Block Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sources/AccessibilitySnapshot/iOSSnapshotTestCase/Swift/FBSnapshotTestCase+ImpreciseAccessibility.swift b/Sources/AccessibilitySnapshot/iOSSnapshotTestCase/Swift/FBSnapshotTestCase+ImpreciseAccessibility.swift new file mode 100644 index 00000000..79684a10 --- /dev/null +++ b/Sources/AccessibilitySnapshot/iOSSnapshotTestCase/Swift/FBSnapshotTestCase+ImpreciseAccessibility.swift @@ -0,0 +1,179 @@ +// +// Copyright 2023 Block Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import XCTest + +#if SWIFT_PACKAGE +import AccessibilitySnapshotCore +import AccessibilitySnapshotCore_ObjC +import iOSSnapshotTestCase +#else +import FBSnapshotTestCase +#endif + +extension FBSnapshotTestCase { + + /// Snapshots the `view` with colored overlays of each accessibility element it contains, as well as an + /// approximation of the description that VoiceOver will read for each element. + /// + /// When `recordMode` is true, records a snapshot of the view. When `recordMode` is false, performs a comparison + /// with the existing snapshot. + /// + /// - Note: This method will modify the view hierarchy in order to snapshot the view. It will attempt to restore the + /// hierarchy to its original state as much as possible, but is not guaranteed to be without side effects (for + /// example if something observes changes in the view hierarchy). + /// + /// - Warning: Using a `perPixelTolerance` or `overallTolerance` greater than `0` may result in allowing regressions + /// through. Prefer using `perPixelTolerance` over `overallTolerance` where possible, and only raise the tolerances + /// to the extent needed to allow your tests to pass across multiple machines. + /// + /// - parameter view: The view that will be snapshotted. + /// - parameter identifier: An optional identifier included in the snapshot name, for use when there are multiple + /// snapshot tests in a given test method. Defaults to no identifier. + /// - parameter showActivationPoints: When to show indicators for elements' accessibility activation points. + /// Defaults to showing activation points only when they are different than the default activation point for that + /// element. + /// - parameter useMonochromeSnapshot: Whether or not the snapshot of the `view` should be monochrome. Using a + /// monochrome snapshot makes it more clear where the highlighted elements are, but may make it difficult to + /// read certain views. Defaults to `true`. + /// - parameter markerColors: An array of colors to use for the highlighted regions. These colors will be used in + /// order, repeating through the array as necessary. + /// - parameter suffixes: NSOrderedSet object containing strings that are appended to the reference images + /// directory. Defaults to `FBSnapshotTestCaseDefaultSuffixes()`. + /// - parameter perPixelTolerance: The amount the RGBA components of a pixel can differ for the pixel to still be + /// considered "unchanged". Value must be in the range `[0,1]`, where `0` means no difference allowed and `1` means + /// any two colors are considered identical. + /// - parameter overallTolerance: The portion of pixels that are allowed to have changed (as defined by the + /// per-pixel tolerance) for the image to still considered "unchanged" overall. Value must be in the range `[0,1]`, + /// where `0` means no pixels may change and `1` means all pixels may change. + /// - parameter file: The file in which the test result should be attributed. + /// - parameter line: The line in which the test result should be attributed. + public func SnapshotImpreciseVerifyAccessibility( + _ view: UIView, + identifier: String = "", + showActivationPoints activationPointDisplayMode: ActivationPointDisplayMode = .whenOverridden, + useMonochromeSnapshot: Bool = true, + markerColors: [UIColor] = [], + suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), + perPixelTolerance: CGFloat = 0, + overallTolerance: CGFloat = 0, + file: StaticString = #file, + line: UInt = #line + ) { + guard isRunningInHostApplication else { + XCTFail(ErrorMessageFactory.errorMessageForMissingHostApplication, file: file, line: line) + return + } + + let containerView = AccessibilitySnapshotView( + containedView: view, + viewRenderingMode: (usesDrawViewHierarchyInRect ? .drawHierarchyInRect : .renderLayerInContext), + markerColors: markerColors, + activationPointDisplayMode: activationPointDisplayMode + ) + + let window = UIWindow(frame: UIScreen.main.bounds) + window.makeKeyAndVisible() + containerView.center = window.center + window.addSubview(containerView) + + do { + try containerView.parseAccessibility(useMonochromeSnapshot: useMonochromeSnapshot) + } catch { + XCTFail(ErrorMessageFactory.errorMessageForAccessibilityParsingError(error), file: file, line: line) + return + } + containerView.sizeToFit() + + FBSnapshotVerifyView( + containerView, + identifier: identifier, + suffixes: suffixes, + perPixelTolerance: perPixelTolerance, + overallTolerance: overallTolerance, + file: file, + line: line + ) + } + + /// Snapshots the `view` simulating the way it will appear with Smart Invert Colors enabled. + /// + /// When `recordMode` is true, records a snapshot of the view. When `recordMode` is false, performs a comparison with the + /// existing snapshot. + /// + /// - Warning: Using a `perPixelTolerance` or `overallTolerance` greater than `0` may result in allowing regressions + /// through. Prefer using `perPixelTolerance` over `overallTolerance` where possible, and only raise the tolerances + /// to the extent needed to allow your tests to pass across multiple machines. + /// + /// - parameter view: The view that will be snapshotted. + /// - parameter identifier: An optional identifier included in the snapshot name, for use when there are multiple snapshot tests + /// in a given test method. Defaults to no identifier. + /// - parameter suffixes: NSOrderedSet object containing strings that are appended to the reference images directory. + /// Defaults to `FBSnapshotTestCaseDefaultSuffixes()`. + /// - parameter perPixelTolerance: The amount the RGBA components of a pixel can differ for the pixel to still be + /// considered "unchanged". Value must be in the range `[0,1]`, where `0` means no difference allowed and `1` means + /// any two colors are considered identical. + /// - parameter overallTolerance: The portion of pixels that are allowed to have changed (as defined by the + /// per-pixel tolerance) for the image to still considered "unchanged" overall. Value must be in the range `[0,1]`, + /// where `0` means no pixels may change and `1` means all pixels may change. + /// - parameter file: The file in which the test result should be attributed. + /// - parameter line: The line in which the test result should be attributed. + public func SnapshotImpreciseVerifyWithInvertedColors( + _ view: UIView, + identifier: String = "", + suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), + perPixelTolerance: CGFloat = 0, + overallTolerance: CGFloat = 0, + file: StaticString = #file, + line: UInt = #line + ) { + func postNotification() { + NotificationCenter.default.post( + name: UIAccessibility.invertColorsStatusDidChangeNotification, + object: nil, + userInfo: nil + ) + } + + let requiresWindow = (view.window == nil && !(view is UIWindow)) + if requiresWindow { + let window = UIApplication.shared.firstKeyWindow ?? UIWindow(frame: UIScreen.main.bounds) + window.addSubview(view) + } + + view.layoutIfNeeded() + + let statusUtility = UIAccessibilityStatusUtility() + statusUtility.mockInvertColorsStatus() + postNotification() + + let renderer = UIGraphicsImageRenderer(bounds: view.bounds) + let image = renderer.image { context in + view.drawHierarchyWithInvertedColors(in: view.bounds, using: context) + } + + let imageView = UIImageView(image: image) + FBSnapshotVerifyView(imageView, suffixes: suffixes, file: file, line: line) + + statusUtility.unmockStatuses() + postNotification() + + if requiresWindow { + view.removeFromSuperview() + } + } + +} diff --git a/Sources/AccessibilitySnapshot/iOSSnapshotTestCase/Swift/FBSnapshotTestCase+ObjCSupport.swift b/Sources/AccessibilitySnapshot/iOSSnapshotTestCase/Swift/FBSnapshotTestCase+ObjCSupport.swift index fd9b2191..c749441d 100644 --- a/Sources/AccessibilitySnapshot/iOSSnapshotTestCase/Swift/FBSnapshotTestCase+ObjCSupport.swift +++ b/Sources/AccessibilitySnapshot/iOSSnapshotTestCase/Swift/FBSnapshotTestCase+ObjCSupport.swift @@ -24,36 +24,50 @@ import FBSnapshotTestCase extension FBSnapshotTestCase { - @objc(snapshotVerifyAccessibility:identifier:) - private func 🚫objc_snapshotVerifyAccessibility(_ view: UIView, identifier: String) -> String? { + @objc(snapshotVerifyAccessibility:identifier:perPixelTolerance:overallTolerance:) + private func 🚫objc_snapshotVerifyAccessibility( + _ view: UIView, + identifier: String, + perPixelTolerance: CGFloat, + overallTolerance: CGFloat + ) -> String? { return snapshotVerifyAccessibility( view, identifier: identifier, activationPointDisplayMode: .whenOverridden, - useMonochromeSnapshot: true + useMonochromeSnapshot: true, + perPixelTolerance: perPixelTolerance, + overallTolerance: overallTolerance ) } - @objc(snapshotVerifyAccessibility:identifier:showActivationPoints:useMonochromeSnapshot:) + @objc(snapshotVerifyAccessibility:identifier:showActivationPoints:useMonochromeSnapshot:perPixelTolerance:overallTolerance:) private func 🚫objc_snapshotVerifyAccessibility( _ view: UIView, identifier: String, showActivationPoints: Bool, - useMonochromeSnapshot: Bool + useMonochromeSnapshot: Bool, + perPixelTolerance: CGFloat, + overallTolerance: CGFloat ) -> String? { return snapshotVerifyAccessibility( view, identifier: identifier, activationPointDisplayMode: showActivationPoints ? .always : .never, - useMonochromeSnapshot: useMonochromeSnapshot + useMonochromeSnapshot: useMonochromeSnapshot, + perPixelTolerance: perPixelTolerance, + overallTolerance: overallTolerance ) } - private func snapshotVerifyAccessibility( + @nonobjc + internal func snapshotVerifyAccessibility( _ view: UIView, identifier: String, activationPointDisplayMode: ActivationPointDisplayMode, - useMonochromeSnapshot: Bool + useMonochromeSnapshot: Bool, + perPixelTolerance: CGFloat, + overallTolerance: CGFloat ) -> String? { guard isRunningInHostApplication else { return ErrorMessageFactory.errorMessageForMissingHostApplication @@ -82,15 +96,20 @@ extension FBSnapshotTestCase { containerView, identifier: identifier, suffixes: FBSnapshotTestCaseDefaultSuffixes(), - perPixelTolerance: 0, - overallTolerance: 0, + perPixelTolerance: perPixelTolerance, + overallTolerance: overallTolerance, defaultReferenceDirectory: FB_REFERENCE_IMAGE_DIR, defaultImageDiffDirectory: IMAGE_DIFF_DIR ) } - @objc(snapshotVerifyWithInvertedColors:identifier:) - private func snapshotVerifyWithInvertedColors(_ view: UIView, identifier: String) -> String? { + @objc(snapshotVerifyWithInvertedColors:identifier:perPixelTolerance:overallTolerance:) + private func snapshotVerifyWithInvertedColors( + _ view: UIView, + identifier: String, + perPixelTolerance: CGFloat, + overallTolerance: CGFloat + ) -> String? { func postNotification() { NotificationCenter.default.post( name: UIAccessibility.invertColorsStatusDidChangeNotification, @@ -121,8 +140,8 @@ extension FBSnapshotTestCase { imageView, identifier: identifier, suffixes: FBSnapshotTestCaseDefaultSuffixes(), - perPixelTolerance: 0, - overallTolerance: 0, + perPixelTolerance: perPixelTolerance, + overallTolerance: overallTolerance, defaultReferenceDirectory: FB_REFERENCE_IMAGE_DIR, defaultImageDiffDirectory: IMAGE_DIFF_DIR )