sass 3.4.24 → 3.7.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (244) 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/cache_stores/filesystem.rb +1 -1
  10. data/lib/sass/css.rb +2 -3
  11. data/lib/sass/deprecation.rb +55 -0
  12. data/lib/sass/engine.rb +52 -34
  13. data/lib/sass/environment.rb +27 -6
  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 +21 -51
  21. data/lib/sass/plugin/configuration.rb +2 -2
  22. data/lib/sass/plugin/rack.rb +2 -2
  23. data/lib/sass/plugin/staleness_checker.rb +1 -1
  24. data/lib/sass/plugin.rb +1 -1
  25. data/lib/sass/railtie.rb +1 -1
  26. data/lib/sass/script/css_parser.rb +4 -1
  27. data/lib/sass/script/functions.rb +310 -83
  28. data/lib/sass/script/lexer.rb +64 -10
  29. data/lib/sass/script/parser.rb +291 -121
  30. data/lib/sass/script/tree/funcall.rb +35 -34
  31. data/lib/sass/script/tree/interpolation.rb +0 -3
  32. data/lib/sass/script/tree/list_literal.rb +23 -8
  33. data/lib/sass/script/tree/map_literal.rb +2 -2
  34. data/lib/sass/script/tree/node.rb +1 -9
  35. data/lib/sass/script/tree/operation.rb +43 -23
  36. data/lib/sass/script/value/arg_list.rb +1 -1
  37. data/lib/sass/script/value/base.rb +18 -1
  38. data/lib/sass/script/value/callable.rb +25 -0
  39. data/lib/sass/script/value/color.rb +8 -2
  40. data/lib/sass/script/value/function.rb +19 -0
  41. data/lib/sass/script/value/helpers.rb +37 -11
  42. data/lib/sass/script/value/list.rb +35 -14
  43. data/lib/sass/script/value/map.rb +2 -2
  44. data/lib/sass/script/value/number.rb +3 -2
  45. data/lib/sass/script/value/string.rb +5 -12
  46. data/lib/sass/script/value.rb +2 -0
  47. data/lib/sass/script.rb +1 -1
  48. data/lib/sass/scss/css_parser.rb +6 -1
  49. data/lib/sass/scss/parser.rb +145 -56
  50. data/lib/sass/scss/rx.rb +5 -11
  51. data/lib/sass/scss/static_parser.rb +27 -42
  52. data/lib/sass/selector/abstract_sequence.rb +7 -6
  53. data/lib/sass/selector/comma_sequence.rb +21 -5
  54. data/lib/sass/selector/pseudo.rb +20 -3
  55. data/lib/sass/selector/sequence.rb +35 -10
  56. data/lib/sass/selector/simple.rb +10 -2
  57. data/lib/sass/selector/simple_sequence.rb +8 -4
  58. data/lib/sass/selector.rb +4 -0
  59. data/lib/sass/source/map.rb +2 -6
  60. data/lib/sass/stack.rb +21 -1
  61. data/lib/sass/tree/charset_node.rb +1 -1
  62. data/lib/sass/tree/node.rb +2 -2
  63. data/lib/sass/tree/prop_node.rb +45 -53
  64. data/lib/sass/tree/rule_node.rb +13 -6
  65. data/lib/sass/tree/visitors/check_nesting.rb +1 -1
  66. data/lib/sass/tree/visitors/convert.rb +2 -3
  67. data/lib/sass/tree/visitors/cssize.rb +4 -15
  68. data/lib/sass/tree/visitors/deep_copy.rb +2 -2
  69. data/lib/sass/tree/visitors/extend.rb +2 -8
  70. data/lib/sass/tree/visitors/perform.rb +26 -17
  71. data/lib/sass/tree/visitors/set_options.rb +1 -1
  72. data/lib/sass/tree/visitors/to_css.rb +49 -22
  73. data/lib/sass/util/multibyte_string_scanner.rb +127 -131
  74. data/lib/sass/util/normalized_map.rb +1 -8
  75. data/lib/sass/util.rb +72 -310
  76. data/lib/sass/version.rb +0 -4
  77. data/lib/sass.rb +3 -10
  78. metadata +60 -206
  79. data/Rakefile +0 -424
  80. data/lib/sass/script/css_variable_warning.rb +0 -52
  81. data/lib/sass/util/cross_platform_random.rb +0 -19
  82. data/lib/sass/util/ordered_hash.rb +0 -192
  83. data/test/sass/cache_test.rb +0 -131
  84. data/test/sass/callbacks_test.rb +0 -61
  85. data/test/sass/compiler_test.rb +0 -236
  86. data/test/sass/conversion_test.rb +0 -2188
  87. data/test/sass/css2sass_test.rb +0 -526
  88. data/test/sass/css_variable_test.rb +0 -132
  89. data/test/sass/data/hsl-rgb.txt +0 -319
  90. data/test/sass/encoding_test.rb +0 -219
  91. data/test/sass/engine_test.rb +0 -3441
  92. data/test/sass/exec_test.rb +0 -96
  93. data/test/sass/extend_test.rb +0 -1727
  94. data/test/sass/fixtures/test_staleness_check_across_importers.css +0 -1
  95. data/test/sass/fixtures/test_staleness_check_across_importers.scss +0 -1
  96. data/test/sass/functions_test.rb +0 -1974
  97. data/test/sass/importer_test.rb +0 -421
  98. data/test/sass/logger_test.rb +0 -58
  99. data/test/sass/mock_importer.rb +0 -49
  100. data/test/sass/more_results/more1.css +0 -9
  101. data/test/sass/more_results/more1_with_line_comments.css +0 -26
  102. data/test/sass/more_results/more_import.css +0 -29
  103. data/test/sass/more_templates/_more_partial.sass +0 -2
  104. data/test/sass/more_templates/more1.sass +0 -23
  105. data/test/sass/more_templates/more_import.sass +0 -11
  106. data/test/sass/plugin_test.rb +0 -556
  107. data/test/sass/results/alt.css +0 -4
  108. data/test/sass/results/basic.css +0 -9
  109. data/test/sass/results/cached_import_option.css +0 -3
  110. data/test/sass/results/compact.css +0 -5
  111. data/test/sass/results/complex.css +0 -86
  112. data/test/sass/results/compressed.css +0 -1
  113. data/test/sass/results/expanded.css +0 -19
  114. data/test/sass/results/filename_fn.css +0 -3
  115. data/test/sass/results/if.css +0 -3
  116. data/test/sass/results/import.css +0 -31
  117. data/test/sass/results/import_charset.css +0 -5
  118. data/test/sass/results/import_charset_1_8.css +0 -5
  119. data/test/sass/results/import_charset_ibm866.css +0 -5
  120. data/test/sass/results/import_content.css +0 -1
  121. data/test/sass/results/line_numbers.css +0 -49
  122. data/test/sass/results/mixins.css +0 -95
  123. data/test/sass/results/multiline.css +0 -24
  124. data/test/sass/results/nested.css +0 -22
  125. data/test/sass/results/options.css +0 -1
  126. data/test/sass/results/parent_ref.css +0 -13
  127. data/test/sass/results/script.css +0 -16
  128. data/test/sass/results/scss_import.css +0 -31
  129. data/test/sass/results/scss_importee.css +0 -2
  130. data/test/sass/results/subdir/nested_subdir/nested_subdir.css +0 -1
  131. data/test/sass/results/subdir/subdir.css +0 -3
  132. data/test/sass/results/units.css +0 -11
  133. data/test/sass/results/warn.css +0 -0
  134. data/test/sass/results/warn_imported.css +0 -0
  135. data/test/sass/script_conversion_test.rb +0 -357
  136. data/test/sass/script_test.rb +0 -1422
  137. data/test/sass/scss/css_test.rb +0 -1281
  138. data/test/sass/scss/rx_test.rb +0 -160
  139. data/test/sass/scss/scss_test.rb +0 -4190
  140. data/test/sass/scss/test_helper.rb +0 -37
  141. data/test/sass/source_map_test.rb +0 -1055
  142. data/test/sass/superselector_test.rb +0 -210
  143. data/test/sass/templates/_cached_import_option_partial.scss +0 -1
  144. data/test/sass/templates/_double_import_loop2.sass +0 -1
  145. data/test/sass/templates/_filename_fn_import.scss +0 -11
  146. data/test/sass/templates/_imported_charset_ibm866.sass +0 -4
  147. data/test/sass/templates/_imported_charset_utf8.sass +0 -4
  148. data/test/sass/templates/_imported_content.sass +0 -3
  149. data/test/sass/templates/_partial.sass +0 -2
  150. data/test/sass/templates/_same_name_different_partiality.scss +0 -1
  151. data/test/sass/templates/alt.sass +0 -16
  152. data/test/sass/templates/basic.sass +0 -23
  153. data/test/sass/templates/bork1.sass +0 -2
  154. data/test/sass/templates/bork2.sass +0 -2
  155. data/test/sass/templates/bork3.sass +0 -2
  156. data/test/sass/templates/bork4.sass +0 -2
  157. data/test/sass/templates/bork5.sass +0 -3
  158. data/test/sass/templates/cached_import_option.scss +0 -3
  159. data/test/sass/templates/compact.sass +0 -17
  160. data/test/sass/templates/complex.sass +0 -305
  161. data/test/sass/templates/compressed.sass +0 -15
  162. data/test/sass/templates/double_import_loop1.sass +0 -1
  163. data/test/sass/templates/expanded.sass +0 -17
  164. data/test/sass/templates/filename_fn.scss +0 -18
  165. data/test/sass/templates/if.sass +0 -11
  166. data/test/sass/templates/import.sass +0 -12
  167. data/test/sass/templates/import_charset.sass +0 -9
  168. data/test/sass/templates/import_charset_1_8.sass +0 -6
  169. data/test/sass/templates/import_charset_ibm866.sass +0 -11
  170. data/test/sass/templates/import_content.sass +0 -4
  171. data/test/sass/templates/importee.less +0 -2
  172. data/test/sass/templates/importee.sass +0 -19
  173. data/test/sass/templates/line_numbers.sass +0 -13
  174. data/test/sass/templates/mixin_bork.sass +0 -5
  175. data/test/sass/templates/mixins.sass +0 -76
  176. data/test/sass/templates/multiline.sass +0 -20
  177. data/test/sass/templates/nested.sass +0 -25
  178. data/test/sass/templates/nested_bork1.sass +0 -2
  179. data/test/sass/templates/nested_bork2.sass +0 -2
  180. data/test/sass/templates/nested_bork3.sass +0 -2
  181. data/test/sass/templates/nested_bork4.sass +0 -2
  182. data/test/sass/templates/nested_import.sass +0 -2
  183. data/test/sass/templates/nested_mixin_bork.sass +0 -6
  184. data/test/sass/templates/options.sass +0 -2
  185. data/test/sass/templates/parent_ref.sass +0 -25
  186. data/test/sass/templates/same_name_different_ext.sass +0 -2
  187. data/test/sass/templates/same_name_different_ext.scss +0 -1
  188. data/test/sass/templates/same_name_different_partiality.scss +0 -1
  189. data/test/sass/templates/script.sass +0 -101
  190. data/test/sass/templates/scss_import.scss +0 -12
  191. data/test/sass/templates/scss_importee.scss +0 -1
  192. data/test/sass/templates/single_import_loop.sass +0 -1
  193. data/test/sass/templates/subdir/import_up1.scss +0 -1
  194. data/test/sass/templates/subdir/import_up2.scss +0 -1
  195. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +0 -2
  196. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +0 -3
  197. data/test/sass/templates/subdir/subdir.sass +0 -6
  198. data/test/sass/templates/units.sass +0 -11
  199. data/test/sass/templates/warn.sass +0 -3
  200. data/test/sass/templates/warn_imported.sass +0 -4
  201. data/test/sass/test_helper.rb +0 -8
  202. data/test/sass/util/multibyte_string_scanner_test.rb +0 -147
  203. data/test/sass/util/normalized_map_test.rb +0 -51
  204. data/test/sass/util/subset_map_test.rb +0 -91
  205. data/test/sass/util_test.rb +0 -438
  206. data/test/sass/value_helpers_test.rb +0 -179
  207. data/test/sass-spec.yml +0 -3
  208. data/test/test_helper.rb +0 -110
  209. data/vendor/listen/CHANGELOG.md +0 -1
  210. data/vendor/listen/CONTRIBUTING.md +0 -38
  211. data/vendor/listen/Gemfile +0 -20
  212. data/vendor/listen/Guardfile +0 -8
  213. data/vendor/listen/LICENSE +0 -20
  214. data/vendor/listen/README.md +0 -349
  215. data/vendor/listen/Rakefile +0 -5
  216. data/vendor/listen/Vagrantfile +0 -96
  217. data/vendor/listen/lib/listen/adapter.rb +0 -327
  218. data/vendor/listen/lib/listen/adapters/bsd.rb +0 -75
  219. data/vendor/listen/lib/listen/adapters/darwin.rb +0 -48
  220. data/vendor/listen/lib/listen/adapters/linux.rb +0 -81
  221. data/vendor/listen/lib/listen/adapters/polling.rb +0 -58
  222. data/vendor/listen/lib/listen/adapters/windows.rb +0 -91
  223. data/vendor/listen/lib/listen/directory_record.rb +0 -406
  224. data/vendor/listen/lib/listen/listener.rb +0 -323
  225. data/vendor/listen/lib/listen/turnstile.rb +0 -32
  226. data/vendor/listen/lib/listen/version.rb +0 -3
  227. data/vendor/listen/lib/listen.rb +0 -54
  228. data/vendor/listen/listen.gemspec +0 -28
  229. data/vendor/listen/spec/listen/adapter_spec.rb +0 -149
  230. data/vendor/listen/spec/listen/adapters/bsd_spec.rb +0 -36
  231. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +0 -37
  232. data/vendor/listen/spec/listen/adapters/linux_spec.rb +0 -47
  233. data/vendor/listen/spec/listen/adapters/polling_spec.rb +0 -68
  234. data/vendor/listen/spec/listen/adapters/windows_spec.rb +0 -30
  235. data/vendor/listen/spec/listen/directory_record_spec.rb +0 -1250
  236. data/vendor/listen/spec/listen/listener_spec.rb +0 -258
  237. data/vendor/listen/spec/listen/turnstile_spec.rb +0 -56
  238. data/vendor/listen/spec/listen_spec.rb +0 -67
  239. data/vendor/listen/spec/spec_helper.rb +0 -25
  240. data/vendor/listen/spec/support/adapter_helper.rb +0 -666
  241. data/vendor/listen/spec/support/directory_record_helper.rb +0 -57
  242. data/vendor/listen/spec/support/fixtures_helper.rb +0 -29
  243. data/vendor/listen/spec/support/listeners_helper.rb +0 -179
  244. data/vendor/listen/spec/support/platform_helper.rb +0 -15
@@ -1,1422 +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
- 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
- assert_equal "rgba(50, 50, 100, 0.35)", resolve("rgba(1, 1, 2, 0.35) * rgba(50, 50, 50, 0.35)")
101
- 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
- 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
- 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
- resolve("rgba(50, 50, 50, 0.75) / #123456")
111
- end
112
- end
113
-
114
- def test_rgba_number_math
115
- assert_equal "rgba(49, 49, 49, 0.75)", resolve("rgba(50, 50, 50, 0.75) - 1")
116
- 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
- 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
- assert_warning(<<WARNING) {assert_equal "true", resolve("1 == 1cm")}
522
- DEPRECATION WARNING on line 1 of test_operator_unit_conversion_inline.sass:
523
- The result of `1 == 1cm` will be `false` in future releases of Sass.
524
- Unitless numbers will no longer be equal to the same numbers with units.
525
- WARNING
526
-
527
- assert_warning(<<WARNING) {assert_equal "false", resolve("1 != 1cm")}
528
- DEPRECATION WARNING on line 1 of test_operator_unit_conversion_inline.sass:
529
- The result of `1 != 1cm` will be `true` in future releases of Sass.
530
- Unitless numbers will no longer be equal to the same numbers with units.
531
- WARNING
532
- end
533
-
534
- def test_length_units
535
- assert_equal "2.54", resolve("(1in/1cm)")
536
- assert_equal "2.3622", resolve("(1cm/1pc)")
537
- assert_equal "4.23333", resolve("(1pc/1mm)")
538
- assert_equal "2.83465", resolve("(1mm/1pt)")
539
- assert_equal "1.33333", resolve("(1pt/1px)")
540
- assert_equal "0.01042", resolve("(1px/1in)")
541
- assert_equal "1.05833", resolve("(1px/1q)")
542
- assert_equal "0.05906", resolve("(1q/1pc)")
543
- end
544
-
545
- def test_angle_units
546
- assert_equal "1.11111", resolve("(1deg/1grad)")
547
- assert_equal "0.01571", resolve("(1grad/1rad)")
548
- assert_equal "0.15915", resolve("(1rad/1turn)")
549
- assert_equal "360", resolve("(1turn/1deg)")
550
- end
551
-
552
- def test_time_units
553
- assert_equal "1000", resolve("(1s/1ms)")
554
- end
555
-
556
- def test_frequency_units
557
- assert_equal "0.001", resolve("(1Hz/1kHz)")
558
- end
559
-
560
- def test_resolution_units
561
- assert_equal "0.3937", resolve("(1dpi/1dpcm)")
562
- assert_equal "0.02646", resolve("(1dpcm/1dppx)")
563
- assert_equal "96", resolve("(1dppx/1dpi)")
564
- end
565
-
566
- def test_operations_have_options
567
- assert_equal "Options defined!", resolve("assert_options(1 + 1)")
568
- assert_equal "Options defined!", resolve("assert_options('bar' + 'baz')")
569
- end
570
-
571
- def test_slash_compiles_literally_when_left_alone
572
- assert_equal "1px/2px", resolve("1px/2px")
573
- assert_equal "1px/2px/3px/4px", resolve("1px/2px/3px/4px")
574
-
575
- assert_equal "1px/2px redpx bluepx", resolve("1px/2px redpx bluepx")
576
- assert_equal "foo 1px/2px/3px bar", resolve("foo 1px/2px/3px bar")
577
- end
578
-
579
- def test_slash_divides_with_parens
580
- assert_equal "0.5", resolve("(1px/2px)")
581
- assert_equal "0.5", resolve("(1px)/2px")
582
- assert_equal "0.5", resolve("1px/(2px)")
583
- end
584
-
585
- def test_slash_divides_with_other_arithmetic
586
- assert_equal "0.5px", resolve("1px*1px/2px")
587
- assert_equal "0.5px", resolve("1px/2px*1px")
588
- assert_equal "0.5", resolve("0+1px/2px")
589
- assert_equal "0.5", resolve("1px/2px+0")
590
- end
591
-
592
- def test_slash_divides_with_variable
593
- assert_equal "0.5", resolve("$var/2px", {}, env("var" => eval("1px")))
594
- assert_equal "0.5", resolve("1px/$var", {}, env("var" => eval("2px")))
595
- assert_equal "0.5", resolve("$var", {}, env("var" => eval("1px/2px")))
596
- end
597
-
598
- # Regression test for issue 1786.
599
- def test_slash_division_within_list
600
- assert_equal "1 1/2 1/2", resolve("(1 1/2 1/2)")
601
- assert_equal "1/2 1/2", resolve("(1/2 1/2)")
602
- assert_equal "1/2", resolve("(1/2,)")
603
- end
604
-
605
- def test_non_ident_colors_with_wrong_number_of_digits
606
- assert_raise_message(Sass::SyntaxError,
607
- 'Invalid CSS after "": expected expression (e.g. 1px, bold), was "#1"') {eval("#1")}
608
- assert_raise_message(Sass::SyntaxError,
609
- 'Invalid CSS after "": expected expression (e.g. 1px, bold), was "#12"') {eval("#12")}
610
- assert_raise_message(Sass::SyntaxError,
611
- 'Invalid CSS after "": expected expression (e.g. 1px, bold), was "#1234"') {eval("#1234")}
612
- assert_raise_message(Sass::SyntaxError,
613
- 'Invalid CSS after "": expected expression (e.g. 1px, bold), was "#12345"') {eval("#12345")}
614
- assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "": expected expression (e.g. ' \
615
- '1px, bold), was "#1234567"') {eval("#1234567")}
616
- end
617
-
618
- def test_case_insensitive_color_names
619
- assert_equal "BLUE", resolve("BLUE")
620
- assert_equal "rEd", resolve("rEd")
621
- assert_equal "#804000", resolve("mix(GrEeN, ReD)")
622
- end
623
-
624
- def test_empty_list
625
- assert_equal "1 2 3", resolve("1 2 () 3")
626
- assert_equal "1 2 3", resolve("1 2 3 ()")
627
- assert_equal "1 2 3", resolve("() 1 2 3")
628
- assert_raise_message(Sass::SyntaxError, "() isn't a valid CSS value.") {resolve("()")}
629
- assert_raise_message(Sass::SyntaxError, "() isn't a valid CSS value.") {resolve("nth(append((), ()), 1)")}
630
- end
631
-
632
- def test_list_with_nulls
633
- assert_equal "1, 2, 3", resolve("1, 2, null, 3")
634
- assert_equal "1 2 3", resolve("1 2 null 3")
635
- assert_equal "1, 2, 3", resolve("1, 2, 3, null")
636
- assert_equal "1 2 3", resolve("1 2 3 null")
637
- assert_equal "1, 2, 3", resolve("null, 1, 2, 3")
638
- assert_equal "1 2 3", resolve("null 1 2 3")
639
- end
640
-
641
- def test_map_can_have_trailing_comma
642
- assert_equal("(foo: 1, bar: 2)", eval("(foo: 1, bar: 2,)").to_sass)
643
- end
644
-
645
- def test_list_can_have_trailing_comma
646
- assert_equal("1, 2, 3", resolve("1, 2, 3,"))
647
- end
648
-
649
- def test_trailing_comma_defines_singleton_list
650
- assert_equal("1 2 3", resolve("nth((1 2 3,), 1)"))
651
- end
652
-
653
- def test_map_cannot_have_duplicate_keys
654
- assert_raise_message(Sass::SyntaxError, 'Duplicate key "foo" in map (foo: bar, foo: baz).') do
655
- eval("(foo: bar, foo: baz)")
656
- end
657
- assert_raise_message(Sass::SyntaxError, 'Duplicate key "foo" in map (foo: bar, fo + o: baz).') do
658
- eval("(foo: bar, fo + o: baz)")
659
- end
660
- assert_raise_message(Sass::SyntaxError, 'Duplicate key "foo" in map (foo: bar, "foo": baz).') do
661
- eval("(foo: bar, 'foo': baz)")
662
- end
663
- assert_raise_message(Sass::SyntaxError, 'Duplicate key 2px in map (2px: bar, 1px + 1px: baz).') do
664
- eval("(2px: bar, 1px + 1px: baz)")
665
- end
666
- assert_raise_message(Sass::SyntaxError, 'Duplicate key #0000ff in map (blue: bar, #00f: baz).') do
667
- eval("(blue: bar, #00f: baz)")
668
- end
669
- end
670
-
671
- def test_non_duplicate_map_keys
672
- # These shouldn't throw errors
673
- eval("(foo: foo, bar: bar)")
674
- eval("(2px: foo, 2: bar)")
675
- eval("(2px: foo, 2em: bar)")
676
- eval("('2px': foo, 2px: bar)")
677
- end
678
-
679
- def test_map_syntax_errors
680
- assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "(foo:": expected expression (e.g. 1px, bold), was ")"') do
681
- eval("(foo:)")
682
- end
683
- assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "(": expected ")", was ":bar)"') do
684
- eval("(:bar)")
685
- end
686
- assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "(foo, bar": expected ")", was ": baz)"') do
687
- eval("(foo, bar: baz)")
688
- end
689
- assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "(foo: bar, baz": expected ":", was ")"') do
690
- eval("(foo: bar, baz)")
691
- end
692
- end
693
-
694
- def test_deep_argument_error_not_unwrapped
695
- # JRuby (as of 1.6.7.2) offers no way of distinguishing between
696
- # argument errors caused by programming errors in a function and
697
- # argument errors explicitly thrown within that function.
698
- return if RUBY_PLATFORM =~ /java/
699
-
700
- # Don't validate the message; it's different on Rubinius.
701
- assert_raises(ArgumentError) {resolve("arg-error()")}
702
- end
703
-
704
- def test_shallow_argument_error_unwrapped
705
- assert_raise_message(Sass::SyntaxError, "wrong number of arguments (1 for 0) for `arg-error'") {resolve("arg-error(1)")}
706
- end
707
-
708
- def test_boolean_ops_short_circuit
709
- assert_equal "false", resolve("$ie and $ie <= 7", {}, env('ie' => Sass::Script::Value::Bool.new(false)))
710
- assert_equal "true", resolve("$ie or $undef", {}, env('ie' => Sass::Script::Value::Bool.new(true)))
711
- end
712
-
713
- def test_selector
714
- env = Sass::Environment.new
715
- assert_equal "true", resolve("& == null", {}, env)
716
-
717
- env.selector = selector('.foo.bar .baz.bang, .bip.bop')
718
- assert_equal ".foo.bar .baz.bang, .bip.bop", resolve("&", {}, env)
719
- assert_equal ".foo.bar .baz.bang", resolve("nth(&, 1)", {}, env)
720
- assert_equal ".bip.bop", resolve("nth(&, 2)", {}, env)
721
- assert_equal ".foo.bar", resolve("nth(nth(&, 1), 1)", {}, env)
722
- assert_equal ".baz.bang", resolve("nth(nth(&, 1), 2)", {}, env)
723
- assert_equal ".bip.bop", resolve("nth(nth(&, 2), 1)", {}, env)
724
- assert_equal "string", resolve("type-of(nth(nth(&, 1), 1))", {}, env)
725
-
726
- env.selector = selector('.foo > .bar')
727
- assert_equal ".foo > .bar", resolve("&", {}, env)
728
- assert_equal ".foo > .bar", resolve("nth(&, 1)", {}, env)
729
- assert_equal ".foo", resolve("nth(nth(&, 1), 1)", {}, env)
730
- assert_equal ">", resolve("nth(nth(&, 1), 2)", {}, env)
731
- assert_equal ".bar", resolve("nth(nth(&, 1), 3)", {}, env)
732
- end
733
-
734
- def test_selector_with_newlines
735
- env = Sass::Environment.new
736
- env.selector = selector(".foo.bar\n.baz.bang,\n\n.bip.bop")
737
- assert_equal ".foo.bar .baz.bang, .bip.bop", resolve("&", {}, env)
738
- assert_equal ".foo.bar .baz.bang", resolve("nth(&, 1)", {}, env)
739
- assert_equal ".bip.bop", resolve("nth(&, 2)", {}, env)
740
- assert_equal ".foo.bar", resolve("nth(nth(&, 1), 1)", {}, env)
741
- assert_equal ".baz.bang", resolve("nth(nth(&, 1), 2)", {}, env)
742
- assert_equal ".bip.bop", resolve("nth(nth(&, 2), 1)", {}, env)
743
- assert_equal "string", resolve("type-of(nth(nth(&, 1), 1))", {}, env)
744
- end
745
-
746
- def test_setting_global_variable_globally
747
- assert_no_warning {assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))}
748
- .foo {
749
- a: 1; }
750
-
751
- .bar {
752
- b: 2; }
753
- CSS
754
- $var: 1;
755
-
756
- .foo {
757
- a: $var;
758
- }
759
-
760
- $var: 2;
761
-
762
- .bar {
763
- b: $var;
764
- }
765
- SCSS
766
- end
767
-
768
- def test_setting_global_variable_locally
769
- assert_no_warning {assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))}
770
- .bar {
771
- a: x;
772
- b: y;
773
- c: z; }
774
- CSS
775
- $var1: 1;
776
- $var3: 3;
777
-
778
- .foo {
779
- $var1: x !global;
780
- $var2: y !global;
781
- @each $var3 in _ {
782
- $var3: z !global;
783
- }
784
- }
785
-
786
- .bar {
787
- a: $var1;
788
- b: $var2;
789
- c: $var3;
790
- }
791
- SCSS
792
- end
793
-
794
- def test_setting_global_variable_locally_with_default
795
- assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))
796
- .bar {
797
- a: 1;
798
- b: y;
799
- c: z; }
800
- CSS
801
- $var1: 1;
802
-
803
- .foo {
804
- $var1: x !global !default;
805
- $var2: y !global !default;
806
- @each $var3 in _ {
807
- $var3: z !global !default;
808
- }
809
- }
810
-
811
- .bar {
812
- a: $var1;
813
- b: $var2;
814
- c: $var3;
815
- }
816
- SCSS
817
- end
818
-
819
- def test_setting_local_variable
820
- assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))
821
- .a {
822
- value: inside; }
823
-
824
- .b {
825
- value: outside; }
826
- CSS
827
- $var: outside;
828
-
829
- .a {
830
- $var: inside;
831
- value: $var;
832
- }
833
-
834
- .b {
835
- value: $var;
836
- }
837
- SCSS
838
- end
839
-
840
- def test_setting_local_variable_from_inner_scope
841
- assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))
842
- .a .b {
843
- value: inside; }
844
- .a .c {
845
- value: inside; }
846
- CSS
847
- .a {
848
- $var: outside;
849
-
850
- .b {
851
- $var: inside;
852
- value: $var;
853
- }
854
-
855
- .c {
856
- value: $var;
857
- }
858
- }
859
- SCSS
860
- end
861
-
862
- def test_if_can_assign_to_global_variables
863
- assert_equal <<CSS, render(<<SCSS, :syntax => :scss)
864
- .a {
865
- b: 2; }
866
- CSS
867
- $var: 1;
868
- @if true {$var: 2}
869
- .a {b: $var}
870
- SCSS
871
- end
872
-
873
- def test_else_can_assign_to_global_variables
874
- assert_equal <<CSS, render(<<SCSS, :syntax => :scss)
875
- .a {
876
- b: 2; }
877
- CSS
878
- $var: 1;
879
- @if false {}
880
- @else {$var: 2}
881
- .a {b: $var}
882
- SCSS
883
- end
884
-
885
- def test_for_can_assign_to_global_variables
886
- assert_equal <<CSS, render(<<SCSS, :syntax => :scss)
887
- .a {
888
- b: 2; }
889
- CSS
890
- $var: 1;
891
- @for $i from 1 to 2 {$var: 2}
892
- .a {b: $var}
893
- SCSS
894
- end
895
-
896
- def test_each_can_assign_to_global_variables
897
- assert_equal <<CSS, render(<<SCSS, :syntax => :scss)
898
- .a {
899
- b: 2; }
900
- CSS
901
- $var: 1;
902
- @each $a in 1 {$var: 2}
903
- .a {b: $var}
904
- SCSS
905
- end
906
-
907
- def test_while_can_assign_to_global_variables
908
- assert_equal <<CSS, render(<<SCSS, :syntax => :scss)
909
- .a {
910
- b: 2; }
911
- CSS
912
- $var: 1;
913
- @while $var != 2 {$var: 2}
914
- .a {b: $var}
915
- SCSS
916
- end
917
-
918
- def test_if_doesnt_leak_local_variables
919
- assert_raise_message(Sass::SyntaxError, 'Undefined variable: "$var".') do
920
- render(<<SCSS, :syntax => :scss)
921
- @if true {$var: 1}
922
- .a {b: $var}
923
- SCSS
924
- end
925
- end
926
-
927
- def test_else_doesnt_leak_local_variables
928
- assert_raise_message(Sass::SyntaxError, 'Undefined variable: "$var".') do
929
- render(<<SCSS, :syntax => :scss)
930
- @if false {}
931
- @else {$var: 1}
932
- .a {b: $var}
933
- SCSS
934
- end
935
- end
936
-
937
- def test_for_doesnt_leak_local_variables
938
- assert_raise_message(Sass::SyntaxError, 'Undefined variable: "$var".') do
939
- render(<<SCSS, :syntax => :scss)
940
- @for $i from 1 to 2 {$var: 1}
941
- .a {b: $var}
942
- SCSS
943
- end
944
- end
945
-
946
- def test_each_doesnt_leak_local_variables
947
- assert_raise_message(Sass::SyntaxError, 'Undefined variable: "$var".') do
948
- render(<<SCSS, :syntax => :scss)
949
- @each $a in 1 {$var: 1}
950
- .a {b: $var}
951
- SCSS
952
- end
953
- end
954
-
955
- def test_while_doesnt_leak_local_variables
956
- assert_raise_message(Sass::SyntaxError, 'Undefined variable: "$var".') do
957
- render(<<SCSS, :syntax => :scss)
958
- $iter: true;
959
- @while $iter {
960
- $var: 1;
961
- $iter: false;
962
- }
963
- .a {b: $var}
964
- SCSS
965
- end
966
- end
967
-
968
- def test_color_format_is_preserved_by_default
969
- assert_equal "blue", resolve("blue")
970
- assert_equal "bLuE", resolve("bLuE")
971
- assert_equal "#00f", resolve("#00f")
972
- assert_equal "blue #00F", resolve("blue #00F")
973
- assert_equal "blue", resolve("nth(blue #00F, 1)")
974
- assert_equal "#00F", resolve("nth(blue #00F, 2)")
975
- end
976
-
977
- def test_color_format_isnt_always_preserved_in_compressed_style
978
- assert_equal "red", resolve("red", :style => :compressed)
979
- assert_equal "red", resolve("#f00", :style => :compressed)
980
- assert_equal "red red", resolve("red #f00", :style => :compressed)
981
- assert_equal "red", resolve("nth(red #f00, 2)", :style => :compressed)
982
- end
983
-
984
- def test_color_format_is_sometimes_preserved_in_compressed_style
985
- assert_equal "ReD", resolve("ReD", :style => :compressed)
986
- assert_equal "blue", resolve("blue", :style => :compressed)
987
- assert_equal "#00f", resolve("#00f", :style => :compressed)
988
- end
989
-
990
- def test_color_format_isnt_preserved_when_modified
991
- assert_equal "magenta", resolve("#f00 + #00f")
992
- end
993
-
994
- def test_ids
995
- assert_equal "#foo", resolve("#foo")
996
- assert_equal "#abcd", resolve("#abcd")
997
- assert_equal "#abc-def", resolve("#abc-def")
998
- assert_equal "#abc_def", resolve("#abc_def")
999
- assert_equal "#uvw-xyz", resolve("#uvw-xyz")
1000
- assert_equal "#uvw_xyz", resolve("#uvw_xyz")
1001
- assert_equal "#uvwxyz", resolve("#uvw + xyz")
1002
- end
1003
-
1004
- def test_scientific_notation
1005
- assert_equal "2000", resolve("2e3")
1006
- assert_equal "2000", resolve("2E3")
1007
- assert_equal "2000", resolve("2e+3")
1008
- assert_equal "2000em", resolve("2e3em")
1009
- assert_equal "25000000000", resolve("2.5e10")
1010
- assert_equal "0.1234", resolve("1234e-4")
1011
- assert_equal "12.34", resolve("1.234e1")
1012
- end
1013
-
1014
- def test_identifier_units
1015
- assert_equal "5-foo", resolve("2-foo + 3-foo")
1016
- assert_equal "5-foo-", resolve("2-foo- + 3-foo-")
1017
- assert_equal "5-\\u2603", resolve("2-\\u2603 + 3-\\u2603")
1018
- end
1019
-
1020
- def test_backslash_newline_in_string
1021
- assert_equal 'foobar', resolve("\"foo\\\nbar\"")
1022
- assert_equal 'foobar', resolve("'foo\\\nbar'")
1023
- end
1024
-
1025
- def test_unclosed_special_fun
1026
- assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "calc(foo()": expected ")", was ""') do
1027
- resolve("calc(foo()")
1028
- end
1029
- assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "calc(#{\')\'}": expected ")", was ""') do
1030
- resolve("calc(\#{')'}")
1031
- end
1032
- assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "calc(#{foo": expected "}", was ""') do
1033
- resolve("calc(\#{foo")
1034
- end
1035
- end
1036
-
1037
- def test_special_fun_with_interpolation
1038
- assert_equal "calc())", resolve("calc(\#{')'})")
1039
- assert_equal "calc(# {foo})", resolve("calc(# {foo})")
1040
- end
1041
-
1042
- # Regression Tests
1043
-
1044
- def test_interpolation_after_string
1045
- assert_equal '"foobar" 2', resolve('"foobar" #{2}')
1046
- assert_equal "calc(1 + 2) 3", resolve('calc(1 + 2) #{3}')
1047
- end
1048
-
1049
- def test_repeatedly_modified_color
1050
- assert_equal(<<CSS, render(<<SASS))
1051
- a {
1052
- link-color: #161C14;
1053
- link-color-hover: black;
1054
- link-color-tap: rgba(22, 28, 20, 0.3); }
1055
- CSS
1056
- $green: #161C14
1057
- $link-color: $green
1058
- $link-color-hover: darken($link-color, 10%)
1059
- $link-color-tap: rgba($green, 0.3)
1060
-
1061
- a
1062
- link-color: $link-color
1063
- link-color-hover: $link-color-hover
1064
- link-color-tap: $link-color-tap
1065
- SASS
1066
- end
1067
-
1068
- def test_inspect_divided_numbers
1069
- assert_equal "1px/2px", resolve("inspect(1px/2px)")
1070
- assert_equal "0.5", resolve("inspect((1px/2px))")
1071
- end
1072
-
1073
- def test_minus_without_whitespace
1074
- assert_equal "5px", resolve("15px-10px")
1075
- assert_equal "5px-", resolve("15px--10px-")
1076
- end
1077
-
1078
- def test_minus_preceded_by_comment
1079
- assert_equal "15px -10px", resolve("15px/**/-10px")
1080
- end
1081
-
1082
- def test_user_defined_function_forces_division
1083
- assert_equal(<<CSS, render(<<SASS))
1084
- a {
1085
- b: 10px; }
1086
- CSS
1087
- @function foo()
1088
- @return 20px
1089
-
1090
- a
1091
- b: (foo() / 2)
1092
- SASS
1093
-
1094
- assert_equal(<<CSS, render(<<SASS))
1095
- a {
1096
- b: 10px; }
1097
- CSS
1098
- @function foo()
1099
- @return 20px
1100
-
1101
- a
1102
- b: foo() / 2
1103
- SASS
1104
- end
1105
-
1106
- def test_funcall_has_higher_precedence_than_color_name
1107
- assert_equal "teal(12)", resolve("teal(12)")
1108
- assert_equal "tealbang(12)", resolve("tealbang(12)")
1109
- assert_equal "teal-bang(12)", resolve("teal-bang(12)")
1110
- assert_equal "teal\\+bang(12)", resolve("teal\\+bang(12)")
1111
- end
1112
-
1113
- def test_funcall_has_higher_precedence_than_true_false_null
1114
- assert_equal "teal(12)", resolve("teal(12)")
1115
- assert_equal "tealbang(12)", resolve("tealbang(12)")
1116
- assert_equal "teal-bang(12)", resolve("teal-bang(12)")
1117
- assert_equal "teal\\+bang(12)", resolve("teal\\+bang(12)")
1118
- end
1119
-
1120
- def test_and_or_not_disallowed_as_function_names
1121
- %w[and or not].each do |name|
1122
- assert_raise_message(Sass::SyntaxError, "Invalid function name \"#{name}\".") do
1123
- render(<<SASS)
1124
- @function #{name}()
1125
- @return null
1126
- SASS
1127
- end
1128
- end
1129
- end
1130
-
1131
- def test_interpolation_after_hash
1132
- assert_equal "#2", resolve('"##{1 + 1}"')
1133
- end
1134
-
1135
- def test_misplaced_comma_in_funcall
1136
- assert_raise_message(Sass::SyntaxError,
1137
- 'Invalid CSS after "foo(bar, ": expected function argument, was ")"') {eval('foo(bar, )')}
1138
- end
1139
-
1140
- def test_color_prefixed_identifier
1141
- assert_equal "tealbang", resolve("tealbang")
1142
- assert_equal "teal-bang", resolve("teal-bang")
1143
- end
1144
-
1145
- def test_op_prefixed_identifier
1146
- assert_equal "notbang", resolve("notbang")
1147
- assert_equal "not-bang", resolve("not-bang")
1148
- assert_equal "or-bang", resolve("or-bang")
1149
- assert_equal "and-bang", resolve("and-bang")
1150
- end
1151
-
1152
- def test_number_initialization
1153
- assert_equal Sass::Script::Value::Number.new(10, ["px"]), Sass::Script::Value::Number.new(10, "px")
1154
- assert_equal Sass::Script::Value::Number.new(10, ["px"], ["em"]), Sass::Script::Value::Number.new(10, "px", "em")
1155
- end
1156
-
1157
- def test_is_unit
1158
- assert Sass::Script::Value::Number.new(10, "px").is_unit?("px")
1159
- assert Sass::Script::Value::Number.new(10).is_unit?(nil)
1160
- assert !Sass::Script::Value::Number.new(10, "px", "em").is_unit?("px")
1161
- assert !Sass::Script::Value::Number.new(10, [], "em").is_unit?("em")
1162
- assert !Sass::Script::Value::Number.new(10, ["px", "em"]).is_unit?("px")
1163
- end
1164
-
1165
- def test_rename_redirect
1166
- assert_no_warning do
1167
- assert_equal Sass::Script::Value::Base, Sass::Script::Literal
1168
- assert_equal Sass::Script::Tree::Node, Sass::Script::Node
1169
- assert_equal Sass::Script::Tree::Operation, Sass::Script::Operation
1170
- assert_equal Sass::Script::Value::String, Sass::Script::String
1171
- end
1172
- end
1173
-
1174
- def test_number_printing
1175
- assert_equal "1", resolve("1")
1176
- assert_equal "1", resolve("1.0")
1177
- assert_equal "1000000000", resolve("1000000000")
1178
- assert_equal "0.00001", resolve("0.00001")
1179
- assert_equal "1.12121", resolve("1.121214")
1180
- assert_equal "1.12122", resolve("1.121215")
1181
- assert_equal "Infinity", resolve("(1.0/0.0)")
1182
- assert_equal "-Infinity", resolve("(-1.0/0.0)")
1183
- assert_equal "NaN", resolve("(0.0/0.0)")
1184
- end
1185
-
1186
- def test_equality_uses_an_epsilon
1187
- # At least on my machine, this calculation introduces a floating point error:
1188
- # 29.0 / 7 * 7
1189
- # => 29.000000000000004
1190
- assert_equal "true", resolve("29 == (29 / 7 * 7)")
1191
- end
1192
-
1193
- def test_compressed_output_of_numbers_with_leading_zeros
1194
- assert_equal "1.5", resolve("1.5", :style => :compressed)
1195
- assert_equal ".5", resolve("0.5", :style => :compressed)
1196
- assert_equal "-.5", resolve("-0.5", :style => :compressed)
1197
- assert_equal "0.5", resolve("0.5", :style => :compact)
1198
- end
1199
-
1200
- def test_interpolation_without_deprecation_warning
1201
- assert_no_warning {assert_equal "a", resolve('#{a}')}
1202
- assert_no_warning {assert_equal "abc", resolve('a#{b}c')}
1203
- assert_no_warning {assert_equal "+ a", resolve('+ #{a}')}
1204
- assert_no_warning {assert_equal "/ a", resolve('/ #{a}')}
1205
- assert_no_warning {assert_equal "1 / a", resolve('1 / #{a}')}
1206
- assert_no_warning {assert_equal "a / b", resolve('#{a} / #{b}')}
1207
- assert_no_warning {assert_equal "foo(1 = a)", resolve('foo(1 = #{a})')}
1208
- assert_no_warning {assert_equal "foo(a = b)", resolve('foo(#{a} = #{b})')}
1209
- assert_no_warning {assert_equal "-a", resolve('-#{a}')}
1210
- assert_no_warning {assert_equal "1-a", resolve('1-#{a}')}
1211
- assert_no_warning {assert_equal "a- 1", resolve('#{a}- 1')}
1212
- assert_no_warning {assert_equal "a-1", resolve('#{a}-1')}
1213
- assert_no_warning {assert_equal "a-b", resolve('#{a}-#{b}')}
1214
- assert_no_warning {assert_equal "a1", resolve('#{a}1')}
1215
- assert_no_warning {assert_equal "ab", resolve('#{a}b')}
1216
- assert_no_warning {assert_equal "1a", resolve('1#{a}')}
1217
- assert_no_warning {assert_equal "ba", resolve('b#{a}')}
1218
- end
1219
-
1220
- def test_leading_interpolation_with_deprecation_warning
1221
- assert_equal "ab == 1", resolve_with_interp_warning('#{a + b} == 1')
1222
- assert_equal "ab != 1", resolve_with_interp_warning('#{a + b} != 1')
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(
1232
- "abvar",
1233
- resolve_with_interp_warning(
1234
- '#{a + b}$var', '"#{a + b}#{$var}"',
1235
- env('var' => Sass::Script::Value::String.new("var"))))
1236
- assert_equal(
1237
- "varab",
1238
- resolve_with_interp_warning(
1239
- '$var#{a + b}', '"#{$var}#{a + b}"',
1240
- env('var' => Sass::Script::Value::String.new("var"))))
1241
- assert_equal "ab1", resolve_with_interp_warning('#{a + b}(1)', '"#{a + b}1"')
1242
- assert_equal "1ab", resolve_with_interp_warning('(1)#{a + b}', '"1#{a + b}"')
1243
- end
1244
-
1245
- def test_trailing_interpolation_with_deprecation_warning
1246
- assert_equal "not ab", resolve_with_interp_warning('not #{a + b}')
1247
- assert_equal "1 and ab", resolve_with_interp_warning('1 and #{a + b}')
1248
- assert_equal "1 or ab", resolve_with_interp_warning('1 or #{a + b}')
1249
- assert_equal "1 == ab", resolve_with_interp_warning('1 == #{a + b}')
1250
- assert_equal "1 != ab", resolve_with_interp_warning('1 != #{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 "- ab", resolve_with_interp_warning('- #{a + b}')
1260
- assert_equal "1- ab", resolve_with_interp_warning('1- #{a + b}')
1261
- assert_equal "- ab 2 3", resolve_with_interp_warning('- #{a + b} 2 3', '"- #{a + b} #{2 3}"')
1262
- end
1263
-
1264
- def test_brackteing_interpolation_with_deprecation_warning
1265
- assert_equal "ab == cd", resolve_with_interp_warning('#{a + b} == #{c + d}')
1266
- assert_equal "ab != cd", resolve_with_interp_warning('#{a + b} != #{c + d}')
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
- end
1276
-
1277
- def test_interp_warning_formatting
1278
- resolve_with_interp_warning('#{1} + 1', '"1 + 1"')
1279
- resolve_with_interp_warning('#{1} + "foo"', '\'1 + "foo"\'')
1280
- resolve_with_interp_warning('#{1} + \'foo\'', '\'1 + "foo"\'')
1281
-
1282
- resolve_with_interp_warning('#{1} + "#{a + b}"', '\'1 + "#{a + b}"\'')
1283
- resolve_with_interp_warning('"#{a + b}" + #{1}', '\'"#{a + b}" + 1\'')
1284
- resolve_with_interp_warning('"#{a + b}" + #{1} + "#{c + d}"', '\'"#{a + b}" + 1 + "#{c + d}"\'')
1285
-
1286
- resolve_with_interp_warning('#{1} + "\'"', '"1 + \\"\'\\""')
1287
- resolve_with_interp_warning('#{1} + \'"\'', '"1 + \'\\"\'"')
1288
- resolve_with_interp_warning('#{1} + "\'\\""', '"1 + \\"\'\\\\\\"\\""')
1289
- end
1290
-
1291
- def test_inactive_lazy_interpolation_deprecation_warning
1292
- assert_equal '1, 2, 3', assert_no_warning {resolve('1, #{2}, 3')}
1293
- assert_equal '1, 2, 3', assert_no_warning {resolve('1, 2, #{3}')}
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
-
1299
- assert_equal '+1 2 3', assert_no_warning {resolve('+#{1} 2 3')}
1300
- assert_equal '-1 2 3', assert_no_warning {resolve('-#{1} 2 3')}
1301
- assert_equal '/1 2 3', assert_no_warning {resolve('/#{1} 2 3')}
1302
-
1303
- assert_equal '1, 2, 31', assert_no_warning {resolve('(1, #{2}, 3) + 1')}
1304
- assert_equal '11, 2, 3', assert_no_warning {resolve('1 + (1, #{2}, 3)')}
1305
-
1306
- assert_equal 'a, b, c', assert_no_warning {resolve('selector-parse((a, #{b}, c))')}
1307
- end
1308
-
1309
- def test_active_lazy_interpolation_deprecation_warning
1310
- assert_equal "1, 2, 3", resolve_with_lazy_interp_warning('quote((1, #{2}, 3))', '"1, 2, 3"')
1311
- assert_equal "1", resolve_with_lazy_interp_warning('length((1, #{2}, 3))', '"1, 2, 3"')
1312
- assert_equal "1, 2, 3", resolve_with_lazy_interp_warning('inspect((1, #{2}, 3))', '"1, 2, 3"')
1313
- assert_equal "string", resolve_with_lazy_interp_warning('type-of((1, #{2}, 3))', '"1, 2, 3"')
1314
-
1315
- assert_equal "+1 2 3", resolve_with_lazy_interp_warning('quote((+#{1} 2 3))', '"+1 #{2 3}"')
1316
- assert_equal "/1 2 3", resolve_with_lazy_interp_warning('quote((/#{1} 2 3))', '"/1 #{2 3}"')
1317
- assert_equal "-1 2 3", resolve_with_lazy_interp_warning('quote((-#{1} 2 3))', '"-1 #{2 3}"')
1318
- end
1319
-
1320
- def test_comparison_of_complex_units
1321
- # Tests for issue #1960
1322
- assert_warning(<<WARNING) do
1323
- DEPRECATION WARNING on line 1 of test_comparison_of_complex_units_inline.sass:
1324
- The result of `10 == 10px` will be `false` in future releases of Sass.
1325
- Unitless numbers will no longer be equal to the same numbers with units.
1326
- WARNING
1327
- assert_equal "true", resolve("10 == 2 * 5px")
1328
- end
1329
- assert_warning(<<WARNING) do
1330
- DEPRECATION WARNING on line 1 of test_comparison_of_complex_units_inline.sass:
1331
- The result of `10 == 10px*px` will be `false` in future releases of Sass.
1332
- Unitless numbers will no longer be equal to the same numbers with units.
1333
- WARNING
1334
- assert_equal "true", resolve("10 == 2px * 5px")
1335
- end
1336
- assert_equal "true", resolve("10px * 1px == 2px * 5px")
1337
- assert_equal "true", resolve("5px * 1px < 2px * 5px")
1338
- end
1339
-
1340
- private
1341
-
1342
- def resolve_with_lazy_interp_warning(str, contents = nil, environment = env)
1343
- contents ||= "\"#{str}\""
1344
- result = assert_warning(<<WARNING) {resolve(str, {}, environment)}
1345
- DEPRECATION WARNING on line 1 of #{filename_for_test}: \#{} interpolation near operators will be simplified
1346
- in a future version of Sass. To preserve the current behavior, use quotes:
1347
-
1348
- unquote(#{contents})
1349
- WARNING
1350
- $_sass_deprecated_interp_warnings = nil
1351
- result
1352
- end
1353
-
1354
- def resolve_with_interp_warning(str, contents = nil, environment = env)
1355
- contents ||= "\"#{str}\""
1356
- assert_warning(<<WARNING) {resolve(str, {}, environment)}
1357
- DEPRECATION WARNING on line 1 of #{filename_for_test}: \#{} interpolation near operators will be simplified
1358
- in a future version of Sass. To preserve the current behavior, use quotes:
1359
-
1360
- unquote(#{contents})
1361
-
1362
- You can use the sass-convert command to automatically fix most cases.
1363
- WARNING
1364
- end
1365
-
1366
- def resolve(str, opts = {}, environment = env)
1367
- munge_filename opts
1368
- val = eval(str, opts, environment)
1369
- assert_kind_of Sass::Script::Value::Base, val
1370
- val.options = opts
1371
- val.is_a?(Sass::Script::Value::String) ? val.value : val.to_s
1372
- end
1373
-
1374
- def resolve_quoted(str, opts = {}, environment = env)
1375
- munge_filename opts
1376
- val = eval(str, opts, environment)
1377
- assert_kind_of Sass::Script::Value::Base, val
1378
- val.to_s
1379
- end
1380
-
1381
- def assert_unquoted(str, opts = {}, environment = env)
1382
- munge_filename opts
1383
- val = eval(str, opts, environment)
1384
- assert_kind_of Sass::Script::Value::String, val
1385
- assert_equal :identifier, val.type
1386
- end
1387
-
1388
- def assert_quoted(str, opts = {}, environment = env)
1389
- munge_filename opts
1390
- val = eval(str, opts, environment)
1391
- assert_kind_of Sass::Script::Value::String, val
1392
- assert_equal :string, val.type
1393
- end
1394
-
1395
- def eval(str, opts = {}, environment = env)
1396
- munge_filename opts
1397
- Sass::Script.parse(str, opts.delete(:line) || 1,
1398
- opts.delete(:offset) || 0, opts).
1399
- perform(Sass::Environment.new(environment, opts))
1400
- end
1401
-
1402
- def render(sass, options = {})
1403
- munge_filename options
1404
- Sass::Engine.new(sass, options).render
1405
- end
1406
-
1407
- def env(hash = {})
1408
- env = Sass::Environment.new
1409
- hash.each {|k, v| env.set_var(k, v)}
1410
- env
1411
- end
1412
-
1413
- def selector(str)
1414
- parser = Sass::SCSS::StaticParser.new(
1415
- str, filename_for_test, Sass::Importers::Filesystem.new('.'))
1416
- parser.parse_selector
1417
- end
1418
-
1419
- def test_null_is_a_singleton
1420
- assert_same Sass::Script::Value::Null.new, Sass::Script::Value::Null.new
1421
- end
1422
- end