sass 3.4.19 → 3.4.20

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.
@@ -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 = /\{\{(\/?)([^}]+)\}\}/