Skip to content

Commit a7fe602

Browse files
sammy-SCmeta-codesync[bot]
authored andcommitted
Migrate processBoxShadow tests to Fantom (#55820)
Summary: Pull Request resolved: #55820 changelog: [internal] Add Fantom integration test for processBoxShadow. Uses `fantom_flags enableOptimizedBoxShadowParsing:*` to automatically test both code paths. Reviewed By: joevilches Differential Revision: D94796393 fbshipit-source-id: 5e56ba3c784b896575a534daf6eb05645475354b
1 parent 8cdcdf2 commit a7fe602

2 files changed

Lines changed: 354 additions & 346 deletions

File tree

Lines changed: 354 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,354 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow strict-local
8+
* @fantom_flags enableOptimizedBoxShadowParsing:*
9+
* @format
10+
*/
11+
12+
import '@react-native/fantom/src/setUpDefaultReactNativeEnvironment';
13+
14+
import processBoxShadow from '../processBoxShadow';
15+
import processColor from '../processColor';
16+
17+
describe('processBoxShadow', () => {
18+
describe('string parsing', () => {
19+
it('should parse basic string', () => {
20+
expect(processBoxShadow('10px 5px')).toEqual([
21+
{
22+
offsetX: 10,
23+
offsetY: 5,
24+
},
25+
]);
26+
});
27+
28+
it('should parse basic string with unitless zero length', () => {
29+
expect(processBoxShadow('10px 0')).toEqual([
30+
{
31+
offsetX: 10,
32+
offsetY: 0,
33+
},
34+
]);
35+
});
36+
37+
it('should parse basic string with multiple whitespaces', () => {
38+
expect(processBoxShadow('10px 5px')).toEqual([
39+
{
40+
offsetX: 10,
41+
offsetY: 5,
42+
},
43+
]);
44+
});
45+
46+
it('should parse string with color', () => {
47+
expect(processBoxShadow('red 10px 5px')).toEqual([
48+
{
49+
color: processColor('red'),
50+
offsetX: 10,
51+
offsetY: 5,
52+
},
53+
]);
54+
});
55+
56+
it('should parse string with color function rgba', () => {
57+
expect(processBoxShadow('rgba(255, 255, 255, 0.5) 10px 5px')).toEqual([
58+
{
59+
color: processColor('rgba(255, 255, 255, 0.5)'),
60+
offsetX: 10,
61+
offsetY: 5,
62+
},
63+
]);
64+
});
65+
66+
it('should parse string with color function hsl', () => {
67+
expect(processBoxShadow('hsl(318, 69%, 55%) 10px 5px')).toEqual([
68+
{
69+
color: processColor('hsl(318, 69%, 55%)'),
70+
offsetX: 10,
71+
offsetY: 5,
72+
},
73+
]);
74+
});
75+
76+
it('should parse string with hex color', () => {
77+
expect(processBoxShadow('#FFFFFF 10px 5px')).toEqual([
78+
{
79+
color: processColor('#FFFFFF'),
80+
offsetX: 10,
81+
offsetY: 5,
82+
},
83+
]);
84+
});
85+
86+
it('should parse string with blurRadius', () => {
87+
expect(processBoxShadow('red 10px 5px 2px')).toEqual([
88+
{
89+
color: processColor('red'),
90+
blurRadius: 2,
91+
offsetX: 10,
92+
offsetY: 5,
93+
},
94+
]);
95+
});
96+
97+
it('should parse string with spreadDistance', () => {
98+
expect(processBoxShadow('red 10px 5px 2px 3px')).toEqual([
99+
{
100+
color: processColor('red'),
101+
blurRadius: 2,
102+
offsetX: 10,
103+
offsetY: 5,
104+
spreadDistance: 3,
105+
},
106+
]);
107+
});
108+
109+
it('should parse string arguments with units', () => {
110+
expect(processBoxShadow('5px 2px')).toEqual([
111+
{
112+
offsetX: 5,
113+
offsetY: 2,
114+
},
115+
]);
116+
});
117+
118+
it('should parse string with inset', () => {
119+
expect(processBoxShadow('5px 2px inset')).toEqual([
120+
{
121+
offsetX: 5,
122+
offsetY: 2,
123+
inset: true,
124+
},
125+
]);
126+
});
127+
128+
it('should parse string with inset and color before and after lengths', () => {
129+
expect(processBoxShadow('red 10px 10px inset')).toEqual([
130+
{
131+
color: processColor('red'),
132+
offsetX: 10,
133+
offsetY: 10,
134+
inset: true,
135+
},
136+
]);
137+
});
138+
139+
it('should parse multiple box shadow strings', () => {
140+
expect(
141+
processBoxShadow(
142+
'10px 5px red, 5px 12px inset, inset 10px 45px 13px red',
143+
),
144+
).toEqual([
145+
{
146+
offsetX: 10,
147+
offsetY: 5,
148+
color: processColor('red'),
149+
},
150+
{
151+
offsetX: 5,
152+
offsetY: 12,
153+
inset: true,
154+
},
155+
{
156+
offsetX: 10,
157+
offsetY: 45,
158+
blurRadius: 13,
159+
inset: true,
160+
color: processColor('red'),
161+
},
162+
]);
163+
});
164+
165+
it('should parse multiple box shadow strings with newlines', () => {
166+
expect(
167+
processBoxShadow(
168+
'10px 5px red, 5px 12px inset,\n inset 10px 45px 13px red',
169+
),
170+
).toEqual([
171+
{
172+
offsetX: 10,
173+
offsetY: 5,
174+
color: processColor('red'),
175+
},
176+
{
177+
offsetX: 5,
178+
offsetY: 12,
179+
inset: true,
180+
},
181+
{
182+
offsetX: 10,
183+
offsetY: 45,
184+
blurRadius: 13,
185+
inset: true,
186+
color: processColor('red'),
187+
},
188+
]);
189+
});
190+
191+
it('should parse string with leading dot decimal', () => {
192+
expect(processBoxShadow('.5px 2px')).toEqual([
193+
{
194+
offsetX: 0.5,
195+
offsetY: 2,
196+
},
197+
]);
198+
});
199+
200+
it('should parse string with explicit positive sign', () => {
201+
expect(processBoxShadow('+5px 2px')).toEqual([
202+
{
203+
offsetX: 5,
204+
offsetY: 2,
205+
},
206+
]);
207+
});
208+
});
209+
210+
describe('string parsing failures', () => {
211+
it('should fail to parse string with invalid units', () => {
212+
expect(processBoxShadow('red 10em 5$ 2| 3rp')).toEqual([]);
213+
});
214+
215+
it('should fail to parse too many lengths', () => {
216+
expect(processBoxShadow('10px 5px 2px 3px 10px 10px')).toEqual([]);
217+
});
218+
219+
it('should fail to parse inset between lengths', () => {
220+
expect(processBoxShadow('10px inset 5px 2px 3px,')).toEqual([]);
221+
});
222+
223+
it('should fail to parse double color', () => {
224+
expect(processBoxShadow('red red 10px 5px')).toEqual([]);
225+
});
226+
227+
it('should fail to parse double inset', () => {
228+
expect(processBoxShadow('10px 5px inset inset')).toEqual([]);
229+
});
230+
231+
it('should fail to parse color between lengths', () => {
232+
expect(processBoxShadow('10px red 5px 2px 3px,')).toEqual([]);
233+
});
234+
235+
it('should fail to parse invalid unit', () => {
236+
expect(processBoxShadow('red 10foo 5px 2px 3px,')).toEqual([]);
237+
});
238+
239+
it('should fail to parse decimal number with invalid unit', () => {
240+
expect(processBoxShadow('1.5dog 2px')).toEqual([]);
241+
});
242+
243+
it('should fail to parse invalid argument', () => {
244+
expect(processBoxShadow('red asf 5px 2px 3px')).toEqual([]);
245+
});
246+
247+
it('should fail to parse trailing dot without fractional digits', () => {
248+
expect(processBoxShadow('10.px 5px')).toEqual([]);
249+
});
250+
251+
it('should fail to parse negative blur', () => {
252+
expect(processBoxShadow('red 5px 2px -3px')).toEqual([]);
253+
});
254+
255+
it('should fail to parse missing unit', () => {
256+
expect(processBoxShadow('10px 5')).toEqual([]);
257+
});
258+
});
259+
260+
describe('object parsing', () => {
261+
it('should parse simple object', () => {
262+
expect(
263+
processBoxShadow([
264+
{
265+
offsetX: 10,
266+
offsetY: 5,
267+
},
268+
]),
269+
).toEqual([
270+
{
271+
offsetX: 10,
272+
offsetY: 5,
273+
},
274+
]);
275+
});
276+
277+
it('should parse object with color', () => {
278+
expect(
279+
processBoxShadow([
280+
{
281+
offsetX: 10,
282+
offsetY: 5,
283+
color: 'red',
284+
},
285+
]),
286+
).toEqual([
287+
{
288+
offsetX: 10,
289+
offsetY: 5,
290+
color: processColor('red'),
291+
},
292+
]);
293+
});
294+
295+
it('should parse complex box shadow', () => {
296+
expect(
297+
processBoxShadow([
298+
{
299+
offsetX: '10px',
300+
offsetY: 5,
301+
blurRadius: 2,
302+
spreadDistance: 3,
303+
inset: true,
304+
color: '#FFFFFF',
305+
},
306+
]),
307+
).toEqual([
308+
{
309+
offsetX: 10,
310+
offsetY: 5,
311+
blurRadius: 2,
312+
spreadDistance: 3,
313+
inset: true,
314+
color: processColor('#FFFFFF'),
315+
},
316+
]);
317+
});
318+
319+
it('should fail to parse object with negative blur', () => {
320+
expect(
321+
processBoxShadow([
322+
{
323+
offsetX: 10,
324+
offsetY: 5,
325+
color: 'red',
326+
blurRadius: -3,
327+
},
328+
]),
329+
).toEqual([]);
330+
});
331+
332+
it('should fail to parse object with invalid argument', () => {
333+
expect(
334+
processBoxShadow([
335+
{
336+
offsetX: 10,
337+
offsetY: 'asdf',
338+
},
339+
]),
340+
).toEqual([]);
341+
});
342+
343+
it('should fail to parse object with unitless non-zero string', () => {
344+
expect(
345+
processBoxShadow([
346+
{
347+
offsetX: '5',
348+
offsetY: 10,
349+
},
350+
]),
351+
).toEqual([]);
352+
});
353+
});
354+
});

0 commit comments

Comments
 (0)