sass 3.3.14 → 3.4.0.rc.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +5 -5
  4. data/VERSION +1 -1
  5. data/VERSION_DATE +1 -1
  6. data/VERSION_NAME +1 -1
  7. data/bin/sass +1 -1
  8. data/bin/scss +1 -1
  9. data/lib/sass.rb +0 -5
  10. data/lib/sass/css.rb +1 -3
  11. data/lib/sass/engine.rb +28 -39
  12. data/lib/sass/environment.rb +13 -17
  13. data/lib/sass/error.rb +6 -9
  14. data/lib/sass/exec.rb +5 -771
  15. data/lib/sass/exec/base.rb +187 -0
  16. data/lib/sass/exec/sass_convert.rb +264 -0
  17. data/lib/sass/exec/sass_scss.rb +419 -0
  18. data/lib/sass/features.rb +6 -0
  19. data/lib/sass/importers.rb +0 -1
  20. data/lib/sass/importers/base.rb +5 -1
  21. data/lib/sass/importers/filesystem.rb +4 -21
  22. data/lib/sass/media.rb +1 -4
  23. data/lib/sass/plugin/compiler.rb +32 -136
  24. data/lib/sass/script/css_lexer.rb +1 -1
  25. data/lib/sass/script/functions.rb +363 -39
  26. data/lib/sass/script/lexer.rb +68 -50
  27. data/lib/sass/script/parser.rb +29 -14
  28. data/lib/sass/script/tree.rb +1 -0
  29. data/lib/sass/script/tree/funcall.rb +1 -1
  30. data/lib/sass/script/tree/interpolation.rb +19 -1
  31. data/lib/sass/script/tree/selector.rb +26 -0
  32. data/lib/sass/script/value.rb +0 -1
  33. data/lib/sass/script/value/bool.rb +0 -5
  34. data/lib/sass/script/value/color.rb +32 -12
  35. data/lib/sass/script/value/helpers.rb +107 -0
  36. data/lib/sass/script/value/list.rb +0 -15
  37. data/lib/sass/script/value/null.rb +0 -5
  38. data/lib/sass/script/value/number.rb +60 -14
  39. data/lib/sass/script/value/string.rb +53 -9
  40. data/lib/sass/scss/css_parser.rb +8 -2
  41. data/lib/sass/scss/parser.rb +175 -319
  42. data/lib/sass/scss/rx.rb +14 -5
  43. data/lib/sass/scss/static_parser.rb +298 -1
  44. data/lib/sass/selector.rb +56 -193
  45. data/lib/sass/selector/abstract_sequence.rb +28 -13
  46. data/lib/sass/selector/comma_sequence.rb +91 -12
  47. data/lib/sass/selector/pseudo.rb +256 -0
  48. data/lib/sass/selector/sequence.rb +99 -31
  49. data/lib/sass/selector/simple.rb +14 -25
  50. data/lib/sass/selector/simple_sequence.rb +101 -37
  51. data/lib/sass/shared.rb +1 -1
  52. data/lib/sass/source/map.rb +23 -9
  53. data/lib/sass/stack.rb +0 -6
  54. data/lib/sass/supports.rb +1 -1
  55. data/lib/sass/tree/at_root_node.rb +1 -0
  56. data/lib/sass/tree/directive_node.rb +7 -1
  57. data/lib/sass/tree/error_node.rb +18 -0
  58. data/lib/sass/tree/keyframe_rule_node.rb +15 -0
  59. data/lib/sass/tree/prop_node.rb +1 -1
  60. data/lib/sass/tree/rule_node.rb +11 -6
  61. data/lib/sass/tree/visitors/check_nesting.rb +3 -4
  62. data/lib/sass/tree/visitors/convert.rb +8 -17
  63. data/lib/sass/tree/visitors/cssize.rb +12 -24
  64. data/lib/sass/tree/visitors/deep_copy.rb +5 -0
  65. data/lib/sass/tree/visitors/perform.rb +43 -28
  66. data/lib/sass/tree/visitors/set_options.rb +5 -0
  67. data/lib/sass/tree/visitors/to_css.rb +14 -13
  68. data/lib/sass/util.rb +94 -90
  69. data/test/sass/cache_test.rb +1 -1
  70. data/test/sass/callbacks_test.rb +1 -1
  71. data/test/sass/compiler_test.rb +5 -14
  72. data/test/sass/conversion_test.rb +47 -1
  73. data/test/sass/css2sass_test.rb +3 -3
  74. data/test/sass/encoding_test.rb +219 -0
  75. data/test/sass/engine_test.rb +128 -191
  76. data/test/sass/exec_test.rb +2 -2
  77. data/test/sass/extend_test.rb +234 -17
  78. data/test/sass/functions_test.rb +268 -213
  79. data/test/sass/importer_test.rb +31 -21
  80. data/test/sass/logger_test.rb +1 -1
  81. data/test/sass/more_results/more_import.css +1 -1
  82. data/test/sass/plugin_test.rb +12 -11
  83. data/test/sass/results/compact.css +1 -1
  84. data/test/sass/results/complex.css +4 -4
  85. data/test/sass/results/expanded.css +1 -1
  86. data/test/sass/results/import.css +1 -1
  87. data/test/sass/results/import_charset_ibm866.css +2 -2
  88. data/test/sass/results/mixins.css +17 -17
  89. data/test/sass/results/nested.css +1 -1
  90. data/test/sass/results/parent_ref.css +2 -2
  91. data/test/sass/results/script.css +3 -3
  92. data/test/sass/results/scss_import.css +1 -1
  93. data/test/sass/script_conversion_test.rb +7 -4
  94. data/test/sass/script_test.rb +202 -79
  95. data/test/sass/scss/css_test.rb +95 -25
  96. data/test/sass/scss/rx_test.rb +4 -4
  97. data/test/sass/scss/scss_test.rb +363 -19
  98. data/test/sass/source_map_test.rb +48 -41
  99. data/test/sass/superselector_test.rb +191 -0
  100. data/test/sass/templates/scss_import.scss +2 -1
  101. data/test/sass/test_helper.rb +1 -1
  102. data/test/sass/util/multibyte_string_scanner_test.rb +1 -1
  103. data/test/sass/util/normalized_map_test.rb +1 -1
  104. data/test/sass/util/subset_map_test.rb +2 -2
  105. data/test/sass/util_test.rb +1 -1
  106. data/test/sass/value_helpers_test.rb +3 -3
  107. data/test/test_helper.rb +2 -2
  108. metadata +30 -7
  109. data/lib/sass/importers/deprecated_path.rb +0 -51
  110. 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::Unit::TestCase
6
+ class SourcemapTest < MiniTest::Test
7
7
  def test_to_json_requires_args
8
8
  _, sourcemap = render_with_sourcemap('')
9
- assert_raise(ArgumentError) {sourcemap.to_json({})}
10
- assert_raise(ArgumentError) {sourcemap.to_json({:css_path => 'foo'})}
11
- assert_raise(ArgumentError) {sourcemap.to_json({:sourcemap_path => 'foo'})}
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.force_encoding("IBM866"), <<JSON)
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 "IBM866";
166
- f\x86\x86 {
167
- \x86: b; }
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.force_encoding("IBM866"), <<JSON, :syntax => :sass)
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 "IBM866";
188
- f\x86\x86 {
189
- \x86: b; }
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 red{{/3}};
447
- {{4}}background-color{{/4}}: {{5}}#ffdddd{{/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 #666666, 2px 6px 10px #999999{{/26}};
636
- {{27}}-webkit-box-shadow{{/27}}: {{28}}0px 4px 5px #666666, 2px 6px 10px #999999{{/28}};
637
- {{29}}box-shadow{{/29}}: {{30}}0px 4px 5px #666666, 2px 6px 10px #999999{{/30}}; }
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}}red{{/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 #666666, 2px 6px 10px #999999{{/26}};
693
- {{27}}-webkit-box-shadow{{/27}}: {{28}}0px 4px 5px #666666, 2px 6px 10px #999999{{/28}};
694
- {{29}}box-shadow{{/29}}: {{30}}0px 4px 5px #666666, 2px 6px 10px #999999{{/30}}; }
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
@@ -3,7 +3,8 @@ $preconst: hello;
3
3
  @mixin premixin {pre-mixin: here}
4
4
 
5
5
  @import "importee.sass", "scss_importee", "basic.sass", "basic.css", "../results/complex.css";
6
- @import "partial.sass";
6
+ @import "part\
7
+ ial.sass";
7
8
 
8
9
  nonimported {
9
10
  myconst: $preconst;
@@ -1,7 +1,7 @@
1
1
  test_dir = File.dirname(__FILE__)
2
2
  $:.unshift test_dir unless $:.include?(test_dir)
3
3
 
4
- class Test::Unit::TestCase
4
+ class MiniTest::Test
5
5
  def absolutize(file)
6
6
  File.expand_path("#{File.dirname(__FILE__)}/#{file}")
7
7
  end
@@ -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::Unit::TestCase
6
+ class MultibyteStringScannerTest < MiniTest::Test
7
7
  def setup
8
8
  @scanner = Sass::Util::MultibyteStringScanner.new("cölorfül")
9
9
  end
@@ -2,7 +2,7 @@
2
2
  require File.dirname(__FILE__) + '/../../test_helper'
3
3
  require 'sass/util/normalized_map'
4
4
 
5
- class NormalizedMapTest < Test::Unit::TestCase
5
+ class NormalizedMapTest < MiniTest::Test
6
6
  extend PublicApiLinter
7
7
 
8
8
  lint_api Hash, Sass::Util::NormalizedMap
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  require File.dirname(__FILE__) + '/../../test_helper'
3
3
 
4
- class SubsetMapTest < Test::Unit::TestCase
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
- assert_raise(ArgumentError) {@ssm[Set[]] = "Fail"}
47
+ assert_raises(ArgumentError) {@ssm[Set[]] = "Fail"}
48
48
  end
49
49
 
50
50
  def test_empty_key_get
@@ -3,7 +3,7 @@ require File.dirname(__FILE__) + '/../test_helper'
3
3
  require 'pathname'
4
4
  require 'tmpdir'
5
5
 
6
- class UtilTest < Test::Unit::TestCase
6
+ class UtilTest < MiniTest::Test
7
7
  include Sass::Util
8
8
 
9
9
  def test_scope
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  require File.dirname(__FILE__) + '/../test_helper'
3
3
 
4
- class ValueHelpersTest < Test::Unit::TestCase
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 #ff7711", l.to_sass
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, #ff7711", l.to_sass
142
+ assert_equal "1px, #f71", l.to_sass
143
143
  end
144
144
 
145
145
  def test_missing_list_type