crass 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,69 @@
1
+ # encoding: utf-8
2
+
3
+ # Includes tests based on Simon Sapin's CSS parsing tests:
4
+ # https://github.com/SimonSapin/css-parsing-tests/
5
+
6
+ require_relative 'support/common'
7
+ require_relative 'shared/parse_rules'
8
+
9
+ describe 'Crass::Parser' do
10
+ make_my_diffs_pretty!
11
+ parallelize_me!
12
+
13
+ describe '#parse_rules' do
14
+ def parse(*args)
15
+ CP.parse_rules(*args)
16
+ end
17
+
18
+ behaves_like 'parsing a list of rules'
19
+
20
+ it 'with CDO/CDC before rule' do
21
+ tree = parse(" <!-- --> {")
22
+
23
+ assert_equal(2, tree.size)
24
+ assert_tokens(" ", tree[0])
25
+
26
+ rule = tree[1]
27
+ assert_equal(:style_rule, rule[:node])
28
+ assert_equal([], rule[:children])
29
+
30
+ selector = rule[:selector]
31
+ assert_equal(:selector, selector[:node])
32
+ assert_equal("<!-- -->", selector[:value])
33
+ assert_tokens("<!-- --> ", selector[:tokens], 1)
34
+ end
35
+
36
+ it 'followed by CDC' do
37
+ # TODO: This should be a parse error.
38
+ tree = parse("div {} -->")
39
+
40
+ assert_equal(2, tree.size)
41
+
42
+ rule = tree[0]
43
+ assert_equal(:style_rule, rule[:node])
44
+ assert_equal([], rule[:children])
45
+
46
+ selector = rule[:selector]
47
+ assert_equal(:selector, selector[:node])
48
+ assert_equal("div", selector[:value])
49
+ assert_tokens("div ", selector[:tokens])
50
+
51
+ assert_tokens(" ", tree[1], 6)
52
+ end
53
+
54
+ it 'should parse the block of an at-rule' do
55
+ rule = CP.parse_stylesheet("@media (max-width: 400px) {.foo{color:#fff;}}")[0]
56
+ assert_equal(:at_rule, rule[:node])
57
+
58
+ style_rule = parse(rule[:block][:value])[0]
59
+ assert_equal(:style_rule, style_rule[:node])
60
+ assert_equal(".foo", style_rule[:selector][:value])
61
+ assert_equal(1, style_rule[:children].size)
62
+
63
+ prop = style_rule[:children][0]
64
+ assert_equal(:property, prop[:node])
65
+ assert_equal("color", prop[:name])
66
+ assert_equal("#fff", prop[:value])
67
+ end
68
+ end
69
+ end
@@ -4,377 +4,53 @@
4
4
  # https://github.com/SimonSapin/css-parsing-tests/
5
5
 
6
6
  require_relative 'support/common'
7
+ require_relative 'shared/parse_rules'
7
8
 
8
9
  describe 'Crass::Parser' do
9
- describe '#parse_stylesheet' do
10
- it 'should parse an empty stylesheet' do
11
- assert_equal [], CP.parse_stylesheet('')
12
- assert_equal [], CP.parse_stylesheet('foo')
13
- assert_equal [], CP.parse_stylesheet('foo 4')
14
- end
15
-
16
- describe 'should parse an at-rule' do
17
- describe 'without a block' do
18
- it 'without a prelude' do
19
- tree = CP.parse_stylesheet('@foo')
20
- rule = tree[0]
21
-
22
- assert_equal 1, tree.size
23
- assert_equal :at_rule, rule[:node]
24
- assert_equal "foo", rule[:name]
25
- assert_equal [], rule[:prelude]
26
- assert_tokens "@foo", rule[:tokens]
27
- end
28
-
29
- it 'with a prelude followed by a comment' do
30
- tree = CP.parse_stylesheet("@foo bar; \t/* comment */")
31
- rule = tree[0]
32
-
33
- assert_equal 2, tree.size
34
- assert_equal :at_rule, rule[:node]
35
- assert_equal "foo", rule[:name]
36
- assert_tokens " bar", rule[:prelude], 4
37
- assert_tokens "@foo bar;", rule[:tokens]
38
- assert_tokens " \t", tree[1], 9
39
- end
40
-
41
- it 'with a prelude followed by a comment, when :preserve_comments == true' do
42
- options = {:preserve_comments => true}
43
- tree = CP.parse_stylesheet("@foo bar; \t/* comment */", options)
44
- rule = tree[0]
45
-
46
- assert_equal 3, tree.size
47
- assert_equal :at_rule, rule[:node]
48
- assert_equal "foo", rule[:name]
49
- assert_tokens " bar", rule[:prelude], 4, options
50
- assert_tokens "@foo bar;", rule[:tokens], 0, options
51
- assert_tokens " \t", tree[1], 9, options
52
- assert_tokens "/* comment */", tree[2], 11, options
53
- end
54
-
55
- it 'with a prelude containing a simple block' do
56
- tree = CP.parse_stylesheet("@foo [ bar")
57
- rule = tree[0]
58
-
59
- assert_equal 1, tree.size
60
- assert_equal :at_rule, rule[:node]
61
- assert_equal "foo", rule[:name]
62
- assert_tokens "@foo [ bar", rule[:tokens]
63
-
64
- prelude = rule[:prelude]
65
- assert_equal 2, prelude.size
66
- assert_tokens " ", prelude[0], 4
67
-
68
- block = prelude[1]
69
- assert_equal :simple_block, block[:node]
70
- assert_equal "[", block[:start]
71
- assert_equal "]", block[:end]
72
- assert_tokens "[ bar", block[:tokens], 5
73
- assert_tokens " bar", block[:value], 6
74
- end
75
- end
76
-
77
- describe 'with a block' do
78
- it 'unclosed' do
79
- tree = CP.parse_stylesheet("@foo { bar")
80
- rule = tree[0]
81
-
82
- assert_equal 1, tree.size
83
- assert_equal :at_rule, rule[:node]
84
- assert_equal "foo", rule[:name]
85
- assert_tokens " ", rule[:prelude], 4
86
- assert_tokens "@foo { bar", rule[:tokens]
87
-
88
- block = rule[:block]
89
- assert_equal :simple_block, block[:node]
90
- assert_equal "{", block[:start]
91
- assert_equal "}", block[:end]
92
- assert_tokens "{ bar", block[:tokens], 5
93
- assert_tokens " bar", block[:value], 6
94
- end
95
-
96
- it 'unclosed, preceded by a comment' do
97
- tree = CP.parse_stylesheet(" /**/ @foo bar{[(4")
98
- rule = tree[2]
99
-
100
- assert_equal 3, tree.size
101
- assert_tokens " /**/ ", tree[0..1]
102
- assert_equal :at_rule, rule[:node]
103
- assert_equal "foo", rule[:name]
104
- assert_tokens " bar", rule[:prelude], 10
105
- assert_tokens "@foo bar{[(4", rule[:tokens], 6
106
-
107
- block = rule[:block]
108
- assert_equal :simple_block, block[:node]
109
- assert_equal "{", block[:start]
110
- assert_equal "}", block[:end]
111
- assert_tokens "{[(4", block[:tokens], 14
112
- assert_equal 1, block[:value].size
113
-
114
- block = block[:value].first
115
- assert_equal :simple_block, block[:node]
116
- assert_equal "[", block[:start]
117
- assert_equal "]", block[:end]
118
- assert_tokens "[(4", block[:tokens], 15
119
- assert_equal 1, block[:value].size
10
+ make_my_diffs_pretty!
11
+ parallelize_me!
120
12
 
121
- block = block[:value].first
122
- assert_equal :simple_block, block[:node]
123
- assert_equal "(", block[:start]
124
- assert_equal ")", block[:end]
125
- assert_tokens "(4", block[:tokens], 16
126
- assert_tokens "4", block[:value], 17
127
- end
128
-
129
- it 'unclosed, preceded by a comment, when :preserve_comments == true' do
130
- options = {:preserve_comments => true}
131
- tree = CP.parse_stylesheet(" /**/ @foo bar{[(4", options)
132
- rule = tree[3]
133
-
134
- assert_equal 4, tree.size
135
- assert_tokens " /**/ ", tree[0..2], 0, options
136
-
137
- assert_equal :at_rule, rule[:node]
138
- assert_equal "foo", rule[:name]
139
- assert_tokens " bar", rule[:prelude], 10, options
140
- assert_tokens "@foo bar{[(4", rule[:tokens], 6, options
141
-
142
- block = rule[:block]
143
- assert_equal :simple_block, block[:node]
144
- assert_equal "{", block[:start]
145
- assert_equal "}", block[:end]
146
- assert_tokens "{[(4", block[:tokens], 14, options
147
- assert_equal 1, block[:value].size
148
-
149
- block = block[:value].first
150
- assert_equal :simple_block, block[:node]
151
- assert_equal "[", block[:start]
152
- assert_equal "]", block[:end]
153
- assert_tokens "[(4", block[:tokens], 15, options
154
- assert_equal 1, block[:value].size
155
-
156
- block = block[:value].first
157
- assert_equal :simple_block, block[:node]
158
- assert_equal "(", block[:start]
159
- assert_equal ")", block[:end]
160
- assert_tokens "(4", block[:tokens], 16, options
161
- assert_tokens "4", block[:value], 17, options
162
- end
163
-
164
- end
13
+ describe '#parse_stylesheet' do
14
+ def parse(*args)
15
+ CP.parse_stylesheet(*args)
165
16
  end
166
17
 
167
- describe 'should parse a style rule' do
168
- it 'with preceding comment, selector, block, comment' do
169
- tree = CP.parse_stylesheet(" /**/ div > p { color: #aaa; } /**/ ")
170
-
171
- assert_equal 5, tree.size
172
- assert_tokens " /**/ ", tree[0..1]
173
- assert_tokens " /**/ ", tree[3..4], 31
18
+ behaves_like 'parsing a list of rules'
174
19
 
175
- rule = tree[2]
176
- assert_equal :style_rule, rule[:node]
20
+ it 'with CDO/CDC before rule' do
21
+ tree = parse(" <!-- --> {")
177
22
 
178
- selector = rule[:selector]
179
- assert_equal :selector, selector[:node]
180
- assert_equal "div > p", selector[:value]
181
- assert_tokens "div > p ", selector[:tokens], 6
23
+ assert_equal(4, tree.size)
182
24
 
183
- children = rule[:children]
184
- assert_equal 3, children.size
185
- assert_tokens " ", children[0], 15
186
- assert_tokens " ", children[2], 28
187
-
188
- property = children[1]
189
- assert_equal :property, property[:node]
190
- assert_equal "color", property[:name]
191
- assert_equal "#aaa", property[:value]
192
- assert_tokens "color: #aaa;", property[:tokens], 16
193
- end
194
-
195
- it 'with preceding comment, selector, block, comment, when :preserve_comments == true' do
196
- options = {:preserve_comments => true}
197
- tree = CP.parse_stylesheet(" /**/ div > p { color: #aaa; } /**/ ", options)
198
-
199
- assert_equal 7, tree.size
200
- assert_tokens " /**/ ", tree[0..2], 0, options
201
- assert_tokens " /**/ ", tree[4..6], 31, options
202
-
203
- rule = tree[3]
204
- assert_equal :style_rule, rule[:node]
205
-
206
- selector = rule[:selector]
207
- assert_equal :selector, selector[:node]
208
- assert_equal "div > p", selector[:value]
209
- assert_tokens "div > p ", selector[:tokens], 6, options
210
-
211
- children = rule[:children]
212
- assert_equal 3, children.size
213
- assert_tokens " ", children[0], 15, options
214
- assert_tokens " ", children[2], 28, options
215
-
216
- property = children[1]
217
- assert_equal :property, property[:node]
218
- assert_equal "color", property[:name]
219
- assert_equal "#aaa", property[:value]
220
- assert_tokens "color: #aaa;", property[:tokens], 16, options
25
+ tree[0..2].each do |node|
26
+ assert_equal(:whitespace, node[:node])
221
27
  end
222
28
 
223
- it 'unclosed, with preceding comment, no selector' do
224
- tree = CP.parse_stylesheet(" /**/ { color: #aaa ")
225
-
226
- assert_equal 3, tree.size
227
- assert_tokens " /**/ ", tree[0..1]
228
-
229
- rule = tree[2]
230
- assert_equal :style_rule, rule[:node]
231
-
232
- selector = rule[:selector]
233
- assert_equal :selector, selector[:node]
234
- assert_equal "", selector[:value]
235
- assert_equal [], selector[:tokens]
236
-
237
- children = rule[:children]
238
- assert_equal 2, children.size
239
- assert_tokens " ", children[0], 7
240
-
241
- property = children[1]
242
- assert_equal :property, property[:node]
243
- assert_equal "color", property[:name]
244
- assert_equal "#aaa", property[:value]
245
- assert_tokens "color: #aaa ", property[:tokens], 8
246
- end
247
-
248
- it 'unclosed, with preceding comment, no selector, when :preserve_comments == true' do
249
- options = {:preserve_comments => true}
250
- tree = CP.parse_stylesheet(" /**/ { color: #aaa ", options)
251
-
252
- assert_equal 4, tree.size
253
- assert_tokens " /**/ ", tree[0..2], 0, options
254
-
255
- rule = tree[3]
256
- assert_equal :style_rule, rule[:node]
257
-
258
- selector = rule[:selector]
259
- assert_equal :selector, selector[:node]
260
- assert_equal "", selector[:value]
261
- assert_equal [], selector[:tokens]
262
-
263
- children = rule[:children]
264
- assert_equal 2, children.size
265
- assert_tokens " ", children[0], 7, options
266
-
267
- property = children[1]
268
- assert_equal :property, property[:node]
269
- assert_equal "color", property[:name]
270
- assert_equal "#aaa", property[:value]
271
- assert_tokens "color: #aaa ", property[:tokens], 8, options
272
- end
273
-
274
- it 'with CDO/CDC before rule' do
275
- tree = CP.parse_stylesheet(" <!-- --> {")
276
-
277
- assert_equal 4, tree.size
278
-
279
- tree[0..2].each do |node|
280
- assert_equal :whitespace, node[:node]
281
- end
282
-
283
- rule = tree[3]
284
- assert_equal :style_rule, rule[:node]
285
- assert_equal [], rule[:children]
286
-
287
- selector = rule[:selector]
288
- assert_equal :selector, selector[:node]
289
- assert_equal "", selector[:value]
290
- assert_equal [], selector[:tokens]
291
- end
292
-
293
- it 'followed by CDC' do
294
- tree = CP.parse_stylesheet("div {} -->")
295
-
296
- assert_equal 2, tree.size
297
-
298
- rule = tree[0]
299
- assert_equal :style_rule, rule[:node]
300
- assert_equal [], rule[:children]
301
-
302
- selector = rule[:selector]
303
- assert_equal :selector, selector[:node]
304
- assert_equal "div", selector[:value]
305
- assert_tokens "div ", selector[:tokens]
306
-
307
- assert_tokens " ", tree[1], 6
308
- end
309
- end
310
-
311
- it 'should parse multiple style rules' do
312
- tree = CP.parse_stylesheet("div { color: #aaa; } p{}")
313
-
314
- assert_equal 3, tree.size
315
-
316
- rule = tree[0]
317
- assert_equal :style_rule, rule[:node]
29
+ rule = tree[3]
30
+ assert_equal(:style_rule, rule[:node])
31
+ assert_equal([], rule[:children])
318
32
 
319
33
  selector = rule[:selector]
320
- assert_equal :selector, selector[:node]
321
- assert_equal "div", selector[:value]
322
- assert_tokens "div ", selector[:tokens]
323
-
324
- children = rule[:children]
325
- assert_equal 3, children.size
326
- assert_tokens " ", children[0], 5
327
- assert_tokens " ", children[2], 18
328
-
329
- prop = children[1]
330
- assert_equal :property, prop[:node]
331
- assert_equal "color", prop[:name]
332
- assert_equal "#aaa", prop[:value]
333
- assert_tokens "color: #aaa;", prop[:tokens], 6
334
-
335
- assert_tokens " ", tree[1], 20
336
-
337
- rule = tree[2]
338
- assert_equal :style_rule, rule[:node]
339
-
340
- selector = rule[:selector]
341
- assert_equal :selector, selector[:node]
342
- assert_equal "p", selector[:value]
343
- assert_tokens "p", selector[:tokens], 21
34
+ assert_equal(:selector, selector[:node])
35
+ assert_equal("", selector[:value])
36
+ assert_equal([], selector[:tokens])
344
37
  end
345
38
 
346
- it 'should ignore a block-less selector following a selector-less style rule' do
347
- tree = CP.parse_stylesheet("{}a")
348
- assert_equal 1, tree.size
349
-
350
- rule = tree[0]
351
- assert_equal :style_rule, rule[:node]
352
- assert_equal [], rule[:children]
353
-
354
- selector = rule[:selector]
355
- assert_equal :selector, selector[:node]
356
- assert_equal "", selector[:value]
357
- assert_equal [], selector[:tokens]
358
- end
39
+ it 'followed by CDC' do
40
+ tree = parse("div {} -->")
359
41
 
360
- it 'should handle an at-rule following a selector-less style rule' do
361
- tree = CP.parse_stylesheet("{}@a")
362
- assert_equal 2, tree.size
42
+ assert_equal(2, tree.size)
363
43
 
364
44
  rule = tree[0]
365
- assert_equal :style_rule, rule[:node]
366
- assert_equal [], rule[:children]
45
+ assert_equal(:style_rule, rule[:node])
46
+ assert_equal([], rule[:children])
367
47
 
368
48
  selector = rule[:selector]
369
- assert_equal :selector, selector[:node]
370
- assert_equal "", selector[:value]
371
- assert_equal [], selector[:tokens]
49
+ assert_equal(:selector, selector[:node])
50
+ assert_equal("div", selector[:value])
51
+ assert_tokens("div ", selector[:tokens])
372
52
 
373
- rule = tree[1]
374
- assert_equal :at_rule, rule[:node]
375
- assert_equal "a", rule[:name]
376
- assert_equal [], rule[:prelude]
377
- assert_tokens "@a", rule[:tokens], 2
53
+ assert_tokens(" ", tree[1], 6)
378
54
  end
379
55
  end
380
56
  end