sass 3.4.19 → 3.4.20

Sign up to get free protection for your applications and to get access to all the features.
@@ -3322,6 +3322,34 @@ CSS
3322
3322
  SASS
3323
3323
  end
3324
3324
 
3325
+ def test_compressed_output_of_nth_selectors
3326
+ assert_equal(<<CSS, render(<<SASS, :syntax => :scss, :style => :compressed))
3327
+ :nth-of-type(2n-1),:nth-of-type(2n-1),:nth-of-type(2n-1),:nth-of-type(2n-1),:nth-of-type(2n-1){color:red}:nth-of-type(2n+1),:nth-of-type(2n+1),:nth-of-type(2n+1),:nth-of-type(2n+1),:nth-of-type(2n+1){color:red}
3328
+ CSS
3329
+ :nth-of-type(2n-1), :nth-of-type(2n- 1), :nth-of-type(2n -1), :nth-of-type(2n - 1), :nth-of-type( 2n - 1 ) {
3330
+ color: red }
3331
+ :nth-of-type(2n+1), :nth-of-type(2n+ 1), :nth-of-type(2n +1), :nth-of-type(2n + 1), :nth-of-type( 2n + 1 ) {
3332
+ color: red }
3333
+ SASS
3334
+ end
3335
+
3336
+ def test_import_with_supports_clause_interp
3337
+ assert_equal(<<CSS, render(<<'SASS', :style => :compressed))
3338
+ @import url("fallback-layout.css") supports(not (display: flex))
3339
+ CSS
3340
+ $display-type: flex
3341
+ @import url("fallback-layout.css") supports(not (display: #{$display-type}))
3342
+ SASS
3343
+ end
3344
+
3345
+ def test_import_with_supports_clause
3346
+ assert_equal(<<CSS, render(<<SASS, :style => :compressed))
3347
+ @import url("fallback-layout.css") supports(not (display: flex))
3348
+ CSS
3349
+ @import url("fallback-layout.css") supports(not (display: flex))
3350
+ SASS
3351
+ end
3352
+
3325
3353
  private
3326
3354
 
3327
3355
  def assert_hash_has(hash, expected)
@@ -154,6 +154,7 @@ WARNING
154
154
  assert_equal("5px", evaluate("round(4.8px)"))
155
155
  assert_equal("5px", evaluate("round(5.49px)"))
156
156
  assert_equal("5px", evaluate("round($number: 5.49px)"))
157
+ assert_equal("-6", evaluate("round(-5.5)"))
157
158
  end
158
159
 
159
160
  def test_round_checks_types
@@ -197,6 +198,7 @@ WARNING
197
198
  assert_equal("1", evaluate("min(3px, 2px, 1)"))
198
199
  assert_equal("4em", evaluate("min(4em)"))
199
200
  assert_equal("10cm", evaluate("min(10cm, 6in)"))
201
+ assert_equal("1q", evaluate("min(1cm, 1q)"))
200
202
 
201
203
  assert_error_message("#aaaaaa is not a number for `min'", "min(#aaa)")
202
204
  assert_error_message("Incompatible units: 'px' and 'em'.", "min(3em, 4em, 1px)")
@@ -207,6 +209,7 @@ WARNING
207
209
  assert_equal("3", evaluate("max(3, 2px, 1px)"))
208
210
  assert_equal("4em", evaluate("max(4em)"))
209
211
  assert_equal("6in", evaluate("max(10cm, 6in)"))
212
+ assert_equal("11mm", evaluate("max(11mm, 10q)"))
210
213
 
211
214
  assert_error_message("#aaaaaa is not a number for `max'", "max(#aaa)")
212
215
  assert_error_message("Incompatible units: 'px' and 'em'.", "max(3em, 4em, 1px)")
@@ -264,20 +264,21 @@ RUBY
264
264
  end
265
265
 
266
266
  def test_interpolation
267
- assert_renders "$foo\#{$bar}$baz"
268
- assert_renders "$foo\#{$bar} $baz"
269
- assert_renders "$foo \#{$bar}$baz"
267
+ assert_equal 'unquote("#{$foo}#{$bar}#{$baz}")', render("$foo\#{$bar}$baz")
268
+ assert_equal 'unquote("#{$foo}#{$bar} #{$baz}")', render("$foo\#{$bar} $baz")
269
+ assert_equal 'unquote("#{$foo} #{$bar}#{$baz}")', render("$foo \#{$bar}$baz")
270
270
  assert_renders "$foo \#{$bar} $baz"
271
271
  assert_renders "$foo \#{$bar}\#{$bang} $baz"
272
272
  assert_renders "$foo \#{$bar} \#{$bang} $baz"
273
- assert_renders "\#{$bar}$baz"
274
- assert_renders "$foo\#{$bar}"
273
+ assert_equal 'unquote("#{$bar}#{$baz}")', render("\#{$bar}$baz")
274
+ assert_equal 'unquote("#{$foo}#{$bar}")', render("$foo\#{$bar}")
275
275
  assert_renders "\#{$bar}"
276
276
  end
277
277
 
278
278
  def test_interpolation_in_function
279
279
  assert_renders 'flabnabbit(#{1 + "foo"})'
280
- assert_renders 'flabnabbit($foo #{1 + "foo"}$baz)'
280
+ assert_equal 'flabnabbit(unquote("#{$foo} #{1 + "foo"}#{$baz}"))',
281
+ render('flabnabbit($foo #{1 + "foo"}$baz)')
281
282
  assert_renders 'flabnabbit($foo #{1 + "foo"}#{2 + "bar"} $baz)'
282
283
  end
283
284
 
@@ -299,30 +300,30 @@ RUBY
299
300
  assert_renders '3/ #{3 + 4}'
300
301
  assert_renders '3/#{3 + 4}'
301
302
 
302
- assert_renders '#{1 + 2} * 7'
303
- assert_renders '#{1 + 2}* 7'
304
- assert_renders '#{1 + 2} *7'
305
- assert_renders '#{1 + 2}*7'
303
+ assert_equal 'unquote("#{1 + 2} * 7")', render('#{1 + 2} * 7')
304
+ assert_equal 'unquote("#{1 + 2}* 7")', render('#{1 + 2}* 7')
305
+ assert_equal 'unquote("#{1 + 2} *7")', render('#{1 + 2} *7')
306
+ assert_equal 'unquote("#{1 + 2}*7")', render('#{1 + 2}*7')
306
307
 
307
308
  assert_renders '-#{1 + 2}'
308
- assert_renders '- #{1 + 2}'
309
+ assert_equal 'unquote("- #{1 + 2}")', render('- #{1 + 2}')
309
310
 
310
- assert_renders '5 + #{1 + 2} * #{3 + 4}'
311
- assert_renders '5 +#{1 + 2} * #{3 + 4}'
312
- assert_renders '5+#{1 + 2} * #{3 + 4}'
313
- assert_renders '#{1 + 2} * #{3 + 4} + 5'
314
- assert_renders '#{1 + 2} * #{3 + 4}+ 5'
315
- assert_renders '#{1 + 2} * #{3 + 4}+5'
311
+ assert_equal 'unquote("5 + #{1 + 2} * #{3 + 4}")', render('5 + #{1 + 2} * #{3 + 4}')
312
+ assert_equal 'unquote("5 +#{1 + 2} * #{3 + 4}")', render('5 +#{1 + 2} * #{3 + 4}')
313
+ assert_equal 'unquote("5+#{1 + 2} * #{3 + 4}")', render('5+#{1 + 2} * #{3 + 4}')
314
+ assert_equal 'unquote("#{1 + 2} * #{3 + 4} + 5")', render('#{1 + 2} * #{3 + 4} + 5')
315
+ assert_equal 'unquote("#{1 + 2} * #{3 + 4}+ 5")', render('#{1 + 2} * #{3 + 4}+ 5')
316
+ assert_equal 'unquote("#{1 + 2} * #{3 + 4}+5")', render('#{1 + 2} * #{3 + 4}+5')
316
317
 
317
- assert_equal '5 / #{1 + 2} + #{3 + 4}', render('5 / (#{1 + 2} + #{3 + 4})')
318
- assert_equal '5 / #{1 + 2} + #{3 + 4}', render('5 /(#{1 + 2} + #{3 + 4})')
319
- assert_equal '5 / #{1 + 2} + #{3 + 4}', render('5 /( #{1 + 2} + #{3 + 4} )')
320
- assert_equal '#{1 + 2} + #{3 + 4} / 5', render('(#{1 + 2} + #{3 + 4}) / 5')
321
- assert_equal '#{1 + 2} + #{3 + 4} / 5', render('(#{1 + 2} + #{3 + 4})/ 5')
322
- assert_equal '#{1 + 2} + #{3 + 4} / 5', render('( #{1 + 2} + #{3 + 4} )/ 5')
318
+ assert_equal '5 / unquote("#{1 + 2} + #{3 + 4}")', render('5 / (#{1 + 2} + #{3 + 4})')
319
+ assert_equal '5 / unquote("#{1 + 2} + #{3 + 4}")', render('5 /(#{1 + 2} + #{3 + 4})')
320
+ assert_equal '5 / unquote("#{1 + 2} + #{3 + 4}")', render('5 /( #{1 + 2} + #{3 + 4} )')
321
+ assert_equal 'unquote("#{1 + 2} + #{3 + 4}") / 5', render('(#{1 + 2} + #{3 + 4}) / 5')
322
+ assert_equal 'unquote("#{1 + 2} + #{3 + 4}") / 5', render('(#{1 + 2} + #{3 + 4})/ 5')
323
+ assert_equal 'unquote("#{1 + 2} + #{3 + 4}") / 5', render('( #{1 + 2} + #{3 + 4} )/ 5')
323
324
 
324
- assert_renders '#{1 + 2} + 2 + 3'
325
- assert_renders '#{1 + 2} +2 + 3'
325
+ assert_equal 'unquote("#{1 + 2} + #{2 + 3}")', render('#{1 + 2} + 2 + 3')
326
+ assert_equal 'unquote("#{1 + 2} +#{2 + 3}")', render('#{1 + 2} +2 + 3')
326
327
  end
327
328
 
328
329
  def test_string_interpolation
@@ -350,7 +351,7 @@ RUBY
350
351
 
351
352
  def render(script, options = {})
352
353
  munge_filename(options)
353
- node = Sass::Script.parse(script, 1, 0, options)
354
+ node = Sass::Script.parse(script, 1, 0, options.merge(:_convert => true))
354
355
  node.to_sass
355
356
  end
356
357
  end
@@ -191,43 +191,45 @@ class SassScriptTest < MiniTest::Test
191
191
  end
192
192
 
193
193
  def test_interpolation_near_operators
194
- assert_equal '3 , 7', resolve('#{1 + 2} , #{3 + 4}')
195
- assert_equal '3, 7', resolve('#{1 + 2}, #{3 + 4}')
196
- assert_equal '3 ,7', resolve('#{1 + 2} ,#{3 + 4}')
197
- assert_equal '3,7', resolve('#{1 + 2},#{3 + 4}')
198
- assert_equal '3, 7, 11', resolve('#{1 + 2}, #{3 + 4}, #{5 + 6}')
199
- assert_equal '3, 7, 11', resolve('3, #{3 + 4}, 11')
200
- assert_equal '3, 7, 11', resolve('3, 7, #{5 + 6}')
201
-
202
- assert_equal '3 / 7', resolve('3 / #{3 + 4}')
203
- assert_equal '3 /7', resolve('3 /#{3 + 4}')
204
- assert_equal '3/ 7', resolve('3/ #{3 + 4}')
205
- assert_equal '3/7', resolve('3/#{3 + 4}')
206
-
207
- assert_equal '3 * 7', resolve('#{1 + 2} * 7')
208
- assert_equal '3* 7', resolve('#{1 + 2}* 7')
209
- assert_equal '3 *7', resolve('#{1 + 2} *7')
210
- assert_equal '3*7', resolve('#{1 + 2}*7')
211
-
212
- assert_equal '-3', resolve('-#{1 + 2}')
213
- assert_equal '- 3', resolve('- #{1 + 2}')
214
-
215
- assert_equal '5 + 3 * 7', resolve('5 + #{1 + 2} * #{3 + 4}')
216
- assert_equal '5 +3 * 7', resolve('5 +#{1 + 2} * #{3 + 4}')
217
- assert_equal '5+3 * 7', resolve('5+#{1 + 2} * #{3 + 4}')
218
- assert_equal '3 * 7 + 5', resolve('#{1 + 2} * #{3 + 4} + 5')
219
- assert_equal '3 * 7+ 5', resolve('#{1 + 2} * #{3 + 4}+ 5')
220
- assert_equal '3 * 7+5', resolve('#{1 + 2} * #{3 + 4}+5')
221
-
222
- assert_equal '5/3 + 7', resolve('5 / (#{1 + 2} + #{3 + 4})')
223
- assert_equal '5/3 + 7', resolve('5 /(#{1 + 2} + #{3 + 4})')
224
- assert_equal '5/3 + 7', resolve('5 /( #{1 + 2} + #{3 + 4} )')
225
- assert_equal '3 + 7/5', resolve('(#{1 + 2} + #{3 + 4}) / 5')
226
- assert_equal '3 + 7/5', resolve('(#{1 + 2} + #{3 + 4})/ 5')
227
- assert_equal '3 + 7/5', resolve('( #{1 + 2} + #{3 + 4} )/ 5')
228
-
229
- assert_equal '3 + 5', resolve('#{1 + 2} + 2 + 3')
230
- assert_equal '3 +5', resolve('#{1 + 2} +2 + 3')
194
+ silence_warnings do
195
+ assert_equal '3 , 7', resolve('#{1 + 2} , #{3 + 4}')
196
+ assert_equal '3, 7', resolve('#{1 + 2}, #{3 + 4}')
197
+ assert_equal '3 ,7', resolve('#{1 + 2} ,#{3 + 4}')
198
+ assert_equal '3,7', resolve('#{1 + 2},#{3 + 4}')
199
+ assert_equal '3, 7, 11', resolve('#{1 + 2}, #{3 + 4}, #{5 + 6}')
200
+ assert_equal '3, 7, 11', resolve('3, #{3 + 4}, 11')
201
+ assert_equal '3, 7, 11', resolve('3, 7, #{5 + 6}')
202
+
203
+ assert_equal '3 / 7', resolve('3 / #{3 + 4}')
204
+ assert_equal '3 /7', resolve('3 /#{3 + 4}')
205
+ assert_equal '3/ 7', resolve('3/ #{3 + 4}')
206
+ assert_equal '3/7', resolve('3/#{3 + 4}')
207
+
208
+ assert_equal '3 * 7', resolve('#{1 + 2} * 7')
209
+ assert_equal '3* 7', resolve('#{1 + 2}* 7')
210
+ assert_equal '3 *7', resolve('#{1 + 2} *7')
211
+ assert_equal '3*7', resolve('#{1 + 2}*7')
212
+
213
+ assert_equal '-3', resolve('-#{1 + 2}')
214
+ assert_equal '- 3', resolve('- #{1 + 2}')
215
+
216
+ assert_equal '5 + 3 * 7', resolve('5 + #{1 + 2} * #{3 + 4}')
217
+ assert_equal '5 +3 * 7', resolve('5 +#{1 + 2} * #{3 + 4}')
218
+ assert_equal '5+3 * 7', resolve('5+#{1 + 2} * #{3 + 4}')
219
+ assert_equal '3 * 7 + 5', resolve('#{1 + 2} * #{3 + 4} + 5')
220
+ assert_equal '3 * 7+ 5', resolve('#{1 + 2} * #{3 + 4}+ 5')
221
+ assert_equal '3 * 7+5', resolve('#{1 + 2} * #{3 + 4}+5')
222
+
223
+ assert_equal '5/3 + 7', resolve('5 / (#{1 + 2} + #{3 + 4})')
224
+ assert_equal '5/3 + 7', resolve('5 /(#{1 + 2} + #{3 + 4})')
225
+ assert_equal '5/3 + 7', resolve('5 /( #{1 + 2} + #{3 + 4} )')
226
+ assert_equal '3 + 7/5', resolve('(#{1 + 2} + #{3 + 4}) / 5')
227
+ assert_equal '3 + 7/5', resolve('(#{1 + 2} + #{3 + 4})/ 5')
228
+ assert_equal '3 + 7/5', resolve('( #{1 + 2} + #{3 + 4} )/ 5')
229
+
230
+ assert_equal '3 + 5', resolve('#{1 + 2} + 2 + 3')
231
+ assert_equal '3 +5', resolve('#{1 + 2} +2 + 3')
232
+ end
231
233
  end
232
234
 
233
235
  def test_string_interpolation
@@ -496,10 +498,14 @@ SASS
496
498
 
497
499
  def test_operator_unit_conversion
498
500
  assert_equal "1.1cm", resolve("1cm + 1mm")
501
+ assert_equal "8q", resolve("4q + 1mm")
502
+ assert_equal "40.025cm", resolve("40cm + 1q")
499
503
  assert_equal "2in", resolve("1in + 96px")
500
504
  assert_equal "true", resolve("2mm < 1cm")
501
505
  assert_equal "true", resolve("10mm == 1cm")
502
506
  assert_equal "true", resolve("1.1cm == 11mm")
507
+ assert_equal "true", resolve("2mm == 8q")
508
+ assert_equal "false", resolve("2px > 3q")
503
509
 
504
510
  assert_warning(<<WARNING) {assert_equal "true", resolve("1 == 1cm")}
505
511
  DEPRECATION WARNING on line 1 of test_operator_unit_conversion_inline.sass:
@@ -521,6 +527,8 @@ WARNING
521
527
  assert_equal "2.83465", resolve("(1mm/1pt)")
522
528
  assert_equal "1.33333", resolve("(1pt/1px)")
523
529
  assert_equal "0.01042", resolve("(1px/1in)")
530
+ assert_equal "1.05833", resolve("(1px/1q)")
531
+ assert_equal "0.05906", resolve("(1q/1pc)")
524
532
  end
525
533
 
526
534
  def test_angle_units
@@ -1171,12 +1179,164 @@ SASS
1171
1179
  assert_equal "true", resolve("29 == (29 / 7 * 7)")
1172
1180
  end
1173
1181
 
1182
+ def test_compressed_output_of_numbers_with_leading_zeros
1183
+ assert_equal "1.5", resolve("1.5", :style => :compressed)
1184
+ assert_equal ".5", resolve("0.5", :style => :compressed)
1185
+ assert_equal "-.5", resolve("-0.5", :style => :compressed)
1186
+ assert_equal "0.5", resolve("0.5", :style => :compact)
1187
+ end
1188
+
1189
+ def test_interpolation_without_deprecation_warning
1190
+ assert_no_warning {assert_equal "a", resolve('#{a}')}
1191
+ assert_no_warning {assert_equal "abc", resolve('a#{b}c')}
1192
+ assert_no_warning {assert_equal "+ a", resolve('+ #{a}')}
1193
+ assert_no_warning {assert_equal "/ a", resolve('/ #{a}')}
1194
+ assert_no_warning {assert_equal "1 / a", resolve('1 / #{a}')}
1195
+ assert_no_warning {assert_equal "a / b", resolve('#{a} / #{b}')}
1196
+ assert_no_warning {assert_equal "foo(1 = a)", resolve('foo(1 = #{a})')}
1197
+ assert_no_warning {assert_equal "foo(a = b)", resolve('foo(#{a} = #{b})')}
1198
+ assert_no_warning {assert_equal "-a", resolve('-#{a}')}
1199
+ assert_no_warning {assert_equal "1-a", resolve('1-#{a}')}
1200
+ assert_no_warning {assert_equal "a- 1", resolve('#{a}- 1')}
1201
+ assert_no_warning {assert_equal "a-1", resolve('#{a}-1')}
1202
+ assert_no_warning {assert_equal "a-b", resolve('#{a}-#{b}')}
1203
+ assert_no_warning {assert_equal "a1", resolve('#{a}1')}
1204
+ assert_no_warning {assert_equal "ab", resolve('#{a}b')}
1205
+ assert_no_warning {assert_equal "1a", resolve('1#{a}')}
1206
+ assert_no_warning {assert_equal "ba", resolve('b#{a}')}
1207
+ end
1208
+
1209
+ def test_leading_interpolation_with_deprecation_warning
1210
+ assert_equal "ab == 1", resolve_with_interp_warning('#{a + b} == 1')
1211
+ assert_equal "ab != 1", resolve_with_interp_warning('#{a + b} != 1')
1212
+ assert_equal "ab > 1", resolve_with_interp_warning('#{a + b} > 1')
1213
+ assert_equal "ab >= 1", resolve_with_interp_warning('#{a + b} >= 1')
1214
+ assert_equal "ab < 1", resolve_with_interp_warning('#{a + b} < 1')
1215
+ assert_equal "ab <= 1", resolve_with_interp_warning('#{a + b} <= 1')
1216
+ assert_equal "ab + 1", resolve_with_interp_warning('#{a + b} + 1')
1217
+ assert_equal "ab * 1", resolve_with_interp_warning('#{a + b} * 1')
1218
+ assert_equal "ab - 1", resolve_with_interp_warning('#{a + b} - 1')
1219
+ assert_equal "ab % 1", resolve_with_interp_warning('#{a + b} % 1')
1220
+ assert_equal(
1221
+ "abvar",
1222
+ resolve_with_interp_warning(
1223
+ '#{a + b}$var', '"#{a + b}#{$var}"',
1224
+ env('var' => Sass::Script::Value::String.new("var"))))
1225
+ assert_equal(
1226
+ "varab",
1227
+ resolve_with_interp_warning(
1228
+ '$var#{a + b}', '"#{$var}#{a + b}"',
1229
+ env('var' => Sass::Script::Value::String.new("var"))))
1230
+ assert_equal "ab1", resolve_with_interp_warning('#{a + b}(1)', '"#{a + b}1"')
1231
+ assert_equal "1ab", resolve_with_interp_warning('(1)#{a + b}', '"1#{a + b}"')
1232
+ end
1233
+
1234
+ def test_trailing_interpolation_with_deprecation_warning
1235
+ assert_equal "not ab", resolve_with_interp_warning('not #{a + b}')
1236
+ assert_equal "1 and ab", resolve_with_interp_warning('1 and #{a + b}')
1237
+ assert_equal "1 or ab", resolve_with_interp_warning('1 or #{a + b}')
1238
+ assert_equal "1 == ab", resolve_with_interp_warning('1 == #{a + b}')
1239
+ assert_equal "1 != ab", resolve_with_interp_warning('1 != #{a + b}')
1240
+ assert_equal "1 > ab", resolve_with_interp_warning('1 > #{a + b}')
1241
+ assert_equal "1 >= ab", resolve_with_interp_warning('1 >= #{a + b}')
1242
+ assert_equal "1 < ab", resolve_with_interp_warning('1 < #{a + b}')
1243
+ assert_equal "1 <= ab", resolve_with_interp_warning('1 <= #{a + b}')
1244
+ assert_equal "1 + ab", resolve_with_interp_warning('1 + #{a + b}')
1245
+ assert_equal "1 * ab", resolve_with_interp_warning('1 * #{a + b}')
1246
+ assert_equal "1 - ab", resolve_with_interp_warning('1 - #{a + b}')
1247
+ assert_equal "1 % ab", resolve_with_interp_warning('1 % #{a + b}')
1248
+ assert_equal "- ab", resolve_with_interp_warning('- #{a + b}')
1249
+ assert_equal "1- ab", resolve_with_interp_warning('1- #{a + b}')
1250
+ assert_equal "- ab 2 3", resolve_with_interp_warning('- #{a + b} 2 3', '"- #{a + b} #{2 3}"')
1251
+ end
1252
+
1253
+ def test_brackteing_interpolation_with_deprecation_warning
1254
+ assert_equal "ab == cd", resolve_with_interp_warning('#{a + b} == #{c + d}')
1255
+ assert_equal "ab != cd", resolve_with_interp_warning('#{a + b} != #{c + d}')
1256
+ assert_equal "ab > cd", resolve_with_interp_warning('#{a + b} > #{c + d}')
1257
+ assert_equal "ab >= cd", resolve_with_interp_warning('#{a + b} >= #{c + d}')
1258
+ assert_equal "ab < cd", resolve_with_interp_warning('#{a + b} < #{c + d}')
1259
+ assert_equal "ab <= cd", resolve_with_interp_warning('#{a + b} <= #{c + d}')
1260
+ assert_equal "ab + cd", resolve_with_interp_warning('#{a + b} + #{c + d}')
1261
+ assert_equal "ab * cd", resolve_with_interp_warning('#{a + b} * #{c + d}')
1262
+ assert_equal "ab - cd", resolve_with_interp_warning('#{a + b} - #{c + d}')
1263
+ assert_equal "ab % cd", resolve_with_interp_warning('#{a + b} % #{c + d}')
1264
+ end
1265
+
1266
+ def test_interp_warning_formatting
1267
+ resolve_with_interp_warning('#{1} + 1', '"1 + 1"')
1268
+ resolve_with_interp_warning('#{1} + "foo"', '\'1 + "foo"\'')
1269
+ resolve_with_interp_warning('#{1} + \'foo\'', '\'1 + "foo"\'')
1270
+
1271
+ resolve_with_interp_warning('#{1} + "#{a + b}"', '\'1 + "#{a + b}"\'')
1272
+ resolve_with_interp_warning('"#{a + b}" + #{1}', '\'"#{a + b}" + 1\'')
1273
+ resolve_with_interp_warning('"#{a + b}" + #{1} + "#{c + d}"', '\'"#{a + b}" + 1 + "#{c + d}"\'')
1274
+
1275
+ resolve_with_interp_warning('#{1} + "\'"', '"1 + \\"\'\\""')
1276
+ resolve_with_interp_warning('#{1} + \'"\'', '"1 + \'\\"\'"')
1277
+ resolve_with_interp_warning('#{1} + "\'\\""', '"1 + \\"\'\\\\\\"\\""')
1278
+ end
1279
+
1280
+ def test_inactive_lazy_interpolation_deprecation_warning
1281
+ assert_equal '1, 2, 3', assert_no_warning {resolve('1, #{2}, 3')}
1282
+ assert_equal '1, 2, 3', assert_no_warning {resolve('1, 2, #{3}')}
1283
+ assert_equal '1,2,3', assert_no_warning {resolve('1,#{2},3')}
1284
+ assert_equal '1 2 3', assert_no_warning {resolve('#{1} 2 3')}
1285
+ assert_equal '1 2 3', assert_no_warning {resolve('1 #{2} 3')}
1286
+ assert_equal '1 2 3', assert_no_warning {resolve('1 2 #{3}')}
1287
+
1288
+ assert_equal '+1 2 3', assert_no_warning {resolve('+#{1} 2 3')}
1289
+ assert_equal '-1 2 3', assert_no_warning {resolve('-#{1} 2 3')}
1290
+ assert_equal '/1 2 3', assert_no_warning {resolve('/#{1} 2 3')}
1291
+
1292
+ assert_equal '1, 2, 31', assert_no_warning {resolve('(1, #{2}, 3) + 1')}
1293
+ assert_equal '11, 2, 3', assert_no_warning {resolve('1 + (1, #{2}, 3)')}
1294
+
1295
+ assert_equal 'a, b, c', assert_no_warning {resolve('selector-parse((a, #{b}, c))')}
1296
+ end
1297
+
1298
+ def test_active_lazy_interpolation_deprecation_warning
1299
+ assert_equal "1, 2, 3", resolve_with_lazy_interp_warning('quote((1, #{2}, 3))', '"1, 2, 3"')
1300
+ assert_equal "1", resolve_with_lazy_interp_warning('length((1, #{2}, 3))', '"1, 2, 3"')
1301
+ assert_equal "1, 2, 3", resolve_with_lazy_interp_warning('inspect((1, #{2}, 3))', '"1, 2, 3"')
1302
+ assert_equal "string", resolve_with_lazy_interp_warning('type-of((1, #{2}, 3))', '"1, 2, 3"')
1303
+
1304
+ assert_equal "+1 2 3", resolve_with_lazy_interp_warning('quote((+#{1} 2 3))', '"+1 #{2 3}"')
1305
+ assert_equal "/1 2 3", resolve_with_lazy_interp_warning('quote((/#{1} 2 3))', '"/1 #{2 3}"')
1306
+ assert_equal "-1 2 3", resolve_with_lazy_interp_warning('quote((-#{1} 2 3))', '"-1 #{2 3}"')
1307
+ end
1308
+
1174
1309
  private
1175
1310
 
1311
+ def resolve_with_lazy_interp_warning(str, contents = nil, environment = env)
1312
+ contents ||= "\"#{str}\""
1313
+ result = assert_warning(<<WARNING) {resolve(str, {}, environment)}
1314
+ DEPRECATION WARNING on line 1 of #{filename_for_test}: \#{} interpolation near operators will be simplified
1315
+ in a future version of Sass. To preserve the current behavior, use quotes:
1316
+
1317
+ unquote(#{contents})
1318
+ WARNING
1319
+ $_sass_deprecated_interp_warnings = nil
1320
+ result
1321
+ end
1322
+
1323
+ def resolve_with_interp_warning(str, contents = nil, environment = env)
1324
+ contents ||= "\"#{str}\""
1325
+ assert_warning(<<WARNING) {resolve(str, {}, environment)}
1326
+ DEPRECATION WARNING on line 1 of #{filename_for_test}: \#{} interpolation near operators will be simplified
1327
+ in a future version of Sass. To preserve the current behavior, use quotes:
1328
+
1329
+ unquote(#{contents})
1330
+
1331
+ You can use the sass-convert command to automatically fix most cases.
1332
+ WARNING
1333
+ end
1334
+
1176
1335
  def resolve(str, opts = {}, environment = env)
1177
1336
  munge_filename opts
1178
1337
  val = eval(str, opts, environment)
1179
1338
  assert_kind_of Sass::Script::Value::Base, val
1339
+ val.options = opts
1180
1340
  val.is_a?(Sass::Script::Value::String) ? val.value : val.to_s
1181
1341
  end
1182
1342
 
@@ -4125,4 +4125,23 @@ CSS
4125
4125
  }
4126
4126
  SCSS
4127
4127
  end
4128
+
4129
+ def test_import_with_supports_clause_interp
4130
+ assert_equal(<<CSS, render(<<'SASS', :style => :compressed))
4131
+ @import url("fallback-layout.css") supports(not (display: flex))
4132
+ CSS
4133
+ $display-type: flex;
4134
+ @import url("fallback-layout.css") supports(not (display: #{$display-type}));
4135
+ SASS
4136
+ end
4137
+
4138
+ def test_import_with_supports_clause
4139
+ assert_equal(<<CSS, render(<<SASS, :style => :compressed))
4140
+ @import url("fallback-layout.css") supports(not (display: flex));.foo{bar:baz}
4141
+ CSS
4142
+ @import url("fallback-layout.css") supports(not (display: flex));
4143
+ .foo { bar: baz; }
4144
+ SASS
4145
+ end
4146
+
4128
4147
  end
@@ -28,7 +28,7 @@ a {
28
28
  CSS
29
29
  {
30
30
  "version": 3,
31
- "mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;;EAER,SAAS,EAAE,IAAI",
31
+ "mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;EACV,kBAAkB;EAChB,SAAS,EAAE,IAAI",
32
32
  "sources": ["test_simple_mapping_scss_inline.scss"],
33
33
  "names": [],
34
34
  "file": "test.css"
@@ -78,7 +78,7 @@ a {
78
78
  CSS
79
79
  {
80
80
  "version": 3,
81
- "mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;;EAER,SAAS,EAAE,IAAI",
81
+ "mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;EACV,kBAAkB;EAChB,SAAS,EAAE,IAAI",
82
82
  "sources": ["#{uri}"],
83
83
  "names": [],
84
84
  "file": "test.css"
@@ -104,7 +104,7 @@ a {
104
104
  CSS
105
105
  {
106
106
  "version": 3,
107
- "mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;;EAER,SAAS,EAAE,IAAI",
107
+ "mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;EACV,kBAAkB;EAChB,SAAS,EAAE,IAAI",
108
108
  "sources": ["../scss/style.scss"],
109
109
  "names": [],
110
110
  "file": "style.css"
@@ -350,44 +350,44 @@ CSS
350
350
  $width: 2px;
351
351
  $translucent-red: rgba(255, 0, 0, 0.5);
352
352
  {{1}}a {{/1}}{
353
- {{8}}.special {{/8}}{
354
- {{9}}color{{/9}}: {{10}}red{{/10}};
355
- {{11}}&:hover {{/11}}{
356
- {{12}}foo{{/12}}: {{13}}bar{{/13}};
357
- {{14}}cursor{{/14}}: {{15}}e + -resize{{/15}};
358
- {{16}}color{{/16}}: {{17}}opacify($translucent-red, 0.3){{/17}};
353
+ {{9}}.special {{/9}}{
354
+ {{10}}color{{/10}}: {{11}}red{{/11}};
355
+ {{12}}&:hover {{/12}}{
356
+ {{13}}foo{{/13}}: {{14}}bar{{/14}};
357
+ {{15}}cursor{{/15}}: {{16}}e + -resize{{/16}};
358
+ {{17}}color{{/17}}: {{18}}opacify($translucent-red, 0.3){{/18}};
359
359
  }
360
- {{18}}&:after {{/18}}{
361
- {{19}}content{{/19}}: {{20}}"I ate #{5 + 10} pies #{$width} thick!"{{/20}};
360
+ {{19}}&:after {{/19}}{
361
+ {{20}}content{{/20}}: {{21}}"I ate #{5 + 10} pies #{$width} thick!"{{/21}};
362
362
  }
363
363
  }
364
- {{21}}&:active {{/21}}{
365
- {{22}}color{{/22}}: {{23}}#010203 + #040506{{/23}};
366
- {{24}}border{{/24}}: {{25}}$width solid black{{/25}};
364
+ {{22}}&:active {{/22}}{
365
+ {{23}}color{{/23}}: {{24}}#010203 + #040506{{/24}};
366
+ {{25}}border{{/25}}: {{26}}$width solid black{{/26}};
367
367
  }
368
- /* SOME COMMENT */
369
- {{2}}font{{/2}}: {{3}}2px/3px {{/3}}{
370
- {{4}}family{{/4}}: {{5}}fantasy{{/5}};
371
- {{6}}size{{/6}}: {{7}}1em + (2em * 3){{/7}};
368
+ {{2}}/* SOME COMMENT */{{/2}}
369
+ {{3}}font{{/3}}: {{4}}2px/3px {{/4}}{
370
+ {{5}}family{{/5}}: {{6}}fantasy{{/6}};
371
+ {{7}}size{{/7}}: {{8}}1em + (2em * 3){{/8}};
372
372
  }
373
373
  }
374
374
  SCSS
375
375
  {{1}}a{{/1}} {
376
- /* SOME COMMENT */
377
- {{2}}font{{/2}}: {{3}}2px/3px{{/3}};
378
- {{4}}font-family{{/4}}: {{5}}fantasy{{/5}};
379
- {{6}}font-size{{/6}}: {{7}}7em{{/7}}; }
380
- {{8}}a .special{{/8}} {
381
- {{9}}color{{/9}}: {{10}}red{{/10}}; }
382
- {{11}}a .special:hover{{/11}} {
383
- {{12}}foo{{/12}}: {{13}}bar{{/13}};
384
- {{14}}cursor{{/14}}: {{15}}e-resize{{/15}};
385
- {{16}}color{{/16}}: {{17}}rgba(255, 0, 0, 0.8){{/17}}; }
386
- {{18}}a .special:after{{/18}} {
387
- {{19}}content{{/19}}: {{20}}"I ate 15 pies 2px thick!"{{/20}}; }
388
- {{21}}a:active{{/21}} {
389
- {{22}}color{{/22}}: {{23}}#050709{{/23}};
390
- {{24}}border{{/24}}: {{25}}2px solid black{{/25}}; }
376
+ {{2}}/* SOME COMMENT */{{/2}}
377
+ {{3}}font{{/3}}: {{4}}2px/3px{{/4}};
378
+ {{5}}font-family{{/5}}: {{6}}fantasy{{/6}};
379
+ {{7}}font-size{{/7}}: {{8}}7em{{/8}}; }
380
+ {{9}}a .special{{/9}} {
381
+ {{10}}color{{/10}}: {{11}}red{{/11}}; }
382
+ {{12}}a .special:hover{{/12}} {
383
+ {{13}}foo{{/13}}: {{14}}bar{{/14}};
384
+ {{15}}cursor{{/15}}: {{16}}e-resize{{/16}};
385
+ {{17}}color{{/17}}: {{18}}rgba(255, 0, 0, 0.8){{/18}}; }
386
+ {{19}}a .special:after{{/19}} {
387
+ {{20}}content{{/20}}: {{21}}"I ate 15 pies 2px thick!"{{/21}}; }
388
+ {{22}}a:active{{/22}} {
389
+ {{23}}color{{/23}}: {{24}}#050709{{/24}};
390
+ {{25}}border{{/25}}: {{26}}2px solid black{{/26}}; }
391
391
 
392
392
  /*# sourceMappingURL=test.css.map */
393
393
  CSS
@@ -398,39 +398,39 @@ CSS
398
398
  $width: 2px
399
399
  $translucent-red: rgba(255, 0, 0, 0.5)
400
400
  {{1}}a{{/1}}
401
- {{8}}.special{{/8}}
402
- {{9}}color{{/9}}: {{10}}red{{/10}}
403
- {{11}}&:hover{{/11}}
404
- {{12}}foo{{/12}}: {{13}}bar{{/13}}
405
- {{14}}cursor{{/14}}: {{15}}e + -resize{{/15}}
406
- {{16}}color{{/16}}: {{17}}opacify($translucent-red, 0.3){{/17}}
407
- {{18}}&:after{{/18}}
408
- {{19}}content{{/19}}: {{20}}"I ate #{5 + 10} pies #{$width} thick!"{{/20}}
409
- {{21}}&:active{{/21}}
410
- {{22}}color{{/22}}: {{23}}#010203 + #040506{{/23}}
411
- {{24}}border{{/24}}: {{25}}$width solid black{{/25}}
412
-
413
- /* SOME COMMENT */
414
- {{2}}font{{/2}}: {{3}}2px/3px{{/3}}
415
- {{4}}family{{/4}}: {{5}}fantasy{{/5}}
416
- {{6}}size{{/6}}: {{7}}1em + (2em * 3){{/7}}
401
+ {{9}}.special{{/9}}
402
+ {{10}}color{{/10}}: {{11}}red{{/11}}
403
+ {{12}}&:hover{{/12}}
404
+ {{13}}foo{{/13}}: {{14}}bar{{/14}}
405
+ {{15}}cursor{{/15}}: {{16}}e + -resize{{/16}}
406
+ {{17}}color{{/17}}: {{18}}opacify($translucent-red, 0.3){{/18}}
407
+ {{19}}&:after{{/19}}
408
+ {{20}}content{{/20}}: {{21}}"I ate #{5 + 10} pies #{$width} thick!"{{/21}}
409
+ {{22}}&:active{{/22}}
410
+ {{23}}color{{/23}}: {{24}}#010203 + #040506{{/24}}
411
+ {{25}}border{{/25}}: {{26}}$width solid black{{/26}}
412
+
413
+ {{2}}/* SOME COMMENT */{{/2}}
414
+ {{3}}font{{/3}}: {{4}}2px/3px{{/4}}
415
+ {{5}}family{{/5}}: {{6}}fantasy{{/6}}
416
+ {{7}}size{{/7}}: {{8}}1em + (2em * 3){{/8}}
417
417
  SASS
418
418
  {{1}}a{{/1}} {
419
- /* SOME COMMENT */
420
- {{2}}font{{/2}}: {{3}}2px/3px{{/3}};
421
- {{4}}font-family{{/4}}: {{5}}fantasy{{/5}};
422
- {{6}}font-size{{/6}}: {{7}}7em{{/7}}; }
423
- {{8}}a .special{{/8}} {
424
- {{9}}color{{/9}}: {{10}}red{{/10}}; }
425
- {{11}}a .special:hover{{/11}} {
426
- {{12}}foo{{/12}}: {{13}}bar{{/13}};
427
- {{14}}cursor{{/14}}: {{15}}e-resize{{/15}};
428
- {{16}}color{{/16}}: {{17}}rgba(255, 0, 0, 0.8){{/17}}; }
429
- {{18}}a .special:after{{/18}} {
430
- {{19}}content{{/19}}: {{20}}"I ate 15 pies 2px thick!"{{/20}}; }
431
- {{21}}a:active{{/21}} {
432
- {{22}}color{{/22}}: {{23}}#050709{{/23}};
433
- {{24}}border{{/24}}: {{25}}2px solid black{{/25}}; }
419
+ {{2}}/* SOME COMMENT */{{/2}}
420
+ {{3}}font{{/3}}: {{4}}2px/3px{{/4}};
421
+ {{5}}font-family{{/5}}: {{6}}fantasy{{/6}};
422
+ {{7}}font-size{{/7}}: {{8}}7em{{/8}}; }
423
+ {{9}}a .special{{/9}} {
424
+ {{10}}color{{/10}}: {{11}}red{{/11}}; }
425
+ {{12}}a .special:hover{{/12}} {
426
+ {{13}}foo{{/13}}: {{14}}bar{{/14}};
427
+ {{15}}cursor{{/15}}: {{16}}e-resize{{/16}};
428
+ {{17}}color{{/17}}: {{18}}rgba(255, 0, 0, 0.8){{/18}}; }
429
+ {{19}}a .special:after{{/19}} {
430
+ {{20}}content{{/20}}: {{21}}"I ate 15 pies 2px thick!"{{/21}}; }
431
+ {{22}}a:active{{/22}} {
432
+ {{23}}color{{/23}}: {{24}}#050709{{/24}};
433
+ {{25}}border{{/25}}: {{26}}2px solid black{{/26}}; }
434
434
 
435
435
  /*# sourceMappingURL=test.css.map */
436
436
  CSS
@@ -846,6 +846,72 @@ SCSS
846
846
  JSON
847
847
  end
848
848
 
849
+ def test_scss_comment_source_range
850
+ assert_parses_with_mapping <<SCSS, <<CSS, :syntax => :scss
851
+ $var: val; {{1}}/* text */{{/1}}
852
+
853
+ {{2}}/* multiline
854
+ comment */{{/2}}
855
+ SCSS
856
+ {{1}}/* text */{{/1}}
857
+ {{2}}/* multiline
858
+ comment */{{/2}}
859
+
860
+ /*# sourceMappingURL=test.css.map */
861
+ CSS
862
+ end
863
+
864
+ def test_sass_comment_source_range
865
+ assert_parses_with_mapping <<SASS, <<CSS, :syntax => :sass
866
+ {{1}}body{{/1}}
867
+ {{2}}/* text */{{/2}}
868
+
869
+ {{3}}/* multiline
870
+ comment */{{/3}}
871
+ SASS
872
+ {{1}}body{{/1}} {
873
+ {{2}}/* text */{{/2}} }
874
+
875
+ {{3}}/* multiline
876
+ * comment */{{/3}}
877
+
878
+ /*# sourceMappingURL=test.css.map */
879
+ CSS
880
+ end
881
+
882
+ def test_scss_comment_interpolation_source_range
883
+ assert_parses_with_mapping <<SCSS, <<CSS, :syntax => :scss
884
+ $var: 2; {{1}}/* two \#{$var} and four \#{2 * $var} */{{/1}}
885
+
886
+ {{2}}/* multiline
887
+ comment \#{ 2 + 2 } and \#{ 2 +
888
+ 2 } */{{/2}}
889
+ SCSS
890
+ {{1}}/* two 2 and four 4 */{{/1}}
891
+ {{2}}/* multiline
892
+ comment 4 and 4 */{{/2}}
893
+
894
+ /*# sourceMappingURL=test.css.map */
895
+ CSS
896
+ end
897
+
898
+ def test_sass_comment_interpolation_source_range
899
+ assert_parses_with_mapping <<SASS, <<CSS, :syntax => :sass
900
+ $var: 2
901
+ {{1}}/* two \#{$var} and four \#{2 * $var} */{{/1}}
902
+
903
+ {{2}}/* multiline
904
+ comment \#{ 2 + 2 } and \#{ 2 +
905
+ 2 } */{{/2}}
906
+ SASS
907
+ {{1}}/* two 2 and four 4 */{{/1}}
908
+ {{2}}/* multiline
909
+ * comment 4 and 4 */{{/2}}
910
+
911
+ /*# sourceMappingURL=test.css.map */
912
+ CSS
913
+ end
914
+
849
915
  private
850
916
 
851
917
  ANNOTATION_REGEX = /\{\{(\/?)([^}]+)\}\}/