-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathrule.js
125 lines (97 loc) · 3.85 KB
/
rule.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
'use strict';
const assert = require('assert');
require('babel-register');
const parse = require('../index').default;
describe('Rule Fragments', () => {
const parseRule = source => parse(source).firstChild;
it('should consume single selector', () => {
const rule = parseRule(' div.class1.class2#id { } ');
assert.equal(rule.start, 2);
assert.equal(rule.end, 26);
assert.equal(rule.selector, 'div.class1.class2#id');
assert.equal(rule.selectorToken.start, 2);
assert.equal(rule.selectorToken.end, 22);
assert.equal(rule.parsedSelector.length, 1);
const selector = rule.parsedSelector[0];
assert.equal(selector.valueOf(), 'div.class1.class2#id');
assert.equal(selector.size, 4);
let item = selector.item(0);
assert.equal(item.type, 'ident');
assert.equal(item.valueOf(), 'div');
item = selector.item(1);
assert.equal(item.type, 'class');
assert.equal(item.valueOf(), '.class1');
assert.equal(item.item(0).valueOf(), 'class1');
item = selector.item(2);
assert.equal(item.type, 'class');
assert.equal(item.valueOf(), '.class2');
assert.equal(item.item(0).valueOf(), 'class2');
item = selector.item(3);
assert.equal(item.type, 'id');
assert.equal(item.valueOf(), '#id');
assert.equal(item.item(0).valueOf(), 'id');
});
it('should consume multiple selectors', () => {
const rule = parseRule('a, [foo="bar,baz"], /* c */ .d { }');
assert.equal(rule.selector, 'a, [foo="bar,baz"], /* c */ .d');
assert.equal(rule.parsedSelector.length, 3);
let selector, item;
selector = rule.parsedSelector[0];
assert.equal(selector.valueOf(), 'a');
assert.equal(selector.size, 1);
selector = rule.parsedSelector[1];
assert.equal(selector.valueOf(), '[foo="bar,baz"]');
assert.equal(selector.size, 1);
item = selector.item(0);
assert.equal(item.type, 'attribute');
assert.equal(item.item(0).valueOf(), 'foo');
assert.equal(item.item(1).valueOf(), '=');
assert.equal(item.item(2).valueOf(), '"bar,baz"');
assert.equal(item.item(2).item(0).valueOf(), 'bar,baz');
selector = rule.parsedSelector[2];
assert.equal(selector.valueOf(), '.d');
assert.equal(selector.size, 1);
});
it('should consume arguments', () => {
const rule = parseRule('@media (min-width: 700px), handheld and (orientation: landscape) { }');
let expr, item, arg;
assert.equal(rule.type, 'at-rule');
assert.equal(rule.name, 'media');
assert.equal(rule.parsedExpression.length, 2);
expr = rule.parsedExpression[0];
assert.equal(expr.valueOf(), '(min-width: 700px)');
item = expr.item(0);
assert.equal(item.type, 'arguments');
assert.equal(item.size, 1);
arg = item.item(0);
assert.equal(arg.type, 'argument');
assert.equal(arg.item(0).type, 'ident');
assert.equal(arg.item(0).valueOf(), 'min-width');
assert.equal(arg.item(1).type, 'separator');
assert.equal(arg.item(1).valueOf(), ':');
assert.equal(arg.item(2).type, 'whitespace');
assert.equal(arg.item(3).type, 'number');
assert.equal(arg.item(3).valueOf(), '700px');
expr = rule.parsedExpression[1];
assert.equal(expr.valueOf(), 'handheld and (orientation: landscape)');
});
it('should consume pseudo-selectors', () => {
const rule = parseRule('a:hover, b::before { }');
assert.equal(rule.selector, 'a:hover, b::before');
assert.equal(rule.parsedSelector.length, 2);
let sel = rule.parsedSelector[0];
assert.equal(sel.size, 2);
assert.equal(sel.item(0).type, 'ident');
assert.equal(sel.item(0).valueOf(), 'a');
assert.equal(sel.item(1).type, 'pseudo');
assert.equal(sel.item(1).valueOf(), ':hover');
assert.equal(sel.item(1).item(0).valueOf(), 'hover');
sel = rule.parsedSelector[1];
assert.equal(sel.size, 2);
assert.equal(sel.item(0).type, 'ident');
assert.equal(sel.item(0).valueOf(), 'b');
assert.equal(sel.item(1).type, 'pseudo');
assert.equal(sel.item(1).valueOf(), '::before');
assert.equal(sel.item(1).item(0).valueOf(), 'before');
});
});