oreorenasass 3.4.4 → 3.4.5

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 (176) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +50 -70
  4. data/Rakefile +5 -26
  5. data/VERSION +1 -1
  6. data/VERSION_NAME +1 -1
  7. data/bin/sass +1 -1
  8. data/bin/scss +1 -1
  9. data/lib/sass.rb +12 -19
  10. data/lib/sass/cache_stores/base.rb +2 -2
  11. data/lib/sass/cache_stores/chain.rb +1 -2
  12. data/lib/sass/cache_stores/filesystem.rb +5 -1
  13. data/lib/sass/cache_stores/memory.rb +1 -1
  14. data/lib/sass/cache_stores/null.rb +2 -2
  15. data/lib/sass/callbacks.rb +0 -1
  16. data/lib/sass/css.rb +13 -11
  17. data/lib/sass/engine.rb +173 -424
  18. data/lib/sass/environment.rb +58 -148
  19. data/lib/sass/error.rb +14 -11
  20. data/lib/sass/exec.rb +703 -5
  21. data/lib/sass/importers/base.rb +6 -49
  22. data/lib/sass/importers/filesystem.rb +19 -44
  23. data/lib/sass/logger.rb +4 -1
  24. data/lib/sass/logger/base.rb +4 -2
  25. data/lib/sass/logger/log_level.rb +7 -3
  26. data/lib/sass/media.rb +23 -20
  27. data/lib/sass/plugin.rb +7 -7
  28. data/lib/sass/plugin/compiler.rb +145 -304
  29. data/lib/sass/plugin/configuration.rb +23 -18
  30. data/lib/sass/plugin/merb.rb +1 -1
  31. data/lib/sass/plugin/staleness_checker.rb +3 -3
  32. data/lib/sass/repl.rb +3 -3
  33. data/lib/sass/script.rb +8 -35
  34. data/lib/sass/script/{value/arg_list.rb → arg_list.rb} +25 -9
  35. data/lib/sass/script/bool.rb +18 -0
  36. data/lib/sass/script/color.rb +606 -0
  37. data/lib/sass/script/css_lexer.rb +4 -8
  38. data/lib/sass/script/css_parser.rb +2 -5
  39. data/lib/sass/script/funcall.rb +245 -0
  40. data/lib/sass/script/functions.rb +408 -1491
  41. data/lib/sass/script/interpolation.rb +79 -0
  42. data/lib/sass/script/lexer.rb +68 -172
  43. data/lib/sass/script/list.rb +85 -0
  44. data/lib/sass/script/literal.rb +221 -0
  45. data/lib/sass/script/{tree/node.rb → node.rb} +12 -22
  46. data/lib/sass/script/{value/null.rb → null.rb} +7 -14
  47. data/lib/sass/script/{value/number.rb → number.rb} +75 -152
  48. data/lib/sass/script/{tree/operation.rb → operation.rb} +24 -17
  49. data/lib/sass/script/parser.rb +110 -245
  50. data/lib/sass/script/string.rb +51 -0
  51. data/lib/sass/script/{tree/string_interpolation.rb → string_interpolation.rb} +4 -5
  52. data/lib/sass/script/{tree/unary_operation.rb → unary_operation.rb} +6 -6
  53. data/lib/sass/script/variable.rb +58 -0
  54. data/lib/sass/scss/css_parser.rb +3 -9
  55. data/lib/sass/scss/parser.rb +421 -450
  56. data/lib/sass/scss/rx.rb +11 -19
  57. data/lib/sass/scss/static_parser.rb +7 -321
  58. data/lib/sass/selector.rb +194 -68
  59. data/lib/sass/selector/abstract_sequence.rb +14 -29
  60. data/lib/sass/selector/comma_sequence.rb +25 -108
  61. data/lib/sass/selector/sequence.rb +66 -159
  62. data/lib/sass/selector/simple.rb +25 -23
  63. data/lib/sass/selector/simple_sequence.rb +63 -173
  64. data/lib/sass/shared.rb +1 -1
  65. data/lib/sass/supports.rb +15 -13
  66. data/lib/sass/tree/charset_node.rb +1 -1
  67. data/lib/sass/tree/comment_node.rb +3 -3
  68. data/lib/sass/tree/css_import_node.rb +11 -11
  69. data/lib/sass/tree/debug_node.rb +2 -2
  70. data/lib/sass/tree/directive_node.rb +4 -21
  71. data/lib/sass/tree/each_node.rb +8 -8
  72. data/lib/sass/tree/extend_node.rb +7 -14
  73. data/lib/sass/tree/for_node.rb +4 -4
  74. data/lib/sass/tree/function_node.rb +4 -9
  75. data/lib/sass/tree/if_node.rb +1 -1
  76. data/lib/sass/tree/import_node.rb +5 -4
  77. data/lib/sass/tree/media_node.rb +14 -4
  78. data/lib/sass/tree/mixin_def_node.rb +4 -4
  79. data/lib/sass/tree/mixin_node.rb +8 -21
  80. data/lib/sass/tree/node.rb +12 -54
  81. data/lib/sass/tree/prop_node.rb +20 -39
  82. data/lib/sass/tree/return_node.rb +2 -3
  83. data/lib/sass/tree/root_node.rb +3 -19
  84. data/lib/sass/tree/rule_node.rb +22 -35
  85. data/lib/sass/tree/supports_node.rb +13 -0
  86. data/lib/sass/tree/trace_node.rb +1 -2
  87. data/lib/sass/tree/variable_node.rb +3 -9
  88. data/lib/sass/tree/visitors/base.rb +8 -5
  89. data/lib/sass/tree/visitors/check_nesting.rb +19 -49
  90. data/lib/sass/tree/visitors/convert.rb +56 -74
  91. data/lib/sass/tree/visitors/cssize.rb +74 -202
  92. data/lib/sass/tree/visitors/deep_copy.rb +5 -10
  93. data/lib/sass/tree/visitors/extend.rb +7 -7
  94. data/lib/sass/tree/visitors/perform.rb +185 -278
  95. data/lib/sass/tree/visitors/set_options.rb +6 -20
  96. data/lib/sass/tree/visitors/to_css.rb +81 -234
  97. data/lib/sass/tree/warn_node.rb +2 -2
  98. data/lib/sass/tree/while_node.rb +2 -2
  99. data/lib/sass/util.rb +152 -522
  100. data/lib/sass/util/multibyte_string_scanner.rb +0 -2
  101. data/lib/sass/util/subset_map.rb +3 -4
  102. data/lib/sass/util/test.rb +1 -0
  103. data/lib/sass/version.rb +22 -20
  104. data/test/Gemfile +3 -0
  105. data/test/Gemfile.lock +10 -0
  106. data/test/sass/cache_test.rb +20 -62
  107. data/test/sass/callbacks_test.rb +1 -1
  108. data/test/sass/conversion_test.rb +2 -296
  109. data/test/sass/css2sass_test.rb +4 -23
  110. data/test/sass/engine_test.rb +354 -411
  111. data/test/sass/exec_test.rb +2 -2
  112. data/test/sass/extend_test.rb +145 -324
  113. data/test/sass/functions_test.rb +86 -873
  114. data/test/sass/importer_test.rb +21 -241
  115. data/test/sass/logger_test.rb +1 -1
  116. data/test/sass/more_results/more_import.css +1 -1
  117. data/test/sass/plugin_test.rb +26 -16
  118. data/test/sass/results/compact.css +1 -1
  119. data/test/sass/results/complex.css +4 -4
  120. data/test/sass/results/expanded.css +1 -1
  121. data/test/sass/results/import.css +1 -1
  122. data/test/sass/results/import_charset_ibm866.css +2 -2
  123. data/test/sass/results/mixins.css +17 -17
  124. data/test/sass/results/nested.css +1 -1
  125. data/test/sass/results/parent_ref.css +2 -2
  126. data/test/sass/results/script.css +3 -3
  127. data/test/sass/results/scss_import.css +1 -1
  128. data/test/sass/script_conversion_test.rb +7 -36
  129. data/test/sass/script_test.rb +53 -485
  130. data/test/sass/scss/css_test.rb +28 -143
  131. data/test/sass/scss/rx_test.rb +4 -4
  132. data/test/sass/scss/scss_test.rb +325 -2119
  133. data/test/sass/templates/scss_import.scss +1 -2
  134. data/test/sass/test_helper.rb +1 -1
  135. data/test/sass/util/multibyte_string_scanner_test.rb +1 -1
  136. data/test/sass/util/subset_map_test.rb +2 -2
  137. data/test/sass/util_test.rb +1 -86
  138. data/test/test_helper.rb +8 -37
  139. metadata +19 -66
  140. data/lib/sass/exec/base.rb +0 -187
  141. data/lib/sass/exec/sass_convert.rb +0 -264
  142. data/lib/sass/exec/sass_scss.rb +0 -424
  143. data/lib/sass/features.rb +0 -47
  144. data/lib/sass/script/tree.rb +0 -16
  145. data/lib/sass/script/tree/funcall.rb +0 -306
  146. data/lib/sass/script/tree/interpolation.rb +0 -118
  147. data/lib/sass/script/tree/list_literal.rb +0 -77
  148. data/lib/sass/script/tree/literal.rb +0 -45
  149. data/lib/sass/script/tree/map_literal.rb +0 -64
  150. data/lib/sass/script/tree/selector.rb +0 -26
  151. data/lib/sass/script/tree/variable.rb +0 -57
  152. data/lib/sass/script/value.rb +0 -11
  153. data/lib/sass/script/value/base.rb +0 -240
  154. data/lib/sass/script/value/bool.rb +0 -35
  155. data/lib/sass/script/value/color.rb +0 -680
  156. data/lib/sass/script/value/helpers.rb +0 -262
  157. data/lib/sass/script/value/list.rb +0 -113
  158. data/lib/sass/script/value/map.rb +0 -70
  159. data/lib/sass/script/value/string.rb +0 -97
  160. data/lib/sass/selector/pseudo.rb +0 -256
  161. data/lib/sass/source/map.rb +0 -210
  162. data/lib/sass/source/position.rb +0 -39
  163. data/lib/sass/source/range.rb +0 -41
  164. data/lib/sass/stack.rb +0 -120
  165. data/lib/sass/tree/at_root_node.rb +0 -83
  166. data/lib/sass/tree/error_node.rb +0 -18
  167. data/lib/sass/tree/keyframe_rule_node.rb +0 -15
  168. data/lib/sass/util/cross_platform_random.rb +0 -19
  169. data/lib/sass/util/normalized_map.rb +0 -130
  170. data/lib/sass/util/ordered_hash.rb +0 -192
  171. data/test/sass/compiler_test.rb +0 -232
  172. data/test/sass/encoding_test.rb +0 -219
  173. data/test/sass/source_map_test.rb +0 -977
  174. data/test/sass/superselector_test.rb +0 -191
  175. data/test/sass/util/normalized_map_test.rb +0 -51
  176. data/test/sass/value_helpers_test.rb +0 -179
@@ -1,49 +1,37 @@
1
1
  #!/usr/bin/env ruby
2
- require 'minitest/autorun'
2
+ require 'test/unit'
3
3
  require File.dirname(__FILE__) + '/../test_helper'
4
- require File.dirname(__FILE__) + '/test_helper'
5
4
  require 'sass/script'
6
- require 'mock_importer'
7
5
 
8
6
  module Sass::Script::Functions
9
7
  def no_kw_args
10
- Sass::Script::Value::String.new("no-kw-args")
8
+ Sass::Script::String.new("no-kw-args")
11
9
  end
12
10
 
13
11
  def only_var_args(*args)
14
- Sass::Script::Value::String.new("only-var-args("+args.map{|a| a.plus(Sass::Script::Value::Number.new(1)).to_s }.join(", ")+")")
12
+ Sass::Script::String.new("only-var-args("+args.map{|a| a.plus(Sass::Script::Number.new(1)).to_s }.join(", ")+")")
15
13
  end
16
14
  declare :only_var_args, [], :var_args => true
17
15
 
18
16
  def only_kw_args(kwargs)
19
- Sass::Script::Value::String.new("only-kw-args(" + kwargs.keys.map {|a| a.to_s}.sort.join(", ") + ")")
17
+ Sass::Script::String.new("only-kw-args(" + kwargs.keys.map {|a| a.to_s}.sort.join(", ") + ")")
20
18
  end
21
19
  declare :only_kw_args, [], :var_kwargs => true
22
-
23
- def deprecated_arg_fn(arg1, arg2, arg3 = nil)
24
- Sass::Script::Value::List.new([arg1, arg2, arg3 || Sass::Script::Value::Null.new], :space)
25
- end
26
- declare :deprecated_arg_fn, [:arg1, :arg2, :arg3], :deprecated => [:arg_1, :arg_2, :arg3]
27
- declare :deprecated_arg_fn, [:arg1, :arg2], :deprecated => [:arg_1, :arg_2]
28
20
  end
29
21
 
30
22
  module Sass::Script::Functions::UserFunctions
31
- def call_options_on_new_value
32
- str = Sass::Script::Value::String.new("foo")
23
+ def call_options_on_new_literal
24
+ str = Sass::Script::String.new("foo")
33
25
  str.options[:foo]
34
26
  str
35
27
  end
36
28
 
37
29
  def user_defined
38
- Sass::Script::Value::String.new("I'm a user-defined string!")
30
+ Sass::Script::String.new("I'm a user-defined string!")
39
31
  end
40
32
 
41
33
  def _preceding_underscore
42
- Sass::Script::Value::String.new("I'm another user-defined string!")
43
- end
44
-
45
- def fetch_the_variable
46
- environment.var('variable')
34
+ Sass::Script::String.new("I'm another user-defined string!")
47
35
  end
48
36
  end
49
37
 
@@ -51,7 +39,7 @@ module Sass::Script::Functions
51
39
  include Sass::Script::Functions::UserFunctions
52
40
  end
53
41
 
54
- class SassFunctionTest < MiniTest::Test
42
+ class SassFunctionTest < Test::Unit::TestCase
55
43
  # Tests taken from:
56
44
  # http://www.w3.org/Style/CSS/Test/CSS3/Color/20070927/html4/t040204-hsl-h-rotating-b.htm
57
45
  # http://www.w3.org/Style/CSS/Test/CSS3/Color/20070927/html4/t040204-hsl-values-b.htm
@@ -90,9 +78,9 @@ class SassFunctionTest < MiniTest::Test
90
78
  assert_equal "#33cccc", evaluate("hsl($hue: 180, $saturation: 60%, $lightness: 50%)")
91
79
  end
92
80
 
93
- def test_hsl_clamps_bounds
94
- assert_equal("#1f1f1f", evaluate("hsl(10, -114, 12)"))
95
- assert_equal("white", evaluate("hsl(10, 10, 256%)"))
81
+ def test_hsl_checks_bounds
82
+ assert_error_message("Saturation -114 must be between 0% and 100% for `hsl'", "hsl(10, -114, 12)");
83
+ assert_error_message("Lightness 256% must be between 0% and 100% for `hsl'", "hsl(10, 10, 256%)");
96
84
  end
97
85
 
98
86
  def test_hsl_checks_types
@@ -108,11 +96,11 @@ class SassFunctionTest < MiniTest::Test
108
96
  assert_equal "rgba(51, 204, 204, 0.4)", evaluate("hsla($hue: 180, $saturation: 60%, $lightness: 50%, $alpha: 0.4)")
109
97
  end
110
98
 
111
- def test_hsla_clamps_bounds
112
- assert_equal("#1f1f1f", evaluate("hsla(10, -114, 12, 1)"))
113
- assert_equal("rgba(255, 255, 255, 0)", evaluate("hsla(10, 10, 256%, 0)"))
114
- assert_equal("rgba(28, 24, 23, 0)", evaluate("hsla(10, 10, 10, -0.1)"))
115
- assert_equal("#1c1817", evaluate("hsla(10, 10, 10, 1.1)"))
99
+ def test_hsla_checks_bounds
100
+ assert_error_message("Saturation -114 must be between 0% and 100% for `hsla'", "hsla(10, -114, 12, 1)");
101
+ assert_error_message("Lightness 256% must be between 0% and 100% for `hsla'", "hsla(10, 10, 256%, 0)");
102
+ assert_error_message("Alpha channel -0.1 must be between 0 and 1 for `hsla'", "hsla(10, 10, 10, -0.1)");
103
+ assert_error_message("Alpha channel 1.1 must be between 0 and 1 for `hsla'", "hsla(10, 10, 10, 1.1)");
116
104
  end
117
105
 
118
106
  def test_hsla_checks_types
@@ -126,43 +114,37 @@ class SassFunctionTest < MiniTest::Test
126
114
  assert_equal("50%", evaluate("percentage(.5)"))
127
115
  assert_equal("100%", evaluate("percentage(1)"))
128
116
  assert_equal("25%", evaluate("percentage(25px / 100px)"))
129
- assert_equal("50%", evaluate("percentage($number: 0.5)"))
117
+ assert_equal("50%", evaluate("percentage($value: 0.5)"))
130
118
  end
131
119
 
132
120
  def test_percentage_checks_types
133
- assert_error_message("$number: 25px is not a unitless number for `percentage'", "percentage(25px)")
134
- assert_error_message("$number: #cccccc is not a unitless number for `percentage'", "percentage(#ccc)")
135
- assert_error_message("$number: \"string\" is not a unitless number for `percentage'", %Q{percentage("string")})
121
+ assert_error_message("$value: 25px is not a unitless number for `percentage'", "percentage(25px)")
122
+ assert_error_message("$value: #cccccc is not a unitless number for `percentage'", "percentage(#ccc)")
123
+ assert_error_message("$value: \"string\" is not a unitless number for `percentage'", %Q{percentage("string")})
136
124
  end
137
125
 
138
126
  def test_round
139
127
  assert_equal("5", evaluate("round(4.8)"))
140
128
  assert_equal("5px", evaluate("round(4.8px)"))
141
129
  assert_equal("5px", evaluate("round(5.49px)"))
142
- assert_equal("5px", evaluate("round($number: 5.49px)"))
143
- end
130
+ assert_equal("5px", evaluate("round($value: 5.49px)"))
144
131
 
145
- def test_round_checks_types
146
132
  assert_error_message("$value: #cccccc is not a number for `round'", "round(#ccc)")
147
133
  end
148
134
 
149
135
  def test_floor
150
136
  assert_equal("4", evaluate("floor(4.8)"))
151
137
  assert_equal("4px", evaluate("floor(4.8px)"))
152
- assert_equal("4px", evaluate("floor($number: 4.8px)"))
153
- end
138
+ assert_equal("4px", evaluate("floor($value: 4.8px)"))
154
139
 
155
- def test_floor_checks_types
156
140
  assert_error_message("$value: \"foo\" is not a number for `floor'", "floor(\"foo\")")
157
141
  end
158
142
 
159
143
  def test_ceil
160
144
  assert_equal("5", evaluate("ceil(4.1)"))
161
145
  assert_equal("5px", evaluate("ceil(4.8px)"))
162
- assert_equal("5px", evaluate("ceil($number: 4.8px)"))
163
- end
146
+ assert_equal("5px", evaluate("ceil($value: 4.8px)"))
164
147
 
165
- def test_ceil_checks_types
166
148
  assert_error_message("$value: \"a\" is not a number for `ceil'", "ceil(\"a\")")
167
149
  end
168
150
 
@@ -171,15 +153,13 @@ class SassFunctionTest < MiniTest::Test
171
153
  assert_equal("5px", evaluate("abs(-5px)"))
172
154
  assert_equal("5", evaluate("abs(5)"))
173
155
  assert_equal("5px", evaluate("abs(5px)"))
174
- assert_equal("5px", evaluate("abs($number: 5px)"))
175
- end
156
+ assert_equal("5px", evaluate("abs($value: 5px)"))
176
157
 
177
- def test_abs_checks_types
178
158
  assert_error_message("$value: #aaaaaa is not a number for `abs'", "abs(#aaa)")
179
159
  end
180
160
 
181
161
  def test_min
182
- assert_equal("1", evaluate("min(1, 2, 3)"))
162
+ #assert_equal("1", evaluate("min(1, 2, 3)"))
183
163
  assert_equal("1", evaluate("min(3px, 2px, 1)"))
184
164
  assert_equal("4em", evaluate("min(4em)"))
185
165
  assert_equal("10cm", evaluate("min(10cm, 6in)"))
@@ -212,18 +192,26 @@ class SassFunctionTest < MiniTest::Test
212
192
  assert_equal("springgreen", evaluate("rgb(0%, 100%, 50%)"))
213
193
  end
214
194
 
215
- def test_rgb_clamps_bounds
216
- assert_equal("#ff0101", evaluate("rgb(256, 1, 1)"))
217
- assert_equal("#01ff01", evaluate("rgb(1, 256, 1)"))
218
- assert_equal("#0101ff", evaluate("rgb(1, 1, 256)"))
219
- assert_equal("#01ffff", evaluate("rgb(1, 256, 257)"))
220
- assert_equal("#000101", evaluate("rgb(-1, 1, 1)"))
195
+ def test_rgb_tests_bounds
196
+ assert_error_message("$red: Color value 256 must be between 0 and 255 for `rgb'",
197
+ "rgb(256, 1, 1)")
198
+ assert_error_message("$green: Color value 256 must be between 0 and 255 for `rgb'",
199
+ "rgb(1, 256, 1)")
200
+ assert_error_message("$blue: Color value 256 must be between 0 and 255 for `rgb'",
201
+ "rgb(1, 1, 256)")
202
+ assert_error_message("$green: Color value 256 must be between 0 and 255 for `rgb'",
203
+ "rgb(1, 256, 257)")
204
+ assert_error_message("$red: Color value -1 must be between 0 and 255 for `rgb'",
205
+ "rgb(-1, 1, 1)")
221
206
  end
222
207
 
223
- def test_rgb_clamps_percent_bounds
224
- assert_equal("red", evaluate("rgb(100.1%, 0, 0)"))
225
- assert_equal("black", evaluate("rgb(0, -0.1%, 0)"))
226
- assert_equal("blue", evaluate("rgb(0, 0, 101%)"))
208
+ def test_rgb_test_percent_bounds
209
+ assert_error_message("$red: Color value 100.1% must be between 0% and 100% for `rgb'",
210
+ "rgb(100.1%, 0, 0)")
211
+ assert_error_message("$green: Color value -0.1% must be between 0% and 100% for `rgb'",
212
+ "rgb(0, -0.1%, 0)")
213
+ assert_error_message("$blue: Color value 101% must be between 0% and 100% for `rgb'",
214
+ "rgb(0, 0, 101%)")
227
215
  end
228
216
 
229
217
  def test_rgb_tests_types
@@ -239,14 +227,21 @@ class SassFunctionTest < MiniTest::Test
239
227
  assert_equal("rgba(0, 255, 127, 0)", evaluate("rgba($red: 0, $green: 255, $blue: 127, $alpha: 0)"))
240
228
  end
241
229
 
242
- def test_rgba_clamps_bounds
243
- assert_equal("rgba(255, 1, 1, 0.3)", evaluate("rgba(256, 1, 1, 0.3)"))
244
- assert_equal("rgba(1, 255, 1, 0.3)", evaluate("rgba(1, 256, 1, 0.3)"))
245
- assert_equal("rgba(1, 1, 255, 0.3)", evaluate("rgba(1, 1, 256, 0.3)"))
246
- assert_equal("rgba(1, 255, 255, 0.3)", evaluate("rgba(1, 256, 257, 0.3)"))
247
- assert_equal("rgba(0, 1, 1, 0.3)", evaluate("rgba(-1, 1, 1, 0.3)"))
248
- assert_equal("rgba(1, 1, 1, 0)", evaluate("rgba(1, 1, 1, -0.2)"))
249
- assert_equal("#010101", evaluate("rgba(1, 1, 1, 1.2)"))
230
+ def test_rgba_tests_bounds
231
+ assert_error_message("$red: Color value 256 must be between 0 and 255 for `rgba'",
232
+ "rgba(256, 1, 1, 0.3)")
233
+ assert_error_message("$green: Color value 256 must be between 0 and 255 for `rgba'",
234
+ "rgba(1, 256, 1, 0.3)")
235
+ assert_error_message("$blue: Color value 256 must be between 0 and 255 for `rgba'",
236
+ "rgba(1, 1, 256, 0.3)")
237
+ assert_error_message("$green: Color value 256 must be between 0 and 255 for `rgba'",
238
+ "rgba(1, 256, 257, 0.3)")
239
+ assert_error_message("$red: Color value -1 must be between 0 and 255 for `rgba'",
240
+ "rgba(-1, 1, 1, 0.3)")
241
+ assert_error_message("Alpha channel -0.2 must be between 0 and 1 for `rgba'",
242
+ "rgba(1, 1, 1, -0.2)")
243
+ assert_error_message("Alpha channel 1.2 must be between 0 and 1 for `rgba'",
244
+ "rgba(1, 1, 1, 1.2)")
250
245
  end
251
246
 
252
247
  def test_rgba_tests_types
@@ -380,8 +375,8 @@ class SassFunctionTest < MiniTest::Test
380
375
  assert_equal("rgba(0, 0, 0, 0.3)", evaluate("transparentize(rgba(0, 0, 0, 0.5), 0.2)"))
381
376
  assert_equal("rgba(0, 0, 0, 0.1)", evaluate("transparentize(rgba(0, 0, 0, 0.2), 0.1)"))
382
377
  assert_equal("rgba(0, 0, 0, 0.2)", evaluate("fade-out(rgba(0, 0, 0, 0.5), 0.3px)"))
383
- assert_equal("transparent", evaluate("fade_out(rgba(0, 0, 0, 0.2), 0.2)"))
384
- assert_equal("transparent", evaluate("transparentize(rgba(0, 0, 0, 0.2), 1)"))
378
+ assert_equal("rgba(0, 0, 0, 0)", evaluate("fade_out(rgba(0, 0, 0, 0.2), 0.2)"))
379
+ assert_equal("rgba(0, 0, 0, 0)", evaluate("transparentize(rgba(0, 0, 0, 0.2), 1)"))
385
380
  assert_equal("rgba(0, 0, 0, 0.2)", evaluate("transparentize(rgba(0, 0, 0, 0.2), 0)"))
386
381
  assert_equal("rgba(0, 0, 0, 0.2)", evaluate("transparentize($color: rgba(0, 0, 0, 0.2), $amount: 0)"))
387
382
  assert_equal("rgba(0, 0, 0, 0.2)", evaluate("fade-out($color: rgba(0, 0, 0, 0.2), $amount: 0)"))
@@ -696,9 +691,9 @@ class SassFunctionTest < MiniTest::Test
696
691
  "scale-color(blue, $alpha: -101%)")
697
692
 
698
693
  # Unit
699
- assert_error_message("Expected $saturation to have a unit of % but got 80 for `scale-color'",
694
+ assert_error_message("$saturation: Amount 80 must be a % (e.g. 80%) for `scale-color'",
700
695
  "scale-color(blue, $saturation: 80)")
701
- assert_error_message("Expected $alpha to have a unit of % but got 0.5 for `scale-color'",
696
+ assert_error_message("$alpha: Amount 0.5 must be a % (e.g. 0.5%) for `scale-color'",
702
697
  "scale-color(blue, $alpha: 0.5)")
703
698
 
704
699
  # Unknown argument
@@ -798,12 +793,12 @@ class SassFunctionTest < MiniTest::Test
798
793
  assert_equal("blue", evaluate("mix(transparentize(#f00, 1), #00f, 0%)"))
799
794
  assert_equal("rgba(0, 0, 255, 0)", evaluate("mix(#f00, transparentize(#00f, 1), 0%)"))
800
795
  assert_equal("rgba(255, 0, 0, 0)", evaluate("mix(transparentize(#f00, 1), #00f, 100%)"))
801
- assert_equal("rgba(255, 0, 0, 0)", evaluate("mix($color1: transparentize(#f00, 1), $color2: #00f, $weight: 100%)"))
796
+ assert_equal("rgba(255, 0, 0, 0)", evaluate("mix($color-1: transparentize(#f00, 1), $color-2: #00f, $weight: 100%)"))
802
797
  end
803
798
 
804
799
  def test_mix_tests_types
805
- assert_error_message("$color1: \"foo\" is not a color for `mix'", "mix(\"foo\", #f00, 10%)")
806
- assert_error_message("$color2: \"foo\" is not a color for `mix'", "mix(#f00, \"foo\", 10%)")
800
+ assert_error_message("$color-1: \"foo\" is not a color for `mix'", "mix(\"foo\", #f00, 10%)")
801
+ assert_error_message("$color-2: \"foo\" is not a color for `mix'", "mix(#f00, \"foo\", 10%)")
807
802
  assert_error_message("$weight: \"foo\" is not a number for `mix'", "mix(#f00, #baf, \"foo\")")
808
803
  end
809
804
 
@@ -869,83 +864,6 @@ class SassFunctionTest < MiniTest::Test
869
864
  assert_error_message("$string: #ff0000 is not a string for `quote'", "quote(#f00)")
870
865
  end
871
866
 
872
- def test_str_length
873
- assert_equal('3', evaluate('str-length(foo)'))
874
- end
875
-
876
- def test_str_length_requires_a_string
877
- assert_error_message("$string: #ff0000 is not a string for `str-length'", "str-length(#f00)")
878
- end
879
-
880
- def test_str_insert
881
- assert_equal('Xabcd', evaluate('str-insert(abcd, X, 0)'))
882
- assert_equal('Xabcd', evaluate('str-insert(abcd, X, 1)'))
883
- assert_equal('abcXd', evaluate('str-insert(abcd, X, 4)'))
884
- assert_equal('abcdX', evaluate('str-insert(abcd, X, 100)'))
885
- assert_equal('Xabcd', evaluate('str-insert(abcd, X, -100)'))
886
- assert_equal('aXbcd', evaluate('str-insert(abcd, X, -4)'))
887
- assert_equal('abcdX', evaluate('str-insert(abcd, X, -1)'))
888
- end
889
-
890
- def test_str_insert_maintains_quote_of_primary_string
891
- assert_equal('"Xfoo"', evaluate('str-insert("foo", X, 1)'))
892
- assert_equal('"Xfoo"', evaluate('str-insert("foo", "X", 1)'))
893
- assert_equal('Xfoo', evaluate('str-insert(foo, "X", 1)'))
894
- end
895
-
896
- def test_str_insert_asserts_types
897
- assert_error_message("$string: #ff0000 is not a string for `str-insert'", "str-insert(#f00, X, 1)")
898
- assert_error_message("$insert: #ff0000 is not a string for `str-insert'", "str-insert(foo, #f00, 1)")
899
- assert_error_message("$index: #ff0000 is not a number for `str-insert'", "str-insert(foo, X, #f00)")
900
- assert_error_message("Expected $index to be unitless but got 10px for `str-insert'", "str-insert(foo, X, 10px)")
901
- end
902
-
903
- def test_str_index
904
- assert_equal('1', evaluate('str-index(abcd, a)'))
905
- assert_equal('1', evaluate('str-index(abcd, ab)'))
906
- assert_equal(Sass::Script::Value::Null.new, perform('str-index(abcd, X)'))
907
- assert_equal('3', evaluate('str-index(abcd, c)'))
908
- end
909
-
910
- def test_str_index_asserts_types
911
- assert_error_message("$string: #ff0000 is not a string for `str-index'", "str-index(#f00, X)")
912
- assert_error_message("$substring: #ff0000 is not a string for `str-index'", "str-index(asdf, #f00)")
913
- end
914
-
915
- def test_to_lower_case
916
- assert_equal('abcd', evaluate('to-lower-case(ABCD)'))
917
- assert_equal('"abcd"', evaluate('to-lower-case("ABCD")'))
918
- assert_error_message("$string: #ff0000 is not a string for `to-lower-case'", "to-lower-case(#f00)")
919
- end
920
-
921
- def test_to_upper_case
922
- assert_equal('ABCD', evaluate('to-upper-case(abcd)'))
923
- assert_equal('"ABCD"', evaluate('to-upper-case("abcd")'))
924
- assert_error_message("$string: #ff0000 is not a string for `to-upper-case'", "to-upper-case(#f00)")
925
- end
926
-
927
- def test_str_slice
928
- assert_equal('bc', evaluate('str-slice(abcd,2,3)')) # in the middle of the string
929
- assert_equal('a', evaluate('str-slice(abcd,1,1)')) # when start = end
930
- assert_equal('ab', evaluate('str-slice(abcd,1,2)')) # for completeness
931
- assert_equal('abcd', evaluate('str-slice(abcd,1,4)')) # at the end points
932
- assert_equal('abcd', evaluate('str-slice(abcd,0,4)')) # when start is before the start of the string
933
- assert_equal('', evaluate('str-slice(abcd,1,0)')) # when end is before the start of the string
934
- assert_equal('abcd', evaluate('str-slice(abcd,1,100)')) # when end is past the end of the string
935
- assert_equal('', evaluate('str-slice(abcd,2,1)')) # when end is before start
936
- assert_equal('"bc"', evaluate('str-slice("abcd",2,3)')) # when used with a quoted string
937
- assert_equal('bcd', evaluate('str-slice(abcd,2)')) # when end is omitted, you get the remainder of the string
938
- assert_equal('cd', evaluate('str-slice(abcd,-2)')) # when start is negative, it counts from the beginning
939
- assert_equal('bc', evaluate('str-slice(abcd,2,-2)')) # when end is negative it counts in from the end
940
- assert_equal('', evaluate('str-slice(abcd,3,-3)')) # when end is negative and comes before the start
941
- assert_equal('bc', evaluate('str-slice(abcd,-3,-2)')) # when both are negative
942
- assert_error_message("$string: #ff0000 is not a string for `str-slice'", "str-slice(#f00,2,3)")
943
- assert_error_message("$start-at: #ff0000 is not a number for `str-slice'", "str-slice(abcd,#f00,3)")
944
- assert_error_message("$end-at: #ff0000 is not a number for `str-slice'", "str-slice(abcd,2,#f00)")
945
- assert_error_message("Expected $end-at to be unitless but got 3px for `str-slice'", "str-slice(abcd,2,3px)")
946
- assert_error_message("Expected $start-at to be unitless but got 2px for `str-slice'", "str-slice(abcd,2px,3)")
947
- end
948
-
949
867
  def test_user_defined_function
950
868
  assert_equal("I'm a user-defined string!", evaluate("user_defined()"))
951
869
  end
@@ -955,17 +873,12 @@ class SassFunctionTest < MiniTest::Test
955
873
  assert_equal("I'm another user-defined string!", evaluate("-preceding-underscore()"))
956
874
  end
957
875
 
958
- def test_user_defined_function_using_environment
959
- environment = env('variable' => Sass::Script::Value::String.new('The variable'))
960
- assert_equal("The variable", evaluate("fetch_the_variable()", environment))
961
- end
962
-
963
- def test_options_on_new_values_fails
964
- assert_error_message(<<MSG, "call-options-on-new-value()")
965
- The #options attribute is not set on this Sass::Script::Value::String.
876
+ def test_options_on_new_literals_fails
877
+ assert_error_message(<<MSG, "call-options-on-new-literal()")
878
+ The #options attribute is not set on this Sass::Script::String.
966
879
  This error is probably occurring because #to_s was called
967
- on this value within a custom Sass function without first
968
- setting the #options attribute.
880
+ on this literal within a custom Sass function without first
881
+ setting the #option attribute.
969
882
  MSG
970
883
  end
971
884
 
@@ -977,22 +890,6 @@ MSG
977
890
  assert_equal("color", evaluate("type-of(#fff)"))
978
891
  assert_equal("color", evaluate("type-of($value: #fff)"))
979
892
  assert_equal("null", evaluate("type-of(null)"))
980
- assert_equal("list", evaluate("type-of(1 2 3)"))
981
- assert_equal("list", evaluate("type-of((1, 2, 3))"))
982
- assert_equal("list", evaluate("type-of(())"))
983
- assert_equal("map", evaluate("type-of((foo: bar))"))
984
- end
985
-
986
- def test_feature_exists
987
- assert_raises ArgumentError do
988
- Sass.add_feature("my-test-feature")
989
- end
990
- Sass.add_feature("-my-test-feature")
991
- assert_equal("true", evaluate("feature-exists(-my-test-feature)"))
992
- assert_equal("false", evaluate("feature-exists(whatisthisidontevenknow)"))
993
- assert_equal("true", evaluate("feature-exists($feature: -my-test-feature)"))
994
- ensure
995
- Sass::Features::KNOWN_FEATURES.delete("-my-test-feature")
996
893
  end
997
894
 
998
895
  def test_unit
@@ -1017,12 +914,9 @@ MSG
1017
914
  assert_equal(%Q{true}, evaluate("comparable(2px, 1px)"))
1018
915
  assert_equal(%Q{true}, evaluate("comparable(10cm, 3mm)"))
1019
916
  assert_equal(%Q{false}, evaluate("comparable(100px, 3em)"))
1020
- assert_equal(%Q{false}, evaluate("comparable($number1: 100px, $number2: 3em)"))
1021
- end
1022
-
1023
- def test_comparable_checks_types
1024
- assert_error_message("$number1: #ff0000 is not a number for `comparable'", "comparable(#f00, 1px)")
1025
- assert_error_message("$number2: #ff0000 is not a number for `comparable'", "comparable(1px, #f00)")
917
+ assert_equal(%Q{false}, evaluate("comparable($number-1: 100px, $number-2: 3em)"))
918
+ assert_error_message("$number-1: #ff0000 is not a number for `comparable'", "comparable(#f00, 1px)")
919
+ assert_error_message("$number-2: #ff0000 is not a number for `comparable'", "comparable(1px, #f00)")
1026
920
  end
1027
921
 
1028
922
  def test_length
@@ -1033,47 +927,21 @@ MSG
1033
927
  assert_equal("1", evaluate("length(#f00)"))
1034
928
  assert_equal("0", evaluate("length(())"))
1035
929
  assert_equal("4", evaluate("length(1 2 () 3)"))
1036
-
1037
- assert_equal("2", evaluate("length((foo: bar, bar: baz))"))
1038
930
  end
1039
931
 
1040
932
  def test_nth
1041
933
  assert_equal("1", evaluate("nth(1 2 3, 1)"))
1042
934
  assert_equal("2", evaluate("nth(1 2 3, 2)"))
1043
- assert_equal("3", evaluate("nth(1 2 3, -1)"))
1044
- assert_equal("1", evaluate("nth(1 2 3, -3)"))
1045
935
  assert_equal("3", evaluate("nth((1, 2, 3), 3)"))
1046
- assert_equal("3", evaluate("nth($list: (1, 2, 3), $n: 3)"))
1047
936
  assert_equal("foo", evaluate("nth(foo, 1)"))
1048
937
  assert_equal("bar baz", evaluate("nth(foo (bar baz) bang, 2)"))
1049
- assert_error_message("List index 0 must be a non-zero integer for `nth'", "nth(foo, 0)")
1050
- assert_error_message("List index is -10 but list is only 1 item long for `nth'", "nth(foo, -10)")
1051
- assert_error_message("List index 1.5 must be a non-zero integer for `nth'", "nth(foo, 1.5)")
938
+ assert_error_message("List index 0 must be greater than or equal to 1 for `nth'", "nth(foo, 0)")
939
+ assert_error_message("List index -10 must be greater than or equal to 1 for `nth'", "nth(foo, -10)")
940
+ assert_error_message("List index 1.5 must be an integer for `nth'", "nth(foo, 1.5)")
1052
941
  assert_error_message("List index is 5 but list is only 4 items long for `nth'", "nth(1 2 3 4, 5)")
1053
942
  assert_error_message("List index is 2 but list is only 1 item long for `nth'", "nth(foo, 2)")
1054
943
  assert_error_message("List index is 1 but list has no items for `nth'", "nth((), 1)")
1055
944
  assert_error_message("$n: \"foo\" is not a number for `nth'", "nth(1 2 3, foo)")
1056
-
1057
- assert_equal("foo bar", evaluate("nth((foo: bar, bar: baz), 1)"))
1058
- assert_equal("bar baz", evaluate("nth((foo: bar, bar: baz), 2)"))
1059
- end
1060
-
1061
- def test_set_nth
1062
- assert_equal("a 2 3", evaluate("set-nth(1 2 3, 1, a)"))
1063
- assert_equal("1 a 3", evaluate("set-nth(1 2 3, 2, a)"))
1064
- assert_equal("1 2 a", evaluate("set-nth(1 2 3, -1, a)"))
1065
- assert_equal("a 2 3", evaluate("set-nth(1 2 3, -3, a)"))
1066
- assert_equal("a 2 3", evaluate("set-nth($list: 1 2 3, $n: -3, $value: a)"))
1067
- assert_equal("1, 2, a", evaluate("set-nth((1, 2, 3), 3, a)"))
1068
- assert_equal("a", evaluate("set-nth(foo, 1, a)"))
1069
- assert_equal("foo, a b, baz", evaluate("set-nth((foo, bar, baz), 2, (a b))"))
1070
- assert_error_message("List index 0 must be a non-zero integer for `set-nth'", "set-nth(foo, 0, a)")
1071
- assert_error_message("List index is -10 but list is only 1 item long for `set-nth'", "set-nth(foo, -10, a)")
1072
- assert_error_message("List index 1.5 must be a non-zero integer for `set-nth'", "set-nth(foo, 1.5, a)")
1073
- assert_error_message("List index is 5 but list is only 4 items long for `set-nth'", "set-nth(1 2 3 4, 5, a)")
1074
- assert_error_message("List index is 2 but list is only 1 item long for `set-nth'", "set-nth(foo, 2, a)")
1075
- assert_error_message("List index is 1 but list has no items for `set-nth'", "set-nth((), 1, a)")
1076
- assert_error_message("$n: \"foo\" is not a number for `set-nth'", "set-nth(1 2 3, foo, a)")
1077
945
  end
1078
946
 
1079
947
  def test_join
@@ -1113,19 +981,6 @@ MSG
1113
981
 
1114
982
  assert_error_message("Separator name must be space, comma, or auto for `join'", "join(1, 2, baboon)")
1115
983
  assert_error_message("$separator: 12 is not a string for `join'", "join(1, 2, 12)")
1116
-
1117
- assert_equal("foo bar, bar baz, baz bip, bip bop",
1118
- perform("join((foo: bar, bar: baz), (baz: bip, bip: bop))").to_sass)
1119
- assert_equal("(foo bar) (bar baz) (baz bip) (bip bop)",
1120
- perform("join((foo: bar, bar: baz), (baz: bip, bip: bop), space)").to_sass)
1121
- assert_equal("foo bar (baz bip) (bip bop)",
1122
- perform("join(foo bar, (baz: bip, bip: bop))").to_sass)
1123
- assert_equal("foo bar, bar baz, bip, bop",
1124
- perform("join((foo: bar, bar: baz), bip bop)").to_sass)
1125
- assert_equal("baz bip, bip bop",
1126
- perform("join((), (baz: bip, bip: bop))").to_sass)
1127
- assert_equal("foo bar, bar baz",
1128
- perform("join((foo: bar, bar: baz), ())").to_sass)
1129
984
  end
1130
985
 
1131
986
  def test_append
@@ -1161,73 +1016,28 @@ MSG
1161
1016
 
1162
1017
  assert_error_message("Separator name must be space, comma, or auto for `append'", "append(1, 2, baboon)")
1163
1018
  assert_error_message("$separator: 12 is not a string for `append'", "append(1, 2, 12)")
1164
-
1165
- assert_equal("1 2 (foo: bar)", perform("append(1 2, (foo: bar))").to_sass)
1166
- assert_equal("foo bar, bar baz, 1", perform("append((foo: bar, bar: baz), 1)").to_sass)
1167
- assert_equal("foo bar, bar baz, (baz: bip)",
1168
- perform("append((foo: bar, bar: baz), (baz: bip))").to_sass)
1169
1019
  end
1170
1020
 
1171
1021
  def test_zip
1172
1022
  assert_equal("1 3 5, 2 4 6", evaluate("zip(1 2, 3 4, 5 6)"))
1173
1023
  assert_equal("1 4 7, 2 5 8", evaluate("zip(1 2 3, 4 5 6, 7 8)"))
1174
1024
  assert_equal("1 2 3", evaluate("zip(1, 2, 3)"))
1175
- assert_equal("(foo bar) 1 3, (bar baz) 2 4",
1176
- perform("zip((foo: bar, bar: baz), 1 2, 3 4)").to_sass)
1177
1025
  end
1178
1026
 
1179
1027
  def test_index
1180
- null = Sass::Script::Value::Null.new
1181
1028
  assert_equal("1", evaluate("index(1px solid blue, 1px)"))
1182
1029
  assert_equal("2", evaluate("index(1px solid blue, solid)"))
1183
1030
  assert_equal("3", evaluate("index(1px solid blue, #00f)"))
1184
1031
  assert_equal("1", evaluate("index(1px, 1px)"))
1185
- assert_equal(null, perform("index(1px solid blue, 1em)"))
1186
- assert_equal(null, perform("index(1px solid blue, notfound)"))
1187
- assert_equal(null, perform("index(1px, #00f)"))
1188
-
1189
- assert_equal("1", evaluate("index((foo: bar, bar: baz), (foo bar))"))
1190
- assert_equal(null, perform("index((foo: bar, bar: baz), (foo: bar))"))
1191
- end
1192
-
1193
- def test_list_separator
1194
- assert_equal("space", evaluate("list-separator(1 2 3 4 5)"))
1195
- assert_equal("comma", evaluate("list-separator((foo, bar, baz, bip))"))
1196
- assert_equal("comma", evaluate("list-separator((foo, bar, baz bip))"))
1197
- assert_equal("comma", evaluate("list-separator((foo, bar, (baz, bip)))"))
1198
- assert_equal("space", evaluate("list-separator(#f00)"))
1199
- assert_equal("space", evaluate("list-separator(())"))
1200
- assert_equal("space", evaluate("list-separator(1 2 () 3)"))
1201
-
1202
- assert_equal("comma", evaluate("list-separator((foo: bar, bar: baz))"))
1032
+ assert_equal("false", evaluate("index(1px solid blue, 1em)"))
1033
+ assert_equal("false", evaluate("index(1px solid blue, notfound)"))
1034
+ assert_equal("false", evaluate("index(1px, #00f)"))
1203
1035
  end
1204
1036
 
1205
1037
  def test_if
1206
1038
  assert_equal("1px", evaluate("if(true, 1px, 2px)"))
1207
1039
  assert_equal("2px", evaluate("if(false, 1px, 2px)"))
1208
1040
  assert_equal("2px", evaluate("if(null, 1px, 2px)"))
1209
- assert_equal("1px", evaluate("if(true, 1px, $broken)"))
1210
- assert_equal("1px", evaluate("if(false, $broken, 1px)"))
1211
- assert_equal("1px", evaluate("if(false, $if-true: $broken, $if-false: 1px)"))
1212
- assert_equal("1px", evaluate("if(true, $if-true: 1px, $if-false: $broken)"))
1213
- assert_equal(<<CSS, render(<<SCSS))
1214
- .if {
1215
- result: yay; }
1216
- CSS
1217
- .if {
1218
- $something: yay;
1219
- result: if(true, $if-true: $something, $if-false: $broken);
1220
- }
1221
- SCSS
1222
- assert_equal(<<CSS, render(<<SCSS))
1223
- .if {
1224
- result: 1px; }
1225
- CSS
1226
- .if {
1227
- $splat: 1px, 2px;
1228
- result: if(true, $splat...);
1229
- }
1230
- SCSS
1231
1041
  end
1232
1042
 
1233
1043
  def test_counter
@@ -1301,620 +1111,22 @@ SCSS
1301
1111
  assert_equal "only-kw-args(a, b, c)", evaluate("only-kw-args($a: 1, $b: 2, $c: 3)")
1302
1112
  end
1303
1113
 
1304
- def test_unique_id
1305
- last_id, current_id = nil, evaluate("unique-id()")
1306
-
1307
- 50.times do
1308
- last_id, current_id = current_id, evaluate("unique-id()")
1309
- assert_match(/u[a-z0-9]{8}/, current_id)
1310
- refute_equal last_id, current_id
1311
- end
1312
- end
1313
-
1314
- def test_map_get
1315
- assert_equal "1", evaluate("map-get((foo: 1, bar: 2), foo)")
1316
- assert_equal "2", evaluate("map-get((foo: 1, bar: 2), bar)")
1317
- assert_equal "null", perform("map-get((foo: 1, bar: 2), baz)").to_sass
1318
- assert_equal "null", perform("map-get((), foo)").to_sass
1319
- end
1320
-
1321
- def test_map_get_checks_type
1322
- assert_error_message("$map: 12 is not a map for `map-get'", "map-get(12, bar)")
1323
- end
1324
-
1325
- def test_map_merge
1326
- assert_equal("(foo: 1, bar: 2, baz: 3)",
1327
- perform("map-merge((foo: 1, bar: 2), (baz: 3))").to_sass)
1328
- assert_equal("(foo: 1, bar: 2)",
1329
- perform("map-merge((), (foo: 1, bar: 2))").to_sass)
1330
- assert_equal("(foo: 1, bar: 2)",
1331
- perform("map-merge((foo: 1, bar: 2), ())").to_sass)
1332
- end
1333
-
1334
- def test_map_merge_checks_type
1335
- assert_error_message("$map1: 12 is not a map for `map-merge'", "map-merge(12, (foo: 1))")
1336
- assert_error_message("$map2: 12 is not a map for `map-merge'", "map-merge((foo: 1), 12)")
1337
- end
1338
-
1339
- def test_map_remove
1340
- assert_equal("(foo: 1, baz: 3)",
1341
- perform("map-remove((foo: 1, bar: 2, baz: 3), bar)").to_sass)
1342
- assert_equal("(foo: 1, baz: 3)",
1343
- perform("map-remove($map: (foo: 1, bar: 2, baz: 3), $key: bar)").to_sass)
1344
- assert_equal("()",
1345
- perform("map-remove((foo: 1, bar: 2, baz: 3), foo, bar, baz)").to_sass)
1346
- assert_equal("()", perform("map-remove((), foo)").to_sass)
1347
- assert_equal("()", perform("map-remove((), foo, bar)").to_sass)
1348
- end
1349
-
1350
- def test_map_remove_checks_type
1351
- assert_error_message("$map: 12 is not a map for `map-remove'", "map-remove(12, foo)")
1352
- end
1353
-
1354
- def test_map_keys
1355
- assert_equal("foo, bar",
1356
- perform("map-keys((foo: 1, bar: 2))").to_sass)
1357
- assert_equal("()", perform("map-keys(())").to_sass)
1358
- end
1359
-
1360
- def test_map_keys_checks_type
1361
- assert_error_message("$map: 12 is not a map for `map-keys'", "map-keys(12)")
1362
- end
1363
-
1364
- def test_map_values
1365
- assert_equal("1, 2", perform("map-values((foo: 1, bar: 2))").to_sass)
1366
- assert_equal("1, 2, 2",
1367
- perform("map-values((foo: 1, bar: 2, baz: 2))").to_sass)
1368
- assert_equal("()", perform("map-values(())").to_sass)
1369
- end
1370
-
1371
- def test_map_values_checks_type
1372
- assert_error_message("$map: 12 is not a map for `map-values'", "map-values(12)")
1373
- end
1374
-
1375
- def test_map_has_key
1376
- assert_equal "true", evaluate("map-has-key((foo: 1, bar: 1), foo)")
1377
- assert_equal "false", evaluate("map-has-key((foo: 1, bar: 1), baz)")
1378
- assert_equal "false", evaluate("map-has-key((), foo)")
1379
- end
1380
-
1381
- def test_map_has_key_checks_type
1382
- assert_error_message("$map: 12 is not a map for `map-has-key'", "map-has-key(12, foo)")
1383
- end
1384
-
1385
- def test_keywords
1386
- # The actual functionality is tested in tests where real arglists are passed.
1387
- assert_error_message("$args: 12 is not a variable argument list for `keywords'", "keywords(12)")
1388
- assert_error_message(
1389
- "$args: (1 2 3) is not a variable argument list for `keywords'", "keywords(1 2 3)")
1390
- end
1391
-
1392
- def test_partial_list_of_pairs_doesnt_work_as_a_map
1393
- assert_raises(Sass::SyntaxError) {evaluate("map-get((foo bar, baz bang, bip), 1)")}
1394
- assert_raises(Sass::SyntaxError) {evaluate("map-get((foo bar, baz bang, bip bap bop), 1)")}
1395
- assert_raises(Sass::SyntaxError) {evaluate("map-get((foo bar), 1)")}
1396
- end
1397
-
1398
- def test_assert_unit
1399
- ctx = Sass::Script::Functions::EvaluationContext.new(Sass::Environment.new(nil, {}))
1400
- ctx.assert_unit Sass::Script::Value::Number.new(10, ["px"], []), "px"
1401
- ctx.assert_unit Sass::Script::Value::Number.new(10, [], []), nil
1402
-
1403
- begin
1404
- ctx.assert_unit Sass::Script::Value::Number.new(10, [], []), "px"
1405
- fail
1406
- rescue ArgumentError => e
1407
- assert_equal "Expected 10 to have a unit of px", e.message
1408
- end
1409
-
1410
- begin
1411
- ctx.assert_unit Sass::Script::Value::Number.new(10, ["px"], []), nil
1412
- fail
1413
- rescue ArgumentError => e
1414
- assert_equal "Expected 10px to be unitless", e.message
1415
- end
1416
-
1417
- begin
1418
- ctx.assert_unit Sass::Script::Value::Number.new(10, [], []), "px", "arg"
1419
- fail
1420
- rescue ArgumentError => e
1421
- assert_equal "Expected $arg to have a unit of px but got 10", e.message
1422
- end
1423
-
1424
- begin
1425
- ctx.assert_unit Sass::Script::Value::Number.new(10, ["px"], []), nil, "arg"
1426
- fail
1427
- rescue ArgumentError => e
1428
- assert_equal "Expected $arg to be unitless but got 10px", e.message
1429
- end
1430
- end
1431
-
1432
- def test_call_with_positional_arguments
1433
- assert_equal evaluate("lighten(blue, 5%)"), evaluate("call(lighten, blue, 5%)")
1434
- end
1435
-
1436
- def test_call_with_keyword_arguments
1437
- assert_equal(
1438
- evaluate("lighten($color: blue, $amount: 5%)"),
1439
- evaluate("call(lighten, $color: blue, $amount: 5%)"))
1440
- end
1441
-
1442
- def test_call_with_keyword_and_positional_arguments
1443
- assert_equal(
1444
- evaluate("lighten(blue, $amount: 5%)"),
1445
- evaluate("call(lighten, blue, $amount: 5%)"))
1446
- end
1447
-
1448
- def test_call_with_dynamic_name
1449
- assert_equal(
1450
- evaluate("lighten($color: blue, $amount: 5%)"),
1451
- evaluate("call($fn, $color: blue, $amount: 5%)",
1452
- env("fn" => Sass::Script::String.new("lighten"))))
1453
- end
1454
-
1455
- def test_call_uses_local_scope
1456
- assert_equal <<CSS, render(<<SCSS)
1457
- .first-scope {
1458
- a: local; }
1459
-
1460
- .second-scope {
1461
- a: global; }
1462
- CSS
1463
- @function foo() {@return global}
1464
-
1465
- .first-scope {
1466
- @function foo() {@return local}
1467
- a: call(foo);
1468
- }
1469
-
1470
- .second-scope {
1471
- a: call(foo);
1472
- }
1473
- SCSS
1474
- end
1475
-
1476
- def test_call_unknown_function
1477
- assert_equal evaluate("unknown(red, blue)"), evaluate("call(unknown, red, blue)")
1478
- end
1479
-
1480
- def test_call_with_non_string_argument
1481
- assert_error_message "$name: 3px is not a string for `call'", "call(3px)"
1482
- end
1483
-
1484
- def test_errors_in_called_function
1485
- assert_error_message "$color: 3px is not a color for `lighten'", "call(lighten, 3px, 5%)"
1486
- end
1487
-
1488
- def test_variable_exists
1489
- assert_equal <<CSS, render(<<SCSS)
1490
- .test {
1491
- false: false;
1492
- true: true;
1493
- true: true;
1494
- true: true;
1495
- true: true; }
1496
- CSS
1497
- $global-var: has-value;
1498
- .test {
1499
- false: variable-exists(foo);
1500
- $foo: has-value;
1501
- true: variable-exists(foo);
1502
- true: variable-exists($name: foo);
1503
- true: variable-exists(global-var);
1504
- true: variable-exists($name: global-var);
1505
- }
1506
- SCSS
1507
- end
1508
-
1509
- def test_variable_exists_checks_type
1510
- assert_error_message("$name: 1 is not a string for `variable-exists'", "variable-exists(1)")
1511
- end
1512
-
1513
- def test_global_variable_exists
1514
- assert_equal <<CSS, render(<<SCSS)
1515
- .test {
1516
- false: false;
1517
- false: false;
1518
- true: true;
1519
- true: true;
1520
- false: false;
1521
- true: true;
1522
- true: true; }
1523
- CSS
1524
- $g: something;
1525
- $h: null;
1526
- $false: global-variable-exists(foo);
1527
- $true: global-variable-exists(g);
1528
- $named: global-variable-exists($name: g);
1529
- .test {
1530
- $foo: locally-defined;
1531
- false: global-variable-exists(foo);
1532
- false: global-variable-exists(foo2);
1533
- true: global-variable-exists(g);
1534
- true: global-variable-exists(h);
1535
- false: $false;
1536
- true: $true;
1537
- true: $named;
1538
- }
1539
- SCSS
1540
- end
1541
-
1542
- def test_global_variable_exists_checks_type
1543
- assert_error_message("$name: 1 is not a string for `global-variable-exists'",
1544
- "global-variable-exists(1)")
1545
- end
1546
-
1547
- def test_function_exists
1548
- # built-ins
1549
- assert_equal "true", evaluate("function-exists(lighten)")
1550
- # with named argument
1551
- assert_equal "true", evaluate("function-exists($name: lighten)")
1552
- # user-defined
1553
- assert_equal <<CSS, render(<<SCSS)
1554
- .test {
1555
- foo-exists: true;
1556
- bar-exists: false; }
1557
- CSS
1558
- @function foo() { @return "foo" }
1559
- .test {
1560
- foo-exists: function-exists(foo);
1561
- bar-exists: function-exists(bar);
1562
- }
1563
- SCSS
1564
- end
1565
-
1566
- def test_function_exists_checks_type
1567
- assert_error_message("$name: 1 is not a string for `function-exists'", "function-exists(1)")
1568
- end
1569
-
1570
- def test_mixin_exists
1571
- assert_equal "false", evaluate("mixin-exists(foo)")
1572
- # with named argument
1573
- assert_equal "false", evaluate("mixin-exists($name: foo)")
1574
- assert_equal <<CSS, render(<<SCSS)
1575
- .test {
1576
- foo-exists: true;
1577
- bar-exists: false; }
1578
- CSS
1579
- @mixin foo() { foo: exists }
1580
- .test {
1581
- foo-exists: mixin-exists(foo);
1582
- bar-exists: mixin-exists(bar);
1583
- }
1584
- SCSS
1585
- end
1586
-
1587
- def test_mixin_exists_checks_type
1588
- assert_error_message("$name: 1 is not a string for `mixin-exists'", "mixin-exists(1)")
1589
- end
1590
-
1591
- def test_inspect
1592
- assert_equal "()", evaluate("inspect(())")
1593
- assert_equal "null", evaluate("inspect(null)")
1594
- assert_equal "1px null 3px", evaluate("inspect(1px null 3px)")
1595
- assert_equal "(a: 1, b: 2)", evaluate("inspect((a: 1, b: 2))")
1596
- end
1597
-
1598
- def test_random
1599
- Sass::Script::Functions.random_seed = 1
1600
- assert_equal "0.41702", evaluate("random()")
1601
- assert_equal "13", evaluate("random(100)")
1602
- end
1603
-
1604
- def test_random_works_without_a_seed
1605
- if Sass::Script::Functions.instance_variable_defined?("@random_number_generator")
1606
- Sass::Script::Functions.send(:remove_instance_variable, "@random_number_generator")
1607
- end
1608
-
1609
- result = perform("random()")
1610
- assert_kind_of Sass::Script::Number, result
1611
- assert result.value >= 0, "Random number was below 0"
1612
- assert result.value <= 1, "Random number was above 1"
1613
- end
1614
-
1615
- def test_random_with_limit_one
1616
- # Passing 1 as the limit should always return 1, since limit calls return
1617
- # integers from 1 to the argument, so when the argument is 1, its a predicatble
1618
- # outcome
1619
- assert "1", evaluate("random(1)")
1620
- end
1621
-
1622
- def test_random_with_limit_too_low
1623
- assert_error_message("$limit 0 must be greater than or equal to 1 for `random'", "random(0)")
1624
- end
1625
-
1626
- def test_random_with_non_integer_limit
1627
- assert_error_message("Expected $limit to be an integer but got 1.5 for `random'", "random(1.5)")
1628
- end
1629
-
1630
- # This could *possibly* fail, but exceedingly unlikely
1631
- def test_random_is_semi_unique
1632
- if Sass::Script::Functions.instance_variable_defined?("@random_number_generator")
1633
- Sass::Script::Functions.send(:remove_instance_variable, "@random_number_generator")
1634
- end
1635
- refute_equal evaluate("random()"), evaluate("random()")
1636
- end
1637
-
1638
- def test_deprecated_arg_names
1639
- assert_warning <<WARNING do
1640
- DEPRECATION WARNING: The `$arg-1' argument for `deprecated-arg-fn()' has been renamed to `$arg1'.
1641
- DEPRECATION WARNING: The `$arg-2' argument for `deprecated-arg-fn()' has been renamed to `$arg2'.
1642
- WARNING
1643
- assert_equal("1 2 3",
1644
- evaluate("deprecated-arg-fn($arg-1: 1, $arg-2: 2, $arg3: 3)"))
1645
- end
1646
-
1647
- assert_warning <<WARNING do
1648
- DEPRECATION WARNING: The `$arg-1' argument for `deprecated-arg-fn()' has been renamed to `$arg1'.
1649
- DEPRECATION WARNING: The `$arg-2' argument for `deprecated-arg-fn()' has been renamed to `$arg2'.
1650
- WARNING
1651
- assert_equal("1 2",
1652
- evaluate("deprecated-arg-fn($arg-1: 1, $arg-2: 2)"))
1653
- end
1654
-
1655
- assert_warning <<WARNING do
1656
- DEPRECATION WARNING: The `$arg_1' argument for `deprecated-arg-fn()' has been renamed to `$arg1'.
1657
- DEPRECATION WARNING: The `$arg_2' argument for `deprecated-arg-fn()' has been renamed to `$arg2'.
1658
- WARNING
1659
- assert_equal("1 2",
1660
- evaluate("deprecated-arg-fn($arg_1: 1, $arg_2: 2)"))
1661
- end
1662
- end
1663
-
1664
- def test_non_deprecated_arg_names
1665
- assert_equal("1 2 3", evaluate("deprecated-arg-fn($arg1: 1, $arg2: 2, $arg3: 3)"))
1666
- assert_equal("1 2", evaluate("deprecated-arg-fn($arg1: 1, $arg2: 2)"))
1667
- end
1668
-
1669
- ## Selector Functions
1670
-
1671
- def test_selector_argument_parsing
1672
- assert_equal("true", evaluate("selector-parse('.foo') == (join(('.foo',), (), space),)"))
1673
- assert_equal("true", evaluate("selector-parse('.foo .bar') == ('.foo' '.bar',)"))
1674
- assert_equal("true",
1675
- evaluate("selector-parse('.foo .bar, .baz .bang') == ('.foo' '.bar', '.baz' '.bang')"))
1676
-
1677
- assert_equal(".foo %bar", evaluate("selector-parse('.foo %bar')"))
1678
-
1679
- assert_equal("true",
1680
- evaluate("selector-parse(('.foo', '.bar')) == selector-parse('.foo, .bar')"))
1681
- assert_equal("true",
1682
- evaluate("selector-parse('.foo' '.bar') == selector-parse('.foo .bar')"))
1683
-
1684
- assert_equal("true", evaluate("selector-parse(('.foo' '.bar', '.baz' '.bang')) == " +
1685
- "selector-parse('.foo .bar, .baz .bang')"))
1686
- assert_equal("true", evaluate("selector-parse(('.foo .bar', '.baz .bang')) == " +
1687
- "selector-parse('.foo .bar, .baz .bang')"))
1688
-
1689
- # This may throw an error in the future.
1690
- assert_equal("true", evaluate("selector-parse(('.foo, .bar' '.baz, .bang')) == " +
1691
- "selector-parse('.foo, .bar .baz, .bang')"))
1692
- end
1693
-
1694
- def test_selector_argument_validation
1695
- assert_error_message("$selector: 12 is not a valid selector: it must be a string,\n" +
1696
- "a list of strings, or a list of lists of strings for `selector-parse'", "selector-parse(12)")
1697
- assert_error_message("$selector: (((\".foo\" \".bar\"), \".baz\") (\".bang\", \".qux\")) is not a valid selector: it must be a string,\n" +
1698
- "a list of strings, or a list of lists of strings for `selector-parse'",
1699
- "selector-parse(('.foo' '.bar', '.baz') ('.bang', '.qux'))")
1700
- assert_error_message("$selector: \".#\" is not a valid selector: Invalid CSS after \".\": " +
1701
- "expected class name, was \"#\" for `selector-parse'", "selector-parse('.#')")
1702
- assert_error_message("$selector: \"&.foo\" is not a valid selector: Invalid CSS after \"\": " +
1703
- "expected selector, was \"&.foo\" for `selector-parse'", "selector-parse('&.foo')")
1704
- end
1705
-
1706
- def test_selector_nest
1707
- assert_equal(".foo", evaluate("selector-nest('.foo')"))
1708
- assert_equal(".foo .bar", evaluate("selector-nest('.foo', '.bar')"))
1709
- assert_equal(".foo .bar .baz", evaluate("selector-nest('.foo', '.bar', '.baz')"))
1710
- assert_equal(".a .foo .b .bar", evaluate("selector-nest('.a .foo', '.b .bar')"))
1711
- assert_equal(".foo.bar", evaluate("selector-nest('.foo', '&.bar')"))
1712
- assert_equal(".baz .foo.bar", evaluate("selector-nest('.foo', '&.bar', '.baz &')"))
1713
- end
1714
-
1715
- def test_selector_nest_checks_types
1716
- assert_error_message("$selectors: 12 is not a valid selector: it must be a string,\n" +
1717
- "a list of strings, or a list of lists of strings for `selector-nest'",
1718
- "selector-nest(12)")
1719
- assert_error_message("$selectors: 12 is not a valid selector: it must be a string,\n" +
1720
- "a list of strings, or a list of lists of strings for `selector-nest'",
1721
- "selector-nest('.foo', 12)")
1722
- end
1723
-
1724
- def test_selector_nest_argument_validation
1725
- assert_error_message("$selectors: At least one selector must be passed for `selector-nest'",
1726
- "selector-nest()")
1727
- end
1728
-
1729
- def test_selector_append
1730
- assert_equal(".foo.bar", evaluate("selector-append('.foo', '.bar')"))
1731
- assert_equal(".a .foo.b .bar", evaluate("selector-append('.a .foo', '.b .bar')"))
1732
- assert_equal(".foo-suffix", evaluate("selector-append('.foo', '-suffix')"))
1733
- assert_equal(".foo.bar, .foo-suffix", evaluate("selector-append('.foo', '.bar, -suffix')"))
1734
- assert_equal(".foo--suffix", evaluate("selector-append('.foo', '--suffix')"))
1735
- assert_equal(".foo.bar, .foo--suffix", evaluate("selector-append('.foo', '.bar, --suffix')"))
1736
- end
1737
-
1738
- def test_selector_append_checks_types
1739
- assert_error_message("$selectors: 12 is not a valid selector: it must be a string,\n" +
1740
- "a list of strings, or a list of lists of strings for `selector-append'",
1741
- "selector-append(12)")
1742
- assert_error_message("$selectors: 12 is not a valid selector: it must be a string,\n" +
1743
- "a list of strings, or a list of lists of strings for `selector-append'",
1744
- "selector-append('.foo', 12)")
1745
- end
1746
-
1747
- def test_selector_append_errors
1748
- assert_error_message("$selectors: At least one selector must be passed for `selector-append'",
1749
- "selector-append()")
1750
- assert_error_message("Can't append \"> .bar\" to \".foo\" for `selector-append'",
1751
- "selector-append('.foo', '> .bar')")
1752
- assert_error_message("Can't append \"*.bar\" to \".foo\" for `selector-append'",
1753
- "selector-append('.foo', '*.bar')")
1754
- assert_error_message("Can't append \"ns|suffix\" to \".foo\" for `selector-append'",
1755
- "selector-append('.foo', 'ns|suffix')")
1756
- end
1757
-
1758
- def test_selector_extend
1759
- assert_equal(".foo .x, .foo .a .bar, .a .foo .bar",
1760
- evaluate("selector-extend('.foo .x', '.x', '.a .bar')"))
1761
- assert_equal(".foo .x, .foo .bang, .x.bar, .bar.bang",
1762
- evaluate("selector-extend('.foo .x, .x.bar', '.x', '.bang')"))
1763
- assert_equal(".y .x, .foo .x, .y .foo, .foo .foo",
1764
- evaluate("selector-extend('.y .x', '.x, .y', '.foo')"))
1765
- assert_equal(".foo .x, .foo .bar, .foo .bang",
1766
- evaluate("selector-extend('.foo .x', '.x', '.bar, .bang')"))
1767
- assert_equal(".foo.x, .foo",
1768
- evaluate("selector-extend('.foo.x', '.x', '.foo')"))
1769
- end
1770
-
1771
- def test_selector_extend_checks_types
1772
- assert_error_message("$selector: 12 is not a valid selector: it must be a string,\n" +
1773
- "a list of strings, or a list of lists of strings for `selector-extend'",
1774
- "selector-extend(12, '.foo', '.bar')")
1775
- assert_error_message("$extendee: 12 is not a valid selector: it must be a string,\n" +
1776
- "a list of strings, or a list of lists of strings for `selector-extend'",
1777
- "selector-extend('.foo', 12, '.bar')")
1778
- assert_error_message("$extender: 12 is not a valid selector: it must be a string,\n" +
1779
- "a list of strings, or a list of lists of strings for `selector-extend'",
1780
- "selector-extend('.foo', '.bar', 12)")
1781
- end
1782
-
1783
- def test_selector_extend_errors
1784
- assert_error_message("Can't extend .bar .baz: can't extend nested selectors for " +
1785
- "`selector-extend'", "selector-extend('.foo', '.bar .baz', '.bang')")
1786
- assert_error_message("Can't extend >: invalid selector for `selector-extend'",
1787
- "selector-extend('.foo', '>', '.bang')")
1788
- assert_error_message(".bang > can't extend: invalid selector for `selector-extend'",
1789
- "selector-extend('.foo', '.bar', '.bang >')")
1790
- end
1791
-
1792
- def test_selector_replace
1793
- assert_equal(".bar", evaluate("selector-replace('.foo', '.foo', '.bar')"))
1794
- assert_equal(".foo.baz", evaluate("selector-replace('.foo.bar', '.bar', '.baz')"))
1795
- assert_equal(".a .foo.baz", evaluate("selector-replace('.foo.bar', '.bar', '.a .baz')"))
1796
- assert_equal(".foo.bar", evaluate("selector-replace('.foo.bar', '.baz.bar', '.qux')"))
1797
- assert_equal(".bar.qux", evaluate("selector-replace('.foo.bar.baz', '.foo.baz', '.qux')"))
1798
-
1799
- assert_equal(":not(.bar)", evaluate("selector-replace(':not(.foo)', '.foo', '.bar')"))
1800
- assert_equal(".bar", evaluate("selector-replace(':not(.foo)', ':not(.foo)', '.bar')"))
1801
- end
1802
-
1803
- def test_selector_replace_checks_types
1804
- assert_error_message("$selector: 12 is not a valid selector: it must be a string,\n" +
1805
- "a list of strings, or a list of lists of strings for `selector-replace'",
1806
- "selector-replace(12, '.foo', '.bar')")
1807
- assert_error_message("$original: 12 is not a valid selector: it must be a string,\n" +
1808
- "a list of strings, or a list of lists of strings for `selector-replace'",
1809
- "selector-replace('.foo', 12, '.bar')")
1810
- assert_error_message("$replacement: 12 is not a valid selector: it must be a string,\n" +
1811
- "a list of strings, or a list of lists of strings for `selector-replace'",
1812
- "selector-replace('.foo', '.bar', 12)")
1813
- end
1814
-
1815
- def test_selector_replace_errors
1816
- assert_error_message("Can't extend .bar .baz: can't extend nested selectors for " +
1817
- "`selector-replace'", "selector-replace('.foo', '.bar .baz', '.bang')")
1818
- assert_error_message("Can't extend >: invalid selector for `selector-replace'",
1819
- "selector-replace('.foo', '>', '.bang')")
1820
- assert_error_message(".bang > can't extend: invalid selector for `selector-replace'",
1821
- "selector-replace('.foo', '.bar', '.bang >')")
1822
- end
1823
-
1824
- def test_selector_unify
1825
- assert_equal(".foo", evaluate("selector-unify('.foo', '.foo')"))
1826
- assert_equal(".foo.bar", evaluate("selector-unify('.foo', '.bar')"))
1827
- assert_equal(".foo.bar.baz", evaluate("selector-unify('.foo.bar', '.bar.baz')"))
1828
- assert_equal(".a .b .foo.bar, .b .a .foo.bar", evaluate("selector-unify('.a .foo', '.b .bar')"))
1829
- assert_equal(".a .foo.bar", evaluate("selector-unify('.a .foo', '.a .bar')"))
1830
- assert_equal("", evaluate("selector-unify('p', 'a')"))
1831
- assert_equal("", evaluate("selector-unify('.foo >', '.bar')"))
1832
- assert_equal("", evaluate("selector-unify('.foo', '.bar >')"))
1833
- assert_equal(".foo.baz, .foo.bang, .bar.baz, .bar.bang",
1834
- evaluate("selector-unify('.foo, .bar', '.baz, .bang')"))
1835
- end
1836
-
1837
- def test_selector_unify_checks_types
1838
- assert_error_message("$selector1: 12 is not a valid selector: it must be a string,\n" +
1839
- "a list of strings, or a list of lists of strings for `selector-unify'",
1840
- "selector-unify(12, '.foo')")
1841
- assert_error_message("$selector2: 12 is not a valid selector: it must be a string,\n" +
1842
- "a list of strings, or a list of lists of strings for `selector-unify'",
1843
- "selector-unify('.foo', 12)")
1844
- end
1845
-
1846
- def test_simple_selectors
1847
- assert_equal('(.foo,)', evaluate("inspect(simple-selectors('.foo'))"))
1848
- assert_equal('.foo, .bar', evaluate("inspect(simple-selectors('.foo.bar'))"))
1849
- assert_equal('.foo, .bar, :pseudo("flip, flap")',
1850
- evaluate("inspect(simple-selectors('.foo.bar:pseudo(\"flip, flap\")'))"))
1851
- end
1852
-
1853
- def test_simple_selectors_checks_types
1854
- assert_error_message("$selector: 12 is not a string for `simple-selectors'",
1855
- "simple-selectors(12)")
1856
- end
1857
-
1858
- def test_simple_selectors_errors
1859
- assert_error_message("$selector: \".foo .bar\" is not a compound selector for `simple-selectors'",
1860
- "simple-selectors('.foo .bar')")
1861
- assert_error_message("$selector: \".foo,.bar\" is not a compound selector for `simple-selectors'",
1862
- "simple-selectors('.foo,.bar')")
1863
- assert_error_message("$selector: \".#\" is not a valid selector: Invalid CSS after \".\": " +
1864
- "expected class name, was \"#\" for `simple-selectors'", "simple-selectors('.#')")
1865
- end
1866
-
1867
- def test_is_superselector
1868
- assert_equal("true", evaluate("is-superselector('.foo', '.foo.bar')"))
1869
- assert_equal("false", evaluate("is-superselector('.foo.bar', '.foo')"))
1870
- assert_equal("true", evaluate("is-superselector('.foo', '.foo')"))
1871
- assert_equal("true", evaluate("is-superselector('.bar', '.foo .bar')"))
1872
- assert_equal("false", evaluate("is-superselector('.foo .bar', '.bar')"))
1873
- assert_equal("true", evaluate("is-superselector('.foo .bar', '.foo > .bar')"))
1874
- assert_equal("false", evaluate("is-superselector('.foo > .bar', '.foo .bar')"))
1875
- end
1876
-
1877
- def test_is_superselector_checks_types
1878
- assert_error_message("$super: 12 is not a valid selector: it must be a string,\n" +
1879
- "a list of strings, or a list of lists of strings for `is-superselector'",
1880
- "is-superselector(12, '.foo')")
1881
- assert_error_message("$sub: 12 is not a valid selector: it must be a string,\n" +
1882
- "a list of strings, or a list of lists of strings for `is-superselector'",
1883
- "is-superselector('.foo', 12)")
1884
- end
1885
-
1886
1114
  ## Regression Tests
1887
1115
 
1888
- def test_inspect_nested_empty_lists
1889
- assert_equal "() ()", evaluate("inspect(() ())")
1890
- end
1891
-
1892
1116
  def test_saturation_bounds
1893
1117
  assert_equal "#fbfdff", evaluate("hsl(hue(#fbfdff), saturation(#fbfdff), lightness(#fbfdff))")
1894
1118
  end
1895
1119
 
1896
1120
  private
1897
- def env(hash = {}, parent = nil)
1898
- env = Sass::Environment.new(parent)
1899
- hash.each {|k, v| env.set_var(k, v)}
1900
- env
1901
- end
1902
1121
 
1903
- def evaluate(value, environment = env)
1904
- result = perform(value, environment)
1905
- assert_kind_of Sass::Script::Value::Base, result
1122
+ def evaluate(value)
1123
+ result = perform(value)
1124
+ assert_kind_of Sass::Script::Literal, result
1906
1125
  return result.to_s
1907
1126
  end
1908
1127
 
1909
- def perform(value, environment = env)
1910
- Sass::Script::Parser.parse(value, 0, 0).perform(environment)
1911
- end
1912
-
1913
- def render(sass, options = {})
1914
- options[:syntax] ||= :scss
1915
- munge_filename options
1916
- options[:importer] ||= MockImporter.new
1917
- Sass::Engine.new(sass, options).render
1128
+ def perform(value)
1129
+ Sass::Script::Parser.parse(value, 0, 0).perform(Sass::Environment.new)
1918
1130
  end
1919
1131
 
1920
1132
  def assert_error_message(message, value)
@@ -1923,4 +1135,5 @@ WARNING
1923
1135
  rescue Sass::SyntaxError => e
1924
1136
  assert_equal(message, e.message)
1925
1137
  end
1138
+
1926
1139
  end