xass 0.1.0

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 (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,458 @@
1
+ #!/usr/bin/env ruby
2
+ require 'test/unit'
3
+ require File.dirname(__FILE__) + '/../test_helper'
4
+ require 'sass/css'
5
+
6
+ class CSS2SassTest < Test::Unit::TestCase
7
+ def test_basic
8
+ css = <<CSS
9
+ h1 {
10
+ color: red;
11
+ }
12
+ CSS
13
+ assert_equal(<<SASS, css2sass(css))
14
+ h1
15
+ color: red
16
+ SASS
17
+ assert_equal(<<SASS, css2sass(css, :old => true))
18
+ h1
19
+ :color red
20
+ SASS
21
+ end
22
+
23
+ def test_nesting
24
+ assert_equal(<<SASS, css2sass(<<CSS))
25
+ li
26
+ display: none
27
+ a
28
+ text-decoration: none
29
+ span
30
+ color: yellow
31
+ &:hover
32
+ text-decoration: underline
33
+ SASS
34
+ li {
35
+ display: none;
36
+ }
37
+
38
+ li a {
39
+ text-decoration: none;
40
+ }
41
+
42
+ li a span {
43
+ color: yellow;
44
+ }
45
+
46
+ li a:hover {
47
+ text-decoration: underline;
48
+ }
49
+ CSS
50
+ end
51
+
52
+ def test_no_nesting_around_rules
53
+ assert_equal(<<SASS, css2sass(<<CSS))
54
+ div .warning
55
+ color: #d21a19
56
+
57
+ span .debug
58
+ cursor: crosshair
59
+
60
+ div .debug
61
+ cursor: default
62
+ SASS
63
+ div .warning {
64
+ color: #d21a19; }
65
+ span .debug {
66
+ cursor: crosshair;}
67
+ div .debug {
68
+ cursor: default; }
69
+ CSS
70
+ end
71
+
72
+ def test_comments_multiline
73
+ css = <<CSS
74
+ /* comment */
75
+ elephant.rawr {
76
+ rampages: excessively;
77
+ }
78
+
79
+ /* actual multiline
80
+ comment */
81
+ span.turkey {
82
+ isdinner: true;
83
+ }
84
+
85
+ .turducken {
86
+ /* Sounds funny
87
+ doesn't it */
88
+ chimera: not_really;
89
+ }
90
+
91
+ #overhere {
92
+ bored: sorta; /* it's for a good
93
+ cause */
94
+ better_than: thread_pools;
95
+ }
96
+
97
+ #one_more {
98
+ finally: srsly;
99
+ } /* just a line here */
100
+ CSS
101
+ sass = <<SASS
102
+ /* comment
103
+
104
+ elephant.rawr
105
+ rampages: excessively
106
+
107
+ /* actual multiline
108
+ *comment
109
+
110
+ span.turkey
111
+ isdinner: true
112
+
113
+ .turducken
114
+ /* Sounds funny
115
+ * doesn't it
116
+ chimera: not_really
117
+
118
+ #overhere
119
+ bored: sorta
120
+ /* it's for a good
121
+ * cause
122
+ better_than: thread_pools
123
+
124
+ #one_more
125
+ finally: srsly
126
+
127
+ /* just a line here
128
+ SASS
129
+ assert_equal(sass, css2sass(css))
130
+ end
131
+
132
+ def test_fold_commas
133
+ assert_equal(<<SASS, css2sass(<<CSS))
134
+ li
135
+ .one, .two
136
+ color: red
137
+ SASS
138
+ li .one {
139
+ color: red;
140
+ }
141
+ li .two {
142
+ color: red;
143
+ }
144
+ CSS
145
+
146
+ assert_equal(<<SASS, css2sass(<<CSS))
147
+ .one
148
+ color: green
149
+
150
+ .two
151
+ color: green
152
+ color: red
153
+
154
+ .three
155
+ color: red
156
+ SASS
157
+ .one, .two {
158
+ color: green;
159
+ }
160
+
161
+ .two, .three {
162
+ color: red;
163
+ }
164
+ CSS
165
+ end
166
+
167
+ def test_bad_formatting
168
+ assert_equal(<<SASS, css2sass(<<CSS))
169
+ hello
170
+ parent: true
171
+ there
172
+ parent: false
173
+ who
174
+ hoo: false
175
+ why
176
+ y: true
177
+ when
178
+ wen: nao
179
+
180
+ down_here
181
+ yeah: true
182
+ SASS
183
+ hello {
184
+ parent: true;
185
+ }
186
+
187
+ hello there {
188
+ parent: false;
189
+ }
190
+ hello who {
191
+ hoo: false;
192
+ }
193
+ hello why {
194
+ y: true;
195
+ }
196
+ hello when {
197
+ wen: nao;
198
+ }
199
+
200
+
201
+
202
+ down_here { yeah: true; }
203
+ CSS
204
+ end
205
+
206
+ def test_comments_in_selectors
207
+ assert_equal(<<SASS, css2sass(<<CSS))
208
+ .js
209
+ #location-navigation-form .form-submit, #business-listing-form .form-submit, #detailTabs ul, #detailsEnhanced #addTags, #locationSearchList, #moreHoods
210
+ display: none
211
+
212
+ #navListLeft
213
+ display: none
214
+ SASS
215
+ .js #location-navigation-form .form-submit,
216
+ .js #business-listing-form .form-submit,
217
+ .js #detailTabs ul,
218
+ /* .js #addReview, */
219
+ /* .js #addTags, */
220
+ .js #detailsEnhanced #addTags,
221
+ .js #locationSearchList,
222
+ .js #moreHoods,
223
+ #navListLeft
224
+ { display: none; }
225
+ CSS
226
+ end
227
+
228
+ def test_pseudo_classes_are_escaped
229
+ assert_equal(<<SASS, css2sass(<<CSS))
230
+ \\:focus
231
+ a: b
232
+ \\:foo
233
+ bar: baz
234
+ SASS
235
+ :focus {a: b;}
236
+ :focus :foo {bar: baz;}
237
+ CSS
238
+ end
239
+
240
+ def test_subject
241
+ assert_equal(<<SASS, css2sass(<<CSS))
242
+ .foo
243
+ .bar!
244
+ .baz
245
+ a: b
246
+ .bip
247
+ c: d
248
+ .bar .bonk
249
+ e: f
250
+
251
+ .flip!
252
+ &.bar
253
+ a: b
254
+ &.baz
255
+ c: d
256
+ SASS
257
+ .foo .bar! .baz {a: b;}
258
+ .foo .bar! .bip {c: d;}
259
+ .foo .bar .bonk {e: f;}
260
+
261
+ .flip.bar! {a: b;}
262
+ .flip.baz! {c: d;}
263
+ CSS
264
+ end
265
+
266
+ # Regressions
267
+
268
+ def test_empty_rule
269
+ assert_equal(<<SASS, css2sass(<<CSS))
270
+ a
271
+ SASS
272
+ a {}
273
+ CSS
274
+ end
275
+
276
+ def test_empty_rule_with_selector_combinator
277
+ assert_equal(<<SASS, css2sass(<<CSS))
278
+ a
279
+ color: red
280
+ > b
281
+ SASS
282
+ a {color: red}
283
+ a > b {}
284
+ CSS
285
+ end
286
+
287
+ def test_nesting_within_media
288
+ assert_equal(<<SASS, css2sass(<<CSS))
289
+ @media all
290
+ .next .vevent
291
+ padding-left: 0
292
+ padding-right: 0
293
+ SASS
294
+ @media all {
295
+ .next .vevent {
296
+ padding-left: 0;
297
+ padding-right: 0; } }
298
+ CSS
299
+ end
300
+
301
+ def test_multiline_selector_within_media_and_with_child_selector
302
+ assert_equal(<<SASS, css2sass(<<CSS))
303
+ @media all
304
+ foo bar, baz
305
+ padding-left: 0
306
+ padding-right: 0
307
+ SASS
308
+ @media all {
309
+ foo bar,
310
+ baz {
311
+ padding-left: 0;
312
+ padding-right: 0; } }
313
+ CSS
314
+ end
315
+
316
+ def test_double_comma
317
+ assert_equal(<<SASS, css2sass(<<CSS))
318
+ foo, bar
319
+ a: b
320
+ SASS
321
+ foo, , bar { a: b }
322
+ CSS
323
+ end
324
+
325
+ def test_selector_splitting
326
+ assert_equal(<<SASS, css2sass(<<CSS))
327
+ .foo >
328
+ .bar
329
+ a: b
330
+ .baz
331
+ c: d
332
+ SASS
333
+ .foo>.bar {a: b}
334
+ .foo>.baz {c: d}
335
+ CSS
336
+
337
+ assert_equal(<<SASS, css2sass(<<CSS))
338
+ .foo
339
+ &::bar
340
+ a: b
341
+ &::baz
342
+ c: d
343
+ SASS
344
+ .foo::bar {a: b}
345
+ .foo::baz {c: d}
346
+ CSS
347
+ end
348
+
349
+ def test_triple_nesting
350
+ assert_equal(<<SASS, css2sass(<<CSS))
351
+ .foo .bar .baz
352
+ a: b
353
+ SASS
354
+ .foo .bar .baz {a: b}
355
+ CSS
356
+
357
+ assert_equal(<<SASS, css2sass(<<CSS))
358
+ .bar > .baz
359
+ c: d
360
+ SASS
361
+ .bar > .baz {c: d}
362
+ CSS
363
+ end
364
+
365
+ # Error reporting
366
+
367
+ def test_error_reporting
368
+ css2sass("foo")
369
+ assert(false, "Expected exception")
370
+ rescue Sass::SyntaxError => err
371
+ assert_equal(1, err.sass_line)
372
+ assert_equal('Invalid CSS after "foo": expected "{", was ""', err.message)
373
+ end
374
+
375
+ def test_error_reporting_in_line
376
+ css2sass("foo\nbar }\nbaz")
377
+ assert(false, "Expected exception")
378
+ rescue Sass::SyntaxError => err
379
+ assert_equal(2, err.sass_line)
380
+ assert_equal('Invalid CSS after "bar ": expected "{", was "}"', err.message)
381
+ end
382
+
383
+ def test_error_truncate_after
384
+ css2sass("#{"a" * 16}foo")
385
+ assert(false, "Expected exception")
386
+ rescue Sass::SyntaxError => err
387
+ assert_equal(1, err.sass_line)
388
+ assert_equal('Invalid CSS after "...aaaaaaaaaaaafoo": expected "{", was ""', err.message)
389
+ end
390
+
391
+ def test_error_truncate_was
392
+ css2sass("foo }foo#{"a" * 15}")
393
+ assert(false, "Expected exception")
394
+ rescue Sass::SyntaxError => err
395
+ assert_equal(1, err.sass_line)
396
+ assert_equal('Invalid CSS after "foo ": expected "{", was "}fooaaaaaaaaaaa..."', err.message)
397
+ end
398
+
399
+ def test_error_doesnt_truncate_after_when_elipsis_would_add_length
400
+ css2sass("#{"a" * 15}foo")
401
+ assert(false, "Expected exception")
402
+ rescue Sass::SyntaxError => err
403
+ assert_equal(1, err.sass_line)
404
+ assert_equal('Invalid CSS after "aaaaaaaaaaaaaaafoo": expected "{", was ""', err.message)
405
+ end
406
+
407
+ def test_error_doesnt_truncate_was_when_elipsis_would_add_length
408
+ css2sass("foo }foo#{"a" * 14}")
409
+ assert(false, "Expected exception")
410
+ rescue Sass::SyntaxError => err
411
+ assert_equal(1, err.sass_line)
412
+ assert_equal('Invalid CSS after "foo ": expected "{", was "}fooaaaaaaaaaaaaaa"', err.message)
413
+ end
414
+
415
+ def test_error_gets_rid_of_trailing_newline_for_after
416
+ css2sass("foo \n ")
417
+ assert(false, "Expected exception")
418
+ rescue Sass::SyntaxError => err
419
+ assert_equal(2, err.sass_line)
420
+ assert_equal('Invalid CSS after "foo": expected "{", was ""', err.message)
421
+ end
422
+
423
+ def test_error_gets_rid_of_trailing_newline_for_was
424
+ css2sass("foo \n }foo")
425
+ assert(false, "Expected exception")
426
+ rescue Sass::SyntaxError => err
427
+ assert_equal(2, err.sass_line)
428
+ assert_equal('Invalid CSS after "foo": expected "{", was "}foo"', err.message)
429
+ end
430
+
431
+ # Encodings
432
+
433
+ unless Sass::Util.ruby1_8?
434
+ def test_encoding_error
435
+ css2sass("foo\nbar\nb\xFEaz".force_encoding("utf-8"))
436
+ assert(false, "Expected exception")
437
+ rescue Sass::SyntaxError => e
438
+ assert_equal(3, e.sass_line)
439
+ assert_equal('Invalid UTF-8 character "\xFE"', e.message)
440
+ end
441
+
442
+ def test_ascii_incompatible_encoding_error
443
+ template = "foo\nbar\nb_z".encode("utf-16le")
444
+ template[9] = "\xFE".force_encoding("utf-16le")
445
+ css2sass(template)
446
+ assert(false, "Expected exception")
447
+ rescue Sass::SyntaxError => e
448
+ assert_equal(3, e.sass_line)
449
+ assert_equal('Invalid UTF-16LE character "\xFE"', e.message)
450
+ end
451
+ end
452
+
453
+ private
454
+
455
+ def css2sass(string, opts={})
456
+ Sass::CSS.new(string, opts).render
457
+ end
458
+ end