Skip to content

Commit c895820

Browse files
committed
Added easing functions
1 parent b3af855 commit c895820

8 files changed

Lines changed: 1017 additions & 295 deletions

File tree

package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "lup-utils",
3-
"version": "1.2.5",
3+
"version": "1.3.0",
44
"description": "NodeJS library providing utility functions.",
55
"main": "./lib/index",
66
"types": "./lib/index.d.ts",
@@ -10,6 +10,10 @@
1010
"types": "./lib/index.d.ts",
1111
"default": "./lib/index.js"
1212
},
13+
"./easing-functions": {
14+
"types": "./lib/easing-functions.d.ts",
15+
"default": "./lib/easing-functions.js"
16+
},
1317
"./json": {
1418
"types": "./lib/json.d.ts",
1519
"default": "./lib/json.js"
Lines changed: 321 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,321 @@
1+
/// <reference types="jest" />
2+
3+
import {
4+
easeCubicBezier,
5+
easeInBack,
6+
easeInBounce,
7+
easeInCirc,
8+
easeInCubic,
9+
easeInElastic,
10+
easeInExpo,
11+
easeInOutBack,
12+
easeInOutBounce,
13+
easeInOutCirc,
14+
easeInOutCubic,
15+
easeInOutElastic,
16+
easeInOutExpo,
17+
easeInOutQuad,
18+
easeInOutQuart,
19+
easeInOutQuint,
20+
easeInOutSine,
21+
easeInQuad,
22+
easeInQuart,
23+
easeInQuint,
24+
easeInSine,
25+
easeOutBack,
26+
easeOutBounce,
27+
easeOutCirc,
28+
easeOutCubic,
29+
easeOutElastic,
30+
easeOutExpo,
31+
easeOutQuad,
32+
easeOutQuart,
33+
easeOutQuint,
34+
easeOutSine,
35+
} from '../easing-functions';
36+
37+
const ROUNDING_DIGITS = 1;
38+
39+
function compareFunctions(funcToTest: (x: number) => number, expectedResultFunc: (x: number) => number) {
40+
for (let step = 0; step <= 100; step++) {
41+
const x = step / 100.0;
42+
const r1 = funcToTest(x);
43+
const r2 = expectedResultFunc(x);
44+
expect(r1).toBeCloseTo(r2, ROUNDING_DIGITS);
45+
}
46+
}
47+
48+
function checkResultWithin0And1(func: (x: number) => number) {
49+
for (let step = 0; step <= 100; step++) {
50+
const x = step / 100.0;
51+
const r = func(x);
52+
expect(r).toBeGreaterThanOrEqual(0);
53+
expect(r).toBeLessThanOrEqual(1);
54+
}
55+
}
56+
57+
describe('easing-functions.ts', () => {
58+
test('easeInSine', () => {
59+
expect(easeInSine(0)).toBeCloseTo(0);
60+
expect(easeInSine(1)).toBeCloseTo(1);
61+
checkResultWithin0And1(easeInSine);
62+
63+
const cubicBezier = easeCubicBezier(0.12, 0, 0.39, 0);
64+
compareFunctions(easeInSine, cubicBezier);
65+
});
66+
67+
test('easeInQuad', () => {
68+
expect(easeInQuad(0)).toBeCloseTo(0);
69+
expect(easeInQuad(1)).toBeCloseTo(1);
70+
checkResultWithin0And1(easeInQuad);
71+
72+
const cubicBezier = easeCubicBezier(0.11, 0, 0.5, 0);
73+
compareFunctions(easeInQuad, cubicBezier);
74+
});
75+
76+
test('easeInCubic', () => {
77+
expect(easeInCubic(0)).toBeCloseTo(0);
78+
expect(easeInCubic(1)).toBeCloseTo(1);
79+
checkResultWithin0And1(easeInCubic);
80+
81+
const cubicBezier = easeCubicBezier(0.32, 0, 0.67, 0);
82+
compareFunctions(easeInCubic, cubicBezier);
83+
});
84+
85+
test('easeInQuart', () => {
86+
expect(easeInQuart(0)).toBeCloseTo(0);
87+
expect(easeInQuart(1)).toBeCloseTo(1);
88+
checkResultWithin0And1(easeInQuart);
89+
90+
const cubicBezier = easeCubicBezier(0.5, 0, 0.75, 0);
91+
compareFunctions(easeInQuart, cubicBezier);
92+
});
93+
94+
test('easeInQuint', () => {
95+
expect(easeInQuint(0)).toBeCloseTo(0);
96+
expect(easeInQuint(1)).toBeCloseTo(1);
97+
checkResultWithin0And1(easeInQuint);
98+
99+
const cubicBezier = easeCubicBezier(0.64, 0, 0.78, 0);
100+
compareFunctions(easeInQuint, cubicBezier);
101+
});
102+
103+
test('easeInCirc', () => {
104+
expect(easeInCirc(0)).toBeCloseTo(0);
105+
expect(easeInCirc(1)).toBeCloseTo(1);
106+
checkResultWithin0And1(easeInCirc);
107+
108+
const cubicBezier = easeCubicBezier(0.55, 0, 1, 0.45);
109+
compareFunctions(easeInCirc, cubicBezier);
110+
});
111+
112+
test('easeInExpo', () => {
113+
expect(easeInExpo(0)).toBeCloseTo(0);
114+
expect(easeInExpo(1)).toBeCloseTo(1);
115+
checkResultWithin0And1(easeInExpo);
116+
117+
const cubicBezier = easeCubicBezier(0.7, 0, 0.84, 0);
118+
compareFunctions(easeInExpo, cubicBezier);
119+
});
120+
121+
test('easeInBack', () => {
122+
expect(easeInBack(0)).toBeCloseTo(0);
123+
expect(easeInBack(1)).toBeCloseTo(1);
124+
// expected to be outside of 0 and 1 for some x values, so no check here
125+
126+
const cubicBezier = easeCubicBezier(0.36, 0, 0.66, -0.56);
127+
compareFunctions(easeInBack, cubicBezier);
128+
});
129+
130+
test('easeInElastic', () => {
131+
expect(easeInElastic(0)).toBeCloseTo(0);
132+
expect(easeInElastic(1)).toBeCloseTo(1);
133+
// expected to be outside of 0 and 1 for some x values, so no check here
134+
135+
// no cubic bezier approximation
136+
});
137+
138+
test('easeInBounce', () => {
139+
expect(easeInBounce(0)).toBeCloseTo(0);
140+
expect(easeInBounce(1)).toBeCloseTo(1);
141+
checkResultWithin0And1(easeInBounce);
142+
143+
// no cubic bezier approximation
144+
});
145+
146+
test('easeOutSine', () => {
147+
expect(easeOutSine(0)).toBeCloseTo(0);
148+
expect(easeOutSine(1)).toBeCloseTo(1);
149+
checkResultWithin0And1(easeOutSine);
150+
151+
const cubicBezier = easeCubicBezier(0.61, 1, 0.88, 1);
152+
compareFunctions(easeOutSine, cubicBezier);
153+
});
154+
155+
test('easeOutQuad', () => {
156+
expect(easeOutQuad(0)).toBeCloseTo(0);
157+
expect(easeOutQuad(1)).toBeCloseTo(1);
158+
checkResultWithin0And1(easeOutQuad);
159+
160+
const cubicBezier = easeCubicBezier(0.5, 1, 0.89, 1);
161+
compareFunctions(easeOutQuad, cubicBezier);
162+
});
163+
164+
test('easeOutCubic', () => {
165+
expect(easeOutCubic(0)).toBeCloseTo(0);
166+
expect(easeOutCubic(1)).toBeCloseTo(1);
167+
checkResultWithin0And1(easeOutCubic);
168+
169+
const cubicBezier = easeCubicBezier(0.33, 1, 0.68, 1);
170+
compareFunctions(easeOutCubic, cubicBezier);
171+
});
172+
173+
test('easeOutQuart', () => {
174+
expect(easeOutQuart(0)).toBeCloseTo(0);
175+
expect(easeOutQuart(1)).toBeCloseTo(1);
176+
checkResultWithin0And1(easeOutQuart);
177+
178+
const cubicBezier = easeCubicBezier(0.25, 1, 0.5, 1);
179+
compareFunctions(easeOutQuart, cubicBezier);
180+
});
181+
182+
test('easeOutQuint', () => {
183+
expect(easeOutQuint(0)).toBeCloseTo(0);
184+
expect(easeOutQuint(1)).toBeCloseTo(1);
185+
checkResultWithin0And1(easeOutQuint);
186+
187+
const cubicBezier = easeCubicBezier(0.22, 1, 0.36, 1);
188+
compareFunctions(easeOutQuint, cubicBezier);
189+
});
190+
191+
test('easeOutCirc', () => {
192+
expect(easeOutCirc(0)).toBeCloseTo(0);
193+
expect(easeOutCirc(1)).toBeCloseTo(1);
194+
checkResultWithin0And1(easeOutCirc);
195+
196+
const cubicBezier = easeCubicBezier(0, 0.55, 0.45, 1);
197+
compareFunctions(easeOutCirc, cubicBezier);
198+
});
199+
200+
test('easeOutExpo', () => {
201+
expect(easeOutExpo(0)).toBeCloseTo(0);
202+
expect(easeOutExpo(1)).toBeCloseTo(1);
203+
checkResultWithin0And1(easeOutExpo);
204+
205+
const cubicBezier = easeCubicBezier(0.16, 1, 0.3, 1);
206+
compareFunctions(easeOutExpo, cubicBezier);
207+
});
208+
209+
test('easeOutBack', () => {
210+
expect(easeOutBack(0)).toBeCloseTo(0);
211+
expect(easeOutBack(1)).toBeCloseTo(1);
212+
// expected to be outside of 0 and 1 for some x values, so no check here
213+
214+
const cubicBezier = easeCubicBezier(0.34, 1.56, 0.64, 1);
215+
compareFunctions(easeOutBack, cubicBezier);
216+
});
217+
218+
test('easeOutElastic', () => {
219+
expect(easeOutElastic(0)).toBeCloseTo(0);
220+
expect(easeOutElastic(1)).toBeCloseTo(1);
221+
// expected to be outside of 0 and 1 for some x values, so no check here
222+
223+
// no cubic bezier approximation
224+
});
225+
226+
test('easeOutBounce', () => {
227+
expect(easeOutBounce(0)).toBeCloseTo(0);
228+
expect(easeOutBounce(1)).toBeCloseTo(1);
229+
checkResultWithin0And1(easeOutBounce);
230+
231+
// no cubic bezier approximation
232+
});
233+
234+
test('easeInOutSine', () => {
235+
expect(easeInOutSine(0)).toBeCloseTo(0);
236+
expect(easeInOutSine(1)).toBeCloseTo(1);
237+
checkResultWithin0And1(easeInOutSine);
238+
239+
const cubicBezier = easeCubicBezier(0.37, 0, 0.63, 1);
240+
compareFunctions(easeInOutSine, cubicBezier);
241+
});
242+
243+
test('easeInOutQuad', () => {
244+
expect(easeInOutQuad(0)).toBeCloseTo(0);
245+
expect(easeInOutQuad(1)).toBeCloseTo(1);
246+
checkResultWithin0And1(easeInOutQuad);
247+
248+
const cubicBezier = easeCubicBezier(0.45, 0, 0.55, 1);
249+
compareFunctions(easeInOutQuad, cubicBezier);
250+
});
251+
252+
test('easeInOutCubic', () => {
253+
expect(easeInOutCubic(0)).toBeCloseTo(0);
254+
expect(easeInOutCubic(1)).toBeCloseTo(1);
255+
checkResultWithin0And1(easeInOutCubic);
256+
257+
const cubicBezier = easeCubicBezier(0.65, 0, 0.35, 1);
258+
compareFunctions(easeInOutCubic, cubicBezier);
259+
});
260+
261+
test('easeInOutQuart', () => {
262+
expect(easeInOutQuart(0)).toBeCloseTo(0);
263+
expect(easeInOutQuart(1)).toBeCloseTo(1);
264+
checkResultWithin0And1(easeInOutQuart);
265+
266+
const cubicBezier = easeCubicBezier(0.76, 0, 0.24, 1);
267+
compareFunctions(easeInOutQuart, cubicBezier);
268+
});
269+
270+
test('easeInOutQuint', () => {
271+
expect(easeInOutQuint(0)).toBeCloseTo(0);
272+
expect(easeInOutQuint(1)).toBeCloseTo(1);
273+
checkResultWithin0And1(easeInOutQuint);
274+
275+
const cubicBezier = easeCubicBezier(0.83, 0, 0.17, 1);
276+
compareFunctions(easeInOutQuint, cubicBezier);
277+
});
278+
279+
test('easeInOutCirc', () => {
280+
expect(easeInOutCirc(0)).toBeCloseTo(0);
281+
expect(easeInOutCirc(1)).toBeCloseTo(1);
282+
checkResultWithin0And1(easeInOutCirc);
283+
284+
const cubicBezier = easeCubicBezier(0.85, 0, 0.15, 1);
285+
compareFunctions(easeInOutCirc, cubicBezier);
286+
});
287+
288+
test('easeInOutExpo', () => {
289+
expect(easeInOutExpo(0)).toBeCloseTo(0);
290+
expect(easeInOutExpo(1)).toBeCloseTo(1);
291+
checkResultWithin0And1(easeInOutExpo);
292+
293+
const cubicBezier = easeCubicBezier(0.87, 0, 0.13, 1);
294+
compareFunctions(easeInOutExpo, cubicBezier);
295+
});
296+
297+
test('easeInOutBack', () => {
298+
expect(easeInOutBack(0)).toBeCloseTo(0);
299+
expect(easeInOutBack(1)).toBeCloseTo(1);
300+
// expected to be outside of 0 and 1 for some x values, so no check here
301+
302+
const cubicBezier = easeCubicBezier(0.68, -0.6, 0.32, 1.6);
303+
compareFunctions(easeInOutBack, cubicBezier);
304+
});
305+
306+
test('easeInOutElastic', () => {
307+
expect(easeInOutElastic(0)).toBeCloseTo(0);
308+
expect(easeInOutElastic(1)).toBeCloseTo(1);
309+
// expected to be outside of 0 and 1 for some x values, so no check here
310+
311+
// no cubic bezier approximation
312+
});
313+
314+
test('easeInOutBounce', () => {
315+
expect(easeInOutBounce(0)).toBeCloseTo(0);
316+
expect(easeInOutBounce(1)).toBeCloseTo(1);
317+
checkResultWithin0And1(easeInOutBounce);
318+
319+
// no cubic bezier approximation
320+
});
321+
});

0 commit comments

Comments
 (0)