sass 3.4.25 → 3.7.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (237) hide show
  1. checksums.yaml +4 -4
  2. data/CODE_OF_CONDUCT.md +1 -1
  3. data/CONTRIBUTING.md +3 -3
  4. data/README.md +17 -9
  5. data/VERSION +1 -1
  6. data/VERSION_DATE +1 -1
  7. data/VERSION_NAME +1 -1
  8. data/extra/sass-spec-ref.sh +9 -1
  9. data/lib/sass.rb +0 -7
  10. data/lib/sass/cache_stores/filesystem.rb +1 -1
  11. data/lib/sass/css.rb +1 -2
  12. data/lib/sass/engine.rb +39 -29
  13. data/lib/sass/environment.rb +26 -5
  14. data/lib/sass/error.rb +2 -2
  15. data/lib/sass/exec/base.rb +2 -13
  16. data/lib/sass/exec/sass_scss.rb +1 -5
  17. data/lib/sass/features.rb +1 -0
  18. data/lib/sass/importers/filesystem.rb +6 -4
  19. data/lib/sass/logger/base.rb +11 -0
  20. data/lib/sass/plugin/compiler.rb +20 -50
  21. data/lib/sass/plugin/configuration.rb +2 -2
  22. data/lib/sass/railtie.rb +1 -1
  23. data/lib/sass/script/css_parser.rb +4 -1
  24. data/lib/sass/script/functions.rb +308 -81
  25. data/lib/sass/script/lexer.rb +63 -9
  26. data/lib/sass/script/parser.rb +287 -118
  27. data/lib/sass/script/tree/funcall.rb +35 -34
  28. data/lib/sass/script/tree/interpolation.rb +0 -3
  29. data/lib/sass/script/tree/list_literal.rb +23 -8
  30. data/lib/sass/script/tree/map_literal.rb +2 -2
  31. data/lib/sass/script/tree/node.rb +0 -8
  32. data/lib/sass/script/tree/operation.rb +1 -8
  33. data/lib/sass/script/value.rb +2 -0
  34. data/lib/sass/script/value/arg_list.rb +1 -1
  35. data/lib/sass/script/value/base.rb +17 -0
  36. data/lib/sass/script/value/callable.rb +25 -0
  37. data/lib/sass/script/value/color.rb +8 -2
  38. data/lib/sass/script/value/function.rb +19 -0
  39. data/lib/sass/script/value/helpers.rb +37 -11
  40. data/lib/sass/script/value/list.rb +35 -14
  41. data/lib/sass/script/value/map.rb +2 -2
  42. data/lib/sass/script/value/number.rb +3 -2
  43. data/lib/sass/scss/css_parser.rb +6 -1
  44. data/lib/sass/scss/parser.rb +145 -56
  45. data/lib/sass/scss/rx.rb +5 -11
  46. data/lib/sass/scss/static_parser.rb +20 -42
  47. data/lib/sass/selector.rb +4 -0
  48. data/lib/sass/selector/abstract_sequence.rb +7 -6
  49. data/lib/sass/selector/comma_sequence.rb +9 -5
  50. data/lib/sass/selector/pseudo.rb +20 -3
  51. data/lib/sass/selector/sequence.rb +35 -10
  52. data/lib/sass/selector/simple.rb +9 -2
  53. data/lib/sass/selector/simple_sequence.rb +8 -4
  54. data/lib/sass/source/map.rb +2 -6
  55. data/lib/sass/stack.rb +21 -1
  56. data/lib/sass/tree/charset_node.rb +1 -1
  57. data/lib/sass/tree/prop_node.rb +45 -53
  58. data/lib/sass/tree/rule_node.rb +6 -8
  59. data/lib/sass/tree/visitors/check_nesting.rb +1 -1
  60. data/lib/sass/tree/visitors/convert.rb +2 -3
  61. data/lib/sass/tree/visitors/cssize.rb +4 -15
  62. data/lib/sass/tree/visitors/deep_copy.rb +1 -1
  63. data/lib/sass/tree/visitors/extend.rb +2 -8
  64. data/lib/sass/tree/visitors/perform.rb +23 -15
  65. data/lib/sass/tree/visitors/set_options.rb +1 -1
  66. data/lib/sass/tree/visitors/to_css.rb +49 -22
  67. data/lib/sass/util.rb +72 -310
  68. data/lib/sass/util/multibyte_string_scanner.rb +127 -131
  69. data/lib/sass/util/normalized_map.rb +1 -8
  70. data/lib/sass/version.rb +0 -4
  71. metadata +55 -202
  72. data/Rakefile +0 -453
  73. data/lib/sass/script/css_variable_warning.rb +0 -52
  74. data/lib/sass/util/cross_platform_random.rb +0 -19
  75. data/lib/sass/util/ordered_hash.rb +0 -192
  76. data/test/sass-spec.yml +0 -3
  77. data/test/sass/cache_test.rb +0 -131
  78. data/test/sass/callbacks_test.rb +0 -61
  79. data/test/sass/compiler_test.rb +0 -236
  80. data/test/sass/conversion_test.rb +0 -2188
  81. data/test/sass/css2sass_test.rb +0 -526
  82. data/test/sass/css_variable_test.rb +0 -132
  83. data/test/sass/data/hsl-rgb.txt +0 -319
  84. data/test/sass/encoding_test.rb +0 -219
  85. data/test/sass/engine_test.rb +0 -3447
  86. data/test/sass/exec_test.rb +0 -96
  87. data/test/sass/extend_test.rb +0 -1733
  88. data/test/sass/fixtures/test_staleness_check_across_importers.css +0 -1
  89. data/test/sass/fixtures/test_staleness_check_across_importers.scss +0 -1
  90. data/test/sass/functions_test.rb +0 -1977
  91. data/test/sass/importer_test.rb +0 -421
  92. data/test/sass/logger_test.rb +0 -58
  93. data/test/sass/mock_importer.rb +0 -49
  94. data/test/sass/more_results/more1.css +0 -9
  95. data/test/sass/more_results/more1_with_line_comments.css +0 -26
  96. data/test/sass/more_results/more_import.css +0 -29
  97. data/test/sass/more_templates/_more_partial.sass +0 -2
  98. data/test/sass/more_templates/more1.sass +0 -23
  99. data/test/sass/more_templates/more_import.sass +0 -11
  100. data/test/sass/plugin_test.rb +0 -556
  101. data/test/sass/results/alt.css +0 -4
  102. data/test/sass/results/basic.css +0 -9
  103. data/test/sass/results/cached_import_option.css +0 -3
  104. data/test/sass/results/compact.css +0 -5
  105. data/test/sass/results/complex.css +0 -86
  106. data/test/sass/results/compressed.css +0 -1
  107. data/test/sass/results/expanded.css +0 -19
  108. data/test/sass/results/filename_fn.css +0 -3
  109. data/test/sass/results/if.css +0 -3
  110. data/test/sass/results/import.css +0 -31
  111. data/test/sass/results/import_charset.css +0 -5
  112. data/test/sass/results/import_charset_1_8.css +0 -5
  113. data/test/sass/results/import_charset_ibm866.css +0 -5
  114. data/test/sass/results/import_content.css +0 -1
  115. data/test/sass/results/line_numbers.css +0 -49
  116. data/test/sass/results/mixins.css +0 -95
  117. data/test/sass/results/multiline.css +0 -24
  118. data/test/sass/results/nested.css +0 -22
  119. data/test/sass/results/options.css +0 -1
  120. data/test/sass/results/parent_ref.css +0 -13
  121. data/test/sass/results/script.css +0 -16
  122. data/test/sass/results/scss_import.css +0 -31
  123. data/test/sass/results/scss_importee.css +0 -2
  124. data/test/sass/results/subdir/nested_subdir/nested_subdir.css +0 -1
  125. data/test/sass/results/subdir/subdir.css +0 -3
  126. data/test/sass/results/units.css +0 -11
  127. data/test/sass/results/warn.css +0 -0
  128. data/test/sass/results/warn_imported.css +0 -0
  129. data/test/sass/script_conversion_test.rb +0 -357
  130. data/test/sass/script_test.rb +0 -1431
  131. data/test/sass/scss/css_test.rb +0 -1281
  132. data/test/sass/scss/rx_test.rb +0 -160
  133. data/test/sass/scss/scss_test.rb +0 -4205
  134. data/test/sass/scss/test_helper.rb +0 -37
  135. data/test/sass/source_map_test.rb +0 -1055
  136. data/test/sass/superselector_test.rb +0 -210
  137. data/test/sass/templates/_cached_import_option_partial.scss +0 -1
  138. data/test/sass/templates/_double_import_loop2.sass +0 -1
  139. data/test/sass/templates/_filename_fn_import.scss +0 -11
  140. data/test/sass/templates/_imported_charset_ibm866.sass +0 -4
  141. data/test/sass/templates/_imported_charset_utf8.sass +0 -4
  142. data/test/sass/templates/_imported_content.sass +0 -3
  143. data/test/sass/templates/_partial.sass +0 -2
  144. data/test/sass/templates/_same_name_different_partiality.scss +0 -1
  145. data/test/sass/templates/alt.sass +0 -16
  146. data/test/sass/templates/basic.sass +0 -23
  147. data/test/sass/templates/bork1.sass +0 -2
  148. data/test/sass/templates/bork2.sass +0 -2
  149. data/test/sass/templates/bork3.sass +0 -2
  150. data/test/sass/templates/bork4.sass +0 -2
  151. data/test/sass/templates/bork5.sass +0 -3
  152. data/test/sass/templates/cached_import_option.scss +0 -3
  153. data/test/sass/templates/compact.sass +0 -17
  154. data/test/sass/templates/complex.sass +0 -305
  155. data/test/sass/templates/compressed.sass +0 -15
  156. data/test/sass/templates/double_import_loop1.sass +0 -1
  157. data/test/sass/templates/expanded.sass +0 -17
  158. data/test/sass/templates/filename_fn.scss +0 -18
  159. data/test/sass/templates/if.sass +0 -11
  160. data/test/sass/templates/import.sass +0 -12
  161. data/test/sass/templates/import_charset.sass +0 -9
  162. data/test/sass/templates/import_charset_1_8.sass +0 -6
  163. data/test/sass/templates/import_charset_ibm866.sass +0 -11
  164. data/test/sass/templates/import_content.sass +0 -4
  165. data/test/sass/templates/importee.less +0 -2
  166. data/test/sass/templates/importee.sass +0 -19
  167. data/test/sass/templates/line_numbers.sass +0 -13
  168. data/test/sass/templates/mixin_bork.sass +0 -5
  169. data/test/sass/templates/mixins.sass +0 -76
  170. data/test/sass/templates/multiline.sass +0 -20
  171. data/test/sass/templates/nested.sass +0 -25
  172. data/test/sass/templates/nested_bork1.sass +0 -2
  173. data/test/sass/templates/nested_bork2.sass +0 -2
  174. data/test/sass/templates/nested_bork3.sass +0 -2
  175. data/test/sass/templates/nested_bork4.sass +0 -2
  176. data/test/sass/templates/nested_import.sass +0 -2
  177. data/test/sass/templates/nested_mixin_bork.sass +0 -6
  178. data/test/sass/templates/options.sass +0 -2
  179. data/test/sass/templates/parent_ref.sass +0 -25
  180. data/test/sass/templates/same_name_different_ext.sass +0 -2
  181. data/test/sass/templates/same_name_different_ext.scss +0 -1
  182. data/test/sass/templates/same_name_different_partiality.scss +0 -1
  183. data/test/sass/templates/script.sass +0 -101
  184. data/test/sass/templates/scss_import.scss +0 -12
  185. data/test/sass/templates/scss_importee.scss +0 -1
  186. data/test/sass/templates/single_import_loop.sass +0 -1
  187. data/test/sass/templates/subdir/import_up1.scss +0 -1
  188. data/test/sass/templates/subdir/import_up2.scss +0 -1
  189. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +0 -2
  190. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +0 -3
  191. data/test/sass/templates/subdir/subdir.sass +0 -6
  192. data/test/sass/templates/units.sass +0 -11
  193. data/test/sass/templates/warn.sass +0 -3
  194. data/test/sass/templates/warn_imported.sass +0 -4
  195. data/test/sass/test_helper.rb +0 -8
  196. data/test/sass/util/multibyte_string_scanner_test.rb +0 -155
  197. data/test/sass/util/normalized_map_test.rb +0 -51
  198. data/test/sass/util/subset_map_test.rb +0 -91
  199. data/test/sass/util_test.rb +0 -438
  200. data/test/sass/value_helpers_test.rb +0 -179
  201. data/test/test_helper.rb +0 -110
  202. data/vendor/listen/CHANGELOG.md +0 -1
  203. data/vendor/listen/CONTRIBUTING.md +0 -38
  204. data/vendor/listen/Gemfile +0 -20
  205. data/vendor/listen/Guardfile +0 -8
  206. data/vendor/listen/LICENSE +0 -20
  207. data/vendor/listen/README.md +0 -349
  208. data/vendor/listen/Rakefile +0 -5
  209. data/vendor/listen/Vagrantfile +0 -96
  210. data/vendor/listen/lib/listen.rb +0 -54
  211. data/vendor/listen/lib/listen/adapter.rb +0 -327
  212. data/vendor/listen/lib/listen/adapters/bsd.rb +0 -75
  213. data/vendor/listen/lib/listen/adapters/darwin.rb +0 -48
  214. data/vendor/listen/lib/listen/adapters/linux.rb +0 -81
  215. data/vendor/listen/lib/listen/adapters/polling.rb +0 -58
  216. data/vendor/listen/lib/listen/adapters/windows.rb +0 -91
  217. data/vendor/listen/lib/listen/directory_record.rb +0 -406
  218. data/vendor/listen/lib/listen/listener.rb +0 -323
  219. data/vendor/listen/lib/listen/turnstile.rb +0 -32
  220. data/vendor/listen/lib/listen/version.rb +0 -3
  221. data/vendor/listen/listen.gemspec +0 -28
  222. data/vendor/listen/spec/listen/adapter_spec.rb +0 -149
  223. data/vendor/listen/spec/listen/adapters/bsd_spec.rb +0 -36
  224. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +0 -37
  225. data/vendor/listen/spec/listen/adapters/linux_spec.rb +0 -47
  226. data/vendor/listen/spec/listen/adapters/polling_spec.rb +0 -68
  227. data/vendor/listen/spec/listen/adapters/windows_spec.rb +0 -30
  228. data/vendor/listen/spec/listen/directory_record_spec.rb +0 -1250
  229. data/vendor/listen/spec/listen/listener_spec.rb +0 -258
  230. data/vendor/listen/spec/listen/turnstile_spec.rb +0 -56
  231. data/vendor/listen/spec/listen_spec.rb +0 -67
  232. data/vendor/listen/spec/spec_helper.rb +0 -25
  233. data/vendor/listen/spec/support/adapter_helper.rb +0 -666
  234. data/vendor/listen/spec/support/directory_record_helper.rb +0 -57
  235. data/vendor/listen/spec/support/fixtures_helper.rb +0 -29
  236. data/vendor/listen/spec/support/listeners_helper.rb +0 -179
  237. data/vendor/listen/spec/support/platform_helper.rb +0 -15
@@ -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.66667%;
5
- many-units: 32em;
6
- mm: 15mm;
7
- pc: 2pc;
8
- pt: -72pt;
9
- inches: 2in;
10
- more-inches: 3.5in;
11
- mixed: 2.04167in; }
File without changes
File without changes
@@ -1,357 +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 < MiniTest::Test
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
- assert_renders "#abc"
17
- assert_renders "#0000ff"
18
- end
19
-
20
- def test_number
21
- assert_renders "10"
22
- assert_renders "10.35"
23
- assert_renders "12px"
24
- assert_renders "12.45px"
25
-
26
- assert_equal "12.34568", render("12.345678901")
27
- end
28
-
29
- def test_string
30
- assert_renders '"foo"'
31
- assert_renders '"bar baz"'
32
- assert_equal '"baz bang"', render("'baz bang'")
33
- end
34
-
35
- def test_string_quotes
36
- assert_equal "'quote\"quote'", render('"quote\\"quote"')
37
- assert_equal '"quote\'quote"', render("'quote\\'quote'")
38
- assert_renders '"quote\'quote\\"quote"'
39
- assert_equal '"quote\'quote\\"quote"', render("'quote\\'quote\"quote'")
40
- end
41
-
42
- def test_string_escapes
43
- assert_renders '"foo\\\\bar"'
44
- end
45
-
46
- def test_funcall
47
- assert_renders "foo(true, blue)"
48
- assert_renders "hsla(20deg, 30%, 50%, 0.3)"
49
- assert_renders "blam()"
50
-
51
- assert_renders "-\xC3\xBFoo(12px)"
52
- assert_renders "-foo(12px)"
53
- end
54
-
55
- def test_funcall_with_keyword_args
56
- assert_renders "foo(arg1, arg2, $karg1: val, $karg2: val2)"
57
- assert_renders "foo($karg1: val, $karg2: val2)"
58
- end
59
-
60
- def test_funcall_with_hyphen_conversion_keyword_arg
61
- assert_renders "foo($a-b_c: val)"
62
- end
63
-
64
- def test_url
65
- assert_renders "url(foo.gif)"
66
- assert_renders "url($var)"
67
- assert_renders "url(\#{$var}/flip.gif)"
68
- end
69
-
70
- def test_variable
71
- assert_renders "$foo-bar"
72
- assert_renders "$flaznicate"
73
- end
74
-
75
- def test_null
76
- assert_renders "null"
77
- end
78
-
79
- def test_space_list
80
- assert_renders "foo bar baz"
81
- assert_renders "foo (bar baz) bip"
82
- assert_renders "foo (bar, baz) bip"
83
- end
84
-
85
- def test_comma_list
86
- assert_renders "foo, bar, baz"
87
- assert_renders "foo, (bar, baz), bip"
88
- assert_renders "foo, bar baz, bip"
89
- end
90
-
91
- def test_space_list_adds_parens_for_clarity
92
- assert_renders "(1 + 1) (2 / 4) (3 * 5)"
93
- end
94
-
95
- def test_comma_list_doesnt_add_parens
96
- assert_renders "1 + 1, 2 / 4, 3 * 5"
97
- end
98
-
99
- def test_empty_list
100
- assert_renders "()"
101
- end
102
-
103
- def test_list_in_args
104
- assert_renders "foo((a, b, c))"
105
- assert_renders "foo($arg: (a, b, c))"
106
- assert_renders "foo(a, b, (a, b, c)...)"
107
- end
108
-
109
- def test_singleton_list
110
- assert_renders "(1,)"
111
- assert_renders "(1 2 3,)"
112
- assert_renders "((1, 2, 3),)"
113
- end
114
-
115
- def test_map
116
- assert_renders "(foo: bar)"
117
- assert_renders "(foo: bar, baz: bip)"
118
- assert_renders "(foo: bar, baz: (bip: bap))"
119
- end
120
-
121
- def test_map_in_list
122
- assert_renders "(foo: bar) baz"
123
- assert_renders "(foo: bar), (baz: bip)"
124
- end
125
-
126
- def test_list_in_map
127
- assert_renders "(foo: bar baz)"
128
- assert_renders "(foo: (bar, baz), bip: bop)"
129
- end
130
-
131
- def test_selector
132
- assert_renders "&"
133
- end
134
-
135
- def self.test_precedence(outer, inner)
136
- op_outer = Sass::Script::Lexer::OPERATORS_REVERSE[outer]
137
- op_inner = Sass::Script::Lexer::OPERATORS_REVERSE[inner]
138
- class_eval <<RUBY
139
- def test_precedence_#{outer}_#{inner}
140
- assert_renders "$foo #{op_outer} $bar #{op_inner} $baz"
141
- assert_renders "$foo #{op_inner} $bar #{op_outer} $baz"
142
-
143
- assert_renders "($foo #{op_outer} $bar) #{op_inner} $baz"
144
- assert_renders "$foo #{op_inner} ($bar #{op_outer} $baz)"
145
-
146
- assert_equal "$foo #{op_outer} $bar #{op_inner} $baz",
147
- render("$foo #{op_outer} ($bar #{op_inner} $baz)")
148
- assert_equal "$foo #{op_inner} $bar #{op_outer} $baz",
149
- render("($foo #{op_inner} $bar) #{op_outer} $baz")
150
- end
151
- RUBY
152
- end
153
-
154
- def self.assert_associative(op_name, sibling_name)
155
- op = separator_for(op_name)
156
- sibling = separator_for(sibling_name)
157
- class_eval <<RUBY
158
- def test_associative_#{op_name}_#{sibling_name}
159
- assert_renders "$foo#{op}$bar#{op}$baz"
160
-
161
- assert_equal "$foo#{op}$bar#{op}$baz",
162
- render("$foo#{op}($bar#{op}$baz)")
163
- assert_equal "$foo#{op}$bar#{op}$baz",
164
- render("($foo#{op}$bar)#{op}$baz")
165
-
166
- assert_equal "$foo#{op}$bar#{sibling}$baz",
167
- render("$foo#{op}($bar#{sibling}$baz)")
168
- assert_equal "$foo#{sibling}$bar#{op}$baz",
169
- render("($foo#{sibling}$bar)#{op}$baz")
170
- end
171
- RUBY
172
- end
173
-
174
- def self.separator_for(op_name)
175
- case op_name
176
- when :comma; ", "
177
- when :space; " "
178
- else; " #{Sass::Script::Lexer::OPERATORS_REVERSE[op_name]} "
179
- end
180
- end
181
-
182
- def self.assert_non_associative(op_name, sibling_name)
183
- op = Sass::Script::Lexer::OPERATORS_REVERSE[op_name]
184
- sibling = Sass::Script::Lexer::OPERATORS_REVERSE[sibling_name]
185
- class_eval <<RUBY
186
- def test_non_associative_#{op_name}_#{sibling_name}
187
- assert_renders "$foo #{op} $bar #{op} $baz"
188
-
189
- assert_renders "$foo #{op} ($bar #{op} $baz)"
190
- assert_equal "$foo #{op} $bar #{op} $baz",
191
- render("($foo #{op} $bar) #{op} $baz")
192
-
193
- assert_renders "$foo #{op} ($bar #{sibling} $baz)"
194
- assert_equal "$foo #{sibling} $bar #{op} $baz",
195
- render("($foo #{sibling} $bar) #{op} $baz")
196
- end
197
- RUBY
198
- end
199
-
200
- test_precedence :or, :and
201
- test_precedence :and, :eq
202
- test_precedence :and, :neq
203
- test_precedence :eq, :gt
204
- test_precedence :eq, :gte
205
- test_precedence :eq, :lt
206
- test_precedence :eq, :lte
207
- test_precedence :gt, :plus
208
- test_precedence :gt, :minus
209
- test_precedence :plus, :times
210
- test_precedence :plus, :div
211
- test_precedence :plus, :mod
212
-
213
- assert_associative :plus, :minus
214
- assert_associative :times, :div
215
- assert_associative :times, :mod
216
-
217
- assert_non_associative :minus, :plus
218
- assert_non_associative :div, :times
219
- assert_non_associative :mod, :times
220
- assert_non_associative :gt, :gte
221
- assert_non_associative :gte, :lt
222
- assert_non_associative :lt, :lte
223
- assert_non_associative :lte, :gt
224
-
225
- def test_comma_precedence
226
- assert_renders "$foo, $bar, $baz"
227
-
228
- assert_renders "$foo ($bar, $baz)"
229
- assert_renders "($foo, $bar) $baz"
230
-
231
- assert_equal "$foo, $bar $baz", render("$foo, ($bar $baz)")
232
- assert_equal "$foo $bar, $baz", render("($foo $bar), $baz")
233
-
234
- assert_equal "$foo, ($bar, $baz)", render("$foo, ($bar, $baz)")
235
- assert_equal "($foo, $bar), $baz", render("($foo, $bar), $baz")
236
- end
237
-
238
- def test_space_precedence
239
- assert_renders "$foo $bar $baz"
240
-
241
- assert_renders "$foo or ($bar $baz)"
242
- assert_renders "($foo $bar) or $baz"
243
-
244
- assert_renders "$foo ($bar or $baz)"
245
- assert_renders "($foo or $bar) $baz"
246
-
247
- assert_equal "$foo ($bar $baz)", render("$foo ($bar $baz)")
248
- assert_equal "($foo $bar) $baz", render("($foo $bar) $baz")
249
- end
250
-
251
- def test_unary_op
252
- assert_renders "-12px"
253
- assert_renders '/"foo"'
254
- assert_renders 'not true'
255
-
256
- assert_renders "-(foo(12px))"
257
- assert_renders "-(-foo(12px))"
258
- assert_renders "-(_foo(12px))"
259
- assert_renders "-(\xC3\xBFoo(12px))"
260
- assert_renders "-(blue)"
261
-
262
- assert_equal 'not true or false', render('(not true) or false')
263
- assert_equal 'not (true or false)', render('not (true or false)')
264
- end
265
-
266
- def test_interpolation
267
- assert_equal 'unquote("#{$foo}#{$bar}#{$baz}")', render("$foo\#{$bar}$baz")
268
- assert_equal 'unquote("#{$foo}#{$bar} #{$baz}")', render("$foo\#{$bar} $baz")
269
- assert_equal 'unquote("#{$foo} #{$bar}#{$baz}")', render("$foo \#{$bar}$baz")
270
- assert_renders "$foo \#{$bar} $baz"
271
- assert_renders "$foo \#{$bar}\#{$bang} $baz"
272
- assert_renders "$foo \#{$bar} \#{$bang} $baz"
273
- assert_equal 'unquote("#{$bar}#{$baz}")', render("\#{$bar}$baz")
274
- assert_equal 'unquote("#{$foo}#{$bar}")', render("$foo\#{$bar}")
275
- assert_renders "\#{$bar}"
276
- end
277
-
278
- def test_interpolation_in_function
279
- assert_renders 'flabnabbit(#{1 + "foo"})'
280
- assert_equal 'flabnabbit(unquote("#{$foo} #{1 + "foo"}#{$baz}"))',
281
- render('flabnabbit($foo #{1 + "foo"}$baz)')
282
- assert_renders 'flabnabbit($foo #{1 + "foo"}#{2 + "bar"} $baz)'
283
- end
284
-
285
- def test_interpolation_in_string_function
286
- assert_renders 'calc(#{1 + "foo"})'
287
- assert_renders 'calc(foo#{1 + "foo"}baz)'
288
- end
289
-
290
- def test_interpolation_near_operators
291
- assert_renders '#{1 + 2} , #{3 + 4}'
292
- assert_renders '#{1 + 2}, #{3 + 4}'
293
- assert_renders '#{1 + 2} ,#{3 + 4}'
294
- assert_renders '#{1 + 2},#{3 + 4}'
295
- assert_renders '#{1 + 2}, #{3 + 4}, #{5 + 6}'
296
- assert_renders '3, #{3 + 4}, 11'
297
-
298
- assert_renders '3 / #{3 + 4}'
299
- assert_renders '3 /#{3 + 4}'
300
- assert_renders '3/ #{3 + 4}'
301
- assert_renders '3/#{3 + 4}'
302
-
303
- assert_equal 'unquote("#{1 + 2} * 7")', render('#{1 + 2} * 7')
304
- assert_equal 'unquote("#{1 + 2}* 7")', render('#{1 + 2}* 7')
305
- assert_equal 'unquote("#{1 + 2} *7")', render('#{1 + 2} *7')
306
- assert_equal 'unquote("#{1 + 2}*7")', render('#{1 + 2}*7')
307
-
308
- assert_renders '-#{1 + 2}'
309
- assert_equal 'unquote("- #{1 + 2}")', render('- #{1 + 2}')
310
-
311
- assert_equal 'unquote("5 + #{1 + 2} * #{3 + 4}")', render('5 + #{1 + 2} * #{3 + 4}')
312
- assert_equal 'unquote("5 +#{1 + 2} * #{3 + 4}")', render('5 +#{1 + 2} * #{3 + 4}')
313
- assert_equal 'unquote("5+#{1 + 2} * #{3 + 4}")', render('5+#{1 + 2} * #{3 + 4}')
314
- assert_equal 'unquote("#{1 + 2} * #{3 + 4} + 5")', render('#{1 + 2} * #{3 + 4} + 5')
315
- assert_equal 'unquote("#{1 + 2} * #{3 + 4}+ 5")', render('#{1 + 2} * #{3 + 4}+ 5')
316
- assert_equal 'unquote("#{1 + 2} * #{3 + 4}+5")', render('#{1 + 2} * #{3 + 4}+5')
317
-
318
- assert_equal '5 / unquote("#{1 + 2} + #{3 + 4}")', render('5 / (#{1 + 2} + #{3 + 4})')
319
- assert_equal '5 / unquote("#{1 + 2} + #{3 + 4}")', render('5 /(#{1 + 2} + #{3 + 4})')
320
- assert_equal '5 / unquote("#{1 + 2} + #{3 + 4}")', render('5 /( #{1 + 2} + #{3 + 4} )')
321
- assert_equal 'unquote("#{1 + 2} + #{3 + 4}") / 5', render('(#{1 + 2} + #{3 + 4}) / 5')
322
- assert_equal 'unquote("#{1 + 2} + #{3 + 4}") / 5', render('(#{1 + 2} + #{3 + 4})/ 5')
323
- assert_equal 'unquote("#{1 + 2} + #{3 + 4}") / 5', render('( #{1 + 2} + #{3 + 4} )/ 5')
324
-
325
- assert_equal 'unquote("#{1 + 2} + #{2 + 3}")', render('#{1 + 2} + 2 + 3')
326
- assert_equal 'unquote("#{1 + 2} +#{2 + 3}")', render('#{1 + 2} +2 + 3')
327
- end
328
-
329
- def test_string_interpolation
330
- assert_renders '"foo#{$bar}baz"'
331
- assert_renders '"foo #{$bar}baz"'
332
- assert_renders '"foo#{$bar} baz"'
333
- assert_renders '"foo #{$bar} baz"'
334
- assert_renders '"foo #{$bar}#{$bang} baz"'
335
- assert_renders '"foo #{$bar} #{$bang} baz"'
336
- assert_renders '"#{$bar}baz"'
337
- assert_renders '"foo#{$bar}"'
338
- assert_renders '"#{$bar}"'
339
-
340
- assert_renders "'\"\#{\"bar\"}\"'"
341
- assert_renders '"\#{bar}"'
342
-
343
- assert_equal '"foo#{$bar}baz"', render("'foo\#{$bar}baz'")
344
- end
345
-
346
- private
347
-
348
- def assert_renders(script, options = {})
349
- assert_equal(script, render(script, options))
350
- end
351
-
352
- def render(script, options = {})
353
- munge_filename(options)
354
- node = Sass::Script.parse(script, 1, 0, options.merge(:_convert => true))
355
- node.to_sass
356
- end
357
- end
@@ -1,1431 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*- coding: utf-8 -*-
3
- require File.dirname(__FILE__) + '/../test_helper'
4
- require 'sass/engine'
5
-
6
- module Sass::Script::Functions::UserFunctions
7
- def assert_options(val)
8
- val.options[:foo]
9
- Sass::Script::Value::String.new("Options defined!")
10
- end
11
-
12
- def arg_error
13
- assert_options
14
- end
15
- end
16
-
17
- module Sass::Script::Functions
18
- include Sass::Script::Functions::UserFunctions
19
- end
20
-
21
- class SassScriptTest < MiniTest::Test
22
- include Sass::Script
23
-
24
- def test_color_clamps_input
25
- assert_equal 0, Sass::Script::Value::Color.new([1, 2, -1]).blue
26
- assert_equal 255, Sass::Script::Value::Color.new([256, 2, 3]).red
27
- end
28
-
29
- def test_color_clamps_rgba_input
30
- assert_equal 1, Sass::Script::Value::Color.new([1, 2, 3, 1.1]).alpha
31
- assert_equal 0, Sass::Script::Value::Color.new([1, 2, 3, -0.1]).alpha
32
- end
33
-
34
- def test_color_from_hex
35
- assert_equal Sass::Script::Value::Color.new([0,0,0]), Sass::Script::Value::Color.from_hex('000000')
36
- assert_equal Sass::Script::Value::Color.new([0,0,0]), Sass::Script::Value::Color.from_hex('#000000')
37
- end
38
-
39
- def test_string_escapes
40
- assert_equal "'", resolve("\"'\"")
41
- assert_equal '"', resolve("\"\\\"\"")
42
- assert_equal "\\", resolve("\"\\\\\"")
43
- assert_equal "☃", resolve("\"\\2603\"")
44
- assert_equal "☃f", resolve("\"\\2603 f\"")
45
- assert_equal "☃x", resolve("\"\\2603x\"")
46
- assert_equal "\\2603", resolve("\"\\\\2603\"")
47
- assert_equal "\#{foo}", resolve("\"\\\#{foo}\"")
48
-
49
- # U+FFFD is the replacement character, "�".
50
- assert_equal [0xFFFD].pack("U"), resolve("\"\\0\"")
51
- assert_equal [0xFFFD].pack("U"), resolve("\"\\FFFFFF\"")
52
- assert_equal [0xFFFD].pack("U"), resolve("\"\\D800\"")
53
- assert_equal [0xD7FF].pack("U"), resolve("\"\\D7FF\"")
54
- assert_equal [0xFFFD].pack("U"), resolve("\"\\DFFF\"")
55
- assert_equal [0xE000].pack("U"), resolve("\"\\E000\"")
56
- end
57
-
58
- def test_string_escapes_are_resolved_before_operators
59
- assert_equal "true", resolve('"abc" == "\61\62\63"')
60
- end
61
-
62
- def test_string_quote
63
- assert_equal '"foo"', resolve_quoted('"foo"')
64
- assert_equal "'f\"oo'", resolve_quoted('"f\"oo"')
65
- assert_equal "\"f'oo\"", resolve_quoted("'f\\'oo'")
66
- assert_equal "\"f'o\\\"o\"", resolve_quoted("'f\\'o\"o'")
67
- assert_equal '"foo bar"', resolve_quoted('"foo\20 bar"')
68
- assert_equal '"foo\a bar"', resolve_quoted('"foo\a bar"')
69
- assert_equal '"x\ay"', resolve_quoted('"x\a y"')
70
- assert_equal '"\a "', resolve_quoted('"\a\20"')
71
- assert_equal '"\a abcdef"', resolve_quoted('"\a abcdef"')
72
- assert_equal '"☃abcdef"', resolve_quoted('"\2603 abcdef"')
73
- assert_equal '"\\\\"', resolve_quoted('"\\\\"')
74
- assert_equal '"foobar"', resolve_quoted("\"foo\\\nbar\"")
75
- assert_equal '"#{foo}"', resolve_quoted("\"\\\#{foo}\"")
76
- end
77
-
78
- def test_color_names
79
- assert_equal "white", resolve("white")
80
- assert_equal "#ffffff", resolve("#ffffff")
81
- silence_warnings {assert_equal "#fffffe", resolve("white - #000001")}
82
- assert_equal "transparent", resolve("transparent")
83
- assert_equal "transparent", resolve("rgba(0, 0, 0, 0)")
84
- end
85
-
86
- def test_rgba_color_literals
87
- assert_equal Sass::Script::Value::Color.new([1, 2, 3, 0.75]), eval("rgba(1, 2, 3, 0.75)")
88
- assert_equal "rgba(1, 2, 3, 0.75)", resolve("rgba(1, 2, 3, 0.75)")
89
-
90
- assert_equal Sass::Script::Value::Color.new([1, 2, 3, 0]), eval("rgba(1, 2, 3, 0)")
91
- assert_equal "rgba(1, 2, 3, 0)", resolve("rgba(1, 2, 3, 0)")
92
-
93
- assert_equal Sass::Script::Value::Color.new([1, 2, 3]), eval("rgba(1, 2, 3, 1)")
94
- assert_equal Sass::Script::Value::Color.new([1, 2, 3, 1]), eval("rgba(1, 2, 3, 1)")
95
- assert_equal "#010203", resolve("rgba(1, 2, 3, 1)")
96
- assert_equal "white", resolve("rgba(255, 255, 255, 1)")
97
- end
98
-
99
- def test_rgba_color_math
100
- silence_warnings {assert_equal "rgba(50, 50, 100, 0.35)", resolve("rgba(1, 1, 2, 0.35) * rgba(50, 50, 50, 0.35)")}
101
- silence_warnings {assert_equal "rgba(52, 52, 52, 0.25)", resolve("rgba(2, 2, 2, 0.25) + rgba(50, 50, 50, 0.25)")}
102
-
103
- assert_raise_message(Sass::SyntaxError, "Alpha channels must be equal: rgba(1, 2, 3, 0.15) + rgba(50, 50, 50, 0.75)") do
104
- silence_warnings {resolve("rgba(1, 2, 3, 0.15) + rgba(50, 50, 50, 0.75)")}
105
- end
106
- assert_raise_message(Sass::SyntaxError, "Alpha channels must be equal: #123456 * rgba(50, 50, 50, 0.75)") do
107
- silence_warnings {resolve("#123456 * rgba(50, 50, 50, 0.75)")}
108
- end
109
- assert_raise_message(Sass::SyntaxError, "Alpha channels must be equal: rgba(50, 50, 50, 0.75) / #123456") do
110
- silence_warnings {resolve("rgba(50, 50, 50, 0.75) / #123456")}
111
- end
112
- end
113
-
114
- def test_rgba_number_math
115
- silence_warnings {assert_equal "rgba(49, 49, 49, 0.75)", resolve("rgba(50, 50, 50, 0.75) - 1")}
116
- silence_warnings {assert_equal "rgba(100, 100, 100, 0.75)", resolve("rgba(50, 50, 50, 0.75) * 2")}
117
- end
118
-
119
- def test_rgba_rounding
120
- assert_equal "rgba(10, 1, 0, 0.12346)", resolve("rgba(10.0, 1.23456789, 0.0, 0.1234567)")
121
- end
122
-
123
- def test_rgb_calc
124
- assert_equal "rgb(calc(255 - 5), 0, 0)", resolve("rgb(calc(255 - 5), 0, 0)")
125
- end
126
-
127
- def test_rgba_calc
128
- assert_equal "rgba(calc(255 - 5), 0, 0, 0.1)",
129
- resolve("rgba(calc(255 - 5), 0, 0, 0.1)")
130
- assert_equal "rgba(127, 0, 0, calc(0.1 + 0.5))",
131
- resolve("rgba(127, 0, 0, calc(0.1 + 0.5))")
132
- end
133
-
134
- def test_rgba_shorthand_calc
135
- assert_equal "rgba(255, 0, 0, calc(0.1 + 0.5))",
136
- resolve("rgba(red, calc(0.1 + 0.5))")
137
- end
138
-
139
- def test_hsl_calc
140
- assert_equal "hsl(calc(360 * 5 / 6), 50%, 50%)", resolve("hsl(calc(360 * 5 / 6), 50%, 50%)")
141
- end
142
-
143
- def test_hsla_calc
144
- assert_equal "hsla(calc(360 * 5 / 6), 50%, 50%, 0.1)",
145
- resolve("hsla(calc(360 * 5 / 6), 50%, 50%, 0.1)")
146
- assert_equal "hsla(270, 50%, 50%, calc(0.1 + 0.1))",
147
- resolve("hsla(270, 50%, 50%, calc(0.1 + 0.1))")
148
- end
149
-
150
- def test_compressed_colors
151
- assert_equal "#123456", resolve("#123456", :style => :compressed)
152
- assert_equal "rgba(1,2,3,0.5)", resolve("rgba(1, 2, 3, 0.5)", :style => :compressed)
153
- assert_equal "#123", resolve("#112233", :style => :compressed)
154
- assert_equal "#000", resolve("black", :style => :compressed)
155
- assert_equal "red", resolve("#f00", :style => :compressed)
156
- assert_equal "blue", resolve("blue", :style => :compressed)
157
- assert_equal "navy", resolve("#000080", :style => :compressed)
158
- assert_equal "navy #fff", resolve("#000080 white", :style => :compressed)
159
- assert_equal "This color is #fff", resolve('"This color is #{ white }"', :style => :compressed)
160
- assert_equal "transparent", resolve("rgba(0, 0, 0, 0)", :style => :compressed)
161
- end
162
-
163
- def test_compressed_comma
164
- # assert_equal "foo,bar,baz", resolve("foo, bar, baz", :style => :compressed)
165
- # assert_equal "foo,#baf,baz", resolve("foo, #baf, baz", :style => :compressed)
166
- assert_equal "foo,#baf,red", resolve("foo, #baf, #f00", :style => :compressed)
167
- end
168
-
169
- def test_implicit_strings
170
- assert_equal Sass::Script::Value::String.new("foo"), eval("foo")
171
- assert_equal Sass::Script::Value::String.new("foo/bar"), eval("foo/bar")
172
- end
173
-
174
- def test_basic_interpolation
175
- assert_equal "foo3bar", resolve("foo\#{1 + 2}bar")
176
- assert_equal "foo3 bar", resolve("foo\#{1 + 2} bar")
177
- assert_equal "foo 3bar", resolve("foo \#{1 + 2}bar")
178
- assert_equal "foo 3 bar", resolve("foo \#{1 + 2} bar")
179
- assert_equal "foo 35 bar", resolve("foo \#{1 + 2}\#{2 + 3} bar")
180
- assert_equal "foo 3 5 bar", resolve("foo \#{1 + 2} \#{2 + 3} bar")
181
- assert_equal "3bar", resolve("\#{1 + 2}bar")
182
- assert_equal "foo3", resolve("foo\#{1 + 2}")
183
- assert_equal "3", resolve("\#{1 + 2}")
184
- end
185
-
186
- def test_interpolation_in_function
187
- assert_equal 'flabnabbit(1foo)', resolve('flabnabbit(#{1 + "foo"})')
188
- assert_equal 'flabnabbit(foo 1foobaz)', resolve('flabnabbit(foo #{1 + "foo"}baz)')
189
- assert_equal('flabnabbit(foo 1foo2bar baz)',
190
- resolve('flabnabbit(foo #{1 + "foo"}#{2 + "bar"} baz)'))
191
- end
192
-
193
- def test_interpolation_near_operators
194
- silence_warnings do
195
- assert_equal '3 , 7', resolve('#{1 + 2} , #{3 + 4}')
196
- assert_equal '3, 7', resolve('#{1 + 2}, #{3 + 4}')
197
- assert_equal '3 ,7', resolve('#{1 + 2} ,#{3 + 4}')
198
- assert_equal '3,7', resolve('#{1 + 2},#{3 + 4}')
199
- assert_equal '3, 7, 11', resolve('#{1 + 2}, #{3 + 4}, #{5 + 6}')
200
- assert_equal '3, 7, 11', resolve('3, #{3 + 4}, 11')
201
- assert_equal '3, 7, 11', resolve('3, 7, #{5 + 6}')
202
-
203
- assert_equal '3 / 7', resolve('3 / #{3 + 4}')
204
- assert_equal '3 /7', resolve('3 /#{3 + 4}')
205
- assert_equal '3/ 7', resolve('3/ #{3 + 4}')
206
- assert_equal '3/7', resolve('3/#{3 + 4}')
207
-
208
- assert_equal '3 * 7', resolve('#{1 + 2} * 7')
209
- assert_equal '3* 7', resolve('#{1 + 2}* 7')
210
- assert_equal '3 *7', resolve('#{1 + 2} *7')
211
- assert_equal '3*7', resolve('#{1 + 2}*7')
212
-
213
- assert_equal '-3', resolve('-#{1 + 2}')
214
- assert_equal '- 3', resolve('- #{1 + 2}')
215
-
216
- assert_equal '5 + 3 * 7', resolve('5 + #{1 + 2} * #{3 + 4}')
217
- assert_equal '5 +3 * 7', resolve('5 +#{1 + 2} * #{3 + 4}')
218
- assert_equal '5+3 * 7', resolve('5+#{1 + 2} * #{3 + 4}')
219
- assert_equal '3 * 7 + 5', resolve('#{1 + 2} * #{3 + 4} + 5')
220
- assert_equal '3 * 7+ 5', resolve('#{1 + 2} * #{3 + 4}+ 5')
221
- assert_equal '3 * 7+5', resolve('#{1 + 2} * #{3 + 4}+5')
222
-
223
- assert_equal '5/3 + 7', resolve('5 / (#{1 + 2} + #{3 + 4})')
224
- assert_equal '5/3 + 7', resolve('5 /(#{1 + 2} + #{3 + 4})')
225
- assert_equal '5/3 + 7', resolve('5 /( #{1 + 2} + #{3 + 4} )')
226
- assert_equal '3 + 7/5', resolve('(#{1 + 2} + #{3 + 4}) / 5')
227
- assert_equal '3 + 7/5', resolve('(#{1 + 2} + #{3 + 4})/ 5')
228
- assert_equal '3 + 7/5', resolve('( #{1 + 2} + #{3 + 4} )/ 5')
229
-
230
- assert_equal '3 + 5', resolve('#{1 + 2} + 2 + 3')
231
- assert_equal '3 +5', resolve('#{1 + 2} +2 + 3')
232
- end
233
- end
234
-
235
- def test_string_interpolation
236
- assert_equal "foo bar, baz bang", resolve('"foo #{"bar"}, #{"baz"} bang"')
237
- assert_equal "foo bar baz bang", resolve('"foo #{"#{"ba" + "r"} baz"} bang"')
238
- assert_equal 'foo #{bar baz} bang', resolve('"foo \#{#{"ba" + "r"} baz} bang"')
239
- assert_equal 'foo #{baz bang', resolve('"foo #{"\#{" + "baz"} bang"')
240
- assert_equal "foo2bar", resolve('\'foo#{1 + 1}bar\'')
241
- assert_equal "foo2bar", resolve('"foo#{1 + 1}bar"')
242
- assert_equal "foo1bar5baz4bang", resolve('\'foo#{1 + "bar#{2 + 3}baz" + 4}bang\'')
243
- end
244
-
245
- def test_interpolation_in_interpolation
246
- assert_equal 'foo', resolve('#{#{foo}}')
247
- assert_equal 'foo', resolve('"#{#{foo}}"')
248
- assert_equal 'foo', resolve('#{"#{foo}"}')
249
- assert_equal 'foo', resolve('"#{"#{foo}"}"')
250
- end
251
-
252
- def test_interpolation_with_newline
253
- assert_equal "\nbang", resolve('"#{"\a "}bang"')
254
- assert_equal "\n\nbang", resolve('"#{"\a "}\a bang"')
255
- end
256
-
257
- def test_rule_interpolation
258
- assert_equal(<<CSS, render(<<SASS))
259
- foo bar baz bang {
260
- a: b; }
261
- CSS
262
- foo \#{"\#{"ba" + "r"} baz"} bang
263
- a: b
264
- SASS
265
- assert_equal(<<CSS, render(<<SASS))
266
- foo [bar="\#{bar baz}"] bang {
267
- a: b; }
268
- CSS
269
- foo [bar="\\\#{\#{"ba" + "r"} baz}"] bang
270
- a: b
271
- SASS
272
- assert_equal(<<CSS, render(<<SASS))
273
- foo [bar="\#{baz"] bang {
274
- a: b; }
275
- CSS
276
- foo [bar="\#{"\\\#{" + "baz"}"] bang
277
- a: b
278
- SASS
279
- end
280
-
281
- def test_inaccessible_functions
282
- assert_equal "send(to_s)", resolve("send(to_s)", :line => 2)
283
- assert_equal "public_instance_methods()", resolve("public_instance_methods()")
284
- end
285
-
286
- def test_adding_functions_directly_to_functions_module
287
- assert !Functions.callable?('nonexistant')
288
- Functions.class_eval { def nonexistant; end }
289
- assert Functions.callable?('nonexistant')
290
- Functions.send :remove_method, :nonexistant
291
- end
292
-
293
- def test_default_functions
294
- assert_equal "url(12)", resolve("url(12)")
295
- assert_equal 'blam("foo")', resolve('blam("foo")')
296
- end
297
-
298
- def test_function_results_have_options
299
- assert_equal "Options defined!", resolve("assert_options(abs(1))")
300
- assert_equal "Options defined!", resolve("assert_options(round(1.2))")
301
- end
302
-
303
- def test_funcall_requires_no_whitespace_before_lparen
304
- assert_equal "no-repeat 15px", resolve("no-repeat (7px + 8px)")
305
- assert_equal "no-repeat(15px)", resolve("no-repeat(7px + 8px)")
306
- end
307
-
308
- def test_dynamic_url
309
- assert_equal "url(foo-bar)", resolve("url($foo)", {}, env('foo' => Sass::Script::Value::String.new("foo-bar")))
310
- assert_equal "url(foo-bar baz)", resolve("url($foo $bar)", {}, env('foo' => Sass::Script::Value::String.new("foo-bar"), 'bar' => Sass::Script::Value::String.new("baz")))
311
- assert_equal "url(foo baz)", resolve("url(foo $bar)", {}, env('bar' => Sass::Script::Value::String.new("baz")))
312
- assert_equal "url(foo bar)", resolve("url(foo bar)")
313
- end
314
-
315
- def test_url_with_interpolation
316
- assert_equal "url(http://sass-lang.com/images/foo-bar)", resolve("url(http://sass-lang.com/images/\#{foo-bar})")
317
- assert_equal 'url("http://sass-lang.com/images/foo-bar")', resolve("url('http://sass-lang.com/images/\#{foo-bar}')")
318
- assert_equal 'url("http://sass-lang.com/images/foo-bar")', resolve('url("http://sass-lang.com/images/#{foo-bar}")')
319
- assert_unquoted "url(http://sass-lang.com/images/\#{foo-bar})"
320
- end
321
-
322
- def test_hyphenated_variables
323
- assert_equal("a-b", resolve("$a-b", {}, env("a-b" => Sass::Script::Value::String.new("a-b"))))
324
- end
325
-
326
- def test_ruby_equality
327
- assert_equal eval('"foo"'), eval('"foo"')
328
- assert_equal eval('1'), eval('1.0')
329
- assert_equal eval('1 2 3.0'), eval('1 2 3')
330
- assert_equal eval('1, 2, 3.0'), eval('1, 2, 3')
331
- assert_equal eval('(1 2), (3, 4), (5 6)'), eval('(1 2), (3, 4), (5 6)')
332
- refute_equal eval('1, 2, 3'), eval('1 2 3')
333
- refute_equal eval('1'), eval('"1"')
334
- end
335
-
336
- def test_booleans
337
- assert_equal "true", resolve("true")
338
- assert_equal "false", resolve("false")
339
- end
340
-
341
- def test_null
342
- assert_equal "", resolve("null")
343
- end
344
-
345
- def test_boolean_ops
346
- assert_equal "true", resolve("true and true")
347
- assert_equal "true", resolve("false or true")
348
- assert_equal "true", resolve("true or false")
349
- assert_equal "true", resolve("true or true")
350
- assert_equal "false", resolve("false or false")
351
- assert_equal "false", resolve("false and true")
352
- assert_equal "false", resolve("true and false")
353
- assert_equal "false", resolve("false and false")
354
-
355
- assert_equal "true", resolve("not false")
356
- assert_equal "false", resolve("not true")
357
- assert_equal "true", resolve("not not true")
358
-
359
- assert_equal "1", resolve("false or 1")
360
- assert_equal "false", resolve("false and 1")
361
- assert_equal "2", resolve("2 or 3")
362
- assert_equal "3", resolve("2 and 3")
363
-
364
- assert_equal "true", resolve("null or true")
365
- assert_equal "true", resolve("true or null")
366
- assert_equal "", resolve("null or null")
367
- assert_equal "", resolve("null and true")
368
- assert_equal "", resolve("true and null")
369
- assert_equal "", resolve("null and null")
370
-
371
- assert_equal "true", resolve("not null")
372
-
373
- assert_equal "1", resolve("null or 1")
374
- assert_equal "", resolve("null and 1")
375
- end
376
-
377
- def test_arithmetic_ops
378
- assert_equal "2", resolve("1 + 1")
379
- assert_equal "0", resolve("1 - 1")
380
- assert_equal "8", resolve("2 * 4")
381
- assert_equal "0.5", resolve("(2 / 4)")
382
- assert_equal "2", resolve("(4 / 2)")
383
-
384
- assert_equal "-1", resolve("-1")
385
- end
386
-
387
- def test_subtraction_vs_minus_vs_identifier
388
- assert_equal "0.25em", resolve("1em-.75")
389
- assert_equal "0.25em", resolve("1em-0.75")
390
- assert_equal "1em -0.75", resolve("1em -.75")
391
- assert_equal "1em -0.75", resolve("1em -0.75")
392
- assert_equal "1em- 0.75", resolve("1em- .75")
393
- assert_equal "1em- 0.75", resolve("1em- 0.75")
394
- assert_equal "0.25em", resolve("1em - .75")
395
- assert_equal "0.25em", resolve("1em - 0.75")
396
- end
397
-
398
- def test_string_ops
399
- assert_equal '"foo" "bar"', resolve('"foo" "bar"')
400
- assert_equal "true 1", resolve('true 1')
401
- assert_equal '"foo", "bar"', resolve("'foo' , 'bar'")
402
- assert_equal "true, 1", resolve('true , 1')
403
- assert_equal "foobar", resolve('"foo" + "bar"')
404
- assert_equal "\nfoo\nxyz", resolve('"\a foo" + "\axyz"')
405
- assert_equal "true1", resolve('true + 1')
406
- assert_equal '"foo"-"bar"', resolve("'foo' - 'bar'")
407
- assert_equal "true-1", resolve('true - 1')
408
- assert_equal '"foo"/"bar"', resolve('"foo" / "bar"')
409
- assert_equal "true/1", resolve('true / 1')
410
-
411
- assert_equal '-"bar"', resolve("- 'bar'")
412
- assert_equal "-true", resolve('- true')
413
- assert_equal '/"bar"', resolve('/ "bar"')
414
- assert_equal "/true", resolve('/ true')
415
- end
416
-
417
- def test_relational_ops
418
- assert_equal "false", resolve("1 > 2")
419
- assert_equal "false", resolve("2 > 2")
420
- assert_equal "true", resolve("3 > 2")
421
- assert_equal "false", resolve("1 >= 2")
422
- assert_equal "true", resolve("2 >= 2")
423
- assert_equal "true", resolve("3 >= 2")
424
- assert_equal "true", resolve("1 < 2")
425
- assert_equal "false", resolve("2 < 2")
426
- assert_equal "false", resolve("3 < 2")
427
- assert_equal "true", resolve("1 <= 2")
428
- assert_equal "true", resolve("2 <= 2")
429
- assert_equal "false", resolve("3 <= 2")
430
- end
431
-
432
- def test_null_ops
433
- assert_raise_message(Sass::SyntaxError,
434
- 'Invalid null operation: "null plus 1".') {eval("null + 1")}
435
- assert_raise_message(Sass::SyntaxError,
436
- 'Invalid null operation: "null minus 1".') {eval("null - 1")}
437
- assert_raise_message(Sass::SyntaxError,
438
- 'Invalid null operation: "null times 1".') {eval("null * 1")}
439
- assert_raise_message(Sass::SyntaxError,
440
- 'Invalid null operation: "null div 1".') {eval("null / 1")}
441
- assert_raise_message(Sass::SyntaxError,
442
- 'Invalid null operation: "null mod 1".') {eval("null % 1")}
443
- assert_raise_message(Sass::SyntaxError,
444
- 'Invalid null operation: "1 plus null".') {eval("1 + null")}
445
- assert_raise_message(Sass::SyntaxError,
446
- 'Invalid null operation: "1 minus null".') {eval("1 - null")}
447
- assert_raise_message(Sass::SyntaxError,
448
- 'Invalid null operation: "1 times null".') {eval("1 * null")}
449
- assert_raise_message(Sass::SyntaxError,
450
- 'Invalid null operation: "1 div null".') {eval("1 / null")}
451
- assert_raise_message(Sass::SyntaxError,
452
- 'Invalid null operation: "1 mod null".') {eval("1 % null")}
453
- assert_raise_message(Sass::SyntaxError,
454
- 'Invalid null operation: "1 gt null".') {eval("1 > null")}
455
- assert_raise_message(Sass::SyntaxError,
456
- 'Invalid null operation: "null lt 1".') {eval("null < 1")}
457
- assert_raise_message(Sass::SyntaxError,
458
- 'Invalid null operation: "null plus null".') {eval("null + null")}
459
- assert_raise_message(Sass::SyntaxError,
460
- 'Invalid null operation: ""foo" plus null".') {eval("foo + null")}
461
- end
462
-
463
- def test_equals
464
- assert_equal("true", resolve('"foo" == $foo', {},
465
- env("foo" => Sass::Script::Value::String.new("foo"))))
466
- assert_equal "true", resolve("1 == 1.0")
467
- assert_equal "true", resolve("false != true")
468
- assert_equal "false", resolve("1em == 1px")
469
- assert_equal "false", resolve("12 != 12")
470
- assert_equal "true", resolve("(foo bar baz) == (foo bar baz)")
471
- assert_equal "true", resolve("(foo, bar, baz) == (foo, bar, baz)")
472
- assert_equal "true", resolve('((1 2), (3, 4), (5 6)) == ((1 2), (3, 4), (5 6))')
473
- assert_equal "true", resolve('((1 2), (3 4)) == (1 2, 3 4)')
474
- assert_equal "false", resolve('((1 2) 3) == (1 2 3)')
475
- assert_equal "false", resolve('(1 (2 3)) == (1 2 3)')
476
- assert_equal "false", resolve('((1, 2) (3, 4)) == (1, 2 3, 4)')
477
- assert_equal "false", resolve('(1 2 3) == (1, 2, 3)')
478
-
479
- assert_equal "true", resolve('null == null')
480
- assert_equal "false", resolve('"null" == null')
481
- assert_equal "false", resolve('0 == null')
482
- assert_equal "false", resolve('() == null')
483
-
484
- assert_equal "false", resolve('null != null')
485
- assert_equal "true", resolve('"null" != null')
486
- assert_equal "true", resolve('0 != null')
487
- assert_equal "true", resolve('() != null')
488
- end
489
-
490
- def test_mod
491
- assert_equal "5", resolve("29 % 12")
492
- assert_equal "5px", resolve("29px % 12")
493
- assert_equal "5px", resolve("29px % 12px")
494
- end
495
-
496
- def test_operation_precedence
497
- assert_equal "false true", resolve("true and false false or true")
498
- assert_equal "true", resolve("false and true or true and true")
499
- assert_equal "true", resolve("1 == 2 or 3 == 3")
500
- assert_equal "true", resolve("1 < 2 == 3 >= 3")
501
- assert_equal "true", resolve("1 + 3 > 4 - 2")
502
- assert_equal "11", resolve("1 + 2 * 3 + 4")
503
- end
504
-
505
- def test_functions
506
- assert_equal "#80ff80", resolve("hsl(120, 100%, 75%)")
507
- silence_warnings {assert_equal "#81ff81", resolve("hsl(120, 100%, 75%) + #010001")}
508
- end
509
-
510
- def test_operator_unit_conversion
511
- assert_equal "1.1cm", resolve("1cm + 1mm")
512
- assert_equal "8q", resolve("4q + 1mm")
513
- assert_equal "40.025cm", resolve("40cm + 1q")
514
- assert_equal "2in", resolve("1in + 96px")
515
- assert_equal "true", resolve("2mm < 1cm")
516
- assert_equal "true", resolve("10mm == 1cm")
517
- assert_equal "true", resolve("1.1cm == 11mm")
518
- assert_equal "true", resolve("2mm == 8q")
519
- assert_equal "false", resolve("2px > 3q")
520
-
521
- Sass::Deprecation.allow_double_warnings do
522
- assert_warning(<<WARNING) {assert_equal "true", resolve("1 == 1cm")}
523
- DEPRECATION WARNING on line 1 of test_operator_unit_conversion_inline.sass:
524
- The result of `1 == 1cm` will be `false` in future releases of Sass.
525
- Unitless numbers will no longer be equal to the same numbers with units.
526
- WARNING
527
-
528
- assert_warning(<<WARNING) {assert_equal "false", resolve("1 != 1cm")}
529
- DEPRECATION WARNING on line 1 of test_operator_unit_conversion_inline.sass:
530
- The result of `1 != 1cm` will be `true` in future releases of Sass.
531
- Unitless numbers will no longer be equal to the same numbers with units.
532
- WARNING
533
- end
534
- end
535
-
536
- def test_length_units
537
- assert_equal "2.54", resolve("(1in/1cm)")
538
- assert_equal "2.3622", resolve("(1cm/1pc)")
539
- assert_equal "4.23333", resolve("(1pc/1mm)")
540
- assert_equal "2.83465", resolve("(1mm/1pt)")
541
- assert_equal "1.33333", resolve("(1pt/1px)")
542
- assert_equal "0.01042", resolve("(1px/1in)")
543
- assert_equal "1.05833", resolve("(1px/1q)")
544
- assert_equal "0.05906", resolve("(1q/1pc)")
545
- end
546
-
547
- def test_angle_units
548
- assert_equal "1.11111", resolve("(1deg/1grad)")
549
- assert_equal "0.01571", resolve("(1grad/1rad)")
550
- assert_equal "0.15915", resolve("(1rad/1turn)")
551
- assert_equal "360", resolve("(1turn/1deg)")
552
- end
553
-
554
- def test_time_units
555
- assert_equal "1000", resolve("(1s/1ms)")
556
- end
557
-
558
- def test_frequency_units
559
- assert_equal "0.001", resolve("(1Hz/1kHz)")
560
- end
561
-
562
- def test_resolution_units
563
- assert_equal "0.3937", resolve("(1dpi/1dpcm)")
564
- assert_equal "0.02646", resolve("(1dpcm/1dppx)")
565
- assert_equal "96", resolve("(1dppx/1dpi)")
566
- end
567
-
568
- def test_operations_have_options
569
- assert_equal "Options defined!", resolve("assert_options(1 + 1)")
570
- assert_equal "Options defined!", resolve("assert_options('bar' + 'baz')")
571
- end
572
-
573
- def test_slash_compiles_literally_when_left_alone
574
- assert_equal "1px/2px", resolve("1px/2px")
575
- assert_equal "1px/2px/3px/4px", resolve("1px/2px/3px/4px")
576
-
577
- assert_equal "1px/2px redpx bluepx", resolve("1px/2px redpx bluepx")
578
- assert_equal "foo 1px/2px/3px bar", resolve("foo 1px/2px/3px bar")
579
- end
580
-
581
- def test_slash_divides_with_parens
582
- assert_equal "0.5", resolve("(1px/2px)")
583
- assert_equal "0.5", resolve("(1px)/2px")
584
- assert_equal "0.5", resolve("1px/(2px)")
585
- end
586
-
587
- def test_slash_divides_with_other_arithmetic
588
- assert_equal "0.5px", resolve("1px*1px/2px")
589
- assert_equal "0.5px", resolve("1px/2px*1px")
590
- assert_equal "0.5", resolve("0+1px/2px")
591
- assert_equal "0.5", resolve("1px/2px+0")
592
- end
593
-
594
- def test_slash_divides_with_variable
595
- assert_equal "0.5", resolve("$var/2px", {}, env("var" => eval("1px")))
596
- assert_equal "0.5", resolve("1px/$var", {}, env("var" => eval("2px")))
597
- assert_equal "0.5", resolve("$var", {}, env("var" => eval("1px/2px")))
598
- end
599
-
600
- # Regression test for issue 1786.
601
- def test_slash_division_within_list
602
- assert_equal "1 1/2 1/2", resolve("(1 1/2 1/2)")
603
- assert_equal "1/2 1/2", resolve("(1/2 1/2)")
604
- assert_equal "1/2", resolve("(1/2,)")
605
- end
606
-
607
- def test_non_ident_colors_with_wrong_number_of_digits
608
- assert_raise_message(Sass::SyntaxError,
609
- 'Invalid CSS after "": expected expression (e.g. 1px, bold), was "#1"') {eval("#1")}
610
- assert_raise_message(Sass::SyntaxError,
611
- 'Invalid CSS after "": expected expression (e.g. 1px, bold), was "#12"') {eval("#12")}
612
- assert_raise_message(Sass::SyntaxError,
613
- 'Invalid CSS after "": expected expression (e.g. 1px, bold), was "#1234"') {eval("#1234")}
614
- assert_raise_message(Sass::SyntaxError,
615
- 'Invalid CSS after "": expected expression (e.g. 1px, bold), was "#12345"') {eval("#12345")}
616
- assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "": expected expression (e.g. ' \
617
- '1px, bold), was "#1234567"') {eval("#1234567")}
618
- end
619
-
620
- def test_case_insensitive_color_names
621
- assert_equal "BLUE", resolve("BLUE")
622
- assert_equal "rEd", resolve("rEd")
623
- assert_equal "#804000", resolve("mix(GrEeN, ReD)")
624
- end
625
-
626
- def test_empty_list
627
- assert_equal "1 2 3", resolve("1 2 () 3")
628
- assert_equal "1 2 3", resolve("1 2 3 ()")
629
- assert_equal "1 2 3", resolve("() 1 2 3")
630
- assert_raise_message(Sass::SyntaxError, "() isn't a valid CSS value.") {resolve("()")}
631
- assert_raise_message(Sass::SyntaxError, "() isn't a valid CSS value.") {resolve("nth(append((), ()), 1)")}
632
- end
633
-
634
- def test_list_with_nulls
635
- assert_equal "1, 2, 3", resolve("1, 2, null, 3")
636
- assert_equal "1 2 3", resolve("1 2 null 3")
637
- assert_equal "1, 2, 3", resolve("1, 2, 3, null")
638
- assert_equal "1 2 3", resolve("1 2 3 null")
639
- assert_equal "1, 2, 3", resolve("null, 1, 2, 3")
640
- assert_equal "1 2 3", resolve("null 1 2 3")
641
- end
642
-
643
- def test_map_can_have_trailing_comma
644
- assert_equal("(foo: 1, bar: 2)", eval("(foo: 1, bar: 2,)").to_sass)
645
- end
646
-
647
- def test_list_can_have_trailing_comma
648
- assert_equal("1, 2, 3", resolve("1, 2, 3,"))
649
- end
650
-
651
- def test_trailing_comma_defines_singleton_list
652
- assert_equal("1 2 3", resolve("nth((1 2 3,), 1)"))
653
- end
654
-
655
- def test_map_cannot_have_duplicate_keys
656
- assert_raise_message(Sass::SyntaxError, 'Duplicate key "foo" in map (foo: bar, foo: baz).') do
657
- eval("(foo: bar, foo: baz)")
658
- end
659
- assert_raise_message(Sass::SyntaxError, 'Duplicate key "foo" in map (foo: bar, fo + o: baz).') do
660
- eval("(foo: bar, fo + o: baz)")
661
- end
662
- assert_raise_message(Sass::SyntaxError, 'Duplicate key "foo" in map (foo: bar, "foo": baz).') do
663
- eval("(foo: bar, 'foo': baz)")
664
- end
665
- assert_raise_message(Sass::SyntaxError, 'Duplicate key 2px in map (2px: bar, 1px + 1px: baz).') do
666
- eval("(2px: bar, 1px + 1px: baz)")
667
- end
668
- assert_raise_message(Sass::SyntaxError, 'Duplicate key #0000ff in map (blue: bar, #00f: baz).') do
669
- eval("(blue: bar, #00f: baz)")
670
- end
671
- end
672
-
673
- def test_non_duplicate_map_keys
674
- # These shouldn't throw errors
675
- eval("(foo: foo, bar: bar)")
676
- eval("(2px: foo, 2: bar)")
677
- eval("(2px: foo, 2em: bar)")
678
- eval("('2px': foo, 2px: bar)")
679
- end
680
-
681
- def test_map_syntax_errors
682
- assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "(foo:": expected expression (e.g. 1px, bold), was ")"') do
683
- eval("(foo:)")
684
- end
685
- assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "(": expected ")", was ":bar)"') do
686
- eval("(:bar)")
687
- end
688
- assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "(foo, bar": expected ")", was ": baz)"') do
689
- eval("(foo, bar: baz)")
690
- end
691
- assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "(foo: bar, baz": expected ":", was ")"') do
692
- eval("(foo: bar, baz)")
693
- end
694
- end
695
-
696
- def test_deep_argument_error_not_unwrapped
697
- # JRuby (as of 1.6.7.2) offers no way of distinguishing between
698
- # argument errors caused by programming errors in a function and
699
- # argument errors explicitly thrown within that function.
700
- return if RUBY_PLATFORM =~ /java/
701
-
702
- # Don't validate the message; it's different on Rubinius.
703
- assert_raises(ArgumentError) {resolve("arg-error()")}
704
- end
705
-
706
- def test_shallow_argument_error_unwrapped
707
- assert_raise_message(Sass::SyntaxError, "wrong number of arguments (1 for 0) for `arg-error'") {resolve("arg-error(1)")}
708
- end
709
-
710
- def test_boolean_ops_short_circuit
711
- assert_equal "false", resolve("$ie and $ie <= 7", {}, env('ie' => Sass::Script::Value::Bool.new(false)))
712
- assert_equal "true", resolve("$ie or $undef", {}, env('ie' => Sass::Script::Value::Bool.new(true)))
713
- end
714
-
715
- def test_selector
716
- env = Sass::Environment.new
717
- assert_equal "true", resolve("& == null", {}, env)
718
-
719
- env.selector = selector('.foo.bar .baz.bang, .bip.bop')
720
- assert_equal ".foo.bar .baz.bang, .bip.bop", resolve("&", {}, env)
721
- assert_equal ".foo.bar .baz.bang", resolve("nth(&, 1)", {}, env)
722
- assert_equal ".bip.bop", resolve("nth(&, 2)", {}, env)
723
- assert_equal ".foo.bar", resolve("nth(nth(&, 1), 1)", {}, env)
724
- assert_equal ".baz.bang", resolve("nth(nth(&, 1), 2)", {}, env)
725
- assert_equal ".bip.bop", resolve("nth(nth(&, 2), 1)", {}, env)
726
- assert_equal "string", resolve("type-of(nth(nth(&, 1), 1))", {}, env)
727
-
728
- env.selector = selector('.foo > .bar')
729
- assert_equal ".foo > .bar", resolve("&", {}, env)
730
- assert_equal ".foo > .bar", resolve("nth(&, 1)", {}, env)
731
- assert_equal ".foo", resolve("nth(nth(&, 1), 1)", {}, env)
732
- assert_equal ">", resolve("nth(nth(&, 1), 2)", {}, env)
733
- assert_equal ".bar", resolve("nth(nth(&, 1), 3)", {}, env)
734
- end
735
-
736
- def test_selector_with_newlines
737
- env = Sass::Environment.new
738
- env.selector = selector(".foo.bar\n.baz.bang,\n\n.bip.bop")
739
- assert_equal ".foo.bar .baz.bang, .bip.bop", resolve("&", {}, env)
740
- assert_equal ".foo.bar .baz.bang", resolve("nth(&, 1)", {}, env)
741
- assert_equal ".bip.bop", resolve("nth(&, 2)", {}, env)
742
- assert_equal ".foo.bar", resolve("nth(nth(&, 1), 1)", {}, env)
743
- assert_equal ".baz.bang", resolve("nth(nth(&, 1), 2)", {}, env)
744
- assert_equal ".bip.bop", resolve("nth(nth(&, 2), 1)", {}, env)
745
- assert_equal "string", resolve("type-of(nth(nth(&, 1), 1))", {}, env)
746
- end
747
-
748
- def test_setting_global_variable_globally
749
- assert_no_warning {assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))}
750
- .foo {
751
- a: 1; }
752
-
753
- .bar {
754
- b: 2; }
755
- CSS
756
- $var: 1;
757
-
758
- .foo {
759
- a: $var;
760
- }
761
-
762
- $var: 2;
763
-
764
- .bar {
765
- b: $var;
766
- }
767
- SCSS
768
- end
769
-
770
- def test_setting_global_variable_locally
771
- assert_no_warning {assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))}
772
- .bar {
773
- a: x;
774
- b: y;
775
- c: z; }
776
- CSS
777
- $var1: 1;
778
- $var3: 3;
779
-
780
- .foo {
781
- $var1: x !global;
782
- $var2: y !global;
783
- @each $var3 in _ {
784
- $var3: z !global;
785
- }
786
- }
787
-
788
- .bar {
789
- a: $var1;
790
- b: $var2;
791
- c: $var3;
792
- }
793
- SCSS
794
- end
795
-
796
- def test_setting_global_variable_locally_with_default
797
- assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))
798
- .bar {
799
- a: 1;
800
- b: y;
801
- c: z; }
802
- CSS
803
- $var1: 1;
804
-
805
- .foo {
806
- $var1: x !global !default;
807
- $var2: y !global !default;
808
- @each $var3 in _ {
809
- $var3: z !global !default;
810
- }
811
- }
812
-
813
- .bar {
814
- a: $var1;
815
- b: $var2;
816
- c: $var3;
817
- }
818
- SCSS
819
- end
820
-
821
- def test_setting_local_variable
822
- assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))
823
- .a {
824
- value: inside; }
825
-
826
- .b {
827
- value: outside; }
828
- CSS
829
- $var: outside;
830
-
831
- .a {
832
- $var: inside;
833
- value: $var;
834
- }
835
-
836
- .b {
837
- value: $var;
838
- }
839
- SCSS
840
- end
841
-
842
- def test_setting_local_variable_from_inner_scope
843
- assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))
844
- .a .b {
845
- value: inside; }
846
- .a .c {
847
- value: inside; }
848
- CSS
849
- .a {
850
- $var: outside;
851
-
852
- .b {
853
- $var: inside;
854
- value: $var;
855
- }
856
-
857
- .c {
858
- value: $var;
859
- }
860
- }
861
- SCSS
862
- end
863
-
864
- def test_if_can_assign_to_global_variables
865
- assert_equal <<CSS, render(<<SCSS, :syntax => :scss)
866
- .a {
867
- b: 2; }
868
- CSS
869
- $var: 1;
870
- @if true {$var: 2}
871
- .a {b: $var}
872
- SCSS
873
- end
874
-
875
- def test_else_can_assign_to_global_variables
876
- assert_equal <<CSS, render(<<SCSS, :syntax => :scss)
877
- .a {
878
- b: 2; }
879
- CSS
880
- $var: 1;
881
- @if false {}
882
- @else {$var: 2}
883
- .a {b: $var}
884
- SCSS
885
- end
886
-
887
- def test_for_can_assign_to_global_variables
888
- assert_equal <<CSS, render(<<SCSS, :syntax => :scss)
889
- .a {
890
- b: 2; }
891
- CSS
892
- $var: 1;
893
- @for $i from 1 to 2 {$var: 2}
894
- .a {b: $var}
895
- SCSS
896
- end
897
-
898
- def test_each_can_assign_to_global_variables
899
- assert_equal <<CSS, render(<<SCSS, :syntax => :scss)
900
- .a {
901
- b: 2; }
902
- CSS
903
- $var: 1;
904
- @each $a in 1 {$var: 2}
905
- .a {b: $var}
906
- SCSS
907
- end
908
-
909
- def test_while_can_assign_to_global_variables
910
- assert_equal <<CSS, render(<<SCSS, :syntax => :scss)
911
- .a {
912
- b: 2; }
913
- CSS
914
- $var: 1;
915
- @while $var != 2 {$var: 2}
916
- .a {b: $var}
917
- SCSS
918
- end
919
-
920
- def test_if_doesnt_leak_local_variables
921
- assert_raise_message(Sass::SyntaxError, 'Undefined variable: "$var".') do
922
- render(<<SCSS, :syntax => :scss)
923
- @if true {$var: 1}
924
- .a {b: $var}
925
- SCSS
926
- end
927
- end
928
-
929
- def test_else_doesnt_leak_local_variables
930
- assert_raise_message(Sass::SyntaxError, 'Undefined variable: "$var".') do
931
- render(<<SCSS, :syntax => :scss)
932
- @if false {}
933
- @else {$var: 1}
934
- .a {b: $var}
935
- SCSS
936
- end
937
- end
938
-
939
- def test_for_doesnt_leak_local_variables
940
- assert_raise_message(Sass::SyntaxError, 'Undefined variable: "$var".') do
941
- render(<<SCSS, :syntax => :scss)
942
- @for $i from 1 to 2 {$var: 1}
943
- .a {b: $var}
944
- SCSS
945
- end
946
- end
947
-
948
- def test_each_doesnt_leak_local_variables
949
- assert_raise_message(Sass::SyntaxError, 'Undefined variable: "$var".') do
950
- render(<<SCSS, :syntax => :scss)
951
- @each $a in 1 {$var: 1}
952
- .a {b: $var}
953
- SCSS
954
- end
955
- end
956
-
957
- def test_while_doesnt_leak_local_variables
958
- assert_raise_message(Sass::SyntaxError, 'Undefined variable: "$var".') do
959
- render(<<SCSS, :syntax => :scss)
960
- $iter: true;
961
- @while $iter {
962
- $var: 1;
963
- $iter: false;
964
- }
965
- .a {b: $var}
966
- SCSS
967
- end
968
- end
969
-
970
- def test_color_format_is_preserved_by_default
971
- assert_equal "blue", resolve("blue")
972
- assert_equal "bLuE", resolve("bLuE")
973
- assert_equal "#00f", resolve("#00f")
974
- assert_equal "blue #00F", resolve("blue #00F")
975
- assert_equal "blue", resolve("nth(blue #00F, 1)")
976
- assert_equal "#00F", resolve("nth(blue #00F, 2)")
977
- end
978
-
979
- def test_color_format_isnt_always_preserved_in_compressed_style
980
- assert_equal "red", resolve("red", :style => :compressed)
981
- assert_equal "red", resolve("#f00", :style => :compressed)
982
- assert_equal "red red", resolve("red #f00", :style => :compressed)
983
- assert_equal "red", resolve("nth(red #f00, 2)", :style => :compressed)
984
- end
985
-
986
- def test_color_format_is_sometimes_preserved_in_compressed_style
987
- assert_equal "ReD", resolve("ReD", :style => :compressed)
988
- assert_equal "blue", resolve("blue", :style => :compressed)
989
- assert_equal "#00f", resolve("#00f", :style => :compressed)
990
- end
991
-
992
- def test_color_format_isnt_preserved_when_modified
993
- assert_equal "magenta", resolve("change-color(#f00, $blue: 255)")
994
- end
995
-
996
- def test_ids
997
- assert_equal "#foo", resolve("#foo")
998
- assert_equal "#abcd", resolve("#abcd")
999
- assert_equal "#abc-def", resolve("#abc-def")
1000
- assert_equal "#abc_def", resolve("#abc_def")
1001
- assert_equal "#uvw-xyz", resolve("#uvw-xyz")
1002
- assert_equal "#uvw_xyz", resolve("#uvw_xyz")
1003
- assert_equal "#uvwxyz", resolve("#uvw + xyz")
1004
- end
1005
-
1006
- def test_scientific_notation
1007
- assert_equal "2000", resolve("2e3")
1008
- assert_equal "2000", resolve("2E3")
1009
- assert_equal "2000", resolve("2e+3")
1010
- assert_equal "2000em", resolve("2e3em")
1011
- assert_equal "25000000000", resolve("2.5e10")
1012
- assert_equal "0.1234", resolve("1234e-4")
1013
- assert_equal "12.34", resolve("1.234e1")
1014
- end
1015
-
1016
- def test_identifier_units
1017
- assert_equal "5-foo", resolve("2-foo + 3-foo")
1018
- assert_equal "5-foo-", resolve("2-foo- + 3-foo-")
1019
- assert_equal "5-\\u2603", resolve("2-\\u2603 + 3-\\u2603")
1020
- end
1021
-
1022
- def test_backslash_newline_in_string
1023
- assert_equal 'foobar', resolve("\"foo\\\nbar\"")
1024
- assert_equal 'foobar', resolve("'foo\\\nbar'")
1025
- end
1026
-
1027
- def test_unclosed_special_fun
1028
- assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "calc(foo()": expected ")", was ""') do
1029
- resolve("calc(foo()")
1030
- end
1031
- assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "calc(#{\')\'}": expected ")", was ""') do
1032
- resolve("calc(\#{')'}")
1033
- end
1034
- assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "calc(#{foo": expected "}", was ""') do
1035
- resolve("calc(\#{foo")
1036
- end
1037
- end
1038
-
1039
- def test_special_fun_with_interpolation
1040
- assert_equal "calc())", resolve("calc(\#{')'})")
1041
- assert_equal "calc(# {foo})", resolve("calc(# {foo})")
1042
- end
1043
-
1044
- # Regression Tests
1045
-
1046
- def test_interpolation_after_string
1047
- assert_equal '"foobar" 2', resolve('"foobar" #{2}')
1048
- assert_equal "calc(1 + 2) 3", resolve('calc(1 + 2) #{3}')
1049
- end
1050
-
1051
- def test_repeatedly_modified_color
1052
- assert_equal(<<CSS, render(<<SASS))
1053
- a {
1054
- link-color: #161C14;
1055
- link-color-hover: black;
1056
- link-color-tap: rgba(22, 28, 20, 0.3); }
1057
- CSS
1058
- $green: #161C14
1059
- $link-color: $green
1060
- $link-color-hover: darken($link-color, 10%)
1061
- $link-color-tap: rgba($green, 0.3)
1062
-
1063
- a
1064
- link-color: $link-color
1065
- link-color-hover: $link-color-hover
1066
- link-color-tap: $link-color-tap
1067
- SASS
1068
- end
1069
-
1070
- def test_inspect_divided_numbers
1071
- assert_equal "1px/2px", resolve("inspect(1px/2px)")
1072
- assert_equal "0.5", resolve("inspect((1px/2px))")
1073
- end
1074
-
1075
- def test_minus_without_whitespace
1076
- assert_equal "5px", resolve("15px-10px")
1077
- assert_equal "5px-", resolve("15px--10px-")
1078
- end
1079
-
1080
- def test_minus_preceded_by_comment
1081
- assert_equal "15px -10px", resolve("15px/**/-10px")
1082
- end
1083
-
1084
- def test_user_defined_function_forces_division
1085
- assert_equal(<<CSS, render(<<SASS))
1086
- a {
1087
- b: 10px; }
1088
- CSS
1089
- @function foo()
1090
- @return 20px
1091
-
1092
- a
1093
- b: (foo() / 2)
1094
- SASS
1095
-
1096
- assert_equal(<<CSS, render(<<SASS))
1097
- a {
1098
- b: 10px; }
1099
- CSS
1100
- @function foo()
1101
- @return 20px
1102
-
1103
- a
1104
- b: foo() / 2
1105
- SASS
1106
- end
1107
-
1108
- def test_funcall_has_higher_precedence_than_color_name
1109
- assert_equal "teal(12)", resolve("teal(12)")
1110
- assert_equal "tealbang(12)", resolve("tealbang(12)")
1111
- assert_equal "teal-bang(12)", resolve("teal-bang(12)")
1112
- assert_equal "teal\\+bang(12)", resolve("teal\\+bang(12)")
1113
- end
1114
-
1115
- def test_funcall_has_higher_precedence_than_true_false_null
1116
- assert_equal "teal(12)", resolve("teal(12)")
1117
- assert_equal "tealbang(12)", resolve("tealbang(12)")
1118
- assert_equal "teal-bang(12)", resolve("teal-bang(12)")
1119
- assert_equal "teal\\+bang(12)", resolve("teal\\+bang(12)")
1120
- end
1121
-
1122
- def test_and_or_not_disallowed_as_function_names
1123
- %w[and or not].each do |name|
1124
- assert_raise_message(Sass::SyntaxError, "Invalid function name \"#{name}\".") do
1125
- render(<<SASS)
1126
- @function #{name}()
1127
- @return null
1128
- SASS
1129
- end
1130
- end
1131
- end
1132
-
1133
- def test_interpolation_after_hash
1134
- assert_equal "#2", resolve('"##{1 + 1}"')
1135
- end
1136
-
1137
- def test_misplaced_comma_in_funcall
1138
- assert_raise_message(Sass::SyntaxError,
1139
- 'Invalid CSS after "foo(bar, ": expected function argument, was ")"') {eval('foo(bar, )')}
1140
- end
1141
-
1142
- def test_color_prefixed_identifier
1143
- assert_equal "tealbang", resolve("tealbang")
1144
- assert_equal "teal-bang", resolve("teal-bang")
1145
- end
1146
-
1147
- def test_op_prefixed_identifier
1148
- assert_equal "notbang", resolve("notbang")
1149
- assert_equal "not-bang", resolve("not-bang")
1150
- assert_equal "or-bang", resolve("or-bang")
1151
- assert_equal "and-bang", resolve("and-bang")
1152
- end
1153
-
1154
- def test_number_initialization
1155
- assert_equal Sass::Script::Value::Number.new(10, ["px"]), Sass::Script::Value::Number.new(10, "px")
1156
- assert_equal Sass::Script::Value::Number.new(10, ["px"], ["em"]), Sass::Script::Value::Number.new(10, "px", "em")
1157
- end
1158
-
1159
- def test_is_unit
1160
- assert Sass::Script::Value::Number.new(10, "px").is_unit?("px")
1161
- assert Sass::Script::Value::Number.new(10).is_unit?(nil)
1162
- assert !Sass::Script::Value::Number.new(10, "px", "em").is_unit?("px")
1163
- assert !Sass::Script::Value::Number.new(10, [], "em").is_unit?("em")
1164
- assert !Sass::Script::Value::Number.new(10, ["px", "em"]).is_unit?("px")
1165
- end
1166
-
1167
- def test_rename_redirect
1168
- assert_no_warning do
1169
- assert_equal Sass::Script::Value::Base, Sass::Script::Literal
1170
- assert_equal Sass::Script::Tree::Node, Sass::Script::Node
1171
- assert_equal Sass::Script::Tree::Operation, Sass::Script::Operation
1172
- assert_equal Sass::Script::Value::String, Sass::Script::String
1173
- end
1174
- end
1175
-
1176
- def test_number_printing
1177
- assert_equal "1", resolve("1")
1178
- assert_equal "1", resolve("1.0")
1179
- assert_equal "1000000000", resolve("1000000000")
1180
- assert_equal "0.00001", resolve("0.00001")
1181
- assert_equal "1.12121", resolve("1.121214")
1182
- assert_equal "1.12122", resolve("1.121215")
1183
- assert_equal "Infinity", resolve("(1.0/0.0)")
1184
- assert_equal "-Infinity", resolve("(-1.0/0.0)")
1185
- assert_equal "NaN", resolve("(0.0/0.0)")
1186
- end
1187
-
1188
- def test_equality_uses_an_epsilon
1189
- # At least on my machine, this calculation introduces a floating point error:
1190
- # 29.0 / 7 * 7
1191
- # => 29.000000000000004
1192
- assert_equal "true", resolve("29 == (29 / 7 * 7)")
1193
- end
1194
-
1195
- def test_compressed_output_of_numbers_with_leading_zeros
1196
- assert_equal "1.5", resolve("1.5", :style => :compressed)
1197
- assert_equal ".5", resolve("0.5", :style => :compressed)
1198
- assert_equal "-.5", resolve("-0.5", :style => :compressed)
1199
- assert_equal "0.5", resolve("0.5", :style => :compact)
1200
- end
1201
-
1202
- def test_interpolation_without_deprecation_warning
1203
- assert_no_warning {assert_equal "a", resolve('#{a}')}
1204
- assert_no_warning {assert_equal "abc", resolve('a#{b}c')}
1205
- assert_no_warning {assert_equal "+ a", resolve('+ #{a}')}
1206
- assert_no_warning {assert_equal "/ a", resolve('/ #{a}')}
1207
- assert_no_warning {assert_equal "1 / a", resolve('1 / #{a}')}
1208
- assert_no_warning {assert_equal "a / b", resolve('#{a} / #{b}')}
1209
- assert_no_warning {assert_equal "foo(1 = a)", resolve('foo(1 = #{a})')}
1210
- assert_no_warning {assert_equal "foo(a = b)", resolve('foo(#{a} = #{b})')}
1211
- assert_no_warning {assert_equal "-a", resolve('-#{a}')}
1212
- assert_no_warning {assert_equal "1-a", resolve('1-#{a}')}
1213
- assert_no_warning {assert_equal "a- 1", resolve('#{a}- 1')}
1214
- assert_no_warning {assert_equal "a-1", resolve('#{a}-1')}
1215
- assert_no_warning {assert_equal "a-b", resolve('#{a}-#{b}')}
1216
- assert_no_warning {assert_equal "a1", resolve('#{a}1')}
1217
- assert_no_warning {assert_equal "ab", resolve('#{a}b')}
1218
- assert_no_warning {assert_equal "1a", resolve('1#{a}')}
1219
- assert_no_warning {assert_equal "ba", resolve('b#{a}')}
1220
- end
1221
-
1222
- def test_leading_interpolation_with_deprecation_warning
1223
- assert_equal "ab == 1", resolve_with_interp_warning('#{a + b} == 1')
1224
- assert_equal "ab != 1", resolve_with_interp_warning('#{a + b} != 1')
1225
- assert_equal "ab > 1", resolve_with_interp_warning('#{a + b} > 1')
1226
- assert_equal "ab >= 1", resolve_with_interp_warning('#{a + b} >= 1')
1227
- assert_equal "ab < 1", resolve_with_interp_warning('#{a + b} < 1')
1228
- assert_equal "ab <= 1", resolve_with_interp_warning('#{a + b} <= 1')
1229
- assert_equal "ab + 1", resolve_with_interp_warning('#{a + b} + 1')
1230
- assert_equal "ab * 1", resolve_with_interp_warning('#{a + b} * 1')
1231
- assert_equal "ab - 1", resolve_with_interp_warning('#{a + b} - 1')
1232
- assert_equal "ab % 1", resolve_with_interp_warning('#{a + b} % 1')
1233
- assert_equal(
1234
- "abvar",
1235
- resolve_with_interp_warning(
1236
- '#{a + b}$var', '"#{a + b}#{$var}"',
1237
- env('var' => Sass::Script::Value::String.new("var"))))
1238
- assert_equal(
1239
- "varab",
1240
- resolve_with_interp_warning(
1241
- '$var#{a + b}', '"#{$var}#{a + b}"',
1242
- env('var' => Sass::Script::Value::String.new("var"))))
1243
- assert_equal "ab1", resolve_with_interp_warning('#{a + b}(1)', '"#{a + b}1"')
1244
- assert_equal "1ab", resolve_with_interp_warning('(1)#{a + b}', '"1#{a + b}"')
1245
- end
1246
-
1247
- def test_trailing_interpolation_with_deprecation_warning
1248
- assert_equal "not ab", resolve_with_interp_warning('not #{a + b}')
1249
- assert_equal "1 and ab", resolve_with_interp_warning('1 and #{a + b}')
1250
- assert_equal "1 or ab", resolve_with_interp_warning('1 or #{a + b}')
1251
- assert_equal "1 == ab", resolve_with_interp_warning('1 == #{a + b}')
1252
- assert_equal "1 != ab", resolve_with_interp_warning('1 != #{a + b}')
1253
- assert_equal "1 > ab", resolve_with_interp_warning('1 > #{a + b}')
1254
- assert_equal "1 >= ab", resolve_with_interp_warning('1 >= #{a + b}')
1255
- assert_equal "1 < ab", resolve_with_interp_warning('1 < #{a + b}')
1256
- assert_equal "1 <= ab", resolve_with_interp_warning('1 <= #{a + b}')
1257
- assert_equal "1 + ab", resolve_with_interp_warning('1 + #{a + b}')
1258
- assert_equal "1 * ab", resolve_with_interp_warning('1 * #{a + b}')
1259
- assert_equal "1 - ab", resolve_with_interp_warning('1 - #{a + b}')
1260
- assert_equal "1 % ab", resolve_with_interp_warning('1 % #{a + b}')
1261
- assert_equal "- ab", resolve_with_interp_warning('- #{a + b}')
1262
- assert_equal "1- ab", resolve_with_interp_warning('1- #{a + b}')
1263
- assert_equal "- ab 2 3", resolve_with_interp_warning('- #{a + b} 2 3', '"- #{a + b} #{2 3}"')
1264
- end
1265
-
1266
- def test_brackteing_interpolation_with_deprecation_warning
1267
- assert_equal "ab == cd", resolve_with_interp_warning('#{a + b} == #{c + d}')
1268
- assert_equal "ab != cd", resolve_with_interp_warning('#{a + b} != #{c + d}')
1269
- assert_equal "ab > cd", resolve_with_interp_warning('#{a + b} > #{c + d}')
1270
- assert_equal "ab >= cd", resolve_with_interp_warning('#{a + b} >= #{c + d}')
1271
- assert_equal "ab < cd", resolve_with_interp_warning('#{a + b} < #{c + d}')
1272
- assert_equal "ab <= cd", resolve_with_interp_warning('#{a + b} <= #{c + d}')
1273
- assert_equal "ab + cd", resolve_with_interp_warning('#{a + b} + #{c + d}')
1274
- assert_equal "ab * cd", resolve_with_interp_warning('#{a + b} * #{c + d}')
1275
- assert_equal "ab - cd", resolve_with_interp_warning('#{a + b} - #{c + d}')
1276
- assert_equal "ab % cd", resolve_with_interp_warning('#{a + b} % #{c + d}')
1277
- end
1278
-
1279
- def test_interp_warning_formatting
1280
- resolve_with_interp_warning('#{1} + 1', '"1 + 1"')
1281
- resolve_with_interp_warning('#{1} + "foo"', '\'1 + "foo"\'')
1282
- resolve_with_interp_warning('#{1} + \'foo\'', '\'1 + "foo"\'')
1283
-
1284
- resolve_with_interp_warning('#{1} + "#{a + b}"', '\'1 + "#{a + b}"\'')
1285
- resolve_with_interp_warning('"#{a + b}" + #{1}', '\'"#{a + b}" + 1\'')
1286
- resolve_with_interp_warning('"#{a + b}" + #{1} + "#{c + d}"', '\'"#{a + b}" + 1 + "#{c + d}"\'')
1287
-
1288
- resolve_with_interp_warning('#{1} + "\'"', '"1 + \\"\'\\""')
1289
- resolve_with_interp_warning('#{1} + \'"\'', '"1 + \'\\"\'"')
1290
- resolve_with_interp_warning('#{1} + "\'\\""', '"1 + \\"\'\\\\\\"\\""')
1291
- end
1292
-
1293
- def test_inactive_lazy_interpolation_deprecation_warning
1294
- assert_equal '1, 2, 3', assert_no_warning {resolve('1, #{2}, 3')}
1295
- assert_equal '1, 2, 3', assert_no_warning {resolve('1, 2, #{3}')}
1296
- assert_equal '1,2,3', assert_no_warning {resolve('1,#{2},3')}
1297
- assert_equal '1 2 3', assert_no_warning {resolve('#{1} 2 3')}
1298
- assert_equal '1 2 3', assert_no_warning {resolve('1 #{2} 3')}
1299
- assert_equal '1 2 3', assert_no_warning {resolve('1 2 #{3}')}
1300
-
1301
- assert_equal '+1 2 3', assert_no_warning {resolve('+#{1} 2 3')}
1302
- assert_equal '-1 2 3', assert_no_warning {resolve('-#{1} 2 3')}
1303
- assert_equal '/1 2 3', assert_no_warning {resolve('/#{1} 2 3')}
1304
-
1305
- assert_equal '1, 2, 31', assert_no_warning {resolve('(1, #{2}, 3) + 1')}
1306
- assert_equal '11, 2, 3', assert_no_warning {resolve('1 + (1, #{2}, 3)')}
1307
-
1308
- assert_equal 'a, b, c', assert_no_warning {resolve('selector-parse((a, #{b}, c))')}
1309
- end
1310
-
1311
- def test_active_lazy_interpolation_deprecation_warning
1312
- Sass::Deprecation.allow_double_warnings do
1313
- assert_equal "1, 2, 3", resolve_with_lazy_interp_warning('quote((1, #{2}, 3))', '"1, 2, 3"')
1314
- assert_equal "1", resolve_with_lazy_interp_warning('length((1, #{2}, 3))', '"1, 2, 3"')
1315
- assert_equal "1, 2, 3", resolve_with_lazy_interp_warning('inspect((1, #{2}, 3))', '"1, 2, 3"')
1316
- assert_equal "string", resolve_with_lazy_interp_warning('type-of((1, #{2}, 3))', '"1, 2, 3"')
1317
-
1318
- assert_equal "+1 2 3", resolve_with_lazy_interp_warning('quote((+#{1} 2 3))', '"+1 #{2 3}"')
1319
- assert_equal "/1 2 3", resolve_with_lazy_interp_warning('quote((/#{1} 2 3))', '"/1 #{2 3}"')
1320
- assert_equal "-1 2 3", resolve_with_lazy_interp_warning('quote((-#{1} 2 3))', '"-1 #{2 3}"')
1321
- end
1322
- end
1323
-
1324
- def test_comparison_of_complex_units
1325
- # Tests for issue #1960
1326
- Sass::Deprecation.allow_double_warnings do
1327
- assert_warning(<<WARNING) do
1328
- DEPRECATION WARNING on line 1 of test_comparison_of_complex_units_inline.sass:
1329
- The result of `10 == 10px` will be `false` in future releases of Sass.
1330
- Unitless numbers will no longer be equal to the same numbers with units.
1331
- WARNING
1332
- assert_equal "true", resolve("10 == 2 * 5px")
1333
- end
1334
- assert_warning(<<WARNING) do
1335
- DEPRECATION WARNING on line 1 of test_comparison_of_complex_units_inline.sass:
1336
- The result of `10 == 10px*px` will be `false` in future releases of Sass.
1337
- Unitless numbers will no longer be equal to the same numbers with units.
1338
- WARNING
1339
- assert_equal "true", resolve("10 == 2px * 5px")
1340
- end
1341
- end
1342
-
1343
- assert_equal "true", resolve("10px * 1px == 2px * 5px")
1344
- assert_equal "true", resolve("5px * 1px < 2px * 5px")
1345
- end
1346
-
1347
- private
1348
-
1349
- def resolve_with_lazy_interp_warning(str, contents = nil, environment = env)
1350
- contents ||= "\"#{str}\""
1351
- result = assert_warning(<<WARNING) {resolve(str, {}, environment)}
1352
- DEPRECATION WARNING on line 1 of #{filename_for_test}:
1353
- \#{} interpolation near operators will be simplified in a future version of Sass.
1354
- To preserve the current behavior, use quotes:
1355
-
1356
- unquote(#{contents})
1357
- WARNING
1358
- $_sass_deprecated_interp_warnings = nil
1359
- result
1360
- end
1361
-
1362
- def resolve_with_interp_warning(str, contents = nil, environment = env)
1363
- contents ||= "\"#{str}\""
1364
- assert_warning(<<WARNING) {resolve(str, {}, environment)}
1365
- DEPRECATION WARNING on line 1 of #{filename_for_test}:
1366
- \#{} interpolation near operators will be simplified in a future version of Sass.
1367
- To preserve the current behavior, use quotes:
1368
-
1369
- unquote(#{contents})
1370
-
1371
- You can use the sass-convert command to automatically fix most cases.
1372
- WARNING
1373
- end
1374
-
1375
- def resolve(str, opts = {}, environment = env)
1376
- munge_filename opts
1377
- val = eval(str, opts, environment)
1378
- assert_kind_of Sass::Script::Value::Base, val
1379
- val.options = opts
1380
- val.is_a?(Sass::Script::Value::String) ? val.value : val.to_s
1381
- end
1382
-
1383
- def resolve_quoted(str, opts = {}, environment = env)
1384
- munge_filename opts
1385
- val = eval(str, opts, environment)
1386
- assert_kind_of Sass::Script::Value::Base, val
1387
- val.to_s
1388
- end
1389
-
1390
- def assert_unquoted(str, opts = {}, environment = env)
1391
- munge_filename opts
1392
- val = eval(str, opts, environment)
1393
- assert_kind_of Sass::Script::Value::String, val
1394
- assert_equal :identifier, val.type
1395
- end
1396
-
1397
- def assert_quoted(str, opts = {}, environment = env)
1398
- munge_filename opts
1399
- val = eval(str, opts, environment)
1400
- assert_kind_of Sass::Script::Value::String, val
1401
- assert_equal :string, val.type
1402
- end
1403
-
1404
- def eval(str, opts = {}, environment = env)
1405
- munge_filename opts
1406
- Sass::Script.parse(str, opts.delete(:line) || 1,
1407
- opts.delete(:offset) || 0, opts).
1408
- perform(Sass::Environment.new(environment, opts))
1409
- end
1410
-
1411
- def render(sass, options = {})
1412
- munge_filename options
1413
- Sass::Engine.new(sass, options).render
1414
- end
1415
-
1416
- def env(hash = {})
1417
- env = Sass::Environment.new
1418
- hash.each {|k, v| env.set_var(k, v)}
1419
- env
1420
- end
1421
-
1422
- def selector(str)
1423
- parser = Sass::SCSS::StaticParser.new(
1424
- str, filename_for_test, Sass::Importers::Filesystem.new('.'))
1425
- parser.parse_selector
1426
- end
1427
-
1428
- def test_null_is_a_singleton
1429
- assert_same Sass::Script::Value::Null.new, Sass::Script::Value::Null.new
1430
- end
1431
- end