sass 3.3.14 → 3.4.0.rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -1
- data/README.md +5 -5
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/VERSION_NAME +1 -1
- data/bin/sass +1 -1
- data/bin/scss +1 -1
- data/lib/sass.rb +0 -5
- data/lib/sass/css.rb +1 -3
- data/lib/sass/engine.rb +28 -39
- data/lib/sass/environment.rb +13 -17
- data/lib/sass/error.rb +6 -9
- data/lib/sass/exec.rb +5 -771
- data/lib/sass/exec/base.rb +187 -0
- data/lib/sass/exec/sass_convert.rb +264 -0
- data/lib/sass/exec/sass_scss.rb +419 -0
- data/lib/sass/features.rb +6 -0
- data/lib/sass/importers.rb +0 -1
- data/lib/sass/importers/base.rb +5 -1
- data/lib/sass/importers/filesystem.rb +4 -21
- data/lib/sass/media.rb +1 -4
- data/lib/sass/plugin/compiler.rb +32 -136
- data/lib/sass/script/css_lexer.rb +1 -1
- data/lib/sass/script/functions.rb +363 -39
- data/lib/sass/script/lexer.rb +68 -50
- data/lib/sass/script/parser.rb +29 -14
- data/lib/sass/script/tree.rb +1 -0
- data/lib/sass/script/tree/funcall.rb +1 -1
- data/lib/sass/script/tree/interpolation.rb +19 -1
- data/lib/sass/script/tree/selector.rb +26 -0
- data/lib/sass/script/value.rb +0 -1
- data/lib/sass/script/value/bool.rb +0 -5
- data/lib/sass/script/value/color.rb +32 -12
- data/lib/sass/script/value/helpers.rb +107 -0
- data/lib/sass/script/value/list.rb +0 -15
- data/lib/sass/script/value/null.rb +0 -5
- data/lib/sass/script/value/number.rb +60 -14
- data/lib/sass/script/value/string.rb +53 -9
- data/lib/sass/scss/css_parser.rb +8 -2
- data/lib/sass/scss/parser.rb +175 -319
- data/lib/sass/scss/rx.rb +14 -5
- data/lib/sass/scss/static_parser.rb +298 -1
- data/lib/sass/selector.rb +56 -193
- data/lib/sass/selector/abstract_sequence.rb +28 -13
- data/lib/sass/selector/comma_sequence.rb +91 -12
- data/lib/sass/selector/pseudo.rb +256 -0
- data/lib/sass/selector/sequence.rb +99 -31
- data/lib/sass/selector/simple.rb +14 -25
- data/lib/sass/selector/simple_sequence.rb +101 -37
- data/lib/sass/shared.rb +1 -1
- data/lib/sass/source/map.rb +23 -9
- data/lib/sass/stack.rb +0 -6
- data/lib/sass/supports.rb +1 -1
- data/lib/sass/tree/at_root_node.rb +1 -0
- data/lib/sass/tree/directive_node.rb +7 -1
- data/lib/sass/tree/error_node.rb +18 -0
- data/lib/sass/tree/keyframe_rule_node.rb +15 -0
- data/lib/sass/tree/prop_node.rb +1 -1
- data/lib/sass/tree/rule_node.rb +11 -6
- data/lib/sass/tree/visitors/check_nesting.rb +3 -4
- data/lib/sass/tree/visitors/convert.rb +8 -17
- data/lib/sass/tree/visitors/cssize.rb +12 -24
- data/lib/sass/tree/visitors/deep_copy.rb +5 -0
- data/lib/sass/tree/visitors/perform.rb +43 -28
- data/lib/sass/tree/visitors/set_options.rb +5 -0
- data/lib/sass/tree/visitors/to_css.rb +14 -13
- data/lib/sass/util.rb +94 -90
- data/test/sass/cache_test.rb +1 -1
- data/test/sass/callbacks_test.rb +1 -1
- data/test/sass/compiler_test.rb +5 -14
- data/test/sass/conversion_test.rb +47 -1
- data/test/sass/css2sass_test.rb +3 -3
- data/test/sass/encoding_test.rb +219 -0
- data/test/sass/engine_test.rb +128 -191
- data/test/sass/exec_test.rb +2 -2
- data/test/sass/extend_test.rb +234 -17
- data/test/sass/functions_test.rb +268 -213
- data/test/sass/importer_test.rb +31 -21
- data/test/sass/logger_test.rb +1 -1
- data/test/sass/more_results/more_import.css +1 -1
- data/test/sass/plugin_test.rb +12 -11
- data/test/sass/results/compact.css +1 -1
- data/test/sass/results/complex.css +4 -4
- data/test/sass/results/expanded.css +1 -1
- data/test/sass/results/import.css +1 -1
- data/test/sass/results/import_charset_ibm866.css +2 -2
- data/test/sass/results/mixins.css +17 -17
- data/test/sass/results/nested.css +1 -1
- data/test/sass/results/parent_ref.css +2 -2
- data/test/sass/results/script.css +3 -3
- data/test/sass/results/scss_import.css +1 -1
- data/test/sass/script_conversion_test.rb +7 -4
- data/test/sass/script_test.rb +202 -79
- data/test/sass/scss/css_test.rb +95 -25
- data/test/sass/scss/rx_test.rb +4 -4
- data/test/sass/scss/scss_test.rb +363 -19
- data/test/sass/source_map_test.rb +48 -41
- data/test/sass/superselector_test.rb +191 -0
- data/test/sass/templates/scss_import.scss +2 -1
- data/test/sass/test_helper.rb +1 -1
- data/test/sass/util/multibyte_string_scanner_test.rb +1 -1
- data/test/sass/util/normalized_map_test.rb +1 -1
- data/test/sass/util/subset_map_test.rb +2 -2
- data/test/sass/util_test.rb +1 -1
- data/test/sass/value_helpers_test.rb +3 -3
- data/test/test_helper.rb +2 -2
- metadata +30 -7
- data/lib/sass/importers/deprecated_path.rb +0 -51
- data/lib/sass/script/value/deprecated_false.rb +0 -55
@@ -3,12 +3,12 @@
|
|
3
3
|
require File.dirname(__FILE__) + '/../test_helper'
|
4
4
|
require File.dirname(__FILE__) + '/test_helper'
|
5
5
|
|
6
|
-
class SourcemapTest < Test
|
6
|
+
class SourcemapTest < MiniTest::Test
|
7
7
|
def test_to_json_requires_args
|
8
8
|
_, sourcemap = render_with_sourcemap('')
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
assert_raises(ArgumentError) {sourcemap.to_json({})}
|
10
|
+
assert_raises(ArgumentError) {sourcemap.to_json({:css_path => 'foo'})}
|
11
|
+
assert_raises(ArgumentError) {sourcemap.to_json({:sourcemap_path => 'foo'})}
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_simple_mapping_scss
|
@@ -60,6 +60,32 @@ CSS
|
|
60
60
|
JSON
|
61
61
|
end
|
62
62
|
|
63
|
+
def test_simple_mapping_with_file_uris
|
64
|
+
uri = Sass::Util.file_uri_from_path(Sass::Util.absolute_path(filename_for_test(:scss)))
|
65
|
+
assert_parses_with_sourcemap <<SCSS, <<CSS, <<JSON, :sourcemap => :file
|
66
|
+
a {
|
67
|
+
foo: bar;
|
68
|
+
/* SOME COMMENT */
|
69
|
+
font-size: 12px;
|
70
|
+
}
|
71
|
+
SCSS
|
72
|
+
a {
|
73
|
+
foo: bar;
|
74
|
+
/* SOME COMMENT */
|
75
|
+
font-size: 12px; }
|
76
|
+
|
77
|
+
/*# sourceMappingURL=test.css.map */
|
78
|
+
CSS
|
79
|
+
{
|
80
|
+
"version": 3,
|
81
|
+
"mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;;EAER,SAAS,EAAE,IAAI",
|
82
|
+
"sources": ["#{uri}"],
|
83
|
+
"names": [],
|
84
|
+
"file": "test.css"
|
85
|
+
}
|
86
|
+
JSON
|
87
|
+
end
|
88
|
+
|
63
89
|
def test_mapping_with_directory_scss
|
64
90
|
options = {:filename => "scss/style.scss", :output => "css/style.css"}
|
65
91
|
assert_parses_with_sourcemap <<SCSS, <<CSS, <<JSON, options
|
@@ -156,15 +182,15 @@ JSON
|
|
156
182
|
end
|
157
183
|
|
158
184
|
def test_different_charset_than_encoding_scss
|
159
|
-
assert_parses_with_sourcemap(<<SCSS.force_encoding("IBM866"), <<CSS
|
185
|
+
assert_parses_with_sourcemap(<<SCSS.force_encoding("IBM866"), <<CSS, <<JSON)
|
160
186
|
@charset "IBM866";
|
161
187
|
f\x86\x86 {
|
162
188
|
\x86: b;
|
163
189
|
}
|
164
190
|
SCSS
|
165
|
-
@charset "
|
166
|
-
f
|
167
|
-
|
191
|
+
@charset "UTF-8";
|
192
|
+
fЖЖ {
|
193
|
+
Ж: b; }
|
168
194
|
|
169
195
|
/*# sourceMappingURL=test.css.map */
|
170
196
|
CSS
|
@@ -179,14 +205,14 @@ JSON
|
|
179
205
|
end
|
180
206
|
|
181
207
|
def test_different_charset_than_encoding_sass
|
182
|
-
assert_parses_with_sourcemap(<<SASS.force_encoding("IBM866"), <<CSS
|
208
|
+
assert_parses_with_sourcemap(<<SASS.force_encoding("IBM866"), <<CSS, <<JSON, :syntax => :sass)
|
183
209
|
@charset "IBM866"
|
184
210
|
f\x86\x86
|
185
211
|
\x86: b
|
186
212
|
SASS
|
187
|
-
@charset "
|
188
|
-
f
|
189
|
-
|
213
|
+
@charset "UTF-8";
|
214
|
+
fЖЖ {
|
215
|
+
Ж: b; }
|
190
216
|
|
191
217
|
/*# sourceMappingURL=test.css.map */
|
192
218
|
CSS
|
@@ -443,8 +469,8 @@ CSS
|
|
443
469
|
{{7}}border-width{{/7}}: {{8}}3px{{/8}}
|
444
470
|
SASS
|
445
471
|
{{1}}.error, .seriousError{{/1}} {
|
446
|
-
{{2}}border{{/2}}: {{3}}1px
|
447
|
-
{{4}}background-color{{/4}}: {{5}}#
|
472
|
+
{{2}}border{{/2}}: {{3}}1px #f00{{/3}};
|
473
|
+
{{4}}background-color{{/4}}: {{5}}#fdd{{/5}}; }
|
448
474
|
|
449
475
|
{{6}}.seriousError{{/6}} {
|
450
476
|
{{7}}border-width{{/7}}: {{8}}3px{{/8}}; }
|
@@ -632,9 +658,9 @@ SCSS
|
|
632
658
|
{{22}}border-style{{/22}}: {{23}}dashed{{/23}}; }
|
633
659
|
|
634
660
|
{{24}}.shadows{{/24}} {
|
635
|
-
{{25}}-moz-box-shadow{{/25}}: {{26}}0px 4px 5px #
|
636
|
-
{{27}}-webkit-box-shadow{{/27}}: {{28}}0px 4px 5px #
|
637
|
-
{{29}}box-shadow{{/29}}: {{30}}0px 4px 5px #
|
661
|
+
{{25}}-moz-box-shadow{{/25}}: {{26}}0px 4px 5px #666, 2px 6px 10px #999{{/26}};
|
662
|
+
{{27}}-webkit-box-shadow{{/27}}: {{28}}0px 4px 5px #666, 2px 6px 10px #999{{/28}};
|
663
|
+
{{29}}box-shadow{{/29}}: {{30}}0px 4px 5px #666, 2px 6px 10px #999{{/30}}; }
|
638
664
|
|
639
665
|
/*# sourceMappingURL=test.css.map */
|
640
666
|
CSS
|
@@ -675,7 +701,7 @@ SASS
|
|
675
701
|
{{1}}.page-title{{/1}} {
|
676
702
|
{{2}}font-size{{/2}}: {{3}}20px{{/3}};
|
677
703
|
{{4}}font-weight{{/4}}: {{5}}bold{{/5}};
|
678
|
-
{{6}}color{{/6}}: {{7}}
|
704
|
+
{{6}}color{{/6}}: {{7}}#ff0000{{/7}};
|
679
705
|
{{8}}padding{{/8}}: {{9}}4px{{/9}}; }
|
680
706
|
|
681
707
|
{{10}}p{{/10}} {
|
@@ -689,9 +715,9 @@ SASS
|
|
689
715
|
{{22}}border-style{{/22}}: {{23}}dashed{{/23}}; }
|
690
716
|
|
691
717
|
{{24}}.shadows{{/24}} {
|
692
|
-
{{25}}-moz-box-shadow{{/25}}: {{26}}0px 4px 5px #
|
693
|
-
{{27}}-webkit-box-shadow{{/27}}: {{28}}0px 4px 5px #
|
694
|
-
{{29}}box-shadow{{/29}}: {{30}}0px 4px 5px #
|
718
|
+
{{25}}-moz-box-shadow{{/25}}: {{26}}0px 4px 5px #666, 2px 6px 10px #999{{/26}};
|
719
|
+
{{27}}-webkit-box-shadow{{/27}}: {{28}}0px 4px 5px #666, 2px 6px 10px #999{{/28}};
|
720
|
+
{{29}}box-shadow{{/29}}: {{30}}0px 4px 5px #666, 2px 6px 10px #999{{/30}}; }
|
695
721
|
|
696
722
|
/*# sourceMappingURL=test.css.map */
|
697
723
|
CSS
|
@@ -764,25 +790,6 @@ SCSS
|
|
764
790
|
CSS
|
765
791
|
end
|
766
792
|
|
767
|
-
def test_multiline_interpolation_source_range
|
768
|
-
engine = Sass::Engine.new(<<-SCSS, cache: false, syntax: :scss)
|
769
|
-
p {
|
770
|
-
filter: progid:DXImageTransform(
|
771
|
-
'\#{123}');
|
772
|
-
}
|
773
|
-
SCSS
|
774
|
-
|
775
|
-
interpolated = engine.to_tree.children.
|
776
|
-
first.children.
|
777
|
-
first.value.children[1]
|
778
|
-
assert_equal interpolated.to_sass, "123"
|
779
|
-
range = interpolated.source_range
|
780
|
-
assert_equal 3, range.start_pos.line
|
781
|
-
assert_equal 14, range.start_pos.offset
|
782
|
-
assert_equal 3, range.end_pos.line
|
783
|
-
assert_equal 17, range.end_pos.offset
|
784
|
-
end
|
785
|
-
|
786
793
|
def test_sources_array_is_uri_escaped
|
787
794
|
map = Sass::Source::Map.new
|
788
795
|
importer = Sass::Importers::Filesystem.new('.')
|
@@ -907,7 +914,7 @@ MESSAGE
|
|
907
914
|
rendered, sourcemap = render_with_sourcemap(source, options)
|
908
915
|
css_path = options[:output] || "test.css"
|
909
916
|
sourcemap_path = Sass::Util.sourcemap_name(css_path)
|
910
|
-
rendered_json = sourcemap.to_json(:css_path => css_path, :sourcemap_path => sourcemap_path)
|
917
|
+
rendered_json = sourcemap.to_json(:css_path => css_path, :sourcemap_path => sourcemap_path, :type => options[:sourcemap])
|
911
918
|
|
912
919
|
assert_equal css.rstrip, rendered.rstrip
|
913
920
|
assert_equal sourcemap_json.rstrip, rendered_json
|
@@ -0,0 +1,191 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
3
|
+
|
4
|
+
class SuperselectorTest < MiniTest::Test
|
5
|
+
def test_superselector_reflexivity
|
6
|
+
assert_superselector 'h1', 'h1'
|
7
|
+
assert_superselector '.foo', '.foo'
|
8
|
+
assert_superselector '#foo > .bar, baz', '#foo > .bar, baz'
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_smaller_compound_superselector
|
12
|
+
assert_strict_superselector '.foo', '.foo.bar'
|
13
|
+
assert_strict_superselector '.bar', '.foo.bar'
|
14
|
+
assert_strict_superselector 'a', 'a#b'
|
15
|
+
assert_strict_superselector '#b', 'a#b'
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_smaller_complex_superselector
|
19
|
+
assert_strict_superselector '.bar', '.foo .bar'
|
20
|
+
assert_strict_superselector '.bar', '.foo > .bar'
|
21
|
+
assert_strict_superselector '.bar', '.foo + .bar'
|
22
|
+
assert_strict_superselector '.bar', '.foo ~ .bar'
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_selector_list_subset_superselector
|
26
|
+
assert_strict_superselector '.foo, .bar', '.foo'
|
27
|
+
assert_strict_superselector '.foo, .bar, .baz', '.foo, .baz'
|
28
|
+
assert_strict_superselector '.foo, .baz, .qux', '.foo.bar, .baz.bang'
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_leading_combinator_superselector
|
32
|
+
refute_superselector '+ .foo', '.foo'
|
33
|
+
refute_superselector '+ .foo', '.bar + .foo'
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_trailing_combinator_superselector
|
37
|
+
refute_superselector '.foo +', '.foo'
|
38
|
+
refute_superselector '.foo +', '.foo + .bar'
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_matching_combinator_superselector
|
42
|
+
assert_strict_superselector '.foo + .bar', '.foo + .bar.baz'
|
43
|
+
assert_strict_superselector '.foo + .bar', '.foo.baz + .bar'
|
44
|
+
assert_strict_superselector '.foo > .bar', '.foo > .bar.baz'
|
45
|
+
assert_strict_superselector '.foo > .bar', '.foo.baz > .bar'
|
46
|
+
assert_strict_superselector '.foo ~ .bar', '.foo ~ .bar.baz'
|
47
|
+
assert_strict_superselector '.foo ~ .bar', '.foo.baz ~ .bar'
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_following_sibling_is_superselector_of_next_sibling
|
51
|
+
assert_strict_superselector '.foo ~ .bar', '.foo + .bar.baz'
|
52
|
+
assert_strict_superselector '.foo ~ .bar', '.foo.baz + .bar'
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_descendant_is_superselector_of_child
|
56
|
+
assert_strict_superselector '.foo .bar', '.foo > .bar.baz'
|
57
|
+
assert_strict_superselector '.foo .bar', '.foo.baz > .bar'
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_matches_is_superselector_of_constituent_selectors
|
61
|
+
%w[matches -moz-any].each do |name|
|
62
|
+
assert_strict_superselector ":#{name}(.foo, .bar)", '.foo.baz'
|
63
|
+
assert_strict_superselector ":#{name}(.foo, .bar)", '.bar.baz'
|
64
|
+
assert_strict_superselector ":#{name}(.foo .bar, .baz)", '.x .foo .bar'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_matches_is_superselector_of_subset_matches
|
69
|
+
assert_strict_superselector ':matches(.foo, .bar, .baz)', '#x:matches(.foo.bip, .baz.bang)'
|
70
|
+
assert_strict_superselector ':-moz-any(.foo, .bar, .baz)', '#x:-moz-any(.foo.bip, .baz.bang)'
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_matches_is_not_superselector_of_any
|
74
|
+
refute_superselector ':matches(.foo, .bar)', ':-moz-any(.foo, .bar)'
|
75
|
+
refute_superselector ':-moz-any(.foo, .bar)', ':matches(.foo, .bar)'
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_matches_can_be_subselector
|
79
|
+
%w[matches -moz-any].each do |name|
|
80
|
+
assert_superselector '.foo', ":#{name}(.foo.bar)"
|
81
|
+
assert_superselector '.foo.bar', ":#{name}(.foo.bar.baz)"
|
82
|
+
assert_superselector '.foo', ":#{name}(.foo.bar, .foo.baz)"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_any_is_not_superselector_of_different_prefix
|
87
|
+
refute_superselector ':-moz-any(.foo, .bar)', ':-s-any(.foo, .bar)'
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_not_is_superselector_of_less_complex_not
|
91
|
+
assert_strict_superselector ':not(.foo.bar)', ':not(.foo)'
|
92
|
+
assert_strict_superselector ':not(.foo .bar)', ':not(.bar)'
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_not_is_superselector_of_superset
|
96
|
+
assert_strict_superselector ':not(.foo.bip, .baz.bang)', ':not(.foo, .bar, .baz)'
|
97
|
+
assert_strict_superselector ':not(.foo.bip, .baz.bang)', ':not(.foo):not(.bar):not(.baz)'
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_not_is_superselector_of_unique_selectors
|
101
|
+
assert_strict_superselector ':not(h1.foo)', 'a'
|
102
|
+
assert_strict_superselector ':not(.baz #foo)', '#bar'
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_not_is_not_superselector_of_non_unique_selectors
|
106
|
+
refute_superselector ':not(.foo)', '.bar'
|
107
|
+
refute_superselector ':not(:hover)', ':visited'
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_current_is_superselector_with_identical_innards
|
111
|
+
assert_superselector ':current(.foo)', ':current(.foo)'
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_current_is_superselector_with_subselector_innards
|
115
|
+
refute_superselector ':current(.foo)', ':current(.foo.bar)'
|
116
|
+
refute_superselector ':current(.foo.bar)', ':current(.foo)'
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_nth_match_is_superselector_of_subset_nth_match
|
120
|
+
assert_strict_superselector(
|
121
|
+
':nth-child(2n of .foo, .bar, .baz)', '#x:nth-child(2n of .foo.bip, .baz.bang)')
|
122
|
+
assert_strict_superselector(
|
123
|
+
':nth-last-child(2n of .foo, .bar, .baz)', '#x:nth-last-child(2n of .foo.bip, .baz.bang)')
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_nth_match_is_not_superselector_of_nth_match_with_different_arg
|
127
|
+
refute_superselector(
|
128
|
+
':nth-child(2n of .foo, .bar, .baz)', '#x:nth-child(2n + 1 of .foo.bip, .baz.bang)')
|
129
|
+
refute_superselector(
|
130
|
+
':nth-last-child(2n of .foo, .bar, .baz)', '#x:nth-last-child(2n + 1 of .foo.bip, .baz.bang)')
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_nth_match_is_not_superselector_of_nth_last_match
|
134
|
+
refute_superselector ':nth-child(2n of .foo, .bar)', ':nth-last-child(2n of .foo, .bar)'
|
135
|
+
refute_superselector ':nth-last-child(2n of .foo, .bar)', ':nth-child(2n of .foo, .bar)'
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_nth_match_can_be_subselector
|
139
|
+
%w[nth-child nth-last-child].each do |name|
|
140
|
+
assert_superselector '.foo', ":#{name}(2n of .foo.bar)"
|
141
|
+
assert_superselector '.foo.bar', ":#{name}(2n of .foo.bar.baz)"
|
142
|
+
assert_superselector '.foo', ":#{name}(2n of .foo.bar, .foo.baz)"
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def has_is_superselector_of_subset_host
|
147
|
+
assert_strict_superselector ':has(.foo, .bar, .baz)', ':has(.foo.bip, .baz.bang)'
|
148
|
+
end
|
149
|
+
|
150
|
+
def has_isnt_superselector_of_contained_selector
|
151
|
+
assert_strict_superselector ':has(.foo, .bar, .baz)', '.foo'
|
152
|
+
end
|
153
|
+
|
154
|
+
def host_is_superselector_of_subset_host
|
155
|
+
assert_strict_superselector ':host(.foo, .bar, .baz)', ':host(.foo.bip, .baz.bang)'
|
156
|
+
end
|
157
|
+
|
158
|
+
def host_isnt_superselector_of_contained_selector
|
159
|
+
assert_strict_superselector ':host(.foo, .bar, .baz)', '.foo'
|
160
|
+
end
|
161
|
+
|
162
|
+
def host_context_is_superselector_of_subset_host
|
163
|
+
assert_strict_superselector(
|
164
|
+
':host-context(.foo, .bar, .baz)', ':host-context(.foo.bip, .baz.bang)')
|
165
|
+
end
|
166
|
+
|
167
|
+
def host_context_isnt_superselector_of_contained_selector
|
168
|
+
assert_strict_superselector ':host-context(.foo, .bar, .baz)', '.foo'
|
169
|
+
end
|
170
|
+
|
171
|
+
private
|
172
|
+
|
173
|
+
def assert_superselector(superselector, subselector)
|
174
|
+
assert(parse_selector(superselector).superselector?(parse_selector(subselector)),
|
175
|
+
"Expected #{superselector} to be a superselector of #{subselector}.")
|
176
|
+
end
|
177
|
+
|
178
|
+
def refute_superselector(superselector, subselector)
|
179
|
+
assert(!parse_selector(superselector).superselector?(parse_selector(subselector)),
|
180
|
+
"Expected #{superselector} not to be a superselector of #{subselector}.")
|
181
|
+
end
|
182
|
+
|
183
|
+
def assert_strict_superselector(superselector, subselector)
|
184
|
+
assert_superselector(superselector, subselector)
|
185
|
+
refute_superselector(subselector, superselector)
|
186
|
+
end
|
187
|
+
|
188
|
+
def parse_selector(selector)
|
189
|
+
Sass::SCSS::CssParser.new(selector, filename_for_test, nil).parse_selector
|
190
|
+
end
|
191
|
+
end
|
data/test/sass/test_helper.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
require File.dirname(__FILE__) + '/../../test_helper'
|
4
4
|
|
5
5
|
unless Sass::Util.ruby1_8?
|
6
|
-
class MultibyteStringScannerTest < Test
|
6
|
+
class MultibyteStringScannerTest < MiniTest::Test
|
7
7
|
def setup
|
8
8
|
@scanner = Sass::Util::MultibyteStringScanner.new("cölorfül")
|
9
9
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require File.dirname(__FILE__) + '/../../test_helper'
|
3
3
|
|
4
|
-
class SubsetMapTest < Test
|
4
|
+
class SubsetMapTest < MiniTest::Test
|
5
5
|
def setup
|
6
6
|
@ssm = Sass::Util::SubsetMap.new
|
7
7
|
@ssm[Set[1, 2]] = "Foo"
|
@@ -44,7 +44,7 @@ class SubsetMapTest < Test::Unit::TestCase
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def test_empty_key_set
|
47
|
-
|
47
|
+
assert_raises(ArgumentError) {@ssm[Set[]] = "Fail"}
|
48
48
|
end
|
49
49
|
|
50
50
|
def test_empty_key_get
|
data/test/sass/util_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require File.dirname(__FILE__) + '/../test_helper'
|
3
3
|
|
4
|
-
class ValueHelpersTest < Test
|
4
|
+
class ValueHelpersTest < MiniTest::Test
|
5
5
|
include Sass::Script
|
6
6
|
include Sass::Script::Value::Helpers
|
7
7
|
|
@@ -132,14 +132,14 @@ class ValueHelpersTest < Test::Unit::TestCase
|
|
132
132
|
l = list(number(1, "px"), hex_color("#f71"), :space)
|
133
133
|
l.options = {}
|
134
134
|
assert_kind_of Sass::Script::Value::List, l
|
135
|
-
assert_equal "1px #
|
135
|
+
assert_equal "1px #f71", l.to_sass
|
136
136
|
end
|
137
137
|
|
138
138
|
def test_comma_list
|
139
139
|
l = list(number(1, "px"), hex_color("#f71"), :comma)
|
140
140
|
l.options = {}
|
141
141
|
assert_kind_of Sass::Script::Value::List, l
|
142
|
-
assert_equal "1px, #
|
142
|
+
assert_equal "1px, #f71", l.to_sass
|
143
143
|
end
|
144
144
|
|
145
145
|
def test_missing_list_type
|