haml 3.0.25 → 3.1.0.alpha.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of haml might be problematic. Click here for more details.

Files changed (212) hide show
  1. data/.yardopts +1 -1
  2. data/CONTRIBUTING +0 -1
  3. data/EDGE_GEM_VERSION +1 -0
  4. data/MIT-LICENSE +1 -1
  5. data/README.md +10 -175
  6. data/Rakefile +56 -84
  7. data/VERSION +1 -1
  8. data/VERSION_NAME +1 -1
  9. data/init.rb +1 -1
  10. data/lib/haml.rb +14 -12
  11. data/lib/haml/engine.rb +1 -1
  12. data/lib/haml/exec.rb +19 -316
  13. data/lib/haml/helpers/action_view_extensions.rb +1 -1
  14. data/lib/haml/html.rb +69 -76
  15. data/lib/haml/precompiler.rb +34 -41
  16. data/lib/haml/railtie.rb +4 -6
  17. data/lib/haml/template/plugin.rb +6 -16
  18. data/lib/haml/util.rb +91 -107
  19. data/lib/haml/version.rb +7 -0
  20. data/test/benchmark.rb +2 -9
  21. data/test/haml/engine_test.rb +195 -92
  22. data/test/haml/html2haml/erb_tests.rb +0 -14
  23. data/test/haml/util_test.rb +32 -0
  24. data/test/test_helper.rb +0 -39
  25. metadata +96 -324
  26. data/bin/css2sass +0 -13
  27. data/bin/sass +0 -8
  28. data/bin/sass-convert +0 -7
  29. data/extra/haml-mode.el +0 -753
  30. data/extra/sass-mode.el +0 -207
  31. data/lib/haml/util/subset_map.rb +0 -101
  32. data/lib/sass.rb +0 -29
  33. data/lib/sass/callbacks.rb +0 -52
  34. data/lib/sass/css.rb +0 -294
  35. data/lib/sass/engine.rb +0 -720
  36. data/lib/sass/environment.rb +0 -143
  37. data/lib/sass/error.rb +0 -198
  38. data/lib/sass/files.rb +0 -160
  39. data/lib/sass/less.rb +0 -382
  40. data/lib/sass/plugin.rb +0 -279
  41. data/lib/sass/plugin/configuration.rb +0 -221
  42. data/lib/sass/plugin/generic.rb +0 -15
  43. data/lib/sass/plugin/merb.rb +0 -37
  44. data/lib/sass/plugin/rack.rb +0 -47
  45. data/lib/sass/plugin/rails.rb +0 -32
  46. data/lib/sass/plugin/staleness_checker.rb +0 -123
  47. data/lib/sass/repl.rb +0 -58
  48. data/lib/sass/script.rb +0 -63
  49. data/lib/sass/script/bool.rb +0 -18
  50. data/lib/sass/script/color.rb +0 -491
  51. data/lib/sass/script/css_lexer.rb +0 -29
  52. data/lib/sass/script/css_parser.rb +0 -31
  53. data/lib/sass/script/funcall.rb +0 -77
  54. data/lib/sass/script/functions.rb +0 -861
  55. data/lib/sass/script/interpolation.rb +0 -70
  56. data/lib/sass/script/lexer.rb +0 -337
  57. data/lib/sass/script/literal.rb +0 -236
  58. data/lib/sass/script/node.rb +0 -112
  59. data/lib/sass/script/number.rb +0 -423
  60. data/lib/sass/script/operation.rb +0 -95
  61. data/lib/sass/script/parser.rb +0 -401
  62. data/lib/sass/script/string.rb +0 -67
  63. data/lib/sass/script/string_interpolation.rb +0 -93
  64. data/lib/sass/script/unary_operation.rb +0 -57
  65. data/lib/sass/script/variable.rb +0 -48
  66. data/lib/sass/scss.rb +0 -17
  67. data/lib/sass/scss/css_parser.rb +0 -46
  68. data/lib/sass/scss/parser.rb +0 -855
  69. data/lib/sass/scss/rx.rb +0 -126
  70. data/lib/sass/scss/sass_parser.rb +0 -11
  71. data/lib/sass/scss/script_lexer.rb +0 -15
  72. data/lib/sass/scss/script_parser.rb +0 -25
  73. data/lib/sass/scss/static_parser.rb +0 -40
  74. data/lib/sass/selector.rb +0 -361
  75. data/lib/sass/selector/abstract_sequence.rb +0 -62
  76. data/lib/sass/selector/comma_sequence.rb +0 -82
  77. data/lib/sass/selector/sequence.rb +0 -237
  78. data/lib/sass/selector/simple.rb +0 -113
  79. data/lib/sass/selector/simple_sequence.rb +0 -136
  80. data/lib/sass/tree/charset_node.rb +0 -37
  81. data/lib/sass/tree/comment_node.rb +0 -128
  82. data/lib/sass/tree/debug_node.rb +0 -36
  83. data/lib/sass/tree/directive_node.rb +0 -75
  84. data/lib/sass/tree/extend_node.rb +0 -65
  85. data/lib/sass/tree/for_node.rb +0 -55
  86. data/lib/sass/tree/if_node.rb +0 -69
  87. data/lib/sass/tree/import_node.rb +0 -102
  88. data/lib/sass/tree/mixin_def_node.rb +0 -48
  89. data/lib/sass/tree/mixin_node.rb +0 -111
  90. data/lib/sass/tree/node.rb +0 -464
  91. data/lib/sass/tree/prop_node.rb +0 -220
  92. data/lib/sass/tree/root_node.rb +0 -163
  93. data/lib/sass/tree/rule_node.rb +0 -261
  94. data/lib/sass/tree/variable_node.rb +0 -39
  95. data/lib/sass/tree/warn_node.rb +0 -42
  96. data/lib/sass/tree/while_node.rb +0 -36
  97. data/test/haml/util/subset_map_test.rb +0 -91
  98. data/test/sass/callbacks_test.rb +0 -61
  99. data/test/sass/conversion_test.rb +0 -1218
  100. data/test/sass/css2sass_test.rb +0 -364
  101. data/test/sass/data/hsl-rgb.txt +0 -319
  102. data/test/sass/engine_test.rb +0 -2267
  103. data/test/sass/extend_test.rb +0 -1348
  104. data/test/sass/functions_test.rb +0 -556
  105. data/test/sass/less_conversion_test.rb +0 -653
  106. data/test/sass/more_results/more1.css +0 -9
  107. data/test/sass/more_results/more1_with_line_comments.css +0 -26
  108. data/test/sass/more_results/more_import.css +0 -29
  109. data/test/sass/more_templates/_more_partial.sass +0 -2
  110. data/test/sass/more_templates/more1.sass +0 -23
  111. data/test/sass/more_templates/more_import.sass +0 -11
  112. data/test/sass/plugin_test.rb +0 -433
  113. data/test/sass/results/alt.css +0 -4
  114. data/test/sass/results/basic.css +0 -9
  115. data/test/sass/results/compact.css +0 -5
  116. data/test/sass/results/complex.css +0 -86
  117. data/test/sass/results/compressed.css +0 -1
  118. data/test/sass/results/expanded.css +0 -19
  119. data/test/sass/results/import.css +0 -31
  120. data/test/sass/results/import_charset.css +0 -4
  121. data/test/sass/results/import_charset_1_8.css +0 -4
  122. data/test/sass/results/import_charset_ibm866.css +0 -4
  123. data/test/sass/results/line_numbers.css +0 -49
  124. data/test/sass/results/mixins.css +0 -95
  125. data/test/sass/results/multiline.css +0 -24
  126. data/test/sass/results/nested.css +0 -22
  127. data/test/sass/results/options.css +0 -1
  128. data/test/sass/results/parent_ref.css +0 -13
  129. data/test/sass/results/script.css +0 -16
  130. data/test/sass/results/scss_import.css +0 -31
  131. data/test/sass/results/scss_importee.css +0 -2
  132. data/test/sass/results/subdir/nested_subdir/nested_subdir.css +0 -1
  133. data/test/sass/results/subdir/subdir.css +0 -3
  134. data/test/sass/results/units.css +0 -11
  135. data/test/sass/results/warn.css +0 -0
  136. data/test/sass/results/warn_imported.css +0 -0
  137. data/test/sass/script_conversion_test.rb +0 -314
  138. data/test/sass/script_test.rb +0 -470
  139. data/test/sass/scss/css_test.rb +0 -916
  140. data/test/sass/scss/rx_test.rb +0 -156
  141. data/test/sass/scss/scss_test.rb +0 -1122
  142. data/test/sass/scss/test_helper.rb +0 -37
  143. data/test/sass/templates/_imported_charset_ibm866.sass +0 -4
  144. data/test/sass/templates/_imported_charset_utf8.sass +0 -4
  145. data/test/sass/templates/_partial.sass +0 -2
  146. data/test/sass/templates/alt.sass +0 -16
  147. data/test/sass/templates/basic.sass +0 -23
  148. data/test/sass/templates/bork1.sass +0 -2
  149. data/test/sass/templates/bork2.sass +0 -2
  150. data/test/sass/templates/bork3.sass +0 -2
  151. data/test/sass/templates/bork4.sass +0 -2
  152. data/test/sass/templates/compact.sass +0 -17
  153. data/test/sass/templates/complex.sass +0 -305
  154. data/test/sass/templates/compressed.sass +0 -15
  155. data/test/sass/templates/expanded.sass +0 -17
  156. data/test/sass/templates/import.sass +0 -12
  157. data/test/sass/templates/import_charset.sass +0 -7
  158. data/test/sass/templates/import_charset_1_8.sass +0 -4
  159. data/test/sass/templates/import_charset_ibm866.sass +0 -9
  160. data/test/sass/templates/importee.less +0 -2
  161. data/test/sass/templates/importee.sass +0 -19
  162. data/test/sass/templates/line_numbers.sass +0 -13
  163. data/test/sass/templates/mixin_bork.sass +0 -5
  164. data/test/sass/templates/mixins.sass +0 -76
  165. data/test/sass/templates/multiline.sass +0 -20
  166. data/test/sass/templates/nested.sass +0 -25
  167. data/test/sass/templates/nested_bork1.sass +0 -2
  168. data/test/sass/templates/nested_bork2.sass +0 -2
  169. data/test/sass/templates/nested_bork3.sass +0 -2
  170. data/test/sass/templates/nested_bork4.sass +0 -2
  171. data/test/sass/templates/nested_mixin_bork.sass +0 -6
  172. data/test/sass/templates/options.sass +0 -2
  173. data/test/sass/templates/parent_ref.sass +0 -25
  174. data/test/sass/templates/script.sass +0 -101
  175. data/test/sass/templates/scss_import.scss +0 -11
  176. data/test/sass/templates/scss_importee.scss +0 -1
  177. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +0 -2
  178. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +0 -3
  179. data/test/sass/templates/subdir/subdir.sass +0 -6
  180. data/test/sass/templates/units.sass +0 -11
  181. data/test/sass/templates/warn.sass +0 -3
  182. data/test/sass/templates/warn_imported.sass +0 -4
  183. data/vendor/fssm/LICENSE +0 -20
  184. data/vendor/fssm/README.markdown +0 -55
  185. data/vendor/fssm/Rakefile +0 -59
  186. data/vendor/fssm/VERSION.yml +0 -5
  187. data/vendor/fssm/example.rb +0 -9
  188. data/vendor/fssm/fssm.gemspec +0 -77
  189. data/vendor/fssm/lib/fssm.rb +0 -33
  190. data/vendor/fssm/lib/fssm/backends/fsevents.rb +0 -36
  191. data/vendor/fssm/lib/fssm/backends/inotify.rb +0 -26
  192. data/vendor/fssm/lib/fssm/backends/polling.rb +0 -25
  193. data/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +0 -131
  194. data/vendor/fssm/lib/fssm/monitor.rb +0 -26
  195. data/vendor/fssm/lib/fssm/path.rb +0 -91
  196. data/vendor/fssm/lib/fssm/pathname.rb +0 -502
  197. data/vendor/fssm/lib/fssm/state/directory.rb +0 -57
  198. data/vendor/fssm/lib/fssm/state/file.rb +0 -24
  199. data/vendor/fssm/lib/fssm/support.rb +0 -63
  200. data/vendor/fssm/lib/fssm/tree.rb +0 -176
  201. data/vendor/fssm/profile/prof-cache.rb +0 -40
  202. data/vendor/fssm/profile/prof-fssm-pathname.html +0 -1231
  203. data/vendor/fssm/profile/prof-pathname.rb +0 -68
  204. data/vendor/fssm/profile/prof-plain-pathname.html +0 -988
  205. data/vendor/fssm/profile/prof.html +0 -2379
  206. data/vendor/fssm/spec/path_spec.rb +0 -75
  207. data/vendor/fssm/spec/root/duck/quack.txt +0 -0
  208. data/vendor/fssm/spec/root/file.css +0 -0
  209. data/vendor/fssm/spec/root/file.rb +0 -0
  210. data/vendor/fssm/spec/root/file.yml +0 -0
  211. data/vendor/fssm/spec/root/moo/cow.txt +0 -0
  212. data/vendor/fssm/spec/spec_helper.rb +0 -14
@@ -1,2 +0,0 @@
1
- scss {
2
- imported: yes; }
@@ -1 +0,0 @@
1
- #pi { width: 314px; }
@@ -1,3 +0,0 @@
1
- #nested { relative: true; }
2
-
3
- #subdir { font-size: 20px; font-weight: bold; }
@@ -1,11 +0,0 @@
1
- b {
2
- foo: 5px;
3
- bar: 24px;
4
- baz: 66.667%;
5
- many-units: 32em;
6
- mm: 15mm;
7
- pc: 2pc;
8
- pt: -72pt;
9
- inches: 2in;
10
- more-inches: 3.5in;
11
- mixed: 6px; }
File without changes
File without changes
@@ -1,314 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*- coding: utf-8 -*-
3
- require File.dirname(__FILE__) + '/../test_helper'
4
- require 'sass/engine'
5
-
6
- class SassScriptConversionTest < Test::Unit::TestCase
7
- def test_bool
8
- assert_renders "true"
9
- assert_renders "false"
10
- end
11
-
12
- def test_color
13
- assert_renders "#abcdef"
14
- assert_renders "blue"
15
- assert_renders "rgba(0, 1, 2, 0.2)"
16
-
17
- assert_equal "#aabbcc", render("#abc")
18
- assert_equal "blue", render("#0000ff")
19
- end
20
-
21
- def test_number
22
- assert_renders "10"
23
- assert_renders "10.35"
24
- assert_renders "12px"
25
- assert_renders "12.45px"
26
-
27
- assert_equal "12.346", render("12.345678901")
28
- end
29
-
30
- def test_string
31
- assert_renders '"foo"'
32
- assert_renders '"bar baz"'
33
- assert_equal '"baz bang"', render("'baz bang'")
34
- end
35
-
36
- def test_string_quotes
37
- assert_equal "'quote\"quote'", render('"quote\\"quote"')
38
- assert_equal '"quote\'quote"', render("'quote\\'quote'")
39
- assert_renders '"quote\'quote\\"quote"'
40
- assert_equal '"quote\'quote\\"quote"', render("'quote\\'quote\"quote'")
41
- end
42
-
43
- def test_string_escapes
44
- assert_renders '"foo\\\\bar"'
45
- end
46
-
47
- def test_funcall
48
- assert_renders "foo(true, blue)"
49
- assert_renders "hsla(20deg, 30%, 50%, 0.3)"
50
- assert_renders "blam()"
51
-
52
- assert_renders "-\xC3\xBFoo(12px)"
53
- assert_renders "-foo(12px)"
54
- end
55
-
56
- def test_url
57
- assert_renders "url(foo.gif)"
58
- assert_renders "url($var)"
59
- assert_renders "url(\#{$var}/flip.gif)"
60
- end
61
-
62
- def test_variable
63
- assert_renders "$foo-bar"
64
- assert_renders "$flaznicate"
65
- assert_warning(<<WARN) {assert_equal "$tumbly-wumbly", render("!tumbly-wumbly")}
66
- DEPRECATION WARNING:
67
- On line 1, character 1 of 'test_variable_inline.sass'
68
- Variables with ! have been deprecated and will be removed in version 3.2.
69
- Use "$tumbly-wumbly" instead.
70
-
71
- You can use `sass-convert --in-place --from sass2 file.sass' to convert files automatically.
72
- WARN
73
- end
74
-
75
- def test_important
76
- assert_renders "!important"
77
- assert_renders "$foo !important"
78
- end
79
-
80
- def test_comma_operator
81
- assert_renders "$foo, $bar $baz"
82
- assert_renders "$foo $bar, $baz"
83
-
84
- assert_renders "($foo, $bar) $baz"
85
- assert_renders "$foo ($bar, $baz)"
86
-
87
- assert_equal "$foo, $bar $baz", render("$foo, ($bar $baz)")
88
- assert_equal "$foo $bar, $baz", render("($foo $bar), $baz")
89
- end
90
-
91
- def test_concat_operator
92
- assert_renders "$foo $bar or $baz"
93
- assert_renders "$foo or $bar $baz"
94
-
95
- assert_renders "($foo $bar) or $baz"
96
- assert_renders "$foo or ($bar $baz)"
97
-
98
- assert_equal "$foo $bar or $baz", render("$foo ($bar or $baz)")
99
- assert_equal "$foo or $bar $baz", render("($foo or $bar) $baz")
100
- end
101
-
102
- def self.test_precedence(outer, inner)
103
- op_outer = Sass::Script::Lexer::OPERATORS_REVERSE[outer]
104
- op_inner = Sass::Script::Lexer::OPERATORS_REVERSE[inner]
105
- class_eval <<RUBY
106
- def test_precedence_#{outer}_#{inner}
107
- assert_renders "$foo #{op_outer} $bar #{op_inner} $baz"
108
- assert_renders "$foo #{op_inner} $bar #{op_outer} $baz"
109
-
110
- assert_renders "($foo #{op_outer} $bar) #{op_inner} $baz"
111
- assert_renders "$foo #{op_inner} ($bar #{op_outer} $baz)"
112
-
113
- assert_equal "$foo #{op_outer} $bar #{op_inner} $baz",
114
- render("$foo #{op_outer} ($bar #{op_inner} $baz)")
115
- assert_equal "$foo #{op_inner} $bar #{op_outer} $baz",
116
- render("($foo #{op_inner} $bar) #{op_outer} $baz")
117
- end
118
- RUBY
119
- end
120
-
121
- def self.assert_associative(op_name, sibling_name)
122
- op = separator_for(op_name)
123
- sibling = separator_for(sibling_name)
124
- class_eval <<RUBY
125
- def test_associative_#{op_name}_#{sibling_name}
126
- assert_renders "$foo#{op}$bar#{op}$baz"
127
-
128
- assert_equal "$foo#{op}$bar#{op}$baz",
129
- render("$foo#{op}($bar#{op}$baz)")
130
- assert_equal "$foo#{op}$bar#{op}$baz",
131
- render("($foo#{op}$bar)#{op}$baz")
132
-
133
- assert_equal "$foo#{op}$bar#{sibling}$baz",
134
- render("$foo#{op}($bar#{sibling}$baz)")
135
- assert_equal "$foo#{sibling}$bar#{op}$baz",
136
- render("($foo#{sibling}$bar)#{op}$baz")
137
- end
138
- RUBY
139
- end
140
-
141
- def self.separator_for(op_name)
142
- case op_name
143
- when :comma; ", "
144
- when :concat; " "
145
- else; " #{Sass::Script::Lexer::OPERATORS_REVERSE[op_name]} "
146
- end
147
- end
148
-
149
- def self.assert_non_associative(op_name, sibling_name)
150
- op = Sass::Script::Lexer::OPERATORS_REVERSE[op_name]
151
- sibling = Sass::Script::Lexer::OPERATORS_REVERSE[sibling_name]
152
- class_eval <<RUBY
153
- def test_non_associative_#{op_name}_#{sibling_name}
154
- assert_renders "$foo #{op} $bar #{op} $baz"
155
-
156
- assert_renders "$foo #{op} ($bar #{op} $baz)"
157
- assert_equal "$foo #{op} $bar #{op} $baz",
158
- render("($foo #{op} $bar) #{op} $baz")
159
-
160
- assert_renders "$foo #{op} ($bar #{sibling} $baz)"
161
- assert_equal "$foo #{sibling} $bar #{op} $baz",
162
- render("($foo #{sibling} $bar) #{op} $baz")
163
- end
164
- RUBY
165
- end
166
-
167
- test_precedence :or, :and
168
- test_precedence :and, :eq
169
- test_precedence :and, :neq
170
- test_precedence :eq, :gt
171
- test_precedence :eq, :gte
172
- test_precedence :eq, :lt
173
- test_precedence :eq, :lte
174
- test_precedence :gt, :plus
175
- test_precedence :gt, :minus
176
- test_precedence :plus, :times
177
- test_precedence :plus, :div
178
- test_precedence :plus, :mod
179
-
180
- assert_associative :comma, :concat
181
- assert_associative :concat, :or
182
- assert_associative :plus, :minus
183
- assert_associative :times, :div
184
- assert_associative :times, :mod
185
-
186
- assert_non_associative :minus, :plus
187
- assert_non_associative :div, :times
188
- assert_non_associative :mod, :times
189
- assert_non_associative :gt, :gte
190
- assert_non_associative :gte, :lt
191
- assert_non_associative :lt, :lte
192
- assert_non_associative :lte, :gt
193
-
194
- def test_unary_op
195
- assert_renders "-12px"
196
- assert_renders '/"foo"'
197
- assert_renders 'not true'
198
-
199
- assert_renders "-(foo(12px))"
200
- assert_renders "-(-foo(12px))"
201
- assert_renders "-(_foo(12px))"
202
- assert_renders "-(\xC3\xBFoo(12px))"
203
- assert_renders "-(blue)"
204
-
205
- assert_equal 'not true or false', render('(not true) or false')
206
- assert_equal 'not (true or false)', render('not (true or false)')
207
- end
208
-
209
- def test_interpolation
210
- assert_renders "$foo\#{$bar}$baz"
211
- assert_renders "$foo\#{$bar} $baz"
212
- assert_renders "$foo \#{$bar}$baz"
213
- assert_renders "$foo \#{$bar} $baz"
214
- assert_renders "$foo \#{$bar}\#{$bang} $baz"
215
- assert_renders "$foo \#{$bar} \#{$bang} $baz"
216
- assert_renders "\#{$bar}$baz"
217
- assert_renders "$foo\#{$bar}"
218
- assert_renders "\#{$bar}"
219
- end
220
-
221
- def test_interpolation_in_function
222
- assert_renders 'flabnabbit(#{1 + "foo"})'
223
- assert_renders 'flabnabbit($foo #{1 + "foo"}$baz)'
224
- assert_renders 'flabnabbit($foo #{1 + "foo"}#{2 + "bar"} $baz)'
225
- end
226
-
227
- def test_interpolation_near_operators
228
- assert_renders '#{1 + 2} , #{3 + 4}'
229
- assert_renders '#{1 + 2}, #{3 + 4}'
230
- assert_renders '#{1 + 2} ,#{3 + 4}'
231
- assert_renders '#{1 + 2},#{3 + 4}'
232
-
233
- assert_renders '3 / #{3 + 4}'
234
- assert_renders '3 /#{3 + 4}'
235
- assert_renders '3/ #{3 + 4}'
236
- assert_renders '3/#{3 + 4}'
237
-
238
- assert_renders '#{1 + 2} * 7'
239
- assert_renders '#{1 + 2}* 7'
240
- assert_renders '#{1 + 2} *7'
241
- assert_renders '#{1 + 2}*7'
242
-
243
- assert_renders '-#{1 + 2}'
244
- assert_renders '- #{1 + 2}'
245
-
246
- assert_renders '5 + #{1 + 2} * #{3 + 4}'
247
- assert_renders '5 +#{1 + 2} * #{3 + 4}'
248
- assert_renders '5+#{1 + 2} * #{3 + 4}'
249
- assert_renders '#{1 + 2} * #{3 + 4} + 5'
250
- assert_renders '#{1 + 2} * #{3 + 4}+ 5'
251
- assert_renders '#{1 + 2} * #{3 + 4}+5'
252
-
253
- assert_equal '5 / #{1 + 2} + #{3 + 4}', render('5 / (#{1 + 2} + #{3 + 4})')
254
- assert_equal '5 / #{1 + 2} + #{3 + 4}', render('5 /(#{1 + 2} + #{3 + 4})')
255
- assert_equal '5 / #{1 + 2} + #{3 + 4}', render('5 /( #{1 + 2} + #{3 + 4} )')
256
- assert_equal '#{1 + 2} + #{3 + 4} / 5', render('(#{1 + 2} + #{3 + 4}) / 5')
257
- assert_equal '#{1 + 2} + #{3 + 4} / 5', render('(#{1 + 2} + #{3 + 4})/ 5')
258
- assert_equal '#{1 + 2} + #{3 + 4} / 5', render('( #{1 + 2} + #{3 + 4} )/ 5')
259
-
260
- assert_renders '#{1 + 2} + 2 + 3'
261
- assert_renders '#{1 + 2} +2 + 3'
262
- end
263
-
264
- def test_string_interpolation
265
- assert_renders '"foo#{$bar}baz"'
266
- assert_renders '"foo #{$bar}baz"'
267
- assert_renders '"foo#{$bar} baz"'
268
- assert_renders '"foo #{$bar} baz"'
269
- assert_renders '"foo #{$bar}#{$bang} baz"'
270
- assert_renders '"foo #{$bar} #{$bang} baz"'
271
- assert_renders '"#{$bar}baz"'
272
- assert_renders '"foo#{$bar}"'
273
- assert_equal '#{$bar}', render('"#{$bar}"')
274
-
275
- assert_equal '"foo#{$bar}baz"', render("'foo\#{$bar}baz'")
276
- end
277
-
278
- def test_sass2_string_interpolation
279
- assert_equal 'foo#{$bar}baz', render('"foo#{$bar}baz"', :context => :equals)
280
- assert_equal '#{$bar}baz', render('"#{$bar}baz"', :context => :equals)
281
- assert_equal 'foo#{$bar}', render('"foo#{$bar}"', :context => :equals)
282
-
283
- assert_equal 'unquote(".foo#{$bar}.bar")', render('".foo#{$bar}.bar"', :context => :equals)
284
- assert_equal 'unquote(".foo#{$bar}")', render('".foo#{$bar}"', :context => :equals)
285
- assert_equal 'unquote("#{$bar}.bar")', render('"#{$bar}.bar"', :context => :equals)
286
-
287
- assert_equal "unquote(\"f'o\#{$bar}b'z\")", render("'f\\'o\#{$bar}b\\'z'", :context => :equals)
288
- assert_equal "unquote('f\"o\#{$bar}b\"z')", render("'f\\\"o\#{$bar}b\\\"z'", :context => :equals)
289
- assert_equal "unquote(\"f'o\#{$bar}b\\\"z\")", render("'f\\'o\#{$bar}b\\\"z'", :context => :equals)
290
- end
291
-
292
- def test_sass2_urls
293
- Haml::Util.silence_haml_warnings do
294
- assert_equal 'url(foo/bar.gif)', render('url(foo/bar.gif)', :context => :equals)
295
- assert_equal 'url("foo/bar.gif")', render('url("foo/bar.gif")', :context => :equals)
296
-
297
- assert_equal 'url($var)', render('url(!var)', :context => :equals)
298
- assert_equal 'url("#{$var}/flip.gif")', render('url("#{!var}/flip.gif")', :context => :equals)
299
- end
300
- end
301
-
302
- private
303
-
304
- def assert_renders(script, options = {})
305
- assert_equal(script, render(script, options))
306
- end
307
-
308
- def render(script, options = {})
309
- munge_filename(options)
310
- node = Sass::Script.parse(script, 1, 0, options)
311
- node.context = options[:context] if options[:context]
312
- node.to_sass
313
- end
314
- end
@@ -1,470 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require File.dirname(__FILE__) + '/../test_helper'
3
- require 'sass/engine'
4
-
5
- module Sass::Script::Functions::UserFunctions
6
- def assert_options(val)
7
- val.options[:foo]
8
- Sass::Script::String.new("Options defined!")
9
- end
10
- end
11
-
12
- class SassScriptTest < Test::Unit::TestCase
13
- include Sass::Script
14
-
15
- def test_color_checks_input
16
- assert_raise_message(Sass::SyntaxError, "Blue value must be between 0 and 255") {Color.new([1, 2, -1])}
17
- assert_raise_message(Sass::SyntaxError, "Red value must be between 0 and 255") {Color.new([256, 2, 3])}
18
- end
19
-
20
- def test_color_checks_rgba_input
21
- assert_raise_message(Sass::SyntaxError, "Alpha channel must be between 0 and 1") {Color.new([1, 2, 3, 1.1])}
22
- assert_raise_message(Sass::SyntaxError, "Alpha channel must be between 0 and 1") {Color.new([1, 2, 3, -0.1])}
23
- end
24
-
25
- def test_string_escapes
26
- assert_equal "'", resolve("\"'\"")
27
- assert_equal '"', resolve("\"\\\"\"")
28
- assert_equal "\\\\", resolve("\"\\\\\"")
29
- assert_equal "\\02fa", resolve("\"\\02fa\"")
30
-
31
- assert_equal "'", resolve("'\\''")
32
- assert_equal '"', resolve("'\"'")
33
- assert_equal "\\\\", resolve("'\\\\'")
34
- assert_equal "\\02fa", resolve("'\\02fa'")
35
- end
36
-
37
- def test_string_interpolation
38
- assert_equal "foo2bar", resolve('\'foo#{1 + 1}bar\'')
39
- assert_equal "foo2bar", resolve('"foo#{1 + 1}bar"')
40
- assert_equal "foo1bar5baz4bang", resolve('\'foo#{1 + "bar#{2 + 3}baz" + 4}bang\'')
41
- end
42
-
43
- def test_color_names
44
- assert_equal "white", resolve("white")
45
- assert_equal "white", resolve("#ffffff")
46
- assert_equal "#fffffe", resolve("white - #000001")
47
- end
48
-
49
- def test_rgba_color_literals
50
- assert_equal Sass::Script::Color.new([1, 2, 3, 0.75]), eval("rgba(1, 2, 3, 0.75)")
51
- assert_equal "rgba(1, 2, 3, 0.75)", resolve("rgba(1, 2, 3, 0.75)")
52
-
53
- assert_equal Sass::Script::Color.new([1, 2, 3, 0]), eval("rgba(1, 2, 3, 0)")
54
- assert_equal "rgba(1, 2, 3, 0)", resolve("rgba(1, 2, 3, 0)")
55
-
56
- assert_equal Sass::Script::Color.new([1, 2, 3]), eval("rgba(1, 2, 3, 1)")
57
- assert_equal Sass::Script::Color.new([1, 2, 3, 1]), eval("rgba(1, 2, 3, 1)")
58
- assert_equal "#010203", resolve("rgba(1, 2, 3, 1)")
59
- assert_equal "white", resolve("rgba(255, 255, 255, 1)")
60
- end
61
-
62
- def test_rgba_color_math
63
- assert_equal "rgba(50, 50, 100, 0.35)", resolve("rgba(1, 1, 2, 0.35) * rgba(50, 50, 50, 0.35)")
64
- assert_equal "rgba(52, 52, 52, 0.25)", resolve("rgba(2, 2, 2, 0.25) + rgba(50, 50, 50, 0.25)")
65
-
66
- assert_raise_message(Sass::SyntaxError, "Alpha channels must be equal: rgba(1, 2, 3, 0.15) + rgba(50, 50, 50, 0.75)") do
67
- resolve("rgba(1, 2, 3, 0.15) + rgba(50, 50, 50, 0.75)")
68
- end
69
- assert_raise_message(Sass::SyntaxError, "Alpha channels must be equal: #123456 * rgba(50, 50, 50, 0.75)") do
70
- resolve("#123456 * rgba(50, 50, 50, 0.75)")
71
- end
72
- assert_raise_message(Sass::SyntaxError, "Alpha channels must be equal: rgba(50, 50, 50, 0.75) / #123456") do
73
- resolve("rgba(50, 50, 50, 0.75) / #123456")
74
- end
75
- end
76
-
77
- def test_rgba_number_math
78
- assert_equal "rgba(49, 49, 49, 0.75)", resolve("rgba(50, 50, 50, 0.75) - 1")
79
- assert_equal "rgba(100, 100, 100, 0.75)", resolve("rgba(50, 50, 50, 0.75) * 2")
80
- end
81
-
82
- def test_rgba_rounding
83
- assert_equal "rgba(10, 1, 0, 0.123)", resolve("rgba(10.0, 1.23456789, 0.0, 0.1234567)")
84
- end
85
-
86
- def test_compressed_colors
87
- assert_equal "#123456", resolve("#123456", :style => :compressed)
88
- assert_equal "rgba(1,2,3,0.5)", resolve("rgba(1, 2, 3, 0.5)", :style => :compressed)
89
- assert_equal "#123", resolve("#112233", :style => :compressed)
90
- assert_equal "#000", resolve("black", :style => :compressed)
91
- assert_equal "red", resolve("#f00", :style => :compressed)
92
- assert_equal "blue", resolve("#00f", :style => :compressed)
93
- assert_equal "navy", resolve("#000080", :style => :compressed)
94
- assert_equal "navy #fff", resolve("#000080 white", :style => :compressed)
95
- assert_equal "This color is #fff", resolve('"This color is #{ white }"', :style => :compressed)
96
- end
97
-
98
- def test_compressed_comma
99
- # assert_equal "foo,bar,baz", resolve("foo, bar, baz", :style => :compressed)
100
- # assert_equal "foo,#baf,baz", resolve("foo, #baf, baz", :style => :compressed)
101
- assert_equal "foo,#baf,red", resolve("foo, #baf, #f00", :style => :compressed)
102
- end
103
-
104
- def test_implicit_strings
105
- assert_equal Sass::Script::String.new("foo"), eval("foo")
106
- assert_equal Sass::Script::String.new("foo bar"), eval("foo bar")
107
- assert_equal Sass::Script::String.new("foo/bar"), eval("foo/bar")
108
- end
109
-
110
- def test_basic_interpolation
111
- assert_equal "foo3bar", resolve("foo\#{1 + 2}bar")
112
- assert_equal "foo3 bar", resolve("foo\#{1 + 2} bar")
113
- assert_equal "foo 3bar", resolve("foo \#{1 + 2}bar")
114
- assert_equal "foo 3 bar", resolve("foo \#{1 + 2} bar")
115
- assert_equal "foo 35 bar", resolve("foo \#{1 + 2}\#{2 + 3} bar")
116
- assert_equal "foo 3 5 bar", resolve("foo \#{1 + 2} \#{2 + 3} bar")
117
- assert_equal "3bar", resolve("\#{1 + 2}bar")
118
- assert_equal "foo3", resolve("foo\#{1 + 2}")
119
- assert_equal "3", resolve("\#{1 + 2}")
120
- end
121
-
122
- def test_interpolation_in_function
123
- assert_equal 'flabnabbit(1foo)', resolve('flabnabbit(#{1 + "foo"})')
124
- assert_equal 'flabnabbit(foo 1foobaz)', resolve('flabnabbit(foo #{1 + "foo"}baz)')
125
- assert_equal('flabnabbit(foo 1foo2bar baz)',
126
- resolve('flabnabbit(foo #{1 + "foo"}#{2 + "bar"} baz)'))
127
- end
128
-
129
- def test_interpolation_near_operators
130
- assert_equal '3 , 7', resolve('#{1 + 2} , #{3 + 4}')
131
- assert_equal '3, 7', resolve('#{1 + 2}, #{3 + 4}')
132
- assert_equal '3 ,7', resolve('#{1 + 2} ,#{3 + 4}')
133
- assert_equal '3,7', resolve('#{1 + 2},#{3 + 4}')
134
-
135
- assert_equal '3 / 7', resolve('3 / #{3 + 4}')
136
- assert_equal '3 /7', resolve('3 /#{3 + 4}')
137
- assert_equal '3/ 7', resolve('3/ #{3 + 4}')
138
- assert_equal '3/7', resolve('3/#{3 + 4}')
139
-
140
- assert_equal '3 * 7', resolve('#{1 + 2} * 7')
141
- assert_equal '3* 7', resolve('#{1 + 2}* 7')
142
- assert_equal '3 *7', resolve('#{1 + 2} *7')
143
- assert_equal '3*7', resolve('#{1 + 2}*7')
144
-
145
- assert_equal '-3', resolve('-#{1 + 2}')
146
- assert_equal '- 3', resolve('- #{1 + 2}')
147
-
148
- assert_equal '5 + 3 * 7', resolve('5 + #{1 + 2} * #{3 + 4}')
149
- assert_equal '5 +3 * 7', resolve('5 +#{1 + 2} * #{3 + 4}')
150
- assert_equal '5+3 * 7', resolve('5+#{1 + 2} * #{3 + 4}')
151
- assert_equal '3 * 7 + 5', resolve('#{1 + 2} * #{3 + 4} + 5')
152
- assert_equal '3 * 7+ 5', resolve('#{1 + 2} * #{3 + 4}+ 5')
153
- assert_equal '3 * 7+5', resolve('#{1 + 2} * #{3 + 4}+5')
154
-
155
- assert_equal '5/3 + 7', resolve('5 / (#{1 + 2} + #{3 + 4})')
156
- assert_equal '5/3 + 7', resolve('5 /(#{1 + 2} + #{3 + 4})')
157
- assert_equal '5/3 + 7', resolve('5 /( #{1 + 2} + #{3 + 4} )')
158
- assert_equal '3 + 7/5', resolve('(#{1 + 2} + #{3 + 4}) / 5')
159
- assert_equal '3 + 7/5', resolve('(#{1 + 2} + #{3 + 4})/ 5')
160
- assert_equal '3 + 7/5', resolve('( #{1 + 2} + #{3 + 4} )/ 5')
161
-
162
- assert_equal '3 + 5', resolve('#{1 + 2} + 2 + 3')
163
- assert_equal '3 +5', resolve('#{1 + 2} +2 + 3')
164
- end
165
-
166
- def test_string_interpolation
167
- assert_equal "foo bar, baz bang", resolve('"foo #{"bar"}, #{"baz"} bang"')
168
- assert_equal "foo bar baz bang", resolve('"foo #{"#{"ba" + "r"} baz"} bang"')
169
- assert_equal 'foo #{bar baz} bang', resolve('"foo \#{#{"ba" + "r"} baz} bang"')
170
- assert_equal 'foo #{baz bang', resolve('"foo #{"\#{" + "baz"} bang"')
171
- end
172
-
173
- def test_rule_interpolation
174
- assert_equal(<<CSS, render(<<SASS))
175
- foo bar baz bang {
176
- a: b; }
177
- CSS
178
- foo \#{"\#{"ba" + "r"} baz"} bang
179
- a: b
180
- SASS
181
- assert_equal(<<CSS, render(<<SASS))
182
- foo [bar="\#{bar baz}"] bang {
183
- a: b; }
184
- CSS
185
- foo [bar="\\\#{\#{"ba" + "r"} baz}"] bang
186
- a: b
187
- SASS
188
- assert_equal(<<CSS, render(<<SASS))
189
- foo [bar="\#{baz"] bang {
190
- a: b; }
191
- CSS
192
- foo [bar="\#{"\\\#{" + "baz"}"] bang
193
- a: b
194
- SASS
195
- end
196
-
197
- def test_inaccessible_functions
198
- assert_equal "send(to_s)", resolve("send(to_s)", :line => 2)
199
- assert_equal "public_instance_methods()", resolve("public_instance_methods()")
200
- end
201
-
202
- def test_default_functions
203
- assert_equal "url(12)", resolve("url(12)")
204
- assert_equal 'blam("foo")', resolve('blam("foo")')
205
- end
206
-
207
- def test_function_results_have_options
208
- assert_equal "Options defined!", resolve("assert_options(abs(1))")
209
- assert_equal "Options defined!", resolve("assert_options(round(1.2))")
210
- end
211
-
212
- def test_funcall_requires_no_whitespace_before_lparen
213
- assert_equal "no-repeat 15px", resolve("no-repeat (7px + 8px)")
214
- assert_equal "no-repeat(15px)", resolve("no-repeat(7px + 8px)")
215
- end
216
-
217
- def test_dynamic_url
218
- assert_equal "url(foo-bar)", resolve("url($foo)", {}, env('foo' => Sass::Script::String.new("foo-bar")))
219
- assert_equal "url(foo-bar baz)", resolve("url($foo $bar)", {}, env('foo' => Sass::Script::String.new("foo-bar"), 'bar' => Sass::Script::String.new("baz")))
220
- assert_equal "url(foo baz)", resolve("url(foo $bar)", {}, env('bar' => Sass::Script::String.new("baz")))
221
- assert_equal "url(foo bar)", resolve("url(foo bar)")
222
- end
223
-
224
- def test_url_with_interpolation
225
- assert_equal "url(http://sass-lang.com/images/foo-bar)", resolve("url(http://sass-lang.com/images/\#{foo-bar})")
226
- assert_equal 'url("http://sass-lang.com/images/foo-bar")', resolve("url('http://sass-lang.com/images/\#{foo-bar}')")
227
- assert_equal 'url("http://sass-lang.com/images/foo-bar")', resolve('url("http://sass-lang.com/images/#{foo-bar}")')
228
- assert_unquoted "url(http://sass-lang.com/images/\#{foo-bar})"
229
- end
230
-
231
- def test_hyphenated_variables
232
- assert_equal("a-b", resolve("$a-b", {}, env("a-b" => Sass::Script::String.new("a-b"))))
233
- end
234
-
235
- def test_ruby_equality
236
- assert_equal eval('"foo"'), eval('"foo"')
237
- assert_equal eval('1'), eval('1.0')
238
- assert_not_equal eval('1'), eval('"1"')
239
- end
240
-
241
- def test_booleans
242
- assert_equal "true", resolve("true")
243
- assert_equal "false", resolve("false")
244
- end
245
-
246
- def test_boolean_ops
247
- assert_equal "true", resolve("true and true")
248
- assert_equal "true", resolve("false or true")
249
- assert_equal "true", resolve("true or false")
250
- assert_equal "true", resolve("true or true")
251
- assert_equal "false", resolve("false or false")
252
- assert_equal "false", resolve("false and true")
253
- assert_equal "false", resolve("true and false")
254
- assert_equal "false", resolve("false and false")
255
-
256
- assert_equal "true", resolve("not false")
257
- assert_equal "false", resolve("not true")
258
- assert_equal "true", resolve("not not true")
259
-
260
- assert_equal "1", resolve("false or 1")
261
- assert_equal "false", resolve("false and 1")
262
- assert_equal "2", resolve("2 or 3")
263
- assert_equal "3", resolve("2 and 3")
264
- end
265
-
266
- def test_arithmetic_ops
267
- assert_equal "2", resolve("1 + 1")
268
- assert_equal "0", resolve("1 - 1")
269
- assert_equal "8", resolve("2 * 4")
270
- assert_equal "0.5", resolve("(2 / 4)")
271
- assert_equal "2", resolve("(4 / 2)")
272
-
273
- assert_equal "-1", resolve("-1")
274
- end
275
-
276
- def test_string_ops
277
- assert_equal '"foo" "bar"', resolve('"foo" "bar"')
278
- assert_equal "true 1", resolve('true 1')
279
- assert_equal '"foo", "bar"', resolve("'foo' , 'bar'")
280
- assert_equal "true, 1", resolve('true , 1')
281
- assert_equal "foobar", resolve('"foo" + "bar"')
282
- assert_equal "true1", resolve('true + 1')
283
- assert_equal '"foo"-"bar"', resolve("'foo' - 'bar'")
284
- assert_equal "true-1", resolve('true - 1')
285
- assert_equal '"foo"/"bar"', resolve('"foo" / "bar"')
286
- assert_equal "true/1", resolve('true / 1')
287
-
288
- assert_equal '-"bar"', resolve("- 'bar'")
289
- assert_equal "-true", resolve('- true')
290
- assert_equal '/"bar"', resolve('/ "bar"')
291
- assert_equal "/true", resolve('/ true')
292
- end
293
-
294
- def test_relational_ops
295
- assert_equal "false", resolve("1 > 2")
296
- assert_equal "false", resolve("2 > 2")
297
- assert_equal "true", resolve("3 > 2")
298
- assert_equal "false", resolve("1 >= 2")
299
- assert_equal "true", resolve("2 >= 2")
300
- assert_equal "true", resolve("3 >= 2")
301
- assert_equal "true", resolve("1 < 2")
302
- assert_equal "false", resolve("2 < 2")
303
- assert_equal "false", resolve("3 < 2")
304
- assert_equal "true", resolve("1 <= 2")
305
- assert_equal "true", resolve("2 <= 2")
306
- assert_equal "false", resolve("3 <= 2")
307
- end
308
-
309
- def test_equals
310
- assert_equal("true", resolve('"foo" == $foo', {},
311
- env("foo" => Sass::Script::String.new("foo"))))
312
- assert_equal "true", resolve("1 == 1.0")
313
- assert_equal "true", resolve("false != true")
314
- assert_equal "false", resolve("1em == 1px")
315
- assert_equal "false", resolve("12 != 12")
316
- end
317
-
318
- def test_operation_precedence
319
- assert_equal "false true", resolve("true and false false or true")
320
- assert_equal "true", resolve("false and true or true and true")
321
- assert_equal "true", resolve("1 == 2 or 3 == 3")
322
- assert_equal "true", resolve("1 < 2 == 3 >= 3")
323
- assert_equal "true", resolve("1 + 3 > 4 - 2")
324
- assert_equal "11", resolve("1 + 2 * 3 + 4")
325
- end
326
-
327
- def test_functions
328
- assert_equal "#80ff80", resolve("hsl(120, 100%, 75%)")
329
- assert_equal "#81ff81", resolve("hsl(120, 100%, 75%) + #010001")
330
- end
331
-
332
- def test_operator_unit_conversion
333
- assert_equal "1.1cm", resolve("1cm + 1mm")
334
- assert_equal "true", resolve("2mm < 1cm")
335
- assert_equal "true", resolve("10mm == 1cm")
336
- assert_equal "true", resolve("1 == 1cm")
337
- assert_equal "true", resolve("1.1cm == 11mm")
338
- end
339
-
340
- def test_operations_have_options
341
- assert_equal "Options defined!", resolve("assert_options(1 + 1)")
342
- assert_equal "Options defined!", resolve("assert_options('bar' + 'baz')")
343
- end
344
-
345
- def test_slash_compiles_literally_when_left_alone
346
- assert_equal "1px/2px", resolve("1px/2px")
347
- assert_equal "1px/2px/3px/4px", resolve("1px/2px/3px/4px")
348
-
349
- assert_equal "1px/2px redpx bluepx", resolve("1px/2px redpx bluepx")
350
- assert_equal "foo 1px/2px/3px bar", resolve("foo 1px/2px/3px bar")
351
- end
352
-
353
- def test_slash_divides_with_parens
354
- assert_equal "0.5", resolve("(1px/2px)")
355
- assert_equal "0.5", resolve("(1px)/2px")
356
- assert_equal "0.5", resolve("1px/(2px)")
357
- end
358
-
359
- def test_slash_divides_with_other_arithmetic
360
- assert_equal "0.5px", resolve("1px*1px/2px")
361
- assert_equal "0.5px", resolve("1px/2px*1px")
362
- assert_equal "0.5", resolve("0+1px/2px")
363
- assert_equal "0.5", resolve("1px/2px+0")
364
- end
365
-
366
- def test_slash_divides_with_variable
367
- assert_equal "0.5", resolve("$var/2px", {}, env("var" => eval("1px")))
368
- assert_equal "0.5", resolve("1px/$var", {}, env("var" => eval("2px")))
369
- assert_equal "0.5", resolve("$var", {}, env("var" => eval("1px/2px")))
370
- end
371
-
372
- def test_colors_with_wrong_number_of_digits
373
- assert_raise_message(Sass::SyntaxError,
374
- "Colors must have either three or six digits: '#0'") {eval("#0")}
375
- assert_raise_message(Sass::SyntaxError,
376
- "Colors must have either three or six digits: '#12'") {eval("#12")}
377
- assert_raise_message(Sass::SyntaxError,
378
- "Colors must have either three or six digits: '#abcd'") {eval("#abcd")}
379
- assert_raise_message(Sass::SyntaxError,
380
- "Colors must have either three or six digits: '#abcdE'") {eval("#abcdE")}
381
- assert_raise_message(Sass::SyntaxError,
382
- "Colors must have either three or six digits: '#abcdEFA'") {eval("#abcdEFA")}
383
- end
384
-
385
- def test_case_insensitive_color_names
386
- assert_equal "blue", resolve("BLUE")
387
- assert_equal "red", resolve("rEd")
388
- assert_equal "#7f4000", resolve("mix(GrEeN, ReD)")
389
- end
390
-
391
- # Regression Tests
392
-
393
- def test_funcall_has_higher_precedence_than_color_name
394
- assert_equal "teal(12)", resolve("teal(12)")
395
- assert_equal "tealbang(12)", resolve("tealbang(12)")
396
- assert_equal "teal-bang(12)", resolve("teal-bang(12)")
397
- assert_equal "teal\\+bang(12)", resolve("teal\\+bang(12)")
398
- end
399
-
400
- def test_interpolation_after_hash
401
- assert_equal "#2", resolve('"##{1 + 1}"')
402
- end
403
-
404
- def test_misplaced_comma_in_funcall
405
- assert_raise_message(Sass::SyntaxError,
406
- 'Invalid CSS after "foo(bar, ": expected function argument, was ")"') {eval('foo(bar, )')}
407
- end
408
-
409
- def test_color_prefixed_identifier
410
- assert_equal "tealbang", resolve("tealbang")
411
- assert_equal "teal-bang", resolve("teal-bang")
412
- end
413
-
414
- def test_op_prefixed_identifier
415
- assert_equal "notbang", resolve("notbang")
416
- assert_equal "not-bang", resolve("not-bang")
417
- assert_equal "or-bang", resolve("or-bang")
418
- assert_equal "and-bang", resolve("and-bang")
419
- end
420
-
421
- private
422
-
423
- def resolve(str, opts = {}, environment = env)
424
- munge_filename opts
425
- val = eval(str, opts, environment)
426
- val.is_a?(Sass::Script::String) ? val.value : val.to_s
427
- end
428
-
429
- def assert_unquoted(str, opts = {}, environment = env)
430
- munge_filename opts
431
- val = eval(str, opts, environment)
432
- assert_kind_of Sass::Script::String, val
433
- assert_equal :identifier, val.type
434
- end
435
-
436
- def assert_quoted(str, opts = {}, environment = env)
437
- munge_filename opts
438
- val = eval(str, opts, environment)
439
- assert_kind_of Sass::Script::String, val
440
- assert_equal :string, val.type
441
- end
442
-
443
- def eval(str, opts = {}, environment = env)
444
- munge_filename opts
445
- environment.options = opts
446
- Sass::Script.parse(str, opts.delete(:line) || 1,
447
- opts.delete(:offset) || 0, opts).perform(environment)
448
- end
449
-
450
- def render(sass, options = {})
451
- munge_filename options
452
- Sass::Engine.new(sass, options).render
453
- end
454
-
455
- def env(hash = {})
456
- env = Sass::Environment.new
457
- hash.each {|k, v| env.set_var(k, v)}
458
- env
459
- end
460
-
461
- def test_number_printing
462
- assert_equal "1", eval("1")
463
- assert_equal "1", eval("1.0")
464
- assert_equal "1.121", eval("1.1214")
465
- assert_equal "1.122", eval("1.1215")
466
- assert_equal "Infinity", eval("1.0/0.0")
467
- assert_equal "-Infinity", eval("-1.0/0.0")
468
- assert_equal "NaN", eval("0.0/0.0")
469
- end
470
- end