From 4fa6d28dd4c5ace8a1e107a1401881200303e0de Mon Sep 17 00:00:00 2001 From: Nick Entin Date: Mon, 27 May 2024 23:34:41 -0700 Subject: [PATCH 1/8] Update bundler & cocoapods --- Example/Gemfile.lock | 36 +++++++++++++++++++++--------------- Example/Podfile.lock | 2 +- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/Example/Gemfile.lock b/Example/Gemfile.lock index 3115da4..be7d53f 100644 --- a/Example/Gemfile.lock +++ b/Example/Gemfile.lock @@ -1,9 +1,14 @@ +GEM + specs: + GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.6) + CFPropertyList (3.0.7) + base64 + nkf rexml - activesupport (7.1.3) + activesupport (7.1.3.3) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) @@ -20,12 +25,12 @@ GEM json (>= 1.5.1) atomos (0.1.3) base64 (0.2.0) - bigdecimal (3.1.6) + bigdecimal (3.1.8) claide (1.1.0) - cocoapods (1.14.3) + cocoapods (1.15.2) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.14.3) + cocoapods-core (= 1.15.2) cocoapods-deintegrate (>= 1.0.3, < 2.0) cocoapods-downloader (>= 2.1, < 3.0) cocoapods-plugins (>= 1.0.0, < 2.0) @@ -40,7 +45,7 @@ GEM nap (~> 1.0) ruby-macho (>= 2.3.0, < 3.0) xcodeproj (>= 1.23.0, < 2.0) - cocoapods-core (1.14.3) + cocoapods-core (1.15.2) activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) @@ -62,8 +67,7 @@ GEM colored2 (3.1.2) concurrent-ruby (1.2.3) connection_pool (2.4.1) - drb (2.2.0) - ruby2_keywords + drb (2.2.1) escape (0.0.4) ethon (0.16.0) ffi (>= 1.15.0) @@ -72,24 +76,26 @@ GEM fuzzy_match (2.0.4) gh_inspector (1.1.3) httpclient (2.8.3) - i18n (1.14.1) + i18n (1.14.5) concurrent-ruby (~> 1.0) - json (2.7.1) - minitest (5.21.2) + json (2.7.2) + minitest (5.23.1) molinillo (0.8.0) mutex_m (0.2.0) nanaimo (0.3.0) nap (1.1.0) netrc (0.11.0) + nkf (0.2.0) public_suffix (4.0.7) - rexml (3.2.6) + rexml (3.2.8) + strscan (>= 3.0.9) ruby-macho (2.5.1) - ruby2_keywords (0.0.5) + strscan (3.1.0) typhoeus (1.4.1) ethon (>= 0.9.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - xcodeproj (1.23.0) + xcodeproj (1.24.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) @@ -104,4 +110,4 @@ DEPENDENCIES cocoapods (~> 1.14)! BUNDLED WITH - 2.1.4 + 2.5.10 diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 1df14d7..20e2111 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -38,4 +38,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: b4841bd82e57283ff97d83f4bb89137cc01f6102 -COCOAPODS: 1.11.3 +COCOAPODS: 1.15.2 From 8ec2b6874135788648b9d6534b692009ea481b8a Mon Sep 17 00:00:00 2001 From: Nick Entin Date: Mon, 27 May 2024 23:35:35 -0700 Subject: [PATCH 2/8] Enable strict concurrency checking --- Example/Stagehand.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Example/Stagehand.xcodeproj/project.pbxproj b/Example/Stagehand.xcodeproj/project.pbxproj index a6af047..65b0cda 100644 --- a/Example/Stagehand.xcodeproj/project.pbxproj +++ b/Example/Stagehand.xcodeproj/project.pbxproj @@ -810,6 +810,7 @@ ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_STRICT_CONCURRENCY = complete; }; name = Debug; }; @@ -858,6 +859,7 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_STRICT_CONCURRENCY = complete; VALIDATE_PRODUCT = YES; }; name = Release; From 0ca33fedc76ad00efda50c63e697aa312ef868d1 Mon Sep 17 00:00:00 2001 From: Nick Entin Date: Mon, 27 May 2024 23:45:26 -0700 Subject: [PATCH 3/8] Make the compiler happy --- Example/Stagehand/AnimationFactory.swift | 1 + Sources/Stagehand/Animation/Animation.swift | 3 ++- Sources/Stagehand/AnimationCurve/AnimationCurve.swift | 2 +- Sources/Stagehand/AnimationGroup.swift | 1 + Sources/Stagehand/AnimationInstance/AnimationInstance.swift | 1 + Sources/Stagehand/AnimationInstance/Executor.swift | 1 + Sources/Stagehand/AnimationInstance/Renderer.swift | 2 ++ Sources/Stagehand/AnimationQueue.swift | 1 + 8 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Example/Stagehand/AnimationFactory.swift b/Example/Stagehand/AnimationFactory.swift index dc790a8..9bbf5d9 100644 --- a/Example/Stagehand/AnimationFactory.swift +++ b/Example/Stagehand/AnimationFactory.swift @@ -16,6 +16,7 @@ import Stagehand +@MainActor enum AnimationFactory { static func makeFadeOutAnimation() -> Animation { diff --git a/Sources/Stagehand/Animation/Animation.swift b/Sources/Stagehand/Animation/Animation.swift index ac8a3ab..063ef7b 100644 --- a/Sources/Stagehand/Animation/Animation.swift +++ b/Sources/Stagehand/Animation/Animation.swift @@ -34,6 +34,7 @@ import UIKit /// /// Animations are composable. Complex animations can be composed of smaller logical pieces by constructing a hierarchy /// of child animations. +@MainActor public struct Animation { // MARK: - Public Types @@ -518,7 +519,7 @@ public struct Animation { // MARK: - -public enum AnimationRepeatStyle: Equatable { +public enum AnimationRepeatStyle: Equatable, Sendable { /// Animation will execute `count` times. /// diff --git a/Sources/Stagehand/AnimationCurve/AnimationCurve.swift b/Sources/Stagehand/AnimationCurve/AnimationCurve.swift index 40be200..416dc88 100644 --- a/Sources/Stagehand/AnimationCurve/AnimationCurve.swift +++ b/Sources/Stagehand/AnimationCurve/AnimationCurve.swift @@ -23,7 +23,7 @@ import Foundation /// The domain of the function is strictly bounded to `[0,1]`. The range of the function is technically unbounded, but /// in most cases will also be `[0,1]`. In any case, the function should be defined such that `f(0) = 0` and `f(1) = 1`; /// otherwise the animation will not end on the specified final keyframes. -public protocol AnimationCurve { +public protocol AnimationCurve: Sendable { func adjustedProgress(for progress: Double) -> Double diff --git a/Sources/Stagehand/AnimationGroup.swift b/Sources/Stagehand/AnimationGroup.swift index f89c8ac..e239a3e 100644 --- a/Sources/Stagehand/AnimationGroup.swift +++ b/Sources/Stagehand/AnimationGroup.swift @@ -26,6 +26,7 @@ import Foundation /// Unlike normal animations, animation groups hold a strong reference to each of the elements they animate. This means /// that the animation group must be cancelled manually when all other strong references to the elements are removed if /// the elements should be deallocated. +@MainActor public struct AnimationGroup { // MARK: - Life Cycle diff --git a/Sources/Stagehand/AnimationInstance/AnimationInstance.swift b/Sources/Stagehand/AnimationInstance/AnimationInstance.swift index dd75923..2e13d0c 100644 --- a/Sources/Stagehand/AnimationInstance/AnimationInstance.swift +++ b/Sources/Stagehand/AnimationInstance/AnimationInstance.swift @@ -22,6 +22,7 @@ import Foundation /// `perform(on:delay:duration:repeatStyle:completion:)` method to begin the animation. That method will return an /// instance of this class. The `AnimationInstance` can then be used to track the `status` of the animation, or to /// cancel it. +@MainActor public final class AnimationInstance { // MARK: - Life Cycle diff --git a/Sources/Stagehand/AnimationInstance/Executor.swift b/Sources/Stagehand/AnimationInstance/Executor.swift index 1a4a8f4..4236391 100644 --- a/Sources/Stagehand/AnimationInstance/Executor.swift +++ b/Sources/Stagehand/AnimationInstance/Executor.swift @@ -16,6 +16,7 @@ import Foundation +@MainActor internal final class Executor { // MARK: - Life Cycle diff --git a/Sources/Stagehand/AnimationInstance/Renderer.swift b/Sources/Stagehand/AnimationInstance/Renderer.swift index a86b75a..3b31733 100644 --- a/Sources/Stagehand/AnimationInstance/Renderer.swift +++ b/Sources/Stagehand/AnimationInstance/Renderer.swift @@ -16,6 +16,7 @@ import Foundation +@MainActor internal final class Renderer: AnyRenderer { // MARK: - Life Cycle @@ -70,6 +71,7 @@ internal final class Renderer: AnyRenderer { // MARK: - +@MainActor internal protocol AnyRenderer { func canRenderFrame() -> Bool diff --git a/Sources/Stagehand/AnimationQueue.swift b/Sources/Stagehand/AnimationQueue.swift index 0a86fff..e035bf6 100644 --- a/Sources/Stagehand/AnimationQueue.swift +++ b/Sources/Stagehand/AnimationQueue.swift @@ -17,6 +17,7 @@ import Foundation /// An `AnimationQueue` is a container for a set of animations that should be executed in sequence. +@MainActor public final class AnimationQueue { // MARK: - Life Cycle From 97578d92b19a223489c34adace5bf418c535a4a2 Mon Sep 17 00:00:00 2001 From: Nick Entin Date: Mon, 27 May 2024 23:51:10 -0700 Subject: [PATCH 4/8] Update project settings --- Example/Stagehand.xcodeproj/project.pbxproj | 49 +++++++++++++++---- .../xcschemes/Stagehand Demo App.xcscheme | 38 +++++++------- 2 files changed, 57 insertions(+), 30 deletions(-) diff --git a/Example/Stagehand.xcodeproj/project.pbxproj b/Example/Stagehand.xcodeproj/project.pbxproj index 65b0cda..2bb7d10 100644 --- a/Example/Stagehand.xcodeproj/project.pbxproj +++ b/Example/Stagehand.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -430,8 +430,9 @@ 607FACC81AFB9204008FA782 /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1020; - LastUpgradeCheck = 1020; + LastUpgradeCheck = 1540; ORGANIZATIONNAME = CocoaPods; TargetAttributes = { 3D32EF3B23404F6A001144B3 = { @@ -553,6 +554,7 @@ }; 7AC1DD361DEB9F88378EFA0A /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -720,7 +722,11 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "Performance Tests/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 12.2; - 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 = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.squareup.Stagehand-PerformanceTests"; @@ -747,7 +753,11 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "Performance Tests/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 12.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.squareup.Stagehand-PerformanceTests"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -761,6 +771,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -780,6 +791,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -790,6 +802,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -818,6 +831,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -837,6 +851,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -847,6 +862,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -858,7 +874,8 @@ IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_STRICT_CONCURRENCY = complete; VALIDATE_PRODUCT = YES; }; @@ -872,7 +889,10 @@ DEVELOPMENT_TEAM = 6385SJ58J2; INFOPLIST_FILE = Stagehand/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); MODULE_NAME = ExampleApp; PRODUCT_BUNDLE_IDENTIFIER = com.squareup.StagehandDemo; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -888,7 +908,10 @@ DEVELOPMENT_TEAM = 6385SJ58J2; INFOPLIST_FILE = Stagehand/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); MODULE_NAME = ExampleApp; PRODUCT_BUNDLE_IDENTIFIER = com.squareup.StagehandDemo; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -910,7 +933,11 @@ "$(inherited)", ); INFOPLIST_FILE = "Unit Tests/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -928,7 +955,11 @@ "$(inherited)", ); INFOPLIST_FILE = "Unit Tests/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; diff --git a/Example/Stagehand.xcodeproj/xcshareddata/xcschemes/Stagehand Demo App.xcscheme b/Example/Stagehand.xcodeproj/xcshareddata/xcschemes/Stagehand Demo App.xcscheme index 09b9bde..c6e1093 100644 --- a/Example/Stagehand.xcodeproj/xcshareddata/xcschemes/Stagehand Demo App.xcscheme +++ b/Example/Stagehand.xcodeproj/xcshareddata/xcschemes/Stagehand Demo App.xcscheme @@ -1,6 +1,6 @@ + + + + + + + + @@ -63,24 +79,6 @@ - - - - - - - - - - - - Date: Tue, 28 May 2024 00:14:39 -0700 Subject: [PATCH 5/8] Update CI and bump tests to iOS 17 --- .github/workflows/ci.yml | 40 ++++++++++-------- ...icBezierEaseInEaseOut_17_5_375x812@3x.png} | Bin ...testCubicBezierEaseIn_17_5_375x812@3x.png} | Bin ...estCubicBezierEaseOut_17_5_375x812@3x.png} | Bin ...tCubicBezierOvershoot_17_5_375x812@3x.png} | Bin ...@3x.png => testLinear_17_5_375x812@3x.png} | Bin ...> testParabolicEaseIn_17_5_375x812@3x.png} | Bin ... testParabolicEaseOut_17_5_375x812@3x.png} | Bin ...nusoidalEaseInEaseOut_17_5_375x812@3x.png} | Bin ...ionBlocksSnapshotAPNG_17_5_375x812@3x.png} | Bin ...ionBlocksSnapshot_end_17_5_375x812@3x.png} | Bin ...BlocksSnapshot_middle_17_5_375x812@3x.png} | Bin ...nBlocksSnapshot_start_17_5_375x812@3x.png} | Bin ...ewElementSnapshotAPNG_17_5_375x812@3x.png} | Bin ...ewElementSnapshot_end_17_5_375x812@3x.png} | Bin ...lementSnapshot_middle_17_5_375x812@3x.png} | Bin ...ElementSnapshot_start_17_5_375x812@3x.png} | Bin ...thPartialTransparency_17_5_375x812@3x.png} | Bin ...AnimationSnapshotAPNG_17_5_375x812@3x.png} | Bin ...ionBlocksSnapshotAPNG_17_5_375x812@3x.png} | Bin ...AnimationSnapshotAPNG_17_5_375x812@3x.png} | Bin ...SnapshotAPNGAtHighFPS_17_5_375x812@3x.png} | Bin ...AnimationSnapshotAPNG_17_5_375x812@3x.png} | Bin ...AnimationSnapshot_end_17_5_375x812@3x.png} | Bin ...mationSnapshot_middle_17_5_375x812@3x.png} | Bin ...imationSnapshot_start_17_5_375x812@3x.png} | Bin ...ng => testPerspective_17_5_375x812@3x.png} | Bin ...otationAcrossBoundary_17_5_375x812@3x.png} | Bin ...x.png => testRotation_17_5_375x812@3x.png} | Bin ...tationWithPerspective_17_5_375x812@3x.png} | Bin ... testScaleAndRotation_17_5_375x812@3x.png} | Bin ...2@3x.png => testScale_17_5_375x812@3x.png} | Bin ...2@3x.png => testShear_17_5_375x812@3x.png} | Bin ....png => testZeroScale_17_5_375x812@3x.png} | Bin ...caleResultsInRotation_17_5_375x812@3x.png} | Bin ...tipleFactorTransforms_17_5_375x812@3x.png} | Bin ...x.png => testRotation_17_5_375x812@3x.png} | Bin ...2@3x.png => testScale_17_5_375x812@3x.png} | Bin ... testSkewedTransforms_17_5_375x812@3x.png} | Bin ...atingSkewedTransforms_17_5_375x812@3x.png} | Bin ...ng => testTranslation_17_5_375x812@3x.png} | Bin ...nimationGroupSnapshot.375x812-17-5-3x.png} | Bin ...onGroupSnapshot.start-375x812-17-5-3x.png} | Bin ...ithRepeatingAnimation.375x812-17-5-3x.png} | Bin ...onViewElementSnapshot.375x812-17-5-3x.png} | Bin ...ElementSnapshot.start-375x812-17-5-3x.png} | Bin ...mpleAnimationSnapshot.375x812-17-5-3x.png} | Bin ...imationSnapshot.start-375x812-17-5-3x.png} | Bin ...tionGroupSnapshot.end-375x812-17-5-3x.png} | Bin ...nGroupSnapshot.middle-375x812-17-5-3x.png} | Bin ...onGroupSnapshot.start-375x812-17-5-3x.png} | Bin ...ewElementSnapshot.end-375x812-17-5-3x.png} | Bin ...lementSnapshot.middle-375x812-17-5-3x.png} | Bin ...ElementSnapshot.start-375x812-17-5-3x.png} | Bin ...AnimationSnapshot.end-375x812-17-5-3x.png} | Bin ...mationSnapshot.middle-375x812-17-5-3x.png} | Bin ...imationSnapshot.start-375x812-17-5-3x.png} | Bin Scripts/build.swift | 6 +-- Scripts/github/prepare-simulators.sh | 11 ----- 59 files changed, 25 insertions(+), 32 deletions(-) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/{testCubicBezierEaseInEaseOut_13_7_375x812@3x.png => testCubicBezierEaseInEaseOut_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/{testCubicBezierEaseIn_13_7_375x812@3x.png => testCubicBezierEaseIn_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/{testCubicBezierEaseOut_13_7_375x812@3x.png => testCubicBezierEaseOut_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/{testCubicBezierOvershoot_13_7_375x812@3x.png => testCubicBezierOvershoot_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/{testLinear_13_7_375x812@3x.png => testLinear_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/{testParabolicEaseIn_13_7_375x812@3x.png => testParabolicEaseIn_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/{testParabolicEaseOut_13_7_375x812@3x.png => testParabolicEaseOut_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/{testSinusoidalEaseInEaseOut_13_7_375x812@3x.png => testSinusoidalEaseInEaseOut_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/{testAnimationWithExecutionBlocksSnapshotAPNG_13_7_375x812@3x.png => testAnimationWithExecutionBlocksSnapshotAPNG_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/{testAnimationWithExecutionBlocksSnapshot_end_13_7_375x812@3x.png => testAnimationWithExecutionBlocksSnapshot_end_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/{testAnimationWithExecutionBlocksSnapshot_middle_13_7_375x812@3x.png => testAnimationWithExecutionBlocksSnapshot_middle_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/{testAnimationWithExecutionBlocksSnapshot_start_13_7_375x812@3x.png => testAnimationWithExecutionBlocksSnapshot_start_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/{testAnimationWithNonViewElementSnapshotAPNG_13_7_375x812@3x.png => testAnimationWithNonViewElementSnapshotAPNG_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/{testAnimationWithNonViewElementSnapshot_end_13_7_375x812@3x.png => testAnimationWithNonViewElementSnapshot_end_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/{testAnimationWithNonViewElementSnapshot_middle_13_7_375x812@3x.png => testAnimationWithNonViewElementSnapshot_middle_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/{testAnimationWithNonViewElementSnapshot_start_13_7_375x812@3x.png => testAnimationWithNonViewElementSnapshot_start_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/{testAnimationWithPartialTransparency_13_7_375x812@3x.png => testAnimationWithPartialTransparency_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/{testAutoreversingAnimationSnapshotAPNG_13_7_375x812@3x.png => testAutoreversingAnimationSnapshotAPNG_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/{testAutoreversingAnimationWithExecutionBlocksSnapshotAPNG_13_7_375x812@3x.png => testAutoreversingAnimationWithExecutionBlocksSnapshotAPNG_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/{testLongAnimationSnapshotAPNG_13_7_375x812@3x.png => testLongAnimationSnapshotAPNG_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/{testSimpleAnimationSnapshotAPNGAtHighFPS_13_7_375x812@3x.png => testSimpleAnimationSnapshotAPNGAtHighFPS_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/{testSimpleAnimationSnapshotAPNG_13_7_375x812@3x.png => testSimpleAnimationSnapshotAPNG_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/{testSimpleAnimationSnapshot_end_13_7_375x812@3x.png => testSimpleAnimationSnapshot_end_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/{testSimpleAnimationSnapshot_middle_13_7_375x812@3x.png => testSimpleAnimationSnapshot_middle_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/{testSimpleAnimationSnapshot_start_13_7_375x812@3x.png => testSimpleAnimationSnapshot_start_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/{testPerspective_13_7_375x812@3x.png => testPerspective_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/{testRotationAcrossBoundary_13_7_375x812@3x.png => testRotationAcrossBoundary_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/{testRotation_13_7_375x812@3x.png => testRotation_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/{testScaleAndRotationWithPerspective_13_7_375x812@3x.png => testScaleAndRotationWithPerspective_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/{testScaleAndRotation_13_7_375x812@3x.png => testScaleAndRotation_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/{testScale_13_7_375x812@3x.png => testScale_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/{testShear_13_7_375x812@3x.png => testShear_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/{testZeroScale_13_7_375x812@3x.png => testZeroScale_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/{testFlippedScaleResultsInRotation_13_7_375x812@3x.png => testFlippedScaleResultsInRotation_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/{testMultipleFactorTransforms_13_7_375x812@3x.png => testMultipleFactorTransforms_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/{testRotation_13_7_375x812@3x.png => testRotation_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/{testScale_13_7_375x812@3x.png => testScale_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/{testSkewedTransforms_13_7_375x812@3x.png => testSkewedTransforms_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/{testTranslatingSkewedTransforms_13_7_375x812@3x.png => testTranslatingSkewedTransforms_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/{testTranslation_13_7_375x812@3x.png => testTranslation_17_5_375x812@3x.png} (100%) rename Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/{testAnimationGroupSnapshot.375x812-13-7-3x.png => testAnimationGroupSnapshot.375x812-17-5-3x.png} (100%) rename Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/{testAnimationGroupSnapshot.start-375x812-13-7-3x.png => testAnimationGroupSnapshot.start-375x812-17-5-3x.png} (100%) rename Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/{testAnimationSnapshotWithRepeatingAnimation.375x812-13-7-3x.png => testAnimationSnapshotWithRepeatingAnimation.375x812-17-5-3x.png} (100%) rename Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/{testAnimationWithNonViewElementSnapshot.375x812-13-7-3x.png => testAnimationWithNonViewElementSnapshot.375x812-17-5-3x.png} (100%) rename Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/{testAnimationWithNonViewElementSnapshot.start-375x812-13-7-3x.png => testAnimationWithNonViewElementSnapshot.start-375x812-17-5-3x.png} (100%) rename Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/{testSimpleAnimationSnapshot.375x812-13-7-3x.png => testSimpleAnimationSnapshot.375x812-17-5-3x.png} (100%) rename Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/{testSimpleAnimationSnapshot.start-375x812-13-7-3x.png => testSimpleAnimationSnapshot.start-375x812-17-5-3x.png} (100%) rename Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/{testAnimationGroupSnapshot.end-375x812-13-7-3x.png => testAnimationGroupSnapshot.end-375x812-17-5-3x.png} (100%) rename Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/{testAnimationGroupSnapshot.middle-375x812-13-7-3x.png => testAnimationGroupSnapshot.middle-375x812-17-5-3x.png} (100%) rename Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/{testAnimationGroupSnapshot.start-375x812-13-7-3x.png => testAnimationGroupSnapshot.start-375x812-17-5-3x.png} (100%) rename Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/{testAnimationWithNonViewElementSnapshot.end-375x812-13-7-3x.png => testAnimationWithNonViewElementSnapshot.end-375x812-17-5-3x.png} (100%) rename Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/{testAnimationWithNonViewElementSnapshot.middle-375x812-13-7-3x.png => testAnimationWithNonViewElementSnapshot.middle-375x812-17-5-3x.png} (100%) rename Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/{testAnimationWithNonViewElementSnapshot.start-375x812-13-7-3x.png => testAnimationWithNonViewElementSnapshot.start-375x812-17-5-3x.png} (100%) rename Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/{testSimpleAnimationSnapshot.end-375x812-13-7-3x.png => testSimpleAnimationSnapshot.end-375x812-17-5-3x.png} (100%) rename Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/{testSimpleAnimationSnapshot.middle-375x812-13-7-3x.png => testSimpleAnimationSnapshot.middle-375x812-17-5-3x.png} (100%) rename Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/{testSimpleAnimationSnapshot.start-375x812-13-7-3x.png => testSimpleAnimationSnapshot.start-375x812-17-5-3x.png} (100%) delete mode 100755 Scripts/github/prepare-simulators.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ad589ac..054e733 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,34 +9,36 @@ on: jobs: xcode-build: name: Xcode Build - runs-on: macOS-11 + runs-on: macOS-14 strategy: matrix: - platform: ['iOS_13'] + platform: ['iOS_17'] fail-fast: false steps: - name: Checkout Repo - uses: actions/checkout@v2 + uses: actions/checkout@v4 + - name: Select Xcode Version + run: sudo xcode-select --switch /Applications/Xcode_15.4.app/Contents/Developer - name: Bundle Install run: bundle install --gemfile=Example/Gemfile - - name: Prepare Simulator Runtimes - run: Scripts/github/prepare-simulators.sh ${{ matrix.platform }} - name: Pod Install run: bundle exec --gemfile=Example/Gemfile pod install --project-directory=Example - name: Build and Test run: Scripts/build.swift xcode ${{ matrix.platform }} `which xcpretty` - name: Upload Results - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 if: failure() with: name: Test Results path: .build/derivedData/**/Logs/Test/*.xcresult pod-lint: name: Pod Lint - runs-on: macOS-11 + runs-on: macOS-14 steps: - name: Checkout Repo - uses: actions/checkout@v2 + uses: actions/checkout@v4 + - name: Select Xcode Version + run: sudo xcode-select --switch /Applications/Xcode_15.4.app/Contents/Developer - name: Bundle Install run: bundle install --gemfile=Example/Gemfile - name: Pod Install @@ -47,23 +49,25 @@ jobs: run: bundle exec --gemfile=Example/Gemfile pod lib lint --verbose --fail-fast --include-podspecs=Stagehand.podspec StagehandTesting.podspec spm: name: SPM Build - runs-on: macOS-11 + runs-on: macOS-14 strategy: matrix: - platform: ['iOS_13'] + platform: ['iOS_17'] fail-fast: false steps: - name: Checkout Repo - uses: actions/checkout@v2 - - name: Prepare Simulator Runtimes - run: Scripts/github/prepare-simulators.sh ${{ matrix.platform }} + uses: actions/checkout@v4 + - name: Select Xcode Version + run: sudo xcode-select --switch /Applications/Xcode_15.4.app/Contents/Developer - name: Build run: Scripts/build.swift spm ${{ matrix.platform }} bazel: name: Bazel - runs-on: macOS-13 + runs-on: macOS-14 steps: - - name: Checkout Repo - uses: actions/checkout@v2 - - name: Build - run: bazel build //... + - name: Checkout Repo + uses: actions/checkout@v4 + - name: Select Xcode Version + run: sudo xcode-select --switch /Applications/Xcode_15.4.app/Contents/Developer + - name: Build + run: bazel build //... diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testCubicBezierEaseInEaseOut_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testCubicBezierEaseInEaseOut_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testCubicBezierEaseInEaseOut_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testCubicBezierEaseInEaseOut_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testCubicBezierEaseIn_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testCubicBezierEaseIn_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testCubicBezierEaseIn_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testCubicBezierEaseIn_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testCubicBezierEaseOut_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testCubicBezierEaseOut_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testCubicBezierEaseOut_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testCubicBezierEaseOut_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testCubicBezierOvershoot_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testCubicBezierOvershoot_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testCubicBezierOvershoot_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testCubicBezierOvershoot_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testLinear_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testLinear_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testLinear_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testLinear_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testParabolicEaseIn_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testParabolicEaseIn_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testParabolicEaseIn_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testParabolicEaseIn_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testParabolicEaseOut_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testParabolicEaseOut_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testParabolicEaseOut_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testParabolicEaseOut_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testSinusoidalEaseInEaseOut_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testSinusoidalEaseInEaseOut_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testSinusoidalEaseInEaseOut_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationCurveSnapshotTests/testSinusoidalEaseInEaseOut_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithExecutionBlocksSnapshotAPNG_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithExecutionBlocksSnapshotAPNG_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithExecutionBlocksSnapshotAPNG_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithExecutionBlocksSnapshotAPNG_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithExecutionBlocksSnapshot_end_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithExecutionBlocksSnapshot_end_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithExecutionBlocksSnapshot_end_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithExecutionBlocksSnapshot_end_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithExecutionBlocksSnapshot_middle_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithExecutionBlocksSnapshot_middle_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithExecutionBlocksSnapshot_middle_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithExecutionBlocksSnapshot_middle_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithExecutionBlocksSnapshot_start_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithExecutionBlocksSnapshot_start_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithExecutionBlocksSnapshot_start_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithExecutionBlocksSnapshot_start_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithNonViewElementSnapshotAPNG_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithNonViewElementSnapshotAPNG_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithNonViewElementSnapshotAPNG_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithNonViewElementSnapshotAPNG_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithNonViewElementSnapshot_end_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithNonViewElementSnapshot_end_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithNonViewElementSnapshot_end_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithNonViewElementSnapshot_end_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithNonViewElementSnapshot_middle_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithNonViewElementSnapshot_middle_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithNonViewElementSnapshot_middle_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithNonViewElementSnapshot_middle_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithNonViewElementSnapshot_start_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithNonViewElementSnapshot_start_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithNonViewElementSnapshot_start_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithNonViewElementSnapshot_start_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithPartialTransparency_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithPartialTransparency_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithPartialTransparency_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAnimationWithPartialTransparency_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAutoreversingAnimationSnapshotAPNG_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAutoreversingAnimationSnapshotAPNG_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAutoreversingAnimationSnapshotAPNG_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAutoreversingAnimationSnapshotAPNG_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAutoreversingAnimationWithExecutionBlocksSnapshotAPNG_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAutoreversingAnimationWithExecutionBlocksSnapshotAPNG_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAutoreversingAnimationWithExecutionBlocksSnapshotAPNG_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testAutoreversingAnimationWithExecutionBlocksSnapshotAPNG_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testLongAnimationSnapshotAPNG_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testLongAnimationSnapshotAPNG_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testLongAnimationSnapshotAPNG_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testLongAnimationSnapshotAPNG_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshotAPNGAtHighFPS_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshotAPNGAtHighFPS_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshotAPNGAtHighFPS_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshotAPNGAtHighFPS_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshotAPNG_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshotAPNG_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshotAPNG_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshotAPNG_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshot_end_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshot_end_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshot_end_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshot_end_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshot_middle_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshot_middle_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshot_middle_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshot_middle_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshot_start_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshot_start_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshot_start_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.AnimationSnapshotTests/testSimpleAnimationSnapshot_start_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testPerspective_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testPerspective_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testPerspective_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testPerspective_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testRotationAcrossBoundary_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testRotationAcrossBoundary_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testRotationAcrossBoundary_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testRotationAcrossBoundary_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testRotation_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testRotation_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testRotation_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testRotation_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testScaleAndRotationWithPerspective_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testScaleAndRotationWithPerspective_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testScaleAndRotationWithPerspective_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testScaleAndRotationWithPerspective_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testScaleAndRotation_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testScaleAndRotation_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testScaleAndRotation_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testScaleAndRotation_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testScale_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testScale_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testScale_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testScale_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testShear_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testShear_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testShear_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testShear_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testZeroScale_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testZeroScale_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testZeroScale_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CATransform3DInterpolationSnapshotTests/testZeroScale_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testFlippedScaleResultsInRotation_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testFlippedScaleResultsInRotation_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testFlippedScaleResultsInRotation_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testFlippedScaleResultsInRotation_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testMultipleFactorTransforms_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testMultipleFactorTransforms_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testMultipleFactorTransforms_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testMultipleFactorTransforms_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testRotation_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testRotation_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testRotation_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testRotation_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testScale_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testScale_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testScale_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testScale_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testSkewedTransforms_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testSkewedTransforms_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testSkewedTransforms_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testSkewedTransforms_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testTranslatingSkewedTransforms_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testTranslatingSkewedTransforms_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testTranslatingSkewedTransforms_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testTranslatingSkewedTransforms_17_5_375x812@3x.png diff --git a/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testTranslation_13_7_375x812@3x.png b/Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testTranslation_17_5_375x812@3x.png similarity index 100% rename from Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testTranslation_13_7_375x812@3x.png rename to Example/Unit Tests/ReferenceImages/_64/Stagehand_UnitTests.CGAffineTransformInterpolationSnapshotTests/testTranslation_17_5_375x812@3x.png diff --git a/Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationGroupSnapshot.375x812-13-7-3x.png b/Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationGroupSnapshot.375x812-17-5-3x.png similarity index 100% rename from Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationGroupSnapshot.375x812-13-7-3x.png rename to Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationGroupSnapshot.375x812-17-5-3x.png diff --git a/Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationGroupSnapshot.start-375x812-13-7-3x.png b/Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationGroupSnapshot.start-375x812-17-5-3x.png similarity index 100% rename from Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationGroupSnapshot.start-375x812-13-7-3x.png rename to Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationGroupSnapshot.start-375x812-17-5-3x.png diff --git a/Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationSnapshotWithRepeatingAnimation.375x812-13-7-3x.png b/Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationSnapshotWithRepeatingAnimation.375x812-17-5-3x.png similarity index 100% rename from Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationSnapshotWithRepeatingAnimation.375x812-13-7-3x.png rename to Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationSnapshotWithRepeatingAnimation.375x812-17-5-3x.png diff --git a/Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationWithNonViewElementSnapshot.375x812-13-7-3x.png b/Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationWithNonViewElementSnapshot.375x812-17-5-3x.png similarity index 100% rename from Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationWithNonViewElementSnapshot.375x812-13-7-3x.png rename to Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationWithNonViewElementSnapshot.375x812-17-5-3x.png diff --git a/Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationWithNonViewElementSnapshot.start-375x812-13-7-3x.png b/Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationWithNonViewElementSnapshot.start-375x812-17-5-3x.png similarity index 100% rename from Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationWithNonViewElementSnapshot.start-375x812-13-7-3x.png rename to Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testAnimationWithNonViewElementSnapshot.start-375x812-17-5-3x.png diff --git a/Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testSimpleAnimationSnapshot.375x812-13-7-3x.png b/Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testSimpleAnimationSnapshot.375x812-17-5-3x.png similarity index 100% rename from Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testSimpleAnimationSnapshot.375x812-13-7-3x.png rename to Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testSimpleAnimationSnapshot.375x812-17-5-3x.png diff --git a/Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testSimpleAnimationSnapshot.start-375x812-13-7-3x.png b/Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testSimpleAnimationSnapshot.start-375x812-17-5-3x.png similarity index 100% rename from Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testSimpleAnimationSnapshot.start-375x812-13-7-3x.png rename to Example/Unit Tests/__Snapshots__/SnapshotTestingAPNGImageTests/testSimpleAnimationSnapshot.start-375x812-17-5-3x.png diff --git a/Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationGroupSnapshot.end-375x812-13-7-3x.png b/Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationGroupSnapshot.end-375x812-17-5-3x.png similarity index 100% rename from Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationGroupSnapshot.end-375x812-13-7-3x.png rename to Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationGroupSnapshot.end-375x812-17-5-3x.png diff --git a/Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationGroupSnapshot.middle-375x812-13-7-3x.png b/Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationGroupSnapshot.middle-375x812-17-5-3x.png similarity index 100% rename from Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationGroupSnapshot.middle-375x812-13-7-3x.png rename to Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationGroupSnapshot.middle-375x812-17-5-3x.png diff --git a/Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationGroupSnapshot.start-375x812-13-7-3x.png b/Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationGroupSnapshot.start-375x812-17-5-3x.png similarity index 100% rename from Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationGroupSnapshot.start-375x812-13-7-3x.png rename to Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationGroupSnapshot.start-375x812-17-5-3x.png diff --git a/Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationWithNonViewElementSnapshot.end-375x812-13-7-3x.png b/Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationWithNonViewElementSnapshot.end-375x812-17-5-3x.png similarity index 100% rename from Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationWithNonViewElementSnapshot.end-375x812-13-7-3x.png rename to Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationWithNonViewElementSnapshot.end-375x812-17-5-3x.png diff --git a/Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationWithNonViewElementSnapshot.middle-375x812-13-7-3x.png b/Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationWithNonViewElementSnapshot.middle-375x812-17-5-3x.png similarity index 100% rename from Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationWithNonViewElementSnapshot.middle-375x812-13-7-3x.png rename to Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationWithNonViewElementSnapshot.middle-375x812-17-5-3x.png diff --git a/Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationWithNonViewElementSnapshot.start-375x812-13-7-3x.png b/Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationWithNonViewElementSnapshot.start-375x812-17-5-3x.png similarity index 100% rename from Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationWithNonViewElementSnapshot.start-375x812-13-7-3x.png rename to Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testAnimationWithNonViewElementSnapshot.start-375x812-17-5-3x.png diff --git a/Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testSimpleAnimationSnapshot.end-375x812-13-7-3x.png b/Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testSimpleAnimationSnapshot.end-375x812-17-5-3x.png similarity index 100% rename from Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testSimpleAnimationSnapshot.end-375x812-13-7-3x.png rename to Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testSimpleAnimationSnapshot.end-375x812-17-5-3x.png diff --git a/Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testSimpleAnimationSnapshot.middle-375x812-13-7-3x.png b/Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testSimpleAnimationSnapshot.middle-375x812-17-5-3x.png similarity index 100% rename from Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testSimpleAnimationSnapshot.middle-375x812-13-7-3x.png rename to Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testSimpleAnimationSnapshot.middle-375x812-17-5-3x.png diff --git a/Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testSimpleAnimationSnapshot.start-375x812-13-7-3x.png b/Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testSimpleAnimationSnapshot.start-375x812-17-5-3x.png similarity index 100% rename from Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testSimpleAnimationSnapshot.start-375x812-13-7-3x.png rename to Example/Unit Tests/__Snapshots__/SnapshotTestingFrameImageTests/testSimpleAnimationSnapshot.start-375x812-17-5-3x.png diff --git a/Scripts/build.swift b/Scripts/build.swift index 6d3e767..12493bd 100755 --- a/Scripts/build.swift +++ b/Scripts/build.swift @@ -46,12 +46,12 @@ enum TaskError: Error { } enum Platform: String, CustomStringConvertible { - case iOS_13 + case iOS_17 var destination: String { switch self { - case .iOS_13: - return "platform=iOS Simulator,OS=13.7,name=iPhone 11 Pro" + case .iOS_17: + return "platform=iOS Simulator,OS=17.5,name=iPhone 15 Pro" } } diff --git a/Scripts/github/prepare-simulators.sh b/Scripts/github/prepare-simulators.sh deleted file mode 100755 index a5cbe0f..0000000 --- a/Scripts/github/prepare-simulators.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -l -set -ex -IFS=','; PLATFORMS=$(echo $1); unset IFS -sudo mkdir -p /Library/Developer/CoreSimulator/Profiles/Runtimes - -if [[ ${PLATFORMS[*]} =~ 'iOS_13' ]]; then - sudo ln -s /Applications/Xcode_11.3.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime /Library/Developer/CoreSimulator/Profiles/Runtimes/iOS\ 13.3.simruntime - sudo ln -s /Applications/Xcode_11.7.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime /Library/Developer/CoreSimulator/Profiles/Runtimes/iOS\ 13.7.simruntime -fi - -xcrun simctl list runtimes From 58a3da057bc76ce4eab41f2ab67b91e745ff6783 Mon Sep 17 00:00:00 2001 From: Nick Entin Date: Tue, 28 May 2024 00:28:41 -0700 Subject: [PATCH 6/8] Bump minimums to Xcode 15, iOS 13 --- BUILD.bazel | 4 ++-- Example/Podfile | 2 +- Example/Podfile.lock | 6 +++--- Example/Stagehand.xcodeproj/project.pbxproj | 12 ++++++------ Package.swift | 4 ++-- README.md | 6 ++++++ Stagehand.podspec | 4 ++-- StagehandTesting.podspec | 4 ++-- 8 files changed, 24 insertions(+), 18 deletions(-) diff --git a/BUILD.bazel b/BUILD.bazel index 2967554..0470fce 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -51,7 +51,7 @@ ios_framework( "ipad", ], infoplists = ["Sources/Info.plist"], - minimum_os_version = "12.0", + minimum_os_version = "13.0", visibility = ["//visibility:public"], deps = [":Stagehand.lib"], ) @@ -65,7 +65,7 @@ ios_framework( "ipad", ], infoplists = ["Sources/Info.plist"], - minimum_os_version = "12.0", + minimum_os_version = "13.0", visibility = ["//visibility:public"], deps = [":StagehandTesting_iOSSnapshotTestCase.lib"], ) diff --git a/Example/Podfile b/Example/Podfile index 05eab3d..0493bb1 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -1,6 +1,6 @@ use_frameworks! -platform :ios, '12.0' +platform :ios, '13.0' target 'Stagehand_Example' do pod 'Stagehand', :path => '../' diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 20e2111..20ee680 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -33,9 +33,9 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: iOSSnapshotTestCase: 9ab44cb5aa62b84d31847f40680112e15ec579a6 SnapshotTesting: 273b614fcc60fac7d9f613f6648afa91a7da36be - Stagehand: 29ee26a0690ebf90a5ea45e86fd88b865baf5403 - StagehandTesting: 3354a5300e7fc6d1ba9ab182762feff9e80cb6de + Stagehand: 3cc6e0a36737c538f96c031a383179e3fbaf9b1f + StagehandTesting: c526c5a9bbf3029aa11406cb03c96c1a2d324a6e -PODFILE CHECKSUM: b4841bd82e57283ff97d83f4bb89137cc01f6102 +PODFILE CHECKSUM: dc43166dcb2d2f51c6a438d235bb33ac985fdc72 COCOAPODS: 1.15.2 diff --git a/Example/Stagehand.xcodeproj/project.pbxproj b/Example/Stagehand.xcodeproj/project.pbxproj index 2bb7d10..50fa586 100644 --- a/Example/Stagehand.xcodeproj/project.pbxproj +++ b/Example/Stagehand.xcodeproj/project.pbxproj @@ -721,7 +721,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "Performance Tests/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.2; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -752,7 +752,7 @@ CODE_SIGN_STYLE = Automatic; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "Performance Tests/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.2; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -818,7 +818,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -871,7 +871,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; @@ -888,7 +888,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = 6385SJ58J2; INFOPLIST_FILE = Stagehand/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -907,7 +907,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = 6385SJ58J2; INFOPLIST_FILE = Stagehand/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/Package.swift b/Package.swift index 6a975f7..82b1d10 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.0.1 +// swift-tools-version:5.9 // // Copyright 2020 Square Inc. @@ -21,7 +21,7 @@ import PackageDescription let package = Package( name: "Stagehand", platforms: [ - .iOS(.v12), + .iOS(.v13), ], products: [ .library( diff --git a/README.md b/README.md index 61807fd..af36d5b 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,12 @@ open Stagehand.xcworkspace From here, you can run the demo app and see a variety of examples for how to use the framework. In that workspace, there is also a playground that includes documentation and tutorials for how each feature works. +## Requirements + +* iOS 13.0 or later +* Xcode 15.0 or later +* Swift 5.9 + ## Contributing We’re glad you’re interested in Stagehand, and we’d love to see where you take it. Please read our [contributing guidelines](CONTRIBUTING.md) prior to submitting a Pull Request. diff --git a/Stagehand.podspec b/Stagehand.podspec index 19cc212..99bd16a 100644 --- a/Stagehand.podspec +++ b/Stagehand.podspec @@ -7,9 +7,9 @@ Pod::Spec.new do |s| s.author = 'Square' s.source = { :git => 'https://github.com/CashApp/Stagehand.git', :tag => s.version.to_s } - s.ios.deployment_target = '12.0' + s.ios.deployment_target = '13.0' - s.swift_version = '5.0.1' + s.swift_version = '5.9' s.source_files = 'Sources/Stagehand/**/*' diff --git a/StagehandTesting.podspec b/StagehandTesting.podspec index 1d01015..19db6de 100644 --- a/StagehandTesting.podspec +++ b/StagehandTesting.podspec @@ -7,9 +7,9 @@ Pod::Spec.new do |s| s.author = 'Square' s.source = { :git => 'https://github.com/CashApp/Stagehand.git', :tag => s.version.to_s } - s.ios.deployment_target = '12.0' + s.ios.deployment_target = '13.0' - s.swift_version = '5.0.1' + s.swift_version = '5.9' # The dependency on Stagehand is pinned to the same version as StagehandTesting. This is because # StagehandTesting depends on internal methods inside Stagehand, so the normal rules of semantic From fee88a9a5990e5a7036c90e64cd29b7d50543e4c Mon Sep 17 00:00:00 2001 From: Nick Entin Date: Tue, 28 May 2024 01:04:04 -0700 Subject: [PATCH 7/8] Fix deprecated status bar --- Example/Stagehand/DemoViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Example/Stagehand/DemoViewController.swift b/Example/Stagehand/DemoViewController.swift index 6c96c31..34fdf5f 100644 --- a/Example/Stagehand/DemoViewController.swift +++ b/Example/Stagehand/DemoViewController.swift @@ -67,7 +67,7 @@ class DemoViewController: UIViewController { super.viewDidLayoutSubviews() let topInset = [ - UIApplication.shared.statusBarFrame.height, + view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0, navigationController?.navigationBar.frame.height, ].compactMap { $0 }.reduce(0, +) From 478cbb1a6617002c5e8a3e3955c697e3b107a57b Mon Sep 17 00:00:00 2001 From: Nick Entin Date: Mon, 3 Jun 2024 00:12:58 -0700 Subject: [PATCH 8/8] Make SnapshotTesting concurrency safe too --- Example/Unit Tests/AnimatableContainerView.swift | 1 + Example/Unit Tests/AnimationCurveSnapshotTests.swift | 11 +++++++++++ Example/Unit Tests/AnimationGroupTests.swift | 9 +++++++++ Example/Unit Tests/AnimationInstanceTests.swift | 9 +++++++++ Example/Unit Tests/AnimationOptimizationTests.swift | 10 ++++++++++ Example/Unit Tests/AnimationSnapshotTests.swift | 11 +++++++++++ .../CATransform3DInterpolationSnapshotTests.swift | 9 +++++++++ .../CGAffineTransformInterpolationSnapshotTests.swift | 8 ++++++++ Example/Unit Tests/ChildAnimationTests.swift | 11 +++++++++++ Example/Unit Tests/DisplayLinkDriverTests.swift | 2 +- Example/Unit Tests/ExecutorTests.swift | 10 ++++++++++ Example/Unit Tests/SnapshotTestCase.swift | 2 ++ .../Unit Tests/SnapshotTestingAPNGImageTests.swift | 5 +++++ .../Unit Tests/SnapshotTestingFrameImageTests.swift | 4 ++++ .../StagehandTesting/Core/AnimationSnapshotting.swift | 1 + .../SnapshotTesting/Snapshotting+AnimationAPNG.swift | 3 +++ .../SnapshotTesting/Snapshotting+AnimationFrame.swift | 3 +++ .../FBSnapshotTestCase+Animation.swift | 3 +++ .../FBSnapshotTestCase+AnimationGIF.swift | 6 ++++++ 19 files changed, 117 insertions(+), 1 deletion(-) diff --git a/Example/Unit Tests/AnimatableContainerView.swift b/Example/Unit Tests/AnimatableContainerView.swift index c0efafd..43c8d7c 100644 --- a/Example/Unit Tests/AnimatableContainerView.swift +++ b/Example/Unit Tests/AnimatableContainerView.swift @@ -49,6 +49,7 @@ final class AnimatableContainerView: UIView { extension AnimatableContainerView { + @MainActor final class Proxy { // MARK: - Life Cycle diff --git a/Example/Unit Tests/AnimationCurveSnapshotTests.swift b/Example/Unit Tests/AnimationCurveSnapshotTests.swift index 682ffbd..f468b96 100644 --- a/Example/Unit Tests/AnimationCurveSnapshotTests.swift +++ b/Example/Unit Tests/AnimationCurveSnapshotTests.swift @@ -21,40 +21,49 @@ final class AnimationCurveSnapshotTests: SnapshotTestCase { // MARK: - Tests + @MainActor func testLinear() { verifyGraphView(for: LinearAnimationCurve()) } + @MainActor func testParabolicEaseIn() { verifyGraphView(for: ParabolicEaseInAnimationCurve()) } + @MainActor func testParabolicEaseOut() { verifyGraphView(for: ParabolicEaseOutAnimationCurve()) } + @MainActor func testSinusoidalEaseInEaseOut() { verifyGraphView(for: SinusoidalEaseInEaseOutAnimationCurve()) } + @MainActor func testCubicBezierEaseIn() { verifyGraphView(for: CubicBezierAnimationCurve.easeIn) } + @MainActor func testCubicBezierEaseOut() { verifyGraphView(for: CubicBezierAnimationCurve.easeOut) } + @MainActor func testCubicBezierEaseInEaseOut() { verifyGraphView(for: CubicBezierAnimationCurve.easeInEaseOut) } + @MainActor func testCubicBezierOvershoot() { verifyGraphView(for: CubicBezierAnimationCurve(controlPoints: (0.5, 0.0), (0.5, 1.3))) } // MARK: - Private Methods + @MainActor private func verifyGraphView(for curve: AnimationCurve, file: StaticString = #file, line: UInt = #line) { let graphSize: CGFloat = 200 let margin: CGFloat = 20 @@ -72,6 +81,7 @@ final class AnimationCurveSnapshotTests: SnapshotTestCase { FBSnapshotVerifyView(containerView, file: file, line: line) } + @MainActor private func makeGridLayer(frame: CGRect) -> CAShapeLayer { let gridLayer: CAShapeLayer = .init() gridLayer.strokeColor = UIColor(white: 0.9, alpha: 1).cgColor @@ -81,6 +91,7 @@ final class AnimationCurveSnapshotTests: SnapshotTestCase { return gridLayer } + @MainActor private func makeCurveLayer(frame: CGRect, curve: AnimationCurve) -> CAShapeLayer { let curveLayer: CAShapeLayer = .init() curveLayer.strokeColor = UIColor.black.cgColor diff --git a/Example/Unit Tests/AnimationGroupTests.swift b/Example/Unit Tests/AnimationGroupTests.swift index ea91965..eaa5628 100644 --- a/Example/Unit Tests/AnimationGroupTests.swift +++ b/Example/Unit Tests/AnimationGroupTests.swift @@ -22,6 +22,7 @@ final class AnimationGroupTests: XCTestCase { // MARK: - Tests - Keyframes + @MainActor func testKeyframes_twoElementsOfSameType() { var animationGroup = AnimationGroup() @@ -54,6 +55,7 @@ final class AnimationGroupTests: XCTestCase { _ = animationInstance } + @MainActor func testKeyframes_twoElementsOfDifferentTypes() { var animationGroup = AnimationGroup() @@ -86,6 +88,7 @@ final class AnimationGroupTests: XCTestCase { _ = animationInstance } + @MainActor func testKeyframes_twoAnimationsForSameElement() { var animationGroup = AnimationGroup() @@ -116,6 +119,7 @@ final class AnimationGroupTests: XCTestCase { _ = animationInstance } + @MainActor func testKeyframes_offsetAnimations() { var animationGroup = AnimationGroup() @@ -158,6 +162,7 @@ final class AnimationGroupTests: XCTestCase { // MARK: - Tests - Completion Handler + @MainActor func testCompletionCalledOnComplete() { var animationGroup = AnimationGroup() animationGroup.implicitDuration = 0.05 @@ -173,6 +178,7 @@ final class AnimationGroupTests: XCTestCase { waitForExpectations(timeout: 0.5, handler: nil) } + @MainActor func testCompletionCalledOnCancel() { var animationGroup = AnimationGroup() animationGroup.implicitDuration = 1 @@ -191,6 +197,7 @@ final class AnimationGroupTests: XCTestCase { // MARK: - Tests - Properties + @MainActor func testDuration() { var animationGroup = AnimationGroup() @@ -202,6 +209,7 @@ final class AnimationGroupTests: XCTestCase { XCTAssertEqual(animationGroup.animation.implicitDuration, 3) } + @MainActor func testRepeatStyle() { var animationGroup = AnimationGroup() @@ -213,6 +221,7 @@ final class AnimationGroupTests: XCTestCase { XCTAssertEqual(animationGroup.animation.implicitRepeatStyle, .infinitelyRepeating(autoreversing: true)) } + @MainActor func testCurve() { var animationGroup = AnimationGroup() diff --git a/Example/Unit Tests/AnimationInstanceTests.swift b/Example/Unit Tests/AnimationInstanceTests.swift index 2e6e989..7b1255f 100644 --- a/Example/Unit Tests/AnimationInstanceTests.swift +++ b/Example/Unit Tests/AnimationInstanceTests.swift @@ -22,6 +22,7 @@ final class AnimationInstanceTests: XCTestCase { // MARK: - Tests - Keyframes + @MainActor func testKeyframesWithFixedValues() { let element = AnimatableElement( propertyOne: 0, @@ -61,6 +62,7 @@ final class AnimationInstanceTests: XCTestCase { _ = animationInstance } + @MainActor func testKeyframesWithRelativeValues() { let element = AnimatableElement( propertyOne: 2, @@ -98,6 +100,7 @@ final class AnimationInstanceTests: XCTestCase { _ = animationInstance } + @MainActor func testKeyframesWithMissingTerminalValues() { let element = AnimatableElement( propertyOne: 0 @@ -136,6 +139,7 @@ final class AnimationInstanceTests: XCTestCase { _ = animationInstance } + @MainActor func testKeyframesWithMultipleSegments() { let element = AnimatableElement( propertyOne: 0 @@ -173,6 +177,7 @@ final class AnimationInstanceTests: XCTestCase { _ = animationInstance } + @MainActor func testKeyframesOfOptionalProperty() { let element = AnimatableElement() @@ -197,6 +202,7 @@ final class AnimationInstanceTests: XCTestCase { // MARK: - Tests - Property Assignments + @MainActor func testPropertyAssignment() { let initialValue = "Hello world" let midpointValue = "What's up world" @@ -241,6 +247,7 @@ final class AnimationInstanceTests: XCTestCase { // MARK: - Tests - Execution Blocks + @MainActor func testExecutionBlocks() { let element = AnimatableElement() @@ -314,6 +321,7 @@ final class AnimationInstanceTests: XCTestCase { // MARK: - Tests - Per-Frame Execution Blocks + @MainActor func testPerFrameExecutionBlocks() { let element = AnimatableElement() @@ -366,6 +374,7 @@ final class AnimationInstanceTests: XCTestCase { // MARK: - Tests - Animation Curves + @MainActor func testAnimationCurves() { let element = AnimatableElement() diff --git a/Example/Unit Tests/AnimationOptimizationTests.swift b/Example/Unit Tests/AnimationOptimizationTests.swift index a445ec5..37499fb 100644 --- a/Example/Unit Tests/AnimationOptimizationTests.swift +++ b/Example/Unit Tests/AnimationOptimizationTests.swift @@ -22,6 +22,7 @@ final class AnimationOptimizationTests: XCTestCase { // MARK: - Tests - Ubiquitous Bezier Curve + @MainActor func testUbiquitousBezierCurveElevation_singleChild() { var parentAnimation = Animation() @@ -36,6 +37,7 @@ final class AnimationOptimizationTests: XCTestCase { XCTAssert(optimizedAnimation.children.allSatisfy { $0.animation.curve is LinearAnimationCurve }) } + @MainActor func testUbiquitousBezierCurveElevation_multipleChildren() { var parentAnimation = Animation() @@ -55,6 +57,7 @@ final class AnimationOptimizationTests: XCTestCase { XCTAssert(optimizedAnimation.children.allSatisfy { $0.animation.curve is LinearAnimationCurve }) } + @MainActor func testUbiquitousBezierCurveElevation_grandchild() { var parentAnimation = Animation() @@ -75,6 +78,7 @@ final class AnimationOptimizationTests: XCTestCase { }) } + @MainActor func testUbiquitousBezierCurveElevation_notElevatedWhenParentHasContent() { var parentAnimation = Animation() parentAnimation.addKeyframe(for: \.alpha, at: 0, value: 1) @@ -92,6 +96,7 @@ final class AnimationOptimizationTests: XCTestCase { }) } + @MainActor func testUbiquitousBezierCurveElevation_notElevatedWhenParentCurveIsNotLinear() { var parentAnimation = Animation() parentAnimation.curve = ParabolicEaseInAnimationCurve() @@ -109,6 +114,7 @@ final class AnimationOptimizationTests: XCTestCase { }) } + @MainActor func testUbiquitousBezierCurveElevation_notElevatedWhenAChildDoesNotCoverFullInterval() { var parentAnimation = Animation() @@ -130,6 +136,7 @@ final class AnimationOptimizationTests: XCTestCase { }) } + @MainActor func testUbiquitousBezierCurveElevation_notElevatedWhenNotAllChildrenHaveSameCurve() { var parentAnimation = Animation() @@ -152,6 +159,7 @@ final class AnimationOptimizationTests: XCTestCase { // MARK: - Tests - Remove Obsolete Keyframes + @MainActor func testObsoleteKeyframeRemoval_selfProperty() { var parentAnimation = Animation() parentAnimation.addKeyframe(for: \.alpha, at: 0, value: 1) @@ -167,6 +175,7 @@ final class AnimationOptimizationTests: XCTestCase { XCTAssertEqual(Array(optimizedAnimation.children[0].animation.keyframeSeriesByProperty.keys), [\UIView.transform]) } + @MainActor func testObsoleteKeyframeRemoval_subelementProperty() { var parentAnimation = Animation() parentAnimation.addKeyframe(for: \.subelement.propertyOne, at: 0, value: 1) @@ -182,6 +191,7 @@ final class AnimationOptimizationTests: XCTestCase { XCTAssertEqual(Array(optimizedAnimation.children[0].animation.keyframeSeriesByProperty.keys), [\Element.subelement.propertyTwo]) } + @MainActor func testObsoleteKeyframeRemoval_removesEmptyChildAfterRemovingKeyframes() { var parentAnimation = Animation() parentAnimation.addKeyframe(for: \.subelement.propertyOne, at: 0, value: 1) diff --git a/Example/Unit Tests/AnimationSnapshotTests.swift b/Example/Unit Tests/AnimationSnapshotTests.swift index 9059923..2e860f0 100644 --- a/Example/Unit Tests/AnimationSnapshotTests.swift +++ b/Example/Unit Tests/AnimationSnapshotTests.swift @@ -21,6 +21,7 @@ final class AnimationSnapshotTests: SnapshotTestCase { // MARK: - Tests - Frame Snapshots + @MainActor func testSimpleAnimationSnapshot() { let view = AnimatableContainerView(frame: .init(x: 0, y: 0, width: 200, height: 40)) @@ -37,6 +38,7 @@ final class AnimationSnapshotTests: SnapshotTestCase { FBSnapshotVerifyView(view, identifier: "start") } + @MainActor func testAnimationWithNonViewElementSnapshot() { let view = AnimatableContainerView(frame: .init(x: 0, y: 0, width: 200, height: 40)) @@ -55,6 +57,7 @@ final class AnimationSnapshotTests: SnapshotTestCase { FBSnapshotVerifyView(view, identifier: "start") } + @MainActor func testAnimationWithExecutionBlocksSnapshot() { let view = AnimatableContainerView(frame: .init(x: 0, y: 0, width: 200, height: 40)) @@ -78,6 +81,7 @@ final class AnimationSnapshotTests: SnapshotTestCase { // MARK: - Tests - Animated PNG + @MainActor func testSimpleAnimationSnapshotAPNG() { let view = AnimatableContainerView(frame: .init(x: 0, y: 0, width: 200, height: 40)) @@ -88,6 +92,7 @@ final class AnimationSnapshotTests: SnapshotTestCase { SnapshotVerify(animation: animation, on: view) } + @MainActor func testSimpleAnimationSnapshotAPNGAtHighFPS() { let view = AnimatableContainerView(frame: .init(x: 0, y: 0, width: 200, height: 40)) @@ -98,6 +103,7 @@ final class AnimationSnapshotTests: SnapshotTestCase { SnapshotVerify(animation: animation, on: view, fps: 30) } + @MainActor func testLongAnimationSnapshotAPNG() { let view = AnimatableContainerView(frame: .init(x: 0, y: 0, width: 200, height: 40)) @@ -109,6 +115,7 @@ final class AnimationSnapshotTests: SnapshotTestCase { SnapshotVerify(animation: animation, on: view) } + @MainActor func testAutoreversingAnimationSnapshotAPNG() { let view = AnimatableContainerView(frame: .init(x: 0, y: 0, width: 200, height: 40)) @@ -120,6 +127,7 @@ final class AnimationSnapshotTests: SnapshotTestCase { SnapshotVerify(animation: animation, on: view, bookendFrameDuration: .matchIntermediateFrames) } + @MainActor func testAnimationWithExecutionBlocksSnapshotAPNG() { let view = AnimatableContainerView(frame: .init(x: 0, y: 0, width: 200, height: 40)) @@ -135,6 +143,7 @@ final class AnimationSnapshotTests: SnapshotTestCase { SnapshotVerify(animation: animation, on: view) } + @MainActor func testAutoreversingAnimationWithExecutionBlocksSnapshotAPNG() { let view = AnimatableContainerView(frame: .init(x: 0, y: 0, width: 200, height: 40)) @@ -151,6 +160,7 @@ final class AnimationSnapshotTests: SnapshotTestCase { SnapshotVerify(animation: animation, on: view) } + @MainActor func testAnimationWithNonViewElementSnapshotAPNG() { let view = AnimatableContainerView(frame: .init(x: 0, y: 0, width: 200, height: 40)) @@ -163,6 +173,7 @@ final class AnimationSnapshotTests: SnapshotTestCase { SnapshotVerify(animation: animation, on: element, using: view) } + @MainActor func testAnimationWithPartialTransparency() { let view = ColorGridView(frame: .init(x: 0, y: 0, width: 200, height: 200)) diff --git a/Example/Unit Tests/CATransform3DInterpolationSnapshotTests.swift b/Example/Unit Tests/CATransform3DInterpolationSnapshotTests.swift index bcb8ba3..d8c6474 100644 --- a/Example/Unit Tests/CATransform3DInterpolationSnapshotTests.swift +++ b/Example/Unit Tests/CATransform3DInterpolationSnapshotTests.swift @@ -21,6 +21,7 @@ final class CATransform3DInterpolationSnapshotTests: SnapshotTestCase { // MARK: - Tests + @MainActor func testScale() { snapshotVerifyAnimation( transforms: [ @@ -30,6 +31,7 @@ final class CATransform3DInterpolationSnapshotTests: SnapshotTestCase { ) } + @MainActor func testRotation() { snapshotVerifyAnimation( transforms: [ @@ -40,6 +42,7 @@ final class CATransform3DInterpolationSnapshotTests: SnapshotTestCase { ) } + @MainActor func testRotationAcrossBoundary() { snapshotVerifyAnimation( transforms: [ @@ -49,6 +52,7 @@ final class CATransform3DInterpolationSnapshotTests: SnapshotTestCase { ) } + @MainActor func testScaleAndRotation() { snapshotVerifyAnimation( transforms: [ @@ -64,6 +68,7 @@ final class CATransform3DInterpolationSnapshotTests: SnapshotTestCase { ) } + @MainActor func testScaleAndRotationWithPerspective() { let perspectiveTransform = CATransform3DIdentity.withPerspective(eyePosition: 20) @@ -84,6 +89,7 @@ final class CATransform3DInterpolationSnapshotTests: SnapshotTestCase { ) } + @MainActor func testPerspective() { snapshotVerifyAnimation( transforms: [ @@ -102,6 +108,7 @@ final class CATransform3DInterpolationSnapshotTests: SnapshotTestCase { ) } + @MainActor func testShear() { snapshotVerifyAnimation( transforms: [ @@ -116,6 +123,7 @@ final class CATransform3DInterpolationSnapshotTests: SnapshotTestCase { ) } + @MainActor func testZeroScale() { snapshotVerifyAnimation( transforms: [ @@ -133,6 +141,7 @@ final class CATransform3DInterpolationSnapshotTests: SnapshotTestCase { // MARK: - Private Methods + @MainActor private func snapshotVerifyAnimation( transforms: [CATransform3D], file: StaticString = #file, diff --git a/Example/Unit Tests/CGAffineTransformInterpolationSnapshotTests.swift b/Example/Unit Tests/CGAffineTransformInterpolationSnapshotTests.swift index 170bdc6..8f575e9 100644 --- a/Example/Unit Tests/CGAffineTransformInterpolationSnapshotTests.swift +++ b/Example/Unit Tests/CGAffineTransformInterpolationSnapshotTests.swift @@ -21,6 +21,7 @@ final class CGAffineTransformInterpolationSnapshotTests: SnapshotTestCase { // MARK: - Tests + @MainActor func testTranslation() { snapshotVerifyAnimation( transforms: [ @@ -31,6 +32,7 @@ final class CGAffineTransformInterpolationSnapshotTests: SnapshotTestCase { ) } + @MainActor func testScale() { snapshotVerifyAnimation( transforms: [ @@ -42,6 +44,7 @@ final class CGAffineTransformInterpolationSnapshotTests: SnapshotTestCase { ) } + @MainActor func testFlippedScaleResultsInRotation() { snapshotVerifyAnimation( transforms: [ @@ -55,6 +58,7 @@ final class CGAffineTransformInterpolationSnapshotTests: SnapshotTestCase { ) } + @MainActor func testRotation() { snapshotVerifyAnimation( transforms: [ @@ -68,6 +72,7 @@ final class CGAffineTransformInterpolationSnapshotTests: SnapshotTestCase { ) } + @MainActor func testMultipleFactorTransforms() { snapshotVerifyAnimation( transforms: [ @@ -88,6 +93,7 @@ final class CGAffineTransformInterpolationSnapshotTests: SnapshotTestCase { ) } + @MainActor func testSkewedTransforms() { var positiveSkewTransform = CGAffineTransform.identity positiveSkewTransform.c = 4 @@ -104,6 +110,7 @@ final class CGAffineTransformInterpolationSnapshotTests: SnapshotTestCase { ) } + @MainActor func testTranslatingSkewedTransforms() { var skewTransform = CGAffineTransform.identity skewTransform.c = 2 @@ -118,6 +125,7 @@ final class CGAffineTransformInterpolationSnapshotTests: SnapshotTestCase { // MARK: - Private Methods + @MainActor private func snapshotVerifyAnimation( transforms: [CGAffineTransform], file: StaticString = #file, diff --git a/Example/Unit Tests/ChildAnimationTests.swift b/Example/Unit Tests/ChildAnimationTests.swift index f034fd2..87801c7 100644 --- a/Example/Unit Tests/ChildAnimationTests.swift +++ b/Example/Unit Tests/ChildAnimationTests.swift @@ -22,6 +22,7 @@ final class ChildAnimationTests: XCTestCase { // MARK: - Tests - Keyframes + @MainActor func testKeyframes_simpleConfiguration() { var childAnimation = Animation() childAnimation.addKeyframe(for: \.propertyOne, at: 0, value: 0) @@ -48,6 +49,7 @@ final class ChildAnimationTests: XCTestCase { _ = animationInstance } + @MainActor func testKeyframes_twoChildrenForSameSubelement() { var childAnimation1 = Animation() childAnimation1.addKeyframe(for: \.propertyOne, at: 0, value: 0) @@ -78,6 +80,7 @@ final class ChildAnimationTests: XCTestCase { _ = animationInstance } + @MainActor func testKeyframes_childOverPartialCycle() { var childAnimation = Animation() childAnimation.addKeyframe(for: \.propertyOne, at: 0, value: 0) @@ -110,6 +113,7 @@ final class ChildAnimationTests: XCTestCase { _ = animationInstance } + @MainActor func testKeyframes_childOverriddenByParent() { var childAnimation = Animation() childAnimation.addKeyframe(for: \.propertyOne, at: 0, value: 1) @@ -141,6 +145,7 @@ final class ChildAnimationTests: XCTestCase { // This test is currently disabled because it doesn't handle delaying the start of the second child animation until // the first has finished. + @MainActor func testKeyframes_sequentialChildrenForSameProperty() { var downChildAnimation = Animation() downChildAnimation.addKeyframe(for: \.propertyOne, at: 0, value: 1) @@ -182,6 +187,7 @@ final class ChildAnimationTests: XCTestCase { _ = animationInstance } + @MainActor func testKeyframes_verifyFinalFrameIsRenderedInLinearParent() { var childAnimation = Animation() childAnimation.addKeyframe(for: \.propertyOne, at: 0, value: 1) @@ -214,6 +220,7 @@ final class ChildAnimationTests: XCTestCase { _ = animationInstance } + @MainActor func testKeyframes_verifyFinalFrameIsRenderedInNonLinearParent() { var childAnimation = Animation() childAnimation.addKeyframe(for: \.propertyOne, at: 0, value: 1) @@ -246,6 +253,7 @@ final class ChildAnimationTests: XCTestCase { // MARK: - Tests - Execution Blocks + @MainActor func testExecutionBlocks_fullDurationChild() { var executedBlocks: [String] = [] @@ -288,6 +296,7 @@ final class ChildAnimationTests: XCTestCase { _ = animationInstance } + @MainActor func testExecutionBlocks_partialDurationChildren() { var executedBlocks: [String] = [] @@ -355,6 +364,7 @@ final class ChildAnimationTests: XCTestCase { // MARK: - Tests - Property Assignments + @MainActor func testPropertyAssignments_fullDurationChild() { var child = Animation() child.addAssignment(for: \.propertyOne, at: 0, value: 0) @@ -386,6 +396,7 @@ final class ChildAnimationTests: XCTestCase { _ = animationInstance } + @MainActor func testPropertyAssignments_partialDurationChildren() { var child = Animation() child.addAssignment(for: \.propertyOne, at: 0, value: 0) diff --git a/Example/Unit Tests/DisplayLinkDriverTests.swift b/Example/Unit Tests/DisplayLinkDriverTests.swift index 51dc918..1aa326b 100644 --- a/Example/Unit Tests/DisplayLinkDriverTests.swift +++ b/Example/Unit Tests/DisplayLinkDriverTests.swift @@ -1023,6 +1023,6 @@ private enum Factory { // differentiate between not being added to the run loop. static let startTime: CFTimeInterval = 1000 - static let timeFactory: () -> CFTimeInterval = { Factory.startTime } + static let timeFactory: @Sendable () -> CFTimeInterval = { Factory.startTime } } diff --git a/Example/Unit Tests/ExecutorTests.swift b/Example/Unit Tests/ExecutorTests.swift index 2cc1a75..ecfe8d9 100644 --- a/Example/Unit Tests/ExecutorTests.swift +++ b/Example/Unit Tests/ExecutorTests.swift @@ -22,6 +22,7 @@ final class ExecutorTests: XCTestCase { // MARK: - Tests - Property Assignment + @MainActor func testPropertyAssignment() { let initialValue = "A" let midpointValue = "B" @@ -60,6 +61,7 @@ final class ExecutorTests: XCTestCase { XCTAssertEqual(element.property, initialValue) } + @MainActor func testPropertyAssignmentOnExactFrame() { let initialValue = "A" let midpointValue = "B" @@ -81,6 +83,7 @@ final class ExecutorTests: XCTestCase { XCTAssertEqual(element.property, midpointValue) } + @MainActor func testPropertyAssignmentSkippingFrames() { let initialValue = "A" let midpointValue = "B" @@ -115,6 +118,7 @@ final class ExecutorTests: XCTestCase { XCTAssertEqual(element.property, initialValue) } + @MainActor func testPropertyAssignmentInChildAnimation() { let initialValue = "-" let startValue = "A" @@ -171,6 +175,7 @@ final class ExecutorTests: XCTestCase { XCTAssertEqual(element.property, initialValue) } + @MainActor func testPropertyAssignmentWithCurvedAnimation() { let initialValue = "A" let midpointValue = "B" @@ -213,6 +218,7 @@ final class ExecutorTests: XCTestCase { XCTAssertEqual(element.property, initialValue) } + @MainActor func testPropertyAssignmentInCurvedChildAnimation() { let initialValue = "-" let startValue = "A" @@ -275,6 +281,7 @@ final class ExecutorTests: XCTestCase { // MARK: - Tests - Execution Blocks + @MainActor func testExecutionBlocks() { var executedBlocks: [String] = [] @@ -338,6 +345,7 @@ final class ExecutorTests: XCTestCase { XCTAssertEqual(executedBlocks, ["C'", "B'", "A'"]) } + @MainActor func testExecutionBlocksInChildAnimation() { var executedBlocks: [String] = [] @@ -399,6 +407,7 @@ final class ExecutorTests: XCTestCase { XCTAssertEqual(executedBlocks, ["C'", "B'", "A'"]) } + @MainActor func testExecutionBlocksWithCurvedAnimation() { var executedBlocks: [String] = [] @@ -440,6 +449,7 @@ final class ExecutorTests: XCTestCase { XCTAssertEqual(executedBlocks, []) } + @MainActor func testExecutionBlocksInCurvedChildAnimation() { var executedBlocks: [String] = [] diff --git a/Example/Unit Tests/SnapshotTestCase.swift b/Example/Unit Tests/SnapshotTestCase.swift index d458a40..e251f88 100644 --- a/Example/Unit Tests/SnapshotTestCase.swift +++ b/Example/Unit Tests/SnapshotTestCase.swift @@ -20,6 +20,7 @@ class SnapshotTestCase: FBSnapshotTestCase { // MARK: - Private Types + @MainActor private struct TestDeviceConfig { // MARK: - Public Properties @@ -49,6 +50,7 @@ class SnapshotTestCase: FBSnapshotTestCase { // MARK: - FBSnapshotTestCase + @MainActor override func setUp() { super.setUp() diff --git a/Example/Unit Tests/SnapshotTestingAPNGImageTests.swift b/Example/Unit Tests/SnapshotTestingAPNGImageTests.swift index 3b96b02..af77b62 100644 --- a/Example/Unit Tests/SnapshotTestingAPNGImageTests.swift +++ b/Example/Unit Tests/SnapshotTestingAPNGImageTests.swift @@ -23,6 +23,7 @@ final class SnapshotTestingAPNGImageTests: SnapshotTestCase { // MARK: - Tests + @MainActor func testSimpleAnimationSnapshot() { let view = AnimatableContainerView(frame: .init(x: 0, y: 0, width: 200, height: 40)) @@ -39,6 +40,7 @@ final class SnapshotTestingAPNGImageTests: SnapshotTestCase { assertSnapshot(matching: view, as: .image, named: nameForDevice(baseName: "start")) } + @MainActor func testAnimationSnapshotWithRepeatingAnimation() { let view = AnimatableContainerView(frame: .init(x: 0, y: 0, width: 200, height: 40)) @@ -55,6 +57,7 @@ final class SnapshotTestingAPNGImageTests: SnapshotTestCase { assertSnapshot(matching: animation, as: .animatedImage(on: view), named: nameForDevice()) } + @MainActor func testAnimationWithNonViewElementSnapshot() { let view = AnimatableContainerView(frame: .init(x: 0, y: 0, width: 200, height: 40)) @@ -73,6 +76,7 @@ final class SnapshotTestingAPNGImageTests: SnapshotTestCase { assertSnapshot(matching: view, as: .image, named: nameForDevice(baseName: "start")) } + @MainActor func testAnimationGroupSnapshot() { let view = AnimatableContainerView(frame: .init(x: 0, y: 0, width: 200, height: 40)) @@ -94,6 +98,7 @@ final class SnapshotTestingAPNGImageTests: SnapshotTestCase { // MARK: - Private Methods + @MainActor private func nameForDevice(baseName: String? = nil) -> String { let size = UIScreen.main.bounds.size let scale = UIScreen.main.scale diff --git a/Example/Unit Tests/SnapshotTestingFrameImageTests.swift b/Example/Unit Tests/SnapshotTestingFrameImageTests.swift index cc2450f..02d923b 100644 --- a/Example/Unit Tests/SnapshotTestingFrameImageTests.swift +++ b/Example/Unit Tests/SnapshotTestingFrameImageTests.swift @@ -23,6 +23,7 @@ final class SnapshotTestingFrameImageTests: SnapshotTestCase { // MARK: - Tests + @MainActor func testSimpleAnimationSnapshot() { let view = AnimatableContainerView(frame: .init(x: 0, y: 0, width: 200, height: 40)) @@ -51,6 +52,7 @@ final class SnapshotTestingFrameImageTests: SnapshotTestCase { assertSnapshot(matching: view, as: .image, named: nameForDevice(baseName: "start")) } + @MainActor func testAnimationWithNonViewElementSnapshot() { let view = AnimatableContainerView(frame: .init(x: 0, y: 0, width: 200, height: 40)) @@ -81,6 +83,7 @@ final class SnapshotTestingFrameImageTests: SnapshotTestCase { assertSnapshot(matching: view, as: .image, named: nameForDevice(baseName: "start")) } + @MainActor func testAnimationGroupSnapshot() { let view = AnimatableContainerView(frame: .init(x: 0, y: 0, width: 200, height: 40)) @@ -114,6 +117,7 @@ final class SnapshotTestingFrameImageTests: SnapshotTestCase { // MARK: - Private Methods + @MainActor private func nameForDevice(baseName: String? = nil) -> String { let size = UIScreen.main.bounds.size let scale = UIScreen.main.scale diff --git a/Sources/StagehandTesting/Core/AnimationSnapshotting.swift b/Sources/StagehandTesting/Core/AnimationSnapshotting.swift index a8ee1cc..fe5af4e 100644 --- a/Sources/StagehandTesting/Core/AnimationSnapshotting.swift +++ b/Sources/StagehandTesting/Core/AnimationSnapshotting.swift @@ -49,6 +49,7 @@ public enum AnimationSnapshotting { // MARK: - Internal Static Methods + @MainActor internal static func generateAnimatedSnapshot( of animationInstance: AnimationInstance, using view: UIView, diff --git a/Sources/StagehandTesting/SnapshotTesting/Snapshotting+AnimationAPNG.swift b/Sources/StagehandTesting/SnapshotTesting/Snapshotting+AnimationAPNG.swift index 5d3a00e..9e24834 100644 --- a/Sources/StagehandTesting/SnapshotTesting/Snapshotting+AnimationAPNG.swift +++ b/Sources/StagehandTesting/SnapshotTesting/Snapshotting+AnimationAPNG.swift @@ -22,6 +22,7 @@ import XCTest extension Snapshotting where Value: SnapshottableViewAnimation, Format == Data { + @MainActor public static func animatedImage( on element: Value.ElementType, fps: Double = AnimationSnapshotting.defaultAnimationSnapshotFPS, @@ -76,6 +77,7 @@ extension Snapshotting where Value: SnapshottableViewAnimation, Format == Data { extension Snapshotting where Value: SnapshottableAnimation, Format == Data { + @MainActor public static func animatedImage( on element: Value.ElementType, using view: UIView, @@ -131,6 +133,7 @@ extension Snapshotting where Value: SnapshottableAnimation, Format == Data { extension Snapshotting where Value == AnimationGroup, Format == Data { + @MainActor public static func animatedImage( using view: UIView, fps: Double = AnimationSnapshotting.defaultAnimationSnapshotFPS, diff --git a/Sources/StagehandTesting/SnapshotTesting/Snapshotting+AnimationFrame.swift b/Sources/StagehandTesting/SnapshotTesting/Snapshotting+AnimationFrame.swift index 5734eed..3e24cb2 100644 --- a/Sources/StagehandTesting/SnapshotTesting/Snapshotting+AnimationFrame.swift +++ b/Sources/StagehandTesting/SnapshotTesting/Snapshotting+AnimationFrame.swift @@ -53,6 +53,7 @@ extension Animation: SnapshottableAnimation {} extension Snapshotting where Value: SnapshottableViewAnimation, Format == UIImage { + @MainActor public static func frameImage( on element: Value.ElementType, at relativeTimestamp: Double, @@ -85,6 +86,7 @@ extension Snapshotting where Value: SnapshottableViewAnimation, Format == UIImag extension Snapshotting where Value: SnapshottableAnimation, Format == UIImage { + @MainActor public static func frameImage( on element: Value.ElementType, using view: UIView, @@ -118,6 +120,7 @@ extension Snapshotting where Value: SnapshottableAnimation, Format == UIImage { extension Snapshotting where Value == AnimationGroup, Format == UIImage { + @MainActor public static func frameImage( using view: UIView, at relativeTimestamp: Double, diff --git a/Sources/StagehandTesting/iOSSnapshotTestCase/FBSnapshotTestCase+Animation.swift b/Sources/StagehandTesting/iOSSnapshotTestCase/FBSnapshotTestCase+Animation.swift index 88b55bd..807571d 100644 --- a/Sources/StagehandTesting/iOSSnapshotTestCase/FBSnapshotTestCase+Animation.swift +++ b/Sources/StagehandTesting/iOSSnapshotTestCase/FBSnapshotTestCase+Animation.swift @@ -38,6 +38,7 @@ extension FBSnapshotTestCase { /// snapshot tests in a given test method. Defaults to no identifier. /// - parameter file: The file in which the test result should be attributed. /// - parameter line: The line in which the test result should be attributed. + @MainActor public func SnapshotVerify( animation: Animation, on element: ElementType, @@ -74,6 +75,7 @@ extension FBSnapshotTestCase { /// snapshot tests in a given test method. Defaults to no identifier. /// - parameter file: The file in which the test result should be attributed. /// - parameter line: The line in which the test result should be attributed. + @MainActor public func SnapshotVerify( animation: Animation, on element: ElementType, @@ -111,6 +113,7 @@ extension FBSnapshotTestCase { /// snapshot tests in a given test method. Defaults to no identifier. /// - parameter file: The file in which the test result should be attributed. /// - parameter line: The line in which the test result should be attributed. + @MainActor public func SnapshotVerify( animationGroup: AnimationGroup, using view: UIView, diff --git a/Sources/StagehandTesting/iOSSnapshotTestCase/FBSnapshotTestCase+AnimationGIF.swift b/Sources/StagehandTesting/iOSSnapshotTestCase/FBSnapshotTestCase+AnimationGIF.swift index 021ab20..1204761 100644 --- a/Sources/StagehandTesting/iOSSnapshotTestCase/FBSnapshotTestCase+AnimationGIF.swift +++ b/Sources/StagehandTesting/iOSSnapshotTestCase/FBSnapshotTestCase+AnimationGIF.swift @@ -47,6 +47,7 @@ extension FBSnapshotTestCase { /// - parameter suffixes: An ordered set of strings representing the platform suffixes. /// - parameter file: The file in which the test result should be attributed. /// - parameter line: The line in which the test result should be attributed. + @MainActor public func SnapshotVerify( animation: Animation, on element: ElementType, @@ -106,6 +107,7 @@ extension FBSnapshotTestCase { /// - parameter suffixes: An ordered set of strings representing the platform suffixes. /// - parameter file: The file in which the test result should be attributed. /// - parameter line: The line in which the test result should be attributed. + @MainActor public func SnapshotVerify( animation: Animation, on element: ElementType, @@ -167,6 +169,7 @@ extension FBSnapshotTestCase { /// - parameter suffixes: An ordered set of strings representing the platform suffixes. /// - parameter file: The file in which the test result should be attributed. /// - parameter line: The line in which the test result should be attributed. + @MainActor public func SnapshotVerify( animationGroup: AnimationGroup, using view: UIView, @@ -209,6 +212,7 @@ extension FBSnapshotTestCase { // MARK: - Private Methods + @MainActor private func SnapshotVerify( animationInstance: AnimationInstance, using view: UIView, @@ -251,6 +255,7 @@ extension FBSnapshotTestCase { } } + @MainActor private func recordSnapshot( of animationInstance: AnimationInstance, using view: UIView, @@ -303,6 +308,7 @@ extension FBSnapshotTestCase { ) } + @MainActor private func performComparisonToReferenceSnapshot( of animationInstance: AnimationInstance, using view: UIView,