sass 3.4.25 → 3.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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