Skip to content

Commit cee39af

Browse files
committed
Add UnitCurveCompatibilityTests
1 parent b48abd6 commit cee39af

File tree

3 files changed

+258
-238
lines changed

3 files changed

+258
-238
lines changed

Tests/OpenSwiftUICompatibilityTests/Animation/Animation/AnimationTests.swift renamed to Tests/OpenSwiftUICompatibilityTests/Animation/Animation/AnimationCompatibilityTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import Testing
66

7-
struct AnimationTests {
7+
struct AnimationCompatibilityTests {
88
@Test
99
func description() {
1010
let animation = Animation.default
Lines changed: 250 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,250 @@
1+
//
2+
// UnitCurveCompatibilityTests.swift
3+
// OpenSwiftUICompatibilityTests
4+
5+
import Testing
6+
7+
// MARK: - UnitCurveTests
8+
9+
struct UnitCurveCompatibilityTests {
10+
@Test
11+
func linearCurve() {
12+
let curve = UnitCurve.linear
13+
14+
#expect(curve.value(at: 0.0).isApproximatelyEqual(to: 0.0))
15+
#expect(curve.value(at: 0.25).isApproximatelyEqual(to: 0.25))
16+
#expect(curve.value(at: 0.5).isApproximatelyEqual(to: 0.5))
17+
#expect(curve.value(at: 0.75).isApproximatelyEqual(to: 0.75))
18+
#expect(curve.value(at: 1.0).isApproximatelyEqual(to: 1.0))
19+
20+
#expect(curve.velocity(at: 0.0).isApproximatelyEqual(to: 1.0))
21+
#expect(curve.velocity(at: 0.25).isApproximatelyEqual(to: 1.0))
22+
#expect(curve.velocity(at: 0.5).isApproximatelyEqual(to: 1.0))
23+
#expect(curve.velocity(at: 0.75).isApproximatelyEqual(to: 1.0))
24+
#expect(curve.velocity(at: 1.0).isApproximatelyEqual(to: 1.0))
25+
}
26+
27+
@Test
28+
func easeInCurve() {
29+
let curve = UnitCurve.easeIn
30+
31+
#expect(curve.value(at: 0.0).isApproximatelyEqual(to: 0.0))
32+
#expect(curve.value(at: 0.25).isApproximatelyEqual(to: 0.09, absoluteTolerance: 0.01))
33+
#expect(curve.value(at: 0.5).isApproximatelyEqual(to: 0.32, absoluteTolerance: 0.01))
34+
#expect(curve.value(at: 0.75).isApproximatelyEqual(to: 0.62, absoluteTolerance: 0.01))
35+
#expect(curve.value(at: 1.0).isApproximatelyEqual(to: 1.0))
36+
37+
#expect(curve.velocity(at: 0.0).isApproximatelyEqual(to: 0.0))
38+
#expect(curve.velocity(at: 0.25).isApproximatelyEqual(to: 0.67, absoluteTolerance: 0.01))
39+
#expect(curve.velocity(at: 0.5).isApproximatelyEqual(to: 1.07, absoluteTolerance: 0.01))
40+
#expect(curve.velocity(at: 0.75).isApproximatelyEqual(to: 1.37, absoluteTolerance: 0.01))
41+
#expect(curve.velocity(at: 1.0).isApproximatelyEqual(to: 0.0))
42+
}
43+
44+
@Test
45+
func easeOutCurve() {
46+
let curve = UnitCurve.easeOut
47+
48+
#expect(curve.value(at: 0.0).isApproximatelyEqual(to: 0.0))
49+
#expect(curve.value(at: 0.25).isApproximatelyEqual(to: 0.38, absoluteTolerance: 0.01))
50+
#expect(curve.value(at: 0.5).isApproximatelyEqual(to: 0.68, absoluteTolerance: 0.01))
51+
#expect(curve.value(at: 0.75).isApproximatelyEqual(to: 0.91, absoluteTolerance: 0.01))
52+
#expect(curve.value(at: 1.0).isApproximatelyEqual(to: 1.0))
53+
54+
#expect(curve.velocity(at: 0.0).isApproximatelyEqual(to: 1.0, absoluteTolerance: 0.01))
55+
#expect(curve.velocity(at: 0.25).isApproximatelyEqual(to: 1.37, absoluteTolerance: 0.01))
56+
#expect(curve.velocity(at: 0.5).isApproximatelyEqual(to: 1.07, absoluteTolerance: 0.01))
57+
#expect(curve.velocity(at: 0.75).isApproximatelyEqual(to: 0.67, absoluteTolerance: 0.01))
58+
#expect(curve.velocity(at: 1.0).isApproximatelyEqual(to: 0.0))
59+
}
60+
61+
@Test
62+
func easeInOutCurve() {
63+
let curve = UnitCurve.easeInOut
64+
65+
#expect(curve.value(at: 0.0).isApproximatelyEqual(to: 0.0))
66+
#expect(curve.value(at: 0.25).isApproximatelyEqual(to: 0.13, absoluteTolerance: 0.01))
67+
#expect(curve.value(at: 0.5).isApproximatelyEqual(to: 0.5))
68+
#expect(curve.value(at: 0.75).isApproximatelyEqual(to: 0.87, absoluteTolerance: 0.01))
69+
#expect(curve.value(at: 1.0).isApproximatelyEqual(to: 1.0))
70+
71+
#expect(curve.velocity(at: 0.0).isApproximatelyEqual(to: 0.0))
72+
#expect(curve.velocity(at: 0.25).isApproximatelyEqual(to: 1.06, absoluteTolerance: 0.01))
73+
#expect(curve.velocity(at: 0.5).isApproximatelyEqual(to: 1.72, absoluteTolerance: 0.01))
74+
#expect(curve.velocity(at: 0.75).isApproximatelyEqual(to: 1.06, absoluteTolerance: 0.01))
75+
#expect(curve.velocity(at: 1.0).isApproximatelyEqual(to: 0.0))
76+
}
77+
78+
@Test
79+
func circularEaseInCurve() {
80+
let curve = UnitCurve.circularEaseIn
81+
82+
#expect(curve.value(at: 0.0).isApproximatelyEqual(to: 0.0))
83+
#expect(curve.value(at: 0.25).isApproximatelyEqual(to: 0.032, absoluteTolerance: 0.001))
84+
#expect(curve.value(at: 0.5).isApproximatelyEqual(to: 0.134, absoluteTolerance: 0.001))
85+
#expect(curve.value(at: 0.75).isApproximatelyEqual(to: 0.339, absoluteTolerance: 0.001))
86+
#expect(curve.value(at: 1.0).isApproximatelyEqual(to: 1.0))
87+
88+
#expect(curve.velocity(at: 0.0).isApproximatelyEqual(to: 0.0))
89+
#expect(curve.velocity(at: 0.25).isApproximatelyEqual(to: 0.258, absoluteTolerance: 0.001))
90+
#expect(curve.velocity(at: 0.5).isApproximatelyEqual(to: 0.577, absoluteTolerance: 0.001))
91+
#expect(curve.velocity(at: 0.75).isApproximatelyEqual(to: 1.134, absoluteTolerance: 0.001))
92+
#expect(curve.velocity(at: 1.0).isApproximatelyEqual(to: .infinity))
93+
}
94+
95+
@Test
96+
func circularEaseOutCurve() {
97+
let curve = UnitCurve.circularEaseOut
98+
99+
#expect(curve.value(at: 0.0).isApproximatelyEqual(to: 0.0))
100+
#expect(curve.value(at: 0.25).isApproximatelyEqual(to: 0.661, absoluteTolerance: 0.001))
101+
#expect(curve.value(at: 0.5).isApproximatelyEqual(to: 0.866, absoluteTolerance: 0.001))
102+
#expect(curve.value(at: 0.75).isApproximatelyEqual(to: 0.968, absoluteTolerance: 0.001))
103+
#expect(curve.value(at: 1.0).isApproximatelyEqual(to: 1.0))
104+
105+
#expect(curve.velocity(at: 0.0).isApproximatelyEqual(to: .infinity))
106+
#expect(curve.velocity(at: 0.25).isApproximatelyEqual(to: 1.134, absoluteTolerance: 0.001))
107+
#expect(curve.velocity(at: 0.5).isApproximatelyEqual(to: 0.577, absoluteTolerance: 0.001))
108+
#expect(curve.velocity(at: 0.75).isApproximatelyEqual(to: 0.258, absoluteTolerance: 0.001))
109+
#expect(curve.velocity(at: 1.0).isApproximatelyEqual(to: 0.0))
110+
}
111+
112+
@Test
113+
func circularEaseInOutCurve() {
114+
let curve = UnitCurve.circularEaseInOut
115+
116+
#expect(curve.value(at: 0.0).isApproximatelyEqual(to: 0.0))
117+
#expect(curve.value(at: 0.25).isApproximatelyEqual(to: 0.067, absoluteTolerance: 0.001))
118+
#expect(curve.value(at: 0.5).isApproximatelyEqual(to: 0.5))
119+
#expect(curve.value(at: 0.75).isApproximatelyEqual(to: 0.933, absoluteTolerance: 0.001))
120+
#expect(curve.value(at: 1.0).isApproximatelyEqual(to: 1.0))
121+
122+
#expect(curve.velocity(at: 0.0).isApproximatelyEqual(to: 0.0))
123+
#expect(curve.velocity(at: 0.25).isApproximatelyEqual(to: 0.577, absoluteTolerance: 0.001))
124+
#expect(curve.velocity(at: 0.5).isApproximatelyEqual(to: .infinity, absoluteTolerance: 0.001))
125+
#expect(curve.velocity(at: 0.75).isApproximatelyEqual(to: 0.577, absoluteTolerance: 0.001))
126+
#expect(curve.velocity(at: 1.0).isApproximatelyEqual(to: 0.0))
127+
}
128+
129+
// MARK: - Bezier Curve Creation
130+
131+
@Test
132+
func bezierCurveCreation() {
133+
let startPoint = UnitPoint(x: 0.25, y: 0.1)
134+
let endPoint = UnitPoint(x: 0.75, y: 0.9)
135+
let curve = UnitCurve.bezier(startControlPoint: startPoint, endControlPoint: endPoint)
136+
137+
#expect(curve.value(at: 0.0).isApproximatelyEqual(to: 0.0))
138+
#expect(curve.value(at: 1.0).isApproximatelyEqual(to: 1.0))
139+
#expect(curve.value(at: 0.5).isApproximatelyEqual(to: 0.5, absoluteTolerance: 0.01))
140+
#expect(curve.velocity(at: 0.5).isApproximatelyEqual(to: 1.20, absoluteTolerance: 0.01))
141+
}
142+
143+
@Test
144+
func bezierCurveWithExtremeControlPoints() {
145+
let startPoint = UnitPoint(x: -0.5, y: 2.0)
146+
let endPoint = UnitPoint(x: 1.5, y: -1.0)
147+
let curve = UnitCurve.bezier(startControlPoint: startPoint, endControlPoint: endPoint)
148+
149+
#expect(curve.value(at: 0.0).isApproximatelyEqual(to: 0.0))
150+
#expect(curve.value(at: 1.0).isApproximatelyEqual(to: 1.0))
151+
#expect(curve.value(at: 0.5).isApproximatelyEqual(to: 0.5))
152+
#expect(curve.velocity(at: 0.5).isApproximatelyEqual(to: -1.0))
153+
}
154+
155+
// MARK: - Value Function
156+
157+
@Test
158+
func valueAtBoundaryConditions() {
159+
let curve = UnitCurve.easeInOut
160+
161+
#expect(curve.value(at: -0.5).isApproximatelyEqual(to: 0.0))
162+
#expect(curve.value(at: 0.0).isApproximatelyEqual(to: 0.0))
163+
#expect(curve.value(at: 1.0).isApproximatelyEqual(to: 1.0))
164+
#expect(curve.value(at: 1.5).isApproximatelyEqual(to: 1.0))
165+
}
166+
167+
@Test
168+
func valueAtVariousProgressPoints() {
169+
let curve = UnitCurve.linear
170+
171+
for progress in stride(from: 0.0, through: 1.0, by: 0.1) {
172+
let value = curve.value(at: progress)
173+
#expect(value >= 0.0)
174+
#expect(value <= 1.0)
175+
}
176+
}
177+
178+
// MARK: - Velocity Function
179+
180+
@Test
181+
func velocityAtBoundaryConditions() {
182+
let curve = UnitCurve.linear
183+
184+
#expect(curve.velocity(at: -0.5).isApproximatelyEqual(to: 1.0))
185+
#expect(curve.velocity(at: 0.0).isApproximatelyEqual(to: 1.0))
186+
#expect(curve.velocity(at: 1.0).isApproximatelyEqual(to: 1.0))
187+
#expect(curve.velocity(at: 1.5).isApproximatelyEqual(to: 1.0))
188+
}
189+
190+
@Test
191+
func velocityForCircularCurves() {
192+
let easeIn = UnitCurve.circularEaseIn
193+
let easeOut = UnitCurve.circularEaseOut
194+
let easeInOut = UnitCurve.circularEaseInOut
195+
196+
#expect(easeIn.velocity(at: 0.5) > 0.0)
197+
#expect(easeOut.velocity(at: 0.5) > 0.0)
198+
#expect(easeInOut.velocity(at: 0.5) > 0.0)
199+
}
200+
201+
// MARK: - Inverse Property
202+
203+
@Test
204+
func linearCurveInverse() {
205+
let curve = UnitCurve.linear
206+
let inverse = curve.inverse
207+
208+
#expect(inverse.value(at: 0.0).isApproximatelyEqual(to: 0.0))
209+
#expect(inverse.value(at: 0.5).isApproximatelyEqual(to: 0.5))
210+
#expect(inverse.value(at: 1.0).isApproximatelyEqual(to: 1.0))
211+
}
212+
213+
@Test
214+
func circularCurveInverse() {
215+
let easeIn = UnitCurve.circularEaseIn
216+
let easeOut = UnitCurve.circularEaseOut
217+
218+
#expect(easeIn.inverse.value(at: 0.3).isApproximatelyEqual(to: easeOut.value(at: 0.3)))
219+
#expect(easeIn.inverse.value(at: 0.7).isApproximatelyEqual(to: easeOut.value(at: 0.7)))
220+
221+
#expect(easeIn.inverse.velocity(at: 0.3).isApproximatelyEqual(to: easeOut.velocity(at: 0.3)))
222+
#expect(easeIn.inverse.velocity(at: 0.7).isApproximatelyEqual(to: easeOut.velocity(at: 0.7)))
223+
}
224+
225+
@Test
226+
func curveInverse() {
227+
let easeIn = UnitCurve.easeIn
228+
let easeOut = UnitCurve.easeOut
229+
230+
#expect(!easeIn.inverse.value(at: 0.3).isApproximatelyEqual(to: easeOut.value(at: 0.3)))
231+
#expect(!easeIn.inverse.value(at: 0.7).isApproximatelyEqual(to: easeOut.value(at: 0.7)))
232+
233+
#expect(!easeIn.inverse.velocity(at: 0.3).isApproximatelyEqual(to: easeOut.velocity(at: 0.3)))
234+
#expect(!easeIn.inverse.velocity(at: 0.7).isApproximatelyEqual(to: easeOut.velocity(at: 0.7)))
235+
}
236+
237+
@Test
238+
func bezierCurveInverse() {
239+
let startPoint = UnitPoint(x: 0.25, y: 0.1)
240+
let endPoint = UnitPoint(x: 0.75, y: 0.9)
241+
let curve = UnitCurve.bezier(startControlPoint: startPoint, endControlPoint: endPoint)
242+
243+
let inverseStartPoint = UnitPoint(x: 0.1, y: 0.25)
244+
let inverseEndPoint = UnitPoint(x: 0.9, y: 0.75)
245+
let inverse = UnitCurve.bezier(startControlPoint: inverseStartPoint, endControlPoint: inverseEndPoint)
246+
247+
#expect(inverse.value(at: 0.3).isAlmostEqual(to: curve.inverse.value(at: 0.3)))
248+
#expect(inverse.value(at: 0.7).isAlmostEqual(to: curve.inverse.value(at: 0.7)))
249+
}
250+
}

0 commit comments

Comments
 (0)