From b4ff9e1add0b7c0407b100264c6c4de8f811c24f Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Fri, 23 Jun 2023 14:07:40 +0200 Subject: [PATCH 01/16] Update testing dependencies --- ADUtils.xcodeproj/project.pbxproj | 85 ++++++-- .../xcshareddata/swiftpm/Package.resolved | 14 ++ ADUtilsTests/ArrayFilterTests.swift | 2 +- ADUtilsTests/AttributedStringTest.swift | 6 +- ADUtilsTests/ChildInsertionTest.swift | 2 +- ADUtilsTests/DebouncedTests.swift | 8 +- ADUtilsTests/DeselectableViewTests.swift | 2 +- ADUtilsTests/DynamicFontTest.swift | 6 +- ADUtilsTests/FailableDecodableTests.swift | 2 +- ADUtilsTests/GeometryUtilitiesTest.swift | 2 +- .../LayoutGuideConstraintsTests.swift | 200 +++++++++--------- ADUtilsTests/LayoutTests/ViewLayoutTest.swift | 2 +- .../LocaleUserPreferredTimeFormatTests.swift | 2 +- ADUtilsTests/MKMapViewDequeuingTest.swift | 2 +- .../NSDirectionalEdgeInsetsTests.swift | 2 +- .../NSLayoutConstraintUtilsTests.swift | 2 +- .../NavigationControllerObserverTest.swift | 2 +- ...vigationControllerPopCompletionTests.swift | 2 +- ADUtilsTests/NibLoaderTest.swift | 2 +- ADUtilsTests/OptionalGetTests.swift | 2 +- ADUtilsTests/OptionalStringIsBlankTests.swift | 2 +- ADUtilsTests/OptionalUnwrapTest.swift | 2 +- ADUtilsTests/OptionalVerifyOrNilTests.swift | 2 +- ADUtilsTests/PropertyListArchiverTest.swift | 2 +- ADUtilsTests/RegisterableViewTest.swift | 2 +- ...PostInstallationKeychainCleanerTests.swift | 2 +- .../Security/SecureArchiverTests.swift | 2 +- ADUtilsTests/SequenceGroupedByTests.swift | 2 +- ADUtilsTests/StackViewBuilderTests.swift | 12 +- ADUtilsTests/StackViewUtilsTests.swift | 2 +- ADUtilsTests/StringLocalizationTests.swift | 2 +- ADUtilsTests/SynchronizeTests.swift | 2 +- .../UIButtonBackgroundColorTests.swift | 10 +- ADUtilsTests/UIEdgeInsetsTest.swift | 2 +- ADUtilsTests/UIImageColorTests.swift | 8 +- .../UINavigationItemBackItemTests.swift | 2 +- .../UIScreenPixelDimensionTests.swift | 2 +- .../UITableViewDefaultFooterCellsTests.swift | 2 +- ...TableViewHeaderFooterViewLayoutTests.swift | 2 +- .../ViewInsertionWithMarginTest.swift | 172 +++++++-------- Podfile | 9 +- Podfile.lock | 35 +-- 42 files changed, 337 insertions(+), 288 deletions(-) create mode 100644 ADUtils.xcworkspace/xcshareddata/swiftpm/Package.resolved diff --git a/ADUtils.xcodeproj/project.pbxproj b/ADUtils.xcodeproj/project.pbxproj index c83254d..56da6fd 100644 --- a/ADUtils.xcodeproj/project.pbxproj +++ b/ADUtils.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ @@ -51,6 +51,7 @@ 921907DF21F7AE4400EF2B67 /* ADLayoutGuideTestsObjc.m in Sources */ = {isa = PBXBuildFile; fileRef = 921907DE21F7AE4400EF2B67 /* ADLayoutGuideTestsObjc.m */; }; 92DA1F5F2257556800060A32 /* NSLayoutConstraintUtilsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92DA1F5E2257556800060A32 /* NSLayoutConstraintUtilsTests.swift */; }; 92FAEA942271DF0D0090A2C7 /* FailableDecodableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92FAEA932271DF0D0090A2C7 /* FailableDecodableTests.swift */; }; + ACD166862A45C0A700374A7E /* SnapshotTesting in Frameworks */ = {isa = PBXBuildFile; productRef = ACD166852A45C0A700374A7E /* SnapshotTesting */; }; B0E1495F269444E600712620 /* SecureArchiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0E1495E269444E600712620 /* SecureArchiverTests.swift */; }; E7D5F497242DED3C0048C0DC /* OptionalGetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7D5F496242DED3C0048C0DC /* OptionalGetTests.swift */; }; E7D5F499242DEF120048C0DC /* UINavigationItemBackItemTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7D5F498242DEF120048C0DC /* UINavigationItemBackItemTests.swift */; }; @@ -173,6 +174,7 @@ buildActionMask = 2147483647; files = ( 47E17214F9A4009CF12359D7 /* Pods_ADUtilsTests.framework in Frameworks */, + ACD166862A45C0A700374A7E /* SnapshotTesting in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -414,6 +416,9 @@ 49B1F7841CE4B3DB00A29BFE /* PBXTargetDependency */, ); name = ADUtilsTests; + packageProductDependencies = ( + ACD166852A45C0A700374A7E /* SnapshotTesting */, + ); productName = ADUtilsTests; productReference = 49B1F77E1CE4B3DB00A29BFE /* ADUtilsTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; @@ -473,6 +478,9 @@ en, ); mainGroup = 7A0EC6441535D8ED00E5F54A; + packageReferences = ( + ACD166842A45C0A700374A7E /* XCRemoteSwiftPackageReference "swift-snapshot-testing" */, + ); productRefGroup = 7A0EC6501535D8ED00E5F54A /* Products */; projectDirPath = ""; projectRoot = ""; @@ -580,19 +588,15 @@ "${PODS_ROOT}/Target Support Files/Pods-ADUtilsTests/Pods-ADUtilsTests-frameworks.sh", "${BUILT_PRODUCTS_DIR}/ADUtils/ADUtils.framework", "${BUILT_PRODUCTS_DIR}/Nimble/Nimble.framework", - "${BUILT_PRODUCTS_DIR}/Nimble-Snapshots/Nimble_Snapshots.framework", "${BUILT_PRODUCTS_DIR}/OCMock/OCMock.framework", "${BUILT_PRODUCTS_DIR}/Quick/Quick.framework", - "${BUILT_PRODUCTS_DIR}/iOSSnapshotTestCase/FBSnapshotTestCase.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ADUtils.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Nimble.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Nimble_Snapshots.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OCMock.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Quick.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBSnapshotTestCase.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -743,7 +747,11 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = ADUtilsTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = applidium.ADUtilsTests; @@ -774,7 +782,11 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = ADUtilsTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MTL_ENABLE_DEBUG_INFO = NO; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = applidium.ADUtilsTests; @@ -805,7 +817,11 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = ADUtilsTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MTL_ENABLE_DEBUG_INFO = NO; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = applidium.ADUtilsTests; @@ -836,7 +852,11 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = ADUtilsTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MTL_ENABLE_DEBUG_INFO = NO; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = applidium.ADUtilsTests; @@ -891,7 +911,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; PROVISIONING_PROFILE_SPECIFIER = "$(PROFILE_UDID)"; SDKROOT = iphoneos; SWIFT_VERSION = 5.0; @@ -912,7 +932,10 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "ADUtils-Prefix.pch"; INFOPLIST_FILE = "Configuration/ADUtils/ADUtils-Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.applidium.ADUtils; PRODUCT_MODULE_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -963,7 +986,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; PROVISIONING_PROFILE_SPECIFIER = "$(PROFILE_UDID)"; SDKROOT = iphoneos; @@ -986,7 +1009,10 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "ADUtils-Prefix.pch"; INFOPLIST_FILE = "Configuration/ADUtils/ADUtils-Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.applidium.ADUtils; PRODUCT_MODULE_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1039,7 +1065,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; PROVISIONING_PROFILE_SPECIFIER = "$(PROFILE_UDID)"; SDKROOT = iphoneos; SWIFT_VERSION = 5.0; @@ -1060,7 +1086,10 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "ADUtils-Prefix.pch"; INFOPLIST_FILE = "Configuration/ADUtils/ADUtils-Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.applidium.ADUtils; PRODUCT_MODULE_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1114,7 +1143,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; PROVISIONING_PROFILE_SPECIFIER = "$(PROFILE_UDID)"; SDKROOT = iphoneos; SWIFT_VERSION = 5.0; @@ -1135,7 +1164,10 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "ADUtils-Prefix.pch"; INFOPLIST_FILE = "Configuration/ADUtils/ADUtils-Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.applidium.ADUtils; PRODUCT_MODULE_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1183,6 +1215,25 @@ defaultConfigurationName = Distribution; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + ACD166842A45C0A700374A7E /* XCRemoteSwiftPackageReference "swift-snapshot-testing" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/pointfreeco/swift-snapshot-testing.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.0.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + ACD166852A45C0A700374A7E /* SnapshotTesting */ = { + isa = XCSwiftPackageProductDependency; + package = ACD166842A45C0A700374A7E /* XCRemoteSwiftPackageReference "swift-snapshot-testing" */; + productName = SnapshotTesting; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 7A0EC6461535D8ED00E5F54A /* Project object */; } diff --git a/ADUtils.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ADUtils.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..0e946a1 --- /dev/null +++ b/ADUtils.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,14 @@ +{ + "pins" : [ + { + "identity" : "swift-snapshot-testing", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-snapshot-testing.git", + "state" : { + "revision" : "cef5b3f6f11781dd4591bdd1dd0a3d22bd609334", + "version" : "1.11.0" + } + } + ], + "version" : 2 +} diff --git a/ADUtilsTests/ArrayFilterTests.swift b/ADUtilsTests/ArrayFilterTests.swift index 7b8a753..3e58143 100644 --- a/ADUtilsTests/ArrayFilterTests.swift +++ b/ADUtilsTests/ArrayFilterTests.swift @@ -17,7 +17,7 @@ private struct Vendor { class ArrayFilterTests: QuickSpec { - override func spec() { + override class func spec() { it("should filter the array") { let vendors = [ diff --git a/ADUtilsTests/AttributedStringTest.swift b/ADUtilsTests/AttributedStringTest.swift index a39bd03..cca0a90 100644 --- a/ADUtilsTests/AttributedStringTest.swift +++ b/ADUtilsTests/AttributedStringTest.swift @@ -8,14 +8,14 @@ import Foundation import Nimble -import Nimble_Snapshots +import SnapshotTesting import Quick import ADUtils @testable import ADUtilsApp class AttributedStringTest: QuickSpec { - override func spec() { + override class func spec() { let stringTest = { (string: String, arguments: [String], imageName: String) -> Void in guard @@ -50,7 +50,7 @@ class AttributedStringTest: QuickSpec { let label = UILabel() label.attributedText = attributedString label.sizeToFit() - expect(label).to(haveValidSnapshot(named: imageName)) + assertSnapshot(matching: label, as: .image, named: imageName) } it("Snapshots should match") { diff --git a/ADUtilsTests/ChildInsertionTest.swift b/ADUtilsTests/ChildInsertionTest.swift index ae2782f..e0e5771 100644 --- a/ADUtilsTests/ChildInsertionTest.swift +++ b/ADUtilsTests/ChildInsertionTest.swift @@ -14,7 +14,7 @@ import ADUtils class ChildInsertionTest: QuickSpec { - override func spec() { + override class func spec() { it("should insert a view controller in a subview") { let viewController = UIViewController() let child = UIViewController() diff --git a/ADUtilsTests/DebouncedTests.swift b/ADUtilsTests/DebouncedTests.swift index 8612ad7..3b16497 100644 --- a/ADUtilsTests/DebouncedTests.swift +++ b/ADUtilsTests/DebouncedTests.swift @@ -18,7 +18,7 @@ private enum Constants { /// Test for regular Debouncer class class DebouncerTests: QuickSpec { - override func spec() { + override class func spec() { var debouncer: Debouncer? var counter: Int = 0 @@ -85,10 +85,10 @@ class DebouncerTests: QuickSpec { class DebouncedTests: QuickSpec { @Debounced(delay: Constants.delay, queue: .main) - private var toggleAction: () -> Void - private var actionExecuted: Bool = false + private static var toggleAction: () -> Void + private static var actionExecuted: Bool = false - override func spec() { + override class func spec() { beforeEach { self.actionExecuted = false diff --git a/ADUtilsTests/DeselectableViewTests.swift b/ADUtilsTests/DeselectableViewTests.swift index 986e922..51a325a 100644 --- a/ADUtilsTests/DeselectableViewTests.swift +++ b/ADUtilsTests/DeselectableViewTests.swift @@ -67,7 +67,7 @@ private class TransitionCoordinator: NSObject, UIViewControllerTransitionCoordin class DeselectableViewTests: QuickSpec { - override func spec() { + override class func spec() { let selectedIndexPath = IndexPath(row: 0, section: 0) var transitionCoordinator: TransitionCoordinator! diff --git a/ADUtilsTests/DynamicFontTest.swift b/ADUtilsTests/DynamicFontTest.swift index 4fd83a1..a4f6140 100644 --- a/ADUtilsTests/DynamicFontTest.swift +++ b/ADUtilsTests/DynamicFontTest.swift @@ -9,7 +9,7 @@ import Foundation import Quick import ADUtils import Nimble -import Nimble_Snapshots +import SnapshotTesting private extension UIFont { @@ -34,7 +34,7 @@ private class FontHelper { class DynamicFontTest: QuickSpec { - override func spec() { + override class func spec() { describe("display fonts") { @@ -68,7 +68,7 @@ class DynamicFontTest: QuickSpec { it("should layout labels properly") { stackView.layoutIfNeeded() - expect(stackView).to(haveValidSnapshot(named: "DynamicFontLayoutTest")) + assertSnapshot(matching: stackView, as: .image, named: "DynamicFontLayoutTest") } } } diff --git a/ADUtilsTests/FailableDecodableTests.swift b/ADUtilsTests/FailableDecodableTests.swift index 8231cae..da9058f 100644 --- a/ADUtilsTests/FailableDecodableTests.swift +++ b/ADUtilsTests/FailableDecodableTests.swift @@ -47,7 +47,7 @@ private struct StrictFolder: Codable { class KeyedDecodingContainerTests: QuickSpec { - override func spec() { + override class func spec() { // Slack, Candidates and My-CV are valids, other are invalids let desktopJSON = """ { diff --git a/ADUtilsTests/GeometryUtilitiesTest.swift b/ADUtilsTests/GeometryUtilitiesTest.swift index b7e510b..12f0c45 100644 --- a/ADUtilsTests/GeometryUtilitiesTest.swift +++ b/ADUtilsTests/GeometryUtilitiesTest.swift @@ -11,7 +11,7 @@ import Nimble import ADUtils class GeometryUtilitiesTest : QuickSpec { - override func spec() { + override class func spec() { it("should update the origin of rectangle") { var rect = CGRect(x: 20, y: 20, width: 40, height: 60) rect.center = CGPoint(x: 0, y: 0) diff --git a/ADUtilsTests/LayoutGuideConstraintsTests.swift b/ADUtilsTests/LayoutGuideConstraintsTests.swift index ccfd6fe..e0f4f80 100644 --- a/ADUtilsTests/LayoutGuideConstraintsTests.swift +++ b/ADUtilsTests/LayoutGuideConstraintsTests.swift @@ -7,13 +7,13 @@ import Foundation import Nimble -import Nimble_Snapshots +import SnapshotTesting import Quick import ADUtils class LayoutGuideConstraintsTests: QuickSpec { - override func spec() { + override class func spec() { standardEdgesSpec() if #available(iOS 13, *) { directionalEdgesSpec() @@ -22,7 +22,7 @@ class LayoutGuideConstraintsTests: QuickSpec { // MARK: - Private - private func standardEdgesSpec() { + private static func standardEdgesSpec() { describe("Pin to layout guide using UIRectEdge and UIEdgeInsets") { let insets = UIEdgeInsets(top: 12.0, left: 13.0, bottom: 20.0, right: 45.0) @@ -40,28 +40,28 @@ class LayoutGuideConstraintsTests: QuickSpec { it("should pin all edges no insets") { subview.ad_pin(to: view.layoutMarginsGuide) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideAllEdgesNoInsets")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideAllEdgesNoInsets") } it("should pin all edges with insets") { subview.ad_pin(to: view.layoutMarginsGuide, insets: insets) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideAllEdgesWithInsets")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideAllEdgesWithInsets") } it("should pin top left edges no insets") { subview.ad_pin(to: view.layoutMarginsGuide, edges: [.top, .left]) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideTopLeftEdgesNoInsets")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideTopLeftEdgesNoInsets") } it("should pin top left edges with insets") { subview.ad_pin(to: view.layoutMarginsGuide, edges: [.top, .left], insets: insets) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideTopLeftEdgesWithInsets")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideTopLeftEdgesWithInsets") } it("should have no effet with wrong layout guide") { let extraView = UIView() subview.ad_pin(to: extraView.layoutMarginsGuide) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideNoSubview")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideNoSubview") } it("should pin top left with high priorities") { @@ -79,7 +79,7 @@ class LayoutGuideConstraintsTests: QuickSpec { insets: insets, priority: .defaultHigh ) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideTopLeftEdgesHighPriority")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideTopLeftEdgesHighPriority") } } @@ -100,19 +100,19 @@ class LayoutGuideConstraintsTests: QuickSpec { subview.ad_center(in: view.layoutMarginsGuide) // ???: (Pierre Felgines) 08/10/2018 Intrinsic content size is not enough here subview.ad_constrain(to: subview.intrinsicContentSize) - expect(view).to(haveValidSnapshot(named: "CenterInLayoutGuide")) + assertSnapshot(matching: view, as: .image, named: "CenterInLayoutGuide") } it("should center X in layout guide") { subview.ad_pin(to: view.layoutMarginsGuide, edges: [.top, .bottom]) subview.ad_center(in: view.layoutMarginsGuide, along: .horizontal) - expect(view).to(haveValidSnapshot(named: "CenterXInLayoutGuide")) + assertSnapshot(matching: view, as: .image, named: "CenterXInLayoutGuide") } it("should center Y in layout guide") { subview.ad_pin(to: view.layoutMarginsGuide, edges: [.left, .right]) subview.ad_center(in: view.layoutMarginsGuide, along: .vertical) - expect(view).to(haveValidSnapshot(named: "CenterYInLayoutGuide")) + assertSnapshot(matching: view, as: .image, named: "CenterYInLayoutGuide") } } @@ -133,31 +133,31 @@ class LayoutGuideConstraintsTests: QuickSpec { it("should constrain in layout guide pin bottom left") { subview.ad_pin(to: view.layoutMarginsGuide, edges: [.bottom, .left], insets: insets) subview.ad_constrain(in: view.layoutMarginsGuide, edges: [.top, .right], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinBottomLeft")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinBottomLeft") } it("should constrain in layout guide pin bottom right") { subview.ad_pin(to: view.layoutMarginsGuide, edges: [.bottom, .right], insets: insets) subview.ad_constrain(in: view.layoutMarginsGuide, edges: [.top, .left], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinBottomRight")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinBottomRight") } it("should constrain in layout guide top left") { subview.ad_pin(to: view.layoutMarginsGuide, edges: [.top, .left], insets: insets) subview.ad_constrain(in: view.layoutMarginsGuide, edges: [.bottom, .right], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinTopLeft")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinTopLeft") } it("should constrain in layout guide pin top right") { subview.ad_pin(to: view.layoutMarginsGuide, edges: [.top, .right], insets: insets) subview.ad_constrain(in: view.layoutMarginsGuide, edges: [.bottom, .left], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinTopRight")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinTopRight") } it("should constrain in layout guide") { subview.ad_center(in: view.layoutMarginsGuide) subview.ad_constrain(in: view.layoutMarginsGuide) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuide")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuide") } it("should constrain in layout guide with insets") { @@ -165,7 +165,7 @@ class LayoutGuideConstraintsTests: QuickSpec { // ???: (Pierre Felgines) 08/10/2018 Intrinsic content size is not enough here subview.ad_constrain(to: subview.intrinsicContentSize, priority: .defaultLow) subview.ad_constrain(in: view.layoutMarginsGuide, insets: UIEdgeInsets(value: 10.0)) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuideWithInsets")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuideWithInsets") } it("should constrain in layout guide with left edge") { @@ -173,7 +173,7 @@ class LayoutGuideConstraintsTests: QuickSpec { // ???: (Pierre Felgines) 08/10/2018 Intrinsic content size is not enough here subview.ad_constrain(to: subview.intrinsicContentSize, priority: .defaultLow) subview.ad_constrain(in: view.layoutMarginsGuide, edges: [.left]) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuideWithLeftEdge")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuideWithLeftEdge") } } @@ -197,31 +197,31 @@ class LayoutGuideConstraintsTests: QuickSpec { it("should pin all edges no insets") { subview.ad_pin(to: layoutGuide) layoutGuide.ad_pin(to: view.layoutMarginsGuide) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideAllEdgesNoInsets")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideAllEdgesNoInsets") } it("should pin all edges with insets") { subview.ad_pin(to: layoutGuide) layoutGuide.ad_pin(to: view.layoutMarginsGuide, insets: insets) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideAllEdgesWithInsets")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideAllEdgesWithInsets") } it("should pin top left edges no insets") { subview.ad_pin(to: layoutGuide) layoutGuide.ad_pin(to: view.layoutMarginsGuide, edges: [.top, .left]) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideTopLeftEdgesNoInsets")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideTopLeftEdgesNoInsets") } it("should pin top left edges with insets") { subview.ad_pin(to: layoutGuide) layoutGuide.ad_pin(to: view.layoutMarginsGuide, edges: [.top, .left], insets: insets) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideTopLeftEdgesWithInsets")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideTopLeftEdgesWithInsets") } it("should have no effet with wrong layout guide") { let extraView = UIView() layoutGuide.ad_pin(to: extraView.layoutMarginsGuide) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideNoSubview")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideNoSubview") } it("should pin top left with high priorities") { @@ -240,7 +240,7 @@ class LayoutGuideConstraintsTests: QuickSpec { insets: insets, priority: .defaultHigh ) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideTopLeftEdgesHighPriority")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideTopLeftEdgesHighPriority") } } @@ -264,19 +264,19 @@ class LayoutGuideConstraintsTests: QuickSpec { layoutGuide.ad_center(in: view.layoutMarginsGuide) // ???: (Pierre Felgines) 08/10/2018 Intrinsic content size is not enough here layoutGuide.ad_constrain(to: subview.intrinsicContentSize) - expect(view).to(haveValidSnapshot(named: "CenterInLayoutGuide")) + assertSnapshot(matching: view, as: .image, named: "CenterInLayoutGuide") } it("should center X in layout guide") { layoutGuide.ad_pin(to: view.layoutMarginsGuide, edges: [.top, .bottom]) layoutGuide.ad_center(in: view.layoutMarginsGuide, along: .horizontal) - expect(view).to(haveValidSnapshot(named: "CenterXInLayoutGuide")) + assertSnapshot(matching: view, as: .image, named: "CenterXInLayoutGuide") } it("should center Y in layout guide") { layoutGuide.ad_pin(to: view.layoutMarginsGuide, edges: [.left, .right]) layoutGuide.ad_center(in: view.layoutMarginsGuide, along: .vertical) - expect(view).to(haveValidSnapshot(named: "CenterYInLayoutGuide")) + assertSnapshot(matching: view, as: .image, named: "CenterYInLayoutGuide") } } @@ -300,31 +300,31 @@ class LayoutGuideConstraintsTests: QuickSpec { it("should constrain in layout guide pin bottom left") { layoutGuide.ad_pin(to: view.layoutMarginsGuide, edges: [.bottom, .left], insets: insets) layoutGuide.ad_constrain(in: view.layoutMarginsGuide, edges: [.top, .right], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinBottomLeft")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinBottomLeft") } it("should constrain in layout guide pin bottom right") { layoutGuide.ad_pin(to: view.layoutMarginsGuide, edges: [.bottom, .right], insets: insets) layoutGuide.ad_constrain(in: view.layoutMarginsGuide, edges: [.top, .left], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinBottomRight")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinBottomRight") } it("should constrain in layout guide top left") { layoutGuide.ad_pin(to: view.layoutMarginsGuide, edges: [.top, .left], insets: insets) layoutGuide.ad_constrain(in: view.layoutMarginsGuide, edges: [.bottom, .right], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinTopLeft")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinTopLeft") } it("should constrain in layout guide pin top right") { layoutGuide.ad_pin(to: view.layoutMarginsGuide, edges: [.top, .right], insets: insets) layoutGuide.ad_constrain(in: view.layoutMarginsGuide, edges: [.bottom, .left], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinTopRight")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinTopRight") } it("should constrain in layout guide") { layoutGuide.ad_center(in: view.layoutMarginsGuide) layoutGuide.ad_constrain(in: view.layoutMarginsGuide) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuide")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuide") } it("should constrain in layout guide with insets") { @@ -332,7 +332,7 @@ class LayoutGuideConstraintsTests: QuickSpec { // ???: (Pierre Felgines) 08/10/2018 Intrinsic content size is not enough here layoutGuide.ad_constrain(to: subview.intrinsicContentSize, priority: .defaultLow) layoutGuide.ad_constrain(in: view.layoutMarginsGuide, insets: UIEdgeInsets(value: 10.0)) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuideWithInsets")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuideWithInsets") } it("should constrain in layout guide with left edge") { @@ -340,14 +340,14 @@ class LayoutGuideConstraintsTests: QuickSpec { // ???: (Pierre Felgines) 08/10/2018 Intrinsic content size is not enough here layoutGuide.ad_constrain(to: subview.intrinsicContentSize, priority: .defaultLow) layoutGuide.ad_constrain(in: view.layoutMarginsGuide, edges: [.left]) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuideWithLeftEdge")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuideWithLeftEdge") } } } @available(iOS 13.0, *) @available(tvOSApplicationExtension 13.0, *) - private func directionalEdgesSpec() { + private static func directionalEdgesSpec() { describe("Pin to layout guide using NSDirectionalRectEdge and NSDirectionalRectEdge") { let insets = NSDirectionalEdgeInsets(top: 12.0, leading: 13.0, bottom: 20.0, trailing: 45.0) @@ -365,38 +365,38 @@ class LayoutGuideConstraintsTests: QuickSpec { it("should pin all edges no insets") { subview.ad_pin(to: view.layoutMarginsGuide, usingDirectionalEdges: true) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideAllEdgesNoInsets")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideAllEdgesNoInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideAllEdgesNoInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideAllEdgesNoInsetsRTLForced") } it("should pin all edges with insets") { subview.ad_pin(to: view.layoutMarginsGuide, insets: insets) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideAllEdgesWithInsets")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideAllEdgesWithInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideAllEdgesWithInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideAllEdgesWithInsetsRTLForced") } it("should pin top left edges no insets") { subview.ad_pin(to: view.layoutMarginsGuide, directionalEdges: [.top, .leading]) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideTopLeftEdgesNoInsets")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideTopLeftEdgesNoInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideTopLeftEdgesNoInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideTopLeftEdgesNoInsetsRTLForced") } it("should pin top left edges with insets") { subview.ad_pin(to: view.layoutMarginsGuide, directionalEdges: [.top, .leading], insets: insets) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideTopLeftEdgesWithInsets")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideTopLeftEdgesWithInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideTopLeftEdgesWithInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideTopLeftEdgesWithInsetsRTLForced") } it("should have no effet with wrong layout guide") { let extraView = UIView() subview.ad_pin(to: extraView.layoutMarginsGuide, usingDirectionalEdges: true) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideNoSubview")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideNoSubview") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideNoSubviewRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideNoSubviewRTLForced") } it("should pin top left with high priorities") { @@ -414,9 +414,9 @@ class LayoutGuideConstraintsTests: QuickSpec { insets: insets, priority: .defaultHigh ) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideTopLeftEdgesHighPriority")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideTopLeftEdgesHighPriority") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideTopLeftEdgesHighPriorityRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideTopLeftEdgesHighPriorityRTLForced") } } @@ -437,25 +437,25 @@ class LayoutGuideConstraintsTests: QuickSpec { subview.ad_center(in: view.layoutMarginsGuide) // ???: (Pierre Felgines) 08/10/2018 Intrinsic content size is not enough here subview.ad_constrain(to: subview.intrinsicContentSize) - expect(view).to(haveValidSnapshot(named: "CenterInLayoutGuide")) + assertSnapshot(matching: view, as: .image, named: "CenterInLayoutGuide") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "CenterInLayoutGuideRTLForced")) + assertSnapshot(matching: view, as: .image, named: "CenterInLayoutGuideRTLForced") } it("should center X in layout guide") { subview.ad_pin(to: view.layoutMarginsGuide, directionalEdges: [.top, .bottom]) subview.ad_center(in: view.layoutMarginsGuide, along: .horizontal) - expect(view).to(haveValidSnapshot(named: "CenterXInLayoutGuide")) + assertSnapshot(matching: view, as: .image, named: "CenterXInLayoutGuide") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "CenterXInLayoutGuideRTLForced")) + assertSnapshot(matching: view, as: .image, named: "CenterXInLayoutGuideRTLForced") } it("should center Y in layout guide") { subview.ad_pin(to: view.layoutMarginsGuide, directionalEdges: [.leading, .trailing]) subview.ad_center(in: view.layoutMarginsGuide, along: .vertical) - expect(view).to(haveValidSnapshot(named: "CenterYInLayoutGuide")) + assertSnapshot(matching: view, as: .image, named: "CenterYInLayoutGuide") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "CenterYInLayoutGuideRTLForced")) + assertSnapshot(matching: view, as: .image, named: "CenterYInLayoutGuideRTLForced") } } @@ -476,41 +476,41 @@ class LayoutGuideConstraintsTests: QuickSpec { it("should constrain in layout guide pin bottom left") { subview.ad_pin(to: view.layoutMarginsGuide, directionalEdges: [.bottom, .leading], insets: insets) subview.ad_constrain(in: view.layoutMarginsGuide, directionalEdges: [.top, .trailing], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinBottomLeft")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinBottomLeft") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinBottomLeftRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinBottomLeftRTLForced") } it("should constrain in layout guide pin bottom right") { subview.ad_pin(to: view.layoutMarginsGuide, directionalEdges: [.bottom, .trailing], insets: insets) subview.ad_constrain(in: view.layoutMarginsGuide, directionalEdges: [.top, .leading], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinBottomRight")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinBottomRight") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinBottomRightRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinBottomRightRTLForced") } it("should constrain in layout guide top left") { subview.ad_pin(to: view.layoutMarginsGuide, directionalEdges: [.top, .leading], insets: insets) subview.ad_constrain(in: view.layoutMarginsGuide, directionalEdges: [.bottom, .trailing], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinTopLeft")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinTopLeft") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinTopLeftRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinTopLeftRTLForced") } it("should constrain in layout guide pin top right") { subview.ad_pin(to: view.layoutMarginsGuide, directionalEdges: [.top, .trailing], insets: insets) subview.ad_constrain(in: view.layoutMarginsGuide, directionalEdges: [.bottom, .leading], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinTopRight")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinTopRight") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinTopRightRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinTopRightRTLForced") } it("should constrain in layout guide") { subview.ad_center(in: view.layoutMarginsGuide) subview.ad_constrain(in: view.layoutMarginsGuide) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuide")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuide") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuideRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuideRTLForced") } it("should constrain in layout guide with insets") { @@ -518,9 +518,9 @@ class LayoutGuideConstraintsTests: QuickSpec { // ???: (Pierre Felgines) 08/10/2018 Intrinsic content size is not enough here subview.ad_constrain(to: subview.intrinsicContentSize, priority: .defaultLow) subview.ad_constrain(in: view.layoutMarginsGuide, insets: NSDirectionalEdgeInsets(value: 10.0)) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuideWithInsets")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuideWithInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuideWithInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuideWithInsetsRTLForced") } it("should constrain in layout guide with left edge") { @@ -528,9 +528,9 @@ class LayoutGuideConstraintsTests: QuickSpec { // ???: (Pierre Felgines) 08/10/2018 Intrinsic content size is not enough here subview.ad_constrain(to: subview.intrinsicContentSize, priority: .defaultLow) subview.ad_constrain(in: view.layoutMarginsGuide, directionalEdges: [.leading]) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuideWithLeftEdge")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuideWithLeftEdge") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuideWithLeftEdgeRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuideWithLeftEdgeRTLForced") } } @@ -554,41 +554,41 @@ class LayoutGuideConstraintsTests: QuickSpec { it("should pin all edges no insets") { subview.ad_pin(to: layoutGuide, usingDirectionalEdges: true) layoutGuide.ad_pin(to: view.layoutMarginsGuide) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideAllEdgesNoInsets")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideAllEdgesNoInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideAllEdgesNoInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideAllEdgesNoInsetsRTLForced") } it("should pin all edges with insets") { subview.ad_pin(to: layoutGuide, usingDirectionalEdges: true) layoutGuide.ad_pin(to: view.layoutMarginsGuide, insets: insets) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideAllEdgesWithInsets")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideAllEdgesWithInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideAllEdgesWithInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideAllEdgesWithInsetsRTLForced") } it("should pin top left edges no insets") { subview.ad_pin(to: layoutGuide, usingDirectionalEdges: true) layoutGuide.ad_pin(to: view.layoutMarginsGuide, directionalEdges: [.top, .leading]) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideTopLeftEdgesNoInsets")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideTopLeftEdgesNoInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideTopLeftEdgesNoInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideTopLeftEdgesNoInsetsRTLForced") } it("should pin top left edges with insets") { subview.ad_pin(to: layoutGuide, usingDirectionalEdges: true) layoutGuide.ad_pin(to: view.layoutMarginsGuide, directionalEdges: [.top, .leading], insets: insets) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideTopLeftEdgesWithInsets")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideTopLeftEdgesWithInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideTopLeftEdgesWithInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideTopLeftEdgesWithInsetsRTLForced") } it("should have no effet with wrong layout guide") { let extraView = UIView() layoutGuide.ad_pin(to: extraView.layoutMarginsGuide, usingDirectionalEdges: true) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideNoSubview")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideNoSubview") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideNoSubviewRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideNoSubviewRTLForced") } it("should pin top left with high priorities") { @@ -607,9 +607,9 @@ class LayoutGuideConstraintsTests: QuickSpec { insets: insets, priority: .defaultHigh ) - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideTopLeftEdgesHighPriority")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideTopLeftEdgesHighPriority") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinToLayoutGuideTopLeftEdgesHighPriorityRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinToLayoutGuideTopLeftEdgesHighPriorityRTLForced") } } @@ -633,25 +633,25 @@ class LayoutGuideConstraintsTests: QuickSpec { layoutGuide.ad_center(in: view.layoutMarginsGuide) // ???: (Pierre Felgines) 08/10/2018 Intrinsic content size is not enough here layoutGuide.ad_constrain(to: subview.intrinsicContentSize) - expect(view).to(haveValidSnapshot(named: "CenterInLayoutGuide")) + assertSnapshot(matching: view, as: .image, named: "CenterInLayoutGuide") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "CenterInLayoutGuideRTLForced")) + assertSnapshot(matching: view, as: .image, named: "CenterInLayoutGuideRTLForced") } it("should center X in layout guide") { layoutGuide.ad_pin(to: view.layoutMarginsGuide, directionalEdges: [.top, .bottom]) layoutGuide.ad_center(in: view.layoutMarginsGuide, along: .horizontal) - expect(view).to(haveValidSnapshot(named: "CenterXInLayoutGuide")) + assertSnapshot(matching: view, as: .image, named: "CenterXInLayoutGuide") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "CenterXInLayoutGuideRTLForced")) + assertSnapshot(matching: view, as: .image, named: "CenterXInLayoutGuideRTLForced") } it("should center Y in layout guide") { layoutGuide.ad_pin(to: view.layoutMarginsGuide, directionalEdges: [.leading, .trailing]) layoutGuide.ad_center(in: view.layoutMarginsGuide, along: .vertical) - expect(view).to(haveValidSnapshot(named: "CenterYInLayoutGuide")) + assertSnapshot(matching: view, as: .image, named: "CenterYInLayoutGuide") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "CenterYInLayoutGuideRTLForced")) + assertSnapshot(matching: view, as: .image, named: "CenterYInLayoutGuideRTLForced") } } @@ -675,41 +675,41 @@ class LayoutGuideConstraintsTests: QuickSpec { it("should constrain in layout guide pin bottom left") { layoutGuide.ad_pin(to: view.layoutMarginsGuide, directionalEdges: [.bottom, .leading], insets: insets) layoutGuide.ad_constrain(in: view.layoutMarginsGuide, directionalEdges: [.top, .trailing], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinBottomLeft")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinBottomLeft") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinBottomLeftRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinBottomLeftRTLForced") } it("should constrain in layout guide pin bottom right") { layoutGuide.ad_pin(to: view.layoutMarginsGuide, directionalEdges: [.bottom, .trailing], insets: insets) layoutGuide.ad_constrain(in: view.layoutMarginsGuide, directionalEdges: [.top, .leading], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinBottomRight")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinBottomRight") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinBottomRightRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinBottomRightRTLForced") } it("should constrain in layout guide top left") { layoutGuide.ad_pin(to: view.layoutMarginsGuide, directionalEdges: [.top, .leading], insets: insets) layoutGuide.ad_constrain(in: view.layoutMarginsGuide, directionalEdges: [.bottom, .trailing], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinTopLeft")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinTopLeft") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinTopLeftRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinTopLeftRTLForced") } it("should constrain in layout guide pin top right") { layoutGuide.ad_pin(to: view.layoutMarginsGuide, directionalEdges: [.top, .trailing], insets: insets) layoutGuide.ad_constrain(in: view.layoutMarginsGuide, directionalEdges: [.bottom, .leading], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinTopRight")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinTopRight") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuidePinTopRightRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuidePinTopRightRTLForced") } it("should constrain in layout guide") { layoutGuide.ad_center(in: view.layoutMarginsGuide) layoutGuide.ad_constrain(in: view.layoutMarginsGuide) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuide")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuide") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuideRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuideRTLForced") } it("should constrain in layout guide with insets") { @@ -717,9 +717,9 @@ class LayoutGuideConstraintsTests: QuickSpec { // ???: (Pierre Felgines) 08/10/2018 Intrinsic content size is not enough here layoutGuide.ad_constrain(to: subview.intrinsicContentSize, priority: .defaultLow) layoutGuide.ad_constrain(in: view.layoutMarginsGuide, insets: NSDirectionalEdgeInsets(value: 10.0)) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuideWithInsets")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuideWithInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuideWithInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuideWithInsetsRTLForced") } it("should constrain in layout guide with left edge") { @@ -727,9 +727,9 @@ class LayoutGuideConstraintsTests: QuickSpec { // ???: (Pierre Felgines) 08/10/2018 Intrinsic content size is not enough here layoutGuide.ad_constrain(to: subview.intrinsicContentSize, priority: .defaultLow) layoutGuide.ad_constrain(in: view.layoutMarginsGuide, directionalEdges: [.leading]) - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuideWithLeftEdge")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuideWithLeftEdge") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInLayoutGuideWithLeftEdgeRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInLayoutGuideWithLeftEdgeRTLForced") } } } diff --git a/ADUtilsTests/LayoutTests/ViewLayoutTest.swift b/ADUtilsTests/LayoutTests/ViewLayoutTest.swift index 2a2608f..c67f44d 100644 --- a/ADUtilsTests/LayoutTests/ViewLayoutTest.swift +++ b/ADUtilsTests/LayoutTests/ViewLayoutTest.swift @@ -14,7 +14,7 @@ import UIKit class ViewLayout: QuickSpec { - override func spec() { + override class func spec() { let veryLongText = "Lorem sizzle pimpin' sit amizzle, yippiyo adipiscing izzle. Nullizzle bling bling velit, away ghetto, suscipit dang, gravida vel, ass. Pellentesque eget tortor. Bow wow wow erizzle. Own yo' uhuh ... yih! sizzle dapibizzle turpis tempus shut the shizzle up. Maurizzle fo shizzle my nizzle crunk et turpizzle. Phat in tortizzle. Fizzle eleifend rhoncizzle i'm in the shizzle. In shut the shizzle up habitasse platea dictumst. Sheezy dapibizzle. Fo tellizzle urna, pretizzle eu, stuff shut the shizzle up, you son of a bizzle boofron, nunc. Fo suscipizzle. Integer sempizzle shizzle my nizzle crocodizzle ass purus" diff --git a/ADUtilsTests/LocaleUserPreferredTimeFormatTests.swift b/ADUtilsTests/LocaleUserPreferredTimeFormatTests.swift index 5d5d16b..ed92d8a 100644 --- a/ADUtilsTests/LocaleUserPreferredTimeFormatTests.swift +++ b/ADUtilsTests/LocaleUserPreferredTimeFormatTests.swift @@ -12,7 +12,7 @@ import ADUtils class LocaleUserPreferredTimeFormatTests: QuickSpec { - override func spec() { + override class func spec() { describe("When using an US region locale") { it("should return a 12 hours format for en_US locale") { let locale = Locale(identifier: "en_US") diff --git a/ADUtilsTests/MKMapViewDequeuingTest.swift b/ADUtilsTests/MKMapViewDequeuingTest.swift index 6515bac..5ffb096 100644 --- a/ADUtilsTests/MKMapViewDequeuingTest.swift +++ b/ADUtilsTests/MKMapViewDequeuingTest.swift @@ -23,7 +23,7 @@ class MapViewAnnotationView: MKAnnotationView { } class MKMapViewDequeuingTest: QuickSpec { - override func spec() { + override class func spec() { describe("Dequeuing") { var mapView = MKMapView() diff --git a/ADUtilsTests/NSDirectionalEdgeInsetsTests.swift b/ADUtilsTests/NSDirectionalEdgeInsetsTests.swift index 685fb76..3115432 100644 --- a/ADUtilsTests/NSDirectionalEdgeInsetsTests.swift +++ b/ADUtilsTests/NSDirectionalEdgeInsetsTests.swift @@ -14,7 +14,7 @@ import ADUtils @available(tvOSApplicationExtension 13.0, *) class NSDirectionalEdgeInsetsTests: QuickSpec { - override func spec() { + override class func spec() { it("should init directional insets with only one value") { let value: CGFloat = 10 let inset = NSDirectionalEdgeInsets(value: value) diff --git a/ADUtilsTests/NSLayoutConstraintUtilsTests.swift b/ADUtilsTests/NSLayoutConstraintUtilsTests.swift index 4537de6..7665a80 100644 --- a/ADUtilsTests/NSLayoutConstraintUtilsTests.swift +++ b/ADUtilsTests/NSLayoutConstraintUtilsTests.swift @@ -13,7 +13,7 @@ import UIKit class NSLayoutConstraintUtilsTests: QuickSpec { - override func spec() { + override class func spec() { it("should be higher than default priorities") { expect(UILayoutPriority.applyIfPossible.rawValue).to(beGreaterThan(UILayoutPriority.defaultLow.rawValue)) diff --git a/ADUtilsTests/NavigationControllerObserverTest.swift b/ADUtilsTests/NavigationControllerObserverTest.swift index d737d6b..266935c 100644 --- a/ADUtilsTests/NavigationControllerObserverTest.swift +++ b/ADUtilsTests/NavigationControllerObserverTest.swift @@ -41,7 +41,7 @@ private class NavigationControllerDelegate: NSObject, UINavigationControllerDele class NavigationControllerObserverTest : QuickSpec { - override func spec() { + override class func spec() { let rootViewController = UIViewController() let navigationController = UINavigationController(rootViewController: rootViewController) diff --git a/ADUtilsTests/NavigationControllerPopCompletionTests.swift b/ADUtilsTests/NavigationControllerPopCompletionTests.swift index 170e4bc..58947f1 100644 --- a/ADUtilsTests/NavigationControllerPopCompletionTests.swift +++ b/ADUtilsTests/NavigationControllerPopCompletionTests.swift @@ -41,7 +41,7 @@ class CompletionBehavior: Behavior { class NavigationControllerPopCompletionTests: QuickSpec { - override func spec() { + override class func spec() { let isAnimated = true let isNotAnimated = false itBehavesLike(CompletionBehavior.self) { isAnimated } diff --git a/ADUtilsTests/NibLoaderTest.swift b/ADUtilsTests/NibLoaderTest.swift index f622d44..0e23463 100644 --- a/ADUtilsTests/NibLoaderTest.swift +++ b/ADUtilsTests/NibLoaderTest.swift @@ -14,7 +14,7 @@ import ADUtils class NibLoaderTest: QuickSpec { - override func spec() { + override class func spec() { it("should return a view") { let testView = TestView.ad_fromNib() expect(testView).toNot(beNil()) diff --git a/ADUtilsTests/OptionalGetTests.swift b/ADUtilsTests/OptionalGetTests.swift index 7e4464b..ee793c5 100644 --- a/ADUtilsTests/OptionalGetTests.swift +++ b/ADUtilsTests/OptionalGetTests.swift @@ -12,7 +12,7 @@ import ADUtils class OptionalGetTests: QuickSpec { - override func spec() { + override class func spec() { it("should throw an error") { // Given diff --git a/ADUtilsTests/OptionalStringIsBlankTests.swift b/ADUtilsTests/OptionalStringIsBlankTests.swift index af34e5a..f7db7c8 100644 --- a/ADUtilsTests/OptionalStringIsBlankTests.swift +++ b/ADUtilsTests/OptionalStringIsBlankTests.swift @@ -12,7 +12,7 @@ import ADUtils class OptionalStringIsBlankTests: QuickSpec { - override func spec() { + override class func spec() { it("should be blank") { // Given diff --git a/ADUtilsTests/OptionalUnwrapTest.swift b/ADUtilsTests/OptionalUnwrapTest.swift index 04eed96..0bc931d 100644 --- a/ADUtilsTests/OptionalUnwrapTest.swift +++ b/ADUtilsTests/OptionalUnwrapTest.swift @@ -26,7 +26,7 @@ private func delay(_ duration: TimeInterval, block: @escaping () -> ()) { class OptionalUnwrap: QuickSpec { - override func spec() { + override class func spec() { describe("unwrap") { it("Should unwrap properly") { diff --git a/ADUtilsTests/OptionalVerifyOrNilTests.swift b/ADUtilsTests/OptionalVerifyOrNilTests.swift index 28f2c53..756c481 100644 --- a/ADUtilsTests/OptionalVerifyOrNilTests.swift +++ b/ADUtilsTests/OptionalVerifyOrNilTests.swift @@ -12,7 +12,7 @@ import ADUtils class OptionalVerifyOrNilTests: QuickSpec { - override func spec() { + override class func spec() { it("should return a valid object") { // Given diff --git a/ADUtilsTests/PropertyListArchiverTest.swift b/ADUtilsTests/PropertyListArchiverTest.swift index ed1cb57..a7091b3 100644 --- a/ADUtilsTests/PropertyListArchiverTest.swift +++ b/ADUtilsTests/PropertyListArchiverTest.swift @@ -53,7 +53,7 @@ extension User : PropertyListReadable { class PropertyListArchiverTest: QuickSpec { - override func spec() { + override class func spec() { var defaults: UserDefaults! var archiver: PropertyListArchiver! diff --git a/ADUtilsTests/RegisterableViewTest.swift b/ADUtilsTests/RegisterableViewTest.swift index 1d8ad20..49d4c3c 100644 --- a/ADUtilsTests/RegisterableViewTest.swift +++ b/ADUtilsTests/RegisterableViewTest.swift @@ -99,7 +99,7 @@ private enum Constants { class RegisterableViewTest: QuickSpec { - override func spec() { + override class func spec() { describe("UITableView") { diff --git a/ADUtilsTests/Security/PostInstallationKeychainCleanerTests.swift b/ADUtilsTests/Security/PostInstallationKeychainCleanerTests.swift index a4e3d87..dc06029 100644 --- a/ADUtilsTests/Security/PostInstallationKeychainCleanerTests.swift +++ b/ADUtilsTests/Security/PostInstallationKeychainCleanerTests.swift @@ -21,7 +21,7 @@ private class KeychainWiperMock: KeychainWiper { class PostInstallationKeychainCleanerTests: QuickSpec { - override func spec() { + override class func spec() { var keychainWiper: KeychainWiperMock! var userDefaults: UserDefaults! diff --git a/ADUtilsTests/Security/SecureArchiverTests.swift b/ADUtilsTests/Security/SecureArchiverTests.swift index 7e0c336..2144822 100644 --- a/ADUtilsTests/Security/SecureArchiverTests.swift +++ b/ADUtilsTests/Security/SecureArchiverTests.swift @@ -63,7 +63,7 @@ private class KeychainArchiverImplementation: KeychainArchiver { @available(iOS 13.0, *) class SecureArchiverTests: QuickSpec { - override func spec() { + override class func spec() { var storageArchiver: StorageArchiverImplementation! var keychainArchiver: KeychainArchiverImplementation! diff --git a/ADUtilsTests/SequenceGroupedByTests.swift b/ADUtilsTests/SequenceGroupedByTests.swift index 677e3ae..7e269c4 100644 --- a/ADUtilsTests/SequenceGroupedByTests.swift +++ b/ADUtilsTests/SequenceGroupedByTests.swift @@ -17,7 +17,7 @@ private struct Person { class SequenceGroupedByTests: QuickSpec { - override func spec() { + override class func spec() { it("should group the sequence") { let persons = [ diff --git a/ADUtilsTests/StackViewBuilderTests.swift b/ADUtilsTests/StackViewBuilderTests.swift index ea911a3..296a4a1 100644 --- a/ADUtilsTests/StackViewBuilderTests.swift +++ b/ADUtilsTests/StackViewBuilderTests.swift @@ -9,7 +9,7 @@ import Foundation import Nimble import Quick import ADUtils -import Nimble_Snapshots +import SnapshotTesting private extension UIView { convenience init(color: UIColor) { @@ -20,7 +20,7 @@ private extension UIView { class StackViewBuilderTests: QuickSpec { - override func spec() { + override class func spec() { describe("HStackView") { @@ -41,7 +41,7 @@ class StackViewBuilderTests: QuickSpec { ) // Then - expect(stackView).to(haveValidSnapshot(named: "HStackViewDefault")) + assertSnapshot(matching: stackView, as: .image, named: "HStackViewDefault") } it("should have correct snapshot with custom parameters") { @@ -63,7 +63,7 @@ class StackViewBuilderTests: QuickSpec { ) // Then - expect(stackView).to(haveValidSnapshot(named: "HStackViewCustom")) + assertSnapshot(matching: stackView, as: .image, named: "HStackViewCustom") } } // HStackView @@ -87,7 +87,7 @@ class StackViewBuilderTests: QuickSpec { ) // Then - expect(stackView).to(haveValidSnapshot(named: "VStackViewDefault")) + assertSnapshot(matching: stackView, as: .image, named: "VStackViewDefault") } it("should have correct snapshot with custom parameters") { @@ -109,7 +109,7 @@ class StackViewBuilderTests: QuickSpec { ) // Then - expect(stackView).to(haveValidSnapshot(named: "VStackViewCustom")) + assertSnapshot(matching: stackView, as: .image, named: "VStackViewCustom") } } // VStackView diff --git a/ADUtilsTests/StackViewUtilsTests.swift b/ADUtilsTests/StackViewUtilsTests.swift index d67680b..33636e0 100644 --- a/ADUtilsTests/StackViewUtilsTests.swift +++ b/ADUtilsTests/StackViewUtilsTests.swift @@ -13,7 +13,7 @@ import UIKit class StackViewUtilsTests: QuickSpec { - override func spec() { + override class func spec() { var stackView: UIStackView! beforeEach { diff --git a/ADUtilsTests/StringLocalizationTests.swift b/ADUtilsTests/StringLocalizationTests.swift index a2e88c9..d737007 100644 --- a/ADUtilsTests/StringLocalizationTests.swift +++ b/ADUtilsTests/StringLocalizationTests.swift @@ -12,7 +12,7 @@ import ADUtils class StringLocalizationTests: QuickSpec { - override func spec() { + override class func spec() { it("should return the correct localized string") { // Given diff --git a/ADUtilsTests/SynchronizeTests.swift b/ADUtilsTests/SynchronizeTests.swift index d725f6c..3893924 100644 --- a/ADUtilsTests/SynchronizeTests.swift +++ b/ADUtilsTests/SynchronizeTests.swift @@ -12,7 +12,7 @@ import ADUtils class SynchronizeTests: QuickSpec { - override func spec() { + override class func spec() { // TODO: (Pierre Felgines) 01/10/2018 Find more useful test it("should execute block") { diff --git a/ADUtilsTests/UIButtonBackgroundColorTests.swift b/ADUtilsTests/UIButtonBackgroundColorTests.swift index 79a5149..e0e633b 100644 --- a/ADUtilsTests/UIButtonBackgroundColorTests.swift +++ b/ADUtilsTests/UIButtonBackgroundColorTests.swift @@ -9,11 +9,11 @@ import Foundation import Nimble import Quick import ADUtils -import Nimble_Snapshots +import SnapshotTesting class UIButtonBackgroundColorTests: QuickSpec { - override func spec() { + override class func spec() { it("should have correct snapshot") { // Given @@ -28,12 +28,12 @@ class UIButtonBackgroundColorTests: QuickSpec { button.ad_setBackgroundColor(.green, for: .disabled) // Then - expect(button).to(haveValidSnapshot(named: "UIButtonBackgroundColorNormal")) + assertSnapshot(matching: button, as: .image, named: "UIButtonBackgroundColorNormal") button.isEnabled = false - expect(button).to(haveValidSnapshot(named: "UIButtonBackgroundColorDisabled")) + assertSnapshot(matching: button, as: .image, named: "UIButtonBackgroundColorDisabled") button.ad_setBackgroundColor(nil, for: .disabled) - expect(button).to(haveValidSnapshot(named: "UIButtonBackgroundColorDisabledNoColor")) + assertSnapshot(matching: button, as: .image, named: "UIButtonBackgroundColorDisabledNoColor") } } } diff --git a/ADUtilsTests/UIEdgeInsetsTest.swift b/ADUtilsTests/UIEdgeInsetsTest.swift index f572627..92660e3 100644 --- a/ADUtilsTests/UIEdgeInsetsTest.swift +++ b/ADUtilsTests/UIEdgeInsetsTest.swift @@ -13,7 +13,7 @@ import ADUtils class UIEdgeInsetsTest: QuickSpec { - override func spec() { + override class func spec() { it("should init insets with only one value") { let value: CGFloat = 10 let inset = UIEdgeInsets(value: value) diff --git a/ADUtilsTests/UIImageColorTests.swift b/ADUtilsTests/UIImageColorTests.swift index 635ba90..6b2301e 100644 --- a/ADUtilsTests/UIImageColorTests.swift +++ b/ADUtilsTests/UIImageColorTests.swift @@ -9,11 +9,11 @@ import Foundation import Nimble import Quick import ADUtils -import Nimble_Snapshots +import SnapshotTesting class UIImageColorTests: QuickSpec { - override func spec() { + override class func spec() { it("should have correct snapshot with size") { // Given @@ -25,7 +25,7 @@ class UIImageColorTests: QuickSpec { // Then let imageView = UIImageView(image: image) - expect(imageView).to(haveValidSnapshot(named: "UIImageColorRedWithSize")) + assertSnapshot(matching: imageView, as: .image, named: "UIImageColorRedWithSize") } it("should have correct snapshot without size") { @@ -37,7 +37,7 @@ class UIImageColorTests: QuickSpec { // Then let imageView = UIImageView(image: image) - expect(imageView).to(haveValidSnapshot(named: "UIImageColorRedPixel")) + assertSnapshot(matching: imageView, as: .image, named: "UIImageColorRedPixel") } if #available(iOS 13.0, *) { diff --git a/ADUtilsTests/UINavigationItemBackItemTests.swift b/ADUtilsTests/UINavigationItemBackItemTests.swift index c59285b..abcbe4c 100644 --- a/ADUtilsTests/UINavigationItemBackItemTests.swift +++ b/ADUtilsTests/UINavigationItemBackItemTests.swift @@ -12,7 +12,7 @@ import ADUtils class UINavigationItemBackItemTests: QuickSpec { - override func spec() { + override class func spec() { it("should have an empty title") { // Given diff --git a/ADUtilsTests/UIScreenPixelDimensionTests.swift b/ADUtilsTests/UIScreenPixelDimensionTests.swift index 75e23bc..679cb87 100644 --- a/ADUtilsTests/UIScreenPixelDimensionTests.swift +++ b/ADUtilsTests/UIScreenPixelDimensionTests.swift @@ -19,7 +19,7 @@ private class TestScreen: UIScreen { class UIScreenPixelDimensionTests: QuickSpec { - override func spec() { + override class func spec() { it("should have an empty title") { // Given diff --git a/ADUtilsTests/UITableViewDefaultFooterCellsTests.swift b/ADUtilsTests/UITableViewDefaultFooterCellsTests.swift index a5156f8..b426f63 100644 --- a/ADUtilsTests/UITableViewDefaultFooterCellsTests.swift +++ b/ADUtilsTests/UITableViewDefaultFooterCellsTests.swift @@ -12,7 +12,7 @@ import ADUtils class UITableViewDefaultFooterCellsTests: QuickSpec { - override func spec() { + override class func spec() { it("should have an empty footer") { // Given diff --git a/ADUtilsTests/UITableViewHeaderFooterViewLayoutTests.swift b/ADUtilsTests/UITableViewHeaderFooterViewLayoutTests.swift index 2db4bc0..cc85de0 100644 --- a/ADUtilsTests/UITableViewHeaderFooterViewLayoutTests.swift +++ b/ADUtilsTests/UITableViewHeaderFooterViewLayoutTests.swift @@ -95,7 +95,7 @@ class HeaderFooterBehavior: Behavior { class UITableViewHeaderFooterViewLayoutTests: QuickSpec { - override func spec() { + override class func spec() { itBehavesLike(HeaderFooterBehavior.self) { .header } itBehavesLike(HeaderFooterBehavior.self) { .footer } } diff --git a/ADUtilsTests/ViewInsertionWithMarginTest.swift b/ADUtilsTests/ViewInsertionWithMarginTest.swift index c87d989..cda90b5 100644 --- a/ADUtilsTests/ViewInsertionWithMarginTest.swift +++ b/ADUtilsTests/ViewInsertionWithMarginTest.swift @@ -10,7 +10,7 @@ import Foundation import Foundation import Nimble -import Nimble_Snapshots +import SnapshotTesting import Quick import ADUtils @testable import ADUtilsApp @@ -31,7 +31,7 @@ class IntrinsicContentSizeView : UIView { class ViewInsertionWithMargin: QuickSpec { - override func spec() { + override class func spec() { standardEdgesSpec() if #available(iOS 13, *) { directionalEdgesSpec() @@ -40,7 +40,7 @@ class ViewInsertionWithMargin: QuickSpec { // MARK: - Private - private func standardEdgesSpec() { + private class func standardEdgesSpec() { describe("Pin to superview") { @@ -58,52 +58,52 @@ class ViewInsertionWithMargin: QuickSpec { it("should pin all edges with insets") { subview.ad_pinToSuperview(insets: insets) - expect(view).to(haveValidSnapshot(named: "PinAllEdgesWithInsets")) + assertSnapshot(matching: view, as: .image, named: "PinAllEdgesWithInsets") } it("should pin top right with insets") { subview.ad_pinToSuperview(edges: [.top, .right], insets: insets) - expect(view).to(haveValidSnapshot(named: "PinTopRightEdgesWithInsets")) + assertSnapshot(matching: view, as: .image, named: "PinTopRightEdgesWithInsets") } it("should pin top left with insets") { subview.ad_pinToSuperview(edges: [.top, .left], insets: insets) - expect(view).to(haveValidSnapshot(named: "PinTopLeftEdgesWithInsets")) + assertSnapshot(matching: view, as: .image, named: "PinTopLeftEdgesWithInsets") } it("should pin bottom right with insets") { subview.ad_pinToSuperview(edges: [.bottom, .right], insets: insets) - expect(view).to(haveValidSnapshot(named: "PinBottomRightEdgesWithInsets")) + assertSnapshot(matching: view, as: .image, named: "PinBottomRightEdgesWithInsets") } it("should pin bottom left with insets") { subview.ad_pinToSuperview(edges: [.bottom, .left], insets: insets) - expect(view).to(haveValidSnapshot(named: "PinBottomLeftEdgesWithInsets")) + assertSnapshot(matching: view, as: .image, named: "PinBottomLeftEdgesWithInsets") } it("should pin all edges without insets") { subview.ad_pinToSuperview() - expect(view).to(haveValidSnapshot(named: "PinAllEdgesWithoutInsets")) + assertSnapshot(matching: view, as: .image, named: "PinAllEdgesWithoutInsets") } it("should pin top right without insets") { subview.ad_pinToSuperview(edges: [.top, .right]) - expect(view).to(haveValidSnapshot(named: "PinTopRightEdgesWithoutInsets")) + assertSnapshot(matching: view, as: .image, named: "PinTopRightEdgesWithoutInsets") } it("should pin top left without insets") { subview.ad_pinToSuperview(edges: [.top, .left]) - expect(view).to(haveValidSnapshot(named: "PinTopLeftEdgesWithoutInsets")) + assertSnapshot(matching: view, as: .image, named: "PinTopLeftEdgesWithoutInsets") } it("should pin bottom right without insets") { subview.ad_pinToSuperview(edges: [.bottom, .right]) - expect(view).to(haveValidSnapshot(named: "PinBottomRightEdgesWithoutInsets")) + assertSnapshot(matching: view, as: .image, named: "PinBottomRightEdgesWithoutInsets") } it("should pin bottom left without insets") { subview.ad_pinToSuperview(edges: [.bottom, .left]) - expect(view).to(haveValidSnapshot(named: "PinBottomLeftEdgesWithoutInsets")) + assertSnapshot(matching: view, as: .image, named: "PinBottomLeftEdgesWithoutInsets") } } @@ -121,19 +121,19 @@ class ViewInsertionWithMargin: QuickSpec { it("should center in superview") { subview.ad_centerInSuperview() - expect(view).to(haveValidSnapshot(named: "CenterInSuperview")) + assertSnapshot(matching: view, as: .image, named: "CenterInSuperview") } it("should center X in superview") { subview.ad_pinToSuperview(edges: [.top, .bottom]) subview.ad_centerInSuperview(along: .horizontal) - expect(view).to(haveValidSnapshot(named: "CenterXInSuperview")) + assertSnapshot(matching: view, as: .image, named: "CenterXInSuperview") } it("should center Y in superview") { subview.ad_pinToSuperview(edges: [.left, .right]) subview.ad_centerInSuperview(along: .vertical) - expect(view).to(haveValidSnapshot(named: "CenterYInSuperview")) + assertSnapshot(matching: view, as: .image, named: "CenterYInSuperview") } } @@ -152,7 +152,7 @@ class ViewInsertionWithMargin: QuickSpec { it("should constrain to size") { subview.ad_constrain(to: CGSize(width: 50, height: 50)) subview.ad_pinToSuperview(edges: [.top, .left]) - expect(view).to(haveValidSnapshot(named: "ConstrainToSize")) + assertSnapshot(matching: view, as: .image, named: "ConstrainToSize") } } @@ -172,43 +172,43 @@ class ViewInsertionWithMargin: QuickSpec { it("should constrain in superview pin bottom left") { subview.ad_pinToSuperview(edges: [.bottom, .left], insets: insets) subview.ad_constrainInSuperview(edges: [.top, .right], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewPinBottomLeft")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewPinBottomLeft") } it("should constrain in superview pin bottom right") { subview.ad_pinToSuperview(edges: [.bottom, .right], insets: insets) subview.ad_constrainInSuperview(edges: [.top, .left], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewPinBottomRight")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewPinBottomRight") } it("should constrain in superview pin top left") { subview.ad_pinToSuperview(edges: [.top, .left], insets: insets) subview.ad_constrainInSuperview(edges: [.bottom, .right], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewPinTopLeft")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewPinTopLeft") } it("should constrain in superview pin top right") { subview.ad_pinToSuperview(edges: [.top, .right], insets: insets) subview.ad_constrainInSuperview(edges: [.bottom, .left], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewPinTopRight")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewPinTopRight") } it("should constrain in superview") { subview.ad_centerInSuperview() subview.ad_constrainInSuperview() - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperview")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperview") } it("should constrain in superview with insets") { subview.ad_centerInSuperview() subview.ad_constrainInSuperview(insets: UIEdgeInsets(value: 10.0)) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewWithInsets")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewWithInsets") } it("should constrain in superview with left edge") { subview.ad_centerInSuperview() subview.ad_constrainInSuperview(edges: [.left]) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewWithLeftEdge")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewWithLeftEdge") } } @@ -238,43 +238,43 @@ class ViewInsertionWithMargin: QuickSpec { it("should constrain in superview pin bottom left") { subview.ad_pinToSuperviewSafeAreaLayoutGuide(edges: [.bottom, .left], insets: insets) subview.ad_constrainInSuperviewSafeAreaLayoutGuide(edges: [.top, .right], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeAreaPinBottomLeft")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeAreaPinBottomLeft") } it("should constrain in superview pin bottom right") { subview.ad_pinToSuperviewSafeAreaLayoutGuide(edges: [.bottom, .right], insets: insets) subview.ad_constrainInSuperviewSafeAreaLayoutGuide(edges: [.top, .left], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeAreaPinBottomRight")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeAreaPinBottomRight") } it("should constrain in superview pin top left") { subview.ad_pinToSuperviewSafeAreaLayoutGuide(edges: [.top, .left], insets: insets) subview.ad_constrainInSuperviewSafeAreaLayoutGuide(edges: [.bottom, .right], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeAreaPinTopLeft")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeAreaPinTopLeft") } it("should constrain in superview pin top right") { subview.ad_pinToSuperviewSafeAreaLayoutGuide(edges: [.top, .right], insets: insets) subview.ad_constrainInSuperviewSafeAreaLayoutGuide(edges: [.bottom, .left], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeAreaPinTopRight")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeAreaPinTopRight") } it("should constrain in superview") { subview.ad_centerInSuperviewSafeAreaLayoutGuide() subview.ad_constrainInSuperviewSafeAreaLayoutGuide() - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeArea")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeArea") } it("should constrain in superview with insets") { subview.ad_centerInSuperviewSafeAreaLayoutGuide() subview.ad_constrainInSuperviewSafeAreaLayoutGuide(insets: UIEdgeInsets(value: 100)) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeAreaWithInsets")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeAreaWithInsets") } it("should constrain in superview with left edge") { subview.ad_centerInSuperviewSafeAreaLayoutGuide() subview.ad_constrainInSuperviewSafeAreaLayoutGuide(edges: [.left]) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeAreaWithLeftEdge")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeAreaWithLeftEdge") } } } @@ -282,7 +282,7 @@ class ViewInsertionWithMargin: QuickSpec { @available(iOS 13.0, *) @available(tvOSApplicationExtension 13.0, *) - private func directionalEdgesSpec() { + private static func directionalEdgesSpec() { describe("Pin to superview") { @@ -300,72 +300,72 @@ class ViewInsertionWithMargin: QuickSpec { it("should pin all edges with insets") { subview.ad_pinToSuperview(insets: insets) - expect(view).to(haveValidSnapshot(named: "PinAllEdgesWithInsets")) + assertSnapshot(matching: view, as: .image, named: "PinAllEdgesWithInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinAllEdgesWithInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinAllEdgesWithInsetsRTLForced") } it("should pin top right with insets") { subview.ad_pinToSuperview(directionalEdges: [.top, .trailing], insets: insets) - expect(view).to(haveValidSnapshot(named: "PinTopRightEdgesWithInsets")) + assertSnapshot(matching: view, as: .image, named: "PinTopRightEdgesWithInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinTopRightEdgesWithInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinTopRightEdgesWithInsetsRTLForced") } it("should pin top left with insets") { subview.ad_pinToSuperview(directionalEdges: [.top, .leading], insets: insets) - expect(view).to(haveValidSnapshot(named: "PinTopLeftEdgesWithInsets")) + assertSnapshot(matching: view, as: .image, named: "PinTopLeftEdgesWithInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinTopLeftEdgesWithInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinTopLeftEdgesWithInsetsRTLForced") } it("should pin bottom right with insets") { subview.ad_pinToSuperview(directionalEdges: [.bottom, .trailing], insets: insets) - expect(view).to(haveValidSnapshot(named: "PinBottomRightEdgesWithInsets")) + assertSnapshot(matching: view, as: .image, named: "PinBottomRightEdgesWithInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinBottomRightEdgesWithInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinBottomRightEdgesWithInsetsRTLForced") } it("should pin bottom left with insets") { subview.ad_pinToSuperview(directionalEdges: [.bottom, .leading], insets: insets) - expect(view).to(haveValidSnapshot(named: "PinBottomLeftEdgesWithInsets")) + assertSnapshot(matching: view, as: .image, named: "PinBottomLeftEdgesWithInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinBottomLeftEdgesWithInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinBottomLeftEdgesWithInsetsRTLForced") } it("should pin all edges without insets") { subview.ad_pinToSuperview() - expect(view).to(haveValidSnapshot(named: "PinAllEdgesWithoutInsets")) + assertSnapshot(matching: view, as: .image, named: "PinAllEdgesWithoutInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinAllEdgesWithoutInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinAllEdgesWithoutInsetsRTLForced") } it("should pin top right without insets") { subview.ad_pinToSuperview(directionalEdges: [.top, .trailing]) - expect(view).to(haveValidSnapshot(named: "PinTopRightEdgesWithoutInsets")) + assertSnapshot(matching: view, as: .image, named: "PinTopRightEdgesWithoutInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinTopRightEdgesWithoutInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinTopRightEdgesWithoutInsetsRTLForced") } it("should pin top left without insets") { subview.ad_pinToSuperview(directionalEdges: [.top, .leading]) - expect(view).to(haveValidSnapshot(named: "PinTopLeftEdgesWithoutInsets")) + assertSnapshot(matching: view, as: .image, named: "PinTopLeftEdgesWithoutInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinTopLeftEdgesWithoutInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinTopLeftEdgesWithoutInsetsRTLForced") } it("should pin bottom right without insets") { subview.ad_pinToSuperview(directionalEdges: [.bottom, .trailing]) - expect(view).to(haveValidSnapshot(named: "PinBottomRightEdgesWithoutInsets")) + assertSnapshot(matching: view, as: .image, named: "PinBottomRightEdgesWithoutInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinBottomRightEdgesWithoutInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinBottomRightEdgesWithoutInsetsRTLForced") } it("should pin bottom left without insets") { subview.ad_pinToSuperview(directionalEdges: [.bottom, .leading]) - expect(view).to(haveValidSnapshot(named: "PinBottomLeftEdgesWithoutInsets")) + assertSnapshot(matching: view, as: .image, named: "PinBottomLeftEdgesWithoutInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "PinBottomLeftEdgesWithoutInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "PinBottomLeftEdgesWithoutInsetsRTLForced") } } @@ -383,24 +383,24 @@ class ViewInsertionWithMargin: QuickSpec { it("should center in superview") { subview.ad_centerInSuperview() - expect(view).to(haveValidSnapshot(named: "CenterInSuperview")) - expect(view).to(haveValidSnapshot(named: "CenterInSuperviewRTLForced")) + assertSnapshot(matching: view, as: .image, named: "CenterInSuperview") + assertSnapshot(matching: view, as: .image, named: "CenterInSuperviewRTLForced") } it("should center X in superview") { subview.ad_pinToSuperview(directionalEdges: [.top, .bottom]) subview.ad_centerInSuperview(along: .horizontal) - expect(view).to(haveValidSnapshot(named: "CenterXInSuperview")) + assertSnapshot(matching: view, as: .image, named: "CenterXInSuperview") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "CenterXInSuperviewRTLForced")) + assertSnapshot(matching: view, as: .image, named: "CenterXInSuperviewRTLForced") } it("should center Y in superview") { subview.ad_pinToSuperview(directionalEdges: [.leading, .trailing]) subview.ad_centerInSuperview(along: .vertical) - expect(view).to(haveValidSnapshot(named: "CenterYInSuperview")) + assertSnapshot(matching: view, as: .image, named: "CenterYInSuperview") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "CenterYInSuperviewRTLForced")) + assertSnapshot(matching: view, as: .image, named: "CenterYInSuperviewRTLForced") } } @@ -419,9 +419,9 @@ class ViewInsertionWithMargin: QuickSpec { it("should constrain to size") { subview.ad_constrain(to: CGSize(width: 50, height: 50)) subview.ad_pinToSuperview(directionalEdges: [.top, .leading]) - expect(view).to(haveValidSnapshot(named: "ConstrainToSize")) + assertSnapshot(matching: view, as: .image, named: "ConstrainToSize") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainToSizeRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainToSizeRTLForced") } } @@ -441,57 +441,57 @@ class ViewInsertionWithMargin: QuickSpec { it("should constrain in superview pin bottom left") { subview.ad_pinToSuperview(directionalEdges: [.bottom, .leading], insets: insets) subview.ad_constrainInSuperview(directionalEdges: [.top, .trailing], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewPinBottomLeft")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewPinBottomLeft") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewPinBottomLeftRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewPinBottomLeftRTLForced") } it("should constrain in superview pin bottom right") { subview.ad_pinToSuperview(directionalEdges: [.bottom, .trailing], insets: insets) subview.ad_constrainInSuperview(directionalEdges: [.top, .leading], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewPinBottomRight")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewPinBottomRight") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewPinBottomRightRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewPinBottomRightRTLForced") } it("should constrain in superview pin top left") { subview.ad_pinToSuperview(directionalEdges: [.top, .leading], insets: insets) subview.ad_constrainInSuperview(directionalEdges: [.bottom, .trailing], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewPinTopLeft")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewPinTopLeft") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewPinTopLeftRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewPinTopLeftRTLForced") } it("should constrain in superview pin top right") { subview.ad_pinToSuperview(directionalEdges: [.top, .trailing], insets: insets) subview.ad_constrainInSuperview(directionalEdges: [.bottom, .leading], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewPinTopRight")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewPinTopRight") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewPinTopRightRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewPinTopRightRTLForced") } it("should constrain in superview") { subview.ad_centerInSuperview() subview.ad_constrainInSuperview() - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperview")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperview") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewRTLForced") } it("should constrain in superview with insets") { subview.ad_centerInSuperview() subview.ad_constrainInSuperview(insets: NSDirectionalEdgeInsets(value: 10.0)) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewWithInsets")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewWithInsets") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewWithInsetsRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewWithInsetsRTLForced") } it("should constrain in superview with left edge") { subview.ad_centerInSuperview() subview.ad_constrainInSuperview(directionalEdges: [.leading]) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewWithLeftEdge")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewWithLeftEdge") view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewWithLeftEdgeRTLForced")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewWithLeftEdgeRTLForced") } } @@ -520,13 +520,13 @@ class ViewInsertionWithMargin: QuickSpec { it("should constrain in superview pin bottom leading") { subview.ad_pinToSuperviewSafeAreaLayoutGuide(directionalEdges: [.bottom, .leading], insets: insets) subview.ad_constrainInSuperviewSafeAreaLayoutGuide(directionalEdges: [.top, .trailing], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeAreaPinBottomLeft")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeAreaPinBottomLeft") } it("should constrain in superview pin bottom trailing") { subview.ad_pinToSuperviewSafeAreaLayoutGuide(directionalEdges: [.bottom, .trailing], insets: insets) subview.ad_constrainInSuperviewSafeAreaLayoutGuide(directionalEdges: [.top, .leading], insets: insets) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeAreaPinBottomRight")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeAreaPinBottomRight") } it("should constrain in superview pin top leading") { @@ -535,7 +535,7 @@ class ViewInsertionWithMargin: QuickSpec { directionalEdges: [.bottom, .trailing], insets: insets ) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeAreaPinTopLeft")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeAreaPinTopLeft") } it("should constrain in superview pin top trailing") { @@ -544,33 +544,33 @@ class ViewInsertionWithMargin: QuickSpec { directionalEdges: [.bottom, .leading], insets: insets ) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeAreaPinTopRight")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeAreaPinTopRight") } it("should constrain in superview with directional insets") { subview.ad_centerInSuperviewSafeAreaLayoutGuide() subview.ad_constrainInSuperviewSafeAreaLayoutGuide(insets: NSDirectionalEdgeInsets(value: 100)) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeAreaWithInsets")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeAreaWithInsets") } it("should constrain in superview with leading edge") { subview.ad_centerInSuperviewSafeAreaLayoutGuide() subview.ad_constrainInSuperviewSafeAreaLayoutGuide(directionalEdges: [.leading]) - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeAreaWithLeftEdge")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeAreaWithLeftEdge") } it("should constrain in superview pin bottom leading") { subview.ad_pinToSuperviewSafeAreaLayoutGuide(directionalEdges: [.bottom, .leading], insets: insets) subview.ad_constrainInSuperviewSafeAreaLayoutGuide(directionalEdges: [.top, .trailing], insets: insets) view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeAreaPinBottomLeading")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeAreaPinBottomLeading") } it("should constrain in superview pin bottom trailing") { subview.ad_pinToSuperviewSafeAreaLayoutGuide(directionalEdges: [.bottom, .trailing], insets: insets) subview.ad_constrainInSuperviewSafeAreaLayoutGuide(directionalEdges: [.top, .leading], insets: insets) view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeAreaPinBottomTrailing")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeAreaPinBottomTrailing") } it("should constrain in superview pin top leading") { @@ -580,7 +580,7 @@ class ViewInsertionWithMargin: QuickSpec { insets: insets ) view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeAreaPinTopLeading")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeAreaPinTopLeading") } it("should constrain in superview pin top trailing") { @@ -590,21 +590,21 @@ class ViewInsertionWithMargin: QuickSpec { insets: insets ) view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeAreaPinTopTrailing")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeAreaPinTopTrailing") } it("should constrain in superview with directional insets") { subview.ad_centerInSuperviewSafeAreaLayoutGuide() subview.ad_constrainInSuperviewSafeAreaLayoutGuide(insets: NSDirectionalEdgeInsets(value: 100)) view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeAreaWithInsets")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeAreaWithInsets") } it("should constrain in superview with leading edge") { subview.ad_centerInSuperviewSafeAreaLayoutGuide() subview.ad_constrainInSuperviewSafeAreaLayoutGuide(directionalEdges: [.leading]) view.semanticContentAttribute = .forceRightToLeft - expect(view).to(haveValidSnapshot(named: "ConstrainInSuperviewSafeAreaWithLeftEdge")) + assertSnapshot(matching: view, as: .image, named: "ConstrainInSuperviewSafeAreaWithLeftEdge") } } } diff --git a/Podfile b/Podfile index 0783c8d..6760170 100644 --- a/Podfile +++ b/Podfile @@ -1,4 +1,4 @@ -platform :ios, '10.0' +platform :ios, '13.0' use_frameworks! target 'ADUtilsApp' do @@ -6,10 +6,9 @@ target 'ADUtilsApp' do end target 'ADUtilsTests' do - pod 'Quick', '~> 2.2' - pod 'Nimble', '~> 10.0' - pod 'Nimble-Snapshots', '~> 9.4' - pod 'OCMock', '~> 3.5' + pod 'Quick', '~> 7.0' + pod 'Nimble', '~> 12.0' + pod 'OCMock', '~> 3.9' pod 'ADUtils', :path => './' pod 'ADUtils/Security', :path => './' end diff --git a/Podfile.lock b/Podfile.lock index 543016c..9c3c2e0 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -5,35 +5,22 @@ PODS: - ADUtils/Swift - ADUtils/Security (11.3.0) - ADUtils/Swift (11.3.0) - - iOSSnapshotTestCase (8.0.0): - - iOSSnapshotTestCase/SwiftSupport (= 8.0.0) - - iOSSnapshotTestCase/Core (8.0.0) - - iOSSnapshotTestCase/SwiftSupport (8.0.0): - - iOSSnapshotTestCase/Core - - Nimble (10.0.0) - - Nimble-Snapshots (9.4.0): - - Nimble-Snapshots/Core (= 9.4.0) - - Nimble-Snapshots/Core (9.4.0): - - iOSSnapshotTestCase (~> 8.0) - - Nimble - - OCMock (3.5) - - Quick (2.2.0) + - Nimble (12.0.1) + - OCMock (3.9.1) + - Quick (7.0.2) - SwiftLint (0.42.0) DEPENDENCIES: - ADUtils (from `./`) - ADUtils/Security (from `./`) - - Nimble (~> 10.0) - - Nimble-Snapshots (~> 9.4) - - OCMock (~> 3.5) - - Quick (~> 2.2) + - Nimble (~> 12.0) + - OCMock (~> 3.9) + - Quick (~> 7.0) - SwiftLint (~> 0.42.0) SPEC REPOS: trunk: - - iOSSnapshotTestCase - Nimble - - Nimble-Snapshots - OCMock - Quick - SwiftLint @@ -44,13 +31,11 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: ADUtils: 094de41bd0d4b1ea6f620a62e87fa6dded0bad7b - iOSSnapshotTestCase: a670511f9ee3829c2b9c23e6e68f315fd7b6790f - Nimble: 5316ef81a170ce87baf72dd961f22f89a602ff84 - Nimble-Snapshots: ef281b908c604f78c8313587e25ea92c8ab513d7 - OCMock: 4ab4577fc941af31f4a0398f6e7e230cf21fc72a - Quick: 7fb19e13be07b5dfb3b90d4f9824c855a11af40e + Nimble: b279b3ca9e094508778aab5c76417be158d3ad04 + OCMock: 9491e4bec59e0b267d52a9184ff5605995e74be8 + Quick: efab97aca76d60be86c15daa533b2cdfbe1a74d3 SwiftLint: 4fa9579c63416865179bc416f0a92d55f009600d -PODFILE CHECKSUM: f5c75c5a2afe6743b996d26eefe0ea3251125287 +PODFILE CHECKSUM: a085ff0ceae15032eb100393c6df98696f11d7af COCOAPODS: 1.11.3 From bd8b6e189419e9b3ea10cc6137a303a3805d691c Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Fri, 23 Jun 2023 14:37:09 +0200 Subject: [PATCH 02/16] Move and rename snapshot images for updated snapshot testing lib --- .../spec.DifferentAttributes.png} | Bin .../AttributedStringTest/spec.EmojiInFormat.png} | Bin .../AttributedStringTest/spec.InvertedFormat.png} | Bin .../AttributedStringTest/spec.SameAttributes.png} | Bin .../AttributedStringTest/spec.SingleFormat.png} | Bin .../DynamicFontTest/spec.DynamicFontLayoutTest.png} | Bin ...ionalEdgesSpec.CenterInLayoutGuideRTLForced.png} | Bin ...onalEdgesSpec.CenterXInLayoutGuideRTLForced.png} | Bin ...onalEdgesSpec.CenterYInLayoutGuideRTLForced.png} | Bin ...onstrainInLayoutGuidePinBottomLeftRTLForced.png} | Bin ...nstrainInLayoutGuidePinBottomRightRTLForced.png} | Bin ...c.ConstrainInLayoutGuidePinTopLeftRTLForced.png} | Bin ....ConstrainInLayoutGuidePinTopRightRTLForced.png} | Bin ...alEdgesSpec.ConstrainInLayoutGuideRTLForced.png} | Bin ...c.ConstrainInLayoutGuideWithInsetsRTLForced.png} | Bin ...ConstrainInLayoutGuideWithLeftEdgeRTLForced.png} | Bin ...c.PinToLayoutGuideAllEdgesNoInsetsRTLForced.png} | Bin ...PinToLayoutGuideAllEdgesWithInsetsRTLForced.png} | Bin ...dgesSpec.PinToLayoutGuideNoSubviewRTLForced.png} | Bin ...ayoutGuideTopLeftEdgesHighPriorityRTLForced.png} | Bin ...nToLayoutGuideTopLeftEdgesNoInsetsRTLForced.png} | Bin ...oLayoutGuideTopLeftEdgesWithInsetsRTLForced.png} | Bin .../standardEdgesSpec.CenterInLayoutGuide.png} | Bin .../standardEdgesSpec.CenterXInLayoutGuide.png} | Bin .../standardEdgesSpec.CenterYInLayoutGuide.png} | Bin .../standardEdgesSpec.ConstrainInLayoutGuide.png} | Bin ...gesSpec.ConstrainInLayoutGuidePinBottomLeft.png} | Bin ...esSpec.ConstrainInLayoutGuidePinBottomRight.png} | Bin ...dEdgesSpec.ConstrainInLayoutGuidePinTopLeft.png} | Bin ...EdgesSpec.ConstrainInLayoutGuidePinTopRight.png} | Bin ...dEdgesSpec.ConstrainInLayoutGuideWithInsets.png} | Bin ...dgesSpec.ConstrainInLayoutGuideWithLeftEdge.png} | Bin ...dEdgesSpec.PinToLayoutGuideAllEdgesNoInsets.png} | Bin ...dgesSpec.PinToLayoutGuideAllEdgesWithInsets.png} | Bin ...standardEdgesSpec.PinToLayoutGuideNoSubview.png} | Bin ...ec.PinToLayoutGuideTopLeftEdgesHighPriority.png} | Bin ...esSpec.PinToLayoutGuideTopLeftEdgesNoInsets.png} | Bin ...Spec.PinToLayoutGuideTopLeftEdgesWithInsets.png} | Bin .../spec.HStackViewCustom.png} | Bin .../spec.HStackViewDefault.png} | Bin .../spec.VStackViewCustom.png} | Bin .../spec.VStackViewDefault.png} | Bin .../spec.UIButtonBackgroundColorDisabled.png} | Bin ...spec.UIButtonBackgroundColorDisabledNoColor.png} | Bin .../spec.UIButtonBackgroundColorNormal.png} | Bin .../spec.UIImageColorRedPixel.png} | Bin .../spec.UIImageColorRedWithSize.png} | Bin ...ctionalEdgesSpec.CenterInSuperviewRTLForced.png} | Bin ...tionalEdgesSpec.CenterXInSuperviewRTLForced.png} | Bin ...tionalEdgesSpec.CenterYInSuperviewRTLForced.png} | Bin ....ConstrainInSuperviewPinBottomLeftRTLForced.png} | Bin ...ConstrainInSuperviewPinBottomRightRTLForced.png} | Bin ...pec.ConstrainInSuperviewPinTopLeftRTLForced.png} | Bin ...ec.ConstrainInSuperviewPinTopRightRTLForced.png} | Bin ...onalEdgesSpec.ConstrainInSuperviewRTLForced.png} | Bin ...pec.ConstrainInSuperviewWithInsetsRTLForced.png} | Bin ...c.ConstrainInSuperviewWithLeftEdgeRTLForced.png} | Bin ...rectionalEdgesSpec.ConstrainToSizeRTLForced.png} | Bin ...nalEdgesSpec.PinAllEdgesWithInsetsRTLForced.png} | Bin ...EdgesSpec.PinAllEdgesWithoutInsetsRTLForced.png} | Bin ...sSpec.PinBottomLeftEdgesWithInsetsRTLForced.png} | Bin ...ec.PinBottomLeftEdgesWithoutInsetsRTLForced.png} | Bin ...Spec.PinBottomRightEdgesWithInsetsRTLForced.png} | Bin ...c.PinBottomRightEdgesWithoutInsetsRTLForced.png} | Bin ...dgesSpec.PinTopLeftEdgesWithInsetsRTLForced.png} | Bin ...sSpec.PinTopLeftEdgesWithoutInsetsRTLForced.png} | Bin ...gesSpec.PinTopRightEdgesWithInsetsRTLForced.png} | Bin ...Spec.PinTopRightEdgesWithoutInsetsRTLForced.png} | Bin .../standardEdgesSpec.CenterInSuperview.png} | Bin .../standardEdgesSpec.CenterXInSuperview.png} | Bin .../standardEdgesSpec.CenterYInSuperview.png} | Bin .../standardEdgesSpec.ConstrainInSuperview.png} | Bin ...EdgesSpec.ConstrainInSuperviewPinBottomLeft.png} | Bin ...dgesSpec.ConstrainInSuperviewPinBottomRight.png} | Bin ...ardEdgesSpec.ConstrainInSuperviewPinTopLeft.png} | Bin ...rdEdgesSpec.ConstrainInSuperviewPinTopRight.png} | Bin ...ndardEdgesSpec.ConstrainInSuperviewSafeArea.png} | Bin ...onstrainInSuperviewSafeAreaPinBottomLeading.png} | Bin ...c.ConstrainInSuperviewSafeAreaPinBottomLeft.png} | Bin ....ConstrainInSuperviewSafeAreaPinBottomRight.png} | Bin ...nstrainInSuperviewSafeAreaPinBottomTrailing.png} | Bin ...c.ConstrainInSuperviewSafeAreaPinTopLeading.png} | Bin ...Spec.ConstrainInSuperviewSafeAreaPinTopLeft.png} | Bin ...pec.ConstrainInSuperviewSafeAreaPinTopRight.png} | Bin ....ConstrainInSuperviewSafeAreaPinTopTrailing.png} | Bin ...Spec.ConstrainInSuperviewSafeAreaWithInsets.png} | Bin ...ec.ConstrainInSuperviewSafeAreaWithLeftEdge.png} | Bin ...ardEdgesSpec.ConstrainInSuperviewWithInsets.png} | Bin ...dEdgesSpec.ConstrainInSuperviewWithLeftEdge.png} | Bin .../standardEdgesSpec.ConstrainToSize.png} | Bin .../standardEdgesSpec.PinAllEdgesWithInsets.png} | Bin .../standardEdgesSpec.PinAllEdgesWithoutInsets.png} | Bin ...ndardEdgesSpec.PinBottomLeftEdgesWithInsets.png} | Bin ...rdEdgesSpec.PinBottomLeftEdgesWithoutInsets.png} | Bin ...dardEdgesSpec.PinBottomRightEdgesWithInsets.png} | Bin ...dEdgesSpec.PinBottomRightEdgesWithoutInsets.png} | Bin ...standardEdgesSpec.PinTopLeftEdgesWithInsets.png} | Bin ...ndardEdgesSpec.PinTopLeftEdgesWithoutInsets.png} | Bin ...tandardEdgesSpec.PinTopRightEdgesWithInsets.png} | Bin ...dardEdgesSpec.PinTopRightEdgesWithoutInsets.png} | Bin 100 files changed, 0 insertions(+), 0 deletions(-) rename ADUtilsTests/{ReferenceImages/AttributedStringTest/DifferentAttributes@2x.png => __Snapshots__/AttributedStringTest/spec.DifferentAttributes.png} (100%) rename ADUtilsTests/{ReferenceImages/AttributedStringTest/EmojiInFormat@2x.png => __Snapshots__/AttributedStringTest/spec.EmojiInFormat.png} (100%) rename ADUtilsTests/{ReferenceImages/AttributedStringTest/InvertedFormat@2x.png => __Snapshots__/AttributedStringTest/spec.InvertedFormat.png} (100%) rename ADUtilsTests/{ReferenceImages/AttributedStringTest/SameAttributes@2x.png => __Snapshots__/AttributedStringTest/spec.SameAttributes.png} (100%) rename ADUtilsTests/{ReferenceImages/AttributedStringTest/SingleFormat@2x.png => __Snapshots__/AttributedStringTest/spec.SingleFormat.png} (100%) rename ADUtilsTests/{ReferenceImages/DynamicFontTest/DynamicFontLayoutTest@2x.png => __Snapshots__/DynamicFontTest/spec.DynamicFontLayoutTest.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/CenterInLayoutGuideRTLForced@2x.png => __Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.CenterInLayoutGuideRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/CenterXInLayoutGuideRTLForced@2x.png => __Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.CenterXInLayoutGuideRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/CenterYInLayoutGuideRTLForced@2x.png => __Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.CenterYInLayoutGuideRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinBottomLeftRTLForced@2x.png => __Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinBottomLeftRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinBottomRightRTLForced@2x.png => __Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinBottomRightRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinTopLeftRTLForced@2x.png => __Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinTopLeftRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinTopRightRTLForced@2x.png => __Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinTopRightRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuideRTLForced@2x.png => __Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuideRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuideWithInsetsRTLForced@2x.png => __Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuideWithInsetsRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuideWithLeftEdgeRTLForced@2x.png => __Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuideWithLeftEdgeRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideAllEdgesNoInsetsRTLForced@2x.png => __Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideAllEdgesNoInsetsRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideAllEdgesWithInsetsRTLForced@2x.png => __Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideAllEdgesWithInsetsRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideNoSubviewRTLForced@2x.png => __Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideNoSubviewRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideTopLeftEdgesHighPriorityRTLForced@2x.png => __Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideTopLeftEdgesHighPriorityRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideTopLeftEdgesNoInsetsRTLForced@2x.png => __Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideTopLeftEdgesNoInsetsRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideTopLeftEdgesWithInsetsRTLForced@2x.png => __Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideTopLeftEdgesWithInsetsRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/CenterInLayoutGuide@2x.png => __Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.CenterInLayoutGuide.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/CenterXInLayoutGuide@2x.png => __Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.CenterXInLayoutGuide.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/CenterYInLayoutGuide@2x.png => __Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.CenterYInLayoutGuide.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuide@2x.png => __Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuide.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinBottomLeft@2x.png => __Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuidePinBottomLeft.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinBottomRight@2x.png => __Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuidePinBottomRight.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinTopLeft@2x.png => __Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuidePinTopLeft.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinTopRight@2x.png => __Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuidePinTopRight.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuideWithInsets@2x.png => __Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuideWithInsets.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuideWithLeftEdge@2x.png => __Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuideWithLeftEdge.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideAllEdgesNoInsets@2x.png => __Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.PinToLayoutGuideAllEdgesNoInsets.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideAllEdgesWithInsets@2x.png => __Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.PinToLayoutGuideAllEdgesWithInsets.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideNoSubview@2x.png => __Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.PinToLayoutGuideNoSubview.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideTopLeftEdgesHighPriority@2x.png => __Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.PinToLayoutGuideTopLeftEdgesHighPriority.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideTopLeftEdgesNoInsets@2x.png => __Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.PinToLayoutGuideTopLeftEdgesNoInsets.png} (100%) rename ADUtilsTests/{ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideTopLeftEdgesWithInsets@2x.png => __Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.PinToLayoutGuideTopLeftEdgesWithInsets.png} (100%) rename ADUtilsTests/{ReferenceImages/StackViewBuilderTests/HStackViewCustom@2x.png => __Snapshots__/StackViewBuilderTests/spec.HStackViewCustom.png} (100%) rename ADUtilsTests/{ReferenceImages/StackViewBuilderTests/HStackViewDefault@2x.png => __Snapshots__/StackViewBuilderTests/spec.HStackViewDefault.png} (100%) rename ADUtilsTests/{ReferenceImages/StackViewBuilderTests/VStackViewCustom@2x.png => __Snapshots__/StackViewBuilderTests/spec.VStackViewCustom.png} (100%) rename ADUtilsTests/{ReferenceImages/StackViewBuilderTests/VStackViewDefault@2x.png => __Snapshots__/StackViewBuilderTests/spec.VStackViewDefault.png} (100%) rename ADUtilsTests/{ReferenceImages/UIButtonBackgroundColorTests/UIButtonBackgroundColorDisabled@2x.png => __Snapshots__/UIButtonBackgroundColorTests/spec.UIButtonBackgroundColorDisabled.png} (100%) rename ADUtilsTests/{ReferenceImages/UIButtonBackgroundColorTests/UIButtonBackgroundColorDisabledNoColor@2x.png => __Snapshots__/UIButtonBackgroundColorTests/spec.UIButtonBackgroundColorDisabledNoColor.png} (100%) rename ADUtilsTests/{ReferenceImages/UIButtonBackgroundColorTests/UIButtonBackgroundColorNormal@2x.png => __Snapshots__/UIButtonBackgroundColorTests/spec.UIButtonBackgroundColorNormal.png} (100%) rename ADUtilsTests/{ReferenceImages/UIImageColorTests/UIImageColorRedPixel@2x.png => __Snapshots__/UIImageColorTests/spec.UIImageColorRedPixel.png} (100%) rename ADUtilsTests/{ReferenceImages/UIImageColorTests/UIImageColorRedWithSize@2x.png => __Snapshots__/UIImageColorTests/spec.UIImageColorRedWithSize.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/CenterInSuperviewRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.CenterInSuperviewRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/CenterXInSuperviewRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.CenterXInSuperviewRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/CenterYInSuperviewRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.CenterYInSuperviewRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinBottomLeftRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinBottomLeftRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinBottomRightRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinBottomRightRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinTopLeftRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinTopLeftRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinTopRightRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinTopRightRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewWithInsetsRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewWithInsetsRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewWithLeftEdgeRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewWithLeftEdgeRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainToSizeRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainToSizeRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinAllEdgesWithInsetsRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinAllEdgesWithInsetsRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinAllEdgesWithoutInsetsRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinAllEdgesWithoutInsetsRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinBottomLeftEdgesWithInsetsRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomLeftEdgesWithInsetsRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinBottomLeftEdgesWithoutInsetsRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomLeftEdgesWithoutInsetsRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinBottomRightEdgesWithInsetsRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomRightEdgesWithInsetsRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinBottomRightEdgesWithoutInsetsRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomRightEdgesWithoutInsetsRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinTopLeftEdgesWithInsetsRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopLeftEdgesWithInsetsRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinTopLeftEdgesWithoutInsetsRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopLeftEdgesWithoutInsetsRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinTopRightEdgesWithInsetsRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopRightEdgesWithInsetsRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinTopRightEdgesWithoutInsetsRTLForced@2x.png => __Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopRightEdgesWithoutInsetsRTLForced.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/CenterInSuperview@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.CenterInSuperview.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/CenterXInSuperview@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.CenterXInSuperview.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/CenterYInSuperview@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.CenterYInSuperview.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperview@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperview.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinBottomLeft@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewPinBottomLeft.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinBottomRight@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewPinBottomRight.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinTopLeft@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewPinTopLeft.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinTopRight@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewPinTopRight.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeArea@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeArea.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinBottomLeading@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomLeading.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinBottomLeft@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomLeft.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinBottomRight@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomRight.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinBottomTrailing@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomTrailing.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinTopLeading@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinTopLeading.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinTopLeft@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinTopLeft.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinTopRight@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinTopRight.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinTopTrailing@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinTopTrailing.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaWithInsets@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaWithInsets.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaWithLeftEdge@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaWithLeftEdge.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewWithInsets@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewWithInsets.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewWithLeftEdge@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewWithLeftEdge.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/ConstrainToSize@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainToSize.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinAllEdgesWithInsets@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinAllEdgesWithInsets.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinAllEdgesWithoutInsets@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinAllEdgesWithoutInsets.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinBottomLeftEdgesWithInsets@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinBottomLeftEdgesWithInsets.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinBottomLeftEdgesWithoutInsets@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinBottomLeftEdgesWithoutInsets.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinBottomRightEdgesWithInsets@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinBottomRightEdgesWithInsets.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinBottomRightEdgesWithoutInsets@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinBottomRightEdgesWithoutInsets.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinTopLeftEdgesWithInsets@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinTopLeftEdgesWithInsets.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinTopLeftEdgesWithoutInsets@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinTopLeftEdgesWithoutInsets.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinTopRightEdgesWithInsets@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinTopRightEdgesWithInsets.png} (100%) rename ADUtilsTests/{ReferenceImages/ViewInsertionWithMarginTest/PinTopRightEdgesWithoutInsets@2x.png => __Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinTopRightEdgesWithoutInsets.png} (100%) diff --git a/ADUtilsTests/ReferenceImages/AttributedStringTest/DifferentAttributes@2x.png b/ADUtilsTests/__Snapshots__/AttributedStringTest/spec.DifferentAttributes.png similarity index 100% rename from ADUtilsTests/ReferenceImages/AttributedStringTest/DifferentAttributes@2x.png rename to ADUtilsTests/__Snapshots__/AttributedStringTest/spec.DifferentAttributes.png diff --git a/ADUtilsTests/ReferenceImages/AttributedStringTest/EmojiInFormat@2x.png b/ADUtilsTests/__Snapshots__/AttributedStringTest/spec.EmojiInFormat.png similarity index 100% rename from ADUtilsTests/ReferenceImages/AttributedStringTest/EmojiInFormat@2x.png rename to ADUtilsTests/__Snapshots__/AttributedStringTest/spec.EmojiInFormat.png diff --git a/ADUtilsTests/ReferenceImages/AttributedStringTest/InvertedFormat@2x.png b/ADUtilsTests/__Snapshots__/AttributedStringTest/spec.InvertedFormat.png similarity index 100% rename from ADUtilsTests/ReferenceImages/AttributedStringTest/InvertedFormat@2x.png rename to ADUtilsTests/__Snapshots__/AttributedStringTest/spec.InvertedFormat.png diff --git a/ADUtilsTests/ReferenceImages/AttributedStringTest/SameAttributes@2x.png b/ADUtilsTests/__Snapshots__/AttributedStringTest/spec.SameAttributes.png similarity index 100% rename from ADUtilsTests/ReferenceImages/AttributedStringTest/SameAttributes@2x.png rename to ADUtilsTests/__Snapshots__/AttributedStringTest/spec.SameAttributes.png diff --git a/ADUtilsTests/ReferenceImages/AttributedStringTest/SingleFormat@2x.png b/ADUtilsTests/__Snapshots__/AttributedStringTest/spec.SingleFormat.png similarity index 100% rename from ADUtilsTests/ReferenceImages/AttributedStringTest/SingleFormat@2x.png rename to ADUtilsTests/__Snapshots__/AttributedStringTest/spec.SingleFormat.png diff --git a/ADUtilsTests/ReferenceImages/DynamicFontTest/DynamicFontLayoutTest@2x.png b/ADUtilsTests/__Snapshots__/DynamicFontTest/spec.DynamicFontLayoutTest.png similarity index 100% rename from ADUtilsTests/ReferenceImages/DynamicFontTest/DynamicFontLayoutTest@2x.png rename to ADUtilsTests/__Snapshots__/DynamicFontTest/spec.DynamicFontLayoutTest.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/CenterInLayoutGuideRTLForced@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.CenterInLayoutGuideRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/CenterInLayoutGuideRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.CenterInLayoutGuideRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/CenterXInLayoutGuideRTLForced@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.CenterXInLayoutGuideRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/CenterXInLayoutGuideRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.CenterXInLayoutGuideRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/CenterYInLayoutGuideRTLForced@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.CenterYInLayoutGuideRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/CenterYInLayoutGuideRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.CenterYInLayoutGuideRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinBottomLeftRTLForced@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinBottomLeftRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinBottomLeftRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinBottomLeftRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinBottomRightRTLForced@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinBottomRightRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinBottomRightRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinBottomRightRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinTopLeftRTLForced@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinTopLeftRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinTopLeftRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinTopLeftRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinTopRightRTLForced@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinTopRightRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinTopRightRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinTopRightRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuideRTLForced@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuideRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuideRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuideRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuideWithInsetsRTLForced@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuideWithInsetsRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuideWithInsetsRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuideWithInsetsRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuideWithLeftEdgeRTLForced@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuideWithLeftEdgeRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuideWithLeftEdgeRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuideWithLeftEdgeRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideAllEdgesNoInsetsRTLForced@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideAllEdgesNoInsetsRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideAllEdgesNoInsetsRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideAllEdgesNoInsetsRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideAllEdgesWithInsetsRTLForced@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideAllEdgesWithInsetsRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideAllEdgesWithInsetsRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideAllEdgesWithInsetsRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideNoSubviewRTLForced@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideNoSubviewRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideNoSubviewRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideNoSubviewRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideTopLeftEdgesHighPriorityRTLForced@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideTopLeftEdgesHighPriorityRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideTopLeftEdgesHighPriorityRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideTopLeftEdgesHighPriorityRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideTopLeftEdgesNoInsetsRTLForced@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideTopLeftEdgesNoInsetsRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideTopLeftEdgesNoInsetsRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideTopLeftEdgesNoInsetsRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideTopLeftEdgesWithInsetsRTLForced@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideTopLeftEdgesWithInsetsRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideTopLeftEdgesWithInsetsRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideTopLeftEdgesWithInsetsRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/CenterInLayoutGuide@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.CenterInLayoutGuide.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/CenterInLayoutGuide@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.CenterInLayoutGuide.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/CenterXInLayoutGuide@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.CenterXInLayoutGuide.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/CenterXInLayoutGuide@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.CenterXInLayoutGuide.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/CenterYInLayoutGuide@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.CenterYInLayoutGuide.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/CenterYInLayoutGuide@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.CenterYInLayoutGuide.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuide@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuide.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuide@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuide.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinBottomLeft@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuidePinBottomLeft.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinBottomLeft@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuidePinBottomLeft.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinBottomRight@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuidePinBottomRight.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinBottomRight@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuidePinBottomRight.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinTopLeft@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuidePinTopLeft.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinTopLeft@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuidePinTopLeft.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinTopRight@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuidePinTopRight.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuidePinTopRight@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuidePinTopRight.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuideWithInsets@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuideWithInsets.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuideWithInsets@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuideWithInsets.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuideWithLeftEdge@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuideWithLeftEdge.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/ConstrainInLayoutGuideWithLeftEdge@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.ConstrainInLayoutGuideWithLeftEdge.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideAllEdgesNoInsets@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.PinToLayoutGuideAllEdgesNoInsets.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideAllEdgesNoInsets@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.PinToLayoutGuideAllEdgesNoInsets.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideAllEdgesWithInsets@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.PinToLayoutGuideAllEdgesWithInsets.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideAllEdgesWithInsets@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.PinToLayoutGuideAllEdgesWithInsets.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideNoSubview@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.PinToLayoutGuideNoSubview.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideNoSubview@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.PinToLayoutGuideNoSubview.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideTopLeftEdgesHighPriority@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.PinToLayoutGuideTopLeftEdgesHighPriority.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideTopLeftEdgesHighPriority@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.PinToLayoutGuideTopLeftEdgesHighPriority.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideTopLeftEdgesNoInsets@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.PinToLayoutGuideTopLeftEdgesNoInsets.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideTopLeftEdgesNoInsets@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.PinToLayoutGuideTopLeftEdgesNoInsets.png diff --git a/ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideTopLeftEdgesWithInsets@2x.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.PinToLayoutGuideTopLeftEdgesWithInsets.png similarity index 100% rename from ADUtilsTests/ReferenceImages/LayoutGuideConstraintsTests/PinToLayoutGuideTopLeftEdgesWithInsets@2x.png rename to ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/standardEdgesSpec.PinToLayoutGuideTopLeftEdgesWithInsets.png diff --git a/ADUtilsTests/ReferenceImages/StackViewBuilderTests/HStackViewCustom@2x.png b/ADUtilsTests/__Snapshots__/StackViewBuilderTests/spec.HStackViewCustom.png similarity index 100% rename from ADUtilsTests/ReferenceImages/StackViewBuilderTests/HStackViewCustom@2x.png rename to ADUtilsTests/__Snapshots__/StackViewBuilderTests/spec.HStackViewCustom.png diff --git a/ADUtilsTests/ReferenceImages/StackViewBuilderTests/HStackViewDefault@2x.png b/ADUtilsTests/__Snapshots__/StackViewBuilderTests/spec.HStackViewDefault.png similarity index 100% rename from ADUtilsTests/ReferenceImages/StackViewBuilderTests/HStackViewDefault@2x.png rename to ADUtilsTests/__Snapshots__/StackViewBuilderTests/spec.HStackViewDefault.png diff --git a/ADUtilsTests/ReferenceImages/StackViewBuilderTests/VStackViewCustom@2x.png b/ADUtilsTests/__Snapshots__/StackViewBuilderTests/spec.VStackViewCustom.png similarity index 100% rename from ADUtilsTests/ReferenceImages/StackViewBuilderTests/VStackViewCustom@2x.png rename to ADUtilsTests/__Snapshots__/StackViewBuilderTests/spec.VStackViewCustom.png diff --git a/ADUtilsTests/ReferenceImages/StackViewBuilderTests/VStackViewDefault@2x.png b/ADUtilsTests/__Snapshots__/StackViewBuilderTests/spec.VStackViewDefault.png similarity index 100% rename from ADUtilsTests/ReferenceImages/StackViewBuilderTests/VStackViewDefault@2x.png rename to ADUtilsTests/__Snapshots__/StackViewBuilderTests/spec.VStackViewDefault.png diff --git a/ADUtilsTests/ReferenceImages/UIButtonBackgroundColorTests/UIButtonBackgroundColorDisabled@2x.png b/ADUtilsTests/__Snapshots__/UIButtonBackgroundColorTests/spec.UIButtonBackgroundColorDisabled.png similarity index 100% rename from ADUtilsTests/ReferenceImages/UIButtonBackgroundColorTests/UIButtonBackgroundColorDisabled@2x.png rename to ADUtilsTests/__Snapshots__/UIButtonBackgroundColorTests/spec.UIButtonBackgroundColorDisabled.png diff --git a/ADUtilsTests/ReferenceImages/UIButtonBackgroundColorTests/UIButtonBackgroundColorDisabledNoColor@2x.png b/ADUtilsTests/__Snapshots__/UIButtonBackgroundColorTests/spec.UIButtonBackgroundColorDisabledNoColor.png similarity index 100% rename from ADUtilsTests/ReferenceImages/UIButtonBackgroundColorTests/UIButtonBackgroundColorDisabledNoColor@2x.png rename to ADUtilsTests/__Snapshots__/UIButtonBackgroundColorTests/spec.UIButtonBackgroundColorDisabledNoColor.png diff --git a/ADUtilsTests/ReferenceImages/UIButtonBackgroundColorTests/UIButtonBackgroundColorNormal@2x.png b/ADUtilsTests/__Snapshots__/UIButtonBackgroundColorTests/spec.UIButtonBackgroundColorNormal.png similarity index 100% rename from ADUtilsTests/ReferenceImages/UIButtonBackgroundColorTests/UIButtonBackgroundColorNormal@2x.png rename to ADUtilsTests/__Snapshots__/UIButtonBackgroundColorTests/spec.UIButtonBackgroundColorNormal.png diff --git a/ADUtilsTests/ReferenceImages/UIImageColorTests/UIImageColorRedPixel@2x.png b/ADUtilsTests/__Snapshots__/UIImageColorTests/spec.UIImageColorRedPixel.png similarity index 100% rename from ADUtilsTests/ReferenceImages/UIImageColorTests/UIImageColorRedPixel@2x.png rename to ADUtilsTests/__Snapshots__/UIImageColorTests/spec.UIImageColorRedPixel.png diff --git a/ADUtilsTests/ReferenceImages/UIImageColorTests/UIImageColorRedWithSize@2x.png b/ADUtilsTests/__Snapshots__/UIImageColorTests/spec.UIImageColorRedWithSize.png similarity index 100% rename from ADUtilsTests/ReferenceImages/UIImageColorTests/UIImageColorRedWithSize@2x.png rename to ADUtilsTests/__Snapshots__/UIImageColorTests/spec.UIImageColorRedWithSize.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/CenterInSuperviewRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.CenterInSuperviewRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/CenterInSuperviewRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.CenterInSuperviewRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/CenterXInSuperviewRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.CenterXInSuperviewRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/CenterXInSuperviewRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.CenterXInSuperviewRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/CenterYInSuperviewRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.CenterYInSuperviewRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/CenterYInSuperviewRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.CenterYInSuperviewRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinBottomLeftRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinBottomLeftRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinBottomLeftRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinBottomLeftRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinBottomRightRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinBottomRightRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinBottomRightRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinBottomRightRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinTopLeftRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinTopLeftRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinTopLeftRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinTopLeftRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinTopRightRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinTopRightRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinTopRightRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinTopRightRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewWithInsetsRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewWithInsetsRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewWithInsetsRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewWithInsetsRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewWithLeftEdgeRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewWithLeftEdgeRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewWithLeftEdgeRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewWithLeftEdgeRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainToSizeRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainToSizeRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainToSizeRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainToSizeRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinAllEdgesWithInsetsRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinAllEdgesWithInsetsRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinAllEdgesWithInsetsRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinAllEdgesWithInsetsRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinAllEdgesWithoutInsetsRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinAllEdgesWithoutInsetsRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinAllEdgesWithoutInsetsRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinAllEdgesWithoutInsetsRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinBottomLeftEdgesWithInsetsRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomLeftEdgesWithInsetsRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinBottomLeftEdgesWithInsetsRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomLeftEdgesWithInsetsRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinBottomLeftEdgesWithoutInsetsRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomLeftEdgesWithoutInsetsRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinBottomLeftEdgesWithoutInsetsRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomLeftEdgesWithoutInsetsRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinBottomRightEdgesWithInsetsRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomRightEdgesWithInsetsRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinBottomRightEdgesWithInsetsRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomRightEdgesWithInsetsRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinBottomRightEdgesWithoutInsetsRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomRightEdgesWithoutInsetsRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinBottomRightEdgesWithoutInsetsRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomRightEdgesWithoutInsetsRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinTopLeftEdgesWithInsetsRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopLeftEdgesWithInsetsRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinTopLeftEdgesWithInsetsRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopLeftEdgesWithInsetsRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinTopLeftEdgesWithoutInsetsRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopLeftEdgesWithoutInsetsRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinTopLeftEdgesWithoutInsetsRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopLeftEdgesWithoutInsetsRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinTopRightEdgesWithInsetsRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopRightEdgesWithInsetsRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinTopRightEdgesWithInsetsRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopRightEdgesWithInsetsRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinTopRightEdgesWithoutInsetsRTLForced@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopRightEdgesWithoutInsetsRTLForced.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinTopRightEdgesWithoutInsetsRTLForced@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopRightEdgesWithoutInsetsRTLForced.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/CenterInSuperview@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.CenterInSuperview.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/CenterInSuperview@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.CenterInSuperview.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/CenterXInSuperview@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.CenterXInSuperview.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/CenterXInSuperview@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.CenterXInSuperview.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/CenterYInSuperview@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.CenterYInSuperview.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/CenterYInSuperview@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.CenterYInSuperview.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperview@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperview.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperview@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperview.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinBottomLeft@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewPinBottomLeft.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinBottomLeft@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewPinBottomLeft.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinBottomRight@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewPinBottomRight.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinBottomRight@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewPinBottomRight.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinTopLeft@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewPinTopLeft.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinTopLeft@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewPinTopLeft.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinTopRight@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewPinTopRight.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewPinTopRight@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewPinTopRight.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeArea@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeArea.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeArea@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeArea.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinBottomLeading@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomLeading.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinBottomLeading@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomLeading.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinBottomLeft@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomLeft.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinBottomLeft@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomLeft.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinBottomRight@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomRight.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinBottomRight@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomRight.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinBottomTrailing@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomTrailing.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinBottomTrailing@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomTrailing.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinTopLeading@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinTopLeading.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinTopLeading@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinTopLeading.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinTopLeft@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinTopLeft.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinTopLeft@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinTopLeft.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinTopRight@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinTopRight.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinTopRight@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinTopRight.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinTopTrailing@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinTopTrailing.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaPinTopTrailing@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinTopTrailing.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaWithInsets@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaWithInsets.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaWithInsets@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaWithInsets.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaWithLeftEdge@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaWithLeftEdge.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewSafeAreaWithLeftEdge@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaWithLeftEdge.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewWithInsets@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewWithInsets.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewWithInsets@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewWithInsets.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewWithLeftEdge@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewWithLeftEdge.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainInSuperviewWithLeftEdge@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewWithLeftEdge.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainToSize@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainToSize.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/ConstrainToSize@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainToSize.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinAllEdgesWithInsets@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinAllEdgesWithInsets.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinAllEdgesWithInsets@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinAllEdgesWithInsets.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinAllEdgesWithoutInsets@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinAllEdgesWithoutInsets.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinAllEdgesWithoutInsets@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinAllEdgesWithoutInsets.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinBottomLeftEdgesWithInsets@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinBottomLeftEdgesWithInsets.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinBottomLeftEdgesWithInsets@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinBottomLeftEdgesWithInsets.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinBottomLeftEdgesWithoutInsets@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinBottomLeftEdgesWithoutInsets.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinBottomLeftEdgesWithoutInsets@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinBottomLeftEdgesWithoutInsets.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinBottomRightEdgesWithInsets@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinBottomRightEdgesWithInsets.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinBottomRightEdgesWithInsets@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinBottomRightEdgesWithInsets.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinBottomRightEdgesWithoutInsets@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinBottomRightEdgesWithoutInsets.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinBottomRightEdgesWithoutInsets@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinBottomRightEdgesWithoutInsets.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinTopLeftEdgesWithInsets@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinTopLeftEdgesWithInsets.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinTopLeftEdgesWithInsets@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinTopLeftEdgesWithInsets.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinTopLeftEdgesWithoutInsets@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinTopLeftEdgesWithoutInsets.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinTopLeftEdgesWithoutInsets@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinTopLeftEdgesWithoutInsets.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinTopRightEdgesWithInsets@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinTopRightEdgesWithInsets.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinTopRightEdgesWithInsets@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinTopRightEdgesWithInsets.png diff --git a/ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinTopRightEdgesWithoutInsets@2x.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinTopRightEdgesWithoutInsets.png similarity index 100% rename from ADUtilsTests/ReferenceImages/ViewInsertionWithMarginTest/PinTopRightEdgesWithoutInsets@2x.png rename to ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.PinTopRightEdgesWithoutInsets.png From 4692f675af6add3946d1afb738131e09a02c5a17 Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Fri, 23 Jun 2023 15:20:44 +0200 Subject: [PATCH 03/16] Generate missing snapshots Before those screenshots where shared with other tests, but with the lib update each method should have its own reference images --- ...directionalEdgesSpec.CenterInLayoutGuide.png | Bin 0 -> 4653 bytes ...irectionalEdgesSpec.CenterXInLayoutGuide.png | Bin 0 -> 5745 bytes ...irectionalEdgesSpec.CenterYInLayoutGuide.png | Bin 0 -> 4370 bytes ...ectionalEdgesSpec.ConstrainInLayoutGuide.png | Bin 0 -> 5123 bytes ...Spec.ConstrainInLayoutGuidePinBottomLeft.png | Bin 0 -> 5158 bytes ...pec.ConstrainInLayoutGuidePinBottomRight.png | Bin 0 -> 5158 bytes ...gesSpec.ConstrainInLayoutGuidePinTopLeft.png | Bin 0 -> 5158 bytes ...esSpec.ConstrainInLayoutGuidePinTopRight.png | Bin 0 -> 5158 bytes ...gesSpec.ConstrainInLayoutGuideWithInsets.png | Bin 0 -> 5969 bytes ...sSpec.ConstrainInLayoutGuideWithLeftEdge.png | Bin 0 -> 5136 bytes ...gesSpec.PinToLayoutGuideAllEdgesNoInsets.png | Bin 0 -> 5123 bytes ...sSpec.PinToLayoutGuideAllEdgesWithInsets.png | Bin 0 -> 5112 bytes ...ionalEdgesSpec.PinToLayoutGuideNoSubview.png | Bin 0 -> 3901 bytes ...PinToLayoutGuideTopLeftEdgesHighPriority.png | Bin 0 -> 4141 bytes ...pec.PinToLayoutGuideTopLeftEdgesNoInsets.png | Bin 0 -> 4128 bytes ...c.PinToLayoutGuideTopLeftEdgesWithInsets.png | Bin 0 -> 4141 bytes .../directionalEdgesSpec.CenterInSuperview.png | Bin 0 -> 4653 bytes .../directionalEdgesSpec.CenterXInSuperview.png | Bin 0 -> 5896 bytes .../directionalEdgesSpec.CenterYInSuperview.png | Bin 0 -> 4171 bytes ...irectionalEdgesSpec.ConstrainInSuperview.png | Bin 0 -> 4442 bytes ...esSpec.ConstrainInSuperviewPinBottomLeft.png | Bin 0 -> 5695 bytes ...sSpec.ConstrainInSuperviewPinBottomRight.png | Bin 0 -> 5695 bytes ...EdgesSpec.ConstrainInSuperviewPinTopLeft.png | Bin 0 -> 5695 bytes ...dgesSpec.ConstrainInSuperviewPinTopRight.png | Bin 0 -> 5695 bytes ...trainInSuperviewSafeAreaPinBottomLeading.png | Bin 0 -> 31568 bytes ...onstrainInSuperviewSafeAreaPinBottomLeft.png | Bin 0 -> 27914 bytes ...nstrainInSuperviewSafeAreaPinBottomRight.png | Bin 0 -> 27914 bytes ...rainInSuperviewSafeAreaPinBottomTrailing.png | Bin 0 -> 31568 bytes ...onstrainInSuperviewSafeAreaPinTopLeading.png | Bin 0 -> 31575 bytes ...c.ConstrainInSuperviewSafeAreaPinTopLeft.png | Bin 0 -> 28089 bytes ....ConstrainInSuperviewSafeAreaPinTopRight.png | Bin 0 -> 28089 bytes ...nstrainInSuperviewSafeAreaPinTopTrailing.png | Bin 0 -> 31575 bytes ...c.ConstrainInSuperviewSafeAreaWithInsets.png | Bin 0 -> 29537 bytes ...ConstrainInSuperviewSafeAreaWithLeftEdge.png | Bin 0 -> 29018 bytes ...EdgesSpec.ConstrainInSuperviewWithInsets.png | Bin 0 -> 5123 bytes ...gesSpec.ConstrainInSuperviewWithLeftEdge.png | Bin 0 -> 4442 bytes .../directionalEdgesSpec.ConstrainToSize.png | Bin 0 -> 4075 bytes ...rectionalEdgesSpec.PinAllEdgesWithInsets.png | Bin 0 -> 5490 bytes ...tionalEdgesSpec.PinAllEdgesWithoutInsets.png | Bin 0 -> 4442 bytes ...alEdgesSpec.PinBottomLeftEdgesWithInsets.png | Bin 0 -> 4061 bytes ...dgesSpec.PinBottomLeftEdgesWithoutInsets.png | Bin 0 -> 3981 bytes ...lEdgesSpec.PinBottomRightEdgesWithInsets.png | Bin 0 -> 4602 bytes ...gesSpec.PinBottomRightEdgesWithoutInsets.png | Bin 0 -> 4138 bytes ...ionalEdgesSpec.PinTopLeftEdgesWithInsets.png | Bin 0 -> 4121 bytes ...alEdgesSpec.PinTopLeftEdgesWithoutInsets.png | Bin 0 -> 4075 bytes ...onalEdgesSpec.PinTopRightEdgesWithInsets.png | Bin 0 -> 4636 bytes ...lEdgesSpec.PinTopRightEdgesWithoutInsets.png | Bin 0 -> 4278 bytes 47 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.CenterInLayoutGuide.png create mode 100644 ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.CenterXInLayoutGuide.png create mode 100644 ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.CenterYInLayoutGuide.png create mode 100644 ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuide.png create mode 100644 ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinBottomLeft.png create mode 100644 ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinBottomRight.png create mode 100644 ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinTopLeft.png create mode 100644 ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinTopRight.png create mode 100644 ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuideWithInsets.png create mode 100644 ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuideWithLeftEdge.png create mode 100644 ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideAllEdgesNoInsets.png create mode 100644 ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideAllEdgesWithInsets.png create mode 100644 ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideNoSubview.png create mode 100644 ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideTopLeftEdgesHighPriority.png create mode 100644 ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideTopLeftEdgesNoInsets.png create mode 100644 ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideTopLeftEdgesWithInsets.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.CenterInSuperview.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.CenterXInSuperview.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.CenterYInSuperview.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperview.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinBottomLeft.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinBottomRight.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinTopLeft.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinTopRight.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomLeading.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomLeft.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomRight.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomTrailing.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinTopLeading.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinTopLeft.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinTopRight.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinTopTrailing.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaWithInsets.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaWithLeftEdge.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewWithInsets.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewWithLeftEdge.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainToSize.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinAllEdgesWithInsets.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinAllEdgesWithoutInsets.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomLeftEdgesWithInsets.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomLeftEdgesWithoutInsets.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomRightEdgesWithInsets.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomRightEdgesWithoutInsets.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopLeftEdgesWithInsets.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopLeftEdgesWithoutInsets.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopRightEdgesWithInsets.png create mode 100644 ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopRightEdgesWithoutInsets.png diff --git a/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.CenterInLayoutGuide.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.CenterInLayoutGuide.png new file mode 100644 index 0000000000000000000000000000000000000000..dc5163ebaf370b5b57986311a9575f1a7b8ee570 GIT binary patch literal 4653 zcmeHL-%C?b96#smIPaXJ>m(^PyXBQE>>(*33%Rr9b_0JT3zJ3+L1AHHNw|k{cMHl1 z>KfKd!3IG{59WF(1Sturg(meN8Hg>BB1o8)m6WaTxwHBMdhy|2_}=fi-~0W1&*kv> ze)(_%bu~6qMs5Z|$RyjX^$6i0Gfoc?<#E|0INVWht3*Rn`5)oI(|l5HsjfzQV9gO{z&Y#fZ}{;e78`RMDj z;0*2d#twvXikM-!UQ9qR-)*gRfQJp$D+c#sFy_IyHh)*B2Yk6~wKzQZ)3l|BNIbP9 zlkU#1MnjtEN<5mLXE@dsBy%l_X6% zRxU`X7(KX?mBdko>8kYLQ18Tg={`}N?#?rV2o-nwL{pDOh}|7 zluSBvUhW1J5oao5ar#w2XUR;ndV@%+ijQUpSDaH zN4+Eck{}dx&M$e5+kMj5L`GfjMMBO`jNKM_j>> zNbV}73pac=S>X8~nvU%fgol}jj}f1u(7`ITmEy%U^@Zdy;dtp zZCgD9lwfSow$u*xzvv@M%9vkKN}O-{K#->R76K`1B;P4G#)Iyr%f56;yjxJ41~&TBm5kp?AZ~!}um=`L_$v6H{yO_XNpD KYpg?+F8^=W+kY$o literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.CenterXInLayoutGuide.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.CenterXInLayoutGuide.png new file mode 100644 index 0000000000000000000000000000000000000000..717ed328005cbe6820841a0d9e630a3de3d2f21e GIT binary patch literal 5745 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR36dZq>N7&jr%UJY5_^Dj45fb?jnt5MXiq|37p4cW!1**0u+QQas$BK7UnoXkcJu z;%A!QZaz;y0mx}w-yp%r$i%{7!^v?%c(ywWhk$~Df*DwuKNHiZBhLguvK$?}Ams-p zH#FF6taJex!j!}eQv5+hLBT&qP7o;D&~O7NPD7(EaMa{Q?XzY(yZ_Crer}Ev{rn2Q ze?HnM-2eaop>_v_gh<9!lhqXzqS@R$6$At(FkC$;EHFWrd9jKB2Zu+)t0zD&PHPMl z;$UG>aVY)7!jf|OfCeWE6O+&at4b!OO{ob}SeO_YIRoa}Ff!gWGVo$*Y-nIv;Ww|L zAxBa|wb8-Bfhk1Y-@#!UPtPO=U@(nZHyW6uNo6!6jFu{+W#(v&Fj~EiHXev*8vOw_ zg#Z5!p7ya0*kauQYO%h(dN7m4QGn&(=ld^1Pj|F5bu!m-n=NzwXJ^mUdf@%{+J9v{ zUFO?Tq{q?m%+cn_d0 zzFFXky8zna^98r@ETAnuHE@~ literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.CenterYInLayoutGuide.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.CenterYInLayoutGuide.png new file mode 100644 index 0000000000000000000000000000000000000000..8ae0248683fac92be8f2798b87107e7842290b2d GIT binary patch literal 4370 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR34{)P7Y)1NrQqJY5_^Dj45f56n^y6ks{H^Z!!Sxr#HHOphF@+a`I4^Xs3QKgtdb z42(>U4>-;JI0O_N8V($9=m3eZOln~C%;^J(9caiH6&VeU(UdTn3r2GR)?D!5FJon$ z{iS*~sS6Ek|JFB7H$UId@#nwNck7SV7Y{6BWPYSCQ~xm2fmzCfS3=<7l7c-i%=E3+ z#ps(RIPi2ZUTk19nIL7LaLDsvOqJ@-u=Q2EIY2Jkk%o*>Eu$euWP+)vbl3-M0Q~Pv6U;@51zWNoMb$__!yY%Ug>b6!vHz5l)H z+JQP|V6v7F;00Q_5@^;Ok-qB>|GmCo{;7AJG7jIT~|8*quZ(ycjPI53=z{tA< zXmCN0MO^#u_0IQCnD5Fv05ptw5zuK0z`WEl`Owa~n?GvTr}MrsN6%UnvhViu)hgeA zv5OIC7*7YA$%4i!4UB?*T+e@{KK{OU-l&HLO$;^uWUTyIf8o3!s71Q$z~?#N+d*wo zjz4+{4t3_mj-Z;jzkzWgBS=t%k$KV$8IaNj#*1KOqavfBF`5!abHQjXfaZcm`+`-| W_Os|OlLEF77(8A5T-G@yGywotvHctX literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuide.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuide.png new file mode 100644 index 0000000000000000000000000000000000000000..5589a0848d5a4927502544efe07746d0ce0c3078 GIT binary patch literal 5123 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR34{=LgWsrel0s?Gc4GOvn3Yli|kznH+3?SBJGBSE@ z{&@myBTEa|3^5OG4v$%9-N800DDZ&H*x(T5;BYC&ZWGve#zagf?vbDH{JZks?TpMk z1|RC#;_~J-IQ*+W@z?K)vcEE)GC@ zVdBp(O?|Ro10y#*#POXFXJGjM|Ad*i zKCs!<3Tk$}z3$kh94X-9c=!LMRcn-AOk~`*p)FEN@{#o4J@)sv|F5yTzyAN724Jh> zhVh3__rIUN|4sjYV;X<2`A0Qi>m~oeQ+xLKFZu%inUaBu)Oa~KW=uBFjp3f&Sj)_$ zq`-8Dftg2znTg4-DOvX2dguHnz3X^6IvRkjG#-NqJRBSroaer7`dIsV=BWD7@EJ`H zqxogDd>AbcN9&8x`VrV3_{>=Ov;M;Km;bP0l+XkKcs+RR literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinBottomLeft.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinBottomLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..57dfdd192e9fd57bed513acfbfb7562235076a4b GIT binary patch literal 5158 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR34{Put%7vIa;`_jGX#sbG9_^|t2wdfg1pVx4H$M z?>)B|+yGG9Yxpql{9JGYKxvD(;<@U%?%)Q1PgU}vyYsBU4FH!6eWy9!t@^y_Y^%#kJLYIol5ybNy1w0u)KQn~)~s7FR)1k|=1O4+M{ONN9 z_Iax~B__m`>$wA&en4jMA2|?nRCF{PM$-co^Ti(q?Tve!y!Pz61sX*2boFyt=akR{ E0Q%+2x&QzG literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinBottomRight.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinBottomRight.png new file mode 100644 index 0000000000000000000000000000000000000000..57dfdd192e9fd57bed513acfbfb7562235076a4b GIT binary patch literal 5158 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR34{Put%7vIa;`_jGX#sbG9_^|t2wdfg1pVx4H$M z?>)B|+yGG9Yxpql{9JGYKxvD(;<@U%?%)Q1PgU}vyYsBU4FH!6eWy9!t@^y_Y^%#kJLYIol5ybNy1w0u)KQn~)~s7FR)1k|=1O4+M{ONN9 z_Iax~B__m`>$wA&en4jMA2|?nRCF{PM$-co^Ti(q?Tve!y!Pz61sX*2boFyt=akR{ E0Q%+2x&QzG literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinTopLeft.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinTopLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..57dfdd192e9fd57bed513acfbfb7562235076a4b GIT binary patch literal 5158 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR34{Put%7vIa;`_jGX#sbG9_^|t2wdfg1pVx4H$M z?>)B|+yGG9Yxpql{9JGYKxvD(;<@U%?%)Q1PgU}vyYsBU4FH!6eWy9!t@^y_Y^%#kJLYIol5ybNy1w0u)KQn~)~s7FR)1k|=1O4+M{ONN9 z_Iax~B__m`>$wA&en4jMA2|?nRCF{PM$-co^Ti(q?Tve!y!Pz61sX*2boFyt=akR{ E0Q%+2x&QzG literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinTopRight.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuidePinTopRight.png new file mode 100644 index 0000000000000000000000000000000000000000..57dfdd192e9fd57bed513acfbfb7562235076a4b GIT binary patch literal 5158 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR34{Put%7vIa;`_jGX#sbG9_^|t2wdfg1pVx4H$M z?>)B|+yGG9Yxpql{9JGYKxvD(;<@U%?%)Q1PgU}vyYsBU4FH!6eWy9!t@^y_Y^%#kJLYIol5ybNy1w0u)KQn~)~s7FR)1k|=1O4+M{ONN9 z_Iax~B__m`>$wA&en4jMA2|?nRCF{PM$-co^Ti(q?Tve!y!Pz61sX*2boFyt=akR{ E0Q%+2x&QzG literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuideWithInsets.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuideWithInsets.png new file mode 100644 index 0000000000000000000000000000000000000000..d531cab7947c4acd889f7718aab8c98a57d92f3b GIT binary patch literal 5969 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR36doo08hT?M51JY5_^Dj45f5A;fP6mU7X{lD+(>=!nyU4{npOAGrP)j$9Ihjv9+$*~c>;*REK}cUjNhj4Vmi?H!wFb}iTUSW7yoB&+~>Z2 zB$!Q#`8u~j-Tj7!dk)tF-Px*` zA2Zk2<~b~Qe=&QNCUbA&YgUQ<`3?^G3tq2KX5QQQv2nkhxx$6-FHEmaX*_n|D^t&X zbA<)w7fP>8Y`k~i$AS3y(gH84zs$-y<&gZKit*TcX@LvUFRWgjaL7-nd9eOGFUJ?# zDqqvo1%?HC86JP<<#@qcB3qiWz}&#@!}aHEEWhOTE}La^L1IT-!^hujEMM4m^;sDK zeI)_ znMW(4(R!EYX2yMBtZv;nVMWEnU0bd; z=6l%P|91ZQ=fA%eGqM?MIN?xf_kUUO&vZele6eW~2M)+HKb>FyLH-x(BXJ2f1A|iy zOqN;?X3xk^0?KJIAOGRg|C@Ca*Rpc%RGu%!6Y?4!*Rek8_|@OxZWERIK;py8!cp1L z&=^e{qj_PpWEd?8M@z!dl5j+pgdhJgd1@!vvuZdna@lAuaF~~3?83+u036?AVHR1y zz^d^9I4D>->8t=)g@ynRP)cOMfyqo!73Iw7yvZ`#r?T7CaB-!2?VKVU^)oY gJZdO4!}I|E>plBTLK+sx0vpi`p00i_>zopr0GMhTYybcN literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuideWithLeftEdge.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.ConstrainInLayoutGuideWithLeftEdge.png new file mode 100644 index 0000000000000000000000000000000000000000..0f52a0076085e32fe765bb9d3e84d5a47c8b8717 GIT binary patch literal 5136 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR34{xBN|>0W_Yo!PCVtq=NCyb;G>F4gxHW|NdXz@~4$ee8vJ6i@gV;1N!HEe|`S* zp7r+snb{-~63!nue*gRa{NMfd7v3x^6gE$6XslWX-a9XDp^3-n zOTUjk&+|rFK!8zD0O&{sNdbWZA(__&^|HGrO2?v!&v~8txc2qT##&~e9PlhybNFxR3%9(ITr}}@ z(|fIXOSeZRg?dgsNhXyQBL%GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR34{=LgWsrel0s?Gc4GOvn3Yli|kznH+3?SBJGBSE@ z{&@myBTEa|3^5OG4v$%9-N800DDZ&H*x(T5;BYC&ZWGve#zagf?vbDH{JZks?TpMk z1|RC#;_~J-IQ*+W@z?K)vcEE)GC@ zVdBp(O?|Ro10y#*#POXFXJGjM|Ad*i zKCs!<3Tk$}z3$kh94X-9c=!LMRcn-AOk~`*p)FEN@{#o4J@)sv|F5yTzyAN724Jh> zhVh3__rIUN|4sjYV;X<2`A0Qi>m~oeQ+xLKFZu%inUaBu)Oa~KW=uBFjp3f&Sj)_$ zq`-8Dftg2znTg4-DOvX2dguHnz3X^6IvRkjG#-NqJRBSroaer7`dIsV=BWD7@EJ`H zqxogDd>AbcN9&8x`VrV3_{>=Ov;M;Km;bP0l+XkKcs+RR literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideAllEdgesWithInsets.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideAllEdgesWithInsets.png new file mode 100644 index 0000000000000000000000000000000000000000..6d03c198e7e56eac12f197a8289f9f16070d87ce GIT binary patch literal 5112 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR34{XYSZ@qy$K(db&7l=P{9m#kUA6Fla{mYU^d$kX^_PN7J>!}>N$2!AhvY_nDS{4#@C$>!~c58EI5cTZ;F>0roZ={Uaac#55Du0zXm zS-F2^e=-XvH82V;=wT|XfM1*R>63UasQCjTti!YDYe ztm4P*56h2wGO@Wdm@yqmzMX6|zt2qJ&}BaUdg*^#EIbc1a9nU}sK}}Id3O0Cn@h#5 zhY#})&lgkYln`LN#Uaq2+kdjg>Q)1XzqQSu+#i=8sW37tIY=`;+W6LRroX$iz{AY; z_Wiu|qn;RziP7XVnkPm}r_myIh}0AIz&6+a|M9h3mIE7H4WI_s+p7nA4?74Pad~{l9AqzW7_19XhDozyE&2ewD^` zmJbEx_BYPG?*Oh}m9_{g>h0Fs3aVc_{LHQHyxrjqu3uZql#ZlcUka{YFTQkZ-z{4X zu3tMY__geKv+D}Dezm&$qG0=DJ#hUhc&k%jdhB#?{pzw@TJ~Mp9aV56!O2?i(Wciy z;6}oWlEsJb_U#5Y5?nIWonp#jv%rmnxp^f!ZWm4mHxfABx^$dg=M8QoEV|swS8n}o z61b7Da4tvT&C-?NMncK1ix2aT$BuepG$uxq(`cR;EuDr@5xa|d(vi0r!2WtddjsRm z!k4O`p13Bkzu$HHIH>C{%fyy)eCc#hmw!2MxIi;c-Wk|wF9UY|Wv9nA0Xyz>PTX>#Wz(V31;9obgQu&X%Q~lo FCIC)*0EPen literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideNoSubview.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideNoSubview.png new file mode 100644 index 0000000000000000000000000000000000000000..10313411d261129bddaf00750145f0203ec78a5f GIT binary patch literal 3901 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR36-y)2(*O##wko-U3d6^w7LZsY~};IP5J`dxn}+d*K$OBDdXjD;9=sep2 zQq6LNA81;GgOI?4BWW%m)l84rN1ZboI-_Z4G-r*LJENsC6)TAcz>4?(|CvvhMgVI_ z5l{{JcC>yRt*%EKGowwt(U#|EyL`m=S{^VimOJ}AhOsjo*qdbVboFyt=akR{0IQ8I AEdT%j literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideTopLeftEdgesHighPriority.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideTopLeftEdgesHighPriority.png new file mode 100644 index 0000000000000000000000000000000000000000..a6c01a5b07674b9c322336bd3f2cce9ed951a004 GIT binary patch literal 4141 zcmeHKYe-Z<6rP#Ax>w7(t7-Y7X1dno4ctN{i&(ISico2p+d^Qs5L+o? zk^ZG(AV>tF`6EzKLqm&H5-g?HvJ_!#KKf&UkIr1R{ayX($GtH3%$@I?Gs8J&&N;X4 zm^CLTFd`5k6eL^Bc?e+_AEH03D1AvUf#Ax#oGjEf8Z`|cj^Yz?Np3ERhq;IZ9D)2e z3ygFe`Foy?YDKyH|S|5>)hDYtnDBK zWR$&4JWxA7P~{%W>>59^)U#-yOhGs3Tupe4AWD?EV`(}eFtrd;Ke>^^it@vsLo`6N zoY`+y5GKSEsmhrsts9Xr@QcoJ4hZ#%VoEy1RZ-f@0Zq{#*{J^_YZ`mKR6W#hGcxzA zAed`Xr!Jo+@WF(^G^Vg%Nx}x#l`8NLrNl@-tXf`lDlL!BIuXVO3D0kms7nK(|2O+ewq9klMj*xx}?+Ct4bikT8kg$BcYtc33 zwe4+r7X=;_C6R1R+6fdwhIj&eMc)Wb0><-DDAbx_>Ih$J3{)w#Rk*{s8C!&KP|JyY zKAUq>TJ7r#V)!1Cl)<&}N)mkEz_~@|c3(FE)eEY~;AYUq>zr$_WUb?XLbKk3Xvfj4 oqs5MPv-mHHmUpzQ{7*%~jf)c(s`O2vneg|FLzXCn4fLfHEc@V1busJ!4c4UhVYvM5*#GwHQsEC5t1^e`^suVG%@zl$;y3*Ppyone3i{^ZyE-JC)>Wa-kmq!CXVEGzw@AxWJPAH z3patIX;|DTI3Un}ya3P%1e|dQ72s6uT??!On$B9gfPc~PPGPNS^8h>xOZA2dVa<7q zKurODYT*VELs3eFx5c5tC9LJ}dU&%yIr2gvrX&rd!<#@+bD& j?kxMeV}F(Z8c0mik-o3ZEgkt?_`^)}-2q=ud0pEND@oan literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideTopLeftEdgesWithInsets.png b/ADUtilsTests/__Snapshots__/LayoutGuideConstraintsTests/directionalEdgesSpec.PinToLayoutGuideTopLeftEdgesWithInsets.png new file mode 100644 index 0000000000000000000000000000000000000000..a6c01a5b07674b9c322336bd3f2cce9ed951a004 GIT binary patch literal 4141 zcmeHKYe-Z<6rP#Ax>w7(t7-Y7X1dno4ctN{i&(ISico2p+d^Qs5L+o? zk^ZG(AV>tF`6EzKLqm&H5-g?HvJ_!#KKf&UkIr1R{ayX($GtH3%$@I?Gs8J&&N;X4 zm^CLTFd`5k6eL^Bc?e+_AEH03D1AvUf#Ax#oGjEf8Z`|cj^Yz?Np3ERhq;IZ9D)2e z3ygFe`Foy?YDKyH|S|5>)hDYtnDBK zWR$&4JWxA7P~{%W>>59^)U#-yOhGs3Tupe4AWD?EV`(}eFtrd;Ke>^^it@vsLo`6N zoY`+y5GKSEsmhrsts9Xr@QcoJ4hZ#%VoEy1RZ-f@0Zq{#*{J^_YZ`mKR6W#hGcxzA zAed`Xr!Jo+@WF(^G^Vg%Nx}x#l`8NLrNl@-tXf`lDlL!BIuXVO3D0kms7nK(|2O+ewq9klMj*xx}?+Ct4bikT8kg$BcYtc33 zwe4+r7X=;_C6R1R+6fdwhIj&eMc)Wb0><-DDAbx_>Ih$J3{)w#Rk*{s8C!&KP|JyY zKAUq>TJ7r#V)!1Cl)<&}N)mkEz_~@|c3(FE)eEY~;AYUq>zr$_WUb?XLbKk3Xvfj4 oqs5MPv-mHHmUpzQ{7*%~jf)c(s`O2vneg|Fm(^PyXBQE>>(*33%Rr9b_0JT3zJ3+L1AHHNw|k{cMHl1 z>KfKd!3IG{59WF(1Sturg(meN8Hg>BB1o8)m6WaTxwHBMdhy|2_}=fi-~0W1&*kv> ze)(_%bu~6qMs5Z|$RyjX^$6i0Gfoc?<#E|0INVWht3*Rn`5)oI(|l5HsjfzQV9gO{z&Y#fZ}{;e78`RMDj z;0*2d#twvXikM-!UQ9qR-)*gRfQJp$D+c#sFy_IyHh)*B2Yk6~wKzQZ)3l|BNIbP9 zlkU#1MnjtEN<5mLXE@dsBy%l_X6% zRxU`X7(KX?mBdko>8kYLQ18Tg={`}N?#?rV2o-nwL{pDOh}|7 zluSBvUhW1J5oao5ar#w2XUR;ndV@%+ijQUpSDaH zN4+Eck{}dx&M$e5+kMj5L`GfjMMBO`jNKM_j>> zNbV}73pac=S>X8~nvU%fgol}jj}f1u(7`ITmEy%U^@Zdy;dtp zZCgD9lwfSow$u*xzvv@M%9vkKN}O-{K#->R76K`1B;P4G#)Iyr%f56;yjxJ41~&TBm5kp?AZ~!}um=`L_$v6H{yO_XNpD KYpg?+F8^=W+kY$o literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.CenterXInSuperview.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.CenterXInSuperview.png new file mode 100644 index 0000000000000000000000000000000000000000..ba10107e914ecd15b014c42723d1b4dd431d1c93 GIT binary patch literal 5896 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR36d4OAQU?qXoz`s3;17*fIb=ITMt!wv#0j!)-r*~7Oe(V_IgdmFFpUzN5@tp`5u zS%1IJ@ndgpUEG6zPvsgN9Bj%Sef%#5WF1IlU7_ah;INHHMinUTz!WlBT|pt5t#6Wp zf`S6$s*}P36Lgu~Jrx85CNNxm!pU)BTH|6B0S*q2hOAF4EGefC1PXDmu&6kgRx&Yd zN`0Wg$-=}Wv|yGEBjZh@f+;LajEtNCzVjLyawILhm>L@zSVpZI4b0J`GMW)aOO??w zbF@YntzJhP52H;Z^4gj9z^3s3|B~v<{sG&;KSAx_x1+7#(MI=Z4`#G~Hro3f?aGf1 nRE!S8jE-rIj@S+J@ksmj`VzgO)7)EttziaFS3j3^P6GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR36-FKF5eoCDHxJY5_^Dj45f+sMga$iw3J_5PNe0@iyKa&{p`I&;!%SvUj~927Ww zb`&}_FfcN)Tx;k6(~}w)J#+d%k_Q?xMny(LV>Bg<=7P~&fHfB+l)Y>FA(`R8EOp^P zIy2i7;WIa?3P9WnUI_u_M^~3J@@6QQCOEWAKJ=04GuQP7Hl7YfLj|b|4QxToY%Ug> zGVA@<`}1ZTXaFi-grxY_mtR*#6~lsVxP`_8U{(G9|EZg|gkbgb+v~eInH_jofwlCP zTCWSok_*yQ4n56&VeU(UdTn h3r2GR)?84)*j`_vr{KP$5LjU|c)I$ztaD0e0sthDhSLB5 literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperview.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperview.png new file mode 100644 index 0000000000000000000000000000000000000000..7f5703bbd9978a4ce25d86ce148cc4736abd3ede GIT binary patch literal 4442 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR34{BCQUaw*qNZPZ!6K3dT3rH}Wzl@~}95zrRILwc;`7iFr>_DM}ucHQ5@VjniWP%iqY~BTz!mYg+ZMaDu8W<|NnXXgROuK z1|?8~;q7R10p9i*O}v9T@s74iN893~J&@5tYP67|S7WonWKr6ehc~~r0hzopr00FQpFaQ7m literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinBottomLeft.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinBottomLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..5d7be3889a32fc15e019c970f2752c583db5a169 GIT binary patch literal 5695 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR36d-faFS1at=14o?@ykP5~(R|B~Y2M9P_d{cip^SXhOi$!bQIpr6j^RM?ai7a4X z)hGyfV0p)4A&}+3$hC)!g#{uSbf95QO0f$gS3m<38w>N05WFux;raj0e^;Imp2+Xez{%vd1N^ovzY?WdnOCMEZcPW02^~)t(BQV(>}ox zyN@dmHt=?c7%1>+>|OcBV8cO&kokSQ9SibV=K9xU86+?(vGRB@d*y3c^W+!^TwR{b ztn@E##67Ka(v4Nm8)E#35W&+GlqE92`W3L2Ps*{{97|KtDn*ykVP zou!OrmH7%Dyl;qiNtnODb^8mM2M(tjU({5safnKq_4-9&!hJ?r0l@%;X*KmHQ&kpE zW4`$FOGM+ABPQ1`K0dII*-AlafrHM^f0IsoxaqPl`uuVuQ)Xx8y2ZyEYuQU2TpSuB zKK)glKCvf?&*k~$WY$YUmt)-fnSb-WXy|BQ+W6$Rx1O@(R+)}-%a3y{QC+sPPmcYY z>;*1j88D&`t%=PaV_3-v7mbK-3W4(Y`iHYmTr1$zeds40xDOk;y)1EMG z#xtubnH%K}>@F-K9jf=^izH93c~B7g8ax^lWTy&y=0}MFNA3ocf<{+8UHx3vIVCg!02tfELjV8( literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinBottomRight.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinBottomRight.png new file mode 100644 index 0000000000000000000000000000000000000000..5d7be3889a32fc15e019c970f2752c583db5a169 GIT binary patch literal 5695 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR36d-faFS1at=14o?@ykP5~(R|B~Y2M9P_d{cip^SXhOi$!bQIpr6j^RM?ai7a4X z)hGyfV0p)4A&}+3$hC)!g#{uSbf95QO0f$gS3m<38w>N05WFux;raj0e^;Imp2+Xez{%vd1N^ovzY?WdnOCMEZcPW02^~)t(BQV(>}ox zyN@dmHt=?c7%1>+>|OcBV8cO&kokSQ9SibV=K9xU86+?(vGRB@d*y3c^W+!^TwR{b ztn@E##67Ka(v4Nm8)E#35W&+GlqE92`W3L2Ps*{{97|KtDn*ykVP zou!OrmH7%Dyl;qiNtnODb^8mM2M(tjU({5safnKq_4-9&!hJ?r0l@%;X*KmHQ&kpE zW4`$FOGM+ABPQ1`K0dII*-AlafrHM^f0IsoxaqPl`uuVuQ)Xx8y2ZyEYuQU2TpSuB zKK)glKCvf?&*k~$WY$YUmt)-fnSb-WXy|BQ+W6$Rx1O@(R+)}-%a3y{QC+sPPmcYY z>;*1j88D&`t%=PaV_3-v7mbK-3W4(Y`iHYmTr1$zeds40xDOk;y)1EMG z#xtubnH%K}>@F-K9jf=^izH93c~B7g8ax^lWTy&y=0}MFNA3ocf<{+8UHx3vIVCg!02tfELjV8( literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinTopLeft.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinTopLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..5d7be3889a32fc15e019c970f2752c583db5a169 GIT binary patch literal 5695 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR36d-faFS1at=14o?@ykP5~(R|B~Y2M9P_d{cip^SXhOi$!bQIpr6j^RM?ai7a4X z)hGyfV0p)4A&}+3$hC)!g#{uSbf95QO0f$gS3m<38w>N05WFux;raj0e^;Imp2+Xez{%vd1N^ovzY?WdnOCMEZcPW02^~)t(BQV(>}ox zyN@dmHt=?c7%1>+>|OcBV8cO&kokSQ9SibV=K9xU86+?(vGRB@d*y3c^W+!^TwR{b ztn@E##67Ka(v4Nm8)E#35W&+GlqE92`W3L2Ps*{{97|KtDn*ykVP zou!OrmH7%Dyl;qiNtnODb^8mM2M(tjU({5safnKq_4-9&!hJ?r0l@%;X*KmHQ&kpE zW4`$FOGM+ABPQ1`K0dII*-AlafrHM^f0IsoxaqPl`uuVuQ)Xx8y2ZyEYuQU2TpSuB zKK)glKCvf?&*k~$WY$YUmt)-fnSb-WXy|BQ+W6$Rx1O@(R+)}-%a3y{QC+sPPmcYY z>;*1j88D&`t%=PaV_3-v7mbK-3W4(Y`iHYmTr1$zeds40xDOk;y)1EMG z#xtubnH%K}>@F-K9jf=^izH93c~B7g8ax^lWTy&y=0}MFNA3ocf<{+8UHx3vIVCg!02tfELjV8( literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinTopRight.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewPinTopRight.png new file mode 100644 index 0000000000000000000000000000000000000000..5d7be3889a32fc15e019c970f2752c583db5a169 GIT binary patch literal 5695 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR36d-faFS1at=14o?@ykP5~(R|B~Y2M9P_d{cip^SXhOi$!bQIpr6j^RM?ai7a4X z)hGyfV0p)4A&}+3$hC)!g#{uSbf95QO0f$gS3m<38w>N05WFux;raj0e^;Imp2+Xez{%vd1N^ovzY?WdnOCMEZcPW02^~)t(BQV(>}ox zyN@dmHt=?c7%1>+>|OcBV8cO&kokSQ9SibV=K9xU86+?(vGRB@d*y3c^W+!^TwR{b ztn@E##67Ka(v4Nm8)E#35W&+GlqE92`W3L2Ps*{{97|KtDn*ykVP zou!OrmH7%Dyl;qiNtnODb^8mM2M(tjU({5safnKq_4-9&!hJ?r0l@%;X*KmHQ&kpE zW4`$FOGM+ABPQ1`K0dII*-AlafrHM^f0IsoxaqPl`uuVuQ)Xx8y2ZyEYuQU2TpSuB zKK)glKCvf?&*k~$WY$YUmt)-fnSb-WXy|BQ+W6$Rx1O@(R+)}-%a3y{QC+sPPmcYY z>;*1j88D&`t%=PaV_3-v7mbK-3W4(Y`iHYmTr1$zeds40xDOk;y)1EMG z#xtubnH%K}>@F-K9jf=^izH93c~B7g8ax^lWTy&y=0}MFNA3ocf<{+8UHx3vIVCg!02tfELjV8( literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomLeading.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomLeading.png new file mode 100644 index 0000000000000000000000000000000000000000..12fcc295c6917cbfee9bd2a3d3728a3580debd92 GIT binary patch literal 31568 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 C)hVU` literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomLeft.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..8d818c2b3bd91377452f23a51a844729a5f8a4a2 GIT binary patch literal 27914 zcmeI5?{8C87{|};U2kz|fy7NOUEN|3NQGUuv$rPGTprXdmEh*=P@vysVO00Z2N)~w4Uib^*`(jr^&++V%jpCI`*x%b?2 z`kd#U`^h=aea<;g(}RAW$5L!9CWKf7Z&NcNhBP6@HA^^JGB&wdN|?RPo=xQFS=$ww zX@CAnVdu7Oq?%qYAw`Up7$p&UY-Gyv*IO9}VdZiIAw8|6NR{!?RQkM252=olvLd5O z(=ySZNgL84t6dw{NY%DKQ!+-AyF%Wl_7ZZ>O6g#PX8Rm1w6!)p7N9A;q4Y6)Ku-=O zm9Aa0#Ty>FNYk%{rp7=!^Vh^k?~HqSQRBa}t}Pw?y@%NJ)b|$4pB)QNxEW)KUpYlO zBUSqkv!!ZQ`XW`6yuUE(W)chWiZcg`9b(v^ocOd^&p1M2c)Baq_iIyLD`PabaoR1Y z&UOBHsA10Y>L+S_sd9HMTcFYA2o6_dE7w1+H;qXQ7G#V|OPtAN^Zg&jv_?=R(`O4Z z22(MgHs!p&fc|{(&@MgWj<7~^hTU(ks?I+Nz3pl}BgP|!?pu+D=-mZCoXHiyp%VZO z^bTdjV6eb;z?91GD7;zlqJ`g~cz1Ba;FZEjmuEkivtSChXhwT-XX<9op4$^Atl3FV zM)ugCtE+GNS=OKJKRz;gfZ_OHnBj8V{G+9F_X-Q^Pwl9C-ztexdG~kj7pr=wb_`FF zKvyh1H!g`%`N&T`>o=pJFPJ&+8}=1Sp}1ZA>b=vmtCD+2bwi*nyIa$tX=u0CN98t{ zo&Ht+pM{wWpROST6-R12U2+@vU|vIAv|Lac#>e>B)uC(q%o%HVY}pU@ZM14SG!5lK zpIv!4bHIG*^$Xeh?tK>b<(@y5R#-G0ss_?G2nhmR*bZ>c&o4e`n={m-dr4&~v*=Ka4+e>$S-(731i|M5NyyuhpU zfAn72yudifMj6IIw%#xfFb>rFfaf6lI`AB1R}zky>^0^+XLt_q97uj*0?z@S1D#l7 zQY^1qz;l4-fF&KQm|;OO9KnL5yt<6_UU{7!%jxnuJ$5UUjT{&U7zgaNVJkDg8H%k; zd9N8e#mZJbHsTTIz`!^t@hMs$3XH=YVjO-m5pw(XkLzv-gsiQTe#UflV*GRZBPO=- z^2c93xNDr9U^3@Clka3tFF|Oa+JwlFDQD+6&#+*4h~(C>L`Nz%kfZ!DRpjA zFB%@F|2i_$7Hw9QQ^DW~Ch?{%+|Z&IrM9x&w|b|9N3{FVR$SxE88l2r3u1bQLLbAZ ngt^ei0}QM_9{yjiq?GBimimj)w>xH}KME7J_?nJx3Lf|mPdY2x literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomRight.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomRight.png new file mode 100644 index 0000000000000000000000000000000000000000..8d818c2b3bd91377452f23a51a844729a5f8a4a2 GIT binary patch literal 27914 zcmeI5?{8C87{|};U2kz|fy7NOUEN|3NQGUuv$rPGTprXdmEh*=P@vysVO00Z2N)~w4Uib^*`(jr^&++V%jpCI`*x%b?2 z`kd#U`^h=aea<;g(}RAW$5L!9CWKf7Z&NcNhBP6@HA^^JGB&wdN|?RPo=xQFS=$ww zX@CAnVdu7Oq?%qYAw`Up7$p&UY-Gyv*IO9}VdZiIAw8|6NR{!?RQkM252=olvLd5O z(=ySZNgL84t6dw{NY%DKQ!+-AyF%Wl_7ZZ>O6g#PX8Rm1w6!)p7N9A;q4Y6)Ku-=O zm9Aa0#Ty>FNYk%{rp7=!^Vh^k?~HqSQRBa}t}Pw?y@%NJ)b|$4pB)QNxEW)KUpYlO zBUSqkv!!ZQ`XW`6yuUE(W)chWiZcg`9b(v^ocOd^&p1M2c)Baq_iIyLD`PabaoR1Y z&UOBHsA10Y>L+S_sd9HMTcFYA2o6_dE7w1+H;qXQ7G#V|OPtAN^Zg&jv_?=R(`O4Z z22(MgHs!p&fc|{(&@MgWj<7~^hTU(ks?I+Nz3pl}BgP|!?pu+D=-mZCoXHiyp%VZO z^bTdjV6eb;z?91GD7;zlqJ`g~cz1Ba;FZEjmuEkivtSChXhwT-XX<9op4$^Atl3FV zM)ugCtE+GNS=OKJKRz;gfZ_OHnBj8V{G+9F_X-Q^Pwl9C-ztexdG~kj7pr=wb_`FF zKvyh1H!g`%`N&T`>o=pJFPJ&+8}=1Sp}1ZA>b=vmtCD+2bwi*nyIa$tX=u0CN98t{ zo&Ht+pM{wWpROST6-R12U2+@vU|vIAv|Lac#>e>B)uC(q%o%HVY}pU@ZM14SG!5lK zpIv!4bHIG*^$Xeh?tK>b<(@y5R#-G0ss_?G2nhmR*bZ>c&o4e`n={m-dr4&~v*=Ka4+e>$S-(731i|M5NyyuhpU zfAn72yudifMj6IIw%#xfFb>rFfaf6lI`AB1R}zky>^0^+XLt_q97uj*0?z@S1D#l7 zQY^1qz;l4-fF&KQm|;OO9KnL5yt<6_UU{7!%jxnuJ$5UUjT{&U7zgaNVJkDg8H%k; zd9N8e#mZJbHsTTIz`!^t@hMs$3XH=YVjO-m5pw(XkLzv-gsiQTe#UflV*GRZBPO=- z^2c93xNDr9U^3@Clka3tFF|Oa+JwlFDQD+6&#+*4h~(C>L`Nz%kfZ!DRpjA zFB%@F|2i_$7Hw9QQ^DW~Ch?{%+|Z&IrM9x&w|b|9N3{FVR$SxE88l2r3u1bQLLbAZ ngt^ei0}QM_9{yjiq?GBimimj)w>xH}KME7J_?nJx3Lf|mPdY2x literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomTrailing.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinBottomTrailing.png new file mode 100644 index 0000000000000000000000000000000000000000..12fcc295c6917cbfee9bd2a3d3728a3580debd92 GIT binary patch literal 31568 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 C)hVU` literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinTopLeading.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinTopLeading.png new file mode 100644 index 0000000000000000000000000000000000000000..99dbdf640e65185c154f3dd13b8384b819deba50 GIT binary patch literal 31575 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 E0~9oMzW@LL literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinTopRight.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinTopRight.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe146abf4e6d55071c1b628a88d72c92011128a GIT binary patch literal 28089 zcmeI5(MwZN9LLYyb<>uUh^1=^J!H5_Xw}q0vnf`t(w41KC>@cN1*uuM!ej;!QEFu` zDYa1<+CwUs3<|wsDHdc_=!1f$)QV~;K4_@fIorL{KcI(*?}dBLy+6+H?%vOS=bZ2F za>lNj(|4$pS|uSwWlBxSAVlUNL>?QYpq5wt8(GB_W$Z{MPu@g)r6;!BOw+NnG_r;s z2ay0yOXREx-4nTR|M7NCM|iJYM#z;s5+Jror#0Jd(4G1CYTn6-t*Ol^lUmC>PF^~e z$1=Aght#iVwWuI9tB8=$Rcz->8Ifbu7?GE<$3koRfozl2&_d^{*>UXLs%JSdw0><$ zNwV0u?|tp%9mXYm(kDlA^zmN4kDHA8@-EuZ?@$<=oa%&;*S@tY3^($JyQ9=*--&3q zsfvRZwkdFO9kW7Z?sXM3 zaCIehXKV)VB{WuNOI7ED#uGy-96`lBfbfB*=900@8p2!H?xfB*=900@8p2!H?x zfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900{i&1l)my%*_## zY8N3f1MFvQKl*yhJM_Wwq{*S?(X&l2YIu($t1>dNq3uAK`+UxvR$R1iY&V|TRqgmZ zuynRosSc@Mo)Aix^0W2$V{yal_6uRAixv5ruv&#^HLo`hRCT(WT>Zon@_2KCR^n1DX3L~YX@pm%B>#EJx=k}KuBkYa_zgNKn`^(wR;tjRpb#+d`#$B7%BdxMsQb3>_Sij+%A-A_WTs@^E1X*5TB}yi zKWgXV%)u^h>eswioHBDTza(nk8vmnS4{LM*koQ|>1ppy}q`rYJhB3%HWvI;DZ`*#DZDwxy>$Nw!}4 E0~9oMzW@LL literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinTopTrailing.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaPinTopTrailing.png new file mode 100644 index 0000000000000000000000000000000000000000..99dbdf640e65185c154f3dd13b8384b819deba50 GIT binary patch literal 31575 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 nUYbref{_T^}e5X&*x)m(lysw>$|RX9oAa4 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 literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaWithLeftEdge.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewSafeAreaWithLeftEdge.png new file mode 100644 index 0000000000000000000000000000000000000000..edecbe5a0994d7454e2eb0047d0930e5846a9867 GIT binary patch literal 29018 zcmeHQflm`x7{BY)BCZUhPz$(<1|1uyWtgG?q*It>C?azc1CuHOk|5BaDQJM!O`WX@ zE@t9TOK?V)C{tOah=ZyrI0TB0L>NV|&Voh@lVPoecJJt2J^uugugUe@eed48_rBh} z_j}*>yMBj~64!Xm@SlNUm{+_cHW|ZM77Uvvn$AIzwg=&4f)^&QS%uYh&V7mwiZWB; zv(~M{K1KV}F*fdxO(Rc1+e$pZz5fLsj1g0E7KR*xPDSO-*$*8OfveBRnWER2+v@P zH}}u=#~DI}sgrrc7D&XhGO47r=509z+eglE*Fv^Q%u?Bj)h}l+q^m~4YHc{d26zeD7X`Wo(D50+bcN$s7C7pla0jrpzrAWpnsa1jYU@3Q zSC(_=USHliC>j~Ps7*a}L?4!2m_@c1RdG#u`NDv~*ZK+^#d_$wa)?QynL#>cu&Kb8gj?#%wb7 z5xX>NzN3Wv9$`V1yyzR_;?5RRW!(yfmb*uWRG?(85R?peG7J~g*a^c0jL9(Z0lENm zLE=MzaDbCj04KW^VStkXCj(9foD8-L(zXHyBCx`N6^=4V0!{{;3^*B#_TU*Ip#iv` z!2JY1K5(Rhx0-Z?gSQ$e0l>Qe-UX0bNYf!Oh=8UAG%eu5y@!Ouu?X~vozvOI-am|C z%kAWQbuW5us?y@oTXi<4=FIq(-67rA0wcM5i@KhC)^=yrbHhmeq|IiV9M^DZ1|`mM zTvK{mpT{hIb=NWR0=LPiLk$Db}(uv>dB)mg3jZr$7&VOBS>}#V_ z-(`FxbMq#f3<}ehMbez6{G4`UJGJJJZmqs}so3b0rE~9{7I;%G8|h$^GWX$=dQ)DG zW$6*WsxXSE8Ol8#7hN7=QP02r*JC#=)EH6G(Kvy4lO2=i!ZO0?J9fYF>V+Yhz9cMG zz9)+Al+w<*T6|(a)p)L<2{V2E${OecKO~|BBq)TdUXhu_evE@`S>&oc5l>Z?zoytT+vnjDA5-GTg~9Tu_vH z7%pH;hKUc*1)vKO#{q-`oD4V_79+6YBVX`@Wi>3T!FB-#BCx`duY-dX4osb3PX>E3 z80|^ZA$Uf>{RHkO@bQ5omGlXNw;H_FKnVce1@JCNPa2S0fI$Q_Eud)u7moC#0pSo> zoxth@>g4!j z!qg<`Kh5}4<5@*(QTP*XyMbBuG75>3{);8?ooE4zP{0w6d5Bpy1qC5lnk+xhRDobN zih@Fn6*9|)qR1$7er^1Use*E(s&b{Rfms&R#|HHU!QB@G4{x9n#y*%ja8H;zJfmRd j1>hn9+$UzK*$(1|dBT(X!@bF1iCBDGVr=ay>AwE~2e7ZU literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewWithInsets.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewWithInsets.png new file mode 100644 index 0000000000000000000000000000000000000000..5589a0848d5a4927502544efe07746d0ce0c3078 GIT binary patch literal 5123 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR34{=LgWsrel0s?Gc4GOvn3Yli|kznH+3?SBJGBSE@ z{&@myBTEa|3^5OG4v$%9-N800DDZ&H*x(T5;BYC&ZWGve#zagf?vbDH{JZks?TpMk z1|RC#;_~J-IQ*+W@z?K)vcEE)GC@ zVdBp(O?|Ro10y#*#POXFXJGjM|Ad*i zKCs!<3Tk$}z3$kh94X-9c=!LMRcn-AOk~`*p)FEN@{#o4J@)sv|F5yTzyAN724Jh> zhVh3__rIUN|4sjYV;X<2`A0Qi>m~oeQ+xLKFZu%inUaBu)Oa~KW=uBFjp3f&Sj)_$ zq`-8Dftg2znTg4-DOvX2dguHnz3X^6IvRkjG#-NqJRBSroaer7`dIsV=BWD7@EJ`H zqxogDd>AbcN9&8x`VrV3_{>=Ov;M;Km;bP0l+XkKcs+RR literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewWithLeftEdge.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainInSuperviewWithLeftEdge.png new file mode 100644 index 0000000000000000000000000000000000000000..7f5703bbd9978a4ce25d86ce148cc4736abd3ede GIT binary patch literal 4442 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR34{BCQUaw*qNZPZ!6K3dT3rH}Wzl@~}95zrRILwc;`7iFr>_DM}ucHQ5@VjniWP%iqY~BTz!mYg+ZMaDu8W<|NnXXgROuK z1|?8~;q7R10p9i*O}v9T@s74iN893~J&@5tYP67|S7WonWKr6ehc~~r0hzopr00FQpFaQ7m literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainToSize.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.ConstrainToSize.png new file mode 100644 index 0000000000000000000000000000000000000000..e26f1d690f454e2efd6d81f3f9dd250ea67c7a9d GIT binary patch literal 4075 zcmeHJPe@cj82@H=%(oj$Z`HDFt0^~IvdBuTF70Tm?mMWlNaUfA$|a$HV8I5FV;%fM z*h`2^1NR_Z3Qf9HENHX`gEeF!tngqSgvg@JgGS=^&1Q8D>h>Od`~Q>Bw^cfYS*0g8;--p{>9fIb0G)AWgx_G8lN}{(yhN4M&YoRTXT9 zI7rt29#;@A*wXV9ptTX$a!oa&dT@{QnxANkkmYLRiO^rw#EjVfjMcK2(TTGN_6vc! zCV(|tRS+ZS`GS+~Mt@B$B5s&|M)B8+p%5c;!QJts7%^t}OKZbqcB0f#wmXMCpG+lO zgX0gb+-G-e!RUDS^MQ%^&DTF3lF)Kqb0@>zjj8VMIu}#q8*g#vUPJNRF3MtOvqgy0Tk(JN)wY0QKdz@IG@`FO4e0E z^z^RAwKEy))Di>i01>+uXnMRw$dRa&@jh%dOe-d&@!S#Q=+4#6Z`mM_xPbGqu@2;z zqjXO*1tcD4tp8~piogE25HmG^N!BA}@xDUq<*bvl?%dxA!iScgN;M4Ux1gWrC_n%7 zddP|2BQJ`Unx8G2Z)cC~=$~{e;p-aBEh#`m>CtJsLXI*%u@_~G9-g$R6q>VVXdS9k zO1Y3;6`-{1%?(v8#G(?b@^s^ja&*r5Rn;I^mz188e6@$J`xKk{6v*mL_ZzKk6S6^z zhx7KaHdW1HtB_5Zz8MQC%cpcY(|R52bga8$Da-0RR#*OqCNV{BbE3w{jS`IV KYX3l4{k0!v1D0t3 literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinAllEdgesWithInsets.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinAllEdgesWithInsets.png new file mode 100644 index 0000000000000000000000000000000000000000..a8013aaadbe8a053baaa6d652c717144965e4717 GIT binary patch literal 5490 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR36dG9tA@ZGp6jr;B4q1>>8m8#xa+2rwUfz5nI*?0^jyC1mWHQvG*5cV=K@5pYOQ zC^#(bFW>;;RIs(Ma40k|FbOj<8zp|`0LdR{D1fL_N^nriky8Z9a!3g9fmCt$u<)E{ zIjam*#lXmX2&9^!v9p13=7!1^psYfIg9S*Hf`Oocg0NXX*bW{Jb}+5R#FldCnIKTM zp@H!sNL9lDmjewxH*B0h))^?sfL%0$Lt+BwY+GpefXI4`$LR(=K<|)J!3RQjXjEe(l3!D2br?!8x@aZ zEf(AsW@1}1A+qh#6NlFhLGzt>Iu7UYOXu(5W-qCBI?y0ubUI*`Oopt-tKbgC!W(ZB zANQ6&Y{>Hmy51>G(rYsFT4v8$E<**r-L^SDh zl@MsZD`$4ELVVOyqcJs_{6_QCXhAVrq>t89qm?h&Es7do6Y~H6P<}f}VEa)U)P8(> z^&syN1A)U1-|ugkY;v&Oi2Y8q!QrXr*4910^SYmr-6Fsu;OnjP#rMMc>sn2WrUbx!+PM!pb88z#i*bl^Oh7m$X}qZPXsACr203fzX7;FV!{YBKX&NW({_ zwERj$a;zn|VHU)x>t0#3pcvfn=~(=(PbzzjHl$&uweYEiKVJ!?;Zu0!ZeVh6=~HmS z%tLjH%+r&N=OC@QzFpQ?Yc{Tv0XNK6woF@WV|l?6+?qQQSnl3ydTlDCVK((b(G+!d zD@be3;?=tq8;|WO0te#~p{Tx3PaK|uTXO>LcV$hlMTC!f%3(C7Mw1_~voo5fMhgmH zUv{)eAFZc=qaqYnz6+!$Jh5~Fj}U1ATe3>J?7+bw3FQQbV|FW^gT|ahf#W6f2`&Sv@ z2-O1MIF{C>B9Jaa;26}K<|;nm;8Ot5Fwsnqt^*Rlv9E8AwjhgF01fNf0@9Vx)4(YC zd%--A#Ua2^7}qF}E(5m%4L!91=Rp>aXy?l9RN#I);iLF3VEd85)78&qol`;+0NB)V A^Z)<= literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinAllEdgesWithoutInsets.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinAllEdgesWithoutInsets.png new file mode 100644 index 0000000000000000000000000000000000000000..7f5703bbd9978a4ce25d86ce148cc4736abd3ede GIT binary patch literal 4442 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR34{BCQUaw*qNZPZ!6K3dT3rH}Wzl@~}95zrRILwc;`7iFr>_DM}ucHQ5@VjniWP%iqY~BTz!mYg+ZMaDu8W<|NnXXgROuK z1|?8~;q7R10p9i*O}v9T@s74iN893~J&@5tYP67|S7WonWKr6ehc~~r0hzopr00FQpFaQ7m literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomLeftEdgesWithInsets.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomLeftEdgesWithInsets.png new file mode 100644 index 0000000000000000000000000000000000000000..4f2e36b0e91ecad672c5ba2df6d9239cd8df8863 GIT binary patch literal 4061 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR36-y)2(*O##wko-U3d6^w7LZsY~};IP5J`dxn}+d*K$OBDdXjD;9=sep2 zQq6LNA81;GgOI?4BWW%m)l84rN1ZboI-_Z4G-r*LJENsC6)TAcz>4?(|CvvhMgVKb zEub3m?bSf8Lkv8u2k-sA^hz?U!b9fZ`2Z{58_%D*gX^-U1Hx%Np!$iSae6}p6R1)H zSAjf`O7RA$P8$^&VWDwAPvQLYz<>Lb6TWi_D12Dj(C{bw%Dxzx$KWOpV<9UfO(-d3 z7J@>?!GYz7D5QPW(XiyGA*hkVC@2sPZ3i(;5<4ycY6!VF#4rMBVDpK?BTB}3)UeSo z8%-Jlw9QTl;sV!z8BL+U%fZ2~)=%FVSkTXHXn3>6wi8(IEN5YPa^?9KBcO^KoE#_4 j-I_eAbRa`u595;M-%C3xcAo?Gb{RZf{an^LB{Ts5cM-JU literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomLeftEdgesWithoutInsets.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomLeftEdgesWithoutInsets.png new file mode 100644 index 0000000000000000000000000000000000000000..2fdb5ce69619448506626fbd2dec52c2f7cbb452 GIT binary patch literal 3981 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR36-y)2(*O##wko-U3d6^w7LZsY~};IP5J`dxn}+d*K$OBDdXjD;9=sep2 zQq6LNA81;GgOI?4BWW%m)l84rN1ZboI-_Z4G-r*LJENsC6)TAcz>4?(|CvvhMgVKb z6i^NM_Ub`S7DFBu$EWkRypi~o>MVPwI6*U|>RLa@S`L;*PHACKO{TDc=@AEdtyG9n zN$vn?5Uo5lH|pxB-uut1Fs}ULkH2o8v1Fc@#aq6kM+k7 z_zEdFJP>ANtkj)1U#9Q83aA;%(Gd=9KQc|?I}U0=GASv1GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR36-y)2(*O##wko-U3d6^w7LZsY~};IP5J`dxn}+d*K$OBDdXjD;9=sep2 zQq6LNA81;GgOI?4BWW%m)l84rN1ZboI-_Z4G-r*LJENsC6)TAcz>4?(|CvvhMgVKq zi=Z0v?bX|Pp`JXh7ytbCzdYT%MWJ)!`HkPDJpNudur7pG`fR^^9jN+aXly#*{!n^8 zsHS3QlxIo;SC|WcwV0}zJfwcS0jk~vG=Ozz=UI11byx_&|mZeb(?k@TdE7&3!Yi9tSfr{+x0mUf}~Pj$$4z_w$Ca`2oX*}Sb3p>{@9a1Ko5NTs zyhr}G0VAW}g!Z*x!sjU~#0P#V=crLrP+_91KVZ|dlKK?`>V|Q zQDtdhXUDIZH5*_o;sPR5X$)7aSd4Fy*eR}e;>h^0EpiASn=VsSUYFH!L z+C4`M=rYT_2ezK(_BeYsoTU!L|5>T5^v~Zx>DZfzk3r6Q?7i(hJI9HAGk08c1-Yub z`uFs5u?hQGzF0Q?2YH?8zb1#rgA2Bmz&0jJO2XQ0@|p^_)t}UvgKW#o$$G8Jx@79* z#El@s8c*vhG&+BO!U!^{aqF$RB@H?AC;Yw(Y8+_-Y>c998Te(guOfDUKT+uy*# zcXu*7$QZV3S-&STZK`#8SMCh7<;k&S+wKK9L|Mv;X#;&NwBrwxkVT2V9LN~Sh}Cc1 zxlVlJ+}WC=_8CkK*h_71XeiOJY6iAR k8kxXF#Hiq436TE`s(If_S*zopr03%Nk)Bpeg literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomRightEdgesWithoutInsets.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinBottomRightEdgesWithoutInsets.png new file mode 100644 index 0000000000000000000000000000000000000000..dfec6f587550047a2656ec694c716480946efc6a GIT binary patch literal 4138 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR36-y)2(*O##wko-U3d6^w7LZsY~};IP5J`dxn}+d*K$OBDdXjD;9=sep2 zQq6LNA81;GgOI?4BWW%m)l84rN1ZboI-_Z4G-r*LJENsC6)TAcz>4?(|CvvhMgZ$X zMoXmH7qgVd!rKzfs7)I3A2|5VX0jrjqncxMna29^Iog*4C2s&}AagOkx%$ z=w)=(Z@rr45mRcO5puy#qy-xvq-e;I^7$!E-E_ekak|+rYZ~r0E$YJUapdK32+IlY z-ey9a*`iae&K<|3%kSA<4~c}SHimB=x{&B{&itAE7^i>IJQejp8k>A>VHMo`V7%PF zrPaB*=<4)`J56s3zC{u;S5#f)!Qpm0lQ4)o_%>B1lxeE!xV~1*abEh*%}kl!eRaK0 zmZk-6U@wQP^4L)I?D%M*4_l*letThul6%7?u}3+i2hG^3m$59xe=@_asH!TBILcb}^&RUA5JMcu-ZK#?6&?ZR4B69SQf)3l~)VXY`<1+fZ# zbQiA^IXEw0d^^~MwH#W5Xen}Rdn!m(l17#wnjqTnNTYy1W6^ZucZ}*7XU9O6aqk$n c@?Rv0X_{yIe7fp#+b)8pZS{HjDjUxK0A;?>1^@s6 literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopLeftEdgesWithoutInsets.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopLeftEdgesWithoutInsets.png new file mode 100644 index 0000000000000000000000000000000000000000..e26f1d690f454e2efd6d81f3f9dd250ea67c7a9d GIT binary patch literal 4075 zcmeHJPe@cj82@H=%(oj$Z`HDFt0^~IvdBuTF70Tm?mMWlNaUfA$|a$HV8I5FV;%fM z*h`2^1NR_Z3Qf9HENHX`gEeF!tngqSgvg@JgGS=^&1Q8D>h>Od`~Q>Bw^cfYS*0g8;--p{>9fIb0G)AWgx_G8lN}{(yhN4M&YoRTXT9 zI7rt29#;@A*wXV9ptTX$a!oa&dT@{QnxANkkmYLRiO^rw#EjVfjMcK2(TTGN_6vc! zCV(|tRS+ZS`GS+~Mt@B$B5s&|M)B8+p%5c;!QJts7%^t}OKZbqcB0f#wmXMCpG+lO zgX0gb+-G-e!RUDS^MQ%^&DTF3lF)Kqb0@>zjj8VMIu}#q8*g#vUPJNRF3MtOvqgy0Tk(JN)wY0QKdz@IG@`FO4e0E z^z^RAwKEy))Di>i01>+uXnMRw$dRa&@jh%dOe-d&@!S#Q=+4#6Z`mM_xPbGqu@2;z zqjXO*1tcD4tp8~piogE25HmG^N!BA}@xDUq<*bvl?%dxA!iScgN;M4Ux1gWrC_n%7 zddP|2BQJ`Unx8G2Z)cC~=$~{e;p-aBEh#`m>CtJsLXI*%u@_~G9-g$R6q>VVXdS9k zO1Y3;6`-{1%?(v8#G(?b@^s^ja&*r5Rn;I^mz188e6@$J`xKk{6v*mL_ZzKk6S6^z zhx7KaHdW1HtB_5Zz8MQC%cpcY(|R52bga8$Da-0RR#*OqCNV{BbE3w{jS`IV KYX3l4{k0!v1D0t3 literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopRightEdgesWithInsets.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopRightEdgesWithInsets.png new file mode 100644 index 0000000000000000000000000000000000000000..3b6b76aad89d9f8b35514b877fd230833be49704 GIT binary patch literal 4636 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwft-re2+uTM zUj{88n}dOcQHp^Tqy&iV7^UHCH%1KxX0SLD14DZz0}E7*ACLwCpdDa65Sn=bBUCle zoCQoU)r=DsFeBI?Z726!&jnJP1s;*b3=CqbAk63)r1AkMD3j^p9|EL-7J|VEAgKYw zAR36dG$TH!SOfKb^>lFzsbG9_^>kmTCy%S+zyHf$9_LY9@n}Qr^?lY8sxBNjd5TAR zZT|hgN)8PSj7PH{%>-_m8#CR$G(3|!>dm9=!PTbc2d7fWn!hGL9 ze2wHG1}TZ#S+D==CetUS3j1$oSwMPnmfC-oVf@)MX}|LW zWssi!vM0R%V;t@kteE$O2_zuC=I-kHB@KJ3nCkvj1B1O`&vCW?7qwZQ^zZnS%CsNk zl%Gel_I%FgK4I;D{q{aT2M3lXuear%^%t68y0~ECWhN#ih2`QuZa!swGIRENjz2)3 zGktpO7V>9)LrBj}<>MfS9h;tWpI=}?t#RSvZjgHM@89&_>nPN7z9?q;&keLxBu0ZT=_z=7C&v=f;&6x~wXvUT%m2x%kji@lmCtAut*Oqai@M z5HJGPD?&_6lLAWEfGjRnmL&x*=J^0Cq?U#T6_L4)K$a6Dqo&L*bzubu1w{n~PSO+=0Lz&7Cj{~5bdc^MekML-R} zw^ug;*&K%r{?+gLGvVf&Se+$zWWcR44kmFkHBgJqA%W=;Cx}+yr_UjUJF{2ZukPb{>ZcBco@I8%VW+LLIp2Hwl>e%#=YbJ^=xH zaNE+;!9i#?w8bb7ZZQJem7QlhKnAcJ;Rl-5;2!q4@~h&>VHnXy^bF$Y|Ob q%~`;DdbHeOU>q%#DXb(OFs?ZIz0|Pe$24F?$>8bg=d#Wzp$Pyi9+^l0 literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopRightEdgesWithoutInsets.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/directionalEdgesSpec.PinTopRightEdgesWithoutInsets.png new file mode 100644 index 0000000000000000000000000000000000000000..abdb45f04becf22ea804c37b33e9f9b3a99780df GIT binary patch literal 4278 zcmeHJ-AhzK6rY(Lb*^a5E>dbnlU_rlBKp`sB}cvK-e9fFhXMmh5{!Z+iF}9}>miNQ zn|;{V!#)_4p=B6B2rejLUj~9$At?4_ZItwokYsZJeI&4TkLs^Rsql)LA<#HR=Up&#->yXam&726NMblN#G>tEjR8N5^`T2T_uz=+i*o zyCgYghTXiJD*8; z;xc7X#+p>L>Tb~Bw|$)BJ9&ZUT-?tRf;_12_GioR4k>Bpd$F!WMOu|&!y^yhUP6tz z7<-+rGkr;zX-Cr~3{xL0ENK<2R3DbG~iheOgWUAy=kBtO3lTh0)(``J`Zdu=e2}TW@2m~E(Nv_CqY$c zyHch<3)bMgFeWs%l)f8YV6&!GIvZ*{+J;Qo%gJMP(W jE6dd#SC#+bB{7Bj8^0dAc5`L1z9^Bsz1-?4u0H((8X+MI literal 0 HcmV?d00001 From a6b1311dadb3d5bddb32424b800f30bc78b2dfbf Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Fri, 23 Jun 2023 15:32:50 +0200 Subject: [PATCH 04/16] Update snapshots to adapt to top safe area change --- ...EdgesSpec.ConstrainInSuperviewSafeArea.png | Bin 28982 -> 29018 bytes ...ConstrainInSuperviewSafeAreaPinTopLeft.png | Bin 28079 -> 28089 bytes ...onstrainInSuperviewSafeAreaPinTopRight.png | Bin 28079 -> 28089 bytes ...ConstrainInSuperviewSafeAreaWithInsets.png | Bin 29142 -> 29537 bytes ...nstrainInSuperviewSafeAreaWithLeftEdge.png | Bin 28982 -> 29018 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeArea.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeArea.png index a95135ee050ceb3a7ecef6f578adfd2610d65ada..edecbe5a0994d7454e2eb0047d0930e5846a9867 100644 GIT binary patch delta 167 zcmdn?i1F4V#tE-D8~#W!-DF@e_u2TlfY;-O_PhD>>r?Af4lpqD7=Vcn*V*cR+Ovs# z-!C^~|NX^qi5#hbJBL|x&OLiHWA{#Dh_J(LhluF+&;Rvro~RTly7_{fg$Vy=a|Q;6 z|Nl?1w7y_qu=u_Chk2_m`@emU;@F<;*nBa=pJQ`+h8(llKjsd3gPE71&)$F6fJ@9~6Zvky*u8nD#k0J35Tyne%ml7o`@Qr3uUh^1=^J!H5_Xw}q0vnf`t(w41KC>@cN1*uuM!ej;!QEFu` zDYa1<+CwUs3<|wsDHdc_=!1f$)QV~;K4_@fIorL{KcI(*?}dBLy+6+H?%vOS=bZ2F za>lNj(|4$pS|uSwWlBxSAVlUNL>?QYpq5wt8(GB_W$Z{MPu@g)r6;!BOw+NnG_r;s z2ay0yOXREx-4nTR|M7NCM|iJYM#z;s5+Jror#0Jd(4G1CYTn6-t*Ol^lUmC>PF^~e z$1=Aght#iVwWuI9tB8=$Rcz->8Ifbu7?GE<$3koRfozl2&_d^{*>UXLs%JSdw0><$ zNwV0u?|tp%9mXYm(kDlA^zmN4kDHA8@-EuZ?@$<=oa%&;*S@tY3^($JyQ9=*--&3q zsfvRZwkdFO9kW7Z?sXM3 zaCIehXKV)VB{WuNOI7ED#uGy-96`lBfbfB*=900@8p2!H?xfB*=900@8p2!H?x zfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900{i&1l)my%*_## zY8N3f1MFvQKl*yhJM_Wwq{*S?(X&l2YIu($t1>dNq3uAK`+UxvR$R1iY&V|TRqgmZ zuynRosSc@Mo)Aix^0W2$V{yal_6uRAixv5ruv&#^HLo`hRCT(WT>Zon@_2KCR^n1DX3L~YX@pm%B>#EJx=k}KuBkYa_zgNKn`^(wR;tjRpb#+d`#$B7%BdxMsQb3>_Sij+%A-A_WTs@^E1X*5TB}yi zKWgXV%)u^h>eswioHBDTza(nk8vmnS4{LM*koQ|>1ppy}q`rYJhB3%HWvI;DZ`*#DZDwxy>$Nw!}4 E0~9oMzW@LL literal 28079 zcmeI*-Ahwp90%~{*`r634Z5&ebKr%B8eS}#2EF*!ayx}Kh8GsqMqsrrawg#dlWCN6 z;Y-GD5_N=d1S6OsxmYggb**wgYDlV-!j}@7l~}K&`GiH{3PRfLBqf$p&0Fcy%@=8(Xv;h_md#@xMLb&(^sxAP zYO%E2)k~SvyxHS0U1%g^{~>9iq9u2Y2eo#?`5NBxACx|dUjCIIZKd_%#_^Hv65f`I zhVmLG{jo6K;VawA%D)c0F1$X+7HBAM^<&|He?ZWCsOm-;)6BXAeRq9eDlgL<-H64V zs;2bh9EXScw!K}s&yx34HYIQAkprJZuR`BQj4zA}j0=nlex^Z9KuzHD4b;QGRS!c? zTUR#4t?w=>sBQc!L%4auezI%n3NwdIb!)XcFJVfZ*SqL?SHoH!&(EwsXvn`44HCAG zjr8gJCmk>8Q1j4jr#^BBwaxS9$;5^_SVTGpbEYEuBNYM=fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00I#BZvC#}cZuX+MVSnphwLWispW_~% zY>Qoryd!L#D+(MCx3yMvyCso-#Qa%YzN-vrT+^rBKI8pZcKovCfa!Qo{Ln~+00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG`KF3>=B zniEf@^|WTG)WKsdc?CuC^Wi75bYCWEcq1uvOK%%p4EGJr^QXDS64muyM|N6Z#xI9P z=UhuI%S}BN`N{IOG3vXgb(LD>P@s}M-0WBs&nEqgbwL@zAB)gJOzu$VV;Gev7xH*O zftAMtPD%0Cx!@#@*#*lvO8k>@5vJMhQ=eWPOev7w OW+tAgHVjwT+I|D@$}Y|T diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinTopRight.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaPinTopRight.png index 54e2650efce7dc47f362939b918d7a4413462d00..cbe146abf4e6d55071c1b628a88d72c92011128a 100644 GIT binary patch literal 28089 zcmeI5(MwZN9LLYyb<>uUh^1=^J!H5_Xw}q0vnf`t(w41KC>@cN1*uuM!ej;!QEFu` zDYa1<+CwUs3<|wsDHdc_=!1f$)QV~;K4_@fIorL{KcI(*?}dBLy+6+H?%vOS=bZ2F za>lNj(|4$pS|uSwWlBxSAVlUNL>?QYpq5wt8(GB_W$Z{MPu@g)r6;!BOw+NnG_r;s z2ay0yOXREx-4nTR|M7NCM|iJYM#z;s5+Jror#0Jd(4G1CYTn6-t*Ol^lUmC>PF^~e z$1=Aght#iVwWuI9tB8=$Rcz->8Ifbu7?GE<$3koRfozl2&_d^{*>UXLs%JSdw0><$ zNwV0u?|tp%9mXYm(kDlA^zmN4kDHA8@-EuZ?@$<=oa%&;*S@tY3^($JyQ9=*--&3q zsfvRZwkdFO9kW7Z?sXM3 zaCIehXKV)VB{WuNOI7ED#uGy-96`lBfbfB*=900@8p2!H?xfB*=900@8p2!H?x zfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900{i&1l)my%*_## zY8N3f1MFvQKl*yhJM_Wwq{*S?(X&l2YIu($t1>dNq3uAK`+UxvR$R1iY&V|TRqgmZ zuynRosSc@Mo)Aix^0W2$V{yal_6uRAixv5ruv&#^HLo`hRCT(WT>Zon@_2KCR^n1DX3L~YX@pm%B>#EJx=k}KuBkYa_zgNKn`^(wR;tjRpb#+d`#$B7%BdxMsQb3>_Sij+%A-A_WTs@^E1X*5TB}yi zKWgXV%)u^h>eswioHBDTza(nk8vmnS4{LM*koQ|>1ppy}q`rYJhB3%HWvI;DZ`*#DZDwxy>$Nw!}4 E0~9oMzW@LL literal 28079 zcmeI*-Ahwp90%~{*`r634Z5&ebKr%B8eS}#2EF*!ayx}Kh8GsqMqsrrawg#dlWCN6 z;Y-GD5_N=d1S6OsxmYggb**wgYDlV-!j}@7l~}K&`GiH{3PRfLBqf$p&0Fcy%@=8(Xv;h_md#@xMLb&(^sxAP zYO%E2)k~SvyxHS0U1%g^{~>9iq9u2Y2eo#?`5NBxACx|dUjCIIZKd_%#_^Hv65f`I zhVmLG{jo6K;VawA%D)c0F1$X+7HBAM^<&|He?ZWCsOm-;)6BXAeRq9eDlgL<-H64V zs;2bh9EXScw!K}s&yx34HYIQAkprJZuR`BQj4zA}j0=nlex^Z9KuzHD4b;QGRS!c? zTUR#4t?w=>sBQc!L%4auezI%n3NwdIb!)XcFJVfZ*SqL?SHoH!&(EwsXvn`44HCAG zjr8gJCmk>8Q1j4jr#^BBwaxS9$;5^_SVTGpbEYEuBNYM=fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00I#BZvC#}cZuX+MVSnphwLWispW_~% zY>Qoryd!L#D+(MCx3yMvyCso-#Qa%YzN-vrT+^rBKI8pZcKovCfa!Qo{Ln~+00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG`KF3>=B zniEf@^|WTG)WKsdc?CuC^Wi75bYCWEcq1uvOK%%p4EGJr^QXDS64muyM|N6Z#xI9P z=UhuI%S}BN`N{IOG3vXgb(LD>P@s}M-0WBs&nEqgbwL@zAB)gJOzu$VV;Gev7xH*O zftAMtPD%0Cx!@#@*#*lvO8k>@5vJMhQ=eWPOev7w OW+tAgHVjwT+I|D@$}Y|T diff --git a/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaWithInsets.png b/ADUtilsTests/__Snapshots__/ViewInsertionWithMarginTest/standardEdgesSpec.ConstrainInSuperviewSafeAreaWithInsets.png index 445c0efd540a82f02085ed5182785e0bef321461..7898eabbedec0e3c246f34b3c51488a766c10e2e 100644 GIT binary patch delta 2071 zcmeIz;ZIvt7zXfO=q+PC0%EzNqopm-(n2X+fu74UXbTvDY_3E>&}^X@Zdn9b6Lm-! zmUaj+GP=Ff5a%4pmxUJFSarFr(H+x@tkxbw0h>XcKhpXp7Q-Q zV+l;&(=ejg!|Ir;ei6etSGH%F2QRZ4>pCzKI6%(+DJ+F}ls(lFzj3cgmXP z55YnK&jx&V9y1V5!RWLv`P0KwJ~X6!=!I7cUFd|f-Sf(4zmTswPJoy5v*j`GJ<>sO z5#}z(EOxhCI+h)4TPOULCkV%_`t7nN?Tv{?Fjd5}aRiSAnH{6&y8f6vzk7=OGa^*k zi4Z02@S$B4W>W>BdLY>lYYXn3kN7?hO1j1f-T*)6V{}nIwCVhx)t{j2L}*ru!myGE zw0Yz%+*i5~j*@mL-t1?4q>ANonAnWDp6C>7h0qp3FnX#7&~@iWUCZE3O)wMrC*RDwXK2s3+hOw2x3u{;JIGIrah%KYYgA8b3%jL-ni5Qz3G@sh)%Iqc(+Ip+>^(xB)>5B0i$)^Xj?G$)(u$qiJT16^K#4f^hM_QG%;=FZU})(Lyb&Js>#p~qQ|oo)K)S7Wh+KCwD$@RC#^2|4hn`~ z(HeMiXM4AhJDcvX4zT1106m?DfU${pcBzfr*|atRx@<1AgNo$NzG?IS|5o^~y%p5| r@>X~pCy}hKe%bqD%~%QU-l{lVH*hqt^~@U*@~L|E`HHh;jsAZC`RWw< delta 1874 zcmdtj?N3`(90%||T}F40jy3EeqdA5PyUN#-z1RPr+n!yOf*f@n6Vi+N# zl<{ULHvCvvuo29L%`zs#naK+t8kT97$s0%ri70bJGct#ZVcE>odamxC3;%+B*%#l> z{hjacp8L};%Edd%z?#wZ!T3t!xI*D7F5NF2ZdLxeDD>XrIZb#vI`U4N>%F(@_j#(W zJgdyv`QmuEim-TpfU#&ab-y+NLg z2ut}ykVz*Posux>6os<0I+Hpt@Ybyj-*`aLS;xdbs)LdgjGE(1?8on&DNGCyp|C&_ zP81Mmf+cW3HT~Wp2*j$RPQ{r>ylP z-4oLbAwADDk+CtXl78&+*f+tPECN(qfRH%O=1vI3g2fY9_seUG?t6Z*tl~l|HIa=jrVA4zgx3+4Q z#Lpu=G#Pm2$5_jH6O58}>f{|BfZq%vK+ib@g=rFSEe$6GIof1s+lSqn*gvy|C!$&K znH96==zi;=DqRu+>7qdAw!=cYfQq#Aq(flH=+YR6Cx#%D!E-sZ$SwKZ*%+Op+s&5) zpNW~tot4Wg(2|MKw7kN0_&QSrs8|6S<5Qr=NC4Vo`HtsUZQSD{Zg2Dmcycg0K$n{U zdXogym_&fiT?e0-idh{!=nA-N>SD^=-j}XJvl(-5&?dJ4uh|Jece^>*XTdS88N(AZ zov_#9LhV*McpY?D2tdIh_|75$hphylO$JjOoX+szBDr%eLN2*;dg*dE2VvDpg|sYD zpp#ESLsl`HNyQj zX*ggb`P3_dew&o9&msA8lY5WZGTpbT$(>dWe>gGH%dZm;qd8Lk8mZ?HoxA;cuz=OvZtOlgxv=FTH|PK067%V9dm&(#F6=qd&Ip~F>r?Af4lpqD7=Vcn*V*cR+Ovs# z-!C^~|NX^qi5#hbJBL|x&OLiHWA{#Dh_J(LhluF+&;Rvro~RTly7_{fg$Vy=a|Q;6 z|Nl?1w7y_qu=u_Chk2_m`@emU;@F<;*nBa=pJQ`+h8(llKjsd3gPE71&)$F6fJ@9~6Zvky*u8nD#k0J35Tyne%ml7o`@Qr3 Date: Fri, 23 Jun 2023 15:36:56 +0200 Subject: [PATCH 05/16] Update simulator used for tests --- fastlane/Fastfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 4f296c9..681da75 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -5,7 +5,7 @@ lane :tests do configuration: "Stubs", scheme: "ADUtilsApp", clean: true, - devices: ["iPhone 8"] + devices: ["iPhone SE (3rd generation)"] ) end From 717f16a1c4882f3ac0e91f79460c4fa64bfd4d99 Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Mon, 3 Jul 2023 11:04:16 +0200 Subject: [PATCH 06/16] Update ruby and gems --- .github/workflows/cd.yml | 3 +- .github/workflows/ci.yml | 2 +- .github/workflows/prepare_release.yml | 3 +- Gemfile | 6 +- Gemfile.lock | 252 ++++++++++++++------------ 5 files changed, 141 insertions(+), 125 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index f793cac..313b3db 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -15,7 +15,8 @@ jobs: - uses: ruby/setup-ruby@v1 with: - ruby-version: 2.6.5 + ruby-version: 3.1.4 + bundler-cache: true - name: Bundle install run: bundle install diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8978baf..3139421 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: - uses: ruby/setup-ruby@v1 with: - ruby-version: 2.6.5 + ruby-version: 3.1.4 bundler-cache: true - name: Pods cache diff --git a/.github/workflows/prepare_release.yml b/.github/workflows/prepare_release.yml index 15b20ce..96812af 100644 --- a/.github/workflows/prepare_release.yml +++ b/.github/workflows/prepare_release.yml @@ -14,7 +14,8 @@ jobs: - uses: ruby/setup-ruby@v1 with: - ruby-version: 2.6.5 + ruby-version: 3.1.4 + bundler-cache: true - name: Bundle install run: bundle install diff --git a/Gemfile b/Gemfile index 573023f..a7f19a2 100644 --- a/Gemfile +++ b/Gemfile @@ -1,8 +1,8 @@ source 'https://rubygems.org' -ruby '2.6.5' +ruby '3.1.4' -gem 'cocoapods', '1.11.3' -gem 'CFPropertyList', '3.0.0' +gem 'cocoapods', '~> 1.12' +gem 'CFPropertyList', '~> 3.0.0' gem 'fastlane', '<3.0' gem 'danger' gem 'danger-swiftlint' diff --git a/Gemfile.lock b/Gemfile.lock index 9f3d79b..d75279e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,35 +1,35 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.0) - activesupport (6.1.6.1) + CFPropertyList (3.0.6) + rexml + activesupport (7.0.6) 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.4) + public_suffix (>= 2.0.2, < 6.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) artifactory (3.0.15) atomos (0.1.3) - aws-eventstream (1.1.1) - aws-partitions (1.434.0) - aws-sdk-core (3.113.0) + aws-eventstream (1.2.0) + aws-partitions (1.782.0) + aws-sdk-core (3.176.1) aws-eventstream (~> 1, >= 1.0.2) - aws-partitions (~> 1, >= 1.239.0) - aws-sigv4 (~> 1.1) - jmespath (~> 1.0) - aws-sdk-kms (1.43.0) - aws-sdk-core (~> 3, >= 3.112.0) + aws-partitions (~> 1, >= 1.651.0) + aws-sigv4 (~> 1.5) + jmespath (~> 1, >= 1.6.1) + aws-sdk-kms (1.68.0) + aws-sdk-core (~> 3, >= 3.176.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.92.0) - aws-sdk-core (~> 3, >= 3.112.0) + aws-sdk-s3 (1.127.0) + aws-sdk-core (~> 3, >= 3.176.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.1) - aws-sigv4 (1.2.3) + aws-sigv4 (~> 1.6) + aws-sigv4 (1.6.0) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) claide (1.1.0) @@ -37,15 +37,15 @@ GEM cork nap open4 (~> 1.3) - cocoapods (1.11.3) + cocoapods (1.12.1) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.11.3) + cocoapods-core (= 1.12.1) 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) @@ -53,10 +53,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.1) + activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) concurrent-ruby (~> 1.1) @@ -76,62 +76,79 @@ GEM cocoapods-try (1.2.0) colored (1.2) colored2 (3.1.2) - commander-fastlane (4.4.6) - highline (~> 1.7.2) - concurrent-ruby (1.1.10) + commander (4.6.0) + highline (~> 2.0.0) + concurrent-ruby (1.2.2) cork (0.3.0) colored2 (~> 3.1) - danger (8.2.3) + danger (9.3.1) 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) + git (~> 1.13) kramdown (~> 2.3) kramdown-parser-gfm (~> 1.0) no_proxy_fix - octokit (~> 4.7) + octokit (~> 6.0) terminal-table (>= 1, < 4) - danger-swiftlint (0.24.5) + danger-swiftlint (0.33.0) danger rake (> 10) thor (~> 0.19) declarative (0.0.20) - declarative-option (0.1.0) - digest-crc (0.6.3) + digest-crc (0.6.4) rake (>= 12.0.0, < 14.0.0) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) - dotenv (2.7.6) - emoji_regex (3.2.2) + dotenv (2.8.1) + emoji_regex (3.2.3) escape (0.0.4) - ethon (0.15.0) + ethon (0.16.0) ffi (>= 1.15.0) - excon (0.79.0) - faraday (1.3.0) + excon (0.100.0) + faraday (1.10.3) + 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) - multipart-post (>= 1.2, < 3) - ruby2_keywords + faraday-net_http_persistent (~> 1.0) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) + faraday-retry (~> 1.0) + ruby2_keywords (>= 0.0.4) faraday-cookie_jar (0.0.7) faraday (>= 0.8.0) http-cookie (~> 1.0.0) - faraday-http-cache (2.2.0) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) + faraday-excon (1.1.0) + faraday-http-cache (2.5.0) faraday (>= 0.8) + faraday-httpclient (1.0.1) + faraday-multipart (1.0.4) + multipart-post (~> 2) faraday-net_http (1.0.1) - faraday_middleware (1.0.0) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + faraday-retry (1.0.3) + faraday_middleware (1.2.0) faraday (~> 1.0) - fastimage (2.2.3) - fastlane (2.178.0) + fastimage (2.2.7) + fastlane (2.213.0) CFPropertyList (>= 2.3, < 4.0.0) - addressable (>= 2.3, < 3.0.0) + addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) aws-sdk-s3 (~> 1.0) babosa (>= 1.0.3, < 2.0.0) bundler (>= 1.12.0, < 3.0.0) colored - commander-fastlane (>= 4.4.6, < 5.0.0) + commander (~> 4.6) dotenv (>= 2.1.1, < 3.0.0) emoji_regex (>= 0.1, < 4.0) excon (>= 0.71.0, < 1.0.0) @@ -140,19 +157,20 @@ GEM faraday_middleware (~> 1.0) fastimage (>= 2.1.0, < 3.0.0) gh_inspector (>= 1.1.2, < 2.0.0) - google-api-client (>= 0.37.0, < 0.39.0) - google-cloud-storage (>= 1.15.0, < 2.0.0) - highline (>= 1.7.2, < 2.0.0) + google-apis-androidpublisher_v3 (~> 0.3) + google-apis-playcustomapp_v1 (~> 0.1) + google-cloud-storage (~> 1.31) + highline (~> 2.0) json (< 3.0.0) jwt (>= 2.1.0, < 3) mini_magick (>= 4.9.4, < 5.0.0) - multipart-post (~> 2.0.0) + multipart-post (>= 2.0.0, < 3.0.0) naturally (~> 2.2) + optparse (~> 0.1.1) plist (>= 3.1.0, < 4.0.0) rubyzip (>= 2.0.0, < 3.0.0) security (= 0.1.3) simctl (~> 1.6.3) - slack-notifier (>= 2.0.0, < 3.0.0) terminal-notifier (>= 2.0.0, < 3.0.0) terminal-table (>= 1.4.5, < 2.0.0) tty-screen (>= 0.6.3, < 1.0.0) @@ -166,126 +184,123 @@ GEM fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) - git (1.8.1) + git (1.18.0) + addressable (~> 2.8) rchardet (~> 1.8) - google-api-client (0.38.0) + google-apis-androidpublisher_v3 (0.45.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-core (0.11.0) addressable (~> 2.5, >= 2.5.1) - googleauth (~> 0.9) - httpclient (>= 2.8.1, < 3.0) + googleauth (>= 0.16.2, < 2.a) + httpclient (>= 2.8.1, < 3.a) mini_mime (~> 1.0) representable (~> 3.0) - retriable (>= 2.0, < 4.0) - signet (~> 0.12) - google-apis-core (0.3.0) - addressable (~> 2.5, >= 2.5.1) - googleauth (~> 0.14) - httpclient (>= 2.8.1, < 3.0) - mini_mime (~> 1.0) - representable (~> 3.0) - retriable (>= 2.0, < 4.0) + retriable (>= 2.0, < 4.a) rexml - signet (~> 0.14) webrick - google-apis-iamcredentials_v1 (0.2.0) - google-apis-core (~> 0.1) - google-apis-storage_v1 (0.3.0) - google-apis-core (~> 0.1) + google-apis-iamcredentials_v1 (0.17.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-playcustomapp_v1 (0.13.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-storage_v1 (0.19.0) + google-apis-core (>= 0.9.0, < 2.a) google-cloud-core (1.6.0) google-cloud-env (~> 1.0) google-cloud-errors (~> 1.0) - google-cloud-env (1.5.0) - faraday (>= 0.17.3, < 2.0) - google-cloud-errors (1.1.0) - google-cloud-storage (1.31.0) - addressable (~> 2.5) + google-cloud-env (1.6.0) + faraday (>= 0.17.3, < 3.0) + google-cloud-errors (1.3.1) + google-cloud-storage (1.44.0) + addressable (~> 2.8) digest-crc (~> 0.4) google-apis-iamcredentials_v1 (~> 0.1) - google-apis-storage_v1 (~> 0.1) - google-cloud-core (~> 1.2) - googleauth (~> 0.9) + google-apis-storage_v1 (~> 0.19.0) + google-cloud-core (~> 1.6) + googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (0.16.0) - faraday (>= 0.17.3, < 2.0) + googleauth (1.6.0) + faraday (>= 0.17.3, < 3.a) jwt (>= 1.4, < 3.0) memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) - signet (~> 0.14) - highline (1.7.10) - http-cookie (1.0.3) + signet (>= 0.16, < 2.a) + highline (2.0.3) + http-cookie (1.0.5) domain_name (~> 0.5) httpclient (2.8.3) - i18n (1.12.0) + i18n (1.14.1) concurrent-ruby (~> 1.0) - jmespath (1.4.0) - json (2.6.2) - jwt (2.2.2) - kramdown (2.3.1) + jmespath (1.6.2) + json (2.6.3) + jwt (2.7.1) + kramdown (2.4.0) rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) memoist (0.16.2) - mini_magick (4.11.0) - mini_mime (1.0.2) - minitest (5.16.2) + mini_magick (4.12.0) + mini_mime (1.1.2) + minitest (5.18.1) molinillo (0.8.0) multi_json (1.15.0) - multipart-post (2.0.0) + multipart-post (2.3.0) nanaimo (0.3.0) nap (1.1.0) naturally (2.2.1) netrc (0.11.0) no_proxy_fix (0.1.2) - octokit (4.20.0) - faraday (>= 0.9) - sawyer (~> 0.8.0, >= 0.5.3) + octokit (6.1.1) + faraday (>= 1, < 3) + sawyer (~> 0.9) open4 (1.3.4) - os (1.1.1) - plist (3.6.0) + optparse (0.1.1) + os (1.1.4) + plist (3.7.0) public_suffix (4.0.7) - rake (13.0.3) + rake (13.0.6) rchardet (1.8.0) - representable (3.0.4) + representable (3.2.0) declarative (< 0.1.0) - declarative-option (< 0.2.0) + trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.2.4) + rexml (3.2.5) rouge (2.0.7) ruby-macho (2.5.1) - ruby2_keywords (0.0.4) - rubyzip (2.3.0) - sawyer (0.8.2) + ruby2_keywords (0.0.5) + rubyzip (2.3.2) + sawyer (0.9.2) addressable (>= 2.3.5) - faraday (> 0.8, < 2.0) + faraday (>= 0.17.3, < 3) security (0.1.3) - signet (0.15.0) - addressable (~> 2.3) - faraday (>= 0.17.3, < 2.0) + signet (0.17.0) + addressable (~> 2.8) + faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) - simctl (1.6.8) + simctl (1.6.10) CFPropertyList naturally - slack-notifier (2.3.2) terminal-notifier (2.0.0) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) thor (0.20.3) + trailblazer-option (0.1.2) tty-cursor (0.7.1) tty-screen (0.8.1) tty-spinner (0.9.3) tty-cursor (~> 0.7) typhoeus (1.4.0) ethon (>= 0.9.0) - tzinfo (2.0.5) + tzinfo (2.0.6) concurrent-ruby (~> 1.0) uber (0.1.0) unf (0.1.4) unf_ext - unf_ext (0.0.7.7) - unicode-display_width (1.7.0) - webrick (1.7.0) + unf_ext (0.0.8.2) + unicode-display_width (1.8.0) + webrick (1.8.1) word_wrap (1.0.0) xcodeproj (1.22.0) CFPropertyList (>= 2.3.3, < 4.0) @@ -298,21 +313,20 @@ GEM rouge (~> 2.0.7) xcpretty-travis-formatter (1.0.1) xcpretty (~> 0.2, >= 0.0.7) - zeitwerk (2.6.0) PLATFORMS ruby DEPENDENCIES - CFPropertyList (= 3.0.0) - cocoapods (= 1.11.3) + CFPropertyList (~> 3.0.0) + cocoapods (~> 1.12) danger danger-swiftlint fastlane (< 3.0) fastlane-plugin-changelog RUBY VERSION - ruby 2.6.5p114 + ruby 3.1.4p223 BUNDLED WITH - 2.3.17 + 2.3.16 From f76844c5c3bb9d1cb5dd892bccf3bc496434a6e3 Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Mon, 3 Jul 2023 13:17:15 +0200 Subject: [PATCH 07/16] Update Podfile.lock --- Podfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Podfile.lock b/Podfile.lock index 9c3c2e0..76ac3d1 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -38,4 +38,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: a085ff0ceae15032eb100393c6df98696f11d7af -COCOAPODS: 1.11.3 +COCOAPODS: 1.12.1 From a5fddadedd5db4f8d03ff3988eaa56b0d3b457be Mon Sep 17 00:00:00 2001 From: Thomas Esterlin Date: Mon, 6 Mar 2023 11:25:54 +0100 Subject: [PATCH 08/16] provide SwiftUI Font from DynamicFont --- Modules/ADUtils/DynamicFont.swift | 37 +++++++++++++++++- Modules/ADUtils/FontDescription.swift | 56 ++++++++++++++++++++++++++- 2 files changed, 91 insertions(+), 2 deletions(-) diff --git a/Modules/ADUtils/DynamicFont.swift b/Modules/ADUtils/DynamicFont.swift index 313e9a4..7101798 100644 --- a/Modules/ADUtils/DynamicFont.swift +++ b/Modules/ADUtils/DynamicFont.swift @@ -7,6 +7,7 @@ import Foundation import UIKit +import SwiftUI /** The DynamicFontProvider protocol provides a font depending on parameters @@ -14,10 +15,17 @@ import UIKit public protocol DynamicFontProvider { /** - Provides a font for the given textStyle + Provides a UIKit font for the given textStyle - parameter textStyle: The font text style */ func font(forTextStyle textStyle: UIFont.TextStyle) -> UIFont + + /** + Provides a SwiftUI font for the given textStyle + - parameter textStyle: The font text style + */ + @available(iOS 13.0, *) + func font(forTextStyle textStyle: Font.TextStyle) -> Font } /** @@ -54,6 +62,11 @@ public struct DynamicFont: DynamicFontProvider { public func font(forTextStyle textStyle: UIFont.TextStyle) -> UIFont { return provider.font(forTextStyle: textStyle) } + + @available(iOS 13.0, *) + public func font(forTextStyle textStyle: Font.TextStyle) -> Font { + return provider.font(forTextStyle: textStyle) + } } private struct DefaultDynamicFontProvider: DynamicFontProvider { @@ -63,6 +76,11 @@ private struct DefaultDynamicFontProvider: DynamicFontProvider { func font(forTextStyle textStyle: UIFont.TextStyle) -> UIFont { return UIFont.preferredFont(forTextStyle: textStyle) } + + @available(iOS 13.0, *) + func font(forTextStyle textStyle: Font.TextStyle) -> Font { + return Font.system(textStyle) + } } private struct CustomFontDynamicFontProvider: DynamicFontProvider { @@ -81,6 +99,16 @@ private struct CustomFontDynamicFontProvider: DynamicFontProvider { } } + @available(iOS 13.0, *) + func font(forTextStyle textStyle: Font.TextStyle) -> Font { + do { + return try throwingFont(forTextStyle: textStyle) + } catch { + assertionFailure("[DynamicFont] Missing font for \(fontDescription.name) with style : \(textStyle)") + return Font.system(textStyle) + } + } + // MARK: - Private private var currentSpecifiedContentSizeCategory: UIContentSizeCategory { @@ -92,6 +120,13 @@ private struct CustomFontDynamicFontProvider: DynamicFontProvider { return currentContentSizeCategory } + @available(iOS 13.0, *) + private func throwingFont(forTextStyle textStyle: Font.TextStyle) throws -> Font { + let styleDescription = try fontDescription.fontStyleDescription(for: textStyle) + let customFont = Font.custom(styleDescription.name, size: styleDescription.size) + return customFont + } + private func throwingFont(forTextStyle textStyle: UIFont.TextStyle) throws -> UIFont { let styleDescription = try fontDescription.fontStyleDescription(for: textStyle) let customFont = UIFont(name: styleDescription.name, size: styleDescription.size) diff --git a/Modules/ADUtils/FontDescription.swift b/Modules/ADUtils/FontDescription.swift index fa73a84..2a60988 100644 --- a/Modules/ADUtils/FontDescription.swift +++ b/Modules/ADUtils/FontDescription.swift @@ -7,6 +7,7 @@ import Foundation import UIKit +import SwiftUI private typealias FontDescriptionDictionary = [UIFont.TextStyle.RawValue: FontStyleDescription] @@ -59,7 +60,23 @@ struct FontDescription { - returns: the FontStyleDescription corresponding to the text style, as specified in the plist */ func fontStyleDescription(for fontTextStyle: UIFont.TextStyle) throws -> FontStyleDescription { - guard let fontStyleDescription = dictionary[fontTextStyle.rawValue] else { + try fontStyleDescription(for: fontTextStyle.rawValue) + } + + /** + Provides the font for the given text style + - parameter fontTextStyle: the text style + - returns: the FontStyleDescription corresponding to the text style, as specified in the plist + */ + @available(iOS 13.0, *) + func fontStyleDescription(for fontTextStyle: Font.TextStyle) throws -> FontStyleDescription { + try fontStyleDescription(for: fontTextStyle.rawValue) + } + + // MARK: - Private + + private func fontStyleDescription(for stringValue: String) throws -> FontStyleDescription { + guard let fontStyleDescription = dictionary[stringValue] else { throw FontDescriptionError.styleForFontUnavailable } return fontStyleDescription @@ -85,3 +102,40 @@ enum FontDescriptionError: Error { case plistMissing case fontMissing } + +@available(iOS 13.0, *) +fileprivate extension Font.TextStyle { + + // MARK: - Font + + // ???: (Thomas Esterlin) 2023/03/06 I used these values to be able to keep the same plist + // if dev want to use it for both UIKit and SwiftUI + var rawValue: String { + switch self { + case .largeTitle: + return UIFont.TextStyle.largeTitle.rawValue + case .title: + return UIFont.TextStyle.title1.rawValue + case .title2: + return UIFont.TextStyle.title2.rawValue + case .title3: + return UIFont.TextStyle.title3.rawValue + case .headline: + return UIFont.TextStyle.headline.rawValue + case .subheadline: + return UIFont.TextStyle.subheadline.rawValue + case .body: + return UIFont.TextStyle.body.rawValue + case .callout: + return UIFont.TextStyle.callout.rawValue + case .footnote: + return UIFont.TextStyle.footnote.rawValue + case .caption: + return UIFont.TextStyle.caption1.rawValue + case .caption2: + return UIFont.TextStyle.caption2.rawValue + @unknown default: + return "" + } + } +} From 3ed413a67de5a23e77f47d215db148bb81d2edce Mon Sep 17 00:00:00 2001 From: Thomas Esterlin Date: Mon, 6 Mar 2023 11:48:11 +0100 Subject: [PATCH 09/16] update changelog and readme --- CHANGELOG.md | 4 ++++ README.md | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6dd398a..d0db2f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Created + +- Add a SwiftUI Font provider in `DynamicFont` + ## [11.3.0] - 2022-08-01Z ### Created diff --git a/README.md b/README.md index 087af0a..10727f2 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ [![Twitter](https://img.shields.io/badge/twitter-@FabernovelTech-blue.svg?style=flat)](https://twitter.com/FabernovelTech) ![](https://github.com/faberNovel/ADUtils/workflows/CI/badge.svg) -ADUtils is a set of helpers, shortcuts or other tools providing simplified interactions with UIKit and more generally with Swift. +ADUtils is a set of helpers, shortcuts or other tools providing simplified interactions with UIKit and SwiftUI. - [Features](#features) - [ADUtils](#adutils) From 5393b990b61ed89fa2c42d246902c97a03a8f965 Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Mon, 3 Jul 2023 10:46:22 +0200 Subject: [PATCH 10/16] Use new Font API from iOS 14 if possible to improve scaling sizes --- Modules/ADUtils/DynamicFont.swift | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Modules/ADUtils/DynamicFont.swift b/Modules/ADUtils/DynamicFont.swift index 7101798..17cf30e 100644 --- a/Modules/ADUtils/DynamicFont.swift +++ b/Modules/ADUtils/DynamicFont.swift @@ -23,6 +23,8 @@ public protocol DynamicFontProvider { /** Provides a SwiftUI font for the given textStyle - parameter textStyle: The font text style + - Note: On iOS 13 the font will scale like the body text style. + From iOS 14 it will scale like the provided text style. */ @available(iOS 13.0, *) func font(forTextStyle textStyle: Font.TextStyle) -> Font @@ -123,7 +125,12 @@ private struct CustomFontDynamicFontProvider: DynamicFontProvider { @available(iOS 13.0, *) private func throwingFont(forTextStyle textStyle: Font.TextStyle) throws -> Font { let styleDescription = try fontDescription.fontStyleDescription(for: textStyle) - let customFont = Font.custom(styleDescription.name, size: styleDescription.size) + let customFont: Font + if #available(iOS 14.0, *) { + customFont = Font.custom(styleDescription.name, size: styleDescription.size, relativeTo: textStyle) + } else { + customFont = Font.custom(styleDescription.name, size: styleDescription.size) + } return customFont } From 6b76212f899e79f9fccee3dadddd90069c2f8349 Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Mon, 3 Jul 2023 11:26:07 +0200 Subject: [PATCH 11/16] Add missing tvOS version availability in fonts related files --- Modules/ADUtils/DynamicFont.swift | 12 ++++++------ Modules/ADUtils/FontDescription.swift | 9 +++++++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Modules/ADUtils/DynamicFont.swift b/Modules/ADUtils/DynamicFont.swift index 17cf30e..1abe19f 100644 --- a/Modules/ADUtils/DynamicFont.swift +++ b/Modules/ADUtils/DynamicFont.swift @@ -26,7 +26,7 @@ public protocol DynamicFontProvider { - Note: On iOS 13 the font will scale like the body text style. From iOS 14 it will scale like the provided text style. */ - @available(iOS 13.0, *) + @available(iOS 13.0, tvOS 13.0, *) func font(forTextStyle textStyle: Font.TextStyle) -> Font } @@ -65,7 +65,7 @@ public struct DynamicFont: DynamicFontProvider { return provider.font(forTextStyle: textStyle) } - @available(iOS 13.0, *) + @available(iOS 13.0, tvOS 13.0, *) public func font(forTextStyle textStyle: Font.TextStyle) -> Font { return provider.font(forTextStyle: textStyle) } @@ -79,7 +79,7 @@ private struct DefaultDynamicFontProvider: DynamicFontProvider { return UIFont.preferredFont(forTextStyle: textStyle) } - @available(iOS 13.0, *) + @available(iOS 13.0, tvOS 13.0, *) func font(forTextStyle textStyle: Font.TextStyle) -> Font { return Font.system(textStyle) } @@ -101,7 +101,7 @@ private struct CustomFontDynamicFontProvider: DynamicFontProvider { } } - @available(iOS 13.0, *) + @available(iOS 13.0, tvOS 13.0, *) func font(forTextStyle textStyle: Font.TextStyle) -> Font { do { return try throwingFont(forTextStyle: textStyle) @@ -122,11 +122,11 @@ private struct CustomFontDynamicFontProvider: DynamicFontProvider { return currentContentSizeCategory } - @available(iOS 13.0, *) + @available(iOS 13.0, tvOS 13.0, *) private func throwingFont(forTextStyle textStyle: Font.TextStyle) throws -> Font { let styleDescription = try fontDescription.fontStyleDescription(for: textStyle) let customFont: Font - if #available(iOS 14.0, *) { + if #available(iOS 14.0, tvOS 14.0, *) { customFont = Font.custom(styleDescription.name, size: styleDescription.size, relativeTo: textStyle) } else { customFont = Font.custom(styleDescription.name, size: styleDescription.size) diff --git a/Modules/ADUtils/FontDescription.swift b/Modules/ADUtils/FontDescription.swift index 2a60988..e011597 100644 --- a/Modules/ADUtils/FontDescription.swift +++ b/Modules/ADUtils/FontDescription.swift @@ -68,7 +68,7 @@ struct FontDescription { - parameter fontTextStyle: the text style - returns: the FontStyleDescription corresponding to the text style, as specified in the plist */ - @available(iOS 13.0, *) + @available(iOS 13.0, tvOS 13.0, *) func fontStyleDescription(for fontTextStyle: Font.TextStyle) throws -> FontStyleDescription { try fontStyleDescription(for: fontTextStyle.rawValue) } @@ -103,7 +103,7 @@ enum FontDescriptionError: Error { case fontMissing } -@available(iOS 13.0, *) +@available(iOS 13.0, tvOS 13.0, *) fileprivate extension Font.TextStyle { // MARK: - Font @@ -113,7 +113,12 @@ fileprivate extension Font.TextStyle { var rawValue: String { switch self { case .largeTitle: +#if os(tvOS) + // ???: (Alexandre Podlewski) 03/07/2023 UIFont.TextStyle.largeTitle is not available in tvOS + return "UICTFontTextStyleTitle0" +#else return UIFont.TextStyle.largeTitle.rawValue +#endif case .title: return UIFont.TextStyle.title1.rawValue case .title2: From a18d4e004fa0d07101df590d8d2e96e8d6fcde12 Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Mon, 3 Jul 2023 11:26:34 +0200 Subject: [PATCH 12/16] Add missing tvOS version availability --- Modules/ADUtils/UILayoutGuide+Constraints.swift | 2 +- Modules/ADUtils/UIView+Constraints.swift | 2 +- Modules/ADUtils/UIView+LayoutGuideConstraints.swift | 2 +- Modules/ADUtils/UIViewController+ChildInsertion.swift | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/ADUtils/UILayoutGuide+Constraints.swift b/Modules/ADUtils/UILayoutGuide+Constraints.swift index 4c9b900..065ecab 100644 --- a/Modules/ADUtils/UILayoutGuide+Constraints.swift +++ b/Modules/ADUtils/UILayoutGuide+Constraints.swift @@ -689,7 +689,7 @@ extension UILayoutGuide { } } -@available(iOS 13.0, *) +@available(iOS 13.0, tvOS 13.0, *) @available(tvOSApplicationExtension 13.0, *) extension UILayoutGuide { /** diff --git a/Modules/ADUtils/UIView+Constraints.swift b/Modules/ADUtils/UIView+Constraints.swift index 212d025..afdf953 100644 --- a/Modules/ADUtils/UIView+Constraints.swift +++ b/Modules/ADUtils/UIView+Constraints.swift @@ -361,7 +361,7 @@ extension UIView { } } -@available(iOS 13.0, *) +@available(iOS 13.0, tvOS 13.0, *) @available(tvOSApplicationExtension 13.0, *) extension UIView { diff --git a/Modules/ADUtils/UIView+LayoutGuideConstraints.swift b/Modules/ADUtils/UIView+LayoutGuideConstraints.swift index b3adcfa..c3a518e 100644 --- a/Modules/ADUtils/UIView+LayoutGuideConstraints.swift +++ b/Modules/ADUtils/UIView+LayoutGuideConstraints.swift @@ -644,7 +644,7 @@ extension UIView { } } -@available(iOS 13.0, *) +@available(iOS 13.0, tvOS 13.0, *) @available(tvOSApplicationExtension 13.0, *) extension UIView { diff --git a/Modules/ADUtils/UIViewController+ChildInsertion.swift b/Modules/ADUtils/UIViewController+ChildInsertion.swift index 5693781..0e63c76 100644 --- a/Modules/ADUtils/UIViewController+ChildInsertion.swift +++ b/Modules/ADUtils/UIViewController+ChildInsertion.swift @@ -63,7 +63,7 @@ extension UIViewController { } } -@available(iOS 13.0, *) +@available(iOS 13.0, tvOS 13.0, *) @available(tvOSApplicationExtension 13.0, *) extension UIViewController { From 36e665d615682a5b7d6750d558b072623bf44941 Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Mon, 3 Jul 2023 13:13:22 +0200 Subject: [PATCH 13/16] Add snapshot test for SwiftUI dynamic fonts --- ADUtilsTests/DynamicFontTest.swift | 52 +++++++++++++++++- .../spec.SwiftUIDynamicFontLayoutTest.png | Bin 0 -> 85183 bytes 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 ADUtilsTests/__Snapshots__/DynamicFontTest/spec.SwiftUIDynamicFontLayoutTest.png diff --git a/ADUtilsTests/DynamicFontTest.swift b/ADUtilsTests/DynamicFontTest.swift index a4f6140..d1dce6c 100644 --- a/ADUtilsTests/DynamicFontTest.swift +++ b/ADUtilsTests/DynamicFontTest.swift @@ -5,7 +5,8 @@ // Created by Benjamin Lavialle on 25/10/2017. // -import Foundation +import UIKit +import SwiftUI import Quick import ADUtils import Nimble @@ -18,6 +19,13 @@ private extension UIFont { } } +private extension Font { + + static func ad_mainFont(forTextStyle textStyle: Font.TextStyle) -> Font { + return FontHelper.shared.helveticaNeueDynamicFont.font(forTextStyle: textStyle) + } +} + private class FontHelper { static let shared = FontHelper() @@ -36,7 +44,7 @@ class DynamicFontTest: QuickSpec { override class func spec() { - describe("display fonts") { + describe("display UIKit fonts") { let types: [UIFont.TextStyle] = [ .title1, @@ -71,5 +79,45 @@ class DynamicFontTest: QuickSpec { assertSnapshot(matching: stackView, as: .image, named: "DynamicFontLayoutTest") } } + + describe("display SwiftUI fonts") { + + @available(iOS 14.0, *) + struct DynamicFontsView: View { + + let types: [Font.TextStyle] = [ + .title, + .title2, + .title3, + .headline, + .subheadline, + .body, + .callout, + .footnote, + .caption, + .caption2 + ] + + var body: some View { + VStack(alignment: .leading, spacing: 8) { + ForEach(types.indices, id: \.self) { index in + Text("Lorem sizzle pimpin' sit amizzle").font(.ad_mainFont(forTextStyle: types[index])) + } + } + } + } + it("should layout labels properly") { + if #available(iOS 14.0, *) { + let view = DynamicFontsView() + assertSnapshot( + matching: view, + as: .image(layout: .fixed(width: 200, height: 1000)), + named: "SwiftUIDynamicFontLayoutTest" + ) + } else { + throw XCTSkip("title2, title3, caption2 are only available on iOS 14") + } + } + } } } diff --git a/ADUtilsTests/__Snapshots__/DynamicFontTest/spec.SwiftUIDynamicFontLayoutTest.png b/ADUtilsTests/__Snapshots__/DynamicFontTest/spec.SwiftUIDynamicFontLayoutTest.png new file mode 100644 index 0000000000000000000000000000000000000000..45e1a7f9996f93651df2a2f0892441fea0b33b7d GIT binary patch literal 85183 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%0D;Db~7jc?v<{3#(cm@aVr zF_`Qo_SPpyktC#C1^9B$0=>BQZ*bB2J0}Ws-vzN&x}S(MiuAh@!c^3a8S7ePQCZ(Z zxeP&xa_5TQYA5u4iKULo)Nb|0)R2p0a>XyF6PcxZ>HRll=^$`C`y^%^PrQG?KBn4C#>> z%z-{cAK~n}JvrBL3cbtT`~x`I*sW+nMB4c?j#-xC^L=-f>6qc7H%qJh9`lt5Yw;1+ zMh>p;xtv^z<}&c}4$eP1%W@)aWX238gnXR1zdzv}Z2DgCM#IGC%ds)qx&a?qooF|a zguOV%hLNE|AlkKU@#KY-Y+~6;OEc1^J;N36fe_jaJ)8E09`Q8)940roQQWz1Oj;7w zcdOSD>f^=S64LNU2*IQc( z+ue;2pFj2)j46}67^;NOD12%6iqlL*?>|MU5oEBi#^P!Wa2z?AUop^)VeA01bB6mM zH=ko?_3vh4%2#PE`v7i)FWWx;bG?mpC=kgbgydmAc8h_FnraGNJ(^+X3E3>e+V)B6 z!rT46ipgnC!4tB+%4-9Ne`op#7Kw}&!Z3QSAGy}dG;e?r2C*%*vXRPH^}NCIPD5znre(j@zk7so1}wJ?&67&8fDqK(~NxN zfwn!y$Y{4^egrK|%H!2Bw(tX-_cZ|}Gn4D-YmgC3?y_D+L8C6*?tvGMTHUEy31It* zQLBF0N^Kb)f$2Qh9J{l3;BO@UigYq8G!r!V zLw5!Y@%9M0fQ@%FJ*$$b<>`hd!!70(dnG^4%5I^b!EDAEs!P6_7Ml37Q_qy56u(0?=jf$r%LXtPkt!C{~qXu=z zSjI`Qh?2DBDv>rwpUE+?BmR=h0!X-Tx$UU^vTdW$vB~Ya6cKMndW$(^q~=)#z*wdR z1B$w;+M}>|5!1bw$>b@Gsn;h+9Y~qpSS>&;Z;Ynr}*sqFE0Gr5GwlbJ9jpISF}p+~ocHiT7wh?nQR>kj{tP6N9} zlJ~a{4AcYH(cG=V7f+VTBzFXgXvvqdmHf~I;b+%92^XHoG~wO!-@N}WcYDH9(4OeU z@?&S=ck|LB%T34Z*&=WrJ)V}nD1xOo){z7Nf{MD42(j9sXp;6r(OLfAA~%O2tM9|o z3lz4>y`F0Uwy{S@*ujp>@MZleW}FsshhdJNm)**`t||3g{`oPPUr$LemX{L!Y)eS9 zIq5Eo)8*{)y1>C4vVb97YWz`k23+}O_99|-JRKiJgBMby5)4Kj&H`M;07XuU^ABH4 zPC%n_gl)Td{A=(MH@ru_0C93byN=g;TVjkDgAvm7@R@I}LP>j^gckf)L zu%lb|B__Xxu$fYQ`b8!4+d5ey;#n`7*sbXtxt4l#s@Qk23&hGXlCGrNM4)(&dsmbu zdXrPl(J_pv!G@WFt4dfb%?-F?(U?hd8Ay|q#<63KPM@CDAjheN0ECGI_S=&v`;JrW z^ik5b?qqfbwhtO2lha+Z=kkRyS?2gP67gIQ$cpk+keh@`$7W)p%PfU`NymDGH9}%cJ=d|-|$@JRyLp1tVexINlxYS4|XO`{(E^$6E6JlAn8lEf0UBR zxu~Bu%2Lyo#KkWMfv#ViFt^Fn<$%+FZclFsNU7QQhS{FZyAnb{CX z?yJ5cWA_i&MR4h!e`8B~fLl?r6GW+f3HQ5e5(z~sO2AU0uzTPRVS(j~vy%cb}i0uBG#Jwi+@mC3c-A?0=OF=-+$P&G&5B=jhMTQC`fAX0ERoF?wa+ z*M;zJ*^j=J2}_3C2HT|{A|If_pa76YN?8bGo!~D zclv(o25pC31-+}&j3=6+7frjmfbY9!h}-$}?e9Y(toUq)_igQS?nMuinO^+09f@{B z5r=I-0oEalMe!X8x}cM29=>Wr@tn}BhKsF#=SKGzfpO@zKD!YYNw$!?F;MK@$+_0S z(;q@sK6M;-NwGxvc!R~ zi_zrw{7pohPxIuZ;(_8@$mHbz6CC}~>&W99J(KGM=WB7|FgXwFm$w~!k`;v{ibdGx zxyFYMTaO3Z=`a-ES354pOI^H{p4!mhKG=k#oA-B7lGJAHO7>#b>=hAb^-3UT8PLKW zA)f2#n-cMq+I4waJ4>rVW&vJM7*>so`R>|oCVxrsIyw|d6NbPNCU1e)vxo051Q?HW zx$oP|lJzADM7DSv;gE-=zvJr)9>a3=eqjMhc&xO%g<+RybCEWGg*}}g+wR|(O1D3& z7f7mHiNB`yGJTk<%)x@%XScVn-h8jx$!PS;V-Y*FqR#X0!kAYI(U-==xqpO*(S9+> z`s8l^9y4iODj?VT0Fqm5*TUcbV&8`FOv(_YTMSw(EiQEGPie4P7_>y>T=?!}Vm=e_ z7yr77XpVhS>u%E``r>njdugnRhG2GaBN@=FTRS2dHpjaB;1!ZfJLRHuac%H~CI=VX`Z6`Oq&HSqZ?`nW2fga4A}+Gj zwch`yEY<>eg%a;6rx}84JhenP&KDe20sl0~NZ?pBmSM`jPcPudpM6d?YyPKZCWqCj zW0ZBDeJV4B?U=Z9m(QL-9+XI=80-15#j{T)d>9Ts%t!?0>C1>9#$x+Ejtnc?Z5nA$ z`xmYG4p-OIpJD(JNE}=%lUN;O%2oy`@MBg`yrNG%jEE?I4W{-)DO*jZUZv{SMesUo zj4TM9z3FliXsLf9_Kg1`JW=`6&^-kR$| zTqd9Rf%lmZte6=C`7vB+SHoA*iBfVsw3Wm~IZiItpx8&0;i5e?P6BXXi1I~29Zrl0 z%|k8_^dZa=L`B*lRC^s1o!O8)nT<4jh{x>~bOHW01CTI!*7QTGzu#gW+$Q@F*s~fh zX6OWWW}D%UtfyZ}A_6ufPF5eZp8ZHpN4n*09==bC_!UjKhI`&T6&`ziXan`e)Mu3)kG56DO4 zW-esBT|;{MQR)c@0RA2`50|s=dJds3d;;&st+*c0 zD?hGdm+aC)9IUrs1lYki1e#|bV;HnN$*N|<~W(f=M~>u75V6TPXYwPacD$TY`y{Z-K5-U87!dNy(hI&qfAQo0Kj0&Fjmx9jklfsH{?FLzN7hEb~=Ez z>Usn4)V&=KHW&t224RiJ=19#Sha_4DH^d^WT7FyR zIsi~f0bjx8DKQJ3^UwAeWJ%$e(tt_bdAG+{@B<>#YPM;TJ+&EdWj3GzbTgclSM_ak z`SSWsnHa|~5O>ZCm*DtF%i()4ONlQ>yIVSck0=;Hrx7*Nq04`u05B8Ke0Yl4>MwO; z>uG6e5j+Oc5VCUzur5oxw@79-;rJoyF(`-fU&%f^z9+=pr==ZcEJcb=GLV`JGq>v; zqUp#xBFwNlBSoAO1po)x5 z<4~oLX#rVGDdwY;FQkz@D~~XVtG7d!?-z_XXCiEjJi-CT)1u^<3R`p-I#yDQGn10{ zirtx8_%^`CkYRagsFh$UiPHf7shEZ)MJRktlu4wWh+c?31)y{ zJEo?~>CQI*iw%akb&Kirj=6=RniXli%n(}drv#`Hj;3K?FwTQ<0@ z<;MB(k6y$VGbXo&v|Sj5Nkb^05r0hwnHgLU^1z?B6#Q0rUfdH2OI94OkS68q$r5&) z+=ekcRz`N4qeVn~^rm&e6!d&BWu&|9J*4GJn<~U1^nnk3FfgEsSnE6K#pM;A$xH8G zUq&)of~%WoLN!U+zG5cde_MN1VU0M9qoGz3(S-Q5Cp2HlmZ)%rlZ6vA3Tc8A*`*o? zQ?ZH!XMaqb0qg}GHOcMC^<`4*d^j!7+|>$9)F`t-@XWHuE*4vyW+{N|AW(DkV#(m(}+k;9QLM4?JF?Lfh`PXFSspLM1A-L^BXxP&~k^miz`P zhS$1ww0zW>AF!$e(@j#7LaK7^e*yo8EZ)E^akSw`qLd&5Lu09jhTb_6dWk;4uS@H^ zIdp%nz5e91rGi4KU9;3sB}R z(7DPUob#9$-p_{-9na9yBdISCiYnL@G4d;4;M8^~PLrajul*VlXOGBMh9w5HkW4Tb zPyTv4fNV=QP?%|9i`vRPIRApsPFLD)jug*5aKxAjuEY%$CZnpRyqPyfY?GwBUpWru z`VK24zdeyE3ZL&mOC5hDmx$}}I1m(~5*$j5yl!=#=}Zhjh=uRVT%d5;7HN$kFa~j< z{m5_}^@JcVLYY>bV`0~D(iN!)m$5RV1GR6ULXg}1ains1o6hda;*vN<&oQW&UN`rZ zr6gPwL%2abtY}~6G`yJGXBxFftfat?B}#>fTm2)`n2`|-!PP%>|M6qNQcxbYu@uey zM~DSODTx=Re)B(4uMLPfc48KyvmzAo0}vx0GyiYn|F%U8+w#D5e)}IIh)iL?Kn-X7 zw=ECYR+Oq%>woki29&VmxH0d}QgM~YB7xP@Vo;&0{6_(jA~rxJ^S$E#w#5M3nkOA` z|8JQ}uuQC$0;EDjc)fY3vdJS75hFB0C}JU^JyNO%&;Hxi|1GklGmlnc z{yY9l7%&7jBP|WeM#2w2>?x@i)6cS064Ybe5(7lRs%988)t5@m$KNl$|H+>4m z%1=)6du4Q9_s*dXk;5Gu<4EG-jv9$eT`)n$i5`&@Dzg~cv+Ca&%bx10o3<&(x1SN+^cYzztt8UhDUJ-<1-R=hSVO_Kg=Wc}88u-Vf{8aO zz;b*+{VERmxol$8g-6E9Rka&Rytu0-&r@52!|+V-h}retJicE=%zkdh_EHzbLZaYx zrQii+Vm2ZfT!*OKvxE!8(Aw3X2}R5oLsD>D*Udr3Qh7Zj&;JaYhgjGrpkt=C76v-) z-6R}}ek8RLm>1j8?`prlV#;yqW!mHot-w){L?&XM&6|KUi+&_$NoW#GcQ&9bbU1(k zj_}N2@`3=|Y}nK+!4)s?i7|LVRi2H+QM$ey)? zDEP>_Aqk4LkogqQ&oFnwILzC`@_U9cn4XZRICTsKg2elxpks&MXSOLAG4-An3@`QI z|LQ+WV;xAqOR{?SQoIvrwYAO?n7_G3J1A(h0rtFfmYm}@H3vU@=AcpBL z@X=%;2(8I4NM>mNU+sNYR8wE@t{{p?$AU^#q$x#;bcjk9>HZX?caYws7X@ij1wm>= zs*2Kk?S*Z*3+k;BQ!K6}reJ@d`XH!>grNs`aGX8xiG za8YnOz}T$xB(~#x_?NT=WOl*jX=RhHpaOV+1E!1GX~Y;CjQ6DbAc)kwawsrwzidk} ze>#r4PR70+_+tS20PS1=iCVpC=mq2N&ci0oJ>omkA6@$HIr=Bvk*#^(Zl=~aXB}N|Y z#(!nD+Rn)k2yG0-{Allb@KsDTs~mc z8H=o4$6t#-1+|pS*z@uaCcr7dmtL`_dUfRyvESCKDhE3&G|1%a{0(2YsV z-%_=gf0#%<*Ea*I8OwpnpQP~bJKqG%cUM+52$up~AgJFICWhXKsj0+*&aEf3ee}DAom0WoxosVYbNO^Q7`6)o<$dLa9^HY%a- zTynE?gFdV2f!fDspgz?>{+-mhs$F>kF+~;eI|E?yRiz1xbbDVXuw$Sh)Q4-R^JTXo z6FYvEC}M3 z?vlz=Kw2$)<6h9M7uCe*?tVJpuW!Yc}>}DFN6w3ObmcjjlMKN zf|_U9@P}&GgaU7DO)8{l)O8 z`2vAD572&iqCo}C;2DZ7->KV7BXR`q&e#6|Rl3ts>he|~$-+tN3rE*E3}M_=n^rG* zlR@@^-TLsp;Dt}$o32TPDxRn6hI!#YbIavIg%5$dbFJ6CnwuW(IbIx1XMXEX8z+18 zxsrq+HUD8n_F^Y3tenno*(#|ty$pn)FgL7%6d7c8cPsi%dS+-1qtC}KCh2PQy3*z5 zy${Kj1XYvo|C_ybz6|JtbifegYxZ1c$gJaCglMQU2o;@;&-y%?)_HEH*BKFYGdhC4 zGrG|94P5fRl#=E14!$ouG*K3$3LOukNEC&FFLPV zvz#lGX?EJ==b;29>z9!cZhG|akTc(ES zz#YKz^fQ9hXDI<$tW1!(cNQP~Al>4{fYI3Ib@i%MK)V@a@pQs2s4E+yiuuUF zLHe{7cq@MXqk%N8xsHj|5OxarW8o{yl0Er~Rnw$RGZS<|7Cbg>$wN%C2J z`29Aom~binS(55%7sGgAhYsU%8HO%Wsn53Y{yo+i>vz+V!yVlrn~j@gIa(4~QK#FhT+#)YtT#Pq+>Iq;t^2Z>&E&0~E>bCSM{t+L3`}`S6dAbJv)?6YO{f?Mj`61cZ#N6PLtn=J=8 zpO$$N^U(6~lQ|zoR(mj)E~!Bm860my856FL5?@bMuEc}NT?vbQ)=@qq%iOV~5x1>5{E%d4@d%GNR0^>3F5WLEJ>H=@r(p_8spo*qO** zspU>`8*DLU_eD>CQxt0RlI1q9u$`>Z#{;PA2eKge!l88#r-pDQh}&rY8CumkZ&-I+ z%r@7Hm1a@&TAJw}#`~n5;$!1vc{gBn+dNhNZ0UoEpsW;_H5WLcLUY zB(bkz8Ya~%7onFPXBX%}gB&!PaCs8trk`f&A-QhiRrQEtJJulweoRGjQ_5H^i;hl1 zr$0>tKZOPLpO!T7@^%AZG)=sL|&h7qzo-T$#@kT5?&jAbrt!#ljWZ_B3WW1Y-f~8 zljP?0wWC_sptF2<;~TP4NubZprdl9<~ z@ya-d9I)@-w9{Foqjf$rdRMY~0MJKAn3X7tUEYPz>dd`u;IG8pE5h_n4=xcA@o9T` zYC8HmnqHDljqjvP;Aue7mBL%39-`sVPcvdI@>?kVk(@Q!Cmi`R_dDEp&~M3EC$LjU zgBxIP@P`Mt_>Pd!Y(zI_++9!{*|{Air@a3wH<<5xqc+-y>~1VQCQe+}_^!3Xt`R@U zya%hF!=DSor`bLF2eg%=KDZyIRbz5M`dy?t%)r@t!?HzNRUs_4(9h6IXSF3FrCP}@ z^mM*8@Xi`vq>$%UlU>6QY1`~MS{QHuMvBdG(sJeB{N{aX)|ci7zPxLvtRPo%K*sv4Wk>HP%RjP}1{UNu`I54&syqvu;Qk;z`<>`76G@y9 zG{$A(97(t=Ic2^oy)Gg7YB`hf^Q8+aJMF@Bd%45bl8Jeroi>Cc(K!vvbaZ0w^Z~JN zhZEdr&56CT`5XBW3gP{m+lG{{kUu@kB6*!fxaTlVoSY{% z;@izm-K5V$zuLo4E(^yC14`4Pndh~9)}x#GNBC2qlFO}Zr<(=Kwz+t}KS4HeHt3+n ztKEe^Of<#p*R|@uO`ij-k<-z*OxZ}+aoqSju=2{8dau87A?;!nIHEi)m{gfZfhU+(n6BYeaM>FJaP8dQ2C>I^hvwa~!Az#CLH)4Cekk@Qwn z|I$5X3kp1cRv&IycY=kKHz-e=LUUl$LMzT+gvxW>S2Q!@S3wTB(+9m+n{t%Xf+n-) z=EDse>)!H}?gWBty}$K#ab1=D`fBP0OYKhu@=L{^%Dja7>rN^#%V;4YHs22l>5)6) z9x3hl{1&wbw+lUX8;-mFoPexHqa6c*B7dnX)-e&n<(+nCg#W5ZjYuNVK8yImoY>dW z33jt~6!pueTV9rM84a1ejyF}J{nF|%{c8O__=9Cie@o-6?&s zAgzu}kw%0Kn8a9=ye1X?rDHr@LqSE+^XgBHAiI5O?3gO)57kE``s!Fk^v~d{)D2F~ z9%NVJV+3;TQMWHxZg=f{Pht{y)QEHD!8T5?6vo`iIJH*?> z^uULUOj7p+NGMcHJt=tDf51@n#M>rJ!3QRXwW1p06Gp+aiv)tue{cJr`$KSkc7RVn z)6s#L`t4@opGU7g!zO3gaoDSe=GXTO#+drGk0FG;xQ7PSE;ib(SRCqX z7K{C1g1;AKe7qXg;{Kw5u`_5WV0_102xJx{Fbd~s9+X1Y{E#v~50V}+x>dwByX+I5)%L^rbh6YD3oOE!@l`b~` zKE!YXCip6NwwpIUggbGgiD7*8dVD(Sbj5Meua(lc1iXhUZL)}M$*IMpndGo;)_#&$ zprGF*Ecrmp{S$s!FsRmQ_fxUIl>ly8?3HE4izkni_8QjJou{haf@qmfZ32JAsp3BL zd1>Wo#mj7_`ms}9U)mjHgj8WcV|3JlN! zV%=E!D&*{>zn%4{#2UD$4m6;fX#&TNX26DS{}};&CWbos?KSmL4m%hp7JYdq=nN+w zt)K#C%{d)#-GBEPE6*C0*-wabF#hwE@gWG$82bG@V^cax@|rLUuS^L%Zf6s74%jqE z2SL+XpWp6T!^}aadum*lmH{#EfDGCPVZVuOV{9t9ea5#A?0!eIVkX;ue7LA)5Oz47 z)_?AN|3GWV?n9;7B2C?K)w4kCFjTCY*&W{D&xRccpZcy_KxuN^)(=M6wBpr_L;CLc zAO0|LG(PPwWwpOS#8mT6&cO&L<>gWohk4bUrNXE9CVB@XSC+%oeN zj?-(1wUwW2n6>UmwA?`|qT2uvoS_z-$Sc10-8 z&UpW0iYRg4jNflYTnXG=K3P0z+%gM0uY2yC#8n~}fR*4h;kQ>sjvWI637Sj|%78~Z zu%6D5S7%@VE9;5@3OnYz0^4giJV6W{+4M^9NT%i?^lAH){&X6W?oW+3RXO^DJp9pT zJhNv6j5uTSac4?L_(kS3kRe^a0{VTwDsHGpZaX=$N{x2Q9hIt`IQuU$Rr}D3h`r0n z*x`<;M?KyTPF$74)M_65@@o9Ctx_*`8r^a`S_r#l-25j`5Lr?xrY^M@EpqFI=l0@i zI&#Z;bClmd0EL?!zkZg5X|Nd(>xnq#23E)?&Oj=3ma z(<+53e;Lwz=``rHJE-U-Yw6c=Uzow{P{!HmstFnk>c8tWd=AFqo?u-Uq^GVN=ENu) zamekRq>VR(6>aAFkS*0B0-Wv>w4MBgbLL#s#1DOhZ$zEq5q1|tK-KXpcOXImB~%yh z;@jE&pDEsuOszz$cUf5Ad<00$ER`2?LbAk4U%Jg6WK{>$toPiY2E@9!L?;KdZ{aL{Cn_A_#PjG>%#{g)l zW%S0*)?*}Q@D!*@{E;77Y5MM`Qz4ic*KU`1lWSuTyhP8J-8o}6dy%=1>5ljN`-a(% z2UMabN;zW_Zv3azO+|z!b5DTGjKvmNu-w>#<|k&uL5JMpMsm5q(k)OB-=Cn&IvJ}2 zmKGxhXyiQo8c|`!_>Gs(n8aPn+g02u@7R%+q+; zLQ9GXa;NjO;?)hy{L}X1 zO-GfzbsFYXZMMm&ZK9DkSqKA4C#j$Be22SvH_;`0{;6vW-3I$-|h zcgoTN7PD{_ov~D#tjQ|J1sEo!rh{`#UtKSD^(P`IxeB5-o4sn8C1(?{+_jH1BxShQ z1RzO`&iMmC3Z}DY9Xh7@?1#mOiZWAVmuik>^YX`(2Fq#Qj)%!9-g-W^Yw_5~Nh+&5 z4`jY1=nZ{&wnZ226h%)yzP_aYWP>ZYre+L1Q|Gf_v!iLuS`)aCy?TqqEO+-)tgYcf zz+1X6pS7d=;(}(v$zu~Na=j-~Rh7(pBN~`v=e%togM%&sul6i!V^1T<)c}2&vRdzO z=Ai6`cHHZ2Z*Pv$iYIb}(!FVu*R_~NbfZV3eYmVzK4Wc<;?(ACxIe@hAGV-Ss}1S+ zigL0YHY{MV(WRQj2I>gF^k)j{PsKYD8^#+}9!@t<>Ex^P+3UzD+u|Z8O{hxhNUPRX z9V3F81y1F@ZzDcdpJl+OSE-Qh7AH>DB-tYQx?gUW(#WdU0d+CHat1v+fhJ5!(mYE= zCTMw46f{r5E+w57oy9(NMg8J&1nEmZS^VhnS4rOmnSjF?my({+^e68pzdbrphfkgT zxjarN!++kSs6V{eBP@quOCQ_jEcG!vAgLsvTY7e|E0X?ppyw5sd=kB(H|@D>ix=&% z_wtc?79!iF+n-6wEQRlN@|8%Ri)dA?{>_)^>g<0)z%(}-yWVC8(-JUVf6;_2RR6M? z2M{upR)(HiZlK2(c^utH>ZW{1WFevg3b*Fn1R8BqO61;FEv;izt6J{uEUG6w763dn z3Rj(o##%zj&+3KtAAa z?p1dhT8WG?oXxU%@uXmut$%f! z0NDy(xGFNNE%GE;w(xvrpjc_aBSYRe&M{zSEOVq>Q{G!*zkF0(H~MqsI}I$8`MGK8 zZYJ8_ru`!J5X@~Ad`B4RCgUuBTCWjpk3;&O$_Stb+=Vrv!_BK*M>sg?6LQVP^n4DI z7e$k^V0M^b0%EK;%@m?;Dr9_)Lf`yvs8=h_j?kGe%E7ab+6@zr{yKKzf4azqGG0}H zX_+H$;%@KV?9=4#DY6I6>kPhg!!+eduQu(wV6L#pX3}D;q50FbM+a_GM zoWwllCRHj(2CNh!HFR|ni!X<`Gd+R5D%qB zZwnOpxM$`isT_>a;<6=>d$C>)=vE47wgR~tOILqa*p^a2_w2||VB=Ih>*Jh-Kf?ym zSY1UF(uNf4GdPB?eoke_!~{{jFjpE!jvK@hx7qQ7Z`;apa@@QoR`GyPW z+tGE0))=Cw{15>pnBMKNwsv6F^@`P2+Q3es$!=^5`L%}8q-Y}xJ0jw(D8zIYdz>KX z`^I}wReWMb9Ik&-_s=$)3HEn1rBJH8*7yBmpYn0LmVLl=&64@OKK-p)q5_{VcMMRe zk!*^gW`Su%J${Vw7-%?Tin?<6f#y>)LNsZ?rE8$YjOVNZHd`y79(W))`MS#Dpjnc})A^7lf9+TW0X7Pcju~PyFeO)eeGm4l3j)mEYA^{lnxlQSJ&q z-^S2~2Bzt;@4CoXZ7Oeny7#$>nGaW>V%+r)wxYd*lu%i*mR;mGrS>=qXoJNIP3%w5sfh?Y^ zm8fe+NW?_3@AUNS7`_gl`o?$khjAr;;(4KjzglJ0c(@9$zkdWx^ucAAmX-$ozRMnc z&d&RE(Q;HY@}bT?YF)$Y7W{XF6oKz@`tt;d+7OmaJia5O=V7v4n9@@8;{C6p=bHc-b${pZ1k9lCdnj z$&c$Y>6pIeOp&}{#;^GD=_={_cd?#>86bTT2F=+L@9Er_{dwM>8)~&?K(IPSaSmj6 zxN$Pq`N_)5OrGOrLyM@Vw}mYp$@_ViKI@MzOaD6y(7gY9^mzC zB2965PV(Ic7V0nQ6E|WH9dG%;<$A6J6(t;C<$1@RNWLF6!sWj$N4MbDB)%@jBy#h8 z5HjB=Ai8=#`wKbh8vZDy;)hM~ZpWFEH+@n!Fc)Gu!w4Ur9Zy{wnBZHw+F#=(__?zr zsTpkwon|dn@3uw;hDnuRX{h|4C8Gfw3YmS|EduHue{c7-s`+U@^eW_O?6t7&DSBv&TYvA-&?$h@{fgX$|^xAf9(z9xr1 z-z~t&saMPG&P!$5gY6U^0MS6Au}^Md7A>!PnySmDFO-~Tk=&c(kvcQKh-eAL*sJ7t zcVR{-q>~Q<|KzZ#7v0*v#6*@})s{t$qDM)*(nz=Id<#N21}Tt`md|GDuW=FU6+Ydv z+~r4-SF)YRZdx;2CY@d&vxTe^N-N-q&>x5|<_q_5 zRKha{A#6tukF%Efbso&2;|{OnXwSMwPClCuR%vlEWUjL+^$+JSfUXspJ7%CGxYhWW z|D!o;e^cmGVwURmTsmTzpXMf2o;M`7o?Db?&WZjpYG&PI?cjO4z6$*#tyYM?Aym>j z?ljG^pgIZP*PrbS`&{BI*8eOtuZAwlmWgW276vb~n7gjLvq<>hJBux{K=W=0ZzKW@ zYkWfy84hF#%iK3LG5n0Q?9vTB-s~kF{8t7MGARdw!=b21s3OuU&FypFfvHIS9RJkL zt5eaV9|_^~Ov(=s*m2*JqQe+`rjtz<+ob%!_!EaQUwnR~_;zL$neOb}IIAf;2M$`a zq)VOa)Z51srDQz;IPL|#p_N)|)VC+EU;)3M?wh!h=&PZH8%9B z81-t=D&X#e$Y4_8$oTOBu9l*ZJhHLxfB#&$^CcMmUY&zN1t57^j~vbu|9|%ZBgq9z0f$?v;9`6*sW}tzBKzCg zOFZoEX2U9fzj>8zns||f0F+nc1W#NfUQ{s^0C=I{gy_e=H(lruBVK$& z>JDCFr7b_BkatNvbO`1}F9HltX~-)}x5DWxWkCcecG47#?&?(W~4E=M^29Szz4 z$BVzESKV z+u7%Z-O=K}%9Ej#CQ%rF_e%emjl(?5#kF>${`%Ca@LXAs5ZMX?-K{xd$lMUXD=fMm zNHrp6m#${Cp+iaT0&+3LS0xcXX}~^lnYYq3m~%T3+s5~L{TWm)kdXP4P3yShS?t&E z1}pUm-#7pu;dh^Qrr801fG@Jy*WY3c->8r9EqZ@cdkMm4;Y$i&D{kQVACUwOgs_U@ zGozM>0M6jdesZ-#)@~>_-^^l4!xASy2I0RVLMiB%Mw&8QZMVbbGYjqz6>nTuU(HhF zdj+sD_YQjHic;TA1JtciV-cwQp^?J!i~0b8HgeeKm=;4)w-yre3fgXfD@soz;hA?_ z&Tyz^NpPN{PEQa)8lQBL-h-sV9qu3wWD8Aj4m?PgPZ94!J3yJN^tz=UrUY++w5;uR zSCDHG%P%89ge)D2@z0C%K0EHvX=b;c+x@^b->hl))7yTuf)q(|)a9hQJ5 zS`JlI3Y*PmxaM?Xu>EA)IjG)}36cSd5*=?gpW)HzP{N;rerbTlt@t4PjNL&8VzHnT zn8}m_z`W3Dw1K-J{a}G78-NFH3lL9e=*fiUh5~+f9=t%H!3qjsK%Ne5;Y0*?8>7tP z`P@Fl=#1#jH+?&Z-|KtX_L%pQkjjji7|Ir_@BhBA9s~SPgSAO_;|10=dI)Rfg6!73D++gBru~wEWT~ zoH|Gu4>~Bak^RAs@dKmvReZB~08rFCE8j&XRE^O}9$qnHTx84tF;$OR{n!3x>}atQ z@pSNX6Yc*x^`^SXzBb_3VncJ0Dp8z(fFG^^SjGg`qPZUxy9CTrr~48U58hd`oDngo z_B1$TYf^wwV?Wu(|F0K6xWL$-Xs#nEtjrG;K3vfj-VwAYffh900#2 zo3yxB+Nd8!+pjl0TZ~X8XPtt9gJTqCHPgtQF#_{5LDxt%Q3wE0(rsiGZ*F7gMf|-1 z#u?+2{##-(`UoomJ%O(PTsaWu-Vt3l;Oce7^=mW{o7*0zVp#ABeG3)zZl$b(o<@H@ z90o|*)Eq3g;%@-iwz?x@-?ZZ#k504P*3bB2T-Yo!8&+k}lX4SVXYqkR z;fNCfW&;DI?S$RiG>i`{%*dwk%HfZU1blkc#E83OI`suc3W7P%IwF_beS2g~6o6@i zR@3VO+RZzw#AFZQYyr5`+*_?3kP`Uw3o*NI6Mns}Nn69Ai-C!Z%(ctrxGgD!Y-TYx zQR6jiK9S})>Se=%&cj*YAXoaFu##NjI`;cuF!QzX4anl{1 zA;NnsT0%KXY$E6TYEbx{>ZAaA$9e-)<*Zx^GX^BDnOc*~o8_B90H~j}Hj=sHQE+5t z5t#$cI;tqBTqb4*Z|6x&Do%QwCd`63N!7_L;i$U%r5aQaY~N{n*Sm@2@93Fx<_Pd5 zR!og@dJ5+|rznjFQY$-^I|yQ@u5yqx|C8edU+oOo+m0zCJxp>kU<>S|3E-oHhbT<8 z%o**abMh!N*_4*eM5&mh?1uOZr8))i5qb}>mK8W4(yr^cy_Qy-@YK| z{Wv|m(phRkCA#q2eG%!Dfm^U%nM~=R$Y#I5*byFE zo$lmSKV3=iY)(J25lgG}YBp-g)K}sge6Obzz{AGmK>tydB3r&tKWvlxqIAdGioz<{ z=cpQVVHM-}3G*lJg_6Rf$;JXmu@R{VrHaQ?u}{B!mv5)91nnSCcBJk-p^wptMjn5V z9S%!RU)JeJUs;bE(JxO##$Cy#-F%CQOnk9~6r6N>ta~kJ;d} z2*u3P2Gu-_Ni;%gGf^iCbK!H^@7#X9Wc6ZDo$uuyegHm4jATh$tW&CuXF+QTBL#Av zb^)23GGemzy#8xWyKb3Qm!%$CE6qEPJEh5N{imQTbw7pBcq~iyj;AYr>wf$Zh7e>L`>4~?`UYP$5{Rxz-{q9)nH4d$ z=5AV{_B88a4hJk09&2$%li)YA$U1&{+zm1A6MN1kP*yQvly4w>`jz355OdScZmYKnHQCHf}~Lgo)k;{u8r#|OeTDuH8d4M;F! z3^Y!c-rB^SqZxt5^s5{{3TND0^hXSx=WrT3PW7bDQ}t;&$V69Qra)mZXwvKr)Zijll-c|-0w$NaXx?IJI?QE>ZYrh#kovdYB=*)P<5e57%dr|noIn8pR zn@n*0poGc|ma^W)ez9r3pMK>X9^3XNek|tE=W5xMg>l4L`cES2RwVUt;7!Avkgv>A zxlU2%Nsx)^$j#Gd;Vr^6w5sAll%{{wYfDex(T>;89wwI!N3YyL2tHa++0?pexESb>jJLWstJ(r3 zDDjFVl$a@~-o%rUZ>3tjr!AdV;|_)x+CZ&%)Dy|;Cv4?5O$vHd%3bWJeb3AsvwZi^ z!~l@g%gH}0mP`%iZzeF*=VOuPY#d8Gp}Nog*~Dw1}0o9XJDMazp#br83-cO`2dfWsqJ`39qzHmKjqOZw`7&9mPH$|CT}#{ z3bnhxv`woa;n;(rl2ZX10*TcaKFaTv$Ag)84NbC}dT?mv@fHl>ebjvv!yG9*kZB{gEY)ph-Pv-8)5g&w}@DQ+17~Wc9G{7H+$u6 z_9PP&@k)&@*KbFAF-y?3*xfu5@=hT!iwua|z1?wVqd(dflq(yf*{q%=hD)`?^{+Zz zo>n!i6WeoV7Rhre+CDJn$+0)@rngk6_uKf1W?G)Xj#WEp>MN%1sb-i>p&!wkD@5um z-d*VK728oZn($any5hqV(ipQtMM1;IqO@_wiW=UFnPQ5RS(HotR<@*qT!T;QT3qba z;Z{r9Wv50$Q(k|XqBt2AXLh$?Z!a~AZPM)mQ3>=B9;#Tm?G%uMF9PaA zK+M>{fXteKPU`-xqnaRxGG%j7wN(Y>57e}5nMw{+N=?U1QbpUCD;&D9ABJvs1gyJE zFfUs*s^s)VFcySatMirbmd)pC-xGwF=BwlDJ&zG*r-(O_u~Hp)pP*nGKB>1os58qG z^E8=}m;{fM`3B2c>d1;Ht{^BA&{6aqylh;kLQ5PNOo82Q!uH{!+k72 z@bK9|YLhDI2#7|;Kl+dKvdU=BW;GFXxJz>3E`^pm5j^-0jOjm)ViXZ+`1kOC)ACPR z{%xXvy5*l%{C8OVJ464O7XOT*f41U36Z)TL@z3G<=PLg5p#K32|L~T7NYOt4?H{iA k4{rU3LjTXl&rc!Y&k1Y3nU_I*;JI_EiW&;Po|wM-Uz6e_N&o-= literal 0 HcmV?d00001 From f701a8a32933ecdee6f64f37b35c76c7c24bcb3a Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Mon, 3 Jul 2023 13:17:05 +0200 Subject: [PATCH 14/16] Add snapshot test verifying XXL dynamic fonts --- ADUtilsTests/DynamicFontTest.swift | 13 +++++++++++++ .../spec.DynamicFontLayoutXXLTest.png | Bin 0 -> 86451 bytes .../spec.SwiftUIDynamicFontLayoutXXLTest.png | Bin 0 -> 106059 bytes 3 files changed, 13 insertions(+) create mode 100644 ADUtilsTests/__Snapshots__/DynamicFontTest/spec.DynamicFontLayoutXXLTest.png create mode 100644 ADUtilsTests/__Snapshots__/DynamicFontTest/spec.SwiftUIDynamicFontLayoutXXLTest.png diff --git a/ADUtilsTests/DynamicFontTest.swift b/ADUtilsTests/DynamicFontTest.swift index d1dce6c..df61bf4 100644 --- a/ADUtilsTests/DynamicFontTest.swift +++ b/ADUtilsTests/DynamicFontTest.swift @@ -77,6 +77,11 @@ class DynamicFontTest: QuickSpec { it("should layout labels properly") { stackView.layoutIfNeeded() assertSnapshot(matching: stackView, as: .image, named: "DynamicFontLayoutTest") + assertSnapshot( + matching: stackView, + as: .image(traits: UITraitCollection(preferredContentSizeCategory: .extraExtraExtraLarge)), + named: "DynamicFontLayoutXXLTest" + ) } } @@ -114,6 +119,14 @@ class DynamicFontTest: QuickSpec { as: .image(layout: .fixed(width: 200, height: 1000)), named: "SwiftUIDynamicFontLayoutTest" ) + assertSnapshot( + matching: view, + as: .image( + layout: .fixed(width: 200, height: 1000), + traits: UITraitCollection(preferredContentSizeCategory: .extraExtraExtraLarge) + ), + named: "SwiftUIDynamicFontLayoutXXLTest" + ) } else { throw XCTSkip("title2, title3, caption2 are only available on iOS 14") } diff --git a/ADUtilsTests/__Snapshots__/DynamicFontTest/spec.DynamicFontLayoutXXLTest.png b/ADUtilsTests/__Snapshots__/DynamicFontTest/spec.DynamicFontLayoutXXLTest.png new file mode 100644 index 0000000000000000000000000000000000000000..bc7624e42b93f18feffc1d7cf24eba8f23844a4c GIT binary patch literal 86451 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

DiDsWO^7K-uyc}Z} zBM8@juBs3tP;ng57sN<CO*}U`>pn8l#D4k8g}`JQO*v=#=E2 zQ4bvbY5Efqp6%N+%vckaC@syfh>%vj3^~{(YIKbkP4JMordi%N3mk$BbgpCANj@Pn zfQ|ut|J%du@Uu946@Y{bpz(Jp$MuON(2ulM$x9Sgo_uLXhBL0;GS||H3;vPw`6Iyv zW%aWy#O3&^J?e*COJkb=omyU*V{+HZ8<7k>Z{o%5ZkmNpB>AN|H+qE4Ja;^_bK*!i z3gN7F{F(M_~=djPw4a$7*O%%H#`KCSX3khkz^S*7mhWD%~ev zzYZ)cf&|M+sJCi3aAA-Xgx)Ptn^Dp4hXvVc!trOvG5*_+J$EW`4X$}+msmFu8S7VP z+1Gat=d9klIq!6}YrByz6c=QuW((j|T(oE4jgau;Mj?~67qG^s2Th5V0gRD7#51;y zr1e^^eZqIZukpJy8!+u}OC(?HGQcUCn4p=KC9CuHT3_SX6Xbjv|GczTPX4&;T!hn0 zv1D6u?=M;#Uir9XF}EX7J+@IAdKDE~D(89U{#l$#S1=7+AvEytx5l0lJ0#pIhv;O| z6Ha$O^2>u6`v5cr+8xI7BC7yv9ws;4ZMgWtnSM7LohcU2V0!N0PJ{6&|0V&YxJxsM z1%iV?f}6AO^%0Y=7g^Q60V$jEyddy>c-${r+7nASlWpBCfA`2j(7>xi0*4WHlSYGUD{d4t|BLrtp*fbayKhQOXy9{k8jvJ z<;ge4v7|h(H_&u;0G&Nd;q0w(7Od2+j;w)Gdmk2|T<3)oe5hxU4~h4;FoUXMHhWG5 zo#72ol684Y@rMfH_pGQfT3r9>|Zzvw_+1cZA402orwKDscut!;F}80gop}aL|N2 z{*XU73iE*i)T}P^<^wt0Tbx9{E!wntBMPeFfM>|wqMK(J$DL#N!suY9b0#-GEZ;fb zE8jT}l%JW8WymV;Cas{SXIt}xIkhvd%3-PoYd?T~u@4{ReSsaOn}7VG;hf1DXD`^sA1X$TID~k|UwwPx5;`UP62l7-Yxm45?XJ zslI^yr;Ay;_ul%Xi*S1FIJVDEM@o!4>9b7QPG9H@+Sbaw;i#QPmbC|(^^oqQ+#}aZT^f>FhL|a zDbeM4!%xA1xLC_!2$|+R@QS^8784-vQuzy=>yh7>x`dghbcdPU(M)PwHKJ<3uNc(s zyOiUrlo97nVSUK-Z*JWWf0J)2;n+gw0skx)l&xl8#=jr5suFGf)dZAHl}*Twx3e^L zN3WD{MstJ2tu33_l<)#yn&F-G(#vX+kq-ORVl~d!ty!2_u8tiHdAfey{rukiT*WAa zjPknjdsxH_Z(jY>*~$|+ph)$)x+I@TozTT=ZXb zYfS`A!2uttB870`SIoX7_jeIfP8ZNM;UqF46mGYhX+8hi!h zE#h~x6;_#C*!2}Xh|MpJPxD#ZB$drwW5$#vIwD-Zc=b9F`^Jx*^a=ehpgl+msHQ=d z2ONboVMx}9xb}xMraWBs^!~ zVESA~&-BdBlz(^SmjtBVg}SxyS?)QfOjF(?y$FPK=O##cCRoi6s`wqr7XER44@w8K z*S){V)Skek^|1y08l=ghXqqMIxRXwF;eSIE^l{_x`8exa%q?43Lm^NzJNvG#Z+oT! zwrPWopU6BK@D|CNiN#rscO9^bG}ith=2AN3tK<*LZ% z-+K(XN&B3wGJ-J|ySWWs?TEliQ0H<85eh)QP;TPybberYkuSimzwy(o2N6CI^KuY5 z6#-pQa>32~TT~M#J7w))s$fz!+Ey1tGz{`ErQGIhu3M~}_`s=y*y5mCf@dkfbhTD% zJupX4aEe>-MffSXC#+-V_%8>12e0V(U~=1Rb$R(LhPBbwxHMi^Y8-solu&_qPSzAC zzwOLNEd=SWYOESz7LS~-ko(>FjVMu9$*6L-8*VzMldZny!QY*U`NcIt>3V%$2fDQ= zng#bKF)gb{f?>IobVpxgx#@=ViQhR6tst~64i9h9_nncgtz-5WZBlzDL#X|J3s)%3 z>;*{YrB_mDX{^_J9Mhg&Ky3D|m=X-rTe%%8WobDgH!2P@k-aBx7ZT1xG)W@V$@=Ccs8yAvE66)bi zq9Bp)$gF6I7egK4wn^Pv$_`f~i<#oze}&7MR4LWeM3)V3ul#u^99v%|!dKL$v&#N$ znn$0>#m|13P5qpN$2&gLWiTqc2y}Q%$SIVPUi-ZU8qN7*-nnnS()`<@2R4WJg!t}) zuX-|54@HM8_~Byuk+#E&VukpXH)hX&y^jh}mPaeZ3y%)2{D~)#Z@%M59n21nQefH` zlhhlK)MV-Ey0ynx)$7A0kM?Z!%QqjKlL}4er_xb7HAgL5=eSEITQ>i=Su-)l^nK?U z;>RB;veS)ScFV_nVy>@D;nd3SI&mePD{@sb%PfIrN5_J#k|Zp(t~zr7vwD$tlJ#Br z{0M24g5c7R__%_TL#Ow+dJfm&cl_<0P?zGZfg;KIaW!Iur)}lZ<}txgrZTiyLjScq z-hxDKK5guO8W{Y*673o;Fxz&Pm?aJH1qG_-DjFzRi;M zk6)c04|x926uN5d{^c$iIfivG4~dmu<_^opzDQ)wW$5WMwl;)xpd5B20O}rEq7B0Y zW`Eh4j9Qlf1TO*sZG+aaB-z<%1%mWFIg!&_FIba5HdScdZp6S2774|q#h+Te&Qav?ne)4@2H6_b zsQWrqB#1%^QU~YejD)#|B}jy?bZky)Y;n9;4zb7Ps;7cjaZ2&VzQ()#$$v9|5{?>n zblCGMdq!N@BzNom*T2bJ?k*PM>0UwPyy8zwvL_sJ;<0Oq2mN01sIw*R9WOBRfCUyD z-L(0xn#G`jHnPGi~EV1Vs#^t1@Kq>~2*$d4{XrmEeC+2LPxaflOB@ zx82rS=aEhh0BB?D9@ZG;niDbaYrhM22yvhgXL%$6C~u+5Khj5mCQ2eDLZ~Ey!qR+r z^7ZUshv;iko*W9kUiiYqPI6X#bDwK5(^16D_5H>hY6VfgQ?t^(M%C(E!v7$gxKlbq znyMOkuPG^?Wse@P{NAecuvD7*Fe7(1mtx1wAbuFrt1P-;Hv!&Hx+QW`DX>8zfR&G@{HGTl&mHy* z%AQdvRfd?Tnf`}99vN{HjuOu8O!5@4SuS?XJa}Uc5dHM8{}@K~Xlhy0QfU9#+;4-xLMCSzfg(g;$3`Za%9dFOa1TcRi1!Y7H;N3`uZtHH_NV^ZgjL`u-4M&H zFe&N!)B#SJ>HCny;Qg*_^Yg^qLR zv5Q0*(#*EOfQyz`IOe4VRN)%E!l85&Nd2i09A$u&o0VOly0Qw9lSg5TMDod7E0u_- z%>i|*%;&hV?JP<^6->00(2pG<+N@w68%8Pc@89MFKb+9aPgD5vB_m`5^(+C|CBD7KgNle@$G!fA&9Pa``1ONLC$ zVq?=IT7l?Pu!Do{3)PM;*Ne~@$b?_enIz|6fu0th81>mSausTqSO&PA#`PAu-F~=C zf=3GZA9*Yz^~(4%wl+UGPaP)Hf*veI*VWnoZ4TL_GA`48T_W4+fMc5@s{x7^v(8w> z#q6??eTBB=KjGe~|LS-p_-QGy6z^cZ{jlkgde)w+Y^Rdkg170lH7CX|sGmm(nL#=V z$6ABmf-DcZl$+@cZf+fwF?hsv`)dQlEg|GT6ni+R4R_$oJYgGivRH*YE)Vg~eF0_l zbo6w9s^a81qKeLQdE8+VO~i+LK+~g4u){vbDD3v_O_r1;8v)wCb^nTH42amtE5|-V z!Y?uz=jp=B^+u=SH5UkiNyS-XDS>;6ahG7UFMI5>&(P@mrOOM<;5HsDvLNyX@>7x? zne@Prw$k9k(1$mSIL}n_`w%IhbdnDPa~)FtYpJU`W0wI^gaPY7C*RLwRJ#Ri>m6km z{!lsHZ~e35Efx2RdR8m+ap!~#3TFqWMm!Vkkfug!L-l6E6T*W@O-XmimL9DlqIumU zH1b&pq@(&@Y#lybRslZ_KW+ECd?5J+d4+tXULSlb@BOy>uvVW=`za9kx4^i3I7s~e_M+hI=spj1$ z!5}@mW1d@!Eg>d-ACK_RI3$EZH9SfJzVg6PIWiyCP$V~j@_}aChdv3Ugfxo(2LiI@ zoOh9D&Ew?P$SMwf&h;l1!={8*jJo+qigGuYa?($!zP)Uk1{f1!`Xm-e{Cy1Rjf6x& zB5T6lh7l`@SX$bg@>B_V(sx`|D#R%zD`rzD>zycJpJKmK+L4iCgn=B* zCvR9b^h(Z6so^7?vpb9pZ|Vb926gt?;_TS8z#I|;3>>wnAyWmie=+}x8`jRl!O#Oc zI`XreOl7z8k2ujK=n%Rg$(KA4R_%%yhuX}8aZ4kp30@Pp{vds!2<45}A>V)`7h{@3 zb0*K$1~L9dE4SzIwD%P|g{(fqj0wuPKzFl<1t6V~A{d9gC3*H{A(LngN!N*m6zS3*!e{aip-)7i%XG2HsMKrCvkYGC)_DfX~A; zFN=R0=U$#e7fY(3#DgPdhk~-dSz^^u**VoApxpty>*1Q!k&2$WXM@~V4%T_g0^0?< zSrs^WkG|&J#^s0<)hbNA#3rfpgo32Ff$qK8X^Gvsn4Rs@#p%3);ZbO*lDe z$xoGoP6-lD{wXoyBljYrIo7>#{_e@c+D3O%{2p?7uqbncV8p|9n_#nP(LYJ7IK7VV z3w&L==IazLEpb(Qtm4AkE<(06&d)7fKjow}qgNU}?re{KUU*CWM<7G{LZp+u^%pl^ z72i4eGZR>1PT7(hpU|cg)e_KUu4g4uu3_2sfH}hC7thU9Cl9dYSfP9{Z1T^~9qIX% zu!@&x)J$Ywprj4%jJc~Zd0~OgtU8xUjzDB)!2Zxs<=i}5{BT7v+BPwKAY%NG3Z_3W zV-|YcK(Jl1(ajijnUMGtOilHr*tm1R47`$Q8al8ks?UyZVYV5it58l;IZ1SP@ z5dg{uOux*dHh|eGU1b-UI#{J^voI0YQAD85ie-oH(rt0h0Wa7#*UZ;5HRvE6-=O`l ztJDdl5RSNh*ECEhUgc(XQg-f{Nna826U3wKR}{*a11IIEW*f)3d6eT`Re4XXK1DU< zV9-?WyzblPumZIt`(k9_n&xlxGwb1n*^$rAy(FG(ND5F`i}IF=Kbsp)Wp{${ByF}@ z5p7be{LKqy;$#-?B%{#oHfp7VYiz6SeR0)=UDPvs!p!3PX8Wyz)cd@3#70FUZLawH zJITJamZ{}OzX?a}3$qaFJF+&ZOP9OwrP!Mxv-(s*cdXhhY);{eHOT|KKtJ#ur*Xb- z^KD=D3S6hP^vW&e=W?p2GyBJ-uM?dNH1g;mHoR4{IVw{tTs2x&EpM~+2CA!-BiYB0 z{@EFP(H ztd)QJy!NTxNZ4W0zQ*ydM@s5jyG!iWeDp>t$~A#I!`!DL|rWA@Sa*sD~)dzZ!Ur-=Fa$CDWK6~B^e6V+R>D+OpcO>Q_ zn_Z@=-Zige5Lwn=NxXaZjtWsQ?XuN^r@h$=jW(v(`T8mu_icgz#w z?~SSDJp)%z`OoVVa-?odyWPl~B_H31qkNJi5AOx*>YDZvt;NPHzjN68HD)8`M|KLu z^yCB@J#d8m_!@T>WyA2NfKm}!y67z9C54*KlGX}pQ9XCk`^jlbqx}(gRCg%B{ENHh zmU8;PDF3=W@d7lp^KH$O!A}cG zMwprJE6_Y!`{fPw^d>!-R4$q)&IPe-+4aB=;i%G;l%2oOaaKU1^}q$c-fLo`Uf16J zua2(hjoC+fNvMkG@8h{l=_cS~iTP$`eJM^|2Eb!9=`SeY$5cpY0vv858Z#q2mb&T1 z>3QW(X%Kz{Lw`+uAxrQ{bmYN5fIr*t88gs2Od?I9 zYH-Q%XX~jOgTyy7$B3_MYK`+=I0fgtueaVWA?Ba$F729Odr<*jZ;+*F8mXAl1x9_B zd4Lvd?lb?^|75rB>%V3~n;ko*3h0eHwX~J4_|{dK%?e~^{9Lis&IlNwm3KMwTQc?m zqA6ZkR@Ir88+!*L2}MU~_l#6F=iA+W$&XqF;c)4<#!D;zwSZ7Po;4U?0Y)_0WxV1? zSCl6_URohW34oKaCWz>jMiI$*u`?Cl=JEHi@$VaYKc3sKUzQ8SJY2n!OBg*Aj)`et zPM<0-e_LeH!}UCtsts~QAMbd@%cHD{YgpI(9Z>W=M3v9B@HxO=>fom`jPAVCF+?)n zue(O+qRE@?2&^NANQv4u`K&8{o&1Ric8BeOLi@wd>`(JlI@s6Cs}qV$ zt`VGV1(vE?Z5Rf9*O{r=@_%?X69Z_a#BK?7tnR!LEl-WaUV}N5gZqAL7b(S|k{BeAn4J}~S zC@C}SBbJO$ydSnV%z3|uyfLx;tV93=3)bW2ElNQX!!sh$9wF#&-2Rz(*_Ojj=PVyKp`E1oDVr514FXvqzu0iZ!g6 ziG)aAiObq2Y2{>Yd?#XDb-$9Y56w9#Y9%9yEWE{!E5B<%l_9I?G@CvaUf9+0(Gd5R z2ABX96ZtebL%+HwA5HahhjZvgXfPzmzU^&SJk^{0rbfLtAWOL}M1IYS9WLB(zFa@`5bM&!zVNxK^Dgb@9r8Ub#sCRmAHM!8ugDMb^rEA!)tO7Re~tbs#` z-}zvviA_Su$D|}Ip983}_M;zgRF2fiSlUaoQiKC=>()E+1lARS1uZElnMmqH8gM^?d?~V`1{3 zYB*Np&xcz~jqRNBk#m=mSUv|bjeKVOnWXse$1iKb52JL#AuqkdN0G+|v_cy6(#nX1 z7O^RV&m_^I|DSs!j;NVq3U919ByBwl9;>RtNril4p^NjP{CytjjjP9OC%H!>qDV?& z{jU}rnjqC5Qa^7>46sRCTP@s>hEID7`ja#@3^@{tr)R+5Pk%Q8y6$yPSRXh(Io)l& z6H9}<QXsh0S2#_%A7r#Z+x^3BlAMTrAkdI_|ZM1^Mly}@69^qAm8O>_m}Hxz zKfUuvyy_d0LUDoV<#>xJX9AJ~A%lP#o4<@y)+U0Z3N=3GI1ps53dvMlId$}Cpb7k$ zDq0kMj;<2+!#D+}_$?_!(Fem1A_%fmv#;*)E>uW0!rx6iGoB^_&PRJh-3qZ-kwi@nKX>WZ=q70$Y@9kz$;3 zIRJaoI_+#LZACRM(_VIdqd{SR(K5XsMnvNf-a1;`c_U@YoHm2_G=jIkfBi;Fs3;q7 zk%5h;v&{v6G6(#`HB*n~?_^k~!4W6ljPGY3s+9(kkyP}~X}nlT3aJu7m2WZ(gkih3 z6-^p<$J0EeS!S9(gzLbmXTCI3rPmZW!E++jJw@&M_FM!%xX5hR&^YTc(iDdy94yiF zqnnE94TBN#JRMp*xP(C@g<9mh&88PGcl^qOSnh4|?kPZa^cPF8;<6w?$tKL|?s2BU5unO#@J&TeyEmg=yUDshBAd3zzn z06XyLeg1r|@)A6HjLT=5> z7a22a#tuHuZUz!gWUZFiQ!uRRogZaOR5UflMUw^wo_b)mxQ~7ZDsg)CvB}h0bbXET z=_ljDJ|M`Cctsa7-0^nDVbp!pK5SdV zY`9MfcOpQ3LVHziA3OX*R>pr#Z=~R}eYBoQO9I+zRnC-1Y+H@eH^$wafprwx;SO6_ zs&slFWDyg(saI7x$P^(8p0`(Q#C4UdoHa`uHD^j)akg^Z_Sc~*a1ea>6|w`(#_*aioWG36xA-R-xb)1kKv>C}z# zH%Cs1^e#xkYJ3=g+5A|P^s;vLf5dvgGE&BNqNpIwSC@GZO`6vC;lRPMP=Bxd7D<{!gln@7HWuq(~-XoQ_Dxwf>`9*RNEDTC7Cfy6a*WwSD0$ zxfKa;tLM6>4R9-T5c%SVd7%Y)R37wdq}B~;hYoHvTeDgF3p})*<=2DTLcCRCJ7L0i z`qCfCM8fnwo@Lt({kBU7kQUE>*13ofyfxl-pf{j(qjJe(ehxq2WAeu_V64Dnnco!+ zO6PDEUl?&3q=^67xN0p|GrB{64`5pOzf22F!2U1e&BxZBI23OaqqhAGo&Rz!)Dz?`Bk(g_A#NfDr^xUb*vEX zo!~U?ggFvk)Pd;?oQOI7UqFRBFNPRzB;aPb69)d0_`@FUxNx_Fa*z31ii9|uu^s6I zO^IpmZtu*AwDnBgLfd2M*ml0QCgBxsM5Ub zX7e2L#A6XGjE_E&3+aKmn5G-#A1o3oNbs{>P}xW;x2h@Pbg^`>b9nA>s~9s)7t0@w zkjBpi)f3wF;oUW!(KI1rrwn47WI84FRIu5t!>yyflfGqm$g2-@n$1@F_GSRH+gvQF z+d976r3>4<6MePacLVE_#|@jIi4W6~59sYOY8EP^meX8IvuBAck(l&yJ$vSTahu?P z4)7Q=53&d*!bH8UZlxSuY~HR_2PBjV)hP8?uHRw=W`b{kKO}gVU;dj+01DC<-#UOp zmFmdoKsu<0YrF}7KCAub#vXTb;YrZX+AF~xD4{kG&H(D|2+X&@_s)HiK`h~iH$Y9K zC*QrbrmFd51X36tb~QRX>OvQ*l_4EGg%?jr0jYoVB=jD5X%<#NycMT$#V;waSa5yu~=DWJjCWqol>QjZ!$dxkOezrvb)IQK5`Ab{26SVp#@pB+-a4!m6^nAmgme zxe{Qoln@xoBv?Cr^WKlOq{aLb?Mg6wc&+IFflQ_ciUNlHDgsyN6?;selQ<29UM z1Ri&%Bl!F-_sXp*=X8dba76n$T<22+!gVX~q|iWR2kOCt>qEyWq0ne(^zzGV(&>Tt zo(ufY;a4&0`YQ&BK{_yA=Vu5`0_6wK|L&||2L~!S21-x)uDh?**AustUnt_P&v6Bw z$N#;#_jxAf`kON_ocmn)b~_g~lh6)PtERlJgjP~VL@5R+8Y_NQ)>rZhA8cKf#tLHR zu-~xWSa-lgdG5q(&4wRFB)s$vYbF*T((n8D#i!1U(>t zhLqNO4o4q=meN_TOw$_P(Js(c8`)B4Di5I29gD_6&?r=9Da> zltK6azQXnF&X7-3q~hP9yz`1YldL(6?(c3_R%}Lb`y-<_pgC3i!ILx8c4JyyCaRf6 zoWB5QH)Dwi>ojBu(>1din(%D*c+L}{XSH)_$bnG9d=Z`As&(SU71P(G9u`sLiJFNM z@`>k-y|JYHajRa!%=#hsZU{DbJG_JFo8Oz&W(h#!L1L>?nFu^4Bdde}*zyF8yCL9v zM%X|rc-(JfHSleOcBV?{X;5nsEPe!)OyR`Gli4{O8Rd6>$y1t1f1H4NluMqM-VsRHc43iqy z>j6x);z|b-+6XAuXEQ`D3l^K|4LHwU_mOO(c-DjuKI~7Yuq0#`an=fX9^OyW8t^8A zZj+y64YWt+_H>sj13myk`^)^17w>UXbevy7yWJp>9JpS>*KmRSE2z9T8%e;~W$m=% z(k^JdJxp5SDr)ESo9}q5{W|m(>k~sDC!hJuiaU!T}Yy>Ha74bq?$wgL0{y1F0&`+#gt>)nQke z36#>qzk&P`m~p4B13Q=Tp2QJNR;62q9X8)6TkwFnatd*Dbr1))Io7712_f{mSP{*g zurak9&^=QXx{SSULx(_)Up3E4>AB&4Cm)P|NIyKg1Q!Wiw~gSNdw*?jjB|3x&p!kl zf&)JCGd2=;XD7n$Io~=WL96725-*qG8wsuI?HsHp(1erVI!5zj9(IAfsrnjMhhbCMELv0B8TNz&JrTY44T1YCMqcC6yGr*KK1a!kXTh8wI!ZFp0p zbLVfLX-(*BZ>j6Kr9jx9Jgy5z1zLD;k(YKj&zy6kZZ9&u8hBvO&JPJsl-LY*51Cvw z<9iR>Jq)Rj$)En#+5bXTl_k_?D&rq>selTUU6LQ=EZw|H{jhH~?NuN}J?s0V#FNVQ znmY!Bm#;?0$rVDV({?34YS|yJ=sL+vrGidUAm;IVgC%u=!Mo4g|GJWR0H~P}c6fH- z-hN8UiEkgR!hG77a5)Cx2@^ie)}#6*IwB_>q-Yj)i+~@z%dZujv0hRCf3Ww~QBl5K z8>oV$fG8rJN|%Im3DR96Eg(n^(hUwNjnX;P&>;vzhk^{^(>X-g{HuWHePnm>pqU{ z?H`m$sZ(!g9JEU@X9=z5+fLSf?B3yH8H?T6xu)1Nw;-GB~;`BruIgu4I`2S*xcFo=pOy8P7+h{zIow>-_;y_ zDE(2oUZzS06wuwi+jY|S)hZ6W5v00>gR|27!!?amq78)61K91&=s8BBkaaJVtiL~w ztslf$w3fx~1yD3Y(WAeC-xZ!o^zCkgr89pQV?R}!ni1x<>14QomY6J}LVnOue>qGr z$xul1UzG+9YuYF|8eGR4V)pTm$*oi?!gtDQLjl$q&7Qy;sV}^{RB=9@*fD29t zv*JK*^wf-0uiF%~a|6=7V)ZYSYVwnJ82h4h_!47$Bf#p|RnY z+?GaLQN)3@&+z?_jTBuUXIsQ(G1KV)E0l7N22+at54i~S$|J(Yc0mFBbc{RW^uM3~ zmsWsP_PzR3+U4SCi6m06;FDC!7|P}1nEmo5wOhntsYsvc=MLd6G+c|mEKe@S9&ax? zxp~#^)ATuW+cNNgmrS2QBmfm-^JAZ9dT`~=usI>tNQl|fY9 z4$(dC)4~Hv)RbTLDfa*SOAzwYUe*Q>A{lDb)%f-ApNA_1X|prY<7l&~Q`obCMMf$o zsq1P>k_3Tpgmxz1#*=tV=ZLL$4}8Lbeh)MI-=4oADo84li+KW81}^2gL0a-M!0lS* z!&4rN1r4Ca?Rwa}%y$Hc^iwHT+;_y<$MnZRP#cn_-!By-ki{|!YrDTs6cb|6Ip5R3 zT?=IGYb9z$Yw2}Al4Gsz$~M2g2K+5cpa?a!^~0{jyt9Vg$3YoFC} zoch}s**MzZ6-QKmw)0`!i#F9g!|YR!Im#A(+=_?*E`=rc&V5H{M&R*cGlNIrip`H# zLcW+#e?3e1M1%52JRxHi`-`=!HNp{J5;u32Q~r|a$?W+xeRF0rTBsoKVLEmsVbSya z1#3|Ok{PrF0ClS8cD>;nQxEZTCz2BvS$udGr?*lxdt%2vl9ol#dLN0fToHc89lE6% zCd~^bV-(alc!dA71(7h#mEp4|+RD81{-RGbUKH+iuRX6hLYjr9=k2{So*qtu>bbz2 zfpkrWOAbB+%sbrtm-37^NzM2mfHlq~m_MC8Nlko#HO!M)O{Il-rIh)kMA&RaiGOunKJ+{WKLlv15>@hVeNFQe;L(x9uUulMvjqhe4+BY`J4oEG3o3)5 zV0VDqsrpO(uF$o^YTd{v@zTN#z7P2oE}!>6vU8b?0f4`PKR>aIul~t(nE7rKOwz?S zEbBr0qn%`h&Sfn7H!qz|^`PGi4|cbQ0oaUn(htw*lINA=XhNZ>?1~VvMrnu z3eDocy}4RV)&kA~J)Q%hd@b3muvc0*WvbitwiY^;^AkmmWF!DU;ji+PDeD00T^CQn zPiOyv(8}!gWUW}GO3YbY=fEJZCm4T0+Jq9!*DT2y-wkrD&qw@Vp0_{SLdPYG9hSIoTT;7w4`@;d@QALIytmb=>nlWfisV9r|S4 zTVZ*s+OU9-+wEXx-J2+MB2?f5%Tp<8yaSWpMqi8sbaSNrzKUvJEu50`e3q6&$aiFg zWRAFp{&+uQ@)D$2?%=W(IB)r}oj|M-lh^T&-tDsHmh!w{<0~Rn5s*|^@(=zuduE~H zFv6*J>72}AaJ0hWSMUw!wC&6HUB2s<=19Uv^!aRXE-A`lzQ6Nx=SyAA1C1{og~!>3 zUHJxHh|VR3POzo>_Jm$o^c*~#`{n7N7nsC-8U(h zUJ`mk;alT^rud@2*apz&z_0jxSG+t=89z*W*RYtGPVDvkZL-`fkY<2jiZI1bleH%5 zJeotjcxn++aDUmWYsP;gpbtZ;BZtH}$`ayPlpx|=Lo_YJcqr)@ga1^~KoOHUXtb@l zA2YZyis@;^bJ$WA`RZ@QV%;)afpuvQ>8gd_U-aYUIxASW5L6^D0ooS7M1B?ecB)ni z#`&fV7k)Wf$i|Ehqvp`2^ak$QncVR9MCbVly9m?efrS^&JH1OLf=1)O5MfhCeHsh0 zu?Zg`x%>5x+GUNC{8@Dr9NNWryLAjW0w3Z5-CY`Cc;;~#2f?Q$&d(psoQTAe0JXcL zZf+iPkTa{u=o2;FB}>j}@D0aUTdyF2m`6rqV6js4Jm|1m3yL{AX$je1`~5oUkmx-( z(u%KtEtKi&ovGXObr!cW{TXsv>;egZ0sG3cNNDP+ZP0|9hrO}zLRFb zQaAeAS5rDTyEo)bR96gLaOX7><}U7nYWIP#=;7Cb5VB91E-9({`lRk%=glOR;#Fwn zLyWurC6{0ICJ)HD z%#~wg*EZ4MmQfQ*;IBKcB}ry&eI4o3EPWnjqG&EEL?9b0#?U-Sz0|*v96hY5M^k-! z&_y0sl$%+>Gy>pY@LTIys4iqZAF}1lmob|@z6#ov&OWum??NID&Y^p}ORpMo&43zW z32IRqZimshotPfywyJQzY7=ReW9G&nAZ*6SLEmF|4m_AKi5qI|p#VgfS*8Y}6- zLT$#JLKqlwf9_!JelW09ui}TvB+7KcP0aKF{xS9gpxUshozmkn4^7A#x*y!rPMb(- z@ocR8m^tQfb{>Wtg7lhwFtVcIy*-#9=lLaXWhkG6hx1G0!GhAoHNLR;%FH^yjoBxf z9w)yv4Cj_6sAbLEFxJ5~zB`6PBLF1%V&36t>8C2kE$-<@XL0gq|C$ynZ;OS&n&FkV ztkL3rgX6NvNW3N(;|Ors#t(tx7{g1q!0|!)Cwl4}KU$b#>)8WuV;(d0&#>lVv6nA2y!+;U72GWmTNx>sN6H^A9so?|9A zW)<%%)Zy9%guaQJ7_DR z|7kDaU+u+9j41f#xkBPzM21Caj?~rrbi6absR8Sdk(D%Jy06Qf1P48*IocT~Y(0>E zCKG<)+ErDp-D%GHCpP$%xV#0KcKucw?X_=HnlkOQ!M}F3iiOS*fPU`-fBL!p%U;97 zRANZ)-Y

v05a%0O$L%a?CU=kA(}acA|+SGJj&e@2&EF6vLixKwIuOHH@MTi$p-Z_w#(c9bBuc_$EyL)kE1Ds}TSoOT;w4;06y^n8VuD_AcJ9d7530 zPH9ni^obIuZ=@I%4gyJbE^KH>Zjbo0ntf`Tmm|AGAJoG!(=wmF|4Mr6AD8t?91EC& zPNLxaBPmq0uq3FIT|i4gxjln+RnIvwi|7f!0m2y*(B#QrEDZQZG4Edz9%tgrK74tx z6e5WeDnm;2fsMRq{QE9#l;t@a^Iz^&haT?XTRDtSUx2-2?vae(qX6#KCnSuRJj@3{ z4pia_uHJn`oCW!sD0evb;ZyGGG`?4sl#y}vc-n!5|v^87x3p}zH5pTkC0hhg&Zi8!nLB06f8b0hj|B_*$ zej5j;MojeJ*bm3qNG9Pr=bbaZ1)8#lYk0}(Qf5y^R03ZLd)8xn=Gg@W7y0xXnnK&^ zTR~(7^=hHIV{Wa(v5-i& zS{A~C7hFh#tEGl#a=($})!C))%pb-?vQiiN@=bo?EMq&P{TrUVn|aN*fDio(rEz}& zf7UN@ubqI3VG~@ir66*!pzsxT**8BduZpWSVZNj6PR}_#K`!Jt0gJ)|p!LLLW~_&g zfW!~8@!NS7)*m!asQ~j{o&d=>=C&12oK!bM=&}AFP9(ef4UWe=?5Yfz_f(Y(Xlp3a z^e|`T0Ia?m=K;|0yRP%OHK94+hFPLA$IU##hGP*w7@0*Us{sTWf5!UadJ}~eg0*EP ziMl2v@Wt9gyw2?F$LohT&s1cqb0O4U%=w;(Nr4wX`w{Fn0N6jF5xWs$R-XTA-|Mb@ z&wBS*=X!3MC}}o~mdJSm1j)+B#&FqY*$n9u8An3DXc%WL>8ZpPxsBNt)rd{cMZe7( zjt97ZcTymVRfPKwXs~JS`#)qHU(dB=2;IQ7i57wzzPd|B{Qu?Sh6OGe?Ry;Clm}S; z9+1U#8Z8y(LRZ_vu$pvMi~tO==T}m(*w;VU1;0uQRZDbJU`CiYnw*0ymPEbm;&Hp4 zjJ%0rO3JRvnCSx-K+KW=L>J45T9k2pRyoLm1E}EL@}bRePHtOp3|8MK1vBHhjWbTa zNMYaEVTQTTL$Z(RzgN?32UJCZ>8Th;${sY?e%*z+j;J{R6`3?9F7yk6{S%9^Pf{`K zsy2%A33qb)nj;*mMB?-I)}?)HFiJUqsMa9y)+-$C#B^#!Ef;ncAZ}IY8QH0DkKprQSV*^Y zf()kk&~mlW%sxiLA=oU~j~nfgywOJtv??kciA3u6n0Z3IPzsf)&&+nfRgSj5-I z|8{5r(v}jSRP3qkqz)VSumdrkd;lxg0Q;+#;xJs3$aqy zrz0V`csZsI)PAy1_XOFj^^Q=*+X7iAhB2Ohd9Vy&w{0)iVsGOff2?12*T}ZFpv)0x z9C-om)J&83gbZd5v&spS_Ap$OWLc}v`Kf8Dcsp?_LteYPN&2$WZ^R@%E4dDhdpz_g z?Ing-{c8iO`C3=i5K4O0S%feUcpeoVD2~!sJZ=B3uaRaMX)M z@Omiuxx!DywHJlN5Ssm{Uq%6_*C!%fJEzOlw^*6Q}~MWcOu)jP4=gJjz8)(=urY&*FX~T5&b!@ z07%%nFjR)&Zk%7TSDIr#H;>FFL|wNSn$hR$n@J<`U1x*MV;Q}jzpdFD*EEp^nZfv$>i!7&t}&+n0+Q3*LRV8N{NsB zh5KgAHsi*6u5j~=I=s-t`Wk;_Dntf+dyCywZPk~$??!$UbSm;@1NOjRe|PIz^4@R#%j#T8vQZc z3x_`{jBfSEIg0Y?YtZWV?K3;Du89@HjN$?1rjSNRU?zLtIN^h^AB0P-ROFXUMh)yNjx6UrgEwYYdOt!exj#Vi}3 z$c`4KfW6l|dUO2Skt*)OnctdP>JNYxd+zj)4t{6KsQP$1tY(P$n0rZYUX@04;~i}7 zoHKK?|O2Hgo9Y^ z*j_X^`aW@%mBkW2fF2oC`Oq~LTHg|qLBR3*J3}ZpxNSTAJ9hx= zwPZqY*y495#ANoF%8gxJ^?829`r%u!2r@$%1s&&x9Vx^g{wj3H(4Nh>`UiQ_9QoNP zcdp>gqqeY`bH-n{T;k{2Ea^Z-$4`=pK-Rk6B)pJZdU0PuP@7tj#CR53HmZeLs3IQMwB(c^ZT-${ivLX-c1f;>n8T#6D>u5oVG;ITP#@ht6%^)Kh0 zH?B0ehi=*!OPi_Zsrw#m*zqYyfI(Z$nO^OaRZ3sYdR0!;1Hc0ix8T$^bD+r1uZ|b_ zc%FR7e-IXcd&Ik`2@p?NIqiJAgWUnkUWtjkSF!mq%<9)1tAobal2`wC^^dAF`&J4aGT7Tv{OOexSK$Hsy(&;OGKI2f*}^tXVG97cU1bb0P)AMc#nv%kxI$v9@1~6!b^wYQUPAMms2Wu#s3EE+RzR;wHOna6JAf^G}hbD3z?(~_gR&CE# zAd=O9`|2IK88#6ywNF&QR=GAWVB`vF2Br~^y02f|DOI`M%)h+KX$D9LNMQiTuz!?b z*-0caOiy#f9VjUQ#8Yef36M3@PT_3&_?$h!wqlR9*Ya?7_3AnGN$hXJl07x={|w%h zUMO+vCl;$cP_|RGT%961>hlvU@H446!`fcmiHfF2#)cYQQ^6GwlSJuvQV{9vi1-%- zPVa#qNpKX3?BQvU6yw^DfH`nWkR>YXg^)mNkNcG;eVEdMac?6agn8H~xco~u#kqAe z%=XhS51Kd{lof_hL5bl}CSxkGH50$>gem<$O`jZZuQ zNw9$co-mRae#=n@4L(BknSdqBkAxaXK$}8#rO#je+Z0iMG1#+kx`>l!8GP_+Zu7B_ zRn7^Z5Bk)K3&s)6z)+snkAlBD`Yk(lzo@@a!Q*&c4JOm}d<`RPdk5*aq)%$)Jqof! zze~uez^zS_PR3jgX{1Vjo{xExjMDANHntADh;{)Q1mIX%#t|(*g97!F;7`=)ytc4I zdXS2Z%lKu7hkTbAW}1t2zgf{ghGkWKk9=-k5{Jv~NgXK|_5@ISVS$NT272^rp_H_* zY=+DYb~efShb__`+Dm{u*WVz4|35nPy&p^*MCyg(%=@9cu=Q4GB@o-$A&|t73PFv) z$xHaN5DApqR>_!s_G552rlKNy53dM^ySd#2Dqc<(RfRvj%Yqu?{DQ0dfd)9}mp;cv zG}Bpmuiv57{;lTTz~Xv?c4=_u;Bl;=P>XJ-x7jJ?&)3A`69=-b$Wf2_N>glGSapcO zZ|{n31V1rsfmoe1=eGU0Zvf^ofAKsPd^H}IEEIkeQAjSRvOM1wR-TYM2!O&eXq%p_ z2-m?K_fR^l^)CU0+3Xz5FRpJ7)(f7gtzE*u1FCf&RmFksFW^|Ii3Ys>W%So7XC@v{ z!DXVZ?Gi8$uDa zV$7bX6FrcAijbr42hVV2k>X@X-*8?ijDSaoMs`MCDw@MeqOZ>%T3*$E_4LyD3{g;tt{WloiAOA|2#%JIf?+ zt_UwHkNk{V`{nbqCV+&nVd}p)1|OP8u*e$kF0+^Y19-^+!qy24mH)*_I3lAz+)F&| z)6iE6WC^2iZF0*tKYX$OFAl@nkx5s+t~%Pvn!A^lFk(C(NhamwTF8UByXwflQ|;9^ zZbmwk?gMTAfAkrlz|hG@JdPC||F&Vb50?~D(7*GdP6@$TqvL2{%K6pSL%8I{C7a#_ zkfarTokK@99)Ee7CyEfQ{glcab5*?a?X zVF|T*DRmH)@vPrV5>Hq8@ zAnsiWo|@P^w_&rfR%C!kPZE6q>GtyeCm+^z@=vB*_CZ)K&z#I7=>wkc3#&&xu3WX4 zT~dKx$KHAO8$JG`-{1q}a zjW7B;ne7K^oLHsE^hqxc)_c1QywfD>@b$&(wv+cOsIXI~*KMwmHh0-)5JN}VnLa&# zqYlh7-*}OxH#F99arET?&H~o&sf+)<*jKNo9a6Ib!Pr8BSRSZ}hv`LZNrY(63)nD2 zz>+jZ7IYz{z4W^EZj(ZKGL9AO=W3qg)$`0QXw}uQ){3lIB1F#@w;V)nu zIcNOqw%&&i^f?)IJ!tcku74Il9K17gfb7GZ(eHY`*VR|iXKyBMhLEwh2hoN}2JQLH zf1EG}z+h)C{w4{t#1t0M{GhNDQ_ zv4WTtC@j%ABG)GulP9SY z14zs1z~Zaij^aK)O_v${b>}dw_Tqn z&MjgQgnoxB2waKtyupdz0x+7kvI9)ZhYA}Uh6>6MWa^1rkF}4>hwD9uAFF@d;X_Iu z*!ut!v^J{agAI`sw65-*1xd>50N9^Yf`OK(^w-s zZMc6dF~oWj=!NnDnImt0ftme&V=OV}bjzqXK~liR_$1zw%D;WJ#!V0KWG$hJLd<*i zrrd2J@2@Q^TIMSOwBI|MVpPp^7b{-M#ig3CJNy?jrQ^l=?31j&BF`nd+3)Mh$>qd6 zu$Ijio&{(qe|PS|MdLG`h{1WmtB(HU|$^AG+szJtK#q;CX7yrg&Y*aypnrO}sqR~i&jkq8JW zw@JoBY+c&x!j0v_4<9;se;B19eOsxhHg%7$I%E%}SKY35pNRbqw0s{!R&z6Kgkt3R z2wd~49DQwZGta0~$Zg`tAkmt*+k{nbRZ1y=-Xs7CE0kGXkks=Z@O=9ZxRSX;L0C-s z#zV^EevWJ7GenP$JOH#V|1NcIQVBQM*4uk)pa8_BC&zi}Ay#o^8@gEbv%rQA&9Cu(xxj$sZJ*M{>&>>4=d?WsO9s)pcP7Oj!zeH6d~FkTGD3dGpna({7!9O0G7jy9v*}9NC-eZ2 zmIzr^_4Q>@sVIvWaE$CTcMRL?_YV7`5MoT1rUmEMV)4EA{yyum?r(0I)b7|=tM~!P zeWlIUo3Cg=`R*uxjByh^VY+78#S5`73R#bzh5ft*Xazs|r0%6*ykd090w84Zgqdvt zA*+qg5r_SJVvKQaUCo^T;DH|hQTgP#yt(>i;uA4`gU8h@cyE3A=kK;YO-}%>_Tib^ z9%c_M=FRQ{xgfFROGe4FphCq~b^vS_ulPAG+pEq-;H1VFWxGDdA@{OO`rp#YAfIr;|!u%j(e zaVg~2eRl{zOt9I{LNQw>S>t4q<;hdY_-pS{$4&ZzYZ-vrQIZG-8b{eL*X^>5RE@w;c^t-#@G!%sLe>bQQ)#;2Dx3XjkHJ zt3m*)&*yX_<-3VdwV=D{+`1MJA@kVuo9-LA2xd1u#=LJY60o6RjCrNe9uZFKt(|(#e{u z522aCaZZUX4Ag9`^2Z3_cUO6dXom3HTPLd)a|`0n9jPR&t)Yn^3@G0cc{W2*HhpK{ z{s$D$X77@u#et3*kK&A)0^O*I6xEkGZl2pXfh2GA>;37(m$=gJv5EgmJvjYXR!Mdn zH_KNsfB=Iy74N}@ZM>M` zM-?@)X0-7ML2p|LS9!1wRC})OiNd0EU$pYPu^@?1yzqjCuC+{)Y3U$OAFv3HfuB-1 zu*Gz?Bs6?7C;FcybtXVl)OVDW!+W)tqhKw{5LQP9 z?;D+jEO8PFo9;-P~B+)RMus~5?+ojj%lsjwnNN@JXLbXqgl+ig?&zYP+t>xXj4du&r zqLTifm50|~TKZDzEJ$Ow%1ba4U`XIaTVNiIAI)lScWZN8XW#fg7McxVSJ|)6a5&|I z)*+_^iKTv{+n&@6oLX0O;uyqCH$FNxw8?dM%k0jw3pjd#dTH650drLiJFVY)IkmMElmM0{ z0V4?A$ZFVoQ83id7Obysod*{w-bb)3v`kJ1|A#Md`3sd6i8tAFg;vhnpjP z0ON%dC6p>g$~TjT=J`I8zxGwA?y>vq+1PXFJhQH*-73|)5^*jSAz~+CTa$Ej+RhDC zU-lSyY!liHonSd8D-%a&$;eF(la3CR2qo|+1?V&wD(|Kr*Y{lj?2J&A7e6YH5NOlu z)M1m7xN*HU`LUnceNNnIX1!>^Bp!zKDG$seO4n$?CfNWeZ-Lb|OSyUXx!>H-XdBGD zY81z3xt)0H_4_8l_;G>Q)0OBJp0x^g%XyRaI;uZ!a%1`#K{`8B$DReADu;=Z%v_AK zZ@+;OkIzxLXfEyEn`vWxWp64vCledZW`j4^`IFs3a}zgHq-S*#8H1hU@_kOs3yevK z`9$Qo>(JSZ!7F(-NDRI$LGAbHEICdJ)e&akDTd(j+3 z#8X>xwBw11jK3;A`h-k@B1BjT4qwaNb|3J;x8LPIN`Hz&T>Kaq$XfGGi`&m^Eh=5@ zgNI0TfwpfTzLKL14wF>M0w+=}xA*4onex)Mf4+*8^Q6UuY@|rQZK<^DPts~btLC6b_;@S(R$BuigF6=QU zm<}sPOpFBh*zJb3&ye(kX1pejwRHw;HI9IRHDnSrOAQbh<(RIJNmgsmG*)q-I!~0(CaRc7<}6> zf8RQGI+I1Sx%$Ri`a^nl`gpsG?M~%3iE0zCDyw3E<=>;Kj35?w7FIJmsY$-TUn&** zgN%-=H#$(nJ0A%Vbjg?pG1V8ihcQ!tV~bWm5yD^BP_NXWy@he{s&D><9K?I4>Figd zrD*Yt9!F&s&`|KN^HCv5adjSh8nKZ08*D?1{Tc*U4g zf4Xy%ke_2)z@(Ct$xZ@m9|T%MZ}oqilaNZK)K|0gmk10|=`EhS&V4%`T$i#^|F<>> zgXjZry<}gvE^?be1(~L}eIpVL^-bw?R}CFfd=~~(!~j;4xBnK$eY{H7v<^21dYp%! zwu8>m(MscHOP4JI3j${L;a$v$JZG!Nunj3F*KaSCsC#uwzOX(7>~6&<4Wf4lyPQav zOart*d`>-*XeeyBpVDLbY)W}x3+|MFdN3JB$nTLNq7DZn^5{+?2<#ONf=!LrD4~bu z0gP3*IX=KSFwM#28;Ng^epnY!)(c@|(S0TqDd6sHbTaOQ5Ckfx{PM%-HS`ziLSdVv z2)9Oqg24>IaVt`Dd)_|)bWQU%0_&zueFXOI*wV0O3qs+zQ$ly}?3&*y9h>*ZB z@Dc$W1LM{53y-kD*$?cf6ph_(3yrKL+7;n-@AOL#aBYox(Hor*AxX{!R=|wsyEt(- zsuky~9UgOgh>&ui79x(@XD#XO3zT*)bPGDA z*yb$R<}&{{xjAKxXCAC^BVenzOWaK0q(5$Cbp=w z*{pTagnFS=qI;Xx%b!-8z+MiEZzS1XIhRZ#W7gi6SUY+Vo-j)d%`4|1X@PXe!rI1( z{;O7l=o9QGuBQ5F&!M{o?{!qFz7AhQ;Yw;#Vbd?2jyt1iP9jX5b?@C1OjLUFS{K9* z|H}mpHqD1hvIcj|JpOC8Bd+h0;P&P8^>)@+_89Xw^t`LF10mrDGTXrIPra-DS+$|3 zHh9-!V7Vm!!rIo_dbgQ^%)rLACTG!l%As=LMprHzql)oA-EV!#g6EK9aE(3@pXS(j z5p$kE`w_%JHnb_fUnHnK?7ShW{nBy_X)G)SI5e0>>P|WZ?a$l}I($;Iz};zc{0}!z zO!(IXqWPyOf<6^@WR#z{`+cN>qah!k%kcvx3uFz^B2PgaveVwIz?=W0ri)^;0K)kGV`TmHBQ#N;o0uG^_bn5@XQWn*RwGW=%!L!g3oN8%U`qM7B_7T?WPa`8>){Wdz+f! zBvU3wCcrsrn3$5U26I;Zl+Z%R93um&*W4Rx1T-iMV>+q6Om7)}t7@l#?iXw-?yB@F zb$)klYYXFD+Kv?2BJ7$z`N6aVssHLHA*D=NN>jX5M79Q=p=I-b)1=ORi`5s(zNE3^ zzIr4@&UxmV*{AaML<7B?%aa39hB}*+9{U%BE0u8N2g?>9{J1q2V79@^0mhAIlqpU% zzDk=aOdz4Mn;+ktCR+E>TzV`CR+qr#r2&iF-WBV&PeCL&k?$V|uAl zuqxT^Z3eo**sSgdy2-Kui{(S!6uGoqe)wblJI2{F&9YW$JY^?m|8`b_~vXf^1y!5lF1}XmE$c#x}(V;-& z$|}K4mO{aDs@v}?-3`qHya-_vLs8Qm7p{=1C0$w`!U5)|Y(YgOPPE(3b2n;soBHkZ zO}|Q!*ZgvG)gchG{lEnUvHFXc`VS=R(U-QOcAz?EuHtAR8ecZx^0&s)AJzzNsf2q~ zY2Q}8fXt0GBm0yCKTP!RKB(S^~gbAxs}|36EbgiLYJ~zCfIg*)0G+K zo=^97p4>AdhQqJGlep{i1aBTJiz+CQDV4*70M1tntZ{n&AQSV+ z8y!W{J+p7(urg?EC0k&bUm!iw2+cIssy&G2oJ?|%39S>yEb9h$n&K_6PJvy8WQ6c;Ppx>ij9*~`aZ!3)0mbG**Xm+ zIFsc0f?9ecGR!PJsy~2rpRs~7R0RFFWNIUSIklh;S;Q;v?LXO_0=z~u7Eq2IAD5y}WJib-5jEnRqXE3a3BM>=)&30d6mDyCnf z;xOe|vbK>44w+INvW44S{a8a2RiLW2w2)93V}Q2Sqv{VM3 zVDd1c@cYoV<&=%(`YkBc)uj@2;o_mA-AP=4fu zZTG&YLSR_CRv+9yu5VGB;uM>`y=J7F7rO?;!v1sNXRmg^553W)y^=m8yva{Sa!BJ1 zFqJ^~IhNL(M7t(M+?)yhK_GKF7}ku@DrsMa4Nlx6(llzZ@bog z!XToo-*oC_d`j_wCl-yVjgFC-nou!tYZ;pGQaO>Tc^Ox`^+mZEt(L`nQip6_a&Bm| zTeTOJ3bmCi-jWq%caEvyDQojE^VZDS%UNnL*?f0h-smKleKSHOH^8gbI#lRD5*d%J zb`rpMXa)Hyi(o!pWYgKjFWWf099G2qh+J@|w(J?d}u z?O&=jgXmX3`JcH4xX^AN1&|8<+;*FsM*U%oN!ToUQr}PQua+3FdyJ`*;SAwvPqj~% z!>%1zaM`Dk&IiZSL$d&nx_d**Kl zYNeqKczeSpAPp|olIJWj+pypXb6ZXz(QxWVBK#I1Z>YRuRd@DkhzcMZnIM6ZsW^SR z*T_Ax%0* z1qlEb&Ry!#xTR@^QYnr^ix$3!QLN+)_p`Xl>{3-*PVU{a#G@kRIbhz!jcU3Ze+iQ= zY625vBNkW%iQ~>1`n;4aRr?Qg#n8m9rMf=?rlz^@lg~+z;2UxSiY*dd)Zv&$0RmG! zIzQQCRyti!^O18?WmUjX96SYaCEB1=>g>GWV;h`|eEl038;Jl6AzrABT1a-SY*N$3 zJ|CWZ_Nb!xcFXhq3gX|xN`H1)v#hIxQw@$zH`@1WYDtNi!{*b#T$H`4n;4c`iTUuc z@`cZhdY@_QQ+=2R%7--w z1-d1BPBSa-xu7HZIu?_}1gRlr5nmTon>$?eO>Ql{@)xCnx9NNOPsE(Dc;dMZN&$Ir0&fJJ=XwY-A= z@Z_j)Z;7V~k+bSy5R9tGcLNm}p3hYh|I@SNSD+VN?wQ20*=Y%jpmcYJa>tzj|D5aA9s$lKr z##(S{F9j*lPiv`3&pPw2{Tghky!-IW@lzFcGhh7UjDti6nTqlIa;Sl1E&X^1BqYxy zy)xmSP1JOyp#RUL9cAdpT#3C?E^5+hz-uQnnples_PZklH@Xl*sa<uE% z?ZwM^N~`~O6BQ&z+a6Hi9}m{`nnIP$beW(|ow1|CSEY{hbHaZWAcMUU zYTCkX=n-Usu{iJ%TV2*esvaW_*GIGg+QU-FI_aj7?<-A*mG z=|#a}xJi;aMwRyKyq)V#@`&2S&z4GyfNPgNddr?#koX5VX+7Rq7UUsaGoaS}*fmwy zhUuNN>`qO1m!4p4u@nhYgPhHOHsd{SNG@Ht@@+PK3B zRfj|yyZ5V@IKFeXq&AuUqcZVb0G^@SruBfUKtq4FPJ8jZCCF(rFGA)|OTJV8M<-j% zZIQ8d#Z8q)GXU>AT)|OZi5gvMaG2o1@m-)*#hAVQ#r+AVRr`HGJ11D^H{ zE^Z}k7Ow~PeJK8u)t+&z(i4DGuE0t0)^J~G^!Bz)7g6k?*C<7?X&Jd1rI%tPb>bPl z-PDGN9X5M?kZ4f}oe)xnWWcU!{lZE0bJ5n0o0s+2eVMFD8(T|gNv3^P3Ay95?@4Y! zy3NUZVpbWNA!DBlwUgWZz2Z&G-OnBokJoj;lZ+gVxeu*YYrtNa3QBdawldb!#_+~I zz6j)Q)hIc1l_q!5u!_IME zw^W@zoAmIDvRBCQESpm-w_WiCx?bVCiVP**O-ERf|+Dy zQo@039(WiiRr29(OmUJ$_TV^l9G|eZwS6y`s|bxX0U4Pd%lS3y9-oBzG_6VT+tHd~@;=46N+)_iL%*Ao;(JDP?=Mhg7k23KIU&A_Za&aB~BY699LCQf=2VsgZ5_QlXYBzSta%vg3dZe!qmz@2= zk<*dYd(}{eGSORd_}h*CTQp;y8Ig@g85#Q;1TCzP6~t;#=gytw|zp zrh|-QC-FKehQcU;bbc)HANiT3h%lqTc^jG|H_hhG&^pxU5&53C>G2Zh{bsWzO!W8MP50!~I^bay9u=y_6q zwdnnZ$yrUz|4qFAFY4fb(HH;ILwNrW5(0~;yr&zy*;1l`x-E;S1Vwl<{QV#TZ*smW z=8jQVyS}6l-gup#9hjL!ub^wm|62 z?^D>o0aGGxqFfQU=5Nt zD^2cww-bF-*2fIz`cnlA8`q?JEE7Q1)n4|bDoXyCkjkoJO^Ko7ImOhf~E%C4`Q}1nEwL)L7jOK@mcg-a$aX&?3DiQIR6Ow*XNHy-Dvx zq)C?mB3-%(y+i8#`a9>`yPmt&UF*L1zkAN&-Da)q`Oco1J@c8eandCIeg}0FaBkhy z4DCOeg8twy-zlCS1^LK zRW*E0buau&Jd>BaHe`;cGx;;QA6qy&X|9UcM7B?I(p^Vgjg@9K)A+X2=-c91nFwz= ziHJssv{>vyg9lnzaAP5qMEHIO8yB6~ku*x+FCbXz*N)dZRI8iEaHT zez$=7x%Zo)K^OAb=omI&*(0&~!|1ENq6hFuFM=wh)w4oBVq@1S*NYd4a*Rn#Ct0js z`l%fl^o8-BYNOvz0wsY|>-6VMD;`@brW(jq7Kl{99zrPS9^;^Jrl$eb4 zSw}n7DtCv6`%?Kt!Yb!I|#cx`eOj_RwE}Nobdmz3YREm9;7ZHp`J?Bc3Ei ztXSo4qQesT)Wn+kce~Fwfha^kf)5tZ2M$6bc)QNJpui74M?6Y?@DY{ub^Sinu{ ziFGh7wMCU#?TK0k^;S0(KlH5dG-~8t#HhBnrqsqNpNpt2{2{Ip-R~x^0!n(;uS))a z<4-KN^O}9VcVl>^vQT z6IdN=y_Ynhw+mK<#f-WQM88lzCg^oHCDsqsgzvp3fy&?Jw{1 z^gual6+8X7CzTjlRMP&eh2QJPT9>AjAo26v`b@U_{?W~I&Q>Cw=>~_CngiKfOON^0 z{b1dJ^g*-gn<+Jq9k1hBmigK~Mtx%pp;Kj3Z?z|XX%6;mPRt5@=qX=3AXV!5t^4BZ zT54S9!2lMO?pRwZ2p8%!4opDUbe`;YY=tKHp?9XXj z&Le7eakR)W3+uFPZih!SG7X&0pqFBNwJ8s%}BXtHOYL3;>2WC zX95z8-{0?8WdQr7te3eTGI>SziL-89dx@=cVTYyZAeJrhj38EUoB9Mw0;`6vSWh-kZG)^gUnvY+uu+fn*CjET;&g#_Q4 zXUggRUhPAi=DdpRAyP}M4{92~a_czn$U%Uk3YAh@@s^{L@E2%nJztLAk zkltUpR*~tyxN}awN~++_fe(B&eeabYp$C`E+1gSxQYQowcr?+j?^ngVICIxyaHw6u z1cq$qSW0Y7BF99-&TKhaERb~CY_*82vbR?J1w4;p??AJB)Wx6Y=c{QVLyNZRS`Ox_ zXZ#bEA=ty_sDCWYxPt~JcTrjQQ*iURK}M(?{XtdHpS7M>k8%7LUwVU7Z3u-08=7qq z#3J;DPVZ`M8U4bN^uhCk-f770FKxRz@H{m=+^SHzWx_vUz=eh7nR$NJs#=4dcXN64 zh$Oss%}%B7_T(|nPw>#nk-ehduaL8iB+$(kS_57|qCz#R2$rE{J#DBR8+ni(&L0of@!3KB{lv!49P=H%)!I8|S=p;NV;@*#1R zMb=V*&Qw~#*lu_;T!~yF*!UoAU9*?i;~{ux^XRg#*4%{nuO2XQ>-yvhRKQC3_}Q=< zSa@h;PH<{cYU#$_@w3mv-ryE;VAX~lD*kE5{(uL({9F-8Ib1TdZX4?EXLPMk9Okh* zWdj0?d;s&ykCzoCQ?@pA``2`rjn;oCm^XF#8DLjidRG}G+s(zqS1fU6@#5(*GCmb+ zOYG*1f)dUivt4#BG3m;Umi^TOk6f2fDGTh!gv^@5*8{?Q_|Z9&d`JF!Pdb{FPbB5M zCmsB+qL79fE1(jI1-Y3ozZdU7KOhpn9hvn)=M<@#)d&0^rf19Fhrx<>BUUa4FES)Z z=BD~F4b69<2ZTIAqq`}Qe>CrQao~Ccr%dscZF#G0P)3)Ho9-H*D6(lcd||_p+;Q?r z_M?ndhL`mELA;mIV-2W+(f8u<)p+?IV)|D+_5(ef{!Mge+b{A>0j~areuH|m9bKUOVkI^P2k9Gcx_2?hMfnG&T zWz@NuOy$_em8W3sGv-^U+a?64|K&g}`_jykwA=*PIcNN{aFGdj?FA8KPzf z!bZpb>Qm*h4K*^*e_h%wk+~B!75lPBXGTgMfgs09(X>az)BXDmVEOJ1LXTZ{33;SS zd?RjjE+=q=u?}~nj&R^YZxp?3D;<~4o)hDB84Ul%iK7K0p9UOj)l9O6b*IAZ_t;}Z z&T0*{yA&Obm=18}gi{mVj}P?vz$(4h3%mSa4??i#6#5SqcIqmEmYFl)<9UiJi$lW0 zt)6?1|BpVovKoP=Yb(mX3k1!+LfQ|5hRSCEdv@q1?H4*9OTM7s{#Lr&0AdnwhgAD(BOn=X&HDbeCeq6Nr{ zscPKcj+3o_7H-^n1(hIM-OqSuusgvmQF0q#T=IzdAG4ktEjaIr6ZgY*jW3iJpWTpq zlA=xlqr(2BDKxXh2skn$$meH<{nG}JMTd#*)dc2w4b!GED~JH%2NS* zk6e!`iaePqCD~{Wf-_MPmlH{6UoArw1x^1Ta>Hhv*bk2`-6v(%&Q~h`v{&XhvW?Np zX}=~icIW%vQbM%PREefPXLK)q;f;*lVA7pIi(bqUN@#;6{R~S) z8My1uTERxT*OwSR7pP8awdLf01hOoJ@#Y(bJu~+b@%$m^uzgqK4K>*bxacN!NlbeI z-m>)KUO;s(Jgs_f#GkSOyO5NtZQO*b?+M(+p14dbWsGhlRqwHV#e*}eBGg)MK3|_n z+_E$4xlPI}8!LW?XH=UMem!sHVRHB5Vyjf44Bs-G*q~jBsmWnZMui%wD8~~Nzd`wi zXIEW_=vEi+7j7iJwa~B|Lr(N(Zu|u9Gy`GNM>m0y&$-G&q1RhAlyT|u`=3RR5SyCi zDD1yYz={7v!`CYPrAM5rgX1w=a6qYY(>h;e5(NCN99q+Y7h6B6{75oDKz`7x+v%vAa^s!N^*K=JHnl@Q@MvD|+vo z$>$|^%{q2236Nm7(Wo!Gdtbb-4`~nN^K6iL$m#w01M{C2>cybx;#~PLKGyc_reY>i zW9|DZOt$2tW|$uIK~;-NxTK|3AM>q!S*YuSf23viAijL(ue@9yM=Z*dvR5S7ddZ$! zTf^cLPDw}k>G0~T$=ns>{v+LvR?QO_+E3SYNWX0;ciYQ9eu?YY!y|H=ShdTGY96oz zv(-H|niTfI?%at-eW%=0=JFA;@;9B6+kwbMZ}GXvVT5S;{57wm%f-~$MAO6XKvp1s!{Cx2%pQ=i0ttwF3q$qNxAW~eE$p} z_lGvk4gy<4u?-@{?-6lW?XEh!@7lE6ZauD9IpIH6?)QigP}{Q5ocW{Ak8d3GDDAaI z{oJTj{|32wPqTy-pwD$S) zi>+q|TM<8G23LT=P8!QhM*Jcq|1pMlEW}Q3F&g?chS3LVcFF|mZ34I9kp|x_rcEiB z6>YzkAg0U?bPh`8BPI#jMut9;vG-C3uzv`fxFZg=)b#ZF-N*aIkZPBQ(T}bn>H>iL zQ#`^8+oheVZbWKi4tUzE9bR#y2Ggn)_KeMu6c5s`=A%HhV_8WW()cTv<`6OBj6<3_+pYI}a-Wt*17h2-8qOI^c?=Ye{%db>}bnR5A+JCvJHD-;uItbcUz zZ`t1XYcmP+FGZn=3(eD?o4G!GIel&W5=00h)}wul1S;-ETw;tur&P;Ryi-VtEsYY| z=|U?~>6g%~>h>?Mi^T@+hzbMn?R}0lJ0mYvDbyUPWeu}zs6XiRa}|%`u~Jbmsv3SN z&Nd|I0id}d&%a`vI?nCZd_H*akfz+R(Z8O|iu2jt8oU2eTyS@v z0f367X(Ajua52l2L}{Z-*F6sUA41PR`6NceR&3A=lZL&r(y>>$Yuq2b_gxr3k|B4# z)Db>jdetUzAX7H;)y912;v%qTSNzutw+x)Qt+@KGYR!FmDGn>aT>#p}XwPc>WQWTM zP_g!Y+k;)p)f=)#Llw{&Enc!+n44!ZFqU zA>|0>s+UDgX==;dP5XX0P!ifEa_Wxa%UY)65WX91-(zm^5wDG9$`yJfiq8I4A3Jk) zvXX<}5;gYH<}t}P<6M_9@XA@E{msboY}gP!%$rL(mfgB3#urk7gv6@f0d*UB$pew{1xo(YDfZ_*)WFOR-m zl&8AoUCP=~Iz=;cpr-yjr)Gv zuSvSfAqS{p0d85CIrnV);~S9WWJ*1-#a+JN42N%Ut5^gv(HR_;(H z{u<4NbvFA%xr3OM;ZW+RR4EZ1o$t8E^7}^5o*U^;Utx@P5=F<<5O0TyeHsaE2Rl^x zR(Y0r#xU;;I4PN$^=>o>9#?usFjHLDFi)m5P4yisZ<*Dd#4_8ir{^`(vGA|B0XWh) zfFs?u(6ECSNIz{<50{h@K-BKb6ylB~3~T`&-8&!nBr}iI#k|>%z<=U0e*f!9k@{3K z_s#)oJDfMwG=X$)TOtGuv<+}PDkMJepT9lNQwqGa=0D@Z<{x#oP! z;>u#Nb;Ww= z@1P2|xooDB_LO&S|Jyh#NnW7tuKpE;6uTrgoG%f)jO?)lXTl5<2o=ymo&Bv* zNsny*2`iY>3f~kQt$ui!C1egjT)@=7h)aK;aG*!v{{&p-Nd3n$SR-_S4*{jylm4qL z`&?VC5y9dlk9@Lm_xPfqRwVT?*vjacb-ce`vsw7gu}9Y2XmebrS;*YIx>!=07%5{@ z)EYR_^A|`>gy@LfYs>0LrHflNAIqmoxLCmc{tJ7-X!)Vdlw-2ViD!E+Y>Klyp=1A8 z;r63}Rq-NilKNu@vfLkX>Xv!9{NHVzeO5+wA!<~|8PN>c23lpVPH#aQjw}T7fn&=ZvE&}BkD#e_}ykh zEy+3J@v@YHpZa6R_WkyP49u_m+$cap``zE#f^Le0fIZ#Ejl2AGQ1+jEXI*yun`!)aYWaHDoS^@GI*|$4-dlGar#v6 z=mof1{918=H77BnW~YaS&?>4HrRo_q%G8n3{Bj%>>fa>ACiC2NKlT2F_f^bl2C!7Y}Vd5gX#)>o$N6lR|UOynkaUc3k$rJT0}>nL%?4<2IMofzdxc<5=+2i&!a?3uR(~{qv9nWQUod%|CmQv}=}_0;8A!{hROWI)VAjI% z$D^C^AV2ndnS8kzT3>b{a6^j~t@ux~Br6G@d+b)J)iO0NP^>2-FA046z0-=_E)y%7 zk5`eosqN)SM`i{_Yy5+BW8nQY?O^LHC;_qtbY(w%W=5_Hyz9!=>fQ}ld+V#d88j&V zPUW;bN{QForKr4=6QqAN`Bl(fz%`81EfS&7^jVZ-(&f0o924#tkfP*ZWix85dDXrTD+qSEm!k8|HQwf;CXR9G z2-$J;uy=KZe_3L7%02YkPL)COVUtc9zu2S*WRZ*NvGz@JvMi^+MmMq(Gvk|s2Z{oB zki~PqvZsg5^FbryjH9r4y*v=VHO~j6EN@3_vz@d@jwOlZ}@L zNE{%-iKS)XVy$xy?pCk4fU*XHbI$4fyXr%G7xLa9ci}W56O)1$LHR>sGG4-azSvaE$c}3~;;3LEK|iim z;Bn?w`tfv5;6@A$R-s>LAuGvHVo6LDcuiv4sqZIn_|ycOixhG@#>%q>h`(E8BgL24 zaB<*FL_*u&+_=V9sZYh|`rFbleaX4S1Ok_X7jE9^8itr?C0e?E7t=h6Mh(J?7FkR? zcA!k+s5L z@9>zm0QPgp^?XXQ&mEu^$#>z|Y{d4Wq)3^YqkyK>#bPCeu1{85uSFeC^ZW#Y;({y1 zM#G;LGEyQtSLJJ@@Z2kbb-NL{NtaHP^?g1q4Q2ft;RRawZ=8Nt|2C7r2Vg4bb*Yfo zb+*{AC~wk7e!OMo=<);=OlnOvI&>rL@?;T@G@Db%IqU#tFlYGsOF?fS(`C#Iy@KDc z;YZ9=X_6ds^xx3;-e{e56MFKbRICf{Q31PcSe~ueX=2XdXB)P2T>9`4qBc@C-z*Ox zq$S=P?qt@|mLdp9UD#Py{q_1VGWc^!i^k>ottcMyhZ=~k1F9xBen9UtsQ6iiBsqBj zZ3m~1^3{^k5@I;XG)Q*6=(<=}Jk8D@MeLaV{DuU?uvjZSmUQ9$4fKE!{pFTl1ROb$ zrwc$WrPh^xg)(0fj6Smp4UQS|-#h0~!yG7PGz(SGT;W`v|lBK5sV}=xTOCQy+eiaZp<8U2H$82 zKgYsP@QZlR*0z?{Aqqo&*=oSr>$-9x=U!9qDfc%eLHB+NOZ`2pbEoGdpm7V?p8m)s z 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 Z`u;3_+d1FD(k+q;W_8uF>fDWg{u`zCoaq1n literal 0 HcmV?d00001 diff --git a/ADUtilsTests/__Snapshots__/DynamicFontTest/spec.SwiftUIDynamicFontLayoutXXLTest.png b/ADUtilsTests/__Snapshots__/DynamicFontTest/spec.SwiftUIDynamicFontLayoutXXLTest.png new file mode 100644 index 0000000000000000000000000000000000000000..3cb4cb9d7374da7197741715d7b58eb6e0e7ab34 GIT binary patch literal 106059 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 R>m2+iBc*UZUqbKo{{e!yFf0H7 literal 0 HcmV?d00001 From 4cc6233253868734b7c5959e502d07cf5b7e7724 Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Tue, 4 Jul 2023 18:29:38 +0200 Subject: [PATCH 15/16] Bump version to 11.4.0 --- ADUtils.podspec | 2 +- Podfile.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ADUtils.podspec b/ADUtils.podspec index a5a66c3..0a32f2f 100644 --- a/ADUtils.podspec +++ b/ADUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'ADUtils' - spec.version = '11.3.0' + spec.version = '11.4.0' spec.authors = 'Fabernovel' spec.homepage = 'https://github.com/faberNovel/ADUtils' spec.summary = 'Fabernovel\'s toolbox for iOS' diff --git a/Podfile.lock b/Podfile.lock index 76ac3d1..3c220f4 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,10 +1,10 @@ PODS: - - ADUtils (11.3.0): - - ADUtils/objc (= 11.3.0) - - ADUtils/objc (11.3.0): + - ADUtils (11.4.0): + - ADUtils/objc (= 11.4.0) + - ADUtils/objc (11.4.0): - ADUtils/Swift - - ADUtils/Security (11.3.0) - - ADUtils/Swift (11.3.0) + - ADUtils/Security (11.4.0) + - ADUtils/Swift (11.4.0) - Nimble (12.0.1) - OCMock (3.9.1) - Quick (7.0.2) @@ -30,7 +30,7 @@ EXTERNAL SOURCES: :path: "./" SPEC CHECKSUMS: - ADUtils: 094de41bd0d4b1ea6f620a62e87fa6dded0bad7b + ADUtils: b0c7454b16153e2271e201174fd26ee42004634c Nimble: b279b3ca9e094508778aab5c76417be158d3ad04 OCMock: 9491e4bec59e0b267d52a9184ff5605995e74be8 Quick: efab97aca76d60be86c15daa533b2cdfbe1a74d3 From e7e5b881c0b341a99f01eee092d9f39c927199c4 Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Tue, 4 Jul 2023 18:30:08 +0200 Subject: [PATCH 16/16] Update Changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0db2f8..456b7b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +## [11.4.0] - 2023-07-04 + ### Created - Add a SwiftUI Font provider in `DynamicFont`