haml-edge 2.3.179 → 2.3.180

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.
Files changed (92) hide show
  1. data/EDGE_GEM_VERSION +1 -1
  2. data/README.md +88 -149
  3. data/VERSION +1 -1
  4. data/bin/css2sass +7 -1
  5. data/bin/sass-convert +7 -0
  6. data/lib/haml/exec.rb +95 -22
  7. data/lib/haml/template.rb +1 -1
  8. data/lib/haml/util.rb +50 -0
  9. data/lib/sass.rb +1 -1
  10. data/lib/sass/css.rb +38 -210
  11. data/lib/sass/engine.rb +121 -47
  12. data/lib/sass/files.rb +28 -19
  13. data/lib/sass/plugin.rb +32 -43
  14. data/lib/sass/repl.rb +1 -1
  15. data/lib/sass/script.rb +25 -6
  16. data/lib/sass/script/bool.rb +1 -0
  17. data/lib/sass/script/color.rb +2 -2
  18. data/lib/sass/script/css_lexer.rb +22 -0
  19. data/lib/sass/script/css_parser.rb +28 -0
  20. data/lib/sass/script/funcall.rb +17 -9
  21. data/lib/sass/script/functions.rb +46 -1
  22. data/lib/sass/script/interpolation.rb +42 -0
  23. data/lib/sass/script/lexer.rb +142 -34
  24. data/lib/sass/script/literal.rb +28 -12
  25. data/lib/sass/script/node.rb +57 -1
  26. data/lib/sass/script/number.rb +18 -3
  27. data/lib/sass/script/operation.rb +44 -8
  28. data/lib/sass/script/parser.rb +149 -24
  29. data/lib/sass/script/string.rb +50 -2
  30. data/lib/sass/script/unary_operation.rb +25 -10
  31. data/lib/sass/script/variable.rb +20 -11
  32. data/lib/sass/scss.rb +14 -0
  33. data/lib/sass/scss/css_parser.rb +39 -0
  34. data/lib/sass/scss/parser.rb +683 -0
  35. data/lib/sass/scss/rx.rb +112 -0
  36. data/lib/sass/scss/script_lexer.rb +13 -0
  37. data/lib/sass/scss/script_parser.rb +25 -0
  38. data/lib/sass/tree/comment_node.rb +58 -16
  39. data/lib/sass/tree/debug_node.rb +7 -2
  40. data/lib/sass/tree/directive_node.rb +38 -34
  41. data/lib/sass/tree/for_node.rb +6 -0
  42. data/lib/sass/tree/if_node.rb +13 -0
  43. data/lib/sass/tree/import_node.rb +26 -7
  44. data/lib/sass/tree/mixin_def_node.rb +18 -0
  45. data/lib/sass/tree/mixin_node.rb +16 -1
  46. data/lib/sass/tree/node.rb +98 -27
  47. data/lib/sass/tree/prop_node.rb +97 -20
  48. data/lib/sass/tree/root_node.rb +37 -0
  49. data/lib/sass/tree/rule_node.rb +88 -60
  50. data/lib/sass/tree/variable_node.rb +9 -5
  51. data/lib/sass/tree/while_node.rb +4 -0
  52. data/test/haml/results/filters.xhtml +1 -1
  53. data/test/haml/util_test.rb +28 -0
  54. data/test/sass/conversion_test.rb +884 -0
  55. data/test/sass/css2sass_test.rb +46 -21
  56. data/test/sass/engine_test.rb +680 -160
  57. data/test/sass/functions_test.rb +27 -0
  58. data/test/sass/more_results/more_import.css +1 -1
  59. data/test/sass/more_templates/more_import.sass +3 -3
  60. data/test/sass/plugin_test.rb +28 -8
  61. data/test/sass/results/compact.css +1 -1
  62. data/test/sass/results/complex.css +5 -5
  63. data/test/sass/results/compressed.css +1 -1
  64. data/test/sass/results/expanded.css +1 -1
  65. data/test/sass/results/import.css +3 -1
  66. data/test/sass/results/mixins.css +12 -12
  67. data/test/sass/results/nested.css +1 -1
  68. data/test/sass/results/parent_ref.css +4 -4
  69. data/test/sass/results/script.css +3 -3
  70. data/test/sass/results/scss_import.css +15 -0
  71. data/test/sass/results/scss_importee.css +2 -0
  72. data/test/sass/script_conversion_test.rb +153 -0
  73. data/test/sass/script_test.rb +44 -54
  74. data/test/sass/scss/css_test.rb +811 -0
  75. data/test/sass/scss/rx_test.rb +156 -0
  76. data/test/sass/scss/scss_test.rb +871 -0
  77. data/test/sass/scss/test_helper.rb +37 -0
  78. data/test/sass/templates/alt.sass +2 -2
  79. data/test/sass/templates/bork1.sass +1 -1
  80. data/test/sass/templates/import.sass +4 -4
  81. data/test/sass/templates/importee.sass +3 -3
  82. data/test/sass/templates/line_numbers.sass +1 -1
  83. data/test/sass/templates/mixins.sass +2 -2
  84. data/test/sass/templates/nested_mixin_bork.sass +1 -1
  85. data/test/sass/templates/options.sass +1 -1
  86. data/test/sass/templates/parent_ref.sass +2 -2
  87. data/test/sass/templates/script.sass +69 -69
  88. data/test/sass/templates/scss_import.scss +10 -0
  89. data/test/sass/templates/scss_importee.scss +1 -0
  90. data/test/sass/templates/units.sass +10 -10
  91. data/test/test_helper.rb +4 -4
  92. metadata +27 -2
@@ -24,13 +24,10 @@ SASS
24
24
  assert_equal(<<SASS, css2sass(<<CSS))
25
25
  li
26
26
  display: none
27
-
28
27
  a
29
28
  text-decoration: none
30
-
31
29
  span
32
30
  color: yellow
33
-
34
31
  &:hover
35
32
  text-decoration: underline
36
33
  SASS
@@ -57,11 +54,9 @@ CSS
57
54
  div .warning
58
55
  color: #d21a19
59
56
 
60
-
61
57
  span .debug
62
58
  cursor: crosshair
63
59
 
64
-
65
60
  div .debug
66
61
  cursor: default
67
62
  SASS
@@ -104,27 +99,34 @@ span.turkey {
104
99
  } /* just a line here */
105
100
  CSS
106
101
  sass = <<SASS
102
+ /* comment
103
+
107
104
  elephant.rawr
108
105
  rampages: excessively
109
106
 
107
+ /* actual multiline
108
+ comment
110
109
 
111
110
  span.turkey
112
111
  isdinner: true
113
112
 
114
-
115
113
  .turducken
114
+ /* Sounds funny
115
+ doesn't it
116
116
  chimera: not_really
117
117
 
118
-
119
118
  #overhere
120
119
  bored: sorta
120
+ /* it's for a good
121
+ cause
121
122
  better_than: thread_pools
122
123
 
123
-
124
124
  #one_more
125
125
  finally: srsly
126
+
127
+ /* just a line here
126
128
  SASS
127
- assert_equal(css2sass(css), sass)
129
+ assert_equal(sass, css2sass(css))
128
130
  end
129
131
 
130
132
  def test_fold_commas
@@ -145,12 +147,10 @@ CSS
145
147
  .one
146
148
  color: green
147
149
 
148
-
149
150
  .two
150
151
  color: green
151
152
  color: red
152
153
 
153
-
154
154
  .three
155
155
  color: red
156
156
  SASS
@@ -168,20 +168,15 @@ CSS
168
168
  assert_equal(<<SASS, css2sass(<<CSS))
169
169
  hello
170
170
  parent: true
171
-
172
171
  there
173
172
  parent: false
174
-
175
173
  who
176
174
  hoo: false
177
-
178
175
  why
179
176
  y: true
180
-
181
177
  when
182
178
  wen: nao
183
179
 
184
-
185
180
  down_here
186
181
  yeah: true
187
182
  SASS
@@ -214,7 +209,6 @@ CSS
214
209
  #location-navigation-form .form-submit, #business-listing-form .form-submit, #detailTabs ul, #detailsEnhanced #addTags, #locationSearchList, #moreHoods
215
210
  display: none
216
211
 
217
-
218
212
  #navListLeft
219
213
  display: none
220
214
  SASS
@@ -235,7 +229,6 @@ CSS
235
229
  assert_equal(<<SASS, css2sass(<<CSS))
236
230
  \\:focus
237
231
  a: b
238
-
239
232
  \\:foo
240
233
  bar: baz
241
234
  SASS
@@ -263,7 +256,7 @@ CSS
263
256
  end
264
257
 
265
258
  def test_error_truncate_after
266
- css2sass("#{"a" * 15}foo")
259
+ css2sass("#{"a" * 16}foo")
267
260
  assert(false, "Expected exception")
268
261
  rescue Sass::SyntaxError => err
269
262
  assert_equal(1, err.sass_line)
@@ -271,11 +264,43 @@ CSS
271
264
  end
272
265
 
273
266
  def test_error_truncate_was
274
- css2sass("foo }#{"a" * 15}")
267
+ css2sass("foo }foo#{"a" * 15}")
275
268
  assert(false, "Expected exception")
276
269
  rescue Sass::SyntaxError => err
277
270
  assert_equal(1, err.sass_line)
278
- assert_equal('Invalid CSS after "foo ": expected "{", was "}aaaaaaaaaaaaaa..."', err.message)
271
+ assert_equal('Invalid CSS after "foo ": expected "{", was "}fooaaaaaaaaaaa..."', err.message)
272
+ end
273
+
274
+ def test_error_doesnt_truncate_after_when_elipsis_would_add_length
275
+ css2sass("#{"a" * 15}foo")
276
+ assert(false, "Expected exception")
277
+ rescue Sass::SyntaxError => err
278
+ assert_equal(1, err.sass_line)
279
+ assert_equal('Invalid CSS after "aaaaaaaaaaaaaaafoo": expected "{", was ""', err.message)
280
+ end
281
+
282
+ def test_error_doesnt_truncate_was_when_elipsis_would_add_length
283
+ css2sass("foo }foo#{"a" * 14}")
284
+ assert(false, "Expected exception")
285
+ rescue Sass::SyntaxError => err
286
+ assert_equal(1, err.sass_line)
287
+ assert_equal('Invalid CSS after "foo ": expected "{", was "}fooaaaaaaaaaaaaaa"', err.message)
288
+ end
289
+
290
+ def test_error_gets_rid_of_trailing_newline_for_after
291
+ css2sass("foo \n ")
292
+ assert(false, "Expected exception")
293
+ rescue Sass::SyntaxError => err
294
+ assert_equal(2, err.sass_line)
295
+ assert_equal('Invalid CSS after "foo": expected "{", was ""', err.message)
296
+ end
297
+
298
+ def test_error_gets_rid_of_trailing_newline_for_was
299
+ css2sass("foo \n }foo")
300
+ assert(false, "Expected exception")
301
+ rescue Sass::SyntaxError => err
302
+ assert_equal(2, err.sass_line)
303
+ assert_equal('Invalid CSS after "foo": expected "{", was "}foo"', err.message)
279
304
  end
280
305
 
281
306
  # Encodings
@@ -15,15 +15,14 @@ class SassEngineTest < Test::Unit::TestCase
15
15
  # if so, the second element should be the line number that should be reported for the error.
16
16
  # If this isn't provided, the tests will assume the line number should be the last line of the document.
17
17
  EXCEPTION_MAP = {
18
- "!a = 1 + " => 'Expected expression, was end of text.',
19
- "!a = 1 + 2 +" => 'Expected expression, was end of text.',
20
- "!a = 1 + 2 + %" => 'Expected expression, was mod token.',
21
- "!a = foo(\"bar\"" => 'Expected rparen token, was end of text.',
22
- "!a = 1 }" => 'Unexpected end_interpolation token.',
23
- "!a = 1 }foo\"" => 'Unexpected end_interpolation token.',
18
+ "$a: 1 + " => 'Invalid CSS after "1 +": expected expression (e.g. 1px, bold), was ""',
19
+ "$a: 1 + 2 +" => 'Invalid CSS after "1 + 2 +": expected expression (e.g. 1px, bold), was ""',
20
+ "$a: 1 + 2 + %" => 'Invalid CSS after "1 + 2 + ": expected expression (e.g. 1px, bold), was "%"',
21
+ "$a: foo(\"bar\"" => 'Invalid CSS after "foo("bar"": expected ")", was ""',
22
+ "$a: 1 }" => 'Invalid CSS after "1 ": expected expression (e.g. 1px, bold), was "}"',
23
+ "$a: 1 }foo\"" => 'Invalid CSS after "1 ": expected expression (e.g. 1px, bold), was "}foo""',
24
24
  ":" => 'Invalid property: ":".',
25
25
  ": a" => 'Invalid property: ": a".',
26
- ":= a" => 'Invalid property: ":= a".',
27
26
  "a\n :b" => <<MSG,
28
27
  Invalid property: ":b" (no value).
29
28
  If ":b" should be a selector, use "\\:b" instead.
@@ -31,32 +30,32 @@ MSG
31
30
  "a\n b:" => 'Invalid property: "b:" (no value).',
32
31
  "a\n :b: c" => 'Invalid property: ":b: c".',
33
32
  "a\n :b:c d" => 'Invalid property: ":b:c d".',
34
- "a\n :b=c d" => 'Invalid property: ":b=c d".',
35
- "a\n :b c;" => 'Invalid property: ":b c;" (no ";" required at end-of-line).',
36
- "a\n b: c;" => 'Invalid property: "b: c;" (no ";" required at end-of-line).',
37
- "a\n b : c" => 'Invalid property: "b : c".',
38
- "a\n b=c: d" => 'Invalid property: "b=c: d".',
33
+ "a\n :b c;" => 'Invalid CSS after "c": expected expression (e.g. 1px, bold), was ";"',
34
+ "a\n b: c;" => 'Invalid CSS after "c": expected expression (e.g. 1px, bold), was ";"',
39
35
  "a: b" => 'Properties aren\'t allowed at the root of a document.',
40
36
  ":a b" => 'Properties aren\'t allowed at the root of a document.',
41
37
  "!" => 'Invalid variable: "!".',
42
- "!a" => 'Invalid variable: "!a".',
38
+ "$a" => 'Invalid variable: "$a".',
43
39
  "! a" => 'Invalid variable: "! a".',
44
- "!a b" => 'Invalid variable: "!a b".',
45
- "!a = 1b + 2c" => "Incompatible units: 'c' and 'b'.",
46
- "!a = 1b < 2c" => "Incompatible units: 'c' and 'b'.",
47
- "!a = 1b > 2c" => "Incompatible units: 'c' and 'b'.",
48
- "!a = 1b <= 2c" => "Incompatible units: 'c' and 'b'.",
49
- "!a = 1b >= 2c" => "Incompatible units: 'c' and 'b'.",
50
- "a\n :b= 1b * 2c" => "2b*c isn't a valid CSS value.",
51
- "a\n :b= 1b % 2c" => "Cannot modulo by a number with units: 2c.",
52
- "!a = 2px + #ccc" => "Cannot add a number with units (2px) to a color (#cccccc).",
53
- "!a = #ccc + 2px" => "Cannot add a number with units (2px) to a color (#cccccc).",
40
+ "$a b" => 'Invalid variable: "$a b".',
41
+ "$a: 1b + 2c" => "Incompatible units: 'c' and 'b'.",
42
+ "$a: 1b < 2c" => "Incompatible units: 'c' and 'b'.",
43
+ "$a: 1b > 2c" => "Incompatible units: 'c' and 'b'.",
44
+ "$a: 1b <= 2c" => "Incompatible units: 'c' and 'b'.",
45
+ "$a: 1b >= 2c" => "Incompatible units: 'c' and 'b'.",
46
+ "a\n b: 1b * 2c" => "2b*c isn't a valid CSS value.",
47
+ "a\n b: 1b % 2c" => "Cannot modulo by a number with units: 2c.",
48
+ "$a: 2px + #ccc" => "Cannot add a number with units (2px) to a color (#cccccc).",
49
+ "$a: #ccc + 2px" => "Cannot add a number with units (2px) to a color (#cccccc).",
54
50
  "& a\n :b c" => ["Base-level rules cannot contain the parent-selector-referencing character '&'.", 1],
55
51
  "a\n :b\n c" => "Illegal nesting: Only properties may be nested beneath properties.",
56
52
  "a,\n :b c" => ["Rules can\'t end in commas.", 1],
57
53
  "a," => "Rules can\'t end in commas.",
58
- "a,\n!b = 1" => ["Rules can\'t end in commas.", 1],
59
- "!a = b\n :c d\n" => "Illegal nesting: Nothing may be nested beneath variable declarations.",
54
+ "a,\n$b: 1" => ["Rules can\'t end in commas.", 1],
55
+ "$a: b\n :c d\n" => "Illegal nesting: Nothing may be nested beneath variable declarations.",
56
+ "@import foo.sass" => "File to import not found or unreadable: foo.sass.",
57
+ "a,\n$b: 1" => ["Rules can\'t end in commas.", 1],
58
+ "$a: b\n :c d\n" => "Illegal nesting: Nothing may be nested beneath variable declarations.",
60
59
  "@import foo.sass" => <<MSG,
61
60
  File to import not found or unreadable: foo.sass.
62
61
  Load paths:
@@ -66,7 +65,7 @@ MSG
66
65
  "@import templates/basic\n foo" => "Illegal nesting: Nothing may be nested beneath import directives.",
67
66
  "foo\n @import templates/basic" => "Import directives may only be used at the root of a document.",
68
67
  "foo\n @import #{File.dirname(__FILE__)}/templates/basic" => "Import directives may only be used at the root of a document.",
69
- %Q{!foo = "bar" "baz" !} => %Q{Syntax error in '"bar" "baz" !' at character 20.},
68
+ '$foo: "bar" "baz" !' => %Q{Invalid CSS after ""bar" "baz" ": expected expression (e.g. 1px, bold), was "!"},
70
69
  "=foo\n :color red\n.bar\n +bang" => "Undefined mixin 'bang'.",
71
70
  "=foo\n :color red\n.bar\n +bang_bop" => "Undefined mixin 'bang_bop'.",
72
71
  "=foo\n :color red\n.bar\n +bang-bop" => "Undefined mixin 'bang-bop'.",
@@ -82,28 +81,29 @@ MSG
82
81
  "a\n b: c\na\n d: e" => ["The line was indented 2 levels deeper than the previous line.", 4],
83
82
  "a\n b: c\n a\n d: e" => ["The line was indented 3 levels deeper than the previous line.", 4],
84
83
  "a\n \tb: c" => ["Indentation can't use both tabs and spaces.", 2],
85
- "=a(" => 'Expected rparen token, was end of text.',
86
- "=a(b)" => 'Expected rparen token, was ident token.',
87
- "=a(,)" => "Expected rparen token, was comma token.",
88
- "=a(!)" => "Syntax error in '(!)' at character 4.",
89
- "=a(!foo bar)" => "Expected rparen token, was ident token.",
84
+ "=a(" => 'Invalid CSS after "(": expected ")", was ""',
85
+ "=a(b)" => 'Invalid CSS after "(": expected ")", was "b)"',
86
+ "=a(,)" => 'Invalid CSS after "(": expected ")", was ",)"',
87
+ "=a(!)" => 'Invalid CSS after "(": expected ")", was "!)"',
88
+ "=a($foo bar)" => 'Invalid CSS after "($foo ": expected ")", was "bar)"',
90
89
  "=foo\n bar: baz\n+foo" => ["Properties aren't allowed at the root of a document.", 2],
91
- "a-\#{!b\n c: d" => ["Expected end_interpolation token, was end of text.", 1],
92
- "=a(!b = 1, !c)" => "Required argument !c must come before any optional arguments.",
93
- "=a(!b = 1)\n :a= !b\ndiv\n +a(1,2)" => "Mixin a takes 1 argument but 2 were passed.",
94
- "=a(!b)\n :a= !b\ndiv\n +a" => "Mixin a is missing parameter !b.",
90
+ "a-\#{$b\n c: d" => ['Invalid CSS after "a-#{$b": expected "}", was ""', 1],
91
+ "=a($b = 1, $c)" => "Required argument $c must come before any optional arguments.",
92
+ "=a($b = 1)\n a: $b\ndiv\n +a(1,2)" => "Mixin a takes 1 argument but 2 were passed.",
93
+ "=a($b)\n a: $b\ndiv\n +a" => "Mixin a is missing parameter $b.",
95
94
  "@else\n a\n b: c" => ["@else must come after @if.", 1],
96
95
  "@if false\n@else foo" => "Invalid else directive '@else foo': expected 'if <expr>'.",
97
96
  "@if false\n@else if " => "Invalid else directive '@else if': expected 'if <expr>'.",
98
- "a\n !b = 12\nc\n d = !b" => 'Undefined variable: "!b".',
99
- "=foo\n !b = 12\nc\n +foo\n d = !b" => 'Undefined variable: "!b".',
100
- "c\n d = !b-foo" => 'Undefined variable: "!b-foo".',
101
- "c\n d = !b_foo" => 'Undefined variable: "!b_foo".',
102
- '@for !a from "foo" to 1' => '"foo" is not an integer.',
103
- '@for !a from 1 to "2"' => '"2" is not an integer.',
104
- '@for !a from 1 to "foo"' => '"foo" is not an integer.',
105
- '@for !a from 1 to 1.232323' => '1.232 is not an integer.',
106
- '@for !a from 1px to 3em' => "Incompatible units: 'em' and 'px'.",
97
+ "a\n !b: 12\nc\n d: !b" => 'Undefined variable: "$b".',
98
+ "a\n $b: 12\nc\n d: $b" => 'Undefined variable: "$b".',
99
+ "=foo\n $b: 12\nc\n +foo\n d: $b" => 'Undefined variable: "$b".',
100
+ "c\n d: $b-foo" => 'Undefined variable: "$b-foo".',
101
+ "c\n d: $b_foo" => 'Undefined variable: "$b_foo".',
102
+ '@for $a from "foo" to 1' => '"foo" is not an integer.',
103
+ '@for $a from 1 to "2"' => '"2" is not an integer.',
104
+ '@for $a from 1 to "foo"' => '"foo" is not an integer.',
105
+ '@for $a from 1 to 1.232323' => '1.232 is not an integer.',
106
+ '@for $a from 1px to 3em' => "Incompatible units: 'em' and 'px'.",
107
107
  '@if' => "Invalid if directive '@if': expected expression.",
108
108
  '@while' => "Invalid while directive '@while': expected expression.",
109
109
  '@debug' => "Invalid debug directive '@debug': expected expression.",
@@ -249,11 +249,11 @@ SASS
249
249
 
250
250
  def test_mixin_exception
251
251
  render(<<SASS)
252
- =error-mixin(!a)
253
- color = !a * 1em * 1px
252
+ =error-mixin($a)
253
+ color: $a * 1em * 1px
254
254
 
255
- =outer-mixin(!a)
256
- +error-mixin(!a)
255
+ =outer-mixin($a)
256
+ +error-mixin($a)
257
257
 
258
258
  .error
259
259
  +outer-mixin(12)
@@ -278,11 +278,11 @@ SASS
278
278
 
279
279
  def test_mixin_callsite_exception
280
280
  render(<<SASS)
281
- =one-arg-mixin(!a)
282
- color = !a
281
+ =one-arg-mixin($a)
282
+ color: $a
283
283
 
284
- =outer-mixin(!a)
285
- +one-arg-mixin(!a, 12)
284
+ =outer-mixin($a)
285
+ +one-arg-mixin($a, 12)
286
286
 
287
287
  .error
288
288
  +outer-mixin(12)
@@ -365,11 +365,11 @@ CSS
365
365
  def test_exception_css_with_mixins
366
366
  opts = {:full_exception => true}
367
367
  render(<<SASS, opts)
368
- =error-mixin(!a)
369
- color = !a * 1em * 1px
368
+ =error-mixin($a)
369
+ color: $a * 1em * 1px
370
370
 
371
- =outer-mixin(!a)
372
- +error-mixin(!a)
371
+ =outer-mixin($a)
372
+ +error-mixin($a)
373
373
 
374
374
  .error
375
375
  +outer-mixin(12)
@@ -382,11 +382,11 @@ Syntax error: 12em*px isn't a valid CSS value.
382
382
  from line 5 of test_exception_css_with_mixins_inline.sass, in `outer-mixin'
383
383
  from line 8 of test_exception_css_with_mixins_inline.sass
384
384
 
385
- 1: =error-mixin(!a)
386
- 2: color = !a * 1em * 1px
385
+ 1: =error-mixin($a)
386
+ 2: color: $a * 1em * 1px
387
387
  3:
388
- 4: =outer-mixin(!a)
389
- 5: +error-mixin(!a)
388
+ 4: =outer-mixin($a)
389
+ 5: +error-mixin($a)
390
390
  6:
391
391
  7: .error
392
392
  CSS
@@ -398,7 +398,7 @@ CSS
398
398
  opts = {:full_exception => true}
399
399
  render(<<SASS, opts)
400
400
  .filler
401
- stuff: stuff!
401
+ stuff: "stuff!"
402
402
 
403
403
  a: b
404
404
 
@@ -412,7 +412,7 @@ Syntax error: Properties aren't allowed at the root of a document.
412
412
  on line 4 of test_cssize_exception_css_inline.sass
413
413
 
414
414
  1: .filler
415
- 2: stuff: stuff!
415
+ 2: stuff: "stuff!"
416
416
  3:
417
417
  4: a: b
418
418
  5:
@@ -436,7 +436,7 @@ CSS
436
436
 
437
437
  def test_nonexistent_extensionless_import
438
438
  assert_warning(<<WARN) do
439
- WARNING: nonexistent.sass not found. Using nonexistent.css instead.
439
+ WARNING: Neither nonexistent.sass nor .scss found. Using nonexistent.css instead.
440
440
  This behavior is deprecated and will be removed in a future version.
441
441
  If you really need nonexistent.css, import it explicitly.
442
442
  WARN
@@ -458,18 +458,24 @@ WARN
458
458
  end
459
459
 
460
460
  def test_default_function
461
- assert_equal("foo {\n bar: url(foo.png); }\n", render(%Q{foo\n bar = url("foo.png")\n}));
462
- assert_equal("foo {\n bar: url(); }\n", render("foo\n bar = url()\n"));
461
+ assert_equal(<<CSS, render(<<SASS))
462
+ foo {
463
+ bar: url("foo.png"); }
464
+ CSS
465
+ foo
466
+ bar: url("foo.png")
467
+ SASS
468
+ assert_equal("foo {\n bar: url(); }\n", render("foo\n bar: url()\n"));
463
469
  end
464
470
 
465
471
  def test_string_minus
466
- assert_equal("foo {\n bar: baz-boom-bat; }\n", render(%Q{foo\n bar = "baz"-"boom"-"bat"}))
467
- assert_equal("foo {\n bar: -baz-boom; }\n", render(%Q{foo\n bar = -"baz"-"boom"}))
472
+ assert_equal("foo {\n bar: baz-boom-bat; }\n", render(%Q{foo\n bar: baz-boom-bat}))
473
+ assert_equal("foo {\n bar: -baz-boom; }\n", render(%Q{foo\n bar: -baz-boom}))
468
474
  end
469
475
 
470
476
  def test_string_div
471
- assert_equal("foo {\n bar: baz/boom/bat; }\n", render(%Q{foo\n bar = "baz"/"boom"/"bat"}))
472
- assert_equal("foo {\n bar: /baz/boom; }\n", render(%Q{foo\n bar = /"baz"/"boom"}))
477
+ assert_equal("foo {\n bar: baz/boom/bat; }\n", render(%Q{foo\n bar: baz/boom/bat}))
478
+ assert_equal("foo {\n bar: /baz/boom; }\n", render(%Q{foo\n bar: /baz/boom}))
473
479
  end
474
480
 
475
481
  def test_basic_multiline_selector
@@ -632,23 +638,23 @@ SASS
632
638
  end
633
639
 
634
640
  def test_debug_info
635
- esc_file_name = Haml::Util.scope("test_debug_info_inline.sass").gsub(/([^a-zA-Z0-9_-])/, "\\\\\\1")
641
+ esc_file_name = Sass::SCSS::RX.escape_ident(Haml::Util.scope("test_debug_info_inline.sass"))
636
642
 
637
643
  assert_equal(<<CSS, render(<<SASS, :debug_info => true, :style => :compact))
638
- @media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\0032 }}
644
+ @media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\000032}}
639
645
  foo bar { foo: bar; }
640
- @media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\0035 }}
646
+ @media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\000035}}
641
647
  foo baz { blip: blop; }
642
648
 
643
- @media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\0039 }}
649
+ @media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\000039}}
644
650
  floodle { flop: blop; }
645
651
 
646
- @media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\0031 8}}
652
+ @media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\0000318}}
647
653
  bup { mix: on; }
648
- @media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\0031 5}}
654
+ @media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\0000315}}
649
655
  bup mixin { moop: mup; }
650
656
 
651
- @media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\0032 2}}
657
+ @media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\0000322}}
652
658
  bip hop, skip hop { a: b; }
653
659
  CSS
654
660
  foo
@@ -679,7 +685,7 @@ SASS
679
685
 
680
686
  def test_debug_info_without_filename
681
687
  assert_equal(<<CSS, Sass::Engine.new(<<SASS, :debug_info => true).render)
682
- @media -sass-debug-info{filename{font-family:}line{font-family:\\0031 }}
688
+ @media -sass-debug-info{filename{font-family:}line{font-family:\\000031}}
683
689
  foo {
684
690
  a: b; }
685
691
  CSS
@@ -698,10 +704,10 @@ SASS
698
704
  end
699
705
 
700
706
  def test_debug_info_with_line_annotations
701
- esc_file_name = Haml::Util.scope("test_debug_info_with_line_annotations_inline.sass").gsub(/([^a-zA-Z0-9_-])/, "\\\\\\1")
707
+ esc_file_name = Sass::SCSS::RX.escape_ident(Haml::Util.scope("test_debug_info_with_line_annotations_inline.sass"))
702
708
 
703
709
  assert_equal(<<CSS, render(<<SASS, :debug_info => true, :line_comments => true))
704
- @media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\0031 }}
710
+ @media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\000031}}
705
711
  foo {
706
712
  a: b; }
707
713
  CSS
@@ -748,15 +754,99 @@ foo
748
754
  SASS
749
755
  end
750
756
 
751
- def test_or_eq
752
- assert_equal("foo {\n a: b; }\n", render(%Q{!foo = "b"\n!foo ||= "c"\nfoo\n a = !foo}))
753
- assert_equal("foo {\n a: b; }\n", render(%Q{!foo ||= "b"\nfoo\n a = !foo}))
757
+ def test_equals_warning_for_properties
758
+ assert_warning(<<WARN) {assert_equal(<<CSS, render(<<SASS))}
759
+ DEPRECATION WARNING:
760
+ On line 3, character 3 of 'test_equals_warning_for_properties_inline.sass'
761
+ Setting properties with = has been deprecated and will be removed in version 3.2.
762
+ Use "a: $var" instead.
763
+
764
+ You can use `sass-convert --in-place --from sass2 file.sass' to convert files automatically.
765
+ WARN
766
+ foo {
767
+ a: 2px 3px; }
768
+ CSS
769
+ $var: 2px 3px
770
+ foo
771
+ a = $var
772
+ SASS
773
+ end
774
+
775
+ def test_equals_warning_for_dynamic_properties
776
+ assert_warning(<<WARN) {assert_equal(<<CSS, render(<<SASS))}
777
+ DEPRECATION WARNING:
778
+ On line 4, character 3 of 'test_equals_warning_for_dynamic_properties_inline.sass'
779
+ Setting properties with = has been deprecated and will be removed in version 3.2.
780
+ Use "a-\#{$i}: $var" instead.
781
+
782
+ You can use `sass-convert --in-place --from sass2 file.sass' to convert files automatically.
783
+ WARN
784
+ foo {
785
+ a-12: 2px 3px; }
786
+ CSS
787
+ $var: 2px 3px
788
+ $i: 12
789
+ foo
790
+ a-\#{$i} = $var
791
+ SASS
792
+ end
793
+
794
+ def test_equals_warning_for_property_with_string
795
+ assert_warning(<<WARN) {assert_equal(<<CSS, render(<<SASS))}
796
+ DEPRECATION WARNING:
797
+ On line 2, character 3 of 'test_equals_warning_for_property_with_string_inline.sass'
798
+ Setting properties with = has been deprecated and will be removed in version 3.2.
799
+ Use "a: foo" instead.
800
+
801
+ You can use `sass-convert --in-place --from sass2 file.sass' to convert files automatically.
802
+ WARN
803
+ foo {
804
+ a: foo; }
805
+ CSS
806
+ foo
807
+ a = "foo"
808
+ SASS
809
+ end
810
+
811
+ def test_equals_warning_for_property_with_division
812
+ assert_warning(<<WARN) {assert_equal(<<CSS, render(<<SASS))}
813
+ DEPRECATION WARNING:
814
+ On line 2, character 3 of 'test_equals_warning_for_property_with_division_inline.sass'
815
+ Setting properties with = has been deprecated and will be removed in version 3.2.
816
+ Use "a: (1px / 2px)" instead.
817
+
818
+ You can use `sass-convert --in-place --from sass2 file.sass' to convert files automatically.
819
+ WARN
820
+ foo {
821
+ a: 0.5; }
822
+ CSS
823
+ foo
824
+ a = 1px/2px
825
+ SASS
826
+ end
827
+
828
+ def test_guarded_assign
829
+ assert_equal("foo {\n a: b; }\n", render(%Q{$foo: b\n$foo: c !default\nfoo\n a: $foo}))
830
+ assert_equal("foo {\n a: b; }\n", render(%Q{$foo: b !default\nfoo\n a: $foo}))
754
831
  end
755
832
 
756
833
  def test_mixins
757
834
  renders_correctly "mixins", { :style => :expanded }
758
835
  end
759
836
 
837
+ def test_directive_style_mixins
838
+ assert_equal <<CSS, render(<<SASS)
839
+ bar {
840
+ prop: baz; }
841
+ CSS
842
+ @mixin foo($arg)
843
+ prop: $arg
844
+
845
+ bar
846
+ @include foo(baz)
847
+ SASS
848
+ end
849
+
760
850
  def test_mixins_dont_interfere_with_sibling_combinator
761
851
  assert_equal("foo + bar {\n a: b; }\nfoo + baz {\n c: d; }\n",
762
852
  render("foo\n +\n bar\n a: b\n baz\n c: d"))
@@ -764,33 +854,33 @@ SASS
764
854
 
765
855
  def test_mixin_args
766
856
  assert_equal("blat {\n baz: hi; }\n", render(<<SASS))
767
- =foo(!bar)
768
- baz = !bar
857
+ =foo($bar)
858
+ baz: $bar
769
859
  blat
770
- +foo(\"hi\")
860
+ +foo(hi)
771
861
  SASS
772
862
  assert_equal("blat {\n baz: 3; }\n", render(<<SASS))
773
- =foo(!a, !b)
774
- baz = !a + !b
863
+ =foo($a, $b)
864
+ baz: $a + $b
775
865
  blat
776
866
  +foo(1, 2)
777
867
  SASS
778
868
  assert_equal("blat {\n baz: 4;\n baz: 3;\n baz: 5;\n bang: 3; }\n", render(<<SASS))
779
- =foo(!c = (6 + 4) / 2)
780
- baz = !c
781
- !c = 3
869
+ =foo($c: (6 + 4) / 2)
870
+ baz: $c
871
+ $c: 3
782
872
  blat
783
- +foo(!c + 1)
784
- +foo((!c + 3)/2)
873
+ +foo($c + 1)
874
+ +foo(($c + 3)/2)
785
875
  +foo
786
- bang = !c
876
+ bang: $c
787
877
  SASS
788
878
  end
789
879
 
790
880
  def test_default_values_for_mixin_arguments
791
881
  assert_equal("white {\n color: white; }\n\nblack {\n color: black; }\n", render(<<SASS))
792
- =foo(!a = #FFF)
793
- :color= !a
882
+ =foo($a: #FFF)
883
+ :color $a
794
884
  white
795
885
  +foo
796
886
  black
@@ -812,11 +902,11 @@ three {
812
902
  padding: 2px;
813
903
  margin: 3px; }
814
904
  CSS
815
- !a = 5px
816
- =foo(!a, !b = 1px, !c = 3px + !b)
817
- :color= !a
818
- :padding= !b
819
- :margin= !c
905
+ $a: 5px
906
+ =foo($a, $b: 1px, $c: 3px + $b)
907
+ :color $a
908
+ :padding $b
909
+ :margin $c
820
910
  one
821
911
  +foo(#fff)
822
912
  two
@@ -844,23 +934,56 @@ a
844
934
  SASS
845
935
  end
846
936
 
937
+ def test_equals_warning_for_mixin_args
938
+ assert_warning(<<WARN) {assert_equal(<<CSS, render(<<SASS))}
939
+ DEPRECATION WARNING:
940
+ On line 1, character 6 of 'test_equals_warning_for_mixin_args_inline.sass'
941
+ Setting mixin argument defaults with = has been deprecated and will be removed in version 3.2.
942
+ Use "$arg: 1px" instead.
943
+
944
+ You can use `sass-convert --in-place --from sass2 file.sass' to convert files automatically.
945
+ WARN
946
+ bar {
947
+ a: 1px; }
948
+ CSS
949
+ =foo($arg = 1px)
950
+ a: $arg
951
+
952
+ bar
953
+ +foo
954
+ SASS
955
+ end
956
+
957
+ def test_css_identifier_mixin
958
+ assert_equal(<<CSS, render(<<SASS))
959
+ a {
960
+ foo: 12; }
961
+ CSS
962
+ =\\{foo\\(12\\)($a)
963
+ foo: $a
964
+
965
+ a
966
+ +\\{foo\\(12\\)(12)
967
+ SASS
968
+ end
969
+
847
970
  def test_interpolation
848
971
  assert_equal("a-1 {\n b-2-3: c-3; }\n", render(<<SASS))
849
- !a = 1
850
- !b = 2
851
- !c = 3
852
- a-\#{!a}
853
- b-\#{!b}-\#{!c}: c-\#{!a + !b}
972
+ $a: 1
973
+ $b: 2
974
+ $c: 3
975
+ a-\#{$a}
976
+ b-\#{$b}-\#{$c}: c-\#{$a + $b}
854
977
  SASS
855
978
  end
856
979
 
857
980
  def test_if_directive
858
981
  assert_equal("a {\n b: 1; }\n", render(<<SASS))
859
- !var = true
982
+ $var: true
860
983
  a
861
- @if !var
984
+ @if $var
862
985
  b: 1
863
- @if not !var
986
+ @if not $var
864
987
  b: 2
865
988
  SASS
866
989
  end
@@ -891,14 +1014,38 @@ b-3 {
891
1014
  b-4 {
892
1015
  j-1: 3; }
893
1016
  CSS
894
- !a = 3
895
- @for !i from 0 to !a + 1
896
- a-\#{!i}
897
- 2i = 2 * !i
1017
+ $a: 3
1018
+ @for $i from 0 to $a + 1
1019
+ a-\#{$i}
1020
+ 2i: 2 * $i
1021
+
1022
+ @for $j from 1 through 4
1023
+ b-\#{$j}
1024
+ j-1: $j - 1
1025
+ SASS
1026
+ end
1027
+
1028
+ def test_for_with_bang_var
1029
+ assert_warning(<<WARN) {assert_equal(<<CSS, render(<<SASS))}
1030
+ DEPRECATION WARNING:
1031
+ On line 1, character 6 of 'test_for_with_bang_var_inline.sass'
1032
+ Variables with ! have been deprecated and will be removed in version 3.2.
1033
+ Use "$bar" instead.
1034
+
1035
+ You can use `sass-convert --in-place --from sass2 file.sass' to convert files automatically.
1036
+ WARN
1037
+ a-0 {
1038
+ b: c; }
898
1039
 
899
- @for !j from 1 through 4
900
- b-\#{!j}
901
- j-1 = !j - 1
1040
+ a-1 {
1041
+ b: c; }
1042
+
1043
+ a-2 {
1044
+ b: c; }
1045
+ CSS
1046
+ @for !bar from 0 to 3
1047
+ a-\#{$bar}
1048
+ b: c
902
1049
  SASS
903
1050
  end
904
1051
 
@@ -919,11 +1066,11 @@ a-2 {
919
1066
  a-1 {
920
1067
  blooble: gloop; }
921
1068
  CSS
922
- !a = 5
923
- @while !a != 0
924
- a-\#{!a}
1069
+ $a: 5
1070
+ @while $a != 0
1071
+ a-\#{$a}
925
1072
  blooble: gloop
926
- !a = !a - 1
1073
+ $a: $a - 1
927
1074
  SASS
928
1075
  end
929
1076
 
@@ -973,11 +1120,83 @@ a {
973
1120
  b: 1;
974
1121
  c: 2; }
975
1122
  CSS
976
- !a = 1
1123
+ $a: 1
977
1124
  a
978
- b = !a
979
- !a = 2
980
- c = !a
1125
+ b: $a
1126
+ $a: 2
1127
+ c: $a
1128
+ SASS
1129
+ end
1130
+
1131
+ def test_bang_variables
1132
+ assert_warning(<<WARN) {assert_equal(<<CSS, render(<<SASS))}
1133
+ DEPRECATION WARNING:
1134
+ On line 1, character 1 of 'test_bang_variables_inline.sass'
1135
+ Variables with ! have been deprecated and will be removed in version 3.2.
1136
+ Use "$bang-var" instead.
1137
+
1138
+ You can use `sass-convert --in-place --from sass2 file.sass' to convert files automatically.
1139
+ WARN
1140
+ foo {
1141
+ a: 1px; }
1142
+ CSS
1143
+ !bang-var: 1px
1144
+ foo
1145
+ a: $bang-var
1146
+ SASS
1147
+
1148
+ assert_warning(<<WARN) {assert_equal(<<CSS, render(<<SASS))}
1149
+ DEPRECATION WARNING:
1150
+ On line 3, character 6 of 'test_bang_variables_inline.sass'
1151
+ Variables with ! have been deprecated and will be removed in version 3.2.
1152
+ Use "$dollar-var" instead.
1153
+
1154
+ You can use `sass-convert --in-place --from sass2 file.sass' to convert files automatically.
1155
+ WARN
1156
+ foo {
1157
+ a: 1px; }
1158
+ CSS
1159
+ $dollar-var: 1px
1160
+ foo
1161
+ a: !dollar-var
1162
+ SASS
1163
+ end
1164
+
1165
+ def test_equals_warning_for_variables
1166
+ assert_warning(<<WARN) {assert_equal(<<CSS, render(<<SASS))}
1167
+ DEPRECATION WARNING:
1168
+ On line 2, character 1 of 'test_equals_warning_for_variables_inline.sass'
1169
+ Setting variables with = has been deprecated and will be removed in version 3.2.
1170
+ Use "$equals-var: 2px 3px" instead.
1171
+
1172
+ You can use `sass-convert --in-place --from sass2 file.sass' to convert files automatically.
1173
+ WARN
1174
+ foo {
1175
+ a: 2px 3px; }
1176
+ CSS
1177
+
1178
+ $equals-var = 2px 3px
1179
+ foo
1180
+ a: $equals-var
1181
+ SASS
1182
+ end
1183
+
1184
+ def test_equals_warning_for_guarded_variables
1185
+ assert_warning(<<WARN) {assert_equal(<<CSS, render(<<SASS))}
1186
+ DEPRECATION WARNING:
1187
+ On line 2, character 1 of 'test_equals_warning_for_guarded_variables_inline.sass'
1188
+ Setting variable defaults with ||= has been deprecated and will be removed in version 3.2.
1189
+ Use "$equals-var: 2px 3px !default" instead.
1190
+
1191
+ You can use `sass-convert --in-place --from sass2 file.sass' to convert files automatically.
1192
+ WARN
1193
+ foo {
1194
+ a: 2px 3px; }
1195
+ CSS
1196
+
1197
+ $equals-var ||= 2px 3px
1198
+ foo
1199
+ a: $equals-var
981
1200
  SASS
982
1201
  end
983
1202
 
@@ -991,18 +1210,18 @@ a {
991
1210
  b {
992
1211
  d: 17; }
993
1212
  CSS
994
- !i = 12
1213
+ $i: 12
995
1214
  a
996
- @for !i from 1 through 2
997
- b-\#{!i}: c
998
- d = !i
1215
+ @for $i from 1 through 2
1216
+ b-\#{$i}: c
1217
+ d: $i
999
1218
 
1000
1219
  =foo
1001
- !i = 17
1220
+ $i: 17
1002
1221
 
1003
1222
  b
1004
1223
  +foo
1005
- d = !i
1224
+ d: $i
1006
1225
  SASS
1007
1226
  end
1008
1227
 
@@ -1015,22 +1234,45 @@ d {
1015
1234
  e: 13;
1016
1235
  f: foobar; }
1017
1236
  CSS
1018
- !var-hyphen = 12
1019
- !var_under = "foo"
1237
+ $var-hyphen: 12
1238
+ $var_under: foo
1020
1239
 
1021
1240
  a
1022
- !var_hyphen = 1 + !var_hyphen
1023
- !var-under = !var-under + "bar"
1241
+ $var_hyphen: 1 + $var_hyphen
1242
+ $var-under: $var-under + bar
1024
1243
  b: c
1025
1244
 
1026
1245
  d
1027
- e = !var-hyphen
1028
- f = !var_under
1246
+ e: $var-hyphen
1247
+ f: $var_under
1248
+ SASS
1249
+ end
1250
+
1251
+ def test_css_identifier_variable
1252
+ assert_equal(<<CSS, render(<<SASS))
1253
+ a {
1254
+ b: 12; }
1255
+ CSS
1256
+ $\\{foo\\(12\\): 12
1257
+
1258
+ a
1259
+ b: $\\{foo\\(12\\)
1260
+ SASS
1261
+ end
1262
+
1263
+ def test_important
1264
+ assert_equal(<<CSS, render(<<SASS))
1265
+ a {
1266
+ b: 12px !important; }
1267
+ CSS
1268
+ $foo: 12px
1269
+ a
1270
+ b: $foo !important
1029
1271
  SASS
1030
1272
  end
1031
1273
 
1032
1274
  def test_argument_error
1033
- assert_raise(Sass::SyntaxError) { render("a\n b = hsl(1)") }
1275
+ assert_raise(Sass::SyntaxError) { render("a\n b: hsl(1)") }
1034
1276
  end
1035
1277
 
1036
1278
  def test_comments_at_the_top_of_a_document
@@ -1136,25 +1378,7 @@ SASS
1136
1378
  def test_empty_selector_warning
1137
1379
  assert_warning(<<END) {render("foo bar")}
1138
1380
  WARNING on line 1 of test_empty_selector_warning_inline.sass:
1139
- Selector "foo bar" doesn't have any properties and will not be rendered.
1140
- END
1141
-
1142
- assert_warning(<<END) {render(<<SASS)}
1143
- WARNING on line 3 of test_empty_selector_warning_inline.sass:
1144
- Selector
1145
- foo, bar, baz,
1146
- bang, bip, bop
1147
- doesn't have any properties and will not be rendered.
1148
- END
1149
-
1150
-
1151
- foo, bar, baz,
1152
- bang, bip, bop
1153
- SASS
1154
-
1155
- assert_warning(<<END) {render("foo bar", :filename => nil)}
1156
- WARNING on line 1:
1157
- Selector "foo bar" doesn't have any properties and will not be rendered.
1381
+ This selector doesn't have any properties and will not be rendered.
1158
1382
  END
1159
1383
  end
1160
1384
 
@@ -1189,6 +1413,302 @@ foo
1189
1413
  SASS
1190
1414
  end
1191
1415
 
1416
+ def test_interpolation_in_raw_functions
1417
+ assert_equal(<<CSS, render(<<SASS))
1418
+ foo {
1419
+ filter: progid:Microsoft.foo.bar.Baz(flip=foobar, bang=#00ff00cc); }
1420
+ CSS
1421
+ foo
1422
+ filter: progid:Microsoft.foo.bar.Baz(flip=\#{foo + bar}, bang=#00ff00cc)
1423
+ SASS
1424
+ end
1425
+
1426
+ # SassScript string behavior
1427
+
1428
+ def test_plus_preserves_quotedness
1429
+ assert_equal(<<CSS, render(<<SASS))
1430
+ foo {
1431
+ a: "foo1";
1432
+ b: "1foo";
1433
+ c: foo1;
1434
+ d: 1foo;
1435
+ e: "foobar";
1436
+ f: foobar; }
1437
+ CSS
1438
+ foo
1439
+ a: "foo" + 1
1440
+ b: 1 + "foo"
1441
+ c: foo + 1
1442
+ d: 1 + foo
1443
+ e: "foo" + bar
1444
+ f: foo + "bar"
1445
+ SASS
1446
+ end
1447
+
1448
+ def test_colon_properties_preserve_quotedness
1449
+ assert_equal(<<CSS, render(<<SASS))
1450
+ foo {
1451
+ a: "foo";
1452
+ b: bar;
1453
+ c: "foo" bar;
1454
+ d: foo, "bar"; }
1455
+ CSS
1456
+ foo
1457
+ a: "foo"
1458
+ b: bar
1459
+ c: "foo" bar
1460
+ d: foo, "bar"
1461
+ SASS
1462
+ end
1463
+
1464
+ def test_colon_variables_preserve_quotedness
1465
+ assert_equal(<<CSS, render(<<SASS))
1466
+ foo {
1467
+ a: "foo";
1468
+ b: bar; }
1469
+ CSS
1470
+ $a: "foo"
1471
+ $b: bar
1472
+
1473
+ foo
1474
+ a: $a
1475
+ b: $b
1476
+ SASS
1477
+ end
1478
+
1479
+ def test_colon_args_preserve_quotedness
1480
+ assert_equal(<<CSS, render(<<SASS))
1481
+ foo {
1482
+ a: "foo";
1483
+ b: bar;
1484
+ c: "foo" bar;
1485
+ d: foo, "bar"; }
1486
+ CSS
1487
+ =foo($a: "foo", $b: bar, $c: "foo" bar, $d: (foo, "bar"))
1488
+ foo
1489
+ a: $a
1490
+ b: $b
1491
+ c: $c
1492
+ d: $d
1493
+
1494
+ +foo
1495
+ SASS
1496
+ end
1497
+
1498
+ def test_interpolation_unquotes_strings
1499
+ assert_equal(<<CSS, render(<<SASS))
1500
+ .foo-bar {
1501
+ a: b; }
1502
+ CSS
1503
+ .foo-\#{"bar"}
1504
+ a: b
1505
+ SASS
1506
+
1507
+ assert_equal(<<CSS, render(<<SASS))
1508
+ .foo {
1509
+ a: b c; }
1510
+ CSS
1511
+ .foo
1512
+ a: b \#{"c"}
1513
+ SASS
1514
+ end
1515
+
1516
+ def test_interpolation_unquotes_strings_in_vars
1517
+ assert_equal(<<CSS, render(<<SASS))
1518
+ .foo-bar {
1519
+ a: b; }
1520
+ CSS
1521
+ $var: "bar"
1522
+
1523
+ .foo-\#{$var}
1524
+ a: b
1525
+ SASS
1526
+ end
1527
+
1528
+ def test_interpolation_doesnt_deep_unquote_strings
1529
+ assert_equal(<<CSS, render(<<SASS))
1530
+ .foo-"bar" "baz" {
1531
+ a: b; }
1532
+ CSS
1533
+ .foo-\#{"bar" "baz"}
1534
+ a: b
1535
+ SASS
1536
+ end
1537
+
1538
+ # Deprecated equals behavior
1539
+
1540
+ def test_equals_properties_unquote_strings
1541
+ silence_warnings do
1542
+ assert_equal(<<CSS, render(<<SASS))
1543
+ foo {
1544
+ a: foo;
1545
+ b: bar;
1546
+ c: foo bar;
1547
+ d: foo, bar; }
1548
+ CSS
1549
+ foo
1550
+ a= "foo"
1551
+ b= bar
1552
+ c= "foo" bar
1553
+ d= foo, "bar"
1554
+ SASS
1555
+ end
1556
+ end
1557
+
1558
+ def test_equals_properties_unquote_value
1559
+ silence_warnings do
1560
+ assert_equal(<<CSS, render(<<SASS))
1561
+ foo {
1562
+ a: foo; }
1563
+ CSS
1564
+ $var: "foo"
1565
+
1566
+ foo
1567
+ a= $var
1568
+ SASS
1569
+ end
1570
+ end
1571
+
1572
+ def test_equals_properties_deep_unquote_vars
1573
+ silence_warnings do
1574
+ assert_equal(<<CSS, render(<<SASS))
1575
+ foo {
1576
+ a: foo bar;
1577
+ b: bar foo; }
1578
+ CSS
1579
+ $var: "foo"
1580
+
1581
+ foo
1582
+ a= $var "bar"
1583
+ b= "bar" $var
1584
+ SASS
1585
+ end
1586
+ end
1587
+
1588
+ def test_equals_vars_unquote_strings
1589
+ silence_warnings do
1590
+ assert_equal(<<CSS, render(<<SASS))
1591
+ foo {
1592
+ a: foo;
1593
+ b: bar;
1594
+ c: foo bar;
1595
+ d: foo, bar; }
1596
+ CSS
1597
+ $a = "foo"
1598
+ $b = bar
1599
+ $c = "foo" bar
1600
+ $d = foo, "bar"
1601
+
1602
+ foo
1603
+ a: $a
1604
+ b: $b
1605
+ c: $c
1606
+ d: $d
1607
+ SASS
1608
+ end
1609
+ end
1610
+
1611
+ def test_equals_vars_unquote_value
1612
+ silence_warnings do
1613
+ assert_equal(<<CSS, render(<<SASS))
1614
+ foo {
1615
+ a: foo; }
1616
+ CSS
1617
+ $var1: "foo"
1618
+ $var2 = $var1
1619
+
1620
+ foo
1621
+ a: $var2
1622
+ SASS
1623
+ end
1624
+ end
1625
+
1626
+ def test_equals_vars_deep_unquote_vars
1627
+ silence_warnings do
1628
+ assert_equal(<<CSS, render(<<SASS))
1629
+ foo {
1630
+ a: foo bar;
1631
+ b: bar foo; }
1632
+ CSS
1633
+ $var: "foo"
1634
+ $a = $var "bar"
1635
+ $b = "bar" $var
1636
+
1637
+ foo
1638
+ a: $a
1639
+ b: $b
1640
+ SASS
1641
+ end
1642
+ end
1643
+
1644
+ def test_equals_args_unquote_strings
1645
+ silence_warnings do
1646
+ assert_equal(<<CSS, render(<<SASS))
1647
+ foo {
1648
+ a: foo;
1649
+ b: bar;
1650
+ c: foo bar;
1651
+ d: foo, bar; }
1652
+ CSS
1653
+ =foo($a = "foo", $b = bar, $c = "foo" bar, $d = (foo, "bar"))
1654
+ foo
1655
+ a: $a
1656
+ b: $b
1657
+ c: $c
1658
+ d: $d
1659
+
1660
+ +foo
1661
+ SASS
1662
+ end
1663
+ end
1664
+
1665
+ def test_equals_args_unquote_value
1666
+ silence_warnings do
1667
+ assert_equal(<<CSS, render(<<SASS))
1668
+ foo {
1669
+ a: foo; }
1670
+ CSS
1671
+ $var1: "foo"
1672
+
1673
+ =foo($var2 = $var1)
1674
+ foo
1675
+ a: $var2
1676
+
1677
+ +foo
1678
+ SASS
1679
+ end
1680
+ end
1681
+
1682
+ def test_equals_args_deep_unquote_vars
1683
+ silence_warnings do
1684
+ assert_equal(<<CSS, render(<<SASS))
1685
+ foo {
1686
+ a: foo bar;
1687
+ b: bar foo; }
1688
+ CSS
1689
+ $var: "foo"
1690
+ =foo($a = $var "bar", $b = "bar" $var)
1691
+ foo
1692
+ a: $a
1693
+ b: $b
1694
+
1695
+ +foo
1696
+ SASS
1697
+ end
1698
+ end
1699
+
1700
+ def test_equals_properties_force_division
1701
+ silence_warnings do
1702
+ assert_equal(<<CSS, render(<<SASS))
1703
+ foo {
1704
+ a: 0.5; }
1705
+ CSS
1706
+ foo
1707
+ a = 1px/2px
1708
+ SASS
1709
+ end
1710
+ end
1711
+
1192
1712
  # Regression tests
1193
1713
 
1194
1714
  def test_parens_in_mixins
@@ -1197,9 +1717,9 @@ SASS
1197
1717
  color: #01ff7f;
1198
1718
  background-color: #000102; }
1199
1719
  CSS
1200
- =foo(!c1, !c2 = rgb(0, 1, 2))
1201
- color = !c1
1202
- background-color = !c2
1720
+ =foo($c1, $c2: rgb(0, 1, 2))
1721
+ color: $c1
1722
+ background-color: $c2
1203
1723
 
1204
1724
  .foo
1205
1725
  +foo(rgb(1,255,127))
@@ -1224,7 +1744,7 @@ SOURCE
1224
1744
  RESULT
1225
1745
  .box
1226
1746
  :border
1227
- /*:color black
1747
+ /* :color black
1228
1748
  :style solid
1229
1749
  SOURCE
1230
1750
 
@@ -1310,7 +1830,7 @@ a {
1310
1830
  b: nested; }
1311
1831
  CSS
1312
1832
  a
1313
- b= option("style")
1833
+ b: option("style")
1314
1834
  SASS
1315
1835
  end
1316
1836