@pawells/math-extended 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +319 -0
  3. package/build/angles.d.ts +31 -0
  4. package/build/angles.d.ts.map +1 -0
  5. package/build/angles.js +85 -0
  6. package/build/angles.js.map +1 -0
  7. package/build/angles.spec.d.ts +2 -0
  8. package/build/angles.spec.d.ts.map +1 -0
  9. package/build/angles.spec.js +147 -0
  10. package/build/angles.spec.js.map +1 -0
  11. package/build/clamp.d.ts +17 -0
  12. package/build/clamp.d.ts.map +1 -0
  13. package/build/clamp.js +19 -0
  14. package/build/clamp.js.map +1 -0
  15. package/build/clamp.spec.d.ts +2 -0
  16. package/build/clamp.spec.d.ts.map +1 -0
  17. package/build/clamp.spec.js +19 -0
  18. package/build/clamp.spec.js.map +1 -0
  19. package/build/documentation-validation.spec.d.ts +11 -0
  20. package/build/documentation-validation.spec.d.ts.map +1 -0
  21. package/build/documentation-validation.spec.js +401 -0
  22. package/build/documentation-validation.spec.js.map +1 -0
  23. package/build/index.d.ts +8 -0
  24. package/build/index.d.ts.map +1 -0
  25. package/build/index.js +8 -0
  26. package/build/index.js.map +1 -0
  27. package/build/interpolation.d.ts +175 -0
  28. package/build/interpolation.d.ts.map +1 -0
  29. package/build/interpolation.js +369 -0
  30. package/build/interpolation.js.map +1 -0
  31. package/build/interpolation.spec.d.ts +2 -0
  32. package/build/interpolation.spec.d.ts.map +1 -0
  33. package/build/interpolation.spec.js +480 -0
  34. package/build/interpolation.spec.js.map +1 -0
  35. package/build/matrices/arithmetic.d.ts +411 -0
  36. package/build/matrices/arithmetic.d.ts.map +1 -0
  37. package/build/matrices/arithmetic.js +954 -0
  38. package/build/matrices/arithmetic.js.map +1 -0
  39. package/build/matrices/arithmetic.spec.d.ts +2 -0
  40. package/build/matrices/arithmetic.spec.d.ts.map +1 -0
  41. package/build/matrices/arithmetic.spec.js +915 -0
  42. package/build/matrices/arithmetic.spec.js.map +1 -0
  43. package/build/matrices/asserts.d.ts +306 -0
  44. package/build/matrices/asserts.d.ts.map +1 -0
  45. package/build/matrices/asserts.js +396 -0
  46. package/build/matrices/asserts.js.map +1 -0
  47. package/build/matrices/asserts.spec.d.ts +2 -0
  48. package/build/matrices/asserts.spec.d.ts.map +1 -0
  49. package/build/matrices/asserts.spec.js +565 -0
  50. package/build/matrices/asserts.spec.js.map +1 -0
  51. package/build/matrices/core.d.ts +168 -0
  52. package/build/matrices/core.d.ts.map +1 -0
  53. package/build/matrices/core.js +457 -0
  54. package/build/matrices/core.js.map +1 -0
  55. package/build/matrices/core.spec.d.ts +2 -0
  56. package/build/matrices/core.spec.d.ts.map +1 -0
  57. package/build/matrices/core.spec.js +634 -0
  58. package/build/matrices/core.spec.js.map +1 -0
  59. package/build/matrices/decompositions.d.ts +326 -0
  60. package/build/matrices/decompositions.d.ts.map +1 -0
  61. package/build/matrices/decompositions.js +816 -0
  62. package/build/matrices/decompositions.js.map +1 -0
  63. package/build/matrices/decompositions.spec.d.ts +2 -0
  64. package/build/matrices/decompositions.spec.d.ts.map +1 -0
  65. package/build/matrices/decompositions.spec.js +195 -0
  66. package/build/matrices/decompositions.spec.js.map +1 -0
  67. package/build/matrices/index.d.ts +9 -0
  68. package/build/matrices/index.d.ts.map +1 -0
  69. package/build/matrices/index.js +9 -0
  70. package/build/matrices/index.js.map +1 -0
  71. package/build/matrices/linear-algebra.d.ts +64 -0
  72. package/build/matrices/linear-algebra.d.ts.map +1 -0
  73. package/build/matrices/linear-algebra.js +253 -0
  74. package/build/matrices/linear-algebra.js.map +1 -0
  75. package/build/matrices/linear-algebra.spec.d.ts +2 -0
  76. package/build/matrices/linear-algebra.spec.d.ts.map +1 -0
  77. package/build/matrices/linear-algebra.spec.js +355 -0
  78. package/build/matrices/linear-algebra.spec.js.map +1 -0
  79. package/build/matrices/normalization.d.ts +62 -0
  80. package/build/matrices/normalization.d.ts.map +1 -0
  81. package/build/matrices/normalization.js +167 -0
  82. package/build/matrices/normalization.js.map +1 -0
  83. package/build/matrices/normalization.spec.d.ts +2 -0
  84. package/build/matrices/normalization.spec.d.ts.map +1 -0
  85. package/build/matrices/normalization.spec.js +335 -0
  86. package/build/matrices/normalization.spec.js.map +1 -0
  87. package/build/matrices/transformations.d.ts +484 -0
  88. package/build/matrices/transformations.d.ts.map +1 -0
  89. package/build/matrices/transformations.js +592 -0
  90. package/build/matrices/transformations.js.map +1 -0
  91. package/build/matrices/transformations.spec.d.ts +2 -0
  92. package/build/matrices/transformations.spec.d.ts.map +1 -0
  93. package/build/matrices/transformations.spec.js +755 -0
  94. package/build/matrices/transformations.spec.js.map +1 -0
  95. package/build/matrices/types.d.ts +134 -0
  96. package/build/matrices/types.d.ts.map +1 -0
  97. package/build/matrices/types.js +6 -0
  98. package/build/matrices/types.js.map +1 -0
  99. package/build/quaternions/asserts.d.ts +77 -0
  100. package/build/quaternions/asserts.d.ts.map +1 -0
  101. package/build/quaternions/asserts.js +175 -0
  102. package/build/quaternions/asserts.js.map +1 -0
  103. package/build/quaternions/asserts.spec.d.ts +2 -0
  104. package/build/quaternions/asserts.spec.d.ts.map +1 -0
  105. package/build/quaternions/asserts.spec.js +320 -0
  106. package/build/quaternions/asserts.spec.js.map +1 -0
  107. package/build/quaternions/conversions.d.ts +73 -0
  108. package/build/quaternions/conversions.d.ts.map +1 -0
  109. package/build/quaternions/conversions.js +179 -0
  110. package/build/quaternions/conversions.js.map +1 -0
  111. package/build/quaternions/conversions.spec.d.ts +2 -0
  112. package/build/quaternions/conversions.spec.d.ts.map +1 -0
  113. package/build/quaternions/conversions.spec.js +344 -0
  114. package/build/quaternions/conversions.spec.js.map +1 -0
  115. package/build/quaternions/core.d.ts +203 -0
  116. package/build/quaternions/core.d.ts.map +1 -0
  117. package/build/quaternions/core.js +374 -0
  118. package/build/quaternions/core.js.map +1 -0
  119. package/build/quaternions/core.spec.d.ts +2 -0
  120. package/build/quaternions/core.spec.d.ts.map +1 -0
  121. package/build/quaternions/core.spec.js +294 -0
  122. package/build/quaternions/core.spec.js.map +1 -0
  123. package/build/quaternions/index.d.ts +7 -0
  124. package/build/quaternions/index.d.ts.map +1 -0
  125. package/build/quaternions/index.js +7 -0
  126. package/build/quaternions/index.js.map +1 -0
  127. package/build/quaternions/interpolation.d.ts +54 -0
  128. package/build/quaternions/interpolation.d.ts.map +1 -0
  129. package/build/quaternions/interpolation.js +201 -0
  130. package/build/quaternions/interpolation.js.map +1 -0
  131. package/build/quaternions/interpolation.spec.d.ts +2 -0
  132. package/build/quaternions/interpolation.spec.d.ts.map +1 -0
  133. package/build/quaternions/interpolation.spec.js +64 -0
  134. package/build/quaternions/interpolation.spec.js.map +1 -0
  135. package/build/quaternions/predefined.d.ts +36 -0
  136. package/build/quaternions/predefined.d.ts.map +1 -0
  137. package/build/quaternions/predefined.js +42 -0
  138. package/build/quaternions/predefined.js.map +1 -0
  139. package/build/quaternions/predefined.spec.d.ts +2 -0
  140. package/build/quaternions/predefined.spec.d.ts.map +1 -0
  141. package/build/quaternions/predefined.spec.js +35 -0
  142. package/build/quaternions/predefined.spec.js.map +1 -0
  143. package/build/quaternions/types.d.ts +55 -0
  144. package/build/quaternions/types.d.ts.map +1 -0
  145. package/build/quaternions/types.js +7 -0
  146. package/build/quaternions/types.js.map +1 -0
  147. package/build/random.d.ts +66 -0
  148. package/build/random.d.ts.map +1 -0
  149. package/build/random.js +115 -0
  150. package/build/random.js.map +1 -0
  151. package/build/random.spec.d.ts +2 -0
  152. package/build/random.spec.d.ts.map +1 -0
  153. package/build/random.spec.js +267 -0
  154. package/build/random.spec.js.map +1 -0
  155. package/build/vectors/asserts.d.ts +182 -0
  156. package/build/vectors/asserts.d.ts.map +1 -0
  157. package/build/vectors/asserts.js +285 -0
  158. package/build/vectors/asserts.js.map +1 -0
  159. package/build/vectors/asserts.spec.d.ts +2 -0
  160. package/build/vectors/asserts.spec.d.ts.map +1 -0
  161. package/build/vectors/asserts.spec.js +260 -0
  162. package/build/vectors/asserts.spec.js.map +1 -0
  163. package/build/vectors/core.d.ts +507 -0
  164. package/build/vectors/core.d.ts.map +1 -0
  165. package/build/vectors/core.js +825 -0
  166. package/build/vectors/core.js.map +1 -0
  167. package/build/vectors/core.spec.d.ts +2 -0
  168. package/build/vectors/core.spec.d.ts.map +1 -0
  169. package/build/vectors/core.spec.js +343 -0
  170. package/build/vectors/core.spec.js.map +1 -0
  171. package/build/vectors/index.d.ts +6 -0
  172. package/build/vectors/index.d.ts.map +1 -0
  173. package/build/vectors/index.js +6 -0
  174. package/build/vectors/index.js.map +1 -0
  175. package/build/vectors/interpolation.d.ts +404 -0
  176. package/build/vectors/interpolation.d.ts.map +1 -0
  177. package/build/vectors/interpolation.js +585 -0
  178. package/build/vectors/interpolation.js.map +1 -0
  179. package/build/vectors/interpolation.spec.d.ts +2 -0
  180. package/build/vectors/interpolation.spec.d.ts.map +1 -0
  181. package/build/vectors/interpolation.spec.js +378 -0
  182. package/build/vectors/interpolation.spec.js.map +1 -0
  183. package/build/vectors/predefined.d.ts +191 -0
  184. package/build/vectors/predefined.d.ts.map +1 -0
  185. package/build/vectors/predefined.js +191 -0
  186. package/build/vectors/predefined.js.map +1 -0
  187. package/build/vectors/predefined.spec.d.ts +2 -0
  188. package/build/vectors/predefined.spec.d.ts.map +1 -0
  189. package/build/vectors/predefined.spec.js +333 -0
  190. package/build/vectors/predefined.spec.js.map +1 -0
  191. package/build/vectors/types.d.ts +62 -0
  192. package/build/vectors/types.d.ts.map +1 -0
  193. package/build/vectors/types.js +6 -0
  194. package/build/vectors/types.js.map +1 -0
  195. package/package.json +75 -0
@@ -0,0 +1,480 @@
1
+ import { AssertNumber } from '@pawells/typescript-common';
2
+ import { LinearInterpolation, SmoothStep, SmootherStep, QuadraticEaseIn, QuadraticEaseOut, CubicEaseIn, CubicEaseOut, CosineInterpolation, SineEaseIn, SineEaseOut, ExponentialEaseIn, ExponentialEaseOut, ElasticEaseOut, BackEaseOut, BounceEaseOut, CatmullRomInterpolation, HermiteInterpolation, CircularEaseIn, CircularEaseOut, StepInterpolation, SphericalLinearInterpolation, } from './interpolation.ts';
3
+ describe('Interpolation', () => {
4
+ const tolerance = 0.0001;
5
+ describe('LinearInterpolation', () => {
6
+ it('should return start value when t = 0', () => {
7
+ expect(LinearInterpolation(10, 20, 0)).toBe(10);
8
+ });
9
+ it('should return end value when t = 1', () => {
10
+ expect(LinearInterpolation(10, 20, 1)).toBe(20);
11
+ });
12
+ it('should return midpoint when t = 0.5', () => {
13
+ expect(LinearInterpolation(10, 20, 0.5)).toBe(15);
14
+ });
15
+ it('should handle negative values', () => {
16
+ expect(LinearInterpolation(-10, 10, 0.5)).toBe(0);
17
+ });
18
+ it('should clamp t values outside [0, 1]', () => {
19
+ expect(LinearInterpolation(10, 20, -0.5)).toBe(5);
20
+ expect(LinearInterpolation(10, 20, 1.5)).toBe(25);
21
+ });
22
+ it('should work with equal start and end values', () => {
23
+ expect(LinearInterpolation(5, 5, 0.5)).toBe(5);
24
+ });
25
+ });
26
+ describe('SmoothStep', () => {
27
+ it('should return start value when t = 0', () => {
28
+ expect(SmoothStep(0, 1, 0)).toBe(0);
29
+ });
30
+ it('should return end value when t = 1', () => {
31
+ expect(SmoothStep(0, 1, 1)).toBe(1);
32
+ });
33
+ it('should have zero derivative at endpoints', () => {
34
+ // Test near endpoints to verify smooth transition
35
+ const nearZero = SmoothStep(0, 1, 0.01);
36
+ const nearOne = SmoothStep(0, 1, 0.99);
37
+ expect(nearZero).toBeCloseTo(0.0003, 4);
38
+ expect(nearOne).toBeCloseTo(0.9997, 4);
39
+ });
40
+ it('should be smooth and monotonic', () => {
41
+ const values = [0, 0.25, 0.5, 0.75, 1].map((t) => SmoothStep(0, 1, t));
42
+ for (let i = 1; i < values.length; i++) {
43
+ const current = values[i];
44
+ const previous = values[i - 1];
45
+ if (current !== undefined && previous !== undefined) {
46
+ expect(current).toBeGreaterThan(previous);
47
+ }
48
+ }
49
+ });
50
+ it('should extrapolate for t < 0 and t > 1', () => {
51
+ expect(SmoothStep(0, 1, -1)).toBeCloseTo(5, 4);
52
+ expect(SmoothStep(0, 1, 2)).toBeCloseTo(-4, 4);
53
+ });
54
+ });
55
+ describe('SmootherStep', () => {
56
+ it('should return start value when t = 0', () => {
57
+ expect(SmootherStep(0, 1, 0)).toBe(0);
58
+ });
59
+ it('should return end value when t = 1', () => {
60
+ expect(SmootherStep(0, 1, 1)).toBe(1);
61
+ });
62
+ it('should be even smoother than SmoothStep', () => {
63
+ const smoothValue = SmoothStep(0, 1, 0.1);
64
+ const smootherValue = SmootherStep(0, 1, 0.1);
65
+ expect(smootherValue).toBeLessThan(smoothValue);
66
+ });
67
+ it('should be monotonic', () => {
68
+ const values = [0, 0.25, 0.5, 0.75, 1].map((t) => SmootherStep(0, 1, t));
69
+ for (let i = 1; i < values.length; i++) {
70
+ const current = values[i];
71
+ const previous = values[i - 1];
72
+ if (current !== undefined && previous !== undefined) {
73
+ expect(current).toBeGreaterThan(previous);
74
+ }
75
+ }
76
+ });
77
+ it('should extrapolate for t < 0 and t > 1', () => {
78
+ expect(SmootherStep(0, 1, -1)).toBeCloseTo(-31, 4);
79
+ expect(SmootherStep(0, 1, 2)).toBeCloseTo(32, 4);
80
+ });
81
+ });
82
+ describe('QuadraticEaseIn', () => {
83
+ it('should start slowly and accelerate', () => {
84
+ expect(QuadraticEaseIn(0, 1, 0)).toBe(0);
85
+ expect(QuadraticEaseIn(0, 1, 1)).toBe(1);
86
+ expect(QuadraticEaseIn(0, 1, 0.5)).toBe(0.25);
87
+ });
88
+ it('should follow quadratic curve (t²)', () => {
89
+ expect(QuadraticEaseIn(0, 100, 0.3)).toBeCloseTo(9, tolerance);
90
+ expect(QuadraticEaseIn(0, 100, 0.7)).toBeCloseTo(49, tolerance);
91
+ });
92
+ it('should extrapolate for t < 0 and t > 1', () => {
93
+ expect(QuadraticEaseIn(0, 1, -1)).toBe(1);
94
+ expect(QuadraticEaseIn(0, 1, 2)).toBe(4);
95
+ });
96
+ describe('QuadraticEaseOut', () => {
97
+ it('should start fast and decelerate', () => {
98
+ expect(QuadraticEaseOut(0, 1, 0)).toBe(0);
99
+ expect(QuadraticEaseOut(0, 1, 1)).toBe(1);
100
+ expect(QuadraticEaseOut(0, 1, 0.5)).toBe(0.75);
101
+ });
102
+ it('should complement QuadraticEaseIn', () => {
103
+ const t = 0.3;
104
+ const easeIn = QuadraticEaseIn(0, 1, t);
105
+ const easeOut = QuadraticEaseOut(0, 1, 1 - t);
106
+ expect(easeOut).toBeCloseTo(1 - easeIn, tolerance);
107
+ });
108
+ it('should extrapolate for t < 0 and t > 1', () => {
109
+ expect(QuadraticEaseOut(0, 1, -1)).toBe(-3);
110
+ expect(QuadraticEaseOut(0, 1, 2)).toBe(0);
111
+ });
112
+ });
113
+ describe('CubicEaseIn', () => {
114
+ it('should follow cubic curve (t³)', () => {
115
+ expect(CubicEaseIn(0, 1, 0)).toBe(0);
116
+ expect(CubicEaseIn(0, 1, 1)).toBe(1);
117
+ expect(CubicEaseIn(0, 1, 0.5)).toBe(0.125);
118
+ });
119
+ it('should accelerate more than quadratic', () => {
120
+ const t = 0.3;
121
+ const quadratic = QuadraticEaseIn(0, 1, t);
122
+ const cubic = CubicEaseIn(0, 1, t);
123
+ expect(cubic).toBeLessThan(quadratic);
124
+ });
125
+ it('should extrapolate for t < 0 and t > 1', () => {
126
+ expect(CubicEaseIn(0, 1, -1)).toBe(-1);
127
+ expect(CubicEaseIn(0, 1, 2)).toBe(8);
128
+ });
129
+ });
130
+ describe('CubicEaseOut', () => {
131
+ it('should follow cubic ease-out curve', () => {
132
+ expect(CubicEaseOut(0, 1, 0)).toBe(0);
133
+ expect(CubicEaseOut(0, 1, 1)).toBe(1);
134
+ expect(CubicEaseOut(0, 1, 0.5)).toBe(0.875);
135
+ });
136
+ it('should extrapolate for t < 0 and t > 1', () => {
137
+ expect(CubicEaseOut(0, 1, -1)).toBe(-7);
138
+ expect(CubicEaseOut(0, 1, 2)).toBe(2);
139
+ });
140
+ });
141
+ describe('CosineInterpolation', () => {
142
+ it('should use cosine curve for smooth interpolation', () => {
143
+ expect(CosineInterpolation(0, 1, 0)).toBe(0);
144
+ expect(CosineInterpolation(0, 1, 1)).toBe(1);
145
+ expect(CosineInterpolation(0, 1, 0.5)).toBeCloseTo(0.5, tolerance);
146
+ });
147
+ it('should be smooth at endpoints', () => {
148
+ const nearZero = CosineInterpolation(0, 1, 0.01);
149
+ const nearOne = CosineInterpolation(0, 1, 0.99);
150
+ expect(nearZero).toBeCloseTo(0, 2);
151
+ expect(nearOne).toBeCloseTo(1, 2);
152
+ });
153
+ it('should extrapolate for t < 0 and t > 1', () => {
154
+ expect(CosineInterpolation(0, 1, -1)).toBeCloseTo(1, tolerance);
155
+ expect(CosineInterpolation(0, 1, 2)).toBeCloseTo(0, tolerance);
156
+ });
157
+ });
158
+ describe('SineEaseIn', () => {
159
+ it('should start slowly using sine curve', () => {
160
+ expect(SineEaseIn(0, 1, 0)).toBe(0);
161
+ expect(SineEaseIn(0, 1, 1)).toBeCloseTo(1, 10);
162
+ const quarterPoint = SineEaseIn(0, 1, 0.25);
163
+ expect(quarterPoint).toBeLessThan(0.25);
164
+ });
165
+ it('should extrapolate for t < 0 and t > 1', () => {
166
+ expect(SineEaseIn(0, 1, -1)).toBeCloseTo(1, tolerance);
167
+ expect(SineEaseIn(0, 1, 2)).toBeCloseTo(2, tolerance);
168
+ });
169
+ });
170
+ describe('SineEaseOut', () => {
171
+ it('should decelerate smoothly using sine curve', () => {
172
+ expect(SineEaseOut(0, 1, 0)).toBe(0);
173
+ expect(SineEaseOut(0, 1, 1)).toBe(1);
174
+ const quarterPoint = SineEaseOut(0, 1, 0.25);
175
+ expect(quarterPoint).toBeGreaterThan(0.25);
176
+ });
177
+ it('should extrapolate for t < 0 and t > 1', () => {
178
+ expect(SineEaseOut(0, 1, -1)).toBeCloseTo(-1, tolerance);
179
+ expect(SineEaseOut(0, 1, 2)).toBeCloseTo(0, tolerance);
180
+ });
181
+ });
182
+ describe('ExponentialEaseIn', () => {
183
+ it('should handle edge cases', () => {
184
+ expect(ExponentialEaseIn(0, 1, 0)).toBe(0);
185
+ expect(ExponentialEaseIn(0, 1, 1)).toBe(1);
186
+ });
187
+ it('should have very slow start', () => {
188
+ const earlyValue = ExponentialEaseIn(0, 1, 0.1);
189
+ expect(earlyValue).toBeCloseTo(0, 2);
190
+ });
191
+ it('should accelerate rapidly near the end', () => {
192
+ const lateValue = ExponentialEaseIn(0, 1, 0.9);
193
+ expect(lateValue).toBeGreaterThan(0.5);
194
+ });
195
+ it('should extrapolate for t < 0 and t > 1', () => {
196
+ expect(ExponentialEaseIn(0, 1, -1)).toBeCloseTo(Math.pow(2, 10 * -2), tolerance);
197
+ expect(ExponentialEaseIn(0, 1, 2)).toBeCloseTo(Math.pow(2, 10 * 1), tolerance);
198
+ });
199
+ });
200
+ describe('ExponentialEaseOut', () => {
201
+ it('should handle edge cases', () => {
202
+ expect(ExponentialEaseOut(0, 1, 0)).toBe(0);
203
+ expect(ExponentialEaseOut(0, 1, 1)).toBe(1);
204
+ });
205
+ it('should start rapidly and slow down', () => {
206
+ const earlyValue = ExponentialEaseOut(0, 1, 0.11);
207
+ expect(earlyValue).toBeGreaterThan(0.5);
208
+ const lateValue = ExponentialEaseOut(0, 1, 0.9);
209
+ expect(lateValue).toBeCloseTo(1, 2);
210
+ });
211
+ it('should extrapolate for t < 0 and t > 1', () => {
212
+ expect(ExponentialEaseOut(0, 1, -1)).toBeCloseTo(1 - Math.pow(2, 10), tolerance);
213
+ expect(ExponentialEaseOut(0, 1, 2)).toBeCloseTo(1 - Math.pow(2, -20), tolerance);
214
+ });
215
+ });
216
+ describe('ElasticEaseOut', () => {
217
+ it('should handle edge cases', () => {
218
+ expect(ElasticEaseOut(0, 1, 0)).toBe(0);
219
+ expect(ElasticEaseOut(0, 1, 1)).toBe(1);
220
+ });
221
+ it('should overshoot and bounce back', () => {
222
+ // Check for overshoot (value > 1 at some point)
223
+ let foundOvershoot = false;
224
+ for (let t = 0.1; t < 1; t += 0.05) {
225
+ const value = ElasticEaseOut(0, 1, t);
226
+ if (value > 1) {
227
+ foundOvershoot = true;
228
+ break;
229
+ }
230
+ }
231
+ expect(foundOvershoot).toBe(true);
232
+ });
233
+ it('should extrapolate for t < 0 and t > 1', () => {
234
+ // Just check it runs and returns a number
235
+ expect(typeof ElasticEaseOut(0, 1, -1)).toBe('number');
236
+ expect(typeof ElasticEaseOut(0, 1, 2)).toBe('number');
237
+ });
238
+ });
239
+ describe('BackEaseOut', () => {
240
+ it('should handle edge cases', () => {
241
+ expect(BackEaseOut(0, 1, 0)).toBeCloseTo(0, 10);
242
+ expect(BackEaseOut(0, 1, 1)).toBeCloseTo(1, 10);
243
+ });
244
+ it('should overshoot before settling', () => {
245
+ // Check for overshoot
246
+ let foundOvershoot = false;
247
+ for (let t = 0.1; t < 1; t += 0.05) {
248
+ const value = BackEaseOut(0, 1, t);
249
+ if (value > 1) {
250
+ foundOvershoot = true;
251
+ break;
252
+ }
253
+ }
254
+ expect(foundOvershoot).toBe(true);
255
+ });
256
+ it('should extrapolate for t < 0 and t > 1', () => {
257
+ // Just check it runs and returns a number
258
+ expect(typeof BackEaseOut(0, 1, -1)).toBe('number');
259
+ expect(typeof BackEaseOut(0, 1, 2)).toBe('number');
260
+ });
261
+ });
262
+ describe('BounceEaseOut', () => {
263
+ it('should handle edge cases', () => {
264
+ expect(BounceEaseOut(0, 1, 0)).toBe(0);
265
+ expect(BounceEaseOut(0, 1, 1)).toBe(1);
266
+ });
267
+ it('should create bouncing effect', () => {
268
+ const values = [];
269
+ for (let t = 0; t <= 1; t += 0.1) {
270
+ values.push(BounceEaseOut(0, 1, t));
271
+ }
272
+ // Should have some non-monotonic behavior (bounces)
273
+ let hasDecrease = false;
274
+ for (let i = 1; i < values.length - 1; i++) {
275
+ const current = values[i];
276
+ AssertNumber(current);
277
+ const next = values[i + 1];
278
+ AssertNumber(next);
279
+ if (current > next) {
280
+ hasDecrease = true;
281
+ break;
282
+ }
283
+ }
284
+ expect(hasDecrease).toBe(true);
285
+ });
286
+ it('should extrapolate for t < 0 and t > 1', () => {
287
+ // Just check it runs and returns a number
288
+ expect(typeof BounceEaseOut(0, 1, -1)).toBe('number');
289
+ expect(typeof BounceEaseOut(0, 1, 2)).toBe('number');
290
+ });
291
+ });
292
+ describe('CatmullRomInterpolation', () => {
293
+ it('should interpolate between p1 and p2', () => {
294
+ expect(CatmullRomInterpolation(0, 1, 2, 3, 0)).toBe(1);
295
+ expect(CatmullRomInterpolation(0, 1, 2, 3, 1)).toBe(2);
296
+ });
297
+ it('should create smooth curve through points', () => {
298
+ const midpoint = CatmullRomInterpolation(0, 1, 2, 3, 0.5);
299
+ expect(midpoint).toBeCloseTo(1.5, tolerance);
300
+ });
301
+ it('should be influenced by neighboring points', () => {
302
+ // Different neighboring points should affect the curve
303
+ const curve1 = CatmullRomInterpolation(0, 1, 2, 3, 0.25);
304
+ const curve2 = CatmullRomInterpolation(-10, 1, 2, 10, 0.25);
305
+ expect(curve1).not.toBeCloseTo(curve2, tolerance);
306
+ });
307
+ it('should extrapolate for t < 0 and t > 1', () => {
308
+ // Just check it runs and returns a number
309
+ expect(typeof CatmullRomInterpolation(0, 1, 2, 3, -1)).toBe('number');
310
+ expect(typeof CatmullRomInterpolation(0, 1, 2, 3, 2)).toBe('number');
311
+ });
312
+ });
313
+ describe('HermiteInterpolation', () => {
314
+ it('should interpolate between p0 and p1', () => {
315
+ expect(HermiteInterpolation(1, 2, 0, 0, 0)).toBe(1);
316
+ expect(HermiteInterpolation(1, 2, 0, 0, 1)).toBe(2);
317
+ });
318
+ it('should respect tangent vectors', () => {
319
+ // Zero tangents should create linear interpolation
320
+ const linear = HermiteInterpolation(0, 1, 0, 0, 0.5);
321
+ expect(linear).toBeCloseTo(0.5, tolerance);
322
+ // Non-zero, non-symmetric tangents should affect the curve
323
+ const curved = HermiteInterpolation(0, 1, 2, 0, 0.5);
324
+ expect(curved).toBeCloseTo(0.75, tolerance);
325
+ });
326
+ it('should extrapolate for t < 0 and t > 1', () => {
327
+ // Just check it runs and returns a number
328
+ expect(typeof HermiteInterpolation(0, 1, 1, 1, -1)).toBe('number');
329
+ expect(typeof HermiteInterpolation(0, 1, 1, 1, 2)).toBe('number');
330
+ });
331
+ });
332
+ describe('CircularEaseIn', () => {
333
+ it('should follow circular arc', () => {
334
+ expect(CircularEaseIn(0, 1, 0)).toBe(0);
335
+ expect(CircularEaseIn(0, 1, 1)).toBe(1);
336
+ });
337
+ it('should start slowly and accelerate', () => {
338
+ const early = CircularEaseIn(0, 1, 0.25);
339
+ expect(early).toBeLessThan(0.25);
340
+ const late = CircularEaseIn(0, 1, 0.75);
341
+ expect(late).toBeGreaterThan(0.3385);
342
+ });
343
+ it('should extrapolate for t < 0 and t > 1', () => {
344
+ // May return NaN for t < 0 or t > 1, but should not throw
345
+ expect(() => CircularEaseIn(0, 1, -1)).not.toThrow();
346
+ expect(() => CircularEaseIn(0, 1, 2)).not.toThrow();
347
+ });
348
+ });
349
+ describe('CircularEaseOut', () => {
350
+ it('should follow circular arc', () => {
351
+ expect(CircularEaseOut(0, 1, 0)).toBe(0);
352
+ expect(CircularEaseOut(0, 1, 1)).toBe(1);
353
+ });
354
+ it('should start fast and decelerate', () => {
355
+ const early = CircularEaseOut(0, 1, 0.25);
356
+ expect(early).toBeGreaterThan(0.25);
357
+ const late = CircularEaseOut(0, 1, 0.75);
358
+ expect(late).toBeGreaterThan(0.75);
359
+ });
360
+ it('should extrapolate for t < 0 and t > 1', () => {
361
+ // May return NaN for t < 0 or t > 1, but should not throw
362
+ expect(() => CircularEaseOut(0, 1, -1)).not.toThrow();
363
+ expect(() => CircularEaseOut(0, 1, 2)).not.toThrow();
364
+ });
365
+ });
366
+ describe('StepInterpolation', () => {
367
+ it('should return start value before threshold', () => {
368
+ expect(StepInterpolation(10, 20, 0.4, 0.5)).toBe(10);
369
+ });
370
+ it('should return end value at or after threshold', () => {
371
+ expect(StepInterpolation(10, 20, 0.5, 0.5)).toBe(20);
372
+ expect(StepInterpolation(10, 20, 0.6, 0.5)).toBe(20);
373
+ });
374
+ it('should use default threshold of 0.5', () => {
375
+ expect(StepInterpolation(10, 20, 0.4)).toBe(10);
376
+ expect(StepInterpolation(10, 20, 0.6)).toBe(20);
377
+ });
378
+ it('should clamp threshold to [0, 1]', () => {
379
+ expect(StepInterpolation(10, 20, 0.5, -0.5)).toBe(20);
380
+ expect(StepInterpolation(10, 20, 0.5, 1.5)).toBe(10);
381
+ });
382
+ });
383
+ describe('SphericalLinearInterpolation', () => {
384
+ it('should behave like linear interpolation for scalars', () => {
385
+ const linear = LinearInterpolation(10, 20, 0.3);
386
+ const spherical = SphericalLinearInterpolation(10, 20, 0.3);
387
+ expect(spherical).toBeCloseTo(linear, tolerance);
388
+ });
389
+ it('should handle edge cases', () => {
390
+ expect(SphericalLinearInterpolation(0, 1, 0)).toBe(0);
391
+ expect(SphericalLinearInterpolation(0, 1, 1)).toBe(1);
392
+ });
393
+ it('should extrapolate for t < 0 and t > 1', () => {
394
+ const linearLow = LinearInterpolation(10, 20, -0.5);
395
+ const sphericalLow = SphericalLinearInterpolation(10, 20, -0.5);
396
+ expect(sphericalLow).toBeCloseTo(linearLow, tolerance);
397
+ const linearHigh = LinearInterpolation(10, 20, 1.5);
398
+ const sphericalHigh = SphericalLinearInterpolation(10, 20, 1.5);
399
+ expect(sphericalHigh).toBeCloseTo(linearHigh, tolerance);
400
+ });
401
+ });
402
+ describe('Parameter validation', () => {
403
+ it('should not clamp t parameter for extrapolating functions', () => {
404
+ const functions = [
405
+ LinearInterpolation,
406
+ SmoothStep,
407
+ SmootherStep,
408
+ QuadraticEaseIn,
409
+ QuadraticEaseOut,
410
+ CubicEaseIn,
411
+ CubicEaseOut,
412
+ CosineInterpolation,
413
+ SineEaseIn,
414
+ SineEaseOut,
415
+ ExponentialEaseIn,
416
+ ExponentialEaseOut,
417
+ ElasticEaseOut,
418
+ BackEaseOut,
419
+ BounceEaseOut,
420
+ CircularEaseIn,
421
+ CircularEaseOut,
422
+ SphericalLinearInterpolation,
423
+ ];
424
+ functions.forEach((func) => {
425
+ // Should extrapolate, not clamp
426
+ expect(func(0, 10, -0.5)).not.toBe(0);
427
+ expect(func(0, 10, 1.5)).not.toBe(10);
428
+ });
429
+ });
430
+ it('should not clamp t for CatmullRomInterpolation', () => {
431
+ expect(CatmullRomInterpolation(0, 1, 2, 3, -0.5)).not.toBe(1);
432
+ expect(CatmullRomInterpolation(0, 1, 2, 3, 1.5)).not.toBe(2);
433
+ });
434
+ it('should not clamp t for HermiteInterpolation', () => {
435
+ expect(HermiteInterpolation(1, 2, 0, 0, -0.5)).not.toBe(1);
436
+ expect(HermiteInterpolation(1, 2, 0, 0, 1.5)).not.toBe(2);
437
+ });
438
+ });
439
+ describe('Edge cases', () => {
440
+ it('should handle zero range (a = b)', () => {
441
+ const functions = [
442
+ LinearInterpolation,
443
+ SmoothStep,
444
+ SmootherStep,
445
+ QuadraticEaseIn,
446
+ QuadraticEaseOut,
447
+ CubicEaseIn,
448
+ CubicEaseOut,
449
+ CosineInterpolation,
450
+ SineEaseIn,
451
+ SineEaseOut,
452
+ ExponentialEaseIn,
453
+ ExponentialEaseOut,
454
+ ElasticEaseOut,
455
+ BackEaseOut,
456
+ BounceEaseOut,
457
+ CircularEaseIn,
458
+ CircularEaseOut,
459
+ SphericalLinearInterpolation,
460
+ ];
461
+ functions.forEach((func) => {
462
+ expect(func(5, 5, 0.5)).toBe(5);
463
+ });
464
+ });
465
+ it('should handle negative values', () => {
466
+ expect(LinearInterpolation(-10, -5, 0.5)).toBe(-7.5);
467
+ expect(SmoothStep(-10, -5, 0.5)).toBeCloseTo(-7.5, 1);
468
+ });
469
+ it('should handle very large values', () => {
470
+ const large = 1e6;
471
+ expect(LinearInterpolation(0, large, 0.5)).toBe(large / 2);
472
+ });
473
+ it('should handle very small values', () => {
474
+ const small = 1e-6;
475
+ expect(LinearInterpolation(0, small, 0.5)).toBeCloseTo(small / 2, 10);
476
+ });
477
+ });
478
+ });
479
+ });
480
+ //# sourceMappingURL=interpolation.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpolation.spec.js","sourceRoot":"","sources":["../src/interpolation.spec.ts"],"names":[],"mappings":"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"}