sass 3.2.9 → 3.2.10
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.
- data/MIT-LICENSE +2 -2
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/lib/sass/engine.rb +0 -1
- data/lib/sass/error.rb +2 -2
- data/lib/sass/exec.rb +6 -3
- data/lib/sass/script/functions.rb +516 -449
- data/lib/sass/scss/parser.rb +0 -1
- data/lib/sass/selector/sequence.rb +11 -4
- data/lib/sass/tree/visitors/convert.rb +0 -1
- data/lib/sass/tree/visitors/perform.rb +2 -2
- data/lib/sass/util/test.rb +10 -0
- data/test/sass/engine_test.rb +12 -10
- data/test/sass/exec_test.rb +86 -0
- data/test/sass/extend_test.rb +38 -15
- data/test/sass/functions_test.rb +75 -72
- data/test/sass/plugin_test.rb +17 -0
- data/test/sass/scss/css_test.rb +1 -1
- data/test/sass/scss/scss_test.rb +8 -0
- data/test/sass/templates/bork5.sass +3 -0
- metadata +6 -2
data/lib/sass/scss/parser.rb
CHANGED
@@ -120,7 +120,6 @@ module Sass
|
|
120
120
|
value = [text.sub(/^\s*\/\//, '/*').gsub(/^\s*\/\//, ' *') + ' */']
|
121
121
|
else
|
122
122
|
value = Sass::Engine.parse_interp(text, line, @scanner.pos - text.size, :filename => @filename)
|
123
|
-
value[0].slice!(2) if loud # get rid of the "!"
|
124
123
|
value.unshift(@scanner.
|
125
124
|
string[0...@scanner.pos].
|
126
125
|
reverse[/.*?\*\/(.*?)($|\Z)/, 1].
|
@@ -437,15 +437,21 @@ module Sass
|
|
437
437
|
# @param seqses [Array<Array<Array<SimpleSequence or String>>>]
|
438
438
|
# @return [Array<Array<Array<SimpleSequence or String>>>]
|
439
439
|
def trim(seqses)
|
440
|
-
# Avoid truly horrific quadratic behavior.
|
440
|
+
# Avoid truly horrific quadratic behavior. TODO: I think there
|
441
441
|
# may be a way to get perfect trimming without going quadratic.
|
442
442
|
return seqses if seqses.size > 100
|
443
|
+
|
444
|
+
# Keep the results in a separate array so we can be sure we aren't
|
445
|
+
# comparing against an already-trimmed selector. This ensures that two
|
446
|
+
# identical selectors don't mutually trim one another.
|
447
|
+
result = seqses.dup
|
448
|
+
|
443
449
|
# This is n^2 on the sequences, but only comparing between
|
444
450
|
# separate sequences should limit the quadratic behavior.
|
445
|
-
seqses.
|
446
|
-
seqs1.reject do |seq1|
|
451
|
+
seqses.each_with_index do |seqs1, i|
|
452
|
+
result[i] = seqs1.reject do |seq1|
|
447
453
|
min_spec = _sources(seq1).map {|seq| seq.specificity}.min || 0
|
448
|
-
|
454
|
+
result.any? do |seqs2|
|
449
455
|
next if seqs1.equal?(seqs2)
|
450
456
|
# Second Law of Extend: the specificity of a generated selector
|
451
457
|
# should never be less than the specificity of the extending
|
@@ -456,6 +462,7 @@ module Sass
|
|
456
462
|
end
|
457
463
|
end
|
458
464
|
end
|
465
|
+
result
|
459
466
|
end
|
460
467
|
|
461
468
|
def _hash
|
@@ -144,9 +144,9 @@ class Sass::Tree::Visitors::Perform < Sass::Tree::Visitors::Base
|
|
144
144
|
res = node.expr.perform(@environment)
|
145
145
|
res = res.value if res.is_a?(Sass::Script::String)
|
146
146
|
if node.filename
|
147
|
-
|
147
|
+
Sass::Util.sass_warn "#{node.filename}:#{node.line} DEBUG: #{res}"
|
148
148
|
else
|
149
|
-
|
149
|
+
Sass::Util.sass_warn "Line #{node.line} DEBUG: #{res}"
|
150
150
|
end
|
151
151
|
[]
|
152
152
|
end
|
data/test/sass/engine_test.rb
CHANGED
@@ -557,7 +557,7 @@ ERR
|
|
557
557
|
importer.add_import("bar", "@import 'foo'")
|
558
558
|
|
559
559
|
engine = Sass::Engine.new('@import "foo"', :filename => filename_for_test,
|
560
|
-
:load_paths => [importer])
|
560
|
+
:load_paths => [importer], :importer => importer)
|
561
561
|
|
562
562
|
assert_raise_message(Sass::SyntaxError, <<ERR.rstrip) {engine.render}
|
563
563
|
An @import loop has been found:
|
@@ -574,7 +574,7 @@ ERR
|
|
574
574
|
importer.add_import("baz", "@import 'foo'")
|
575
575
|
|
576
576
|
engine = Sass::Engine.new('@import "foo"', :filename => filename_for_test,
|
577
|
-
:load_paths => [importer])
|
577
|
+
:load_paths => [importer], :importer => importer)
|
578
578
|
|
579
579
|
assert_raise_message(Sass::SyntaxError, <<ERR.rstrip) {engine.render}
|
580
580
|
An @import loop has been found:
|
@@ -730,7 +730,7 @@ SASS
|
|
730
730
|
importer.add_import("imported", "div{color:red}")
|
731
731
|
Sass.load_paths << importer
|
732
732
|
|
733
|
-
assert_equal "div {\n color: red; }\n", Sass::Engine.new('@import "imported"').render
|
733
|
+
assert_equal "div {\n color: red; }\n", Sass::Engine.new('@import "imported"', :importer => importer).render
|
734
734
|
ensure
|
735
735
|
Sass.load_paths.clear
|
736
736
|
end
|
@@ -1804,7 +1804,7 @@ SASS
|
|
1804
1804
|
|
1805
1805
|
def test_loud_comment_in_compressed_mode
|
1806
1806
|
assert_equal <<CSS, render(<<SASS, :style => :compressed)
|
1807
|
-
foo{color:blue
|
1807
|
+
foo{color:blue;/*! foo
|
1808
1808
|
* bar
|
1809
1809
|
*/}
|
1810
1810
|
CSS
|
@@ -1818,7 +1818,8 @@ SASS
|
|
1818
1818
|
|
1819
1819
|
def test_loud_comment_is_evaluated
|
1820
1820
|
assert_equal <<CSS, render(<<SASS)
|
1821
|
-
|
1821
|
+
/*!
|
1822
|
+
* Hue: 327.21649deg */
|
1822
1823
|
CSS
|
1823
1824
|
/*!
|
1824
1825
|
Hue: \#{hue(#f836a0)}
|
@@ -2486,15 +2487,15 @@ SASS
|
|
2486
2487
|
|
2487
2488
|
def test_interpolated_comment_in_mixin
|
2488
2489
|
assert_equal <<CSS, render(<<SASS)
|
2489
|
-
|
2490
|
+
/*! color: red */
|
2490
2491
|
.foo {
|
2491
2492
|
color: red; }
|
2492
2493
|
|
2493
|
-
|
2494
|
+
/*! color: blue */
|
2494
2495
|
.foo {
|
2495
2496
|
color: blue; }
|
2496
2497
|
|
2497
|
-
|
2498
|
+
/*! color: green */
|
2498
2499
|
.foo {
|
2499
2500
|
color: green; }
|
2500
2501
|
CSS
|
@@ -2789,7 +2790,7 @@ CSS
|
|
2789
2790
|
/* \\\#{foo}
|
2790
2791
|
SASS
|
2791
2792
|
assert_equal <<CSS, render(<<SASS)
|
2792
|
-
|
2793
|
+
/*! \#{foo} */
|
2793
2794
|
CSS
|
2794
2795
|
/*! \\\#{foo}
|
2795
2796
|
SASS
|
@@ -2972,7 +2973,7 @@ SCSS
|
|
2972
2973
|
|
2973
2974
|
original_filename = filename_for_test
|
2974
2975
|
engine = Sass::Engine.new('@import "imported"; div{color:blue}',
|
2975
|
-
:filename => original_filename, :load_paths => [importer], :syntax => :scss)
|
2976
|
+
:filename => original_filename, :load_paths => [importer], :syntax => :scss, :importer => importer)
|
2976
2977
|
engine.render
|
2977
2978
|
|
2978
2979
|
assert_equal original_filename, engine.options[:original_filename]
|
@@ -3207,6 +3208,7 @@ SASS
|
|
3207
3208
|
|
3208
3209
|
def render(sass, options = {})
|
3209
3210
|
munge_filename options
|
3211
|
+
options[:importer] ||= MockImporter.new
|
3210
3212
|
Sass::Engine.new(sass, options).render
|
3211
3213
|
end
|
3212
3214
|
|
@@ -0,0 +1,86 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
3
|
+
require 'sass/util/test'
|
4
|
+
require 'tmpdir'
|
5
|
+
|
6
|
+
class ExecTest < Test::Unit::TestCase
|
7
|
+
include Sass::Util::Test
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@dir = Dir.mktmpdir
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
FileUtils.rm_rf(@dir)
|
15
|
+
clean_up_sassc
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_scss_t_expanded
|
19
|
+
src = get_path("src.scss")
|
20
|
+
dest = get_path("dest.css")
|
21
|
+
write(src, ".ruleset { margin: 0 }")
|
22
|
+
assert(exec(*%w[scss -t expanded --unix-newlines].push(src, dest)))
|
23
|
+
assert_equal(".ruleset {\n margin: 0;\n}\n", read(dest))
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_sass_convert_T_sass
|
27
|
+
src = get_path("src.scss")
|
28
|
+
dest = get_path("dest.css")
|
29
|
+
write(src, ".ruleset { margin: 0 }")
|
30
|
+
assert(exec(*%w[sass-convert -T sass --unix-newlines].push(src, dest)))
|
31
|
+
assert_equal(".ruleset\n margin: 0\n", read(dest))
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_sass_convert_T_sass_in_place
|
35
|
+
src = get_path("src.scss")
|
36
|
+
write(src, ".ruleset { margin: 0 }")
|
37
|
+
assert(exec(*%w[sass-convert -T sass --in-place --unix-newlines].push(src)))
|
38
|
+
assert_equal(".ruleset\n margin: 0\n", read(src))
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_scss_t_expanded_no_unix_newlines
|
42
|
+
return skip "Can be run on Windows only" unless Sass::Util.windows?
|
43
|
+
src = get_path("src.scss")
|
44
|
+
dest = get_path("dest.css")
|
45
|
+
write(src, ".ruleset { margin: 0 }")
|
46
|
+
assert(exec(*%w[scss -t expanded].push(src, dest)))
|
47
|
+
assert_equal(".ruleset {\r\n margin: 0;\r\n}\r\n", read(dest))
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_sass_convert_T_sass_no_unix_newlines
|
51
|
+
return skip "Can be run on Windows only" unless Sass::Util.windows?
|
52
|
+
src = get_path("src.scss")
|
53
|
+
dest = get_path("dest.sass")
|
54
|
+
write(src, ".ruleset { margin: 0 }")
|
55
|
+
assert(exec(*%w[sass-convert -T sass].push(src, dest)))
|
56
|
+
assert_equal(".ruleset\r\n margin: 0\r\n", read(dest))
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_sass_convert_T_sass_in_place_no_unix_newlines
|
60
|
+
return skip "Can be run on Windows only" unless Sass::Util.windows?
|
61
|
+
src = get_path("src.scss")
|
62
|
+
write(src, ".ruleset { margin: 0 }")
|
63
|
+
assert(exec(*%w[sass-convert -T sass --in-place].push(src)))
|
64
|
+
assert_equal(".ruleset\r\n margin: 0\r\n", read(src))
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def get_path(name)
|
70
|
+
File.join(@dir, name)
|
71
|
+
end
|
72
|
+
|
73
|
+
def read(file)
|
74
|
+
open(file, 'rb') {|f| f.read}
|
75
|
+
end
|
76
|
+
|
77
|
+
def write(file, content)
|
78
|
+
open(file, 'wb') {|f| f.write(content)}
|
79
|
+
end
|
80
|
+
|
81
|
+
def exec(script, *args)
|
82
|
+
script = File.dirname(__FILE__) + '/../../bin/' + script
|
83
|
+
ruby = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'] + RbConfig::CONFIG['EXEEXT'])
|
84
|
+
system(ruby, script, *args)
|
85
|
+
end
|
86
|
+
end
|
data/test/sass/extend_test.rb
CHANGED
@@ -489,7 +489,7 @@ CSS
|
|
489
489
|
SCSS
|
490
490
|
end
|
491
491
|
|
492
|
-
def
|
492
|
+
def test_another_nested_extender_with_early_child_selectors_doesnt_subseq_them
|
493
493
|
assert_equal <<CSS, render(<<SCSS)
|
494
494
|
.foo .bar, .foo .bip > .baz {
|
495
495
|
a: b; }
|
@@ -1145,20 +1145,6 @@ SCSS
|
|
1145
1145
|
a.bar {
|
1146
1146
|
a: b; }
|
1147
1147
|
|
1148
|
-
.bar, b.foo {
|
1149
|
-
c: d; }
|
1150
|
-
CSS
|
1151
|
-
a.bar {a: b}
|
1152
|
-
.bar {c: d}
|
1153
|
-
b.foo {@extend .bar}
|
1154
|
-
SCSS
|
1155
|
-
end
|
1156
|
-
|
1157
|
-
def test_extend_does_not_warn_when_one_extension_fails_but_others_dont
|
1158
|
-
assert_no_warning {assert_equal(<<CSS, render(<<SCSS))}
|
1159
|
-
a.bar {
|
1160
|
-
a: b; }
|
1161
|
-
|
1162
1148
|
.bar, b.foo {
|
1163
1149
|
c: d; }
|
1164
1150
|
CSS
|
@@ -1186,6 +1172,43 @@ SCSS
|
|
1186
1172
|
|
1187
1173
|
# Regression Tests
|
1188
1174
|
|
1175
|
+
def test_nested_sibling_extend
|
1176
|
+
assert_equal <<CSS, render(<<SCSS)
|
1177
|
+
.parent .bar, .parent .foo {
|
1178
|
+
width: 2000px; }
|
1179
|
+
CSS
|
1180
|
+
.foo {@extend .bar}
|
1181
|
+
|
1182
|
+
.parent {
|
1183
|
+
.bar {
|
1184
|
+
width: 2000px;
|
1185
|
+
}
|
1186
|
+
.foo {
|
1187
|
+
@extend .bar
|
1188
|
+
}
|
1189
|
+
}
|
1190
|
+
SCSS
|
1191
|
+
end
|
1192
|
+
|
1193
|
+
def test_parent_and_sibling_extend
|
1194
|
+
assert_equal <<CSS, render(<<SCSS)
|
1195
|
+
.parent1 .parent2 .child1.child2, .parent2 .parent1 .child1.child2 {
|
1196
|
+
c: d; }
|
1197
|
+
CSS
|
1198
|
+
%foo %bar%baz {c: d}
|
1199
|
+
|
1200
|
+
.parent1 {
|
1201
|
+
@extend %foo;
|
1202
|
+
.child1 {@extend %bar}
|
1203
|
+
}
|
1204
|
+
|
1205
|
+
.parent2 {
|
1206
|
+
@extend %foo;
|
1207
|
+
.child2 {@extend %baz}
|
1208
|
+
}
|
1209
|
+
SCSS
|
1210
|
+
end
|
1211
|
+
|
1189
1212
|
def test_nested_extend_specificity
|
1190
1213
|
assert_equal <<CSS, render(<<SCSS)
|
1191
1214
|
a :b, a :b:c {
|
data/test/sass/functions_test.rb
CHANGED
@@ -84,9 +84,9 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
84
84
|
end
|
85
85
|
|
86
86
|
def test_hsl_checks_types
|
87
|
-
assert_error_message("\"foo\" is not a number for `hsl'", "hsl(\"foo\", 10, 12)");
|
88
|
-
assert_error_message("\"foo\" is not a number for `hsl'", "hsl(10, \"foo\", 12)");
|
89
|
-
assert_error_message("\"foo\" is not a number for `hsl'", "hsl(10, 10, \"foo\")");
|
87
|
+
assert_error_message("$hue: \"foo\" is not a number for `hsl'", "hsl(\"foo\", 10, 12)");
|
88
|
+
assert_error_message("$saturation: \"foo\" is not a number for `hsl'", "hsl(10, \"foo\", 12)");
|
89
|
+
assert_error_message("$lightness: \"foo\" is not a number for `hsl'", "hsl(10, 10, \"foo\")");
|
90
90
|
end
|
91
91
|
|
92
92
|
def test_hsla
|
@@ -104,10 +104,10 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
104
104
|
end
|
105
105
|
|
106
106
|
def test_hsla_checks_types
|
107
|
-
assert_error_message("\"foo\" is not a number for `hsla'", "hsla(\"foo\", 10, 12, 0.3)");
|
108
|
-
assert_error_message("\"foo\" is not a number for `hsla'", "hsla(10, \"foo\", 12, 0)");
|
109
|
-
assert_error_message("\"foo\" is not a number for `hsla'", "hsla(10, 10, \"foo\", 1)");
|
110
|
-
assert_error_message("\"foo\" is not a number for `hsla'", "hsla(10, 10, 10, \"foo\")");
|
107
|
+
assert_error_message("$hue: \"foo\" is not a number for `hsla'", "hsla(\"foo\", 10, 12, 0.3)");
|
108
|
+
assert_error_message("$saturation: \"foo\" is not a number for `hsla'", "hsla(10, \"foo\", 12, 0)");
|
109
|
+
assert_error_message("$lightness: \"foo\" is not a number for `hsla'", "hsla(10, 10, \"foo\", 1)");
|
110
|
+
assert_error_message("$alpha: \"foo\" is not a number for `hsla'", "hsla(10, 10, 10, \"foo\")");
|
111
111
|
end
|
112
112
|
|
113
113
|
def test_percentage
|
@@ -118,9 +118,9 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
118
118
|
end
|
119
119
|
|
120
120
|
def test_percentage_checks_types
|
121
|
-
assert_error_message("25px is not a unitless number for `percentage'", "percentage(25px)")
|
122
|
-
assert_error_message("#cccccc is not a unitless number for `percentage'", "percentage(#ccc)")
|
123
|
-
assert_error_message("\"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")})
|
124
124
|
end
|
125
125
|
|
126
126
|
def test_round
|
@@ -129,7 +129,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
129
129
|
assert_equal("5px", evaluate("round(5.49px)"))
|
130
130
|
assert_equal("5px", evaluate("round($value: 5.49px)"))
|
131
131
|
|
132
|
-
assert_error_message("#cccccc is not a number for `round'", "round(#ccc)")
|
132
|
+
assert_error_message("$value: #cccccc is not a number for `round'", "round(#ccc)")
|
133
133
|
end
|
134
134
|
|
135
135
|
def test_floor
|
@@ -137,7 +137,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
137
137
|
assert_equal("4px", evaluate("floor(4.8px)"))
|
138
138
|
assert_equal("4px", evaluate("floor($value: 4.8px)"))
|
139
139
|
|
140
|
-
assert_error_message("\"foo\" is not a number for `floor'", "floor(\"foo\")")
|
140
|
+
assert_error_message("$value: \"foo\" is not a number for `floor'", "floor(\"foo\")")
|
141
141
|
end
|
142
142
|
|
143
143
|
def test_ceil
|
@@ -145,7 +145,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
145
145
|
assert_equal("5px", evaluate("ceil(4.8px)"))
|
146
146
|
assert_equal("5px", evaluate("ceil($value: 4.8px)"))
|
147
147
|
|
148
|
-
assert_error_message("\"a\" is not a number for `ceil'", "ceil(\"a\")")
|
148
|
+
assert_error_message("$value: \"a\" is not a number for `ceil'", "ceil(\"a\")")
|
149
149
|
end
|
150
150
|
|
151
151
|
def test_abs
|
@@ -155,7 +155,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
155
155
|
assert_equal("5px", evaluate("abs(5px)"))
|
156
156
|
assert_equal("5px", evaluate("abs($value: 5px)"))
|
157
157
|
|
158
|
-
assert_error_message("#aaaaaa is not a number for `abs'", "abs(#aaa)")
|
158
|
+
assert_error_message("$value: #aaaaaa is not a number for `abs'", "abs(#aaa)")
|
159
159
|
end
|
160
160
|
|
161
161
|
def test_min
|
@@ -193,31 +193,31 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
193
193
|
end
|
194
194
|
|
195
195
|
def test_rgb_tests_bounds
|
196
|
-
assert_error_message("Color value 256 must be between 0 and 255 for `rgb'",
|
196
|
+
assert_error_message("$red: Color value 256 must be between 0 and 255 for `rgb'",
|
197
197
|
"rgb(256, 1, 1)")
|
198
|
-
assert_error_message("Color value 256 must be between 0 and 255 for `rgb'",
|
198
|
+
assert_error_message("$green: Color value 256 must be between 0 and 255 for `rgb'",
|
199
199
|
"rgb(1, 256, 1)")
|
200
|
-
assert_error_message("Color value 256 must be between 0 and 255 for `rgb'",
|
200
|
+
assert_error_message("$blue: Color value 256 must be between 0 and 255 for `rgb'",
|
201
201
|
"rgb(1, 1, 256)")
|
202
|
-
assert_error_message("Color value 256 must be between 0 and 255 for `rgb'",
|
202
|
+
assert_error_message("$green: Color value 256 must be between 0 and 255 for `rgb'",
|
203
203
|
"rgb(1, 256, 257)")
|
204
|
-
assert_error_message("Color value -1 must be between 0 and 255 for `rgb'",
|
204
|
+
assert_error_message("$red: Color value -1 must be between 0 and 255 for `rgb'",
|
205
205
|
"rgb(-1, 1, 1)")
|
206
206
|
end
|
207
207
|
|
208
208
|
def test_rgb_test_percent_bounds
|
209
|
-
assert_error_message("Color value 100.1% must be between 0% and 100% for `rgb'",
|
209
|
+
assert_error_message("$red: Color value 100.1% must be between 0% and 100% for `rgb'",
|
210
210
|
"rgb(100.1%, 0, 0)")
|
211
|
-
assert_error_message("Color value -0.1% must be between 0% and 100% for `rgb'",
|
211
|
+
assert_error_message("$green: Color value -0.1% must be between 0% and 100% for `rgb'",
|
212
212
|
"rgb(0, -0.1%, 0)")
|
213
|
-
assert_error_message("Color value 101% must be between 0% and 100% for `rgb'",
|
213
|
+
assert_error_message("$blue: Color value 101% must be between 0% and 100% for `rgb'",
|
214
214
|
"rgb(0, 0, 101%)")
|
215
215
|
end
|
216
216
|
|
217
217
|
def test_rgb_tests_types
|
218
|
-
assert_error_message("\"foo\" is not a number for `rgb'", "rgb(\"foo\", 10, 12)");
|
219
|
-
assert_error_message("\"foo\" is not a number for `rgb'", "rgb(10, \"foo\", 12)");
|
220
|
-
assert_error_message("\"foo\" is not a number for `rgb'", "rgb(10, 10, \"foo\")");
|
218
|
+
assert_error_message("$red: \"foo\" is not a number for `rgb'", "rgb(\"foo\", 10, 12)");
|
219
|
+
assert_error_message("$green: \"foo\" is not a number for `rgb'", "rgb(10, \"foo\", 12)");
|
220
|
+
assert_error_message("$blue: \"foo\" is not a number for `rgb'", "rgb(10, 10, \"foo\")");
|
221
221
|
end
|
222
222
|
|
223
223
|
def test_rgba
|
@@ -228,15 +228,15 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
228
228
|
end
|
229
229
|
|
230
230
|
def test_rgba_tests_bounds
|
231
|
-
assert_error_message("Color value 256 must be between 0 and 255 for `rgba'",
|
231
|
+
assert_error_message("$red: Color value 256 must be between 0 and 255 for `rgba'",
|
232
232
|
"rgba(256, 1, 1, 0.3)")
|
233
|
-
assert_error_message("Color value 256 must be between 0 and 255 for `rgba'",
|
233
|
+
assert_error_message("$green: Color value 256 must be between 0 and 255 for `rgba'",
|
234
234
|
"rgba(1, 256, 1, 0.3)")
|
235
|
-
assert_error_message("Color value 256 must be between 0 and 255 for `rgba'",
|
235
|
+
assert_error_message("$blue: Color value 256 must be between 0 and 255 for `rgba'",
|
236
236
|
"rgba(1, 1, 256, 0.3)")
|
237
|
-
assert_error_message("Color value 256 must be between 0 and 255 for `rgba'",
|
237
|
+
assert_error_message("$green: Color value 256 must be between 0 and 255 for `rgba'",
|
238
238
|
"rgba(1, 256, 257, 0.3)")
|
239
|
-
assert_error_message("Color value -1 must be between 0 and 255 for `rgba'",
|
239
|
+
assert_error_message("$red: Color value -1 must be between 0 and 255 for `rgba'",
|
240
240
|
"rgba(-1, 1, 1, 0.3)")
|
241
241
|
assert_error_message("Alpha channel -0.2 must be between 0 and 1 for `rgba'",
|
242
242
|
"rgba(1, 1, 1, -0.2)")
|
@@ -245,10 +245,10 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
245
245
|
end
|
246
246
|
|
247
247
|
def test_rgba_tests_types
|
248
|
-
assert_error_message("\"foo\" is not a number for `rgba'", "rgba(\"foo\", 10, 12, 0.2)");
|
249
|
-
assert_error_message("\"foo\" is not a number for `rgba'", "rgba(10, \"foo\", 12, 0.1)");
|
250
|
-
assert_error_message("\"foo\" is not a number for `rgba'", "rgba(10, 10, \"foo\", 0)");
|
251
|
-
assert_error_message("\"foo\" is not a number for `rgba'", "rgba(10, 10, 10, \"foo\")");
|
248
|
+
assert_error_message("$red: \"foo\" is not a number for `rgba'", "rgba(\"foo\", 10, 12, 0.2)");
|
249
|
+
assert_error_message("$green: \"foo\" is not a number for `rgba'", "rgba(10, \"foo\", 12, 0.1)");
|
250
|
+
assert_error_message("$blue: \"foo\" is not a number for `rgba'", "rgba(10, 10, \"foo\", 0)");
|
251
|
+
assert_error_message("$alpha: \"foo\" is not a number for `rgba'", "rgba(10, 10, 10, \"foo\")");
|
252
252
|
end
|
253
253
|
|
254
254
|
def test_rgba_with_color
|
@@ -258,8 +258,8 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
258
258
|
end
|
259
259
|
|
260
260
|
def test_rgba_with_color_tests_types
|
261
|
-
assert_error_message("\"foo\" is not a color for `rgba'", "rgba(\"foo\", 0.2)");
|
262
|
-
assert_error_message("\"foo\" is not a number for `rgba'", "rgba(blue, \"foo\")");
|
261
|
+
assert_error_message("$color: \"foo\" is not a color for `rgba'", "rgba(\"foo\", 0.2)");
|
262
|
+
assert_error_message("$alpha: \"foo\" is not a number for `rgba'", "rgba(blue, \"foo\")");
|
263
263
|
end
|
264
264
|
|
265
265
|
def test_rgba_tests_num_args
|
@@ -275,7 +275,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
275
275
|
end
|
276
276
|
|
277
277
|
def test_red_exception
|
278
|
-
assert_error_message("12 is not a color for `red'", "red(12)")
|
278
|
+
assert_error_message("$color: 12 is not a color for `red'", "red(12)")
|
279
279
|
end
|
280
280
|
|
281
281
|
def test_green
|
@@ -284,7 +284,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
284
284
|
end
|
285
285
|
|
286
286
|
def test_green_exception
|
287
|
-
assert_error_message("12 is not a color for `green'", "green(12)")
|
287
|
+
assert_error_message("$color: 12 is not a color for `green'", "green(12)")
|
288
288
|
end
|
289
289
|
|
290
290
|
def test_blue
|
@@ -293,7 +293,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
293
293
|
end
|
294
294
|
|
295
295
|
def test_blue_exception
|
296
|
-
assert_error_message("12 is not a color for `blue'", "blue(12)")
|
296
|
+
assert_error_message("$color: 12 is not a color for `blue'", "blue(12)")
|
297
297
|
end
|
298
298
|
|
299
299
|
def test_hue
|
@@ -302,7 +302,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
302
302
|
end
|
303
303
|
|
304
304
|
def test_hue_exception
|
305
|
-
assert_error_message("12 is not a color for `hue'", "hue(12)")
|
305
|
+
assert_error_message("$color: 12 is not a color for `hue'", "hue(12)")
|
306
306
|
end
|
307
307
|
|
308
308
|
def test_saturation
|
@@ -312,7 +312,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
312
312
|
end
|
313
313
|
|
314
314
|
def test_saturation_exception
|
315
|
-
assert_error_message("12 is not a color for `saturation'", "saturation(12)")
|
315
|
+
assert_error_message("$color: 12 is not a color for `saturation'", "saturation(12)")
|
316
316
|
end
|
317
317
|
|
318
318
|
def test_lightness
|
@@ -322,7 +322,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
322
322
|
end
|
323
323
|
|
324
324
|
def test_lightness_exception
|
325
|
-
assert_error_message("12 is not a color for `lightness'", "lightness(12)")
|
325
|
+
assert_error_message("$color: 12 is not a color for `lightness'", "lightness(12)")
|
326
326
|
end
|
327
327
|
|
328
328
|
def test_alpha
|
@@ -333,7 +333,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
333
333
|
end
|
334
334
|
|
335
335
|
def test_alpha_exception
|
336
|
-
assert_error_message("12 is not a color for `alpha'", "alpha(12)")
|
336
|
+
assert_error_message("$color: 12 is not a color for `alpha'", "alpha(12)")
|
337
337
|
end
|
338
338
|
|
339
339
|
def test_opacity
|
@@ -345,7 +345,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
345
345
|
end
|
346
346
|
|
347
347
|
def test_opacity_exception
|
348
|
-
assert_error_message("\"foo\" is not a color for `opacity'", "opacity(foo)")
|
348
|
+
assert_error_message("$color: \"foo\" is not a color for `opacity'", "opacity(foo)")
|
349
349
|
end
|
350
350
|
|
351
351
|
def test_opacify
|
@@ -367,8 +367,8 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
367
367
|
end
|
368
368
|
|
369
369
|
def test_opacify_tests_types
|
370
|
-
assert_error_message("\"foo\" is not a color for `opacify'", "opacify(\"foo\", 10%)")
|
371
|
-
assert_error_message("\"foo\" is not a number for `opacify'", "opacify(#fff, \"foo\")")
|
370
|
+
assert_error_message("$color: \"foo\" is not a color for `opacify'", "opacify(\"foo\", 10%)")
|
371
|
+
assert_error_message("$amount: \"foo\" is not a number for `opacify'", "opacify(#fff, \"foo\")")
|
372
372
|
end
|
373
373
|
|
374
374
|
def test_transparentize
|
@@ -390,8 +390,8 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
390
390
|
end
|
391
391
|
|
392
392
|
def test_transparentize_tests_types
|
393
|
-
assert_error_message("\"foo\" is not a color for `transparentize'", "transparentize(\"foo\", 10%)")
|
394
|
-
assert_error_message("\"foo\" is not a number for `transparentize'", "transparentize(#fff, \"foo\")")
|
393
|
+
assert_error_message("$color: \"foo\" is not a color for `transparentize'", "transparentize(\"foo\", 10%)")
|
394
|
+
assert_error_message("$amount: \"foo\" is not a number for `transparentize'", "transparentize(#fff, \"foo\")")
|
395
395
|
end
|
396
396
|
|
397
397
|
def test_lighten
|
@@ -412,8 +412,8 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
412
412
|
end
|
413
413
|
|
414
414
|
def test_lighten_tests_types
|
415
|
-
assert_error_message("\"foo\" is not a color for `lighten'", "lighten(\"foo\", 10%)")
|
416
|
-
assert_error_message("\"foo\" is not a number for `lighten'", "lighten(#fff, \"foo\")")
|
415
|
+
assert_error_message("$color: \"foo\" is not a color for `lighten'", "lighten(\"foo\", 10%)")
|
416
|
+
assert_error_message("$amount: \"foo\" is not a number for `lighten'", "lighten(#fff, \"foo\")")
|
417
417
|
end
|
418
418
|
|
419
419
|
def test_darken
|
@@ -434,8 +434,8 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
434
434
|
end
|
435
435
|
|
436
436
|
def test_darken_tests_types
|
437
|
-
assert_error_message("\"foo\" is not a color for `darken'", "darken(\"foo\", 10%)")
|
438
|
-
assert_error_message("\"foo\" is not a number for `darken'", "darken(#fff, \"foo\")")
|
437
|
+
assert_error_message("$color: \"foo\" is not a color for `darken'", "darken(\"foo\", 10%)")
|
438
|
+
assert_error_message("$amount: \"foo\" is not a number for `darken'", "darken(#fff, \"foo\")")
|
439
439
|
end
|
440
440
|
|
441
441
|
def test_saturate
|
@@ -458,8 +458,8 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
458
458
|
end
|
459
459
|
|
460
460
|
def test_saturate_tests_types
|
461
|
-
assert_error_message("\"foo\" is not a color for `saturate'", "saturate(\"foo\", 10%)")
|
462
|
-
assert_error_message("\"foo\" is not a number for `saturate'", "saturate(#fff, \"foo\")")
|
461
|
+
assert_error_message("$color: \"foo\" is not a color for `saturate'", "saturate(\"foo\", 10%)")
|
462
|
+
assert_error_message("$amount: \"foo\" is not a number for `saturate'", "saturate(#fff, \"foo\")")
|
463
463
|
end
|
464
464
|
|
465
465
|
def test_desaturate
|
@@ -481,8 +481,8 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
481
481
|
end
|
482
482
|
|
483
483
|
def test_desaturate_tests_types
|
484
|
-
assert_error_message("\"foo\" is not a color for `desaturate'", "desaturate(\"foo\", 10%)")
|
485
|
-
assert_error_message("\"foo\" is not a number for `desaturate'", "desaturate(#fff, \"foo\")")
|
484
|
+
assert_error_message("$color: \"foo\" is not a color for `desaturate'", "desaturate(\"foo\", 10%)")
|
485
|
+
assert_error_message("$amount: \"foo\" is not a number for `desaturate'", "desaturate(#fff, \"foo\")")
|
486
486
|
end
|
487
487
|
|
488
488
|
def test_adjust_hue
|
@@ -498,8 +498,8 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
498
498
|
end
|
499
499
|
|
500
500
|
def test_adjust_hue_tests_types
|
501
|
-
assert_error_message("\"foo\" is not a color for `adjust-hue'", "adjust-hue(\"foo\", 10%)")
|
502
|
-
assert_error_message("\"foo\" is not a number for `adjust-hue'", "adjust-hue(#fff, \"foo\")")
|
501
|
+
assert_error_message("$color: \"foo\" is not a color for `adjust-hue'", "adjust-hue(\"foo\", 10%)")
|
502
|
+
assert_error_message("$degrees: \"foo\" is not a number for `adjust-hue'", "adjust-hue(#fff, \"foo\")")
|
503
503
|
end
|
504
504
|
|
505
505
|
def test_adjust_color
|
@@ -557,7 +557,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
557
557
|
end
|
558
558
|
|
559
559
|
def test_adjust_color_tests_types
|
560
|
-
assert_error_message("\"foo\" is not a color for `adjust-color'", "adjust-color(foo, $hue: 10)")
|
560
|
+
assert_error_message("$color: \"foo\" is not a color for `adjust-color'", "adjust-color(foo, $hue: 10)")
|
561
561
|
# HSL
|
562
562
|
assert_error_message("$hue: \"foo\" is not a number for `adjust-color'",
|
563
563
|
"adjust-color(blue, $hue: foo)")
|
@@ -663,7 +663,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
663
663
|
end
|
664
664
|
|
665
665
|
def test_scale_color_tests_types
|
666
|
-
assert_error_message("\"foo\" is not a color for `scale-color'", "scale-color(foo, $red: 10%)")
|
666
|
+
assert_error_message("$color: \"foo\" is not a color for `scale-color'", "scale-color(foo, $red: 10%)")
|
667
667
|
# HSL
|
668
668
|
assert_error_message("$saturation: \"foo\" is not a number for `scale-color'",
|
669
669
|
"scale-color(blue, $saturation: foo)")
|
@@ -734,7 +734,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
734
734
|
end
|
735
735
|
|
736
736
|
def test_change_color_tests_types
|
737
|
-
assert_error_message("\"foo\" is not a color for `change-color'", "change-color(foo, $red: 10%)")
|
737
|
+
assert_error_message("$color: \"foo\" is not a color for `change-color'", "change-color(foo, $red: 10%)")
|
738
738
|
# HSL
|
739
739
|
assert_error_message("$saturation: \"foo\" is not a number for `change-color'",
|
740
740
|
"change-color(blue, $saturation: foo)")
|
@@ -797,9 +797,9 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
797
797
|
end
|
798
798
|
|
799
799
|
def test_mix_tests_types
|
800
|
-
assert_error_message("\"foo\" is not a color for `mix'", "mix(\"foo\", #f00, 10%)")
|
801
|
-
assert_error_message("\"foo\" is not a color for `mix'", "mix(#f00, \"foo\", 10%)")
|
802
|
-
assert_error_message("\"foo\" is not a number for `mix'", "mix(#f00, #baf, \"foo\")")
|
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%)")
|
802
|
+
assert_error_message("$weight: \"foo\" is not a number for `mix'", "mix(#f00, #baf, \"foo\")")
|
803
803
|
end
|
804
804
|
|
805
805
|
def test_mix_tests_bounds
|
@@ -822,7 +822,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
822
822
|
end
|
823
823
|
|
824
824
|
def tets_grayscale_tests_types
|
825
|
-
assert_error_message("\"foo\" is not a color for `grayscale'", "grayscale(\"foo\")")
|
825
|
+
assert_error_message("$color: \"foo\" is not a color for `grayscale'", "grayscale(\"foo\")")
|
826
826
|
end
|
827
827
|
|
828
828
|
def test_complement
|
@@ -835,7 +835,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
835
835
|
end
|
836
836
|
|
837
837
|
def tets_complement_tests_types
|
838
|
-
assert_error_message("\"foo\" is not a color for `complement'", "complement(\"foo\")")
|
838
|
+
assert_error_message("$color: \"foo\" is not a color for `complement'", "complement(\"foo\")")
|
839
839
|
end
|
840
840
|
|
841
841
|
def test_invert
|
@@ -845,7 +845,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
845
845
|
end
|
846
846
|
|
847
847
|
def test_invert_tests_types
|
848
|
-
assert_error_message("\"foo\" is not a color for `invert'", "invert(\"foo\")")
|
848
|
+
assert_error_message("$color: \"foo\" is not a color for `invert'", "invert(\"foo\")")
|
849
849
|
end
|
850
850
|
|
851
851
|
def test_unquote
|
@@ -861,7 +861,7 @@ class SassFunctionTest < Test::Unit::TestCase
|
|
861
861
|
end
|
862
862
|
|
863
863
|
def test_quote_tests_type
|
864
|
-
assert_error_message("#ff0000 is not a string for `quote'", "quote(#f00)")
|
864
|
+
assert_error_message("$string: #ff0000 is not a string for `quote'", "quote(#f00)")
|
865
865
|
end
|
866
866
|
|
867
867
|
def test_user_defined_function
|
@@ -900,14 +900,14 @@ MSG
|
|
900
900
|
assert_equal(%Q{"em/rem"}, evaluate("unit(10px * 5em / 30cm / 1rem)"))
|
901
901
|
assert_equal(%Q{"em*vh/cm*rem"}, evaluate("unit(10vh * 5em / 30cm / 1rem)"))
|
902
902
|
assert_equal(%Q{"px"}, evaluate("unit($number: 100px)"))
|
903
|
-
assert_error_message("#ff0000 is not a number for `unit'", "unit(#f00)")
|
903
|
+
assert_error_message("$number: #ff0000 is not a number for `unit'", "unit(#f00)")
|
904
904
|
end
|
905
905
|
|
906
906
|
def test_unitless
|
907
907
|
assert_equal(%Q{true}, evaluate("unitless(100)"))
|
908
908
|
assert_equal(%Q{false}, evaluate("unitless(100px)"))
|
909
909
|
assert_equal(%Q{false}, evaluate("unitless($number: 100px)"))
|
910
|
-
assert_error_message("#ff0000 is not a number for `unitless'", "unitless(#f00)")
|
910
|
+
assert_error_message("$number: #ff0000 is not a number for `unitless'", "unitless(#f00)")
|
911
911
|
end
|
912
912
|
|
913
913
|
def test_comparable
|
@@ -915,8 +915,8 @@ MSG
|
|
915
915
|
assert_equal(%Q{true}, evaluate("comparable(10cm, 3mm)"))
|
916
916
|
assert_equal(%Q{false}, evaluate("comparable(100px, 3em)"))
|
917
917
|
assert_equal(%Q{false}, evaluate("comparable($number-1: 100px, $number-2: 3em)"))
|
918
|
-
assert_error_message("#ff0000 is not a number for `comparable'", "comparable(#f00, 1px)")
|
919
|
-
assert_error_message("#ff0000 is not a number for `comparable'", "comparable(1px, #f00)")
|
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)")
|
920
920
|
end
|
921
921
|
|
922
922
|
def test_length
|
@@ -941,6 +941,7 @@ MSG
|
|
941
941
|
assert_error_message("List index is 5 but list is only 4 items long for `nth'", "nth(1 2 3 4, 5)")
|
942
942
|
assert_error_message("List index is 2 but list is only 1 item long for `nth'", "nth(foo, 2)")
|
943
943
|
assert_error_message("List index is 1 but list has no items for `nth'", "nth((), 1)")
|
944
|
+
assert_error_message("$n: \"foo\" is not a number for `nth'", "nth(1 2 3, foo)")
|
944
945
|
end
|
945
946
|
|
946
947
|
def test_join
|
@@ -979,6 +980,7 @@ MSG
|
|
979
980
|
assert_equal("false", evaluate("(1, 2, ()) == join((), (1, 2))"))
|
980
981
|
|
981
982
|
assert_error_message("Separator name must be space, comma, or auto for `join'", "join(1, 2, baboon)")
|
983
|
+
assert_error_message("$separator: 12 is not a string for `join'", "join(1, 2, 12)")
|
982
984
|
end
|
983
985
|
|
984
986
|
def test_append
|
@@ -1013,6 +1015,7 @@ MSG
|
|
1013
1015
|
assert_equal("true", evaluate("(1 2) == nth(append((), 1 2), 1)"))
|
1014
1016
|
|
1015
1017
|
assert_error_message("Separator name must be space, comma, or auto for `append'", "append(1, 2, baboon)")
|
1018
|
+
assert_error_message("$separator: 12 is not a string for `append'", "append(1, 2, 12)")
|
1016
1019
|
end
|
1017
1020
|
|
1018
1021
|
def test_zip
|