xass 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (242) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +11 -0
  3. data/CONTRIBUTING +3 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +201 -0
  6. data/Rakefile +349 -0
  7. data/VERSION +1 -0
  8. data/VERSION_NAME +1 -0
  9. data/bin/push +13 -0
  10. data/bin/sass +13 -0
  11. data/bin/sass-convert +12 -0
  12. data/bin/scss +13 -0
  13. data/extra/update_watch.rb +13 -0
  14. data/init.rb +18 -0
  15. data/lib/sass/cache_stores/base.rb +88 -0
  16. data/lib/sass/cache_stores/chain.rb +33 -0
  17. data/lib/sass/cache_stores/filesystem.rb +64 -0
  18. data/lib/sass/cache_stores/memory.rb +47 -0
  19. data/lib/sass/cache_stores/null.rb +25 -0
  20. data/lib/sass/cache_stores.rb +15 -0
  21. data/lib/sass/callbacks.rb +66 -0
  22. data/lib/sass/css.rb +409 -0
  23. data/lib/sass/engine.rb +930 -0
  24. data/lib/sass/environment.rb +101 -0
  25. data/lib/sass/error.rb +201 -0
  26. data/lib/sass/exec.rb +707 -0
  27. data/lib/sass/importers/base.rb +139 -0
  28. data/lib/sass/importers/filesystem.rb +186 -0
  29. data/lib/sass/importers.rb +22 -0
  30. data/lib/sass/logger/base.rb +32 -0
  31. data/lib/sass/logger/log_level.rb +49 -0
  32. data/lib/sass/logger.rb +15 -0
  33. data/lib/sass/media.rb +213 -0
  34. data/lib/sass/plugin/compiler.rb +406 -0
  35. data/lib/sass/plugin/configuration.rb +123 -0
  36. data/lib/sass/plugin/generic.rb +15 -0
  37. data/lib/sass/plugin/merb.rb +48 -0
  38. data/lib/sass/plugin/rack.rb +60 -0
  39. data/lib/sass/plugin/rails.rb +47 -0
  40. data/lib/sass/plugin/staleness_checker.rb +199 -0
  41. data/lib/sass/plugin.rb +133 -0
  42. data/lib/sass/railtie.rb +10 -0
  43. data/lib/sass/repl.rb +57 -0
  44. data/lib/sass/root.rb +7 -0
  45. data/lib/sass/script/arg_list.rb +52 -0
  46. data/lib/sass/script/bool.rb +18 -0
  47. data/lib/sass/script/color.rb +606 -0
  48. data/lib/sass/script/css_lexer.rb +29 -0
  49. data/lib/sass/script/css_parser.rb +31 -0
  50. data/lib/sass/script/funcall.rb +245 -0
  51. data/lib/sass/script/functions.rb +1543 -0
  52. data/lib/sass/script/interpolation.rb +79 -0
  53. data/lib/sass/script/lexer.rb +345 -0
  54. data/lib/sass/script/list.rb +85 -0
  55. data/lib/sass/script/literal.rb +221 -0
  56. data/lib/sass/script/node.rb +99 -0
  57. data/lib/sass/script/null.rb +37 -0
  58. data/lib/sass/script/number.rb +453 -0
  59. data/lib/sass/script/operation.rb +110 -0
  60. data/lib/sass/script/parser.rb +502 -0
  61. data/lib/sass/script/string.rb +51 -0
  62. data/lib/sass/script/string_interpolation.rb +103 -0
  63. data/lib/sass/script/unary_operation.rb +69 -0
  64. data/lib/sass/script/variable.rb +58 -0
  65. data/lib/sass/script.rb +39 -0
  66. data/lib/sass/scss/css_parser.rb +36 -0
  67. data/lib/sass/scss/parser.rb +1180 -0
  68. data/lib/sass/scss/rx.rb +133 -0
  69. data/lib/sass/scss/script_lexer.rb +15 -0
  70. data/lib/sass/scss/script_parser.rb +25 -0
  71. data/lib/sass/scss/static_parser.rb +54 -0
  72. data/lib/sass/scss.rb +16 -0
  73. data/lib/sass/selector/abstract_sequence.rb +94 -0
  74. data/lib/sass/selector/comma_sequence.rb +92 -0
  75. data/lib/sass/selector/sequence.rb +507 -0
  76. data/lib/sass/selector/simple.rb +119 -0
  77. data/lib/sass/selector/simple_sequence.rb +215 -0
  78. data/lib/sass/selector.rb +452 -0
  79. data/lib/sass/shared.rb +76 -0
  80. data/lib/sass/supports.rb +229 -0
  81. data/lib/sass/tree/charset_node.rb +22 -0
  82. data/lib/sass/tree/comment_node.rb +82 -0
  83. data/lib/sass/tree/content_node.rb +9 -0
  84. data/lib/sass/tree/css_import_node.rb +60 -0
  85. data/lib/sass/tree/debug_node.rb +18 -0
  86. data/lib/sass/tree/directive_node.rb +42 -0
  87. data/lib/sass/tree/each_node.rb +24 -0
  88. data/lib/sass/tree/extend_node.rb +36 -0
  89. data/lib/sass/tree/for_node.rb +36 -0
  90. data/lib/sass/tree/function_node.rb +34 -0
  91. data/lib/sass/tree/if_node.rb +52 -0
  92. data/lib/sass/tree/import_node.rb +75 -0
  93. data/lib/sass/tree/media_node.rb +58 -0
  94. data/lib/sass/tree/mixin_def_node.rb +38 -0
  95. data/lib/sass/tree/mixin_node.rb +39 -0
  96. data/lib/sass/tree/node.rb +196 -0
  97. data/lib/sass/tree/prop_node.rb +152 -0
  98. data/lib/sass/tree/return_node.rb +18 -0
  99. data/lib/sass/tree/root_node.rb +78 -0
  100. data/lib/sass/tree/rule_node.rb +132 -0
  101. data/lib/sass/tree/supports_node.rb +51 -0
  102. data/lib/sass/tree/trace_node.rb +32 -0
  103. data/lib/sass/tree/variable_node.rb +30 -0
  104. data/lib/sass/tree/visitors/base.rb +75 -0
  105. data/lib/sass/tree/visitors/check_nesting.rb +147 -0
  106. data/lib/sass/tree/visitors/convert.rb +316 -0
  107. data/lib/sass/tree/visitors/cssize.rb +241 -0
  108. data/lib/sass/tree/visitors/deep_copy.rb +102 -0
  109. data/lib/sass/tree/visitors/extend.rb +68 -0
  110. data/lib/sass/tree/visitors/perform.rb +446 -0
  111. data/lib/sass/tree/visitors/set_options.rb +125 -0
  112. data/lib/sass/tree/visitors/to_css.rb +228 -0
  113. data/lib/sass/tree/warn_node.rb +18 -0
  114. data/lib/sass/tree/while_node.rb +18 -0
  115. data/lib/sass/util/multibyte_string_scanner.rb +155 -0
  116. data/lib/sass/util/subset_map.rb +109 -0
  117. data/lib/sass/util/test.rb +10 -0
  118. data/lib/sass/util.rb +948 -0
  119. data/lib/sass/version.rb +126 -0
  120. data/lib/sass.rb +95 -0
  121. data/rails/init.rb +1 -0
  122. data/test/Gemfile +3 -0
  123. data/test/Gemfile.lock +10 -0
  124. data/test/sass/cache_test.rb +89 -0
  125. data/test/sass/callbacks_test.rb +61 -0
  126. data/test/sass/conversion_test.rb +1760 -0
  127. data/test/sass/css2sass_test.rb +458 -0
  128. data/test/sass/data/hsl-rgb.txt +319 -0
  129. data/test/sass/engine_test.rb +3244 -0
  130. data/test/sass/exec_test.rb +86 -0
  131. data/test/sass/extend_test.rb +1482 -0
  132. data/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
  133. data/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
  134. data/test/sass/functions_test.rb +1139 -0
  135. data/test/sass/importer_test.rb +192 -0
  136. data/test/sass/logger_test.rb +58 -0
  137. data/test/sass/mock_importer.rb +49 -0
  138. data/test/sass/more_results/more1.css +9 -0
  139. data/test/sass/more_results/more1_with_line_comments.css +26 -0
  140. data/test/sass/more_results/more_import.css +29 -0
  141. data/test/sass/more_templates/_more_partial.sass +2 -0
  142. data/test/sass/more_templates/more1.sass +23 -0
  143. data/test/sass/more_templates/more_import.sass +11 -0
  144. data/test/sass/plugin_test.rb +564 -0
  145. data/test/sass/results/alt.css +4 -0
  146. data/test/sass/results/basic.css +9 -0
  147. data/test/sass/results/cached_import_option.css +3 -0
  148. data/test/sass/results/compact.css +5 -0
  149. data/test/sass/results/complex.css +86 -0
  150. data/test/sass/results/compressed.css +1 -0
  151. data/test/sass/results/expanded.css +19 -0
  152. data/test/sass/results/filename_fn.css +3 -0
  153. data/test/sass/results/if.css +3 -0
  154. data/test/sass/results/import.css +31 -0
  155. data/test/sass/results/import_charset.css +5 -0
  156. data/test/sass/results/import_charset_1_8.css +5 -0
  157. data/test/sass/results/import_charset_ibm866.css +5 -0
  158. data/test/sass/results/import_content.css +1 -0
  159. data/test/sass/results/line_numbers.css +49 -0
  160. data/test/sass/results/mixins.css +95 -0
  161. data/test/sass/results/multiline.css +24 -0
  162. data/test/sass/results/nested.css +22 -0
  163. data/test/sass/results/options.css +1 -0
  164. data/test/sass/results/parent_ref.css +13 -0
  165. data/test/sass/results/script.css +16 -0
  166. data/test/sass/results/scss_import.css +31 -0
  167. data/test/sass/results/scss_importee.css +2 -0
  168. data/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
  169. data/test/sass/results/subdir/subdir.css +3 -0
  170. data/test/sass/results/units.css +11 -0
  171. data/test/sass/results/warn.css +0 -0
  172. data/test/sass/results/warn_imported.css +0 -0
  173. data/test/sass/script_conversion_test.rb +299 -0
  174. data/test/sass/script_test.rb +622 -0
  175. data/test/sass/scss/css_test.rb +1100 -0
  176. data/test/sass/scss/rx_test.rb +156 -0
  177. data/test/sass/scss/scss_test.rb +2106 -0
  178. data/test/sass/scss/test_helper.rb +37 -0
  179. data/test/sass/templates/_cached_import_option_partial.scss +1 -0
  180. data/test/sass/templates/_double_import_loop2.sass +1 -0
  181. data/test/sass/templates/_filename_fn_import.scss +11 -0
  182. data/test/sass/templates/_imported_charset_ibm866.sass +4 -0
  183. data/test/sass/templates/_imported_charset_utf8.sass +4 -0
  184. data/test/sass/templates/_imported_content.sass +3 -0
  185. data/test/sass/templates/_partial.sass +2 -0
  186. data/test/sass/templates/_same_name_different_partiality.scss +1 -0
  187. data/test/sass/templates/alt.sass +16 -0
  188. data/test/sass/templates/basic.sass +23 -0
  189. data/test/sass/templates/bork1.sass +2 -0
  190. data/test/sass/templates/bork2.sass +2 -0
  191. data/test/sass/templates/bork3.sass +2 -0
  192. data/test/sass/templates/bork4.sass +2 -0
  193. data/test/sass/templates/bork5.sass +3 -0
  194. data/test/sass/templates/cached_import_option.scss +3 -0
  195. data/test/sass/templates/compact.sass +17 -0
  196. data/test/sass/templates/complex.sass +305 -0
  197. data/test/sass/templates/compressed.sass +15 -0
  198. data/test/sass/templates/double_import_loop1.sass +1 -0
  199. data/test/sass/templates/expanded.sass +17 -0
  200. data/test/sass/templates/filename_fn.scss +18 -0
  201. data/test/sass/templates/if.sass +11 -0
  202. data/test/sass/templates/import.sass +12 -0
  203. data/test/sass/templates/import_charset.sass +9 -0
  204. data/test/sass/templates/import_charset_1_8.sass +6 -0
  205. data/test/sass/templates/import_charset_ibm866.sass +11 -0
  206. data/test/sass/templates/import_content.sass +4 -0
  207. data/test/sass/templates/importee.less +2 -0
  208. data/test/sass/templates/importee.sass +19 -0
  209. data/test/sass/templates/line_numbers.sass +13 -0
  210. data/test/sass/templates/mixin_bork.sass +5 -0
  211. data/test/sass/templates/mixins.sass +76 -0
  212. data/test/sass/templates/multiline.sass +20 -0
  213. data/test/sass/templates/nested.sass +25 -0
  214. data/test/sass/templates/nested_bork1.sass +2 -0
  215. data/test/sass/templates/nested_bork2.sass +2 -0
  216. data/test/sass/templates/nested_bork3.sass +2 -0
  217. data/test/sass/templates/nested_bork4.sass +2 -0
  218. data/test/sass/templates/nested_import.sass +2 -0
  219. data/test/sass/templates/nested_mixin_bork.sass +6 -0
  220. data/test/sass/templates/options.sass +2 -0
  221. data/test/sass/templates/parent_ref.sass +25 -0
  222. data/test/sass/templates/same_name_different_ext.sass +2 -0
  223. data/test/sass/templates/same_name_different_ext.scss +1 -0
  224. data/test/sass/templates/same_name_different_partiality.scss +1 -0
  225. data/test/sass/templates/script.sass +101 -0
  226. data/test/sass/templates/scss_import.scss +11 -0
  227. data/test/sass/templates/scss_importee.scss +1 -0
  228. data/test/sass/templates/single_import_loop.sass +1 -0
  229. data/test/sass/templates/subdir/import_up1.scss +1 -0
  230. data/test/sass/templates/subdir/import_up2.scss +1 -0
  231. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
  232. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
  233. data/test/sass/templates/subdir/subdir.sass +6 -0
  234. data/test/sass/templates/units.sass +11 -0
  235. data/test/sass/templates/warn.sass +3 -0
  236. data/test/sass/templates/warn_imported.sass +4 -0
  237. data/test/sass/test_helper.rb +8 -0
  238. data/test/sass/util/multibyte_string_scanner_test.rb +147 -0
  239. data/test/sass/util/subset_map_test.rb +91 -0
  240. data/test/sass/util_test.rb +382 -0
  241. data/test/test_helper.rb +80 -0
  242. metadata +354 -0
@@ -0,0 +1,1760 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../test_helper'
3
+
4
+ class ConversionTest < Test::Unit::TestCase
5
+ def test_basic
6
+ assert_renders <<SASS, <<SCSS
7
+ foo bar
8
+ baz: bang
9
+ bip: bop
10
+ SASS
11
+ foo bar {
12
+ baz: bang;
13
+ bip: bop;
14
+ }
15
+ SCSS
16
+ assert_renders <<SASS, <<SCSS, :old => true
17
+ foo bar
18
+ :baz bang
19
+ :bip bop
20
+ SASS
21
+ foo bar {
22
+ baz: bang;
23
+ bip: bop;
24
+ }
25
+ SCSS
26
+ end
27
+
28
+ def test_empty_selector
29
+ assert_renders "foo bar", "foo bar {}"
30
+ end
31
+
32
+ def test_empty_directive
33
+ assert_scss_to_sass "@media screen", "@media screen {}"
34
+ assert_scss_to_scss "@media screen {}"
35
+ end
36
+
37
+ def test_empty_control_directive
38
+ assert_renders "@if false", "@if false {}"
39
+ end
40
+
41
+ def test_nesting
42
+ assert_renders <<SASS, <<SCSS
43
+ foo bar
44
+ baz bang
45
+ baz: bang
46
+ bip: bop
47
+ blat: boo
48
+ SASS
49
+ foo bar {
50
+ baz bang {
51
+ baz: bang;
52
+ bip: bop;
53
+ }
54
+ blat: boo;
55
+ }
56
+ SCSS
57
+ end
58
+
59
+ def test_nesting_with_parent_ref
60
+ assert_renders <<SASS, <<SCSS
61
+ foo bar
62
+ &:hover
63
+ baz: bang
64
+ SASS
65
+ foo bar {
66
+ &:hover {
67
+ baz: bang;
68
+ }
69
+ }
70
+ SCSS
71
+ end
72
+
73
+ def test_selector_interpolation
74
+ assert_renders <<SASS, <<SCSS
75
+ foo \#{$bar + "baz"}.bip
76
+ baz: bang
77
+
78
+ foo /\#{$bar + "baz"}/ .bip
79
+ baz: bang
80
+ SASS
81
+ foo \#{$bar + "baz"}.bip {
82
+ baz: bang;
83
+ }
84
+
85
+ foo /\#{$bar + "baz"}/ .bip {
86
+ baz: bang;
87
+ }
88
+ SCSS
89
+ end
90
+
91
+ def test_multiline_selector_with_commas
92
+ assert_renders <<SASS, <<SCSS
93
+ foo bar,
94
+ baz bang
95
+ baz: bang
96
+ SASS
97
+ foo bar,
98
+ baz bang {
99
+ baz: bang;
100
+ }
101
+ SCSS
102
+
103
+ assert_renders <<SASS, <<SCSS
104
+ blat
105
+ foo bar,
106
+ baz bang
107
+ baz: bang
108
+ SASS
109
+ blat {
110
+ foo bar,
111
+ baz bang {
112
+ baz: bang;
113
+ }
114
+ }
115
+ SCSS
116
+ end
117
+
118
+ def test_multiline_selector_without_commas
119
+ assert_scss_to_sass <<SASS, <<SCSS
120
+ foo bar baz bang
121
+ baz: bang
122
+ SASS
123
+ foo bar
124
+ baz bang {
125
+ baz: bang;
126
+ }
127
+ SCSS
128
+
129
+ assert_scss_to_scss <<SCSS
130
+ foo bar
131
+ baz bang {
132
+ baz: bang;
133
+ }
134
+ SCSS
135
+ end
136
+
137
+ def test_escaped_selector
138
+ assert_renders <<SASS, <<SCSS
139
+ foo bar
140
+ \\:hover
141
+ baz: bang
142
+ SASS
143
+ foo bar {
144
+ :hover {
145
+ baz: bang;
146
+ }
147
+ }
148
+ SCSS
149
+ end
150
+
151
+ def test_property_name_interpolation
152
+ assert_renders <<SASS, <<SCSS
153
+ foo bar
154
+ baz\#{$bang}bip\#{$bop}: 12
155
+ SASS
156
+ foo bar {
157
+ baz\#{$bang}bip\#{$bop}: 12;
158
+ }
159
+ SCSS
160
+ end
161
+
162
+ def test_property_value_interpolation
163
+ assert_renders <<SASS, <<SCSS
164
+ foo bar
165
+ baz: 12 \#{$bang} bip \#{"bop"} blat
166
+ SASS
167
+ foo bar {
168
+ baz: 12 \#{$bang} bip \#{"bop"} blat;
169
+ }
170
+ SCSS
171
+ end
172
+
173
+ def test_dynamic_properties
174
+ assert_renders <<SASS, <<SCSS
175
+ foo bar
176
+ baz: 12 $bang "bip"
177
+ SASS
178
+ foo bar {
179
+ baz: 12 $bang "bip";
180
+ }
181
+ SCSS
182
+ end
183
+
184
+ def test_dynamic_properties_with_old
185
+ assert_renders <<SASS, <<SCSS, :old => true
186
+ foo bar
187
+ :baz 12 $bang "bip"
188
+ SASS
189
+ foo bar {
190
+ baz: 12 $bang "bip";
191
+ }
192
+ SCSS
193
+ end
194
+
195
+ def test_multiline_properties
196
+ assert_scss_to_sass <<SASS, <<SCSS
197
+ foo bar
198
+ baz: bip bam boon
199
+ SASS
200
+ foo bar {
201
+ baz:
202
+ bip
203
+ bam
204
+ boon;
205
+ }
206
+ SCSS
207
+
208
+ assert_scss_to_scss <<OUT, <<IN
209
+ foo bar {
210
+ baz: bip bam boon;
211
+ }
212
+ OUT
213
+ foo bar {
214
+ baz:
215
+ bip
216
+ bam
217
+ boon;
218
+ }
219
+ IN
220
+ end
221
+
222
+ def test_multiline_dynamic_properties
223
+ assert_scss_to_sass <<SASS, <<SCSS
224
+ foo bar
225
+ baz: $bip "bam" 12px
226
+ SASS
227
+ foo bar {
228
+ baz:
229
+ $bip
230
+ "bam"
231
+ 12px;
232
+ }
233
+ SCSS
234
+
235
+ assert_scss_to_scss <<OUT, <<IN
236
+ foo bar {
237
+ baz: $bip "bam" 12px;
238
+ }
239
+ OUT
240
+ foo bar {
241
+ baz:
242
+ $bip
243
+ "bam"
244
+ 12px;
245
+ }
246
+ IN
247
+ end
248
+
249
+ def test_silent_comments
250
+ assert_renders <<SASS, <<SCSS
251
+ // foo
252
+
253
+ // bar
254
+
255
+ // baz
256
+
257
+ foo bar
258
+ a: b
259
+ SASS
260
+ // foo
261
+
262
+ // bar
263
+
264
+ // baz
265
+
266
+ foo bar {
267
+ a: b;
268
+ }
269
+ SCSS
270
+
271
+ assert_renders <<SASS, <<SCSS
272
+ // foo
273
+ // bar
274
+ // baz
275
+ // bang
276
+
277
+ foo bar
278
+ a: b
279
+ SASS
280
+ // foo
281
+ // bar
282
+ // baz
283
+ // bang
284
+
285
+ foo bar {
286
+ a: b;
287
+ }
288
+ SCSS
289
+
290
+ assert_sass_to_scss <<SCSS, <<SASS
291
+ // foo
292
+ // bar
293
+ // baz
294
+ // bang
295
+
296
+ foo bar {
297
+ a: b;
298
+ }
299
+ SCSS
300
+ // foo
301
+ // bar
302
+ // baz
303
+ // bang
304
+
305
+ foo bar
306
+ a: b
307
+ SASS
308
+ end
309
+
310
+ def test_nested_silent_comments
311
+ assert_renders <<SASS, <<SCSS
312
+ foo
313
+ bar: baz
314
+ // bip bop
315
+ // beep boop
316
+ bang: bizz
317
+ // bubble bubble
318
+ // toil trouble
319
+ SASS
320
+ foo {
321
+ bar: baz;
322
+ // bip bop
323
+ // beep boop
324
+ bang: bizz;
325
+ // bubble bubble
326
+ // toil trouble
327
+ }
328
+ SCSS
329
+
330
+ assert_sass_to_scss <<SCSS, <<SASS
331
+ foo {
332
+ bar: baz;
333
+ // bip bop
334
+ // beep boop
335
+ // bap blimp
336
+ bang: bizz;
337
+ // bubble bubble
338
+ // toil trouble
339
+ // gorp
340
+ }
341
+ SCSS
342
+ foo
343
+ bar: baz
344
+ // bip bop
345
+ beep boop
346
+ bap blimp
347
+ bang: bizz
348
+ // bubble bubble
349
+ toil trouble
350
+ gorp
351
+ SASS
352
+ end
353
+
354
+ def test_loud_comments
355
+ assert_renders <<SASS, <<SCSS
356
+ /* foo
357
+
358
+ /* bar
359
+
360
+ /* baz
361
+
362
+ foo bar
363
+ a: b
364
+ SASS
365
+ /* foo */
366
+
367
+ /* bar */
368
+
369
+ /* baz */
370
+
371
+ foo bar {
372
+ a: b;
373
+ }
374
+ SCSS
375
+
376
+ assert_scss_to_sass <<SASS, <<SCSS
377
+ /* foo
378
+ * bar
379
+ * baz
380
+ * bang
381
+
382
+ foo bar
383
+ a: b
384
+ SASS
385
+ /* foo
386
+ bar
387
+ baz
388
+ bang */
389
+
390
+ foo bar {
391
+ a: b;
392
+ }
393
+ SCSS
394
+
395
+ assert_scss_to_scss <<SCSS
396
+ /* foo
397
+ bar
398
+ baz
399
+ bang */
400
+
401
+ foo bar {
402
+ a: b;
403
+ }
404
+ SCSS
405
+
406
+ assert_renders <<SASS, <<SCSS
407
+ /* foo
408
+ * bar
409
+ * baz
410
+ * bang
411
+
412
+ foo bar
413
+ a: b
414
+ SASS
415
+ /* foo
416
+ * bar
417
+ * baz
418
+ * bang */
419
+
420
+ foo bar {
421
+ a: b;
422
+ }
423
+ SCSS
424
+ end
425
+
426
+ def test_nested_loud_comments
427
+ assert_renders <<SASS, <<SCSS
428
+ foo
429
+ bar: baz
430
+ /* bip bop
431
+ * beep boop
432
+ bang: bizz
433
+ /* bubble bubble
434
+ * toil trouble
435
+ SASS
436
+ foo {
437
+ bar: baz;
438
+ /* bip bop
439
+ * beep boop */
440
+ bang: bizz;
441
+ /* bubble bubble
442
+ * toil trouble */
443
+ }
444
+ SCSS
445
+
446
+ assert_sass_to_scss <<SCSS, <<SASS
447
+ foo {
448
+ bar: baz;
449
+ /* bip bop
450
+ * beep boop
451
+ * bap blimp */
452
+ bang: bizz;
453
+ /* bubble bubble
454
+ * toil trouble
455
+ * gorp */
456
+ }
457
+ SCSS
458
+ foo
459
+ bar: baz
460
+ /* bip bop
461
+ beep boop
462
+ bap blimp
463
+ bang: bizz
464
+ /* bubble bubble
465
+ toil trouble
466
+ gorp
467
+ SASS
468
+ end
469
+
470
+ def test_loud_comments_with_weird_indentation
471
+ assert_scss_to_sass <<SASS, <<SCSS
472
+ foo
473
+ /* foo
474
+ * bar
475
+ * baz
476
+ a: b
477
+ SASS
478
+ foo {
479
+ /* foo
480
+ bar
481
+ baz */
482
+ a: b;
483
+ }
484
+ SCSS
485
+
486
+ assert_sass_to_scss <<SCSS, <<SASS
487
+ foo {
488
+ /* foo
489
+ * bar
490
+ * baz */
491
+ a: b;
492
+ }
493
+ SCSS
494
+ foo
495
+ /* foo
496
+ bar
497
+ baz
498
+ a: b
499
+ SASS
500
+ end
501
+
502
+ def test_immediately_preceding_comments
503
+ assert_renders <<SASS, <<SCSS
504
+ /* Foo
505
+ * Bar
506
+ * Baz
507
+ .foo#bar
508
+ a: b
509
+ SASS
510
+ /* Foo
511
+ * Bar
512
+ * Baz */
513
+ .foo#bar {
514
+ a: b;
515
+ }
516
+ SCSS
517
+
518
+ assert_renders <<SASS, <<SCSS
519
+ // Foo
520
+ // Bar
521
+ // Baz
522
+ =foo
523
+ a: b
524
+ SASS
525
+ // Foo
526
+ // Bar
527
+ // Baz
528
+ @mixin foo {
529
+ a: b;
530
+ }
531
+ SCSS
532
+ end
533
+
534
+ def test_debug
535
+ assert_renders <<SASS, <<SCSS
536
+ foo
537
+ @debug 12px
538
+ bar: baz
539
+ SASS
540
+ foo {
541
+ @debug 12px;
542
+ bar: baz;
543
+ }
544
+ SCSS
545
+ end
546
+
547
+ def test_directive_without_children
548
+ assert_renders <<SASS, <<SCSS
549
+ foo
550
+ @foo #bar "baz"
551
+ bar: baz
552
+ SASS
553
+ foo {
554
+ @foo #bar "baz";
555
+ bar: baz;
556
+ }
557
+ SCSS
558
+ end
559
+
560
+ def test_directive_with_prop_children
561
+ assert_renders <<SASS, <<SCSS
562
+ foo
563
+ @foo #bar "baz"
564
+ a: b
565
+ c: d
566
+
567
+ bar: baz
568
+ SASS
569
+ foo {
570
+ @foo #bar "baz" {
571
+ a: b;
572
+ c: d;
573
+ }
574
+
575
+ bar: baz;
576
+ }
577
+ SCSS
578
+ end
579
+
580
+ def test_directive_with_rule_children
581
+ assert_renders <<SASS, <<SCSS
582
+ foo
583
+ @foo #bar "baz"
584
+ #blat
585
+ a: b
586
+ .bang
587
+ c: d
588
+ e: f
589
+
590
+ bar: baz
591
+ SASS
592
+ foo {
593
+ @foo #bar "baz" {
594
+ #blat {
595
+ a: b;
596
+ }
597
+ .bang {
598
+ c: d;
599
+ e: f;
600
+ }
601
+ }
602
+
603
+ bar: baz;
604
+ }
605
+ SCSS
606
+ end
607
+
608
+ def test_directive_with_rule_and_prop_children
609
+ assert_renders <<SASS, <<SCSS
610
+ foo
611
+ @foo #bar "baz"
612
+ g: h
613
+ #blat
614
+ a: b
615
+ .bang
616
+ c: d
617
+ e: f
618
+ i: j
619
+
620
+ bar: baz
621
+ SASS
622
+ foo {
623
+ @foo #bar "baz" {
624
+ g: h;
625
+ #blat {
626
+ a: b;
627
+ }
628
+ .bang {
629
+ c: d;
630
+ e: f;
631
+ }
632
+ i: j;
633
+ }
634
+
635
+ bar: baz;
636
+ }
637
+ SCSS
638
+ end
639
+
640
+ def test_charset
641
+ assert_renders <<SASS, <<SCSS
642
+ @charset "utf-8"
643
+ SASS
644
+ @charset "utf-8";
645
+ SCSS
646
+ end
647
+
648
+ def test_for
649
+ assert_renders <<SASS, <<SCSS
650
+ foo
651
+ @for $a from $b to $c
652
+ a: b
653
+ @for $c from 1 to 16
654
+ d: e
655
+ f: g
656
+ SASS
657
+ foo {
658
+ @for $a from $b to $c {
659
+ a: b;
660
+ }
661
+ @for $c from 1 to 16 {
662
+ d: e;
663
+ f: g;
664
+ }
665
+ }
666
+ SCSS
667
+ end
668
+
669
+ def test_while
670
+ assert_renders <<SASS, <<SCSS
671
+ foo
672
+ @while flaz($a + $b)
673
+ a: b
674
+ @while 1
675
+ d: e
676
+ f: g
677
+ SASS
678
+ foo {
679
+ @while flaz($a + $b) {
680
+ a: b;
681
+ }
682
+ @while 1 {
683
+ d: e;
684
+ f: g;
685
+ }
686
+ }
687
+ SCSS
688
+ end
689
+
690
+ def test_if
691
+ assert_renders <<SASS, <<SCSS
692
+ foo
693
+ @if $foo or $bar
694
+ a: b
695
+ @if $baz
696
+ d: e
697
+ @else if $bang
698
+ f: g
699
+ @else
700
+ h: i
701
+ SASS
702
+ foo {
703
+ @if $foo or $bar {
704
+ a: b;
705
+ }
706
+ @if $baz {
707
+ d: e;
708
+ }
709
+ @else if $bang {
710
+ f: g;
711
+ }
712
+ @else {
713
+ h: i;
714
+ }
715
+ }
716
+ SCSS
717
+ end
718
+
719
+ def test_each
720
+ assert_renders <<SASS, <<SCSS
721
+ a
722
+ @each $number in 1px 2px 3px 4px
723
+ b: $number
724
+
725
+ c
726
+ @each $str in foo, bar, baz, bang
727
+ d: $str
728
+ SASS
729
+ a {
730
+ @each $number in 1px 2px 3px 4px {
731
+ b: $number;
732
+ }
733
+ }
734
+
735
+ c {
736
+ @each $str in foo, bar, baz, bang {
737
+ d: $str;
738
+ }
739
+ }
740
+ SCSS
741
+ end
742
+
743
+ def test_import
744
+ assert_renders <<SASS, <<SCSS
745
+ @import foo
746
+
747
+ @import url(bar.css)
748
+
749
+ foo
750
+ bar: baz
751
+ SASS
752
+ @import "foo";
753
+
754
+ @import url(bar.css);
755
+
756
+ foo {
757
+ bar: baz;
758
+ }
759
+ SCSS
760
+
761
+ assert_renders <<SASS, <<SCSS
762
+ @import foo.css
763
+
764
+ @import url(bar.css)
765
+
766
+ foo
767
+ bar: baz
768
+ SASS
769
+ @import "foo.css";
770
+
771
+ @import url(bar.css);
772
+
773
+ foo {
774
+ bar: baz;
775
+ }
776
+ SCSS
777
+ end
778
+
779
+ def test_import_as_directive_in_sass
780
+ assert_equal "@import foo.css\n", to_sass('@import "foo.css"')
781
+ end
782
+
783
+ def test_import_as_directive_in_scss
784
+ assert_renders <<SASS, <<SCSS
785
+ @import "foo.css" print
786
+ SASS
787
+ @import "foo.css" print;
788
+ SCSS
789
+
790
+ assert_renders <<SASS, <<SCSS
791
+ @import url(foo.css) screen, print
792
+ SASS
793
+ @import url(foo.css) screen, print;
794
+ SCSS
795
+ end
796
+
797
+ def test_adjacent_imports
798
+ assert_renders <<SASS, <<SCSS
799
+ @import foo.sass
800
+ @import bar.scss
801
+ @import baz
802
+ SASS
803
+ @import "foo.sass";
804
+ @import "bar.scss";
805
+ @import "baz";
806
+ SCSS
807
+ end
808
+
809
+ def test_non_adjacent_imports
810
+ assert_renders <<SASS, <<SCSS
811
+ @import foo.sass
812
+
813
+ @import bar.scss
814
+
815
+ @import baz
816
+ SASS
817
+ @import "foo.sass";
818
+
819
+ @import "bar.scss";
820
+
821
+ @import "baz";
822
+ SCSS
823
+ end
824
+
825
+ def test_import_with_interpolation
826
+ assert_renders <<SASS, <<SCSS
827
+ $family: unquote("Droid+Sans")
828
+
829
+ @import url("http://fonts.googleapis.com/css?family=\#{$family}")
830
+ SASS
831
+ $family: unquote("Droid+Sans");
832
+
833
+ @import url("http://fonts.googleapis.com/css?family=\#{$family}");
834
+ SCSS
835
+ end
836
+
837
+ def test_extend
838
+ assert_renders <<SASS, <<SCSS
839
+ .foo
840
+ @extend .bar
841
+ @extend .baz:bang
842
+ SASS
843
+ .foo {
844
+ @extend .bar;
845
+ @extend .baz:bang;
846
+ }
847
+ SCSS
848
+ end
849
+
850
+ def test_comma_extendee
851
+ assert_renders <<SASS, <<SCSS
852
+ .baz
853
+ @extend .foo, .bar
854
+ SASS
855
+ .baz {
856
+ @extend .foo, .bar;
857
+ }
858
+ SCSS
859
+ end
860
+
861
+ def test_argless_mixin_definition
862
+ assert_renders <<SASS, <<SCSS
863
+ =foo-bar
864
+ baz
865
+ a: b
866
+ SASS
867
+ @mixin foo-bar {
868
+ baz {
869
+ a: b;
870
+ }
871
+ }
872
+ SCSS
873
+
874
+ assert_scss_to_sass <<SASS, <<SCSS
875
+ =foo-bar
876
+ baz
877
+ a: b
878
+ SASS
879
+ @mixin foo-bar() {
880
+ baz {
881
+ a: b;
882
+ }
883
+ }
884
+ SCSS
885
+
886
+ assert_sass_to_scss <<SCSS, <<SASS
887
+ @mixin foo-bar {
888
+ baz {
889
+ a: b;
890
+ }
891
+ }
892
+ SCSS
893
+ =foo-bar()
894
+ baz
895
+ a: b
896
+ SASS
897
+ end
898
+
899
+ def test_mixin_definition_without_defaults
900
+ assert_renders <<SASS, <<SCSS
901
+ =foo-bar($baz, $bang)
902
+ baz
903
+ a: $baz $bang
904
+ SASS
905
+ @mixin foo-bar($baz, $bang) {
906
+ baz {
907
+ a: $baz $bang;
908
+ }
909
+ }
910
+ SCSS
911
+ end
912
+
913
+ def test_mixin_definition_with_defaults
914
+ assert_renders <<SASS, <<SCSS
915
+ =foo-bar($baz, $bang: 12px)
916
+ baz
917
+ a: $baz $bang
918
+ SASS
919
+ @mixin foo-bar($baz, $bang: 12px) {
920
+ baz {
921
+ a: $baz $bang;
922
+ }
923
+ }
924
+ SCSS
925
+
926
+ assert_sass_to_scss <<SCSS, <<SASS
927
+ @mixin foo-bar($baz, $bang: foo) {
928
+ baz {
929
+ a: $baz $bang;
930
+ }
931
+ }
932
+ SCSS
933
+ =foo-bar($baz, $bang: foo)
934
+ baz
935
+ a: $baz $bang
936
+ SASS
937
+ end
938
+
939
+ def test_argless_mixin_include
940
+ assert_renders <<SASS, <<SCSS
941
+ foo
942
+ +foo-bar
943
+ a: blip
944
+ SASS
945
+ foo {
946
+ @include foo-bar;
947
+ a: blip;
948
+ }
949
+ SCSS
950
+ end
951
+
952
+ def test_mixin_include
953
+ assert_renders <<SASS, <<SCSS
954
+ foo
955
+ +foo-bar(12px, "blaz")
956
+ a: blip
957
+ SASS
958
+ foo {
959
+ @include foo-bar(12px, "blaz");
960
+ a: blip;
961
+ }
962
+ SCSS
963
+ end
964
+
965
+ def test_mixin_include_with_keyword_args
966
+ assert_renders <<SASS, <<SCSS
967
+ foo
968
+ +foo-bar(12px, "blaz", $blip: blap, $bloop: blop)
969
+ +foo-bar($blip: blap, $bloop: blop)
970
+ a: blip
971
+ SASS
972
+ foo {
973
+ @include foo-bar(12px, "blaz", $blip: blap, $bloop: blop);
974
+ @include foo-bar($blip: blap, $bloop: blop);
975
+ a: blip;
976
+ }
977
+ SCSS
978
+ end
979
+
980
+ def test_argless_function_definition
981
+ assert_renders <<SASS, <<SCSS
982
+ @function foo()
983
+ $var: 1 + 1
984
+ @return $var
985
+ SASS
986
+ @function foo() {
987
+ $var: 1 + 1;
988
+ @return $var;
989
+ }
990
+ SCSS
991
+ end
992
+
993
+ def test_function_definition_without_defaults
994
+ assert_renders <<SASS, <<SCSS
995
+ @function foo($var1, $var2)
996
+ @if $var1
997
+ @return $var1 + $var2
998
+ SASS
999
+ @function foo($var1, $var2) {
1000
+ @if $var1 {
1001
+ @return $var1 + $var2;
1002
+ }
1003
+ }
1004
+ SCSS
1005
+ end
1006
+
1007
+ def test_function_definition_with_defaults
1008
+ assert_renders <<SASS, <<SCSS
1009
+ @function foo($var1, $var2: foo)
1010
+ @if $var1
1011
+ @return $var1 + $var2
1012
+ SASS
1013
+ @function foo($var1, $var2: foo) {
1014
+ @if $var1 {
1015
+ @return $var1 + $var2;
1016
+ }
1017
+ }
1018
+ SCSS
1019
+ end
1020
+
1021
+ def test_variable_definition
1022
+ assert_renders <<SASS, <<SCSS
1023
+ $var1: 12px + 15px
1024
+
1025
+ foo
1026
+ $var2: flaz(#abcdef)
1027
+ val: $var1 $var2
1028
+ SASS
1029
+ $var1: 12px + 15px;
1030
+
1031
+ foo {
1032
+ $var2: flaz(#abcdef);
1033
+ val: $var1 $var2;
1034
+ }
1035
+ SCSS
1036
+ end
1037
+
1038
+ def test_guarded_variable_definition
1039
+ assert_renders <<SASS, <<SCSS
1040
+ $var1: 12px + 15px !default
1041
+
1042
+ foo
1043
+ $var2: flaz(#abcdef) !default
1044
+ val: $var1 $var2
1045
+ SASS
1046
+ $var1: 12px + 15px !default;
1047
+
1048
+ foo {
1049
+ $var2: flaz(#abcdef) !default;
1050
+ val: $var1 $var2;
1051
+ }
1052
+ SCSS
1053
+ end
1054
+
1055
+ def test_multiple_variable_definitions
1056
+ assert_renders <<SASS, <<SCSS
1057
+ $var1: foo
1058
+ $var2: bar
1059
+ $var3: baz
1060
+
1061
+ $var4: bip
1062
+ $var5: bap
1063
+ SASS
1064
+ $var1: foo;
1065
+ $var2: bar;
1066
+ $var3: baz;
1067
+
1068
+ $var4: bip;
1069
+ $var5: bap;
1070
+ SCSS
1071
+ end
1072
+
1073
+ def test_division_asserted_with_parens
1074
+ assert_renders <<SASS, <<SCSS
1075
+ foo
1076
+ a: (1px / 2px)
1077
+ SASS
1078
+ foo {
1079
+ a: (1px / 2px);
1080
+ }
1081
+ SCSS
1082
+ end
1083
+
1084
+ def test_division_not_asserted_when_unnecessary
1085
+ assert_renders <<SASS, <<SCSS
1086
+ $var: 1px / 2px
1087
+
1088
+ foo
1089
+ a: $var
1090
+ SASS
1091
+ $var: 1px / 2px;
1092
+
1093
+ foo {
1094
+ a: $var;
1095
+ }
1096
+ SCSS
1097
+
1098
+ assert_renders <<SASS, <<SCSS
1099
+ $var: 1px
1100
+
1101
+ foo
1102
+ a: $var / 2px
1103
+ SASS
1104
+ $var: 1px;
1105
+
1106
+ foo {
1107
+ a: $var / 2px;
1108
+ }
1109
+ SCSS
1110
+
1111
+ assert_renders <<SASS, <<SCSS
1112
+ foo
1113
+ a: 1 + 1px / 2px
1114
+ SASS
1115
+ foo {
1116
+ a: 1 + 1px / 2px;
1117
+ }
1118
+ SCSS
1119
+ end
1120
+
1121
+ def test_literal_slash
1122
+ assert_renders <<SASS, <<SCSS
1123
+ foo
1124
+ a: 1px / 2px
1125
+ SASS
1126
+ foo {
1127
+ a: 1px / 2px;
1128
+ }
1129
+ SCSS
1130
+ end
1131
+
1132
+ def test_directive_with_interpolation
1133
+ assert_renders <<SASS, <<SCSS
1134
+ $baz: 12
1135
+
1136
+ @foo bar\#{$baz} qux
1137
+ a: b
1138
+ SASS
1139
+ $baz: 12;
1140
+
1141
+ @foo bar\#{$baz} qux {
1142
+ a: b;
1143
+ }
1144
+ SCSS
1145
+ end
1146
+
1147
+ def test_media_with_interpolation
1148
+ assert_renders <<SASS, <<SCSS
1149
+ $baz: 12
1150
+
1151
+ @media bar\#{$baz}
1152
+ a: b
1153
+ SASS
1154
+ $baz: 12;
1155
+
1156
+ @media bar\#{$baz} {
1157
+ a: b;
1158
+ }
1159
+ SCSS
1160
+ end
1161
+
1162
+ def test_media_with_expressions
1163
+ assert_sass_to_scss <<SCSS, <<SASS
1164
+ $media1: screen;
1165
+ $media2: print;
1166
+ $var: -webkit-min-device-pixel-ratio;
1167
+ $val: 20;
1168
+
1169
+ @media \#{$media1} and ($var + "-foo": $val + 5), only \#{$media2} {
1170
+ a: b;
1171
+ }
1172
+ SCSS
1173
+ $media1: screen
1174
+ $media2: print
1175
+ $var: -webkit-min-device-pixel-ratio
1176
+ $val: 20
1177
+
1178
+ @media \#{$media1} and ($var + "-foo": $val + 5), only \#{$media2}
1179
+ a: b
1180
+ SASS
1181
+
1182
+ assert_scss_to_sass <<SASS, <<SCSS
1183
+ $media1: screen
1184
+ $media2: print
1185
+ $var: -webkit-min-device-pixel-ratio
1186
+ $val: 20
1187
+
1188
+ @media \#{$media1} and ($var + "-foo": $val + 5), only \#{$media2}
1189
+ a: b
1190
+ SASS
1191
+ $media1: screen;
1192
+ $media2: print;
1193
+ $var: -webkit-min-device-pixel-ratio;
1194
+ $val: 20;
1195
+
1196
+ @media \#{$media1} and ($var + "-foo": $val + 5), only \#{$media2} {
1197
+ a: b;
1198
+ }
1199
+ SCSS
1200
+ end
1201
+
1202
+ def test_supports_with_expressions
1203
+ assert_renders <<SASS, <<SCSS
1204
+ $query: "(feature1: val)"
1205
+ $feature: feature2
1206
+ $val: val
1207
+
1208
+ @supports \#{$query} and ($feature: $val) or (not ($feature + 3: $val + 4))
1209
+ foo
1210
+ a: b
1211
+ SASS
1212
+ $query: "(feature1: val)";
1213
+ $feature: feature2;
1214
+ $val: val;
1215
+
1216
+ @supports \#{$query} and ($feature: $val) or (not ($feature + 3: $val + 4)) {
1217
+ foo {
1218
+ a: b;
1219
+ }
1220
+ }
1221
+ SCSS
1222
+ end
1223
+
1224
+ # Hacks
1225
+
1226
+ def test_declaration_hacks
1227
+ assert_renders <<SASS, <<SCSS
1228
+ foo
1229
+ _name: val
1230
+ *name: val
1231
+ #name: val
1232
+ .name: val
1233
+ name/**/: val
1234
+ name/*\\**/: val
1235
+ name: val
1236
+ SASS
1237
+ foo {
1238
+ _name: val;
1239
+ *name: val;
1240
+ #name: val;
1241
+ .name: val;
1242
+ name/**/: val;
1243
+ name/*\\**/: val;
1244
+ name: val;
1245
+ }
1246
+ SCSS
1247
+ end
1248
+
1249
+ def test_old_declaration_hacks
1250
+ assert_renders <<SASS, <<SCSS, :old => true
1251
+ foo
1252
+ :_name val
1253
+ :*name val
1254
+ :#name val
1255
+ :.name val
1256
+ :name val
1257
+ SASS
1258
+ foo {
1259
+ _name: val;
1260
+ *name: val;
1261
+ #name: val;
1262
+ .name: val;
1263
+ name: val;
1264
+ }
1265
+ SCSS
1266
+ end
1267
+
1268
+ def test_selector_hacks
1269
+ assert_selector_renders = lambda do |s|
1270
+ assert_renders <<SASS, <<SCSS
1271
+ #{s}
1272
+ a: b
1273
+ SASS
1274
+ #{s} {
1275
+ a: b;
1276
+ }
1277
+ SCSS
1278
+ end
1279
+
1280
+ assert_selector_renders['> E']
1281
+ assert_selector_renders['+ E']
1282
+ assert_selector_renders['~ E']
1283
+ assert_selector_renders['> > E']
1284
+
1285
+ assert_selector_renders['E*']
1286
+ assert_selector_renders['E*.foo']
1287
+ assert_selector_renders['E*:hover']
1288
+ end
1289
+
1290
+ def test_disallowed_colon_hack
1291
+ assert_raise_message(Sass::SyntaxError, 'The ":name: val" hack is not allowed in the Sass indented syntax') do
1292
+ to_sass("foo {:name: val;}", :syntax => :scss)
1293
+ end
1294
+ end
1295
+
1296
+ def test_nested_properties
1297
+ assert_renders <<SASS, <<SCSS
1298
+ div
1299
+ before: before
1300
+ background:
1301
+ color: blue
1302
+ repeat: no-repeat
1303
+ after: after
1304
+ SASS
1305
+ div {
1306
+ before: before;
1307
+ background: {
1308
+ color: blue;
1309
+ repeat: no-repeat;
1310
+ };
1311
+ after: after;
1312
+ }
1313
+
1314
+ SCSS
1315
+ end
1316
+
1317
+ def test_dasherize
1318
+ assert_sass_to_scss(<<SCSS, <<SASS, :dasherize => true)
1319
+ @mixin under-scored-mixin($under-scored-arg: $under-scored-default) {
1320
+ bar: $under-scored-arg;
1321
+ }
1322
+
1323
+ div {
1324
+ foo: under-scored-fn($under-scored-var + "before\#{$another-under-scored-var}after");
1325
+ @include under-scored-mixin($passed-arg);
1326
+ selector-\#{$under-scored-interp}: bold;
1327
+ }
1328
+
1329
+ @if $under-scored {
1330
+ @for $for-var from $from-var to $to-var {
1331
+ @while $while-var == true {
1332
+ $while-var: false;
1333
+ }
1334
+ }
1335
+ }
1336
+ SCSS
1337
+ =under_scored_mixin($under_scored_arg: $under_scored_default)
1338
+ bar: $under_scored_arg
1339
+ div
1340
+ foo: under_scored_fn($under_scored_var + "before\#{$another_under_scored_var}after")
1341
+ +under_scored_mixin($passed_arg)
1342
+ selector-\#{$under_scored_interp}: bold
1343
+ @if $under_scored
1344
+ @for $for_var from $from_var to $to_var
1345
+ @while $while_var == true
1346
+ $while_var : false
1347
+ SASS
1348
+ end
1349
+
1350
+ def test_loud_comment_conversion
1351
+ assert_renders(<<SASS, <<SCSS)
1352
+ /*! \#{"interpolated"}
1353
+ SASS
1354
+ /*! \#{"interpolated"} */
1355
+ SCSS
1356
+ end
1357
+
1358
+ def test_content_conversion
1359
+ assert_renders(<<SASS, <<SCSS)
1360
+ $color: blue
1361
+
1362
+ =context($class, $color: red)
1363
+ .\#{$class}
1364
+ background-color: $color
1365
+ @content
1366
+ border-color: $color
1367
+
1368
+ +context(parent)
1369
+ +context(child, $color: yellow)
1370
+ color: $color
1371
+ SASS
1372
+ $color: blue;
1373
+
1374
+ @mixin context($class, $color: red) {
1375
+ .\#{$class} {
1376
+ background-color: $color;
1377
+ @content;
1378
+ border-color: $color;
1379
+ }
1380
+ }
1381
+
1382
+ @include context(parent) {
1383
+ @include context(child, $color: yellow) {
1384
+ color: $color;
1385
+ }
1386
+ }
1387
+ SCSS
1388
+
1389
+ end
1390
+
1391
+ def test_empty_content
1392
+ assert_scss_to_scss(<<SCSS)
1393
+ @mixin foo {
1394
+ @content;
1395
+ }
1396
+
1397
+ @include foo {}
1398
+ SCSS
1399
+ end
1400
+
1401
+ def test_placeholder_conversion
1402
+ assert_renders(<<SASS, <<SCSS)
1403
+ #content a%foo.bar
1404
+ color: blue
1405
+ SASS
1406
+ #content a%foo.bar {
1407
+ color: blue;
1408
+ }
1409
+ SCSS
1410
+ end
1411
+
1412
+ def test_reference_selector
1413
+ assert_renders(<<SASS, <<SCSS)
1414
+ foo /bar|baz/ bang
1415
+ a: b
1416
+ SASS
1417
+ foo /bar|baz/ bang {
1418
+ a: b;
1419
+ }
1420
+ SCSS
1421
+ end
1422
+
1423
+ def test_subject
1424
+ assert_renders(<<SASS, <<SCSS)
1425
+ foo bar! baz
1426
+ a: b
1427
+ SASS
1428
+ foo bar! baz {
1429
+ a: b;
1430
+ }
1431
+ SCSS
1432
+ end
1433
+
1434
+ def test_placeholder_interoplation_conversion
1435
+ assert_renders(<<SASS, <<SCSS)
1436
+ $foo: foo
1437
+
1438
+ %\#{$foo}
1439
+ color: blue
1440
+
1441
+ .bar
1442
+ @extend %foo
1443
+ SASS
1444
+ $foo: foo;
1445
+
1446
+ %\#{$foo} {
1447
+ color: blue;
1448
+ }
1449
+
1450
+ .bar {
1451
+ @extend %foo;
1452
+ }
1453
+ SCSS
1454
+ end
1455
+
1456
+ def test_indent
1457
+ assert_renders <<SASS, <<SCSS, :indent => " "
1458
+ foo bar
1459
+ baz bang
1460
+ baz: bang
1461
+ bip: bop
1462
+ blat: boo
1463
+ SASS
1464
+ foo bar {
1465
+ baz bang {
1466
+ baz: bang;
1467
+ bip: bop;
1468
+ }
1469
+ blat: boo;
1470
+ }
1471
+ SCSS
1472
+
1473
+ assert_renders <<SASS, <<SCSS, :indent => "\t"
1474
+ foo bar
1475
+ baz bang
1476
+ baz: bang
1477
+ bip: bop
1478
+ blat: boo
1479
+ SASS
1480
+ foo bar {
1481
+ baz bang {
1482
+ baz: bang;
1483
+ bip: bop;
1484
+ }
1485
+ blat: boo;
1486
+ }
1487
+ SCSS
1488
+
1489
+ assert_sass_to_scss <<SCSS, <<SASS, :indent => " "
1490
+ foo bar {
1491
+ baz bang {
1492
+ baz: bang;
1493
+ bip: bop;
1494
+ }
1495
+ blat: boo;
1496
+ }
1497
+ SCSS
1498
+ foo bar
1499
+ baz bang
1500
+ baz: bang
1501
+ bip: bop
1502
+ blat: boo
1503
+ SASS
1504
+
1505
+ assert_sass_to_scss <<SCSS, <<SASS, :indent => "\t"
1506
+ foo bar {
1507
+ baz bang {
1508
+ baz: bang;
1509
+ bip: bop;
1510
+ }
1511
+ blat: boo;
1512
+ }
1513
+ SCSS
1514
+ foo bar
1515
+ baz bang
1516
+ baz: bang
1517
+ bip: bop
1518
+ blat: boo
1519
+ SASS
1520
+
1521
+ assert_scss_to_sass <<SASS, <<SCSS, :indent => " "
1522
+ foo bar
1523
+ baz bang
1524
+ baz: bang
1525
+ bip: bop
1526
+ blat: boo
1527
+ SASS
1528
+ foo bar {
1529
+ baz bang {
1530
+ baz: bang;
1531
+ bip: bop;
1532
+ }
1533
+ blat: boo;
1534
+ }
1535
+ SCSS
1536
+
1537
+ assert_scss_to_sass <<SASS, <<SCSS, :indent => "\t"
1538
+ foo bar
1539
+ baz bang
1540
+ baz: bang
1541
+ bip: bop
1542
+ blat: boo
1543
+ SASS
1544
+ foo bar {
1545
+ baz bang {
1546
+ baz: bang;
1547
+ bip: bop;
1548
+ }
1549
+ blat: boo;
1550
+ }
1551
+ SCSS
1552
+ end
1553
+
1554
+ def test_extend_with_optional
1555
+ assert_scss_to_sass <<SASS, <<SCSS
1556
+ foo
1557
+ @extend .bar !optional
1558
+ SASS
1559
+ foo {
1560
+ @extend .bar !optional;
1561
+ }
1562
+ SCSS
1563
+ end
1564
+
1565
+ def test_mixin_var_args
1566
+ assert_scss_to_sass <<SASS, <<SCSS
1567
+ =foo($args...)
1568
+ a: b
1569
+
1570
+ =bar($a, $args...)
1571
+ a: b
1572
+
1573
+ .foo
1574
+ +foo($list...)
1575
+ +bar(1, $list...)
1576
+ SASS
1577
+ @mixin foo($args...) {
1578
+ a: b;
1579
+ }
1580
+
1581
+ @mixin bar($a, $args...) {
1582
+ a: b;
1583
+ }
1584
+
1585
+ .foo {
1586
+ @include foo($list...);
1587
+ @include bar(1, $list...);
1588
+ }
1589
+ SCSS
1590
+ end
1591
+
1592
+ def test_function_var_args
1593
+ assert_scss_to_sass <<SASS, <<SCSS
1594
+ @function foo($args...)
1595
+ @return foo
1596
+
1597
+ @function bar($a, $args...)
1598
+ @return bar
1599
+
1600
+ .foo
1601
+ a: foo($list...)
1602
+ b: bar(1, $list...)
1603
+ SASS
1604
+ @function foo($args...) {
1605
+ @return foo;
1606
+ }
1607
+
1608
+ @function bar($a, $args...) {
1609
+ @return bar;
1610
+ }
1611
+
1612
+ .foo {
1613
+ a: foo($list...);
1614
+ b: bar(1, $list...);
1615
+ }
1616
+ SCSS
1617
+ end
1618
+
1619
+ ## Regression Tests
1620
+
1621
+ def test_list_in_args
1622
+ assert_renders(<<SASS, <<SCSS)
1623
+ +mixin((a, b, c))
1624
+
1625
+ +mixin($arg: (a, b, c))
1626
+
1627
+ +mixin(a, b, (c, d, e)...)
1628
+ SASS
1629
+ @include mixin((a, b, c));
1630
+
1631
+ @include mixin($arg: (a, b, c));
1632
+
1633
+ @include mixin(a, b, (c, d, e)...);
1634
+ SCSS
1635
+ end
1636
+
1637
+ def test_media_query_with_expr
1638
+ assert_scss_to_sass <<SASS, <<SCSS
1639
+ @media foo and (bar: baz)
1640
+ a: b
1641
+ SASS
1642
+ @media foo and (bar: baz) {
1643
+ a: b; }
1644
+ SCSS
1645
+ end
1646
+
1647
+ def test_nested_if_statements
1648
+ assert_renders(<<SASS, <<SCSS)
1649
+ @if $foo
1650
+ one
1651
+ a: b
1652
+ @else
1653
+ @if $bar
1654
+ two
1655
+ a: b
1656
+ @else
1657
+ three
1658
+ a: b
1659
+ SASS
1660
+ @if $foo {
1661
+ one {
1662
+ a: b;
1663
+ }
1664
+ }
1665
+ @else {
1666
+ @if $bar {
1667
+ two {
1668
+ a: b;
1669
+ }
1670
+ }
1671
+ @else {
1672
+ three {
1673
+ a: b;
1674
+ }
1675
+ }
1676
+ }
1677
+ SCSS
1678
+ end
1679
+
1680
+ def test_comment_indentation
1681
+ assert_renders(<<SASS, <<SCSS, :indent => ' ')
1682
+ foo
1683
+ // bar
1684
+ /* baz
1685
+ a: b
1686
+ SASS
1687
+ foo {
1688
+ // bar
1689
+ /* baz */
1690
+ a: b;
1691
+ }
1692
+ SCSS
1693
+ end
1694
+
1695
+ def test_ambiguous_negation
1696
+ assert_renders(<<SASS, <<SCSS, :indent => ' ')
1697
+ foo
1698
+ ok: -$foo
1699
+ comma: 10px, -$foo
1700
+ needs-parens: 10px (-$foo)
1701
+ no-parens: a 50px + 60px b
1702
+ SASS
1703
+ foo {
1704
+ ok: -$foo;
1705
+ comma: 10px, -$foo;
1706
+ needs-parens: 10px (-$foo);
1707
+ no-parens: a 50px + 60px b;
1708
+ }
1709
+ SCSS
1710
+ end
1711
+
1712
+ private
1713
+
1714
+ def assert_sass_to_sass(sass, options = {})
1715
+ assert_equal(sass.rstrip, to_sass(sass, options).rstrip,
1716
+ "Expected Sass to transform to itself")
1717
+ end
1718
+
1719
+ def assert_scss_to_sass(sass, scss, options = {})
1720
+ assert_equal(sass.rstrip, to_sass(scss, options.merge(:syntax => :scss)).rstrip,
1721
+ "Expected SCSS to transform to Sass")
1722
+ end
1723
+
1724
+ def assert_scss_to_scss(scss, in_scss = nil, options = nil)
1725
+ if in_scss.is_a?(Hash)
1726
+ options = in_scss
1727
+ in_scss = nil
1728
+ end
1729
+
1730
+ in_scss ||= scss
1731
+ options ||= {}
1732
+
1733
+ assert_equal(scss.rstrip, to_scss(in_scss, options.merge(:syntax => :scss)).rstrip,
1734
+ "Expected SCSS to transform to #{scss == in_scss ? 'itself' : 'SCSS'}")
1735
+ end
1736
+
1737
+ def assert_sass_to_scss(scss, sass, options = {})
1738
+ assert_equal(scss.rstrip, to_scss(sass, options).rstrip,
1739
+ "Expected Sass to transform to SCSS")
1740
+ end
1741
+
1742
+ def assert_renders(sass, scss, options = {})
1743
+ assert_sass_to_sass(sass, options)
1744
+ assert_scss_to_sass(sass, scss, options)
1745
+ assert_scss_to_scss(scss, options)
1746
+ assert_sass_to_scss(scss, sass, options)
1747
+ end
1748
+
1749
+ def to_sass(scss, options = {})
1750
+ Sass::Util.silence_sass_warnings do
1751
+ Sass::Engine.new(scss, options).to_tree.to_sass(options)
1752
+ end
1753
+ end
1754
+
1755
+ def to_scss(sass, options = {})
1756
+ Sass::Util.silence_sass_warnings do
1757
+ Sass::Engine.new(sass, options).to_tree.to_scss(options)
1758
+ end
1759
+ end
1760
+ end