Skip to content

Commit 11fa40f

Browse files
authored
Fix valueType and add more tests
This does not have immediate observable effects.
1 parent 0eddbf7 commit 11fa40f

File tree

2 files changed

+154
-32
lines changed

2 files changed

+154
-32
lines changed

lib/parsers.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,11 @@ exports.valueType = function valueType(val) {
6262
if (percentRegEx.test(val)) {
6363
return exports.TYPES.PERCENT;
6464
}
65-
if (urlRegEx.test(val)) {
66-
return exports.TYPES.URL;
65+
if (val.startsWith('url(') && val.endsWith(')')) {
66+
if (urlRegEx.test(val)) {
67+
return exports.TYPES.URL;
68+
}
69+
return undefined;
6770
}
6871
if (varRegEx.test(val)) {
6972
return exports.TYPES.VAR;

test/parsers.js

+149-30
Original file line numberDiff line numberDiff line change
@@ -5,74 +5,88 @@ const assert = require('node:assert/strict');
55
const parsers = require('../lib/parsers');
66

77
describe('valueType', () => {
8-
it('returns color for red', () => {
9-
let input = 'red';
8+
it('returns null or empty string for null', () => {
9+
let input = null;
1010
let output = parsers.valueType(input);
1111

12-
assert.strictEqual(output, parsers.TYPES.COLOR);
12+
assert.strictEqual(output, parsers.TYPES.NULL_OR_EMPTY_STR);
1313
});
1414

15-
it('returns color for #nnnnnn', () => {
16-
let input = '#fefefe';
15+
it('returns null or empty string for empty string', () => {
16+
let input = '';
1717
let output = parsers.valueType(input);
1818

19-
assert.strictEqual(output, parsers.TYPES.COLOR);
19+
assert.strictEqual(output, parsers.TYPES.NULL_OR_EMPTY_STR);
2020
});
2121

22-
it('returns color for rgb(n, n, n)', () => {
23-
let input = 'rgb(10, 10, 10)';
22+
it('returns undefined for undefined', () => {
23+
let input = undefined;
2424
let output = parsers.valueType(input);
2525

26-
assert.strictEqual(output, parsers.TYPES.COLOR);
26+
assert.strictEqual(output, undefined);
2727
});
2828

29-
it('returns color for rgb(p, p, p)', () => {
30-
let input = 'rgb(10%, 10%, 10%)';
29+
it('returns integer for 1', () => {
30+
let input = 1;
3131
let output = parsers.valueType(input);
3232

33-
assert.strictEqual(output, parsers.TYPES.COLOR);
33+
assert.strictEqual(output, parsers.TYPES.INTEGER);
3434
});
3535

36-
it('returns color for rgba(n, n, n, n)', () => {
37-
let input = 'rgba(10, 10, 10, 1)';
36+
it('returns number for 1.1', () => {
37+
let input = 1.1;
3838
let output = parsers.valueType(input);
3939

40-
assert.strictEqual(output, parsers.TYPES.COLOR);
40+
assert.strictEqual(output, parsers.TYPES.NUMBER);
4141
});
4242

43-
it('returns color for rgba(n, n, n, n) with decimal alpha', () => {
44-
let input = 'rgba(10, 10, 10, 0.5)';
43+
it('returns length for 100ch', () => {
44+
let input = '100ch';
4545
let output = parsers.valueType(input);
4646

47-
assert.strictEqual(output, parsers.TYPES.COLOR);
47+
assert.strictEqual(output, parsers.TYPES.LENGTH);
4848
});
4949

50-
it('returns color for rgba(p, p, p, n)', () => {
51-
let input = 'rgba(10%, 10%, 10%, 1)';
50+
it('returns percent for 10%', () => {
51+
let input = '10%';
5252
let output = parsers.valueType(input);
5353

54-
assert.strictEqual(output, parsers.TYPES.COLOR);
54+
assert.strictEqual(output, parsers.TYPES.PERCENT);
5555
});
5656

57-
it('returns color for rgba(p, p, p, n) with decimal alpha', () => {
58-
let input = 'rgba(10%, 10%, 10%, 0.5)';
57+
it('returns url for url(https://example.com)', () => {
58+
let input = 'url(https://example.com)';
5959
let output = parsers.valueType(input);
6060

61-
assert.strictEqual(output, parsers.TYPES.COLOR);
61+
assert.strictEqual(output, parsers.TYPES.URL);
6262
});
6363

64-
it('returns color for transparent keyword', () => {
65-
let input = 'transparent';
64+
it('returns url for url("https://example.com")', () => {
65+
let input = 'url("https://example.com")';
6666
let output = parsers.valueType(input);
6767

68-
assert.strictEqual(output, parsers.TYPES.COLOR);
68+
assert.strictEqual(output, parsers.TYPES.URL);
6969
});
7070

71-
it('returns length for 100ch', () => {
72-
let input = '100ch';
71+
it('returns url for url(foo.png)', () => {
72+
let input = 'url(foo.png)';
7373
let output = parsers.valueType(input);
7474

75-
assert.strictEqual(output, parsers.TYPES.LENGTH);
75+
assert.strictEqual(output, parsers.TYPES.URL);
76+
});
77+
78+
it('returns url for url("foo.png")', () => {
79+
let input = 'url("foo.png")';
80+
let output = parsers.valueType(input);
81+
82+
assert.strictEqual(output, parsers.TYPES.URL);
83+
});
84+
85+
it('returns undefined for url(var(--foo))', () => {
86+
let input = 'url(var(--foo))';
87+
let output = parsers.valueType(input);
88+
89+
assert.strictEqual(output, undefined);
7690
});
7791

7892
it('returns var from calc(100px * var(--foo))', () => {
@@ -116,6 +130,111 @@ describe('valueType', () => {
116130

117131
assert.strictEqual(output, parsers.TYPES.CALC);
118132
});
133+
134+
it('returns string from "foo"', () => {
135+
let input = '"foo"';
136+
let output = parsers.valueType(input);
137+
138+
assert.strictEqual(output, parsers.TYPES.STRING);
139+
});
140+
141+
it("returns string from 'foo'", () => {
142+
let input = "'foo'";
143+
let output = parsers.valueType(input);
144+
145+
assert.strictEqual(output, parsers.TYPES.STRING);
146+
});
147+
148+
it('returns angle for 90deg', () => {
149+
let input = '90deg';
150+
let output = parsers.valueType(input);
151+
152+
assert.strictEqual(output, parsers.TYPES.ANGLE);
153+
});
154+
155+
it('returns color for red', () => {
156+
let input = 'red';
157+
let output = parsers.valueType(input);
158+
159+
assert.strictEqual(output, parsers.TYPES.COLOR);
160+
});
161+
162+
it('returns color for #nnnnnn', () => {
163+
let input = '#fefefe';
164+
let output = parsers.valueType(input);
165+
166+
assert.strictEqual(output, parsers.TYPES.COLOR);
167+
});
168+
169+
it('returns color for rgb(n, n, n)', () => {
170+
let input = 'rgb(10, 10, 10)';
171+
let output = parsers.valueType(input);
172+
173+
assert.strictEqual(output, parsers.TYPES.COLOR);
174+
});
175+
176+
it('returns color for rgb(p, p, p)', () => {
177+
let input = 'rgb(10%, 10%, 10%)';
178+
let output = parsers.valueType(input);
179+
180+
assert.strictEqual(output, parsers.TYPES.COLOR);
181+
});
182+
183+
it('returns color for rgba(n, n, n, n)', () => {
184+
let input = 'rgba(10, 10, 10, 1)';
185+
let output = parsers.valueType(input);
186+
187+
assert.strictEqual(output, parsers.TYPES.COLOR);
188+
});
189+
190+
it('returns color for rgba(n, n, n, n) with decimal alpha', () => {
191+
let input = 'rgba(10, 10, 10, 0.5)';
192+
let output = parsers.valueType(input);
193+
194+
assert.strictEqual(output, parsers.TYPES.COLOR);
195+
});
196+
197+
it('returns color for rgba(p, p, p, n)', () => {
198+
let input = 'rgba(10%, 10%, 10%, 1)';
199+
let output = parsers.valueType(input);
200+
201+
assert.strictEqual(output, parsers.TYPES.COLOR);
202+
});
203+
204+
it('returns color for rgba(p, p, p, n) with decimal alpha', () => {
205+
let input = 'rgba(10%, 10%, 10%, 0.5)';
206+
let output = parsers.valueType(input);
207+
208+
assert.strictEqual(output, parsers.TYPES.COLOR);
209+
});
210+
211+
it('returns color for transparent keyword', () => {
212+
let input = 'transparent';
213+
let output = parsers.valueType(input);
214+
215+
assert.strictEqual(output, parsers.TYPES.COLOR);
216+
});
217+
218+
it('returns gradient for linear-gradient(red, blue)', () => {
219+
let input = 'linear-gradient(red, blue)';
220+
let output = parsers.valueType(input);
221+
222+
assert.strictEqual(output, parsers.TYPES.GRADIENT);
223+
});
224+
225+
it('returns color for legacy activeborder', () => {
226+
let input = 'ActiveBorder';
227+
let output = parsers.valueType(input);
228+
229+
assert.strictEqual(output, parsers.TYPES.COLOR);
230+
});
231+
232+
it('returns keyword for else', () => {
233+
let input = 'foo';
234+
let output = parsers.valueType(input);
235+
236+
assert.strictEqual(output, parsers.TYPES.KEYWORD);
237+
});
119238
});
120239

121240
describe('parseInteger', () => {

0 commit comments

Comments
 (0)