Skip to content

Commit 2442f28

Browse files
authored
chore: Web CSS transition properties normalization tests (#8635)
## Summary This PR adds tests for the web CSS transition properties normalization functions.
1 parent 45bbfef commit 2442f28

File tree

2 files changed

+160
-1
lines changed

2 files changed

+160
-1
lines changed
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
'use strict';
2+
import { cubicBezier, steps } from '../../../easing';
3+
import type { CSSTransitionProperties } from '../../../types';
4+
import {
5+
normalizeCSSTransitionProperties,
6+
parseTransitionShorthand,
7+
} from '../transition';
8+
9+
describe(parseTransitionShorthand, () => {
10+
test('returns default timing values when shorthand is empty string', () => {
11+
expect(parseTransitionShorthand('')).toEqual({
12+
transitionProperty: [''],
13+
transitionDuration: ['0s'],
14+
transitionTimingFunction: ['ease'],
15+
transitionDelay: ['0s'],
16+
transitionBehavior: ['normal'],
17+
});
18+
});
19+
20+
test('parses a single shorthand entry including all values', () => {
21+
expect(
22+
parseTransitionShorthand('opacity 150ms ease-in 75ms allow-discrete')
23+
).toEqual({
24+
transitionProperty: ['opacity'],
25+
transitionDuration: ['150ms'],
26+
transitionTimingFunction: ['ease-in'],
27+
transitionDelay: ['75ms'],
28+
transitionBehavior: ['allow-discrete'],
29+
});
30+
});
31+
32+
test('fills missing shorthand parts with defaults', () => {
33+
expect(parseTransitionShorthand('opacity 200ms')).toEqual({
34+
transitionProperty: ['opacity'],
35+
transitionDuration: ['200ms'],
36+
transitionTimingFunction: ['ease'],
37+
transitionDelay: ['0s'],
38+
transitionBehavior: ['normal'],
39+
});
40+
});
41+
42+
test('splits comma-separated shorthand entries', () => {
43+
expect(
44+
parseTransitionShorthand(
45+
'opacity 100ms ease-in 25ms, transform 1s ease-out, color 200ms'
46+
)
47+
).toEqual({
48+
transitionProperty: ['opacity', 'transform', 'color'],
49+
transitionDuration: ['100ms', '1s', '200ms'],
50+
transitionTimingFunction: ['ease-in', 'ease-out', 'ease'],
51+
transitionDelay: ['25ms', '0s', '0s'],
52+
transitionBehavior: ['normal', 'normal', 'normal'],
53+
});
54+
});
55+
});
56+
57+
describe(normalizeCSSTransitionProperties, () => {
58+
test('returns empty arrays when nothing is provided', () => {
59+
expect(normalizeCSSTransitionProperties({})).toEqual({
60+
transitionProperty: [],
61+
transitionDuration: [],
62+
transitionTimingFunction: [],
63+
transitionDelay: [],
64+
transitionBehavior: [],
65+
});
66+
});
67+
68+
test('wraps primitive values into arrays', () => {
69+
const config: CSSTransitionProperties = {
70+
transitionProperty: 'opacity',
71+
transitionDuration: '150ms',
72+
transitionTimingFunction: 'ease-in',
73+
transitionDelay: 200,
74+
transitionBehavior: 'normal',
75+
};
76+
77+
expect(normalizeCSSTransitionProperties(config)).toEqual({
78+
transitionProperty: ['opacity'],
79+
transitionDuration: ['150ms'],
80+
transitionTimingFunction: ['ease-in'],
81+
transitionDelay: [200],
82+
transitionBehavior: ['normal'],
83+
});
84+
});
85+
86+
test('preserves array inputs', () => {
87+
const config: CSSTransitionProperties = {
88+
transitionProperty: ['opacity', 'transform'],
89+
transitionDuration: ['150ms', '300ms'],
90+
transitionTimingFunction: ['ease-in', 'linear'],
91+
transitionDelay: ['200ms', '150ms'],
92+
transitionBehavior: ['allow-discrete', 'normal'],
93+
};
94+
95+
expect(normalizeCSSTransitionProperties(config)).toEqual({
96+
transitionProperty: ['opacity', 'transform'],
97+
transitionDuration: ['150ms', '300ms'],
98+
transitionTimingFunction: ['ease-in', 'linear'],
99+
transitionDelay: ['200ms', '150ms'],
100+
transitionBehavior: ['allow-discrete', 'normal'],
101+
});
102+
});
103+
104+
test('preserves different array lengths across transition fields', () => {
105+
const config: CSSTransitionProperties = {
106+
transitionProperty: ['opacity', 'width', 'transform'],
107+
transitionDuration: ['150ms'],
108+
transitionTimingFunction: ['ease-in', 'linear'],
109+
transitionDelay: ['200ms', '150ms', '100ms', '50ms'],
110+
transitionBehavior: ['allow-discrete'],
111+
};
112+
113+
expect(normalizeCSSTransitionProperties(config)).toEqual({
114+
transitionProperty: ['opacity', 'width', 'transform'],
115+
transitionDuration: ['150ms'],
116+
transitionTimingFunction: ['ease-in', 'linear'],
117+
transitionDelay: ['200ms', '150ms', '100ms', '50ms'],
118+
transitionBehavior: ['allow-discrete'],
119+
});
120+
});
121+
122+
test('keeps easing instances for serialization', () => {
123+
const easing = cubicBezier(0.42, 0, 0.58, 1);
124+
125+
expect(
126+
normalizeCSSTransitionProperties({ transitionTimingFunction: easing })
127+
).toEqual(expect.objectContaining({ transitionTimingFunction: [easing] }));
128+
});
129+
130+
test('clears transition arrays when transition string is empty', () => {
131+
expect(normalizeCSSTransitionProperties({ transition: '' })).toEqual({
132+
transitionProperty: [],
133+
transitionDuration: [],
134+
transitionTimingFunction: [],
135+
transitionDelay: [],
136+
transitionBehavior: [],
137+
transition: [''],
138+
});
139+
});
140+
141+
test('allows explicit properties to override shorthand values', () => {
142+
const easing = steps(4, 'start');
143+
const config: CSSTransitionProperties = {
144+
transition: 'opacity 100ms ease-in, transform 1s linear 300ms',
145+
transitionDuration: ['200ms', '50ms'],
146+
transitionTimingFunction: easing,
147+
transitionDelay: ['50ms', '125ms'],
148+
};
149+
150+
expect(normalizeCSSTransitionProperties(config)).toEqual({
151+
transitionProperty: ['opacity', 'transform'],
152+
transitionDuration: ['200ms', '50ms'],
153+
transitionTimingFunction: [easing],
154+
transitionDelay: ['50ms', '125ms'],
155+
transitionBehavior: ['normal', 'normal'],
156+
transition: ['opacity 100ms ease-in, transform 1s linear 300ms'],
157+
});
158+
});
159+
});

packages/react-native-reanimated/src/css/web/normalization/transition.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const createEmptyTransitionConfig =
1717
transitionBehavior: [],
1818
});
1919

20-
function parseTransitionShorthand(value: string) {
20+
export function parseTransitionShorthand(value: string) {
2121
return splitByComma(value).reduce<ExpandedCSSTransitionConfigProperties>(
2222
(acc, part) => {
2323
const result = parseSingleTransitionShorthand(part);

0 commit comments

Comments
 (0)