diff --git a/test/sass/scss/parser_test.rb b/test/sass/scss/parser_test.rb new file mode 100644 index 00000000..d79c31ff --- /dev/null +++ b/test/sass/scss/parser_test.rb @@ -0,0 +1,394 @@ +#!/usr/bin/env ruby +require File.dirname(__FILE__) + '/../../test_helper' +require 'sass/engine' + +class ScssParserTest < Test::Unit::TestCase + + def test_basic_scss + assert_parses < +baz {bar: baz} +SCSS + end + + ## Declarations + + def test_vendor_properties + assert_parses < F') + assert_selector_parses('E + F') + assert_selector_parses('E ~ F') + end + + # Taken from http://www.w3.org/TR/css3-selectors/#selectors, + # but without the element names + def test_lonely_selectors + assert_selector_parses('[foo]') + assert_selector_parses('[foo="bar"]') + assert_selector_parses('[foo~="bar"]') + assert_selector_parses('[foo^="bar"]') + assert_selector_parses('[foo$="bar"]') + assert_selector_parses('[foo*="bar"]') + assert_selector_parses('[foo|="en"]') + assert_selector_parses(':root') + assert_selector_parses(':nth-child(n)') + assert_selector_parses(':nth-last-child(n)') + assert_selector_parses(':nth-of-type(n)') + assert_selector_parses(':nth-last-of-type(n)') + assert_selector_parses(':first-child') + assert_selector_parses(':last-child') + assert_selector_parses(':first-of-type') + assert_selector_parses(':last-of-type') + assert_selector_parses(':only-child') + assert_selector_parses(':only-of-type') + assert_selector_parses(':empty') + assert_selector_parses(':link') + assert_selector_parses(':visited') + assert_selector_parses(':active') + assert_selector_parses(':hover') + assert_selector_parses(':focus') + assert_selector_parses(':target') + assert_selector_parses(':lang(fr)') + assert_selector_parses(':enabled') + assert_selector_parses(':disabled') + assert_selector_parses(':checked') + assert_selector_parses('::first-line') + assert_selector_parses('::first-letter') + assert_selector_parses('::before') + assert_selector_parses('::after') + assert_selector_parses('.warning') + assert_selector_parses('#myid') + assert_selector_parses(':not(s)') + end + + def test_attribute_selectors_with_identifiers + assert_selector_parses('[foo~=bar]') + assert_selector_parses('[foo^=bar]') + assert_selector_parses('[foo$=bar]') + assert_selector_parses('[foo*=bar]') + assert_selector_parses('[foo|=en]') + end + + def test_nth_selectors + assert_selector_parses(':nth-child(-n)') + assert_selector_parses(':nth-child(+n)') + + assert_selector_parses(':nth-child(even)') + assert_selector_parses(':nth-child(odd)') + + assert_selector_parses(':nth-child(50)') + assert_selector_parses(':nth-child(-50)') + assert_selector_parses(':nth-child(+50)') + + assert_selector_parses(':nth-child(2n+3)') + assert_selector_parses(':nth-child(2n-3)') + assert_selector_parses(':nth-child(+2n-3)') + assert_selector_parses(':nth-child(-2n+3)') + assert_selector_parses(':nth-child(-2n+ 3)') + assert_selector_parses(':nth-child( 2n + 3 )') + end + + def test_negation_selectors + assert_selector_parses(':not(foo|bar)') + assert_selector_parses(':not(*|bar)') + + assert_selector_parses(':not(foo|*)') + assert_selector_parses(':not(*|*)') + + assert_selector_parses(':not(#blah)') + assert_selector_parses(':not(.blah)') + + assert_selector_parses(':not([foo])') + assert_selector_parses(':not([foo^="bar"])') + assert_selector_parses(':not([baz|foo~="bar"])') + + assert_selector_parses(':not(:hover)') + assert_selector_parses(':not(:nth-child(2n + 3))') + end + + def test_namespaced_selectors + assert_selector_parses('foo|E') + assert_selector_parses('*|E') + assert_selector_parses('foo|*') + assert_selector_parses('*|*') + end + + def test_namespaced_attribute_selectors + assert_selector_parses('[foo|bar=baz]') + assert_selector_parses('[*|bar=baz]') + assert_selector_parses('[foo|bar|=baz]') + end + + private + + def assert_valid_string(ident) + assert_equal + end + + def assert_selector_parses(selector) + assert_parses <