test/test_parse_stylesheet.rb in crass-0.0.2 vs test/test_parse_stylesheet.rb in crass-0.1.0

- old
+ new

@@ -2,379 +2,55 @@ # Includes tests based on Simon Sapin's CSS parsing tests: # https://github.com/SimonSapin/css-parsing-tests/ require_relative 'support/common' +require_relative 'shared/parse_rules' describe 'Crass::Parser' do + make_my_diffs_pretty! + parallelize_me! + describe '#parse_stylesheet' do - it 'should parse an empty stylesheet' do - assert_equal [], CP.parse_stylesheet('') - assert_equal [], CP.parse_stylesheet('foo') - assert_equal [], CP.parse_stylesheet('foo 4') + def parse(*args) + CP.parse_stylesheet(*args) end - describe 'should parse an at-rule' do - describe 'without a block' do - it 'without a prelude' do - tree = CP.parse_stylesheet('@foo') - rule = tree[0] + behaves_like 'parsing a list of rules' - assert_equal 1, tree.size - assert_equal :at_rule, rule[:node] - assert_equal "foo", rule[:name] - assert_equal [], rule[:prelude] - assert_tokens "@foo", rule[:tokens] - end + it 'with CDO/CDC before rule' do + tree = parse(" <!-- --> {") - it 'with a prelude followed by a comment' do - tree = CP.parse_stylesheet("@foo bar; \t/* comment */") - rule = tree[0] + assert_equal(4, tree.size) - assert_equal 2, tree.size - assert_equal :at_rule, rule[:node] - assert_equal "foo", rule[:name] - assert_tokens " bar", rule[:prelude], 4 - assert_tokens "@foo bar;", rule[:tokens] - assert_tokens " \t", tree[1], 9 - end - - it 'with a prelude followed by a comment, when :preserve_comments == true' do - options = {:preserve_comments => true} - tree = CP.parse_stylesheet("@foo bar; \t/* comment */", options) - rule = tree[0] - - assert_equal 3, tree.size - assert_equal :at_rule, rule[:node] - assert_equal "foo", rule[:name] - assert_tokens " bar", rule[:prelude], 4, options - assert_tokens "@foo bar;", rule[:tokens], 0, options - assert_tokens " \t", tree[1], 9, options - assert_tokens "/* comment */", tree[2], 11, options - end - - it 'with a prelude containing a simple block' do - tree = CP.parse_stylesheet("@foo [ bar") - rule = tree[0] - - assert_equal 1, tree.size - assert_equal :at_rule, rule[:node] - assert_equal "foo", rule[:name] - assert_tokens "@foo [ bar", rule[:tokens] - - prelude = rule[:prelude] - assert_equal 2, prelude.size - assert_tokens " ", prelude[0], 4 - - block = prelude[1] - assert_equal :simple_block, block[:node] - assert_equal "[", block[:start] - assert_equal "]", block[:end] - assert_tokens "[ bar", block[:tokens], 5 - assert_tokens " bar", block[:value], 6 - end + tree[0..2].each do |node| + assert_equal(:whitespace, node[:node]) end - describe 'with a block' do - it 'unclosed' do - tree = CP.parse_stylesheet("@foo { bar") - rule = tree[0] + rule = tree[3] + assert_equal(:style_rule, rule[:node]) + assert_equal([], rule[:children]) - assert_equal 1, tree.size - assert_equal :at_rule, rule[:node] - assert_equal "foo", rule[:name] - assert_tokens " ", rule[:prelude], 4 - assert_tokens "@foo { bar", rule[:tokens] - - block = rule[:block] - assert_equal :simple_block, block[:node] - assert_equal "{", block[:start] - assert_equal "}", block[:end] - assert_tokens "{ bar", block[:tokens], 5 - assert_tokens " bar", block[:value], 6 - end - - it 'unclosed, preceded by a comment' do - tree = CP.parse_stylesheet(" /**/ @foo bar{[(4") - rule = tree[2] - - assert_equal 3, tree.size - assert_tokens " /**/ ", tree[0..1] - assert_equal :at_rule, rule[:node] - assert_equal "foo", rule[:name] - assert_tokens " bar", rule[:prelude], 10 - assert_tokens "@foo bar{[(4", rule[:tokens], 6 - - block = rule[:block] - assert_equal :simple_block, block[:node] - assert_equal "{", block[:start] - assert_equal "}", block[:end] - assert_tokens "{[(4", block[:tokens], 14 - assert_equal 1, block[:value].size - - block = block[:value].first - assert_equal :simple_block, block[:node] - assert_equal "[", block[:start] - assert_equal "]", block[:end] - assert_tokens "[(4", block[:tokens], 15 - assert_equal 1, block[:value].size - - block = block[:value].first - assert_equal :simple_block, block[:node] - assert_equal "(", block[:start] - assert_equal ")", block[:end] - assert_tokens "(4", block[:tokens], 16 - assert_tokens "4", block[:value], 17 - end - - it 'unclosed, preceded by a comment, when :preserve_comments == true' do - options = {:preserve_comments => true} - tree = CP.parse_stylesheet(" /**/ @foo bar{[(4", options) - rule = tree[3] - - assert_equal 4, tree.size - assert_tokens " /**/ ", tree[0..2], 0, options - - assert_equal :at_rule, rule[:node] - assert_equal "foo", rule[:name] - assert_tokens " bar", rule[:prelude], 10, options - assert_tokens "@foo bar{[(4", rule[:tokens], 6, options - - block = rule[:block] - assert_equal :simple_block, block[:node] - assert_equal "{", block[:start] - assert_equal "}", block[:end] - assert_tokens "{[(4", block[:tokens], 14, options - assert_equal 1, block[:value].size - - block = block[:value].first - assert_equal :simple_block, block[:node] - assert_equal "[", block[:start] - assert_equal "]", block[:end] - assert_tokens "[(4", block[:tokens], 15, options - assert_equal 1, block[:value].size - - block = block[:value].first - assert_equal :simple_block, block[:node] - assert_equal "(", block[:start] - assert_equal ")", block[:end] - assert_tokens "(4", block[:tokens], 16, options - assert_tokens "4", block[:value], 17, options - end - - end - end - - describe 'should parse a style rule' do - it 'with preceding comment, selector, block, comment' do - tree = CP.parse_stylesheet(" /**/ div > p { color: #aaa; } /**/ ") - - assert_equal 5, tree.size - assert_tokens " /**/ ", tree[0..1] - assert_tokens " /**/ ", tree[3..4], 31 - - rule = tree[2] - assert_equal :style_rule, rule[:node] - - selector = rule[:selector] - assert_equal :selector, selector[:node] - assert_equal "div > p", selector[:value] - assert_tokens "div > p ", selector[:tokens], 6 - - children = rule[:children] - assert_equal 3, children.size - assert_tokens " ", children[0], 15 - assert_tokens " ", children[2], 28 - - property = children[1] - assert_equal :property, property[:node] - assert_equal "color", property[:name] - assert_equal "#aaa", property[:value] - assert_tokens "color: #aaa;", property[:tokens], 16 - end - - it 'with preceding comment, selector, block, comment, when :preserve_comments == true' do - options = {:preserve_comments => true} - tree = CP.parse_stylesheet(" /**/ div > p { color: #aaa; } /**/ ", options) - - assert_equal 7, tree.size - assert_tokens " /**/ ", tree[0..2], 0, options - assert_tokens " /**/ ", tree[4..6], 31, options - - rule = tree[3] - assert_equal :style_rule, rule[:node] - - selector = rule[:selector] - assert_equal :selector, selector[:node] - assert_equal "div > p", selector[:value] - assert_tokens "div > p ", selector[:tokens], 6, options - - children = rule[:children] - assert_equal 3, children.size - assert_tokens " ", children[0], 15, options - assert_tokens " ", children[2], 28, options - - property = children[1] - assert_equal :property, property[:node] - assert_equal "color", property[:name] - assert_equal "#aaa", property[:value] - assert_tokens "color: #aaa;", property[:tokens], 16, options - end - - it 'unclosed, with preceding comment, no selector' do - tree = CP.parse_stylesheet(" /**/ { color: #aaa ") - - assert_equal 3, tree.size - assert_tokens " /**/ ", tree[0..1] - - rule = tree[2] - assert_equal :style_rule, rule[:node] - - selector = rule[:selector] - assert_equal :selector, selector[:node] - assert_equal "", selector[:value] - assert_equal [], selector[:tokens] - - children = rule[:children] - assert_equal 2, children.size - assert_tokens " ", children[0], 7 - - property = children[1] - assert_equal :property, property[:node] - assert_equal "color", property[:name] - assert_equal "#aaa", property[:value] - assert_tokens "color: #aaa ", property[:tokens], 8 - end - - it 'unclosed, with preceding comment, no selector, when :preserve_comments == true' do - options = {:preserve_comments => true} - tree = CP.parse_stylesheet(" /**/ { color: #aaa ", options) - - assert_equal 4, tree.size - assert_tokens " /**/ ", tree[0..2], 0, options - - rule = tree[3] - assert_equal :style_rule, rule[:node] - - selector = rule[:selector] - assert_equal :selector, selector[:node] - assert_equal "", selector[:value] - assert_equal [], selector[:tokens] - - children = rule[:children] - assert_equal 2, children.size - assert_tokens " ", children[0], 7, options - - property = children[1] - assert_equal :property, property[:node] - assert_equal "color", property[:name] - assert_equal "#aaa", property[:value] - assert_tokens "color: #aaa ", property[:tokens], 8, options - end - - it 'with CDO/CDC before rule' do - tree = CP.parse_stylesheet(" <!-- --> {") - - assert_equal 4, tree.size - - tree[0..2].each do |node| - assert_equal :whitespace, node[:node] - end - - rule = tree[3] - assert_equal :style_rule, rule[:node] - assert_equal [], rule[:children] - - selector = rule[:selector] - assert_equal :selector, selector[:node] - assert_equal "", selector[:value] - assert_equal [], selector[:tokens] - end - - it 'followed by CDC' do - tree = CP.parse_stylesheet("div {} -->") - - assert_equal 2, tree.size - - rule = tree[0] - assert_equal :style_rule, rule[:node] - assert_equal [], rule[:children] - - selector = rule[:selector] - assert_equal :selector, selector[:node] - assert_equal "div", selector[:value] - assert_tokens "div ", selector[:tokens] - - assert_tokens " ", tree[1], 6 - end - end - - it 'should parse multiple style rules' do - tree = CP.parse_stylesheet("div { color: #aaa; } p{}") - - assert_equal 3, tree.size - - rule = tree[0] - assert_equal :style_rule, rule[:node] - selector = rule[:selector] - assert_equal :selector, selector[:node] - assert_equal "div", selector[:value] - assert_tokens "div ", selector[:tokens] - - children = rule[:children] - assert_equal 3, children.size - assert_tokens " ", children[0], 5 - assert_tokens " ", children[2], 18 - - prop = children[1] - assert_equal :property, prop[:node] - assert_equal "color", prop[:name] - assert_equal "#aaa", prop[:value] - assert_tokens "color: #aaa;", prop[:tokens], 6 - - assert_tokens " ", tree[1], 20 - - rule = tree[2] - assert_equal :style_rule, rule[:node] - - selector = rule[:selector] - assert_equal :selector, selector[:node] - assert_equal "p", selector[:value] - assert_tokens "p", selector[:tokens], 21 + assert_equal(:selector, selector[:node]) + assert_equal("", selector[:value]) + assert_equal([], selector[:tokens]) end - it 'should ignore a block-less selector following a selector-less style rule' do - tree = CP.parse_stylesheet("{}a") - assert_equal 1, tree.size + it 'followed by CDC' do + tree = parse("div {} -->") - rule = tree[0] - assert_equal :style_rule, rule[:node] - assert_equal [], rule[:children] + assert_equal(2, tree.size) - selector = rule[:selector] - assert_equal :selector, selector[:node] - assert_equal "", selector[:value] - assert_equal [], selector[:tokens] - end - - it 'should handle an at-rule following a selector-less style rule' do - tree = CP.parse_stylesheet("{}@a") - assert_equal 2, tree.size - rule = tree[0] - assert_equal :style_rule, rule[:node] - assert_equal [], rule[:children] + assert_equal(:style_rule, rule[:node]) + assert_equal([], rule[:children]) selector = rule[:selector] - assert_equal :selector, selector[:node] - assert_equal "", selector[:value] - assert_equal [], selector[:tokens] + assert_equal(:selector, selector[:node]) + assert_equal("div", selector[:value]) + assert_tokens("div ", selector[:tokens]) - rule = tree[1] - assert_equal :at_rule, rule[:node] - assert_equal "a", rule[:name] - assert_equal [], rule[:prelude] - assert_tokens "@a", rule[:tokens], 2 + assert_tokens(" ", tree[1], 6) end end end