sass 3.7.4 → 4.0.0.alpha.1

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 (257) hide show
  1. checksums.yaml +13 -5
  2. data/.yardopts +1 -1
  3. data/CODE_OF_CONDUCT.md +1 -1
  4. data/CONTRIBUTING.md +1 -146
  5. data/MIT-LICENSE +1 -1
  6. data/README.md +25 -39
  7. data/Rakefile +274 -0
  8. data/VERSION +1 -1
  9. data/VERSION_DATE +1 -1
  10. data/lib/sass.rb +3 -3
  11. data/lib/sass/cache_stores/filesystem.rb +2 -2
  12. data/lib/sass/cache_stores/memory.rb +5 -4
  13. data/lib/sass/callbacks.rb +2 -2
  14. data/lib/sass/css.rb +12 -12
  15. data/lib/sass/engine.rb +44 -62
  16. data/lib/sass/environment.rb +7 -35
  17. data/lib/sass/error.rb +14 -14
  18. data/lib/sass/exec/base.rb +14 -3
  19. data/lib/sass/exec/sass_convert.rb +6 -20
  20. data/lib/sass/exec/sass_scss.rb +29 -5
  21. data/lib/sass/features.rb +2 -3
  22. data/lib/sass/importers/filesystem.rb +6 -11
  23. data/lib/sass/logger.rb +3 -8
  24. data/lib/sass/logger/base.rb +2 -19
  25. data/lib/sass/plugin.rb +2 -3
  26. data/lib/sass/plugin/compiler.rb +67 -48
  27. data/lib/sass/plugin/configuration.rb +3 -3
  28. data/lib/sass/plugin/merb.rb +1 -1
  29. data/lib/sass/plugin/rack.rb +3 -3
  30. data/lib/sass/plugin/staleness_checker.rb +3 -3
  31. data/lib/sass/railtie.rb +1 -1
  32. data/lib/sass/script.rb +3 -3
  33. data/lib/sass/script/css_parser.rb +15 -5
  34. data/lib/sass/script/functions.rb +121 -337
  35. data/lib/sass/script/lexer.rb +36 -102
  36. data/lib/sass/script/parser.rb +153 -529
  37. data/lib/sass/script/tree/funcall.rb +34 -42
  38. data/lib/sass/script/tree/interpolation.rb +26 -171
  39. data/lib/sass/script/tree/list_literal.rb +8 -23
  40. data/lib/sass/script/tree/map_literal.rb +2 -2
  41. data/lib/sass/script/tree/node.rb +3 -3
  42. data/lib/sass/script/tree/operation.rb +16 -43
  43. data/lib/sass/script/tree/string_interpolation.rb +43 -64
  44. data/lib/sass/script/tree/variable.rb +1 -1
  45. data/lib/sass/script/value.rb +0 -2
  46. data/lib/sass/script/value/arg_list.rb +1 -1
  47. data/lib/sass/script/value/base.rb +9 -27
  48. data/lib/sass/script/value/color.rb +18 -26
  49. data/lib/sass/script/value/helpers.rb +18 -44
  50. data/lib/sass/script/value/list.rb +14 -35
  51. data/lib/sass/script/value/map.rb +2 -2
  52. data/lib/sass/script/value/number.rb +16 -26
  53. data/lib/sass/script/value/string.rb +1 -30
  54. data/lib/sass/scss.rb +2 -0
  55. data/lib/sass/scss/css_parser.rb +3 -7
  56. data/lib/sass/scss/parser.rb +78 -196
  57. data/lib/sass/scss/rx.rb +14 -7
  58. data/lib/sass/scss/script_lexer.rb +15 -0
  59. data/lib/sass/scss/script_parser.rb +25 -0
  60. data/lib/sass/scss/static_parser.rb +55 -38
  61. data/lib/sass/selector.rb +10 -7
  62. data/lib/sass/selector/abstract_sequence.rb +12 -15
  63. data/lib/sass/selector/comma_sequence.rb +6 -24
  64. data/lib/sass/selector/pseudo.rb +6 -19
  65. data/lib/sass/selector/sequence.rb +16 -14
  66. data/lib/sass/selector/simple.rb +7 -9
  67. data/lib/sass/selector/simple_sequence.rb +12 -16
  68. data/lib/sass/shared.rb +1 -1
  69. data/lib/sass/source/map.rb +9 -7
  70. data/lib/sass/source/position.rb +4 -4
  71. data/lib/sass/stack.rb +3 -23
  72. data/lib/sass/tree/charset_node.rb +1 -1
  73. data/lib/sass/tree/comment_node.rb +1 -1
  74. data/lib/sass/tree/function_node.rb +3 -2
  75. data/lib/sass/tree/node.rb +3 -5
  76. data/lib/sass/tree/prop_node.rb +58 -49
  77. data/lib/sass/tree/rule_node.rb +8 -15
  78. data/lib/sass/tree/visitors/check_nesting.rb +23 -19
  79. data/lib/sass/tree/visitors/convert.rb +13 -15
  80. data/lib/sass/tree/visitors/cssize.rb +15 -4
  81. data/lib/sass/tree/visitors/deep_copy.rb +2 -2
  82. data/lib/sass/tree/visitors/extend.rb +14 -10
  83. data/lib/sass/tree/visitors/perform.rb +18 -29
  84. data/lib/sass/tree/visitors/set_options.rb +2 -2
  85. data/lib/sass/tree/visitors/to_css.rb +47 -77
  86. data/lib/sass/util.rb +311 -98
  87. data/lib/sass/util/cross_platform_random.rb +19 -0
  88. data/lib/sass/util/multibyte_string_scanner.rb +133 -127
  89. data/lib/sass/util/normalized_map.rb +8 -1
  90. data/lib/sass/util/ordered_hash.rb +192 -0
  91. data/lib/sass/version.rb +6 -2
  92. data/test/sass/cache_test.rb +131 -0
  93. data/test/sass/callbacks_test.rb +61 -0
  94. data/test/sass/compiler_test.rb +236 -0
  95. data/test/sass/conversion_test.rb +2171 -0
  96. data/test/sass/css2sass_test.rb +526 -0
  97. data/test/sass/data/hsl-rgb.txt +319 -0
  98. data/test/sass/encoding_test.rb +219 -0
  99. data/test/sass/engine_test.rb +3400 -0
  100. data/test/sass/exec_test.rb +86 -0
  101. data/test/sass/extend_test.rb +1719 -0
  102. data/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
  103. data/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
  104. data/test/sass/functions_test.rb +1984 -0
  105. data/test/sass/importer_test.rb +421 -0
  106. data/test/sass/logger_test.rb +58 -0
  107. data/test/sass/mock_importer.rb +49 -0
  108. data/test/sass/more_results/more1.css +9 -0
  109. data/test/sass/more_results/more1_with_line_comments.css +26 -0
  110. data/test/sass/more_results/more_import.css +29 -0
  111. data/test/sass/more_templates/_more_partial.sass +2 -0
  112. data/test/sass/more_templates/more1.sass +23 -0
  113. data/test/sass/more_templates/more_import.sass +11 -0
  114. data/test/sass/plugin_test.rb +556 -0
  115. data/test/sass/results/alt.css +4 -0
  116. data/test/sass/results/basic.css +9 -0
  117. data/test/sass/results/cached_import_option.css +3 -0
  118. data/test/sass/results/compact.css +5 -0
  119. data/test/sass/results/complex.css +86 -0
  120. data/test/sass/results/compressed.css +1 -0
  121. data/test/sass/results/expanded.css +19 -0
  122. data/test/sass/results/filename_fn.css +3 -0
  123. data/test/sass/results/if.css +3 -0
  124. data/test/sass/results/import.css +31 -0
  125. data/test/sass/results/import_charset.css +5 -0
  126. data/test/sass/results/import_charset_1_8.css +5 -0
  127. data/test/sass/results/import_charset_ibm866.css +5 -0
  128. data/test/sass/results/import_content.css +1 -0
  129. data/test/sass/results/line_numbers.css +49 -0
  130. data/test/sass/results/mixins.css +95 -0
  131. data/test/sass/results/multiline.css +24 -0
  132. data/test/sass/results/nested.css +22 -0
  133. data/test/sass/results/options.css +1 -0
  134. data/test/sass/results/parent_ref.css +13 -0
  135. data/test/sass/results/script.css +16 -0
  136. data/test/sass/results/scss_import.css +31 -0
  137. data/test/sass/results/scss_importee.css +2 -0
  138. data/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
  139. data/test/sass/results/subdir/subdir.css +3 -0
  140. data/test/sass/results/units.css +11 -0
  141. data/test/sass/results/warn.css +0 -0
  142. data/test/sass/results/warn_imported.css +0 -0
  143. data/test/sass/script_conversion_test.rb +306 -0
  144. data/test/sass/script_test.rb +1206 -0
  145. data/test/sass/scss/css_test.rb +1281 -0
  146. data/test/sass/scss/rx_test.rb +160 -0
  147. data/test/sass/scss/scss_test.rb +4147 -0
  148. data/test/sass/scss/test_helper.rb +37 -0
  149. data/test/sass/source_map_test.rb +1055 -0
  150. data/test/sass/superselector_test.rb +210 -0
  151. data/test/sass/templates/_cached_import_option_partial.scss +1 -0
  152. data/test/sass/templates/_double_import_loop2.sass +1 -0
  153. data/test/sass/templates/_filename_fn_import.scss +11 -0
  154. data/test/sass/templates/_imported_charset_ibm866.sass +4 -0
  155. data/test/sass/templates/_imported_charset_utf8.sass +4 -0
  156. data/test/sass/templates/_imported_content.sass +3 -0
  157. data/test/sass/templates/_partial.sass +2 -0
  158. data/test/sass/templates/_same_name_different_partiality.scss +1 -0
  159. data/test/sass/templates/alt.sass +16 -0
  160. data/test/sass/templates/basic.sass +23 -0
  161. data/test/sass/templates/bork1.sass +2 -0
  162. data/test/sass/templates/bork2.sass +2 -0
  163. data/test/sass/templates/bork3.sass +2 -0
  164. data/test/sass/templates/bork4.sass +2 -0
  165. data/test/sass/templates/bork5.sass +3 -0
  166. data/test/sass/templates/cached_import_option.scss +3 -0
  167. data/test/sass/templates/compact.sass +17 -0
  168. data/test/sass/templates/complex.sass +305 -0
  169. data/test/sass/templates/compressed.sass +15 -0
  170. data/test/sass/templates/double_import_loop1.sass +1 -0
  171. data/test/sass/templates/expanded.sass +17 -0
  172. data/test/sass/templates/filename_fn.scss +18 -0
  173. data/test/sass/templates/if.sass +11 -0
  174. data/test/sass/templates/import.sass +12 -0
  175. data/test/sass/templates/import_charset.sass +9 -0
  176. data/test/sass/templates/import_charset_1_8.sass +6 -0
  177. data/test/sass/templates/import_charset_ibm866.sass +11 -0
  178. data/test/sass/templates/import_content.sass +4 -0
  179. data/test/sass/templates/importee.less +2 -0
  180. data/test/sass/templates/importee.sass +19 -0
  181. data/test/sass/templates/line_numbers.sass +13 -0
  182. data/test/sass/templates/mixin_bork.sass +5 -0
  183. data/test/sass/templates/mixins.sass +76 -0
  184. data/test/sass/templates/multiline.sass +20 -0
  185. data/test/sass/templates/nested.sass +25 -0
  186. data/test/sass/templates/nested_bork1.sass +2 -0
  187. data/test/sass/templates/nested_bork2.sass +2 -0
  188. data/test/sass/templates/nested_bork3.sass +2 -0
  189. data/test/sass/templates/nested_bork4.sass +2 -0
  190. data/test/sass/templates/nested_import.sass +2 -0
  191. data/test/sass/templates/nested_mixin_bork.sass +6 -0
  192. data/test/sass/templates/options.sass +2 -0
  193. data/test/sass/templates/parent_ref.sass +25 -0
  194. data/test/sass/templates/same_name_different_ext.sass +2 -0
  195. data/test/sass/templates/same_name_different_ext.scss +1 -0
  196. data/test/sass/templates/same_name_different_partiality.scss +1 -0
  197. data/test/sass/templates/script.sass +101 -0
  198. data/test/sass/templates/scss_import.scss +12 -0
  199. data/test/sass/templates/scss_importee.scss +1 -0
  200. data/test/sass/templates/single_import_loop.sass +1 -0
  201. data/test/sass/templates/subdir/import_up1.scss +1 -0
  202. data/test/sass/templates/subdir/import_up2.scss +1 -0
  203. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
  204. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
  205. data/test/sass/templates/subdir/subdir.sass +6 -0
  206. data/test/sass/templates/units.sass +11 -0
  207. data/test/sass/templates/warn.sass +3 -0
  208. data/test/sass/templates/warn_imported.sass +4 -0
  209. data/test/sass/test_helper.rb +8 -0
  210. data/test/sass/util/multibyte_string_scanner_test.rb +147 -0
  211. data/test/sass/util/normalized_map_test.rb +51 -0
  212. data/test/sass/util/subset_map_test.rb +91 -0
  213. data/test/sass/util_test.rb +438 -0
  214. data/test/sass/value_helpers_test.rb +179 -0
  215. data/test/test_helper.rb +110 -0
  216. data/vendor/listen/CHANGELOG.md +1 -0
  217. data/vendor/listen/CONTRIBUTING.md +38 -0
  218. data/vendor/listen/Gemfile +20 -0
  219. data/vendor/listen/Guardfile +8 -0
  220. data/vendor/listen/LICENSE +20 -0
  221. data/vendor/listen/README.md +349 -0
  222. data/vendor/listen/Rakefile +5 -0
  223. data/vendor/listen/Vagrantfile +96 -0
  224. data/vendor/listen/lib/listen.rb +54 -0
  225. data/vendor/listen/lib/listen/adapter.rb +327 -0
  226. data/vendor/listen/lib/listen/adapters/bsd.rb +75 -0
  227. data/vendor/listen/lib/listen/adapters/darwin.rb +48 -0
  228. data/vendor/listen/lib/listen/adapters/linux.rb +81 -0
  229. data/vendor/listen/lib/listen/adapters/polling.rb +58 -0
  230. data/vendor/listen/lib/listen/adapters/windows.rb +91 -0
  231. data/vendor/listen/lib/listen/directory_record.rb +406 -0
  232. data/vendor/listen/lib/listen/listener.rb +323 -0
  233. data/vendor/listen/lib/listen/turnstile.rb +32 -0
  234. data/vendor/listen/lib/listen/version.rb +3 -0
  235. data/vendor/listen/listen.gemspec +28 -0
  236. data/vendor/listen/spec/listen/adapter_spec.rb +149 -0
  237. data/vendor/listen/spec/listen/adapters/bsd_spec.rb +36 -0
  238. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +37 -0
  239. data/vendor/listen/spec/listen/adapters/linux_spec.rb +47 -0
  240. data/vendor/listen/spec/listen/adapters/polling_spec.rb +68 -0
  241. data/vendor/listen/spec/listen/adapters/windows_spec.rb +30 -0
  242. data/vendor/listen/spec/listen/directory_record_spec.rb +1250 -0
  243. data/vendor/listen/spec/listen/listener_spec.rb +258 -0
  244. data/vendor/listen/spec/listen/turnstile_spec.rb +56 -0
  245. data/vendor/listen/spec/listen_spec.rb +67 -0
  246. data/vendor/listen/spec/spec_helper.rb +25 -0
  247. data/vendor/listen/spec/support/adapter_helper.rb +666 -0
  248. data/vendor/listen/spec/support/directory_record_helper.rb +57 -0
  249. data/vendor/listen/spec/support/fixtures_helper.rb +29 -0
  250. data/vendor/listen/spec/support/listeners_helper.rb +179 -0
  251. data/vendor/listen/spec/support/platform_helper.rb +15 -0
  252. metadata +217 -76
  253. data/extra/sass-spec-ref.sh +0 -40
  254. data/lib/sass/deprecation.rb +0 -55
  255. data/lib/sass/logger/delayed.rb +0 -50
  256. data/lib/sass/script/value/callable.rb +0 -25
  257. data/lib/sass/script/value/function.rb +0 -19
@@ -0,0 +1,526 @@
1
+ #!/usr/bin/env ruby
2
+ require 'minitest/autorun'
3
+ require File.dirname(__FILE__) + '/../test_helper'
4
+ require 'sass/css'
5
+
6
+ class CSS2SassTest < MiniTest::Test
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
+
28
+ a
29
+ text-decoration: none
30
+
31
+ span
32
+ color: yellow
33
+
34
+ &:hover
35
+ text-decoration: underline
36
+ SASS
37
+ li {
38
+ display: none;
39
+ }
40
+
41
+ li a {
42
+ text-decoration: none;
43
+ }
44
+
45
+ li a span {
46
+ color: yellow;
47
+ }
48
+
49
+ li a:hover {
50
+ text-decoration: underline;
51
+ }
52
+ CSS
53
+ end
54
+
55
+ def test_no_nesting_around_rules
56
+ assert_equal(<<SASS, css2sass(<<CSS))
57
+ div .warning
58
+ color: #d21a19
59
+
60
+ span .debug
61
+ cursor: crosshair
62
+
63
+ div .debug
64
+ cursor: default
65
+ SASS
66
+ div .warning {
67
+ color: #d21a19; }
68
+ span .debug {
69
+ cursor: crosshair;}
70
+ div .debug {
71
+ cursor: default; }
72
+ CSS
73
+ end
74
+
75
+ def test_comments_multiline
76
+ css = <<CSS
77
+ /* comment */
78
+ elephant.rawr {
79
+ rampages: excessively;
80
+ }
81
+
82
+ /* actual multiline
83
+ comment */
84
+ span.turkey {
85
+ isdinner: true;
86
+ }
87
+
88
+ .turducken {
89
+ /* Sounds funny
90
+ doesn't it */
91
+ chimera: not_really;
92
+ }
93
+
94
+ #overhere {
95
+ bored: sorta; /* it's for a good
96
+ cause */
97
+ better_than: thread_pools;
98
+ }
99
+
100
+ #one_more {
101
+ finally: srsly;
102
+ } /* just a line here */
103
+ CSS
104
+ sass = <<SASS
105
+ /* comment
106
+
107
+ elephant.rawr
108
+ rampages: excessively
109
+
110
+ /* actual multiline
111
+ *comment
112
+
113
+ span.turkey
114
+ isdinner: true
115
+
116
+ .turducken
117
+ /* Sounds funny
118
+ * doesn't it
119
+ chimera: not_really
120
+
121
+ #overhere
122
+ bored: sorta
123
+
124
+ /* it's for a good
125
+ * cause
126
+ better_than: thread_pools
127
+
128
+ #one_more
129
+ finally: srsly
130
+
131
+ /* just a line here
132
+ SASS
133
+ assert_equal(sass, css2sass(css))
134
+ end
135
+
136
+ def test_fold_commas
137
+ assert_equal(<<SASS, css2sass(<<CSS))
138
+ li
139
+ .one, .two
140
+ color: red
141
+ SASS
142
+ li .one {
143
+ color: red;
144
+ }
145
+ li .two {
146
+ color: red;
147
+ }
148
+ CSS
149
+
150
+ assert_equal(<<SASS, css2sass(<<CSS))
151
+ .one
152
+ color: green
153
+
154
+ .two
155
+ color: green
156
+ color: red
157
+
158
+ .three
159
+ color: red
160
+ SASS
161
+ .one, .two {
162
+ color: green;
163
+ }
164
+
165
+ .two, .three {
166
+ color: red;
167
+ }
168
+ CSS
169
+ end
170
+
171
+ def test_bad_formatting
172
+ assert_equal(<<SASS, css2sass(<<CSS))
173
+ hello
174
+ parent: true
175
+
176
+ there
177
+ parent: false
178
+
179
+ who
180
+ hoo: false
181
+
182
+ why
183
+ y: true
184
+
185
+ when
186
+ wen: nao
187
+
188
+ down_here
189
+ yeah: true
190
+ SASS
191
+ hello {
192
+ parent: true;
193
+ }
194
+
195
+ hello there {
196
+ parent: false;
197
+ }
198
+ hello who {
199
+ hoo: false;
200
+ }
201
+ hello why {
202
+ y: true;
203
+ }
204
+ hello when {
205
+ wen: nao;
206
+ }
207
+
208
+
209
+
210
+ down_here { yeah: true; }
211
+ CSS
212
+ end
213
+
214
+ def test_comments_in_selectors
215
+ assert_equal(<<SASS, css2sass(<<CSS))
216
+ .js
217
+ #location-navigation-form .form-submit, #business-listing-form .form-submit, #detailTabs ul, #detailsEnhanced #addTags, #locationSearchList, #moreHoods
218
+ display: none
219
+
220
+ #navListLeft
221
+ display: none
222
+ SASS
223
+ .js #location-navigation-form .form-submit,
224
+ .js #business-listing-form .form-submit,
225
+ .js #detailTabs ul,
226
+ /* .js #addReview, */
227
+ /* .js #addTags, */
228
+ .js #detailsEnhanced #addTags,
229
+ .js #locationSearchList,
230
+ .js #moreHoods,
231
+ #navListLeft
232
+ { display: none; }
233
+ CSS
234
+ end
235
+
236
+ def test_pseudo_classes_are_escaped
237
+ assert_equal(<<SASS, css2sass(<<CSS))
238
+ \\:focus
239
+ a: b
240
+
241
+ \\:foo
242
+ bar: baz
243
+ SASS
244
+ :focus {a: b;}
245
+ :focus :foo {bar: baz;}
246
+ CSS
247
+ end
248
+
249
+ def test_subject
250
+ silence_warnings {assert_equal(<<SASS, css2sass(<<CSS))}
251
+ .foo
252
+ .bar!
253
+ .baz
254
+ a: b
255
+
256
+ .bip
257
+ c: d
258
+
259
+ .bar .bonk
260
+ e: f
261
+
262
+ .flip!
263
+ &.bar
264
+ a: b
265
+
266
+ &.baz
267
+ c: d
268
+ SASS
269
+ .foo .bar! .baz {a: b;}
270
+ .foo .bar! .bip {c: d;}
271
+ .foo .bar .bonk {e: f;}
272
+
273
+ .flip.bar! {a: b;}
274
+ .flip.baz! {c: d;}
275
+ CSS
276
+ end
277
+
278
+ def test_keyframes
279
+ assert_equal(<<SASS, css2sass(<<CSS))
280
+ @keyframes dash
281
+ from
282
+ stroke-dasharray: 1,200
283
+ stroke-dashoffset: 0
284
+
285
+ 50%
286
+ stroke-dasharray: 89,200
287
+ stroke-dashoffset: -35
288
+
289
+ to
290
+ stroke-dasharray: 89,200
291
+ stroke-dashoffset: -124
292
+ SASS
293
+ @keyframes dash {
294
+ from {
295
+ stroke-dasharray: 1,200;
296
+ stroke-dashoffset: 0;
297
+ }
298
+ 50% {
299
+ stroke-dasharray: 89,200;
300
+ stroke-dashoffset: -35;
301
+ }
302
+ to {
303
+ stroke-dasharray: 89,200;
304
+ stroke-dashoffset: -124;
305
+ }
306
+ }
307
+ CSS
308
+ end
309
+
310
+ # Regressions
311
+
312
+ def test_nesting_with_matching_property
313
+ assert_equal(<<SASS, css2sass(<<CSS))
314
+ ul
315
+ width: 10px
316
+
317
+ div
318
+ width: 20px
319
+
320
+ article
321
+ width: 10px
322
+
323
+ p
324
+ width: 20px
325
+ SASS
326
+ ul {width: 10px}
327
+ ul div {width: 20px}
328
+ article {width: 10px}
329
+ article p {width: 20px}
330
+ CSS
331
+ end
332
+
333
+ def test_empty_rule
334
+ assert_equal(<<SASS, css2sass(<<CSS))
335
+ a
336
+ SASS
337
+ a {}
338
+ CSS
339
+ end
340
+
341
+ def test_empty_rule_with_selector_combinator
342
+ assert_equal(<<SASS, css2sass(<<CSS))
343
+ a
344
+ color: red
345
+
346
+ > b
347
+ SASS
348
+ a {color: red}
349
+ a > b {}
350
+ CSS
351
+ end
352
+
353
+ def test_nesting_within_media
354
+ assert_equal(<<SASS, css2sass(<<CSS))
355
+ @media all
356
+ .next .vevent
357
+ padding-left: 0
358
+ padding-right: 0
359
+ SASS
360
+ @media all {
361
+ .next .vevent {
362
+ padding-left: 0;
363
+ padding-right: 0; } }
364
+ CSS
365
+ end
366
+
367
+ def test_multiline_selector_within_media_and_with_child_selector
368
+ assert_equal(<<SASS, css2sass(<<CSS))
369
+ @media all
370
+ foo bar, baz
371
+ padding-left: 0
372
+ padding-right: 0
373
+ SASS
374
+ @media all {
375
+ foo bar,
376
+ baz {
377
+ padding-left: 0;
378
+ padding-right: 0; } }
379
+ CSS
380
+ end
381
+
382
+ def test_double_comma
383
+ assert_equal(<<SASS, css2sass(<<CSS))
384
+ foo, bar
385
+ a: b
386
+ SASS
387
+ foo, , bar { a: b }
388
+ CSS
389
+ end
390
+
391
+ def test_selector_splitting
392
+ assert_equal(<<SASS, css2sass(<<CSS))
393
+ .foo >
394
+ .bar
395
+ a: b
396
+
397
+ .baz
398
+ c: d
399
+ SASS
400
+ .foo>.bar {a: b}
401
+ .foo>.baz {c: d}
402
+ CSS
403
+
404
+ assert_equal(<<SASS, css2sass(<<CSS))
405
+ .foo
406
+ &::bar
407
+ a: b
408
+
409
+ &::baz
410
+ c: d
411
+ SASS
412
+ .foo::bar {a: b}
413
+ .foo::baz {c: d}
414
+ CSS
415
+ end
416
+
417
+ def test_triple_nesting
418
+ assert_equal(<<SASS, css2sass(<<CSS))
419
+ .foo .bar .baz
420
+ a: b
421
+ SASS
422
+ .foo .bar .baz {a: b}
423
+ CSS
424
+
425
+ assert_equal(<<SASS, css2sass(<<CSS))
426
+ .bar > .baz
427
+ c: d
428
+ SASS
429
+ .bar > .baz {c: d}
430
+ CSS
431
+ end
432
+
433
+ # Error reporting
434
+
435
+ def test_error_reporting
436
+ css2sass("foo")
437
+ assert(false, "Expected exception")
438
+ rescue Sass::SyntaxError => err
439
+ assert_equal(1, err.sass_line)
440
+ assert_equal('Invalid CSS after "foo": expected "{", was ""', err.message)
441
+ end
442
+
443
+ def test_error_reporting_in_line
444
+ css2sass("foo\nbar }\nbaz")
445
+ assert(false, "Expected exception")
446
+ rescue Sass::SyntaxError => err
447
+ assert_equal(2, err.sass_line)
448
+ assert_equal('Invalid CSS after "bar ": expected "{", was "}"', err.message)
449
+ end
450
+
451
+ def test_error_truncate_after
452
+ css2sass("#{"a" * 16}foo")
453
+ assert(false, "Expected exception")
454
+ rescue Sass::SyntaxError => err
455
+ assert_equal(1, err.sass_line)
456
+ assert_equal('Invalid CSS after "...aaaaaaaaaaaafoo": expected "{", was ""', err.message)
457
+ end
458
+
459
+ def test_error_truncate_was
460
+ css2sass("foo }foo#{"a" * 15}")
461
+ assert(false, "Expected exception")
462
+ rescue Sass::SyntaxError => err
463
+ assert_equal(1, err.sass_line)
464
+ assert_equal('Invalid CSS after "foo ": expected "{", was "}fooaaaaaaaaaaa..."', err.message)
465
+ end
466
+
467
+ def test_error_doesnt_truncate_after_when_elipsis_would_add_length
468
+ css2sass("#{"a" * 15}foo")
469
+ assert(false, "Expected exception")
470
+ rescue Sass::SyntaxError => err
471
+ assert_equal(1, err.sass_line)
472
+ assert_equal('Invalid CSS after "aaaaaaaaaaaaaaafoo": expected "{", was ""', err.message)
473
+ end
474
+
475
+ def test_error_doesnt_truncate_was_when_elipsis_would_add_length
476
+ css2sass("foo }foo#{"a" * 14}")
477
+ assert(false, "Expected exception")
478
+ rescue Sass::SyntaxError => err
479
+ assert_equal(1, err.sass_line)
480
+ assert_equal('Invalid CSS after "foo ": expected "{", was "}fooaaaaaaaaaaaaaa"', err.message)
481
+ end
482
+
483
+ def test_error_gets_rid_of_trailing_newline_for_after
484
+ css2sass("foo \n ")
485
+ assert(false, "Expected exception")
486
+ rescue Sass::SyntaxError => err
487
+ assert_equal(2, err.sass_line)
488
+ assert_equal('Invalid CSS after "foo": expected "{", was ""', err.message)
489
+ end
490
+
491
+ def test_error_gets_rid_of_trailing_newline_for_was
492
+ css2sass("foo \n }foo")
493
+ assert(false, "Expected exception")
494
+ rescue Sass::SyntaxError => err
495
+ assert_equal(2, err.sass_line)
496
+ assert_equal('Invalid CSS after "foo": expected "{", was "}foo"', err.message)
497
+ end
498
+
499
+ # Encodings
500
+
501
+ unless Sass::Util.ruby1_8?
502
+ def test_encoding_error
503
+ css2sass("foo\nbar\nb\xFEaz".force_encoding("utf-8"))
504
+ assert(false, "Expected exception")
505
+ rescue Sass::SyntaxError => e
506
+ assert_equal(3, e.sass_line)
507
+ assert_equal('Invalid UTF-8 character "\xFE"', e.message)
508
+ end
509
+
510
+ def test_ascii_incompatible_encoding_error
511
+ template = "foo\nbar\nb_z".encode("utf-16le")
512
+ template[9] = "\xFE".force_encoding("utf-16le")
513
+ css2sass(template)
514
+ assert(false, "Expected exception")
515
+ rescue Sass::SyntaxError => e
516
+ assert_equal(3, e.sass_line)
517
+ assert_equal('Invalid UTF-16LE character "\xFE"', e.message)
518
+ end
519
+ end
520
+
521
+ private
522
+
523
+ def css2sass(string, opts={})
524
+ Sass::CSS.new(string, opts).render
525
+ end
526
+ end