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.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -1
- data/README.md +50 -70
- data/Rakefile +5 -26
- data/VERSION +1 -1
- data/VERSION_NAME +1 -1
- data/bin/sass +1 -1
- data/bin/scss +1 -1
- data/lib/sass.rb +12 -19
- data/lib/sass/cache_stores/base.rb +2 -2
- data/lib/sass/cache_stores/chain.rb +1 -2
- data/lib/sass/cache_stores/filesystem.rb +5 -1
- data/lib/sass/cache_stores/memory.rb +1 -1
- data/lib/sass/cache_stores/null.rb +2 -2
- data/lib/sass/callbacks.rb +0 -1
- data/lib/sass/css.rb +13 -11
- data/lib/sass/engine.rb +173 -424
- data/lib/sass/environment.rb +58 -148
- data/lib/sass/error.rb +14 -11
- data/lib/sass/exec.rb +703 -5
- data/lib/sass/importers/base.rb +6 -49
- data/lib/sass/importers/filesystem.rb +19 -44
- data/lib/sass/logger.rb +4 -1
- data/lib/sass/logger/base.rb +4 -2
- data/lib/sass/logger/log_level.rb +7 -3
- data/lib/sass/media.rb +23 -20
- data/lib/sass/plugin.rb +7 -7
- data/lib/sass/plugin/compiler.rb +145 -304
- data/lib/sass/plugin/configuration.rb +23 -18
- data/lib/sass/plugin/merb.rb +1 -1
- data/lib/sass/plugin/staleness_checker.rb +3 -3
- data/lib/sass/repl.rb +3 -3
- data/lib/sass/script.rb +8 -35
- data/lib/sass/script/{value/arg_list.rb → arg_list.rb} +25 -9
- data/lib/sass/script/bool.rb +18 -0
- data/lib/sass/script/color.rb +606 -0
- data/lib/sass/script/css_lexer.rb +4 -8
- data/lib/sass/script/css_parser.rb +2 -5
- data/lib/sass/script/funcall.rb +245 -0
- data/lib/sass/script/functions.rb +408 -1491
- data/lib/sass/script/interpolation.rb +79 -0
- data/lib/sass/script/lexer.rb +68 -172
- data/lib/sass/script/list.rb +85 -0
- data/lib/sass/script/literal.rb +221 -0
- data/lib/sass/script/{tree/node.rb → node.rb} +12 -22
- data/lib/sass/script/{value/null.rb → null.rb} +7 -14
- data/lib/sass/script/{value/number.rb → number.rb} +75 -152
- data/lib/sass/script/{tree/operation.rb → operation.rb} +24 -17
- data/lib/sass/script/parser.rb +110 -245
- data/lib/sass/script/string.rb +51 -0
- data/lib/sass/script/{tree/string_interpolation.rb → string_interpolation.rb} +4 -5
- data/lib/sass/script/{tree/unary_operation.rb → unary_operation.rb} +6 -6
- data/lib/sass/script/variable.rb +58 -0
- data/lib/sass/scss/css_parser.rb +3 -9
- data/lib/sass/scss/parser.rb +421 -450
- data/lib/sass/scss/rx.rb +11 -19
- data/lib/sass/scss/static_parser.rb +7 -321
- data/lib/sass/selector.rb +194 -68
- data/lib/sass/selector/abstract_sequence.rb +14 -29
- data/lib/sass/selector/comma_sequence.rb +25 -108
- data/lib/sass/selector/sequence.rb +66 -159
- data/lib/sass/selector/simple.rb +25 -23
- data/lib/sass/selector/simple_sequence.rb +63 -173
- data/lib/sass/shared.rb +1 -1
- data/lib/sass/supports.rb +15 -13
- data/lib/sass/tree/charset_node.rb +1 -1
- data/lib/sass/tree/comment_node.rb +3 -3
- data/lib/sass/tree/css_import_node.rb +11 -11
- data/lib/sass/tree/debug_node.rb +2 -2
- data/lib/sass/tree/directive_node.rb +4 -21
- data/lib/sass/tree/each_node.rb +8 -8
- data/lib/sass/tree/extend_node.rb +7 -14
- data/lib/sass/tree/for_node.rb +4 -4
- data/lib/sass/tree/function_node.rb +4 -9
- data/lib/sass/tree/if_node.rb +1 -1
- data/lib/sass/tree/import_node.rb +5 -4
- data/lib/sass/tree/media_node.rb +14 -4
- data/lib/sass/tree/mixin_def_node.rb +4 -4
- data/lib/sass/tree/mixin_node.rb +8 -21
- data/lib/sass/tree/node.rb +12 -54
- data/lib/sass/tree/prop_node.rb +20 -39
- data/lib/sass/tree/return_node.rb +2 -3
- data/lib/sass/tree/root_node.rb +3 -19
- data/lib/sass/tree/rule_node.rb +22 -35
- data/lib/sass/tree/supports_node.rb +13 -0
- data/lib/sass/tree/trace_node.rb +1 -2
- data/lib/sass/tree/variable_node.rb +3 -9
- data/lib/sass/tree/visitors/base.rb +8 -5
- data/lib/sass/tree/visitors/check_nesting.rb +19 -49
- data/lib/sass/tree/visitors/convert.rb +56 -74
- data/lib/sass/tree/visitors/cssize.rb +74 -202
- data/lib/sass/tree/visitors/deep_copy.rb +5 -10
- data/lib/sass/tree/visitors/extend.rb +7 -7
- data/lib/sass/tree/visitors/perform.rb +185 -278
- data/lib/sass/tree/visitors/set_options.rb +6 -20
- data/lib/sass/tree/visitors/to_css.rb +81 -234
- data/lib/sass/tree/warn_node.rb +2 -2
- data/lib/sass/tree/while_node.rb +2 -2
- data/lib/sass/util.rb +152 -522
- data/lib/sass/util/multibyte_string_scanner.rb +0 -2
- data/lib/sass/util/subset_map.rb +3 -4
- data/lib/sass/util/test.rb +1 -0
- data/lib/sass/version.rb +22 -20
- data/test/Gemfile +3 -0
- data/test/Gemfile.lock +10 -0
- data/test/sass/cache_test.rb +20 -62
- data/test/sass/callbacks_test.rb +1 -1
- data/test/sass/conversion_test.rb +2 -296
- data/test/sass/css2sass_test.rb +4 -23
- data/test/sass/engine_test.rb +354 -411
- data/test/sass/exec_test.rb +2 -2
- data/test/sass/extend_test.rb +145 -324
- data/test/sass/functions_test.rb +86 -873
- data/test/sass/importer_test.rb +21 -241
- data/test/sass/logger_test.rb +1 -1
- data/test/sass/more_results/more_import.css +1 -1
- data/test/sass/plugin_test.rb +26 -16
- data/test/sass/results/compact.css +1 -1
- data/test/sass/results/complex.css +4 -4
- data/test/sass/results/expanded.css +1 -1
- data/test/sass/results/import.css +1 -1
- data/test/sass/results/import_charset_ibm866.css +2 -2
- data/test/sass/results/mixins.css +17 -17
- data/test/sass/results/nested.css +1 -1
- data/test/sass/results/parent_ref.css +2 -2
- data/test/sass/results/script.css +3 -3
- data/test/sass/results/scss_import.css +1 -1
- data/test/sass/script_conversion_test.rb +7 -36
- data/test/sass/script_test.rb +53 -485
- data/test/sass/scss/css_test.rb +28 -143
- data/test/sass/scss/rx_test.rb +4 -4
- data/test/sass/scss/scss_test.rb +325 -2119
- data/test/sass/templates/scss_import.scss +1 -2
- data/test/sass/test_helper.rb +1 -1
- data/test/sass/util/multibyte_string_scanner_test.rb +1 -1
- data/test/sass/util/subset_map_test.rb +2 -2
- data/test/sass/util_test.rb +1 -86
- data/test/test_helper.rb +8 -37
- metadata +19 -66
- data/lib/sass/exec/base.rb +0 -187
- data/lib/sass/exec/sass_convert.rb +0 -264
- data/lib/sass/exec/sass_scss.rb +0 -424
- data/lib/sass/features.rb +0 -47
- data/lib/sass/script/tree.rb +0 -16
- data/lib/sass/script/tree/funcall.rb +0 -306
- data/lib/sass/script/tree/interpolation.rb +0 -118
- data/lib/sass/script/tree/list_literal.rb +0 -77
- data/lib/sass/script/tree/literal.rb +0 -45
- data/lib/sass/script/tree/map_literal.rb +0 -64
- data/lib/sass/script/tree/selector.rb +0 -26
- data/lib/sass/script/tree/variable.rb +0 -57
- data/lib/sass/script/value.rb +0 -11
- data/lib/sass/script/value/base.rb +0 -240
- data/lib/sass/script/value/bool.rb +0 -35
- data/lib/sass/script/value/color.rb +0 -680
- data/lib/sass/script/value/helpers.rb +0 -262
- data/lib/sass/script/value/list.rb +0 -113
- data/lib/sass/script/value/map.rb +0 -70
- data/lib/sass/script/value/string.rb +0 -97
- data/lib/sass/selector/pseudo.rb +0 -256
- data/lib/sass/source/map.rb +0 -210
- data/lib/sass/source/position.rb +0 -39
- data/lib/sass/source/range.rb +0 -41
- data/lib/sass/stack.rb +0 -120
- data/lib/sass/tree/at_root_node.rb +0 -83
- data/lib/sass/tree/error_node.rb +0 -18
- data/lib/sass/tree/keyframe_rule_node.rb +0 -15
- data/lib/sass/util/cross_platform_random.rb +0 -19
- data/lib/sass/util/normalized_map.rb +0 -130
- data/lib/sass/util/ordered_hash.rb +0 -192
- data/test/sass/compiler_test.rb +0 -232
- data/test/sass/encoding_test.rb +0 -219
- data/test/sass/source_map_test.rb +0 -977
- data/test/sass/superselector_test.rb +0 -191
- data/test/sass/util/normalized_map_test.rb +0 -51
- data/test/sass/value_helpers_test.rb +0 -179
data/test/sass/functions_test.rb
CHANGED
@@ -1,49 +1,37 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
require '
|
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::
|
8
|
+
Sass::Script::String.new("no-kw-args")
|
11
9
|
end
|
12
10
|
|
13
11
|
def only_var_args(*args)
|
14
|
-
Sass::Script::
|
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::
|
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
|
32
|
-
str = Sass::Script::
|
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::
|
30
|
+
Sass::Script::String.new("I'm a user-defined string!")
|
39
31
|
end
|
40
32
|
|
41
33
|
def _preceding_underscore
|
42
|
-
Sass::Script::
|
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 <
|
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
|
94
|
-
|
95
|
-
|
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
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
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($
|
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("$
|
134
|
-
assert_error_message("$
|
135
|
-
assert_error_message("$
|
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($
|
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($
|
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($
|
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($
|
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
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
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
|
224
|
-
|
225
|
-
|
226
|
-
|
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
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
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("
|
384
|
-
assert_equal("
|
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("
|
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("
|
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($
|
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("$
|
806
|
-
assert_error_message("$
|
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
|
959
|
-
|
960
|
-
|
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
|
968
|
-
setting the #
|
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($
|
1021
|
-
|
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
|
1050
|
-
assert_error_message("List index
|
1051
|
-
assert_error_message("List index 1.5 must be
|
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(
|
1186
|
-
assert_equal(
|
1187
|
-
assert_equal(
|
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
|
1904
|
-
result = perform(value
|
1905
|
-
assert_kind_of Sass::Script::
|
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
|
1910
|
-
Sass::Script::Parser.parse(value, 0, 0).perform(
|
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
|