From b377cc700f64bb164a81f511336784932b9a66bf Mon Sep 17 00:00:00 2001 From: Diego Chohfi Date: Fri, 31 Mar 2023 10:01:33 -0300 Subject: [PATCH 1/9] Add build folder to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 8045370..ac86833 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ build .swiftpm .DS_Store +.build/ \ No newline at end of file From f1c1094deed40173237c1bf6b69dd3d141c6934d Mon Sep 17 00:00:00 2001 From: Diego Chohfi Date: Fri, 31 Mar 2023 10:02:48 -0300 Subject: [PATCH 2/9] Add ability to test in light and dark mode --- .../DynamicSize/DynamicSizeSnapshot.swift | 79 ++++++++++++++----- .../HaveValidDynamicTypeSnapshot.swift | 30 +++++-- .../DynamicType/PrettyDynamicTypeSyntax.swift | 39 ++++++--- Nimble_Snapshots/HaveValidSnapshot.swift | 70 +++++++++++----- Nimble_Snapshots/PrettySyntax.swift | 24 ++++-- 5 files changed, 179 insertions(+), 63 deletions(-) diff --git a/Nimble_Snapshots/DynamicSize/DynamicSizeSnapshot.swift b/Nimble_Snapshots/DynamicSize/DynamicSizeSnapshot.swift index bc4bcf7..6fa33e2 100644 --- a/Nimble_Snapshots/DynamicSize/DynamicSizeSnapshot.swift +++ b/Nimble_Snapshots/DynamicSize/DynamicSizeSnapshot.swift @@ -128,21 +128,34 @@ public struct DynamicSizeSnapshot { let record: Bool let sizes: [String: CGSize] let resizeMode: ResizeMode - - init(name: String?, identifier: String?, record: Bool, sizes: [String: CGSize], resizeMode: ResizeMode) { + let userInterfaceStyle: UIUserInterfaceStyle? + + init(name: String?, + identifier: String?, + record: Bool, + sizes: [String: CGSize], + resizeMode: ResizeMode, + userInterfaceStyle: UIUserInterfaceStyle?) { self.name = name self.identifier = identifier self.record = record self.sizes = sizes self.resizeMode = resizeMode + self.userInterfaceStyle = userInterfaceStyle } } public func snapshot(_ name: String? = nil, identifier: String? = nil, sizes: [String: CGSize], - resizeMode: ResizeMode = .frame) -> DynamicSizeSnapshot { - return DynamicSizeSnapshot(name: name, identifier: identifier, record: false, sizes: sizes, resizeMode: resizeMode) + resizeMode: ResizeMode = .frame, + userInterfaceStyle: UIUserInterfaceStyle? = nil) -> DynamicSizeSnapshot { + return DynamicSizeSnapshot(name: name, + identifier: identifier, + record: false, + sizes: sizes, + resizeMode: resizeMode, + userInterfaceStyle: userInterfaceStyle) } public func haveValidDynamicSizeSnapshot(named name: String? = nil, @@ -153,7 +166,8 @@ public func haveValidDynamicSizeSnapshot(named name: String? = pixelTolerance: CGFloat? = nil, tolerance: CGFloat? = nil, resizeMode: ResizeMode = .frame, - shouldIgnoreScale: Bool = false) -> Predicate { + shouldIgnoreScale: Bool = false, + userInterfaceStyle: UIUserInterfaceStyle? = nil) -> Predicate { return Predicate { actualExpression in return performDynamicSizeSnapshotTest(name, identifier: identifier, @@ -165,7 +179,23 @@ public func haveValidDynamicSizeSnapshot(named name: String? = pixelTolerance: pixelTolerance, isRecord: false, resizeMode: resizeMode, - shouldIgnoreScale: shouldIgnoreScale) + shouldIgnoreScale: shouldIgnoreScale, + userInterfaceStyle: userInterfaceStyle) + } +} + +extension UIUserInterfaceStyle { + var identifier: String? { + switch self { + case .dark: + return "dark" + case .light: + return "light" + case .unspecified: + return nil + @unknown default: + return nil + } } } @@ -179,7 +209,8 @@ func performDynamicSizeSnapshotTest(_ name: String?, pixelTolerance: CGFloat? = nil, isRecord: Bool, resizeMode: ResizeMode, - shouldIgnoreScale: Bool = false) -> PredicateResult { + shouldIgnoreScale: Bool = false, + userInterfaceStyle: UIUserInterfaceStyle? = nil) -> PredicateResult { // swiftlint:disable:next force_try force_unwrapping let instance = try! actualExpression.evaluate()! let testFileLocation = actualExpression.location.file @@ -193,13 +224,9 @@ func performDynamicSizeSnapshotTest(_ name: String?, let result = sizes.map { sizeName, size -> Bool in // swiftlint:disable:next force_unwrapping let view = instance.snapshotObject! - let finalSnapshotName: String - - if let identifier = identifier { - finalSnapshotName = "\(snapshotName)_\(identifier)_\(sizeName)" - } else { - finalSnapshotName = "\(snapshotName)_\(sizeName)" - } + let finalSnapshotName = [snapshotName, identifier, "\(sizeName)", userInterfaceStyle?.identifier] + .compactMap { $0 } + .joined(separator: "_") resizer.resize(view: view, for: size) @@ -210,7 +237,7 @@ func performDynamicSizeSnapshotTest(_ name: String?, referenceDirectory: referenceImageDirectory, tolerance: tolerance, perPixelTolerance: pixelTolerance, filename: filename, identifier: nil, - shouldIgnoreScale: shouldIgnoreScale) + shouldIgnoreScale: shouldIgnoreScale, userInterfaceStyle: userInterfaceStyle) } if isRecord { @@ -240,8 +267,14 @@ func performDynamicSizeSnapshotTest(_ name: String?, public func recordSnapshot(_ name: String? = nil, identifier: String? = nil, sizes: [String: CGSize], - resizeMode: ResizeMode = .frame) -> DynamicSizeSnapshot { - return DynamicSizeSnapshot(name: name, identifier: identifier, record: true, sizes: sizes, resizeMode: resizeMode) + resizeMode: ResizeMode = .frame, + userInterfaceStyle: UIUserInterfaceStyle? = nil) -> DynamicSizeSnapshot { + return DynamicSizeSnapshot(name: name, + identifier: identifier, + record: true, + sizes: sizes, + resizeMode: resizeMode, + userInterfaceStyle: userInterfaceStyle) } public func recordDynamicSizeSnapshot(named name: String? = nil, @@ -250,7 +283,8 @@ public func recordDynamicSizeSnapshot(named name: String? = nil isDeviceAgnostic: Bool = false, usesDrawRect: Bool = false, resizeMode: ResizeMode = .frame, - shouldIgnoreScale: Bool = false) -> Predicate { + shouldIgnoreScale: Bool = false, + userInterfaceStyle: UIUserInterfaceStyle? = nil) -> Predicate { return Predicate { actualExpression in return performDynamicSizeSnapshotTest(name, identifier: identifier, @@ -260,7 +294,8 @@ public func recordDynamicSizeSnapshot(named name: String? = nil actualExpression: actualExpression, isRecord: true, resizeMode: resizeMode, - shouldIgnoreScale: shouldIgnoreScale) + shouldIgnoreScale: shouldIgnoreScale, + userInterfaceStyle: userInterfaceStyle) } } @@ -269,11 +304,13 @@ public func ==(lhs: Expectation, rhs: DynamicSi lhs.to(recordDynamicSizeSnapshot(named: rhs.name, identifier: rhs.identifier, sizes: rhs.sizes, - resizeMode: rhs.resizeMode)) + resizeMode: rhs.resizeMode, + userInterfaceStyle: rhs.userInterfaceStyle)) } else { lhs.to(haveValidDynamicSizeSnapshot(named: rhs.name, identifier: rhs.identifier, sizes: rhs.sizes, - resizeMode: rhs.resizeMode)) + resizeMode: rhs.resizeMode, + userInterfaceStyle: rhs.userInterfaceStyle)) } } diff --git a/Nimble_Snapshots/DynamicType/HaveValidDynamicTypeSnapshot.swift b/Nimble_Snapshots/DynamicType/HaveValidDynamicTypeSnapshot.swift index 2826688..6f2ac11 100644 --- a/Nimble_Snapshots/DynamicType/HaveValidDynamicTypeSnapshot.swift +++ b/Nimble_Snapshots/DynamicType/HaveValidDynamicTypeSnapshot.swift @@ -37,12 +37,16 @@ public func haveValidDynamicTypeSnapshot(named name: String? = pixelTolerance: CGFloat? = nil, tolerance: CGFloat? = nil, sizes: [UIContentSizeCategory] = allContentSizeCategories(), - isDeviceAgnostic: Bool = false) -> Predicate { + isDeviceAgnostic: Bool = false, + userInterfaceStyle: UIUserInterfaceStyle? = nil) -> Predicate { let mock = NBSMockedApplication() let predicates: [Predicate] = sizes.map { category in let sanitizedName = sanitizedTestName(name) - let nameWithCategory = "\(sanitizedName)_\(shortCategoryName(category))" + var nameWithCategory = "\(sanitizedName)_\(shortCategoryName(category))" + if let userInterfaceStyle = userInterfaceStyle, let userInterfaceStyleIdentifier = userInterfaceStyle.identifier { + nameWithCategory += "_\(userInterfaceStyleIdentifier)" + } return Predicate { actualExpression in mock.mockPreferredContentSizeCategory(category) @@ -52,13 +56,15 @@ public func haveValidDynamicTypeSnapshot(named name: String? = if isDeviceAgnostic { predicate = haveValidDeviceAgnosticSnapshot(named: nameWithCategory, identifier: identifier, usesDrawRect: usesDrawRect, pixelTolerance: pixelTolerance, - tolerance: tolerance) + tolerance: tolerance, + userInterfaceStyle: userInterfaceStyle) } else { predicate = haveValidSnapshot(named: nameWithCategory, identifier: identifier, usesDrawRect: usesDrawRect, pixelTolerance: pixelTolerance, - tolerance: tolerance) + tolerance: tolerance, + userInterfaceStyle: userInterfaceStyle) } return try predicate.satisfies(actualExpression) @@ -74,12 +80,16 @@ public func recordDynamicTypeSnapshot(named name: String? = nil identifier: String? = nil, usesDrawRect: Bool = false, sizes: [UIContentSizeCategory] = allContentSizeCategories(), - isDeviceAgnostic: Bool = false) -> Predicate { + isDeviceAgnostic: Bool = false, + userInterfaceStyle: UIUserInterfaceStyle? = nil) -> Predicate { let mock = NBSMockedApplication() let predicates: [Predicate] = sizes.map { category in let sanitizedName = sanitizedTestName(name) - let nameWithCategory = "\(sanitizedName)_\(shortCategoryName(category))" + var nameWithCategory = "\(sanitizedName)_\(shortCategoryName(category))" + if let userInterfaceStyle = userInterfaceStyle, let userInterfaceStyleIdentifier = userInterfaceStyle.identifier { + nameWithCategory += "_\(userInterfaceStyleIdentifier)" + } return Predicate { actualExpression in mock.mockPreferredContentSizeCategory(category) @@ -89,9 +99,13 @@ public func recordDynamicTypeSnapshot(named name: String? = nil if isDeviceAgnostic { predicate = recordDeviceAgnosticSnapshot(named: nameWithCategory, identifier: identifier, - usesDrawRect: usesDrawRect) + usesDrawRect: usesDrawRect, + userInterfaceStyle: userInterfaceStyle) } else { - predicate = recordSnapshot(named: nameWithCategory, identifier: identifier, usesDrawRect: usesDrawRect) + predicate = recordSnapshot(named: nameWithCategory, + identifier: identifier, + usesDrawRect: usesDrawRect, + userInterfaceStyle: userInterfaceStyle) } return try predicate.satisfies(actualExpression) diff --git a/Nimble_Snapshots/DynamicType/PrettyDynamicTypeSyntax.swift b/Nimble_Snapshots/DynamicType/PrettyDynamicTypeSyntax.swift index 560cbc5..011bf9c 100644 --- a/Nimble_Snapshots/DynamicType/PrettyDynamicTypeSyntax.swift +++ b/Nimble_Snapshots/DynamicType/PrettyDynamicTypeSyntax.swift @@ -9,51 +9,72 @@ public struct DynamicTypeSnapshot { let record: Bool let sizes: [UIContentSizeCategory] let deviceAgnostic: Bool + let userInterfaceStyle: UIUserInterfaceStyle? - init(name: String?, identifier: String?, record: Bool, sizes: [UIContentSizeCategory], deviceAgnostic: Bool) { + init(name: String?, + identifier: String?, + record: Bool, + sizes: [UIContentSizeCategory], + deviceAgnostic: Bool, + userInterfaceStyle: UIUserInterfaceStyle?) { self.name = name self.identifier = identifier self.record = record self.sizes = sizes self.deviceAgnostic = deviceAgnostic + self.userInterfaceStyle = userInterfaceStyle } } public func dynamicTypeSnapshot(_ name: String? = nil, identifier: String? = nil, sizes: [UIContentSizeCategory] = allContentSizeCategories(), - deviceAgnostic: Bool = false) -> DynamicTypeSnapshot { + deviceAgnostic: Bool = false, + userInterfaceStyle: UIUserInterfaceStyle? = nil) -> DynamicTypeSnapshot { return DynamicTypeSnapshot(name: name, identifier: identifier, record: false, sizes: sizes, - deviceAgnostic: deviceAgnostic) + deviceAgnostic: deviceAgnostic, + userInterfaceStyle: userInterfaceStyle) } public func recordDynamicTypeSnapshot(_ name: String? = nil, identifier: String? = nil, sizes: [UIContentSizeCategory] = allContentSizeCategories(), - deviceAgnostic: Bool = false) -> DynamicTypeSnapshot { + deviceAgnostic: Bool = false, + userInterfaceStyle: UIUserInterfaceStyle? = nil) -> DynamicTypeSnapshot { return DynamicTypeSnapshot(name: name, identifier: identifier, record: true, sizes: sizes, - deviceAgnostic: deviceAgnostic) + deviceAgnostic: deviceAgnostic, + userInterfaceStyle: userInterfaceStyle) } public func ==(lhs: Expectation, rhs: DynamicTypeSnapshot) where Expectation.Value: Snapshotable { if let name = rhs.name { if rhs.record { - lhs.to(recordDynamicTypeSnapshot(named: name, sizes: rhs.sizes, isDeviceAgnostic: rhs.deviceAgnostic)) + lhs.to(recordDynamicTypeSnapshot(named: name, + sizes: rhs.sizes, + isDeviceAgnostic: rhs.deviceAgnostic, + userInterfaceStyle: rhs.userInterfaceStyle)) } else { - lhs.to(haveValidDynamicTypeSnapshot(named: name, sizes: rhs.sizes, isDeviceAgnostic: rhs.deviceAgnostic)) + lhs.to(haveValidDynamicTypeSnapshot(named: name, + sizes: rhs.sizes, + isDeviceAgnostic: rhs.deviceAgnostic, + userInterfaceStyle: rhs.userInterfaceStyle)) } } else { if rhs.record { - lhs.to(recordDynamicTypeSnapshot(sizes: rhs.sizes, isDeviceAgnostic: rhs.deviceAgnostic)) + lhs.to(recordDynamicTypeSnapshot(sizes: rhs.sizes, + isDeviceAgnostic: rhs.deviceAgnostic, + userInterfaceStyle: rhs.userInterfaceStyle)) } else { - lhs.to(haveValidDynamicTypeSnapshot(sizes: rhs.sizes, isDeviceAgnostic: rhs.deviceAgnostic)) + lhs.to(haveValidDynamicTypeSnapshot(sizes: rhs.sizes, + isDeviceAgnostic: rhs.deviceAgnostic, + userInterfaceStyle: rhs.userInterfaceStyle)) } } } diff --git a/Nimble_Snapshots/HaveValidSnapshot.swift b/Nimble_Snapshots/HaveValidSnapshot.swift index eb650d4..0fe9309 100644 --- a/Nimble_Snapshots/HaveValidSnapshot.swift +++ b/Nimble_Snapshots/HaveValidSnapshot.swift @@ -51,7 +51,8 @@ public class FBSnapshotTest: NSObject { perPixelTolerance: CGFloat, filename: String, identifier: String? = nil, - shouldIgnoreScale: Bool = false) -> Bool { + shouldIgnoreScale: Bool = false, + userInterfaceStyle: UIUserInterfaceStyle? = nil) -> Bool { let testName = parseFilename(filename: filename) let snapshotController: FBSnapshotTestController = FBSnapshotTestController(test: self) @@ -66,7 +67,8 @@ public class FBSnapshotTest: NSObject { snapshotController.recordMode = record snapshotController.referenceImagesDirectory = referenceDirectory snapshotController.imageDiffDirectory = defaultImageDiffDirectory - snapshotController.usesDrawViewHierarchyInRect = usesDrawRect + // if an userInterfaceStyle is sent, we need to force usesDrawViewHierarchyInRect + snapshotController.usesDrawViewHierarchyInRect = userInterfaceStyle == nil ? usesDrawRect : true let reason = "Missing value for referenceImagesDirectory - " + "Call FBSnapshotTest.setReferenceImagesDirectory(FB_REFERENCE_IMAGE_DIR)" @@ -76,6 +78,10 @@ public class FBSnapshotTest: NSObject { fatalError("Failed unwrapping Snapshot Object") } + if let userInterfaceStyle = userInterfaceStyle { + snapshotObject.overrideUserInterfaceStyle = userInterfaceStyle + } + do { try snapshotController.compareSnapshot(ofViewOrLayer: snapshotObject, selector: Selector(snapshot), @@ -209,12 +215,20 @@ private func performSnapshotTest(_ name: String?, actualExpression: Expression, pixelTolerance: CGFloat? = nil, tolerance: CGFloat?, - shouldIgnoreScale: Bool) -> PredicateResult { + shouldIgnoreScale: Bool, + userInterfaceStyle: UIUserInterfaceStyle? = nil) -> PredicateResult { // swiftlint:disable:next force_try force_unwrapping let instance = try! actualExpression.evaluate()! let testFileLocation = actualExpression.location.file let referenceImageDirectory = getDefaultReferenceDirectory(testFileLocation) - let snapshotName = sanitizedTestName(name) + + let snapshotName: String + if let userInterfaceStyle = userInterfaceStyle, let userInterfaceStyleIdentifier = userInterfaceStyle.identifier { + snapshotName = sanitizedTestName(name) + "_\(userInterfaceStyleIdentifier)" + } else { + snapshotName = sanitizedTestName(name) + } + let tolerance = tolerance ?? getTolerance() let pixelTolerance = pixelTolerance ?? getPixelTolerance() let filename = "\(actualExpression.location.file)" @@ -224,7 +238,8 @@ private func performSnapshotTest(_ name: String?, referenceDirectory: referenceImageDirectory, tolerance: tolerance, perPixelTolerance: pixelTolerance, filename: filename, identifier: identifier, - shouldIgnoreScale: shouldIgnoreScale) + shouldIgnoreScale: shouldIgnoreScale, + userInterfaceStyle: userInterfaceStyle) return PredicateResult(status: PredicateStatus(bool: result), message: .fail("expected a matching snapshot in \(snapshotName)")) @@ -235,12 +250,20 @@ private func recordSnapshot(_ name: String?, isDeviceAgnostic: Bool = false, usesDrawRect: Bool = false, actualExpression: Expression, - shouldIgnoreScale: Bool) -> PredicateResult { + shouldIgnoreScale: Bool, + userInterfaceStyle: UIUserInterfaceStyle? = nil) -> PredicateResult { // swiftlint:disable:next force_try force_unwrapping let instance = try! actualExpression.evaluate()! let testFileLocation = actualExpression.location.file let referenceImageDirectory = getDefaultReferenceDirectory(testFileLocation) - let snapshotName = sanitizedTestName(name) + + let snapshotName: String + if let userInterfaceStyle = userInterfaceStyle, let userInterfaceStyleIdentifier = userInterfaceStyle.identifier { + snapshotName = sanitizedTestName(name) + "_\(userInterfaceStyleIdentifier)" + } else { + snapshotName = sanitizedTestName(name) + } + let tolerance = getTolerance() let pixelTolerance = getPixelTolerance() let filename = "\(actualExpression.location.file)" @@ -256,7 +279,8 @@ private func recordSnapshot(_ name: String?, perPixelTolerance: pixelTolerance, filename: filename, identifier: identifier, - shouldIgnoreScale: shouldIgnoreScale) { + shouldIgnoreScale: shouldIgnoreScale, + userInterfaceStyle: userInterfaceStyle) { let name = name ?? snapshotName message = "snapshot \(name) successfully recorded, replace recordSnapshot with a check" } else if let name = name { @@ -280,7 +304,8 @@ public func haveValidSnapshot(named name: String? = nil, usesDrawRect: Bool = false, pixelTolerance: CGFloat? = nil, tolerance: CGFloat? = nil, - shouldIgnoreScale: Bool = false) -> Predicate { + shouldIgnoreScale: Bool = false, + userInterfaceStyle: UIUserInterfaceStyle? = nil) -> Predicate { return Predicate { actualExpression in if switchChecksWithRecords { @@ -288,7 +313,8 @@ public func haveValidSnapshot(named name: String? = nil, identifier: identifier, usesDrawRect: usesDrawRect, actualExpression: actualExpression, - shouldIgnoreScale: shouldIgnoreScale) + shouldIgnoreScale: shouldIgnoreScale, + userInterfaceStyle: userInterfaceStyle) } return performSnapshotTest(name, @@ -297,7 +323,8 @@ public func haveValidSnapshot(named name: String? = nil, actualExpression: actualExpression, pixelTolerance: pixelTolerance, tolerance: tolerance, - shouldIgnoreScale: shouldIgnoreScale) + shouldIgnoreScale: shouldIgnoreScale, + userInterfaceStyle: userInterfaceStyle) } } @@ -306,7 +333,8 @@ public func haveValidDeviceAgnosticSnapshot(named name: String? usesDrawRect: Bool = false, pixelTolerance: CGFloat? = nil, tolerance: CGFloat? = nil, - shouldIgnoreScale: Bool = false) -> Predicate { + shouldIgnoreScale: Bool = false, + userInterfaceStyle: UIUserInterfaceStyle? = nil) -> Predicate { return Predicate { actualExpression in if switchChecksWithRecords { @@ -315,7 +343,8 @@ public func haveValidDeviceAgnosticSnapshot(named name: String? isDeviceAgnostic: true, usesDrawRect: usesDrawRect, actualExpression: actualExpression, - shouldIgnoreScale: shouldIgnoreScale) + shouldIgnoreScale: shouldIgnoreScale, + userInterfaceStyle: userInterfaceStyle) } return performSnapshotTest(name, @@ -325,30 +354,35 @@ public func haveValidDeviceAgnosticSnapshot(named name: String? actualExpression: actualExpression, pixelTolerance: pixelTolerance, tolerance: tolerance, - shouldIgnoreScale: shouldIgnoreScale) + shouldIgnoreScale: shouldIgnoreScale, + userInterfaceStyle: userInterfaceStyle) } } public func recordSnapshot(named name: String? = nil, identifier: String? = nil, usesDrawRect: Bool = false, - shouldIgnoreScale: Bool = false) -> Predicate { + shouldIgnoreScale: Bool = false, + userInterfaceStyle: UIUserInterfaceStyle? = nil) -> Predicate { return Predicate { actualExpression in return recordSnapshot(name, identifier: identifier, usesDrawRect: usesDrawRect, actualExpression: actualExpression, - shouldIgnoreScale: shouldIgnoreScale) + shouldIgnoreScale: shouldIgnoreScale, + userInterfaceStyle: userInterfaceStyle) } } public func recordDeviceAgnosticSnapshot(named name: String? = nil, identifier: String? = nil, usesDrawRect: Bool = false, - shouldIgnoreScale: Bool = false) -> Predicate { + shouldIgnoreScale: Bool = false, + userInterfaceStyle: UIUserInterfaceStyle? = nil) -> Predicate { return Predicate { actualExpression in return recordSnapshot(name, identifier: identifier, isDeviceAgnostic: true, usesDrawRect: usesDrawRect, actualExpression: actualExpression, - shouldIgnoreScale: shouldIgnoreScale) + shouldIgnoreScale: shouldIgnoreScale, + userInterfaceStyle: userInterfaceStyle) } } diff --git a/Nimble_Snapshots/PrettySyntax.swift b/Nimble_Snapshots/PrettySyntax.swift index 80de03a..086f143 100644 --- a/Nimble_Snapshots/PrettySyntax.swift +++ b/Nimble_Snapshots/PrettySyntax.swift @@ -7,32 +7,42 @@ public struct Snapshot { let identifier: String? let record: Bool let usesDrawRect: Bool + let userInterfaceStyle: UIUserInterfaceStyle? - init(name: String?, identifier: String?, record: Bool, usesDrawRect: Bool) { + init(name: String?, identifier: String?, record: Bool, usesDrawRect: Bool, userInterfaceStyle: UIUserInterfaceStyle?) { self.name = name self.identifier = identifier self.record = record self.usesDrawRect = usesDrawRect + self.userInterfaceStyle = userInterfaceStyle } } public func snapshot(_ name: String? = nil, identifier: String? = nil, - usesDrawRect: Bool = false) -> Snapshot { - return Snapshot(name: name, identifier: identifier, record: false, usesDrawRect: usesDrawRect) + usesDrawRect: Bool = false, + userInterfaceStyle: UIUserInterfaceStyle? = nil) -> Snapshot { + return Snapshot(name: name, identifier: identifier, record: false, usesDrawRect: usesDrawRect, userInterfaceStyle: userInterfaceStyle) } public func recordSnapshot(_ name: String? = nil, identifier: String? = nil, - usesDrawRect: Bool = false) -> Snapshot { - return Snapshot(name: name, identifier: identifier, record: true, usesDrawRect: usesDrawRect) + usesDrawRect: Bool = false, + userInterfaceStyle: UIUserInterfaceStyle? = nil) -> Snapshot { + return Snapshot(name: name, identifier: identifier, record: true, usesDrawRect: usesDrawRect, userInterfaceStyle: userInterfaceStyle) } public func ==(lhs: Expectation, rhs: Snapshot) where Expectation.Value: Snapshotable { if rhs.record { - lhs.to(recordSnapshot(named: rhs.name, identifier: rhs.identifier, usesDrawRect: rhs.usesDrawRect)) + lhs.to(recordSnapshot(named: rhs.name, + identifier: rhs.identifier, + usesDrawRect: rhs.usesDrawRect, + userInterfaceStyle: rhs.userInterfaceStyle)) } else { - lhs.to(haveValidSnapshot(named: rhs.name, identifier: rhs.identifier, usesDrawRect: rhs.usesDrawRect)) + lhs.to(haveValidSnapshot(named: rhs.name, + identifier: rhs.identifier, + usesDrawRect: rhs.usesDrawRect, + userInterfaceStyle: rhs.userInterfaceStyle)) } } From a2bc4c0e5b23db6ad27e116629373e285fac67b4 Mon Sep 17 00:00:00 2001 From: Diego Chohfi Date: Fri, 31 Mar 2023 10:03:06 -0300 Subject: [PATCH 3/9] Add test for light and dark mode --- Bootstrap/Bootstrap/DynamicTypeView.swift | 8 +++++++- .../BootstrapCustomFolderTests.swift | 3 ++- Bootstrap/BootstrapTests/BootstrapTests.swift | 11 ++++++++-- .../BootstrapTests/DynamicSizeTests.swift | 16 ++++++++++++++- .../BootstrapTests/DynamicTypeTests.swift | 20 +++++++++++++++++++ 5 files changed, 53 insertions(+), 5 deletions(-) diff --git a/Bootstrap/Bootstrap/DynamicTypeView.swift b/Bootstrap/Bootstrap/DynamicTypeView.swift index c9af57e..544a63c 100644 --- a/Bootstrap/Bootstrap/DynamicTypeView.swift +++ b/Bootstrap/Bootstrap/DynamicTypeView.swift @@ -8,7 +8,13 @@ public final class DynamicTypeView: UIView { label = UILabel() super.init(frame: frame) - backgroundColor = .white + backgroundColor = UIColor { traits -> UIColor in + if traits.userInterfaceStyle == .dark { + return .lightGray + } else { + return .white + } + } translatesAutoresizingMaskIntoConstraints = false label.font = .preferredFont(forTextStyle: .body) diff --git a/Bootstrap/BootstrapTests/ACustomFolder/BootstrapCustomFolderTests.swift b/Bootstrap/BootstrapTests/ACustomFolder/BootstrapCustomFolderTests.swift index 2c9a0cc..0fc958b 100644 --- a/Bootstrap/BootstrapTests/ACustomFolder/BootstrapCustomFolderTests.swift +++ b/Bootstrap/BootstrapTests/ACustomFolder/BootstrapCustomFolderTests.swift @@ -16,7 +16,8 @@ final class BootstrapCustomFormatTests: QuickSpec { } it("fails to find the snapshots due to the custom folder") { - expect(view).notTo(haveValidSnapshot(named: "something custom")) + expect(view).notTo(haveValidSnapshot(named: "something custom", userInterfaceStyle: .dark)) + expect(view).notTo(haveValidSnapshot(named: "something custom", userInterfaceStyle: .light)) } it("finds the snapshots using a custom images directory") { diff --git a/Bootstrap/BootstrapTests/BootstrapTests.swift b/Bootstrap/BootstrapTests/BootstrapTests.swift index c6b4614..57cc58b 100644 --- a/Bootstrap/BootstrapTests/BootstrapTests.swift +++ b/Bootstrap/BootstrapTests/BootstrapTests.swift @@ -16,11 +16,18 @@ final class BootstrapTests: QuickSpec { setNimbleTolerance(0.1) setNimbleTestFolder("tests") view = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 44, height: 44))) - view.backgroundColor = .blue + view.backgroundColor = UIColor { traits -> UIColor in + if traits.userInterfaceStyle == .dark { + return .brown + } else { + return .blue + } + } } it("has a valid snapshot") { - expect(view).to(haveValidSnapshot()) + expect(view).to(haveValidSnapshot(userInterfaceStyle: .light)) + expect(view).to(haveValidSnapshot(userInterfaceStyle: .dark)) expect(view).to(haveValidSnapshot(named: "something custom")) } diff --git a/Bootstrap/BootstrapTests/DynamicSizeTests.swift b/Bootstrap/BootstrapTests/DynamicSizeTests.swift index 50283e7..5141f29 100644 --- a/Bootstrap/BootstrapTests/DynamicSizeTests.swift +++ b/Bootstrap/BootstrapTests/DynamicSizeTests.swift @@ -27,7 +27,13 @@ final class DynamicSizeTests: QuickSpec { beforeEach { view = UIView(frame: CGRect(x: 0, y: 0, width: 500, height: 500)) - view.backgroundColor = .blue + view.backgroundColor = UIColor { traits -> UIColor in + if traits.userInterfaceStyle == .dark { + return .brown + } else { + return .blue + } + } } it("has a valid snapshot to all sizes") { @@ -35,6 +41,14 @@ final class DynamicSizeTests: QuickSpec { // expect(view).to(recordDynamicSizeSnapshot(sizes: sizes)) } + it("has a valid snapshot to all sizes in light and dark mode") { + expect(view).to(haveValidDynamicSizeSnapshot(sizes: sizes, userInterfaceStyle: .light)) + expect(view).to(haveValidDynamicSizeSnapshot(sizes: sizes, userInterfaceStyle: .dark)) +// expect(view).to(recordDynamicSizeSnapshot(sizes: sizes, userInterfaceStyle: .light)) +// expect(view).to(recordDynamicSizeSnapshot(sizes: sizes, userInterfaceStyle: .dark)) + } + + it("has a valid snapshot to all sizes with identifier") { // expect(view).to(recordDynamicSizeSnapshot(identifier: "bootstrap", sizes: sizes)) expect(view).to(haveValidDynamicSizeSnapshot(identifier: "bootstrap", sizes: sizes)) diff --git a/Bootstrap/BootstrapTests/DynamicTypeTests.swift b/Bootstrap/BootstrapTests/DynamicTypeTests.swift index 7d8e528..b001057 100644 --- a/Bootstrap/BootstrapTests/DynamicTypeTests.swift +++ b/Bootstrap/BootstrapTests/DynamicTypeTests.swift @@ -81,6 +81,26 @@ final class DynamicTypeTests: QuickSpec { identifier: "bootstrap")) } + it("has a valid snapshot with identifier in light and dark mode") { + // expect(view).to(recordDynamicTypeSnapshot(identifier: "bootstrap", userInterfaceStyle: .light)) + // expect(view).to(recordDynamicTypeSnapshot(identifier: "bootstrap", userInterfaceStyle: .dark)) + expect(view).to(haveValidDynamicTypeSnapshot(identifier: "bootstrap", userInterfaceStyle: .light)) + expect(view).to(haveValidDynamicTypeSnapshot(identifier: "bootstrap", userInterfaceStyle: .dark)) + +// expect(view).to(recordDynamicTypeSnapshot(named: "something custom with model and OS", +// identifier: "bootstrap", +// userInterfaceStyle: .light)) +// expect(view).to(recordDynamicTypeSnapshot(named: "something custom with model and OS", +// identifier: "bootstrap", +// userInterfaceStyle: .dark)) + expect(view).to(haveValidDynamicTypeSnapshot(named: "something custom with model and OS", + identifier: "bootstrap", + userInterfaceStyle: .light)) + expect(view).to(haveValidDynamicTypeSnapshot(named: "something custom with model and OS", + identifier: "bootstrap", + userInterfaceStyle: .dark)) + } + it("works with adjustsFontForContentSizeCategory") { let label = UILabel(frame: CGRect(x: 0, y: 0, width: 300, height: 100)) label.text = "Example" From 9f01fee09b26f0e378a3f8578953d6828034f48c Mon Sep 17 00:00:00 2001 From: Diego Chohfi Date: Fri, 31 Mar 2023 10:03:19 -0300 Subject: [PATCH 4/9] Add screenshots for light and dark variations --- ...me_context__has_a_valid_snapshot__dark@2x.png | Bin 0 -> 617 bytes ...e_context__has_a_valid_snapshot__light@2x.png | Bin 0 -> 585 bytes ...in_light_and_dark_mode__LargeSize_dark@2x.png | Bin 0 -> 2358 bytes ...n_light_and_dark_mode__LargeSize_light@2x.png | Bin 0 -> 2667 bytes ...n_light_and_dark_mode__MediumSize_dark@2x.png | Bin 0 -> 1142 bytes ..._light_and_dark_mode__MediumSize_light@2x.png | Bin 0 -> 1457 bytes ...in_light_and_dark_mode__SmallSize_dark@2x.png | Bin 0 -> 617 bytes ...n_light_and_dark_mode__SmallSize_light@2x.png | Bin 0 -> 585 bytes ...de__AccessibilityL_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...__AccessibilityL_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ...de__AccessibilityM_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...__AccessibilityM_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ...e__AccessibilityXL_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ..._AccessibilityXL_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ...__AccessibilityXXL_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...AccessibilityXXL_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ..._AccessibilityXXXL_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...ccessibilityXXXL_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ...t_and_dark_mode__L_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...and_dark_mode__L_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ...t_and_dark_mode__M_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...and_dark_mode__M_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ...t_and_dark_mode__S_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...and_dark_mode__S_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ..._and_dark_mode__XL_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...nd_dark_mode__XL_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ..._and_dark_mode__XS_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...nd_dark_mode__XS_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ...and_dark_mode__XXL_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...d_dark_mode__XXL_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ...nd_dark_mode__XXXL_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ..._dark_mode__XXXL_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ..._OS_AccessibilityL_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...S_AccessibilityL_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ..._OS_AccessibilityM_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...S_AccessibilityM_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ...OS_AccessibilityXL_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ..._AccessibilityXL_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ...S_AccessibilityXXL_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...AccessibilityXXL_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ..._AccessibilityXXXL_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...ccessibilityXXXL_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ...ith_model_and_OS_L_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...h_model_and_OS_L_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ...ith_model_and_OS_M_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...h_model_and_OS_M_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ...ith_model_and_OS_S_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...h_model_and_OS_S_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ...th_model_and_OS_XL_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ..._model_and_OS_XL_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ...th_model_and_OS_XS_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ..._model_and_OS_XS_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ...h_model_and_OS_XXL_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...model_and_OS_XXL_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes ..._model_and_OS_XXXL_dark_dark_bootstrap@2x.png | Bin 0 -> 2299 bytes ...odel_and_OS_XXXL_light_light_bootstrap@2x.png | Bin 0 -> 2777 bytes 56 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/BootstrapTests/in_some_context__has_a_valid_snapshot__dark@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/BootstrapTests/in_some_context__has_a_valid_snapshot__light@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicSizeTests/in_some_context__using_only_frame__has_a_valid_snapshot_to_all_sizes_in_light_and_dark_mode__LargeSize_dark@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicSizeTests/in_some_context__using_only_frame__has_a_valid_snapshot_to_all_sizes_in_light_and_dark_mode__LargeSize_light@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicSizeTests/in_some_context__using_only_frame__has_a_valid_snapshot_to_all_sizes_in_light_and_dark_mode__MediumSize_dark@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicSizeTests/in_some_context__using_only_frame__has_a_valid_snapshot_to_all_sizes_in_light_and_dark_mode__MediumSize_light@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicSizeTests/in_some_context__using_only_frame__has_a_valid_snapshot_to_all_sizes_in_light_and_dark_mode__SmallSize_dark@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicSizeTests/in_some_context__using_only_frame__has_a_valid_snapshot_to_all_sizes_in_light_and_dark_mode__SmallSize_light@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityL_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityL_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityM_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityM_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityXL_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityXL_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityXXL_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityXXL_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityXXXL_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityXXXL_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__L_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__L_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__M_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__M_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__S_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__S_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__XL_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__XL_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__XS_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__XS_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__XXL_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__XXL_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__XXXL_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__XXXL_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityL_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityL_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityM_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityM_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityXL_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityXL_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityXXL_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityXXL_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityXXXL_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityXXXL_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_L_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_L_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_M_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_M_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_S_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_S_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_XL_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_XL_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_XS_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_XS_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_XXL_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_XXL_light_light_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_XXXL_dark_dark_bootstrap@2x.png create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_XXXL_light_light_bootstrap@2x.png diff --git a/Bootstrap/BootstrapTests/ReferenceImages/BootstrapTests/in_some_context__has_a_valid_snapshot__dark@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/BootstrapTests/in_some_context__has_a_valid_snapshot__dark@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8488890b6a5bcc6da0a7f9159c06fbae3afb343 GIT binary patch literal 617 zcmeAS@N?(olHy`uVBq!ia0vp^5g^RL1|$oo8khhn#^NA%Cx&(BWL^R}6{!)PX}-P; zT0k}j0}G=R11m@g5Zf_I!`W_(8Vt-}aV7?a_DlvAs2V>Y4FVH@7^DY6GcRC-ss@TJ zV1lcTSip>6gS46Qe%J`4I14-?iy0WiR6&^0Gf3qFP*5h*#Xkf{11$st9U!Rz#2^}k zA2@jIDFM=JJY5_^Dj46~*vNapfQQ-f{gb(yf|vD9WQ~~F+MvDXz++F(xc8gw*B?)4 zyxshJGwY5y2@Q4_7oRgJ#J$`btY2Tv;smdW~cn80Xn8kT{dTc3bI`CWFL-o2G{o*o<$) zyMWD*kxI2-V794tFr0CaXPfJkV1@$855VB~|6ii}&3>S}SApF9c1XCIvCB{1qG-_r QpsN`?UHx3vIVCg!05{mOK>z>% literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/BootstrapTests/in_some_context__has_a_valid_snapshot__light@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/BootstrapTests/in_some_context__has_a_valid_snapshot__light@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..850a72f2b6d20527379ee1760714a18dc80e057a GIT binary patch literal 585 zcmeAS@N?(olHy`uVBq!ia0vp^5g^RL1|$oo8khhn#^NA%Cx&(BWL^R}6{!)PX}-P; zT0k}j0}G=R11m@g5Zf_I!`W_(8Vt-}aV7?a_DlvAs2V>Y4FVH@7^DY6GcRC-ss@TJ zV1lcTSip>6gS46Qe%J`4I14-?iy0WiR6&^0Gf3qFP*5h*#Xkf{11$st9U!Rz#2^}k zFQiTExdEi-c)B=-R4~4|zLEEUfdKQy`}LXW%%Opb4X$Dee%p%6-~XJ&)^NI!k!??H zi)O?@u5C>lm@F8d_dl0TIB+gOn?t)nxM0q~RG9+}+x0bAwIdG32|g8N0IEKt0atyz z-%XO;;K5sNuY+7+8^T>GSsNJh<&A;trnL%d82k==TpW0ek*DH!Q_zMc(Kn)jaf}HE vP9HzR&cN{hfBy83CxGsp1#;)xLFvk?_3o^ezQ30NUCH3->gTe~DWM4f8RVy? literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicSizeTests/in_some_context__using_only_frame__has_a_valid_snapshot_to_all_sizes_in_light_and_dark_mode__LargeSize_dark@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicSizeTests/in_some_context__using_only_frame__has_a_valid_snapshot_to_all_sizes_in_light_and_dark_mode__LargeSize_dark@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3352e88285cd1073bcfec8539d6712057f017b30 GIT binary patch literal 2358 zcmeAS@N?(olHy`uVBq!ia0y~yVB`Q{4mP03;%{01ffQqLkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLxt2|x_e1EHB0FhW%W z#TGEZR5NlcU`DV(+LGCqZ3j}E1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J@+wkkkNT z5DmmE?u<>mB0yT$)5S5Qg7M8YLtX|20TxG_hn)T^S}$zoTejfmBp);LZ?lenX6G^Z zU~Ew5ZXO|#@IX?4gZordiUKbOi%jR?t_?~oP6{kdjV1~L1uA^phnfU98U;AmE;TqD zm}sHH!3~sjQjqXqW@2=Iv_U}!B-xk%)!eiJBsr>iG{8m^$>7NtdcYFm|9`8vgF3+C tK>$=dyd5nZMziQ>79BiUbl_@DJ=K=|x?5K`+XD*;22WQ%mvv4FO#sE8Np1iD literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicSizeTests/in_some_context__using_only_frame__has_a_valid_snapshot_to_all_sizes_in_light_and_dark_mode__LargeSize_light@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicSizeTests/in_some_context__using_only_frame__has_a_valid_snapshot_to_all_sizes_in_light_and_dark_mode__LargeSize_light@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e7405fc56f94d72fb76237c8e25765a4500d4359 GIT binary patch literal 2667 zcmeAS@N?(olHy`uVBq!ia0y~yVB`Q{4mP03;%{01ffQqLkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLxt2|x_e1EHB0FhW%W z#TGEZR5NlcU`DV(+LGCqZ3j}E1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J@+wkkkNT z5DmmE5ADpkPXg(+o-U3d6^w7LZR9;*z{6tret*fP1NT{yCVGXkJbLo|-uItx8W`EO zF*XW#ut|6@TLxT-4XNHZ-J6Z&(AR{9Mw1E6-c!GO|wBcZ+Uy z?~O515Lm~~%(J9XCT7)=`mb6E3DN=_*P9vHE;;atl!{-Cd-HS>V`G7>M1lhElLtYn ze^-YyGT&}+*dfPbFoCUT!HV50z9s2T=iz91eUO1UQ-OWD*30<4ToO0nb~C%)b=@jn zy)(r@A%-99yd5E)|6he3IA8|1TjQ19s=YT(tHPakaH-d?@byd}KSAww2rLhLdo)f@ z67D>`&`bNPL=86Z!tL(b)t#mPt>`4&c?Byc{kyulp)nV3_h`^SV{SBPU@3Mq)j;z* zH8PaJ2Vfcc|Nk+i3E{wkYc;6gdOKQdjTT!cMoV;9MLSyA4Zd~&u-H<%TkpK0<|j9( OCFbes=d#Wzp$PzslkP$Q literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicSizeTests/in_some_context__using_only_frame__has_a_valid_snapshot_to_all_sizes_in_light_and_dark_mode__MediumSize_dark@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicSizeTests/in_some_context__using_only_frame__has_a_valid_snapshot_to_all_sizes_in_light_and_dark_mode__MediumSize_dark@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ebcb1c0dd5ec9f207d386cc8eb2f207011d68f2 GIT binary patch literal 1142 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-V}>sYs3RO!M_+ z&;qhK7+4sk7+66{fY^>v8qRiO)L>u+i!(7Wv}ZD~K-KsGX%LtI#2`Hont1^uR5eg+ z0TW#Hh6T(BHb@)Oh4t5g6lZ})WHAGSm?{V}dIqU{01C=vy7-5H)BrIEL;$e{lm@aH zpBGM3{R5;od%8G=R4~4|dXV#gfdI4P_b2l%OKBb=TCV|6x%x zX!P_rw2B$TSpD^+s(mA;PlC{-4X+r0j0ah@MJN4%x@WYgtQj?i$go+=S_h29|Np}m qew_x4z73%0dpjC=LnA2xBk#;#iw=n!%@=@?$l&Sf=d#Wzp$Pz##*DiF literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicSizeTests/in_some_context__using_only_frame__has_a_valid_snapshot_to_all_sizes_in_light_and_dark_mode__MediumSize_light@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicSizeTests/in_some_context__using_only_frame__has_a_valid_snapshot_to_all_sizes_in_light_and_dark_mode__MediumSize_light@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..90229fdb695761558dc54a79c4c0e254801ff0f9 GIT binary patch literal 1457 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-V}>sYs3RO!M_+ z&;qhK7+4sk7+66{fY^>v8qRiO)L>u+i!(7Wv}ZD~K-KsGX%LtI#2`Hont1^uR5eg+ z0TW#Hh6T(BHb@)Oh4t5g6lZ})WHAGSm?{V}dIqU{01C=vy7-5H)BrIEL;$e{lm@by zTKX8=?gHrmPZ!6K3dT2AHu5qU2pl?azy4(kr<8a2lG=p{HRbOs|1CJp(7cHMnBO9rBUp5^XmF{SJYY<|WQ`1VI_w2qz34AF0#etpjB zcMN9^WU^g)7_MEmJi7>@zv9`OS;bdn8ze!F`IB|@U5PIrMF06YvBm3lF+&^^zxKx5 zbtf4i`e$y=J{MXJbLz9>}bAX+J;s5`gpR`?oY0D3kw%(4WtkG-& fE;A^~^T3o9uw6zW&wj#JP;utz>gTe~DWM4fa!*#U literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicSizeTests/in_some_context__using_only_frame__has_a_valid_snapshot_to_all_sizes_in_light_and_dark_mode__SmallSize_dark@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicSizeTests/in_some_context__using_only_frame__has_a_valid_snapshot_to_all_sizes_in_light_and_dark_mode__SmallSize_dark@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8488890b6a5bcc6da0a7f9159c06fbae3afb343 GIT binary patch literal 617 zcmeAS@N?(olHy`uVBq!ia0vp^5g^RL1|$oo8khhn#^NA%Cx&(BWL^R}6{!)PX}-P; zT0k}j0}G=R11m@g5Zf_I!`W_(8Vt-}aV7?a_DlvAs2V>Y4FVH@7^DY6GcRC-ss@TJ zV1lcTSip>6gS46Qe%J`4I14-?iy0WiR6&^0Gf3qFP*5h*#Xkf{11$st9U!Rz#2^}k zA2@jIDFM=JJY5_^Dj46~*vNapfQQ-f{gb(yf|vD9WQ~~F+MvDXz++F(xc8gw*B?)4 zyxshJGwY5y2@Q4_7oRgJ#J$`btY2Tv;smdW~cn80Xn8kT{dTc3bI`CWFL-o2G{o*o<$) zyMWD*kxI2-V794tFr0CaXPfJkV1@$855VB~|6ii}&3>S}SApF9c1XCIvCB{1qG-_r QpsN`?UHx3vIVCg!05{mOK>z>% literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicSizeTests/in_some_context__using_only_frame__has_a_valid_snapshot_to_all_sizes_in_light_and_dark_mode__SmallSize_light@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicSizeTests/in_some_context__using_only_frame__has_a_valid_snapshot_to_all_sizes_in_light_and_dark_mode__SmallSize_light@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..850a72f2b6d20527379ee1760714a18dc80e057a GIT binary patch literal 585 zcmeAS@N?(olHy`uVBq!ia0vp^5g^RL1|$oo8khhn#^NA%Cx&(BWL^R}6{!)PX}-P; zT0k}j0}G=R11m@g5Zf_I!`W_(8Vt-}aV7?a_DlvAs2V>Y4FVH@7^DY6GcRC-ss@TJ zV1lcTSip>6gS46Qe%J`4I14-?iy0WiR6&^0Gf3qFP*5h*#Xkf{11$st9U!Rz#2^}k zFQiTExdEi-c)B=-R4~4|zLEEUfdKQy`}LXW%%Opb4X$Dee%p%6-~XJ&)^NI!k!??H zi)O?@u5C>lm@F8d_dl0TIB+gOn?t)nxM0q~RG9+}+x0bAwIdG32|g8N0IEKt0atyz z-%XO;;K5sNuY+7+8^T>GSsNJh<&A;trnL%d82k==TpW0ek*DH!Q_zMc(Kn)jaf}HE vP9HzR&cN{hfBy83CxGsp1#;)xLFvk?_3o^ezQ30NUCH3->gTe~DWM4f8RVy? literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityL_dark_dark_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityL_dark_dark_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..21c0f51ae4732ea8ddb66a3ab7ed61592c999fda GIT binary patch literal 2299 zcmX|D3pmr?8~@HWhSc10$+BF2LnQwzpwtkr}sRc^LfvE-uImIJm-DSb5f7E*hxt!O8@{MWskFV z133|dHbNBae-1D7f&__jv$FyiER`8>5EFRZp6Kih=zux`fI*Z2_@)a8bI6WAx-CQt zfd00N06=mG0Q=9!1>{Z10W_|9OKpy2u~zL^|}3uDuy%fM73!Bz_*}83h2_ zH8%mVcheAnMwJk2JON~I!`~tg_F5n|Sq=c88}~lr20`w!x3(n2KxS_zyNqMEB*kvn zl`61dI1=0DE7O=wHdu*V{OI)89bL8LdBa=JsV@RD=Xjdl?!LZz_!8!KCC~^o0EHk* z)of9_fZwg|Wo?6^j@4bzM!k;Id2S)>92p$^%K?MITq`siRNkqoIw2I+fBdq%+>q6N zEp09LK|BgU88clH2#}N`V>JuaSUL=)syfwlF*+KGT=zh~8yZR;+paj`z~R;&qXN|0 z)TSJ|eA^DnSZ7C4lIYCzbQXuhQLQ}ww^D&8gj&I5`i6#v>c@WT_&huNwp_uJ2N&r~ ztM&5sHt0dEhTd=g7`^-X(o&t?p~#|=l6)ye69$9f@XO51%n!3|>()1Hw(E*aYjlDCR`u_cU{`kJVdu=a|j*dQLGEuqF(b1TIfPno6FI>2wZ(*VOsom}^ zJ~uaazh5=4Le?`XDr&#yaAFBDD5xv3Oa=`c_otZMGB-Cbi~8h9KE~XLKxb9v=jWFj zjN#lT8P(O*nk_=15TD1#s4#(@JZ%ASdRQ(#=;+a0L8@;?41RKDd;%^a-vy`Or&uf(HOqJvgrZea&I9CbF_M(VZcA;d z>}C0Bfk5w4kE(ul?d@yV;7Y2hnfe1FTg}Y%j-zMi<~qTfdCFvVwzVZVIXjEHC%y>` zA(03y7OTvzP%6vC$qCUK_^h1I=TpOvVdNbHM|r%izCJh7m4~-#_Xr{Sm0Q!()5T+B zDL^LtZzDIGAR_T}V4&u$!f6hVmpP*iL%@olT6}~gY^6q2+U|#!$VoR5Sja?tY^>+| zGNV(%^XIOLs1LMby1?aA9*q=GWNH(xWnzP7s6Ch)aT+koql@mZ4q@rO+HC!})PbQP z1!yrmLI-JNWJGnNP5GlEiV~oBJYIOl)mA$bF0NG8GiPFGC>N-f(FUxtxc%1=d##r_ z(Id@REzFmhnM#tMzC}3trJp9TP`Aj~*qGZoZLU)&lgjSvlgTZBQxg&(qk9P`4(-iF zk7~&s!Z;nILr&C)o=PRQx$m1Hu12xLpc|;NqCL7-SVO*3%8=DX{t#yt>Ut&1OczKy^nan%r~Ujs7Kkr z{=AwcE6qle_jKfRWMrkeL&KSs<>Nt3B_+o&;oXhAxL0G9SH|r3 z(l`2|M1HkiQO;;-;o{=SWP?5vQ&Z=#u&^rb@bL6<7IP_vMAG=s6cHPHFx&2%!MWgI zJtmV$3=Mtrmc^o#muo(1Y6>+nHXbc@qO+gM%F3Qac`+w@8XFo^_FP_XTHlzQe8q04 ztFsOk7Jw)?p;yGDn3!0`#QZ!f z3EGQK5rlvVhYBC0P`-bgkXo}aGMXekZfd#?o+3f8C;he5T+yWWz~QSIabz-i@Vc~0 z*G?6cEfTB%M=kU}b&ZW;GuD>=RdqEGh?zC(pX@?APG_e*6(f$A{kgEPt46dZhvYKi z<(>d|S!$cid!GtHRmf;FQ1*Teod{b}#G_3n2786orj12KFs>`H->L zT|A{O2xJVmJAeFhobYKCw)ai;TvwY(|F*zIWkkz`j-C3f?(R<1F#8#)s4bb56Q@}1 zdH^lQFxSS=3JcSwdj|$4<|UrIft(@|UoD(Cal-p*|D~T%RT57Pn6(AuBWz5{^`NND{8KKvD*o12@Z`KdGe_U${S=iug`e&S#_{PdG6 zdl*b{GFs9hEhB@LmnW|-t|pH-hTao~Mb~wz^Of$~${gMj7!c4torA(s{VyNPY#se* zQ}3GP9g#eu#Jz3W|3t2i*{a<5VMbiSzx@#lgIH1T!b`YT4P&>iFBH;k|HTlxTqNt!h||M4T--WxCd$7`-bEt_}hq6zcjiUK)~+FiZV z>C%lhMb+_Fu?Kt8s`EnCzF@HmR|x82Y$fw1y;Unog;tEsXN`5ubl5$S{JuVSr6JioU_i zrDWN}W^0Q*AJQbOL`0$qe7D_exccFJVpdyWUwk9cfcD+P>7pAXiNA1*tz*Lu(xrsW>}p}{1?@o2iX7s literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityL_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityL_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityM_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityM_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityXL_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityXL_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityXXL_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityXXL_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityXXXL_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__AccessibilityXXXL_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__L_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__L_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 zcmX|D3pmr=AK%zmu5%~1(PT!EyJ*cwh0rpQYZOIZx7g4$nn)rdm*mpLC0=Fj6%7+1 zk=$x&7P&NKHTO&ZpZEVh?|Gij`Fzj!`JU&T=X<{AbIuJXhohoGyM;g?km&Ja)_8yu z0BFGkfPQU^I{*+k0)G?-s_s{s0|un?uE+gPoB*K#8wP@acY~liApkI7#s6#@Fbc%~ zkDm_&O1cPw{2Su{@J_o8U}w(%nZFqPZ#3X5=KC)?p_uU0c>y?pk1NI+#*0A zS&bclkK>VxfK%zBwWBk@z=HoY8K6f2*kNf92nsH#*RunGAa9RbTRM}#99KJ3l&5r5 z@76)M+8YhEQF~^ldWtkoi$7-yFOrK$Y?nKrhi%S|2W#mgeD~(qGjIA*?U@k)TYn<9 zm!tZl-^Fs5S`IJWCzO%rsd^JR8<^#es(q)aY{9QhQ*>xOib`<<~?7v zwwB(%uY8S%8~e!zb|Z&`q&qk`%q}ev$~-f@McMvbqMenaqj*U)LrPJx(!hsEBudN5 z?p=(DiFrRi|Kvf<(9lrU-McnkUS2Qr>g(zrm6xN?`}RFvSP1SU=N1$d%`6)l8w*_t z3JP*|bw%~n`j2&WCE3{6Aj4HuRVyApPV`ayTHDyD$#dM=+LH9*CS^Kw2L=V*=}xd; zt!Qbv4-yOJ$sm|arW289vbMe+ey^m9$@F*@>+gRZgTWX&Z-pT&4j(>6BAJ>zsIMnj zY27QYuKspqdV2a&etJ_POkOylVerkH8+UVZ)-YUQEMu8KAV}y_Zr&6w@(a48gGNg> z6crT(ncm?(gK5yn~<)z1a+%;N-7jFSxn6NglER^BK}XQCL$#L7LN3ANi3Cnv07I(q@u>u23N@ zv%bFmaT|YLWMrg=V^~;?K)O6^V1~od0TKFOW=2Lv9%8lT=H~7XHAy5A3jr=tJJ=@J zr9C{iv=m8eX!!OVe9%mR50a(rPrQ8Du!Pfd@$A`n9UUFhFAN4GU{Hukqv_+&MpKr* z_m-`!5N+-4r)%11^;{fcJ7HS+WG)lH%A*z5FJ3dM4D$crs{3g>GbrbCeyg4 z+FFA*`wzf@fr-?bfYZ^qZ;6JRb6_%y)*FiHV8EcU#rDxjB!< zmlDH*kT6vv45k|Cr7tHb*&bO#3wB0eH-M#1r{t$!)t*%PaM|;7DQOF<@jM0AX9(5w?Xh$5Dyi(k4gz-`rNSLMo&rLxpLGUBX{&B!o|m zxsKPI#3S=g%UYMh6okf68IQUx?nW1y{plb5Gx3A`CH70~)>ct#4skx}RqVUwnZk%4 zKhwwp^xO6IM)LCVu(`!W_)0r<3>oLsHWAo1*3wQOYt1qtqW3Z0Hc$HvC?(kKfC z`udq)E6}NFX?U`PghavE$cXH8=j+$uFJHVc@97vbHZ;Wg`8_-rP9&BE>s>!4P~{>E z15Qro`_V5mGc&BIDQoleloUQC*AwN<%?fNboBsOs^#)BJ{M}wr*xK4!e$%dvjg1e7 z9UUF3Z%MgopS^_Py0p6+++Y#$nuIu{TyWXw?8 zvuDq<+FJgQkPw)tD6~M0n$*msP%2aRUJeh(ZP68aGo|4J-XmAV#l@X+oF;(EyIomc z4u8HbgFwu?`f*>-Xqig{-u>+CBcE1RSFuNr3L@4IV=&eMABV}`N#H*U^}1$MuwW2f;b$Gs^8D)>^$-~>Z{M4zv*plUqrYElrt~1HzS5v{c$g4h zX@ubMcurrX1%GdEs{q#!(pplY*4Nh;TFM@w*rCO$5)+|-?1o;!&vG~rDJiLs=^pWv zsEi@An)_3x-Hg*&9od!{AHb8-(@;P^E+_%X&EgYp%xGvZrsw*3n+gEOi6f%pDc5o` zGasDndHZ(yQrDr+6BAyueed5(iiwGtVq^sb1j;8#J)IkRb{zbTg9EaceFFo9069mf zsaal7g~LH@ZEemuOc!cho#EojiX5jSyQHFG*XypXlEy~4p5EU07TO*})&h5)LJ8|w z$oj0#eV(Qr9u%a_TUoJ+j5K-{pq14bg9G-FJZRYb{JA6<*Z;#UWkXpzx1hj&qr11) z&n+|}V$Vy}W8Dw)yE(Qwzpwtkr}sRc^LfvE-uImIJm-DSb5f7E*hxt!O8@{MWskFV z133|dHbNBae-1D7f&__jv$FyiER`8>5EFRZp6Kih=zux`fI*Z2_@)a8bI6WAx-CQt zfd00N06=mG0Q=9!1>{Z10W_|9OKpy2u~zL^|}3uDuy%fM73!Bz_*}83h2_ zH8%mVcheAnMwJk2JON~I!`~tg_F5n|Sq=c88}~lr20`w!x3(n2KxS_zyNqMEB*kvn zl`61dI1=0DE7O=wHdu*V{OI)89bL8LdBa=JsV@RD=Xjdl?!LZz_!8!KCC~^o0EHk* z)of9_fZwg|Wo?6^j@4bzM!k;Id2S)>92p$^%K?MITq`siRNkqoIw2I+fBdq%+>q6N zEp09LK|BgU88clH2#}N`V>JuaSUL=)syfwlF*+KGT=zh~8yZR;+paj`z~R;&qXN|0 z)TSJ|eA^DnSZ7C4lIYCzbQXuhQLQ}ww^D&8gj&I5`i6#v>c@WT_&huNwp_uJ2N&r~ ztM&5sHt0dEhTd=g7`^-X(o&t?p~#|=l6)ye69$9f@XO51%n!3|>()1Hw(E*aYjlDCR`u_cU{`kJVdu=a|j*dQLGEuqF(b1TIfPno6FI>2wZ(*VOsom}^ zJ~uaazh5=4Le?`XDr&#yaAFBDD5xv3Oa=`c_otZMGB-Cbi~8h9KE~XLKxb9v=jWFj zjN#lT8P(O*nk_=15TD1#s4#(@JZ%ASdRQ(#=;+a0L8@;?41RKDd;%^a-vy`Or&uf(HOqJvgrZea&I9CbF_M(VZcA;d z>}C0Bfk5w4kE(ul?d@yV;7Y2hnfe1FTg}Y%j-zMi<~qTfdCFvVwzVZVIXjEHC%y>` zA(03y7OTvzP%6vC$qCUK_^h1I=TpOvVdNbHM|r%izCJh7m4~-#_Xr{Sm0Q!()5T+B zDL^LtZzDIGAR_T}V4&u$!f6hVmpP*iL%@olT6}~gY^6q2+U|#!$VoR5Sja?tY^>+| zGNV(%^XIOLs1LMby1?aA9*q=GWNH(xWnzP7s6Ch)aT+koql@mZ4q@rO+HC!})PbQP z1!yrmLI-JNWJGnNP5GlEiV~oBJYIOl)mA$bF0NG8GiPFGC>N-f(FUxtxc%1=d##r_ z(Id@REzFmhnM#tMzC}3trJp9TP`Aj~*qGZoZLU)&lgjSvlgTZBQxg&(qk9P`4(-iF zk7~&s!Z;nILr&C)o=PRQx$m1Hu12xLpc|;NqCL7-SVO*3%8=DX{t#yt>Ut&1OczKy^nan%r~Ujs7Kkr z{=AwcE6qle_jKfRWMrkeL&KSs<>Nt3B_+o&;oXhAxL0G9SH|r3 z(l`2|M1HkiQO;;-;o{=SWP?5vQ&Z=#u&^rb@bL6<7IP_vMAG=s6cHPHFx&2%!MWgI zJtmV$3=Mtrmc^o#muo(1Y6>+nHXbc@qO+gM%F3Qac`+w@8XFo^_FP_XTHlzQe8q04 ztFsOk7Jw)?p;yGDn3!0`#QZ!f z3EGQK5rlvVhYBC0P`-bgkXo}aGMXekZfd#?o+3f8C;he5T+yWWz~QSIabz-i@Vc~0 z*G?6cEfTB%M=kU}b&ZW;GuD>=RdqEGh?zC(pX@?APG_e*6(f$A{kgEPt46dZhvYKi z<(>d|S!$cid!GtHRmf;FQ1*Teod{b}#G_3n2786orj12KFs>`H->L zT|A{O2xJVmJAeFhobYKCw)ai;TvwY(|F*zIWkkz`j-C3f?(R<1F#8#)s4bb56Q@}1 zdH^lQFxSS=3JcSwdj|$4<|UrIft(@|UoD(Cal-p*|D~T%RT57Pn6(AuBWz5{^`NND{8KKvD*o12@Z`KdGe_U${S=iug`e&S#_{PdG6 zdl*b{GFs9hEhB@LmnW|-t|pH-hTao~Mb~wz^Of$~${gMj7!c4torA(s{VyNPY#se* zQ}3GP9g#eu#Jz3W|3t2i*{a<5VMbiSzx@#lgIH1T!b`YT4P&>iFBH;k|HTlxTqNt!h||M4T--WxCd$7`-bEt_}hq6zcjiUK)~+FiZV z>C%lhMb+_Fu?Kt8s`EnCzF@HmR|x82Y$fw1y;Unog;tEsXN`5ubl5$S{JuVSr6JioU_i zrDWN}W^0Q*AJQbOL`0$qe7D_exccFJVpdyWUwk9cfcD+P>7pAXiNA1*tz*Lu(xrsW>}p}{1?@o2iX7s literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__M_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__M_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__S_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__S_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__XL_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__XL_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__XS_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__XS_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__XXL_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__XXL_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__XXXL_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/in_some_context__has_a_valid_snapshot_with_identifier_in_light_and_dark_mode__XXXL_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityL_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityL_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityM_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityM_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityXL_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityXL_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 zcmX|D3pmr=AK%zmu5%~1(PT!EyJ*cwh0rpQYZOIZx7g4$nn)rdm*mpLC0=Fj6%7+1 zk=$x&7P&NKHTO&ZpZEVh?|Gij`Fzj!`JU&T=X<{AbIuJXhohoGyM;g?km&Ja)_8yu z0BFGkfPQU^I{*+k0)G?-s_s{s0|un?uE+gPoB*K#8wP@acY~liApkI7#s6#@Fbc%~ zkDm_&O1cPw{2Su{@J_o8U}w(%nZFqPZ#3X5=KC)?p_uU0c>y?pk1NI+#*0A zS&bclkK>VxfK%zBwWBk@z=HoY8K6f2*kNf92nsH#*RunGAa9RbTRM}#99KJ3l&5r5 z@76)M+8YhEQF~^ldWtkoi$7-yFOrK$Y?nKrhi%S|2W#mgeD~(qGjIA*?U@k)TYn<9 zm!tZl-^Fs5S`IJWCzO%rsd^JR8<^#es(q)aY{9QhQ*>xOib`<<~?7v zwwB(%uY8S%8~e!zb|Z&`q&qk`%q}ev$~-f@McMvbqMenaqj*U)LrPJx(!hsEBudN5 z?p=(DiFrRi|Kvf<(9lrU-McnkUS2Qr>g(zrm6xN?`}RFvSP1SU=N1$d%`6)l8w*_t z3JP*|bw%~n`j2&WCE3{6Aj4HuRVyApPV`ayTHDyD$#dM=+LH9*CS^Kw2L=V*=}xd; zt!Qbv4-yOJ$sm|arW289vbMe+ey^m9$@F*@>+gRZgTWX&Z-pT&4j(>6BAJ>zsIMnj zY27QYuKspqdV2a&etJ_POkOylVerkH8+UVZ)-YUQEMu8KAV}y_Zr&6w@(a48gGNg> z6crT(ncm?(gK5yn~<)z1a+%;N-7jFSxn6NglER^BK}XQCL$#L7LN3ANi3Cnv07I(q@u>u23N@ zv%bFmaT|YLWMrg=V^~;?K)O6^V1~od0TKFOW=2Lv9%8lT=H~7XHAy5A3jr=tJJ=@J zr9C{iv=m8eX!!OVe9%mR50a(rPrQ8Du!Pfd@$A`n9UUFhFAN4GU{Hukqv_+&MpKr* z_m-`!5N+-4r)%11^;{fcJ7HS+WG)lH%A*z5FJ3dM4D$crs{3g>GbrbCeyg4 z+FFA*`wzf@fr-?bfYZ^qZ;6JRb6_%y)*FiHV8EcU#rDxjB!< zmlDH*kT6vv45k|Cr7tHb*&bO#3wB0eH-M#1r{t$!)t*%PaM|;7DQOF<@jM0AX9(5w?Xh$5Dyi(k4gz-`rNSLMo&rLxpLGUBX{&B!o|m zxsKPI#3S=g%UYMh6okf68IQUx?nW1y{plb5Gx3A`CH70~)>ct#4skx}RqVUwnZk%4 zKhwwp^xO6IM)LCVu(`!W_)0r<3>oLsHWAo1*3wQOYt1qtqW3Z0Hc$HvC?(kKfC z`udq)E6}NFX?U`PghavE$cXH8=j+$uFJHVc@97vbHZ;Wg`8_-rP9&BE>s>!4P~{>E z15Qro`_V5mGc&BIDQoleloUQC*AwN<%?fNboBsOs^#)BJ{M}wr*xK4!e$%dvjg1e7 z9UUF3Z%MgopS^_Py0p6+++Y#$nuIu{TyWXw?8 zvuDq<+FJgQkPw)tD6~M0n$*msP%2aRUJeh(ZP68aGo|4J-XmAV#l@X+oF;(EyIomc z4u8HbgFwu?`f*>-Xqig{-u>+CBcE1RSFuNr3L@4IV=&eMABV}`N#H*U^}1$MuwW2f;b$Gs^8D)>^$-~>Z{M4zv*plUqrYElrt~1HzS5v{c$g4h zX@ubMcurrX1%GdEs{q#!(pplY*4Nh;TFM@w*rCO$5)+|-?1o;!&vG~rDJiLs=^pWv zsEi@An)_3x-Hg*&9od!{AHb8-(@;P^E+_%X&EgYp%xGvZrsw*3n+gEOi6f%pDc5o` zGasDndHZ(yQrDr+6BAyueed5(iiwGtVq^sb1j;8#J)IkRb{zbTg9EaceFFo9069mf zsaal7g~LH@ZEemuOc!cho#EojiX5jSyQHFG*XypXlEy~4p5EU07TO*})&h5)LJ8|w z$oj0#eV(Qr9u%a_TUoJ+j5K-{pq14bg9G-FJZRYb{JA6<*Z;#UWkXpzx1hj&qr11) z&n+|}V$Vy}W8Dw)yE(Qwzpwtkr}sRc^LfvE-uImIJm-DSb5f7E*hxt!O8@{MWskFV z133|dHbNBae-1D7f&__jv$FyiER`8>5EFRZp6Kih=zux`fI*Z2_@)a8bI6WAx-CQt zfd00N06=mG0Q=9!1>{Z10W_|9OKpy2u~zL^|}3uDuy%fM73!Bz_*}83h2_ zH8%mVcheAnMwJk2JON~I!`~tg_F5n|Sq=c88}~lr20`w!x3(n2KxS_zyNqMEB*kvn zl`61dI1=0DE7O=wHdu*V{OI)89bL8LdBa=JsV@RD=Xjdl?!LZz_!8!KCC~^o0EHk* z)of9_fZwg|Wo?6^j@4bzM!k;Id2S)>92p$^%K?MITq`siRNkqoIw2I+fBdq%+>q6N zEp09LK|BgU88clH2#}N`V>JuaSUL=)syfwlF*+KGT=zh~8yZR;+paj`z~R;&qXN|0 z)TSJ|eA^DnSZ7C4lIYCzbQXuhQLQ}ww^D&8gj&I5`i6#v>c@WT_&huNwp_uJ2N&r~ ztM&5sHt0dEhTd=g7`^-X(o&t?p~#|=l6)ye69$9f@XO51%n!3|>()1Hw(E*aYjlDCR`u_cU{`kJVdu=a|j*dQLGEuqF(b1TIfPno6FI>2wZ(*VOsom}^ zJ~uaazh5=4Le?`XDr&#yaAFBDD5xv3Oa=`c_otZMGB-Cbi~8h9KE~XLKxb9v=jWFj zjN#lT8P(O*nk_=15TD1#s4#(@JZ%ASdRQ(#=;+a0L8@;?41RKDd;%^a-vy`Or&uf(HOqJvgrZea&I9CbF_M(VZcA;d z>}C0Bfk5w4kE(ul?d@yV;7Y2hnfe1FTg}Y%j-zMi<~qTfdCFvVwzVZVIXjEHC%y>` zA(03y7OTvzP%6vC$qCUK_^h1I=TpOvVdNbHM|r%izCJh7m4~-#_Xr{Sm0Q!()5T+B zDL^LtZzDIGAR_T}V4&u$!f6hVmpP*iL%@olT6}~gY^6q2+U|#!$VoR5Sja?tY^>+| zGNV(%^XIOLs1LMby1?aA9*q=GWNH(xWnzP7s6Ch)aT+koql@mZ4q@rO+HC!})PbQP z1!yrmLI-JNWJGnNP5GlEiV~oBJYIOl)mA$bF0NG8GiPFGC>N-f(FUxtxc%1=d##r_ z(Id@REzFmhnM#tMzC}3trJp9TP`Aj~*qGZoZLU)&lgjSvlgTZBQxg&(qk9P`4(-iF zk7~&s!Z;nILr&C)o=PRQx$m1Hu12xLpc|;NqCL7-SVO*3%8=DX{t#yt>Ut&1OczKy^nan%r~Ujs7Kkr z{=AwcE6qle_jKfRWMrkeL&KSs<>Nt3B_+o&;oXhAxL0G9SH|r3 z(l`2|M1HkiQO;;-;o{=SWP?5vQ&Z=#u&^rb@bL6<7IP_vMAG=s6cHPHFx&2%!MWgI zJtmV$3=Mtrmc^o#muo(1Y6>+nHXbc@qO+gM%F3Qac`+w@8XFo^_FP_XTHlzQe8q04 ztFsOk7Jw)?p;yGDn3!0`#QZ!f z3EGQK5rlvVhYBC0P`-bgkXo}aGMXekZfd#?o+3f8C;he5T+yWWz~QSIabz-i@Vc~0 z*G?6cEfTB%M=kU}b&ZW;GuD>=RdqEGh?zC(pX@?APG_e*6(f$A{kgEPt46dZhvYKi z<(>d|S!$cid!GtHRmf;FQ1*Teod{b}#G_3n2786orj12KFs>`H->L zT|A{O2xJVmJAeFhobYKCw)ai;TvwY(|F*zIWkkz`j-C3f?(R<1F#8#)s4bb56Q@}1 zdH^lQFxSS=3JcSwdj|$4<|UrIft(@|UoD(Cal-p*|D~T%RT57Pn6(AuBWz5{^`NND{8KKvD*o12@Z`KdGe_U${S=iug`e&S#_{PdG6 zdl*b{GFs9hEhB@LmnW|-t|pH-hTao~Mb~wz^Of$~${gMj7!c4torA(s{VyNPY#se* zQ}3GP9g#eu#Jz3W|3t2i*{a<5VMbiSzx@#lgIH1T!b`YT4P&>iFBH;k|HTlxTqNt!h||M4T--WxCd$7`-bEt_}hq6zcjiUK)~+FiZV z>C%lhMb+_Fu?Kt8s`EnCzF@HmR|x82Y$fw1y;Unog;tEsXN`5ubl5$S{JuVSr6JioU_i zrDWN}W^0Q*AJQbOL`0$qe7D_exccFJVpdyWUwk9cfcD+P>7pAXiNA1*tz*Lu(xrsW>}p}{1?@o2iX7s literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityXXL_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityXXL_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityXXXL_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_AccessibilityXXXL_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_L_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_L_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_M_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_M_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_S_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_S_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_XL_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_XL_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_XS_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_XS_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_XXL_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_XXL_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_XXXL_light_light_bootstrap@2x.png b/Bootstrap/BootstrapTests/ReferenceImages/DynamicTypeTests/something_custom_with_model_and_OS_XXXL_light_light_bootstrap@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da93f81efd778afbb3ba40f5a106656c2320d8ec GIT binary patch literal 2777 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 Date: Fri, 31 Mar 2023 10:03:34 -0300 Subject: [PATCH 5/9] Bump version and add changlog --- Bootstrap/Podfile.lock | 8 ++--- .../Nimble-Snapshots.podspec.json | 4 +-- Bootstrap/Pods/Manifest.lock | 8 ++--- Bootstrap/Pods/Pods.xcodeproj/project.pbxproj | 4 +-- .../Nimble-Snapshots-Info.plist | 2 +- CHANGELOG.md | 4 +++ Nimble-Snapshots.podspec | 2 +- README.md | 29 +++++++++++++++++++ 8 files changed, 47 insertions(+), 14 deletions(-) diff --git a/Bootstrap/Podfile.lock b/Bootstrap/Podfile.lock index 7e416e0..0ec40ac 100644 --- a/Bootstrap/Podfile.lock +++ b/Bootstrap/Podfile.lock @@ -8,9 +8,9 @@ PODS: - iOSSnapshotTestCase/SwiftSupport (8.0.0): - iOSSnapshotTestCase/Core - Nimble (11.0.0) - - Nimble-Snapshots (9.4.0): - - Nimble-Snapshots/Core (= 9.4.0) - - Nimble-Snapshots/Core (9.4.0): + - Nimble-Snapshots (9.6.0): + - Nimble-Snapshots/Core (= 9.6.0) + - Nimble-Snapshots/Core (9.6.0): - iOSSnapshotTestCase (~> 8.0) - Nimble (~> 11.0) - Quick (6.0.0) @@ -35,7 +35,7 @@ SPEC CHECKSUMS: Forgeries: 64ced144ea8341d89a7eec9d1d7986f0f1366250 iOSSnapshotTestCase: a670511f9ee3829c2b9c23e6e68f315fd7b6790f Nimble: a854c12888a21d9e25a0413bb743ad76c37ef50c - Nimble-Snapshots: 9f29ff080d7aeceedd1c9b929cdb690e0a86439a + Nimble-Snapshots: 685ec7707c6055bce156341aa9d398a9d3e02f6f Quick: 4d5ab9e81f0a632cbf9bc4f3069b55e5eeb175df PODFILE CHECKSUM: cd5b709b72116303d001ccd6a46fecaf6ce2c21b diff --git a/Bootstrap/Pods/Local Podspecs/Nimble-Snapshots.podspec.json b/Bootstrap/Pods/Local Podspecs/Nimble-Snapshots.podspec.json index d0c8c7d..e0e01bc 100644 --- a/Bootstrap/Pods/Local Podspecs/Nimble-Snapshots.podspec.json +++ b/Bootstrap/Pods/Local Podspecs/Nimble-Snapshots.podspec.json @@ -1,6 +1,6 @@ { "name": "Nimble-Snapshots", - "version": "9.4.0", + "version": "9.6.0", "summary": "Nimble matchers for iOSSnapshotTestCase", "description": "Nimble matchers for iOSSnapshotTestCase. Highly derivative of [Expecta Matchers for iOSSnapshotTestCase](https://github.com/dblock/ios-snapshot-test-case-expecta).", "homepage": "https://github.com/ashfurrow/Nimble-Snapshots", @@ -22,7 +22,7 @@ }, "source": { "git": "https://github.com/ashfurrow/Nimble-Snapshots.git", - "tag": "9.4.0" + "tag": "9.6.0" }, "default_subspecs": "Core", "frameworks": [ diff --git a/Bootstrap/Pods/Manifest.lock b/Bootstrap/Pods/Manifest.lock index 7e416e0..0ec40ac 100644 --- a/Bootstrap/Pods/Manifest.lock +++ b/Bootstrap/Pods/Manifest.lock @@ -8,9 +8,9 @@ PODS: - iOSSnapshotTestCase/SwiftSupport (8.0.0): - iOSSnapshotTestCase/Core - Nimble (11.0.0) - - Nimble-Snapshots (9.4.0): - - Nimble-Snapshots/Core (= 9.4.0) - - Nimble-Snapshots/Core (9.4.0): + - Nimble-Snapshots (9.6.0): + - Nimble-Snapshots/Core (= 9.6.0) + - Nimble-Snapshots/Core (9.6.0): - iOSSnapshotTestCase (~> 8.0) - Nimble (~> 11.0) - Quick (6.0.0) @@ -35,7 +35,7 @@ SPEC CHECKSUMS: Forgeries: 64ced144ea8341d89a7eec9d1d7986f0f1366250 iOSSnapshotTestCase: a670511f9ee3829c2b9c23e6e68f315fd7b6790f Nimble: a854c12888a21d9e25a0413bb743ad76c37ef50c - Nimble-Snapshots: 9f29ff080d7aeceedd1c9b929cdb690e0a86439a + Nimble-Snapshots: 685ec7707c6055bce156341aa9d398a9d3e02f6f Quick: 4d5ab9e81f0a632cbf9bc4f3069b55e5eeb175df PODFILE CHECKSUM: cd5b709b72116303d001ccd6a46fecaf6ce2c21b diff --git a/Bootstrap/Pods/Pods.xcodeproj/project.pbxproj b/Bootstrap/Pods/Pods.xcodeproj/project.pbxproj index 8410e8a..dd03bf0 100644 --- a/Bootstrap/Pods/Pods.xcodeproj/project.pbxproj +++ b/Bootstrap/Pods/Pods.xcodeproj/project.pbxproj @@ -1186,8 +1186,8 @@ BFDFE7DC352907FC980B868725387E98 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1300; - LastUpgradeCheck = 1300; + LastSwiftUpdateCheck = 1240; + LastUpgradeCheck = 1240; }; buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 8.0"; diff --git a/Bootstrap/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-Info.plist b/Bootstrap/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-Info.plist index f9eb4b5..1485403 100644 --- a/Bootstrap/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-Info.plist +++ b/Bootstrap/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 9.4.0 + 9.6.0 CFBundleSignature ???? CFBundleVersion diff --git a/CHANGELOG.md b/CHANGELOG.md index 60af3a6..16e70eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ - Nothing yet! +## 9.6.0 + +- Add abitlity to test in light and dark mode + ## 9.5.1 - Fixes SPM definition. See #255 - @diogot diff --git a/Nimble-Snapshots.podspec b/Nimble-Snapshots.podspec index d686e42..21185f5 100644 --- a/Nimble-Snapshots.podspec +++ b/Nimble-Snapshots.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "Nimble-Snapshots" - s.version = "9.5.1" + s.version = "9.6.0" s.summary = "Nimble matchers for iOSSnapshotTestCase" s.description = <<-DESC Nimble matchers for iOSSnapshotTestCase. Highly derivative of [Expecta Matchers for iOSSnapshotTestCase](https://github.com/dblock/ios-snapshot-test-case-expecta). diff --git a/README.md b/README.md index dc6ef67..08b7fef 100644 --- a/README.md +++ b/README.md @@ -201,3 +201,32 @@ implement the `ViewResizer` protocol and resize yourself. The custom behavior can be used to record the views too. For more info on usage, check the [dynamic sizes tests](Bootstrap/BootstrapTests/DynamicSizeTests.swift). + + + +## Light and Dark mode + +Testing in light and dark mode is as easy as sending an extra argument, it also supports dynamic size +and dynamic type, having the convetion to append `light` or `dark` on the file name when looking for it +or saving the screenshot. + +```swift +expect(view) == snapshot("some custom name", userInterfaceStyle: .light) +expect(view) == snapshot("some custom name", userInterfaceStyle: .dark) + +// expect(view).to(recordDynamicTypeSnapshot(userInterfaceStyle: .light) +expect(view).to(haveValidDynamicTypeSnapshot(userInterfaceStyle: .light)) +// expect(view).to(recordDynamicTypeSnapshot(userInterfaceStyle: .dark) +expect(view).to(haveValidDynamicTypeSnapshot(userInterfaceStyle: .dark)) + + +let sizes = ["SmallSize": CGSize(width: 44, height: 44), +"MediumSize": CGSize(width: 88, height: 88), +"LargeSize": CGSize(width: 132, height: 132)] + +// expect(view).to(recordDynamicSizeSnapshot(sizes: sizes, userInterfaceStyle: .light)) +expect(view).to(haveValidDynamicSizeSnapshot(sizes: sizes, userInterfaceStyle: .light)) + +// expect(view).to(recordDynamicSizeSnapshot(sizes: sizes, userInterfaceStyle: .dark)) +expect(view).to(haveValidDynamicSizeSnapshot(sizes: sizes, userInterfaceStyle: .dark)) +``` \ No newline at end of file From fac3fbe4b4009017d0180f18041fd0faed3e1214 Mon Sep 17 00:00:00 2001 From: Diego Chohfi Date: Fri, 31 Mar 2023 12:52:27 -0300 Subject: [PATCH 6/9] Bump libs --- Gemfile.lock | 87 ++++++++++++++++++++-------------------------------- 1 file changed, 33 insertions(+), 54 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2e26972..37848de 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,16 +1,15 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.5) + CFPropertyList (3.0.6) rexml - activesupport (6.1.7.2) + activesupport (7.0.4.3) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) tzinfo (~> 2.0) - zeitwerk (~> 2.3) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) + addressable (2.8.1) + public_suffix (>= 2.0.2, < 6.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) @@ -20,15 +19,15 @@ GEM cork nap open4 (~> 1.3) - cocoapods (1.11.3) + cocoapods (1.12.0) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.11.3) + cocoapods-core (= 1.12.0) cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 1.4.0, < 2.0) + cocoapods-downloader (>= 1.6.0, < 2.0) cocoapods-plugins (>= 1.0.0, < 2.0) cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.4.0, < 2.0) + cocoapods-trunk (>= 1.6.0, < 2.0) cocoapods-try (>= 1.1.0, < 2.0) colored2 (~> 3.1) escape (~> 0.0.4) @@ -36,10 +35,10 @@ GEM gh_inspector (~> 1.0) molinillo (~> 0.8.0) nap (~> 1.0) - ruby-macho (>= 1.0, < 3.0) + ruby-macho (>= 2.3.0, < 3.0) xcodeproj (>= 1.21.0, < 2.0) - cocoapods-core (1.11.3) - activesupport (>= 5.0, < 7) + cocoapods-core (1.12.0) + activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) concurrent-ruby (~> 1.1) @@ -58,78 +57,59 @@ GEM netrc (~> 0.11) cocoapods-try (1.2.0) colored2 (3.1.2) - concurrent-ruby (1.2.0) + concurrent-ruby (1.2.2) cork (0.3.0) colored2 (~> 3.1) - danger (8.6.1) + danger (9.2.0) claide (~> 1.0) claide-plugins (>= 0.9.2) colored2 (~> 3.1) cork (~> 0.1) - faraday (>= 0.9.0, < 2.0) + faraday (>= 0.9.0, < 3.0) faraday-http-cache (~> 2.0) git (~> 1.7) kramdown (~> 2.3) kramdown-parser-gfm (~> 1.0) no_proxy_fix - octokit (~> 4.7) + octokit (~> 5.0) terminal-table (>= 1, < 4) - danger-swiftlint (0.30.2) + danger-swiftlint (0.32.0) danger rake (> 10) thor (~> 0.19) escape (0.0.4) - ethon (0.15.0) + ethon (0.16.0) ffi (>= 1.15.0) - faraday (1.10.0) - faraday-em_http (~> 1.0) - faraday-em_synchrony (~> 1.0) - faraday-excon (~> 1.1) - faraday-httpclient (~> 1.0) - faraday-multipart (~> 1.0) - faraday-net_http (~> 1.0) - faraday-net_http_persistent (~> 1.0) - faraday-patron (~> 1.0) - faraday-rack (~> 1.0) - faraday-retry (~> 1.0) + faraday (2.7.4) + faraday-net_http (>= 2.0, < 3.1) ruby2_keywords (>= 0.0.4) - faraday-em_http (1.0.0) - faraday-em_synchrony (1.0.0) - faraday-excon (1.1.0) - faraday-http-cache (2.2.0) + faraday-http-cache (2.4.1) faraday (>= 0.8) - faraday-httpclient (1.0.1) - faraday-multipart (1.0.3) - multipart-post (>= 1.2, < 3) - faraday-net_http (1.0.1) - faraday-net_http_persistent (1.2.0) - faraday-patron (1.0.0) - faraday-rack (1.0.0) - faraday-retry (1.0.3) + faraday-net_http (3.0.2) ffi (1.15.5) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) - git (1.11.0) + git (1.18.0) + addressable (~> 2.8) rchardet (~> 1.8) httpclient (2.8.3) i18n (1.12.0) concurrent-ruby (~> 1.0) - json (2.6.1) + json (2.6.3) kramdown (2.4.0) rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) - minitest (5.17.0) + minitest (5.18.0) molinillo (0.8.0) - multipart-post (2.1.1) nanaimo (0.3.0) nap (1.1.0) netrc (0.11.0) no_proxy_fix (0.1.2) - octokit (4.22.0) - faraday (>= 0.9) - sawyer (~> 0.8.0, >= 0.5.3) + octokit (5.6.1) + faraday (>= 1, < 3) + sawyer (~> 0.9) open4 (1.3.4) public_suffix (4.0.7) rake (13.0.6) @@ -138,9 +118,9 @@ GEM rouge (2.0.7) ruby-macho (2.5.1) ruby2_keywords (0.0.5) - sawyer (0.8.2) + sawyer (0.9.2) addressable (>= 2.3.5) - faraday (> 0.8, < 2.0) + faraday (>= 0.17.3, < 3) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) thor (0.20.3) @@ -148,8 +128,8 @@ GEM ethon (>= 0.9.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - unicode-display_width (2.1.0) - xcodeproj (1.21.0) + unicode-display_width (2.4.2) + xcodeproj (1.22.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) @@ -158,7 +138,6 @@ GEM rexml (~> 3.2.4) xcpretty (0.3.0) rouge (~> 2.0.7) - zeitwerk (2.6.6) PLATFORMS ruby @@ -171,4 +150,4 @@ DEPENDENCIES xcpretty BUNDLED WITH - 2.2.16 + 2.4.6 From 61dd0c6cba7814456628b78fed6305edb574299f Mon Sep 17 00:00:00 2001 From: Diego Chohfi Date: Fri, 31 Mar 2023 12:53:10 -0300 Subject: [PATCH 7/9] Missing empty line --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ac86833..228e74e 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,4 @@ build .swiftpm .DS_Store -.build/ \ No newline at end of file +.build/ From 3fb008d52fbaf39d578e7b1e683bd207c597b983 Mon Sep 17 00:00:00 2001 From: Diego Chohfi Date: Fri, 31 Mar 2023 13:01:56 -0300 Subject: [PATCH 8/9] Tries to fix custom folder tests --- Bootstrap/Bootstrap.xcodeproj/project.pbxproj | 2 ++ .../BootstrapCustomFolderTests.swift | 21 ++++++++++++++----- .../ReferenceImages/CustomFolder/.gitkeep | 0 3 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 Bootstrap/BootstrapTests/ReferenceImages/CustomFolder/.gitkeep diff --git a/Bootstrap/Bootstrap.xcodeproj/project.pbxproj b/Bootstrap/Bootstrap.xcodeproj/project.pbxproj index 65b0d54..de71617 100644 --- a/Bootstrap/Bootstrap.xcodeproj/project.pbxproj +++ b/Bootstrap/Bootstrap.xcodeproj/project.pbxproj @@ -19,6 +19,7 @@ 5EFDC7711F8699AA001453EC /* DynamicSizeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EFDC76E1F8699AA001453EC /* DynamicSizeTests.swift */; }; 5EFDC7721F8699AA001453EC /* DynamicTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EFDC76F1F8699AA001453EC /* DynamicTypeTests.swift */; }; 69BE287EA35A14E2787AC4AF /* Pods_Bootstrap_BootstrapTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CF2E7C50C1B84B73173ED6F7 /* Pods_Bootstrap_BootstrapTests.framework */; }; + C31D2DD929D73AFE002BD84C /* BootstrapCustomFolderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EFDC7761F8699F9001453EC /* BootstrapCustomFolderTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -358,6 +359,7 @@ files = ( 5EFDC7701F8699AA001453EC /* WithoutQuickTests.swift in Sources */, 5EFDC7711F8699AA001453EC /* DynamicSizeTests.swift in Sources */, + C31D2DD929D73AFE002BD84C /* BootstrapCustomFolderTests.swift in Sources */, 5EFDC7611F8698B4001453EC /* BootstrapTests.swift in Sources */, 5EFDC7721F8699AA001453EC /* DynamicTypeTests.swift in Sources */, ); diff --git a/Bootstrap/BootstrapTests/ACustomFolder/BootstrapCustomFolderTests.swift b/Bootstrap/BootstrapTests/ACustomFolder/BootstrapCustomFolderTests.swift index 0fc958b..000a702 100644 --- a/Bootstrap/BootstrapTests/ACustomFolder/BootstrapCustomFolderTests.swift +++ b/Bootstrap/BootstrapTests/ACustomFolder/BootstrapCustomFolderTests.swift @@ -12,20 +12,31 @@ final class BootstrapCustomFormatTests: QuickSpec { beforeEach { setNimbleTestFolder("CustomFolder") view = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 44, height: 44))) - view.backgroundColor = .blue + view.backgroundColor = UIColor { traits -> UIColor in + if traits.userInterfaceStyle == .dark { + return .brown + } else { + return .blue + } + } } it("fails to find the snapshots due to the custom folder") { - expect(view).notTo(haveValidSnapshot(named: "something custom", userInterfaceStyle: .dark)) - expect(view).notTo(haveValidSnapshot(named: "something custom", userInterfaceStyle: .light)) + expect(view).notTo(haveValidSnapshot(named: "something custom")) + expect(view).notTo(haveValidSnapshot(named: "something custom")) } it("finds the snapshots using a custom images directory") { - expect(view).to(haveValidSnapshot()) + expect(view).to(recordSnapshot()) } it("finds device agnostic snapshots with custom images directory") { - expect(view).to(haveValidDeviceAgnosticSnapshot()) + expect(view).to(recordDeviceAgnosticSnapshot()) + } + + it("find the snapshot using a custom image directory for light and dark mode") { + expect(view).to(recordSnapshot(userInterfaceStyle: .light)) + expect(view).to(recordSnapshot(userInterfaceStyle: .dark)) } } } diff --git a/Bootstrap/BootstrapTests/ReferenceImages/CustomFolder/.gitkeep b/Bootstrap/BootstrapTests/ReferenceImages/CustomFolder/.gitkeep new file mode 100644 index 0000000..e69de29 From 585d83514e3db624fb2290f03690ac49d0e3a3bf Mon Sep 17 00:00:00 2001 From: Diego Chohfi Date: Mon, 3 Apr 2023 12:15:59 -0300 Subject: [PATCH 9/9] Add missing import --- Nimble_Snapshots/PrettySyntax.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Nimble_Snapshots/PrettySyntax.swift b/Nimble_Snapshots/PrettySyntax.swift index 086f143..7559bf1 100644 --- a/Nimble_Snapshots/PrettySyntax.swift +++ b/Nimble_Snapshots/PrettySyntax.swift @@ -1,4 +1,5 @@ import Nimble +import UIKit // MARK: - Nicer syntax using == operator