oreorenasass 3.4.4 → 3.4.5

Sign up to get free protection for your applications and to get access to all the features.
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