oreorenasass 3.4.4 → 3.4.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -26,6 +26,6 @@ body { font: Arial; background: blue; }
|
|
26
26
|
#content.user.show #container.top #column.right { width: 600px; }
|
27
27
|
#content.user.show #container.bottom { background: brown; }
|
28
28
|
|
29
|
-
#foo { background-color: #
|
29
|
+
#foo { background-color: #bbaaff; }
|
30
30
|
|
31
31
|
nonimported { myconst: hello; otherconst: goodbye; post-mixin: here; }
|
@@ -1,12 +1,12 @@
|
|
1
1
|
#main {
|
2
2
|
width: 15em;
|
3
|
-
color:
|
3
|
+
color: blue;
|
4
4
|
}
|
5
5
|
#main p {
|
6
6
|
border-top-width: 2px;
|
7
|
-
border-top-color: #
|
7
|
+
border-top-color: #ffcc00;
|
8
8
|
border-left-width: 1px;
|
9
|
-
border-left-color:
|
9
|
+
border-left-color: black;
|
10
10
|
-moz-border-radius: 10px;
|
11
11
|
border-style: dotted;
|
12
12
|
border-width: 2px;
|
@@ -17,9 +17,9 @@
|
|
17
17
|
|
18
18
|
#left {
|
19
19
|
border-top-width: 2px;
|
20
|
-
border-top-color: #
|
20
|
+
border-top-color: #ffcc00;
|
21
21
|
border-left-width: 1px;
|
22
|
-
border-left-color:
|
22
|
+
border-left-color: black;
|
23
23
|
-moz-border-radius: 10px;
|
24
24
|
font-size: 2em;
|
25
25
|
font-weight: bold;
|
@@ -28,25 +28,25 @@
|
|
28
28
|
|
29
29
|
#right {
|
30
30
|
border-top-width: 2px;
|
31
|
-
border-top-color: #
|
31
|
+
border-top-color: #ffcc00;
|
32
32
|
border-left-width: 1px;
|
33
|
-
border-left-color:
|
33
|
+
border-left-color: black;
|
34
34
|
-moz-border-radius: 10px;
|
35
|
-
color:
|
35
|
+
color: red;
|
36
36
|
font-size: 20px;
|
37
37
|
float: right;
|
38
38
|
}
|
39
39
|
|
40
40
|
.bordered {
|
41
41
|
border-top-width: 2px;
|
42
|
-
border-top-color: #
|
42
|
+
border-top-color: #ffcc00;
|
43
43
|
border-left-width: 1px;
|
44
|
-
border-left-color:
|
44
|
+
border-left-color: black;
|
45
45
|
-moz-border-radius: 10px;
|
46
46
|
}
|
47
47
|
|
48
48
|
.complex {
|
49
|
-
color:
|
49
|
+
color: red;
|
50
50
|
font-size: 20px;
|
51
51
|
text-decoration: none;
|
52
52
|
}
|
@@ -59,12 +59,12 @@
|
|
59
59
|
}
|
60
60
|
* html .complex {
|
61
61
|
height: 1px;
|
62
|
-
color:
|
62
|
+
color: red;
|
63
63
|
font-size: 20px;
|
64
64
|
}
|
65
65
|
|
66
66
|
.more-complex {
|
67
|
-
color:
|
67
|
+
color: red;
|
68
68
|
font-size: 20px;
|
69
69
|
text-decoration: none;
|
70
70
|
display: inline;
|
@@ -80,16 +80,16 @@
|
|
80
80
|
}
|
81
81
|
* html .more-complex {
|
82
82
|
height: 1px;
|
83
|
-
color:
|
83
|
+
color: red;
|
84
84
|
font-size: 20px;
|
85
85
|
}
|
86
86
|
.more-complex a:hover {
|
87
87
|
text-decoration: underline;
|
88
|
-
color:
|
88
|
+
color: red;
|
89
89
|
font-size: 20px;
|
90
90
|
border-top-width: 2px;
|
91
|
-
border-top-color: #
|
91
|
+
border-top-color: #ffcc00;
|
92
92
|
border-left-width: 1px;
|
93
|
-
border-left-color:
|
93
|
+
border-left-color: black;
|
94
94
|
-moz-border-radius: 10px;
|
95
95
|
}
|
@@ -1,7 +1,7 @@
|
|
1
|
-
#main { content: Hello\!; qstr: 'Quo"ted"!'; hstr: Hyph-en\!; width: 30em; background-color:
|
2
|
-
#main #sidebar { background-color: #00ff98; num-normal: 10; num-dec: 10.2; num-dec0: 99; num-neg: -10; esc: 10\+12; many: 6; order: 7; complex: #4c9db1hi16; }
|
1
|
+
#main { content: Hello\!; qstr: 'Quo"ted"!'; hstr: Hyph-en\!; width: 30em; background-color: black; color: #ffffaa; short-color: #112233; named-color: olive; con: "foo" bar 9 hi there "boom"; con2: "noquo" quo; }
|
2
|
+
#main #sidebar { background-color: #00ff98; num-normal: 10; num-dec: 10.2; num-dec0: 99; num-neg: -10; esc: 10 \+12; many: 6; order: 7; complex: #4c9db1hi16; }
|
3
3
|
|
4
|
-
#plus { num-num: 7; num-num-un: 25em; num-num-un2: 23em; num-num-neg: 9.87; num-str: 100px; num-col: #b7b7b7; num-perc: 31%; str-str: "hi there"; str-str2: "hi there"; str-col: "14em solid #
|
4
|
+
#plus { num-num: 7; num-num-un: 25em; num-num-un2: 23em; num-num-neg: 9.87; num-str: 100px; num-col: #b7b7b7; num-perc: 31%; str-str: "hi\ there"; str-str2: "hi there"; str-col: "14em solid #112233"; str-num: "times: 13"; col-num: #ff7b9d; col-col: #5173ff; }
|
5
5
|
|
6
6
|
#minus { num-num: 900; col-num: #f9f9f4; col-col: #000035; unary-num: -1; unary-const: 10; unary-paren: -11; unary-two: 12; unary-many: 12; unary-crazy: -15; }
|
7
7
|
|
@@ -26,6 +26,6 @@ body { font: Arial; background: blue; }
|
|
26
26
|
#content.user.show #container.top #column.right { width: 600px; }
|
27
27
|
#content.user.show #container.bottom { background: brown; }
|
28
28
|
|
29
|
-
#foo { background-color: #
|
29
|
+
#foo { background-color: #bbaaff; }
|
30
30
|
|
31
31
|
nonimported { myconst: hello; otherconst: goodbye; post-mixin: here; }
|
@@ -3,7 +3,7 @@
|
|
3
3
|
require File.dirname(__FILE__) + '/../test_helper'
|
4
4
|
require 'sass/engine'
|
5
5
|
|
6
|
-
class SassScriptConversionTest <
|
6
|
+
class SassScriptConversionTest < Test::Unit::TestCase
|
7
7
|
def test_bool
|
8
8
|
assert_renders "true"
|
9
9
|
assert_renders "false"
|
@@ -13,8 +13,9 @@ class SassScriptConversionTest < MiniTest::Test
|
|
13
13
|
assert_renders "#abcdef"
|
14
14
|
assert_renders "blue"
|
15
15
|
assert_renders "rgba(0, 1, 2, 0.2)"
|
16
|
-
|
17
|
-
|
16
|
+
|
17
|
+
assert_equal "#aabbcc", render("#abc")
|
18
|
+
assert_equal "blue", render("#0000ff")
|
18
19
|
end
|
19
20
|
|
20
21
|
def test_number
|
@@ -57,10 +58,6 @@ class SassScriptConversionTest < MiniTest::Test
|
|
57
58
|
assert_renders "foo($karg1: val, $karg2: val2)"
|
58
59
|
end
|
59
60
|
|
60
|
-
def test_funcall_with_hyphen_conversion_keyword_arg
|
61
|
-
assert_renders "foo($a-b_c: val)"
|
62
|
-
end
|
63
|
-
|
64
61
|
def test_url
|
65
62
|
assert_renders "url(foo.gif)"
|
66
63
|
assert_renders "url($var)"
|
@@ -86,37 +83,11 @@ class SassScriptConversionTest < MiniTest::Test
|
|
86
83
|
assert_renders "foo(a, b, (a, b, c)...)"
|
87
84
|
end
|
88
85
|
|
89
|
-
def test_singleton_list
|
90
|
-
assert_renders "(1,)"
|
91
|
-
assert_renders "(1 2 3,)"
|
92
|
-
assert_renders "((1, 2, 3),)"
|
93
|
-
end
|
94
|
-
|
95
|
-
def test_map
|
96
|
-
assert_renders "(foo: bar)"
|
97
|
-
assert_renders "(foo: bar, baz: bip)"
|
98
|
-
assert_renders "(foo: bar, baz: (bip: bap))"
|
99
|
-
end
|
100
|
-
|
101
|
-
def test_map_in_list
|
102
|
-
assert_renders "(foo: bar) baz"
|
103
|
-
assert_renders "(foo: bar), (baz: bip)"
|
104
|
-
end
|
105
|
-
|
106
|
-
def test_list_in_map
|
107
|
-
assert_renders "(foo: bar baz)"
|
108
|
-
assert_renders "(foo: (bar, baz), bip: bop)"
|
109
|
-
end
|
110
|
-
|
111
|
-
def test_selector
|
112
|
-
assert_renders "&"
|
113
|
-
end
|
114
|
-
|
115
86
|
def self.test_precedence(outer, inner)
|
116
87
|
op_outer = Sass::Script::Lexer::OPERATORS_REVERSE[outer]
|
117
88
|
op_inner = Sass::Script::Lexer::OPERATORS_REVERSE[inner]
|
118
89
|
class_eval <<RUBY
|
119
|
-
def test_precedence_#{outer}_#{inner}
|
90
|
+
def test_precedence_#{outer}_#{inner}
|
120
91
|
assert_renders "$foo #{op_outer} $bar #{op_inner} $baz"
|
121
92
|
assert_renders "$foo #{op_inner} $bar #{op_outer} $baz"
|
122
93
|
|
@@ -135,7 +106,7 @@ RUBY
|
|
135
106
|
op = separator_for(op_name)
|
136
107
|
sibling = separator_for(sibling_name)
|
137
108
|
class_eval <<RUBY
|
138
|
-
def test_associative_#{op_name}_#{sibling_name}
|
109
|
+
def test_associative_#{op_name}_#{sibling_name}
|
139
110
|
assert_renders "$foo#{op}$bar#{op}$baz"
|
140
111
|
|
141
112
|
assert_equal "$foo#{op}$bar#{op}$baz",
|
@@ -163,7 +134,7 @@ RUBY
|
|
163
134
|
op = Sass::Script::Lexer::OPERATORS_REVERSE[op_name]
|
164
135
|
sibling = Sass::Script::Lexer::OPERATORS_REVERSE[sibling_name]
|
165
136
|
class_eval <<RUBY
|
166
|
-
def test_non_associative_#{op_name}_#{sibling_name}
|
137
|
+
def test_non_associative_#{op_name}_#{sibling_name}
|
167
138
|
assert_renders "$foo #{op} $bar #{op} $baz"
|
168
139
|
|
169
140
|
assert_renders "$foo #{op} ($bar #{op} $baz)"
|
data/test/sass/script_test.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# -*- coding: utf-8 -*-
|
3
2
|
require File.dirname(__FILE__) + '/../test_helper'
|
4
3
|
require 'sass/engine'
|
5
4
|
|
6
5
|
module Sass::Script::Functions::UserFunctions
|
7
6
|
def assert_options(val)
|
8
7
|
val.options[:foo]
|
9
|
-
Sass::Script::
|
8
|
+
Sass::Script::String.new("Options defined!")
|
10
9
|
end
|
11
10
|
|
12
11
|
def arg_error
|
@@ -18,73 +17,46 @@ module Sass::Script::Functions
|
|
18
17
|
include Sass::Script::Functions::UserFunctions
|
19
18
|
end
|
20
19
|
|
21
|
-
class SassScriptTest <
|
20
|
+
class SassScriptTest < Test::Unit::TestCase
|
22
21
|
include Sass::Script
|
23
22
|
|
24
|
-
def
|
25
|
-
|
26
|
-
|
23
|
+
def test_color_checks_input
|
24
|
+
assert_raise_message(ArgumentError, "Blue value -1 must be between 0 and 255") {Color.new([1, 2, -1])}
|
25
|
+
assert_raise_message(ArgumentError, "Red value 256 must be between 0 and 255") {Color.new([256, 2, 3])}
|
27
26
|
end
|
28
27
|
|
29
|
-
def
|
30
|
-
|
31
|
-
|
28
|
+
def test_color_checks_rgba_input
|
29
|
+
assert_raise_message(ArgumentError, "Alpha channel 1.1 must be between 0 and 1") {Color.new([1, 2, 3, 1.1])}
|
30
|
+
assert_raise_message(ArgumentError, "Alpha channel -0.1 must be between 0 and 1") {Color.new([1, 2, 3, -0.1])}
|
32
31
|
end
|
33
32
|
|
34
33
|
def test_string_escapes
|
35
34
|
assert_equal "'", resolve("\"'\"")
|
36
35
|
assert_equal '"', resolve("\"\\\"\"")
|
37
|
-
assert_equal "
|
38
|
-
assert_equal "
|
39
|
-
assert_equal "☃f", resolve("\"\\2603 f\"")
|
40
|
-
assert_equal "☃x", resolve("\"\\2603x\"")
|
41
|
-
assert_equal "\\2603", resolve("\"\\\\2603\"")
|
42
|
-
|
43
|
-
# U+FFFD is the replacement character, "�".
|
44
|
-
assert_equal [0xFFFD].pack("U"), resolve("\"\\0\"")
|
45
|
-
assert_equal [0xFFFD].pack("U"), resolve("\"\\FFFFFF\"")
|
46
|
-
assert_equal [0xFFFD].pack("U"), resolve("\"\\D800\"")
|
47
|
-
assert_equal [0xD7FF].pack("U"), resolve("\"\\D7FF\"")
|
48
|
-
assert_equal [0xFFFD].pack("U"), resolve("\"\\DFFF\"")
|
49
|
-
assert_equal [0xE000].pack("U"), resolve("\"\\E000\"")
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_string_escapes_are_resolved_before_operators
|
53
|
-
assert_equal "true", resolve('"abc" == "\61\62\63"')
|
54
|
-
end
|
36
|
+
assert_equal "\\\\", resolve("\"\\\\\"")
|
37
|
+
assert_equal "\\02fa", resolve("\"\\02fa\"")
|
55
38
|
|
56
|
-
|
57
|
-
assert_equal '"
|
58
|
-
assert_equal "
|
59
|
-
assert_equal "
|
60
|
-
assert_equal "\"f'o\\\"o\"", resolve_quoted("'f\\'o\"o'")
|
61
|
-
assert_equal '"foo bar"', resolve_quoted('"foo\20 bar"')
|
62
|
-
assert_equal '"foo\a bar"', resolve_quoted('"foo\a bar"')
|
63
|
-
assert_equal '"x\ay"', resolve_quoted('"x\a y"')
|
64
|
-
assert_equal '"\a "', resolve_quoted('"\a\20"')
|
65
|
-
assert_equal '"\a abcdef"', resolve_quoted('"\a abcdef"')
|
66
|
-
assert_equal '"☃abcdef"', resolve_quoted('"\2603 abcdef"')
|
67
|
-
assert_equal '"\\\\"', resolve_quoted('"\\\\"')
|
68
|
-
assert_equal '"foobar"', resolve_quoted("\"foo\\\nbar\"")
|
39
|
+
assert_equal "'", resolve("'\\''")
|
40
|
+
assert_equal '"', resolve("'\"'")
|
41
|
+
assert_equal "\\\\", resolve("'\\\\'")
|
42
|
+
assert_equal "\\02fa", resolve("'\\02fa'")
|
69
43
|
end
|
70
44
|
|
71
45
|
def test_color_names
|
72
46
|
assert_equal "white", resolve("white")
|
73
|
-
assert_equal "
|
47
|
+
assert_equal "white", resolve("#ffffff")
|
74
48
|
assert_equal "#fffffe", resolve("white - #000001")
|
75
|
-
assert_equal "transparent", resolve("transparent")
|
76
|
-
assert_equal "transparent", resolve("rgba(0, 0, 0, 0)")
|
77
49
|
end
|
78
50
|
|
79
51
|
def test_rgba_color_literals
|
80
|
-
assert_equal Sass::Script::
|
52
|
+
assert_equal Sass::Script::Color.new([1, 2, 3, 0.75]), eval("rgba(1, 2, 3, 0.75)")
|
81
53
|
assert_equal "rgba(1, 2, 3, 0.75)", resolve("rgba(1, 2, 3, 0.75)")
|
82
54
|
|
83
|
-
assert_equal Sass::Script::
|
55
|
+
assert_equal Sass::Script::Color.new([1, 2, 3, 0]), eval("rgba(1, 2, 3, 0)")
|
84
56
|
assert_equal "rgba(1, 2, 3, 0)", resolve("rgba(1, 2, 3, 0)")
|
85
57
|
|
86
|
-
assert_equal Sass::Script::
|
87
|
-
assert_equal Sass::Script::
|
58
|
+
assert_equal Sass::Script::Color.new([1, 2, 3]), eval("rgba(1, 2, 3, 1)")
|
59
|
+
assert_equal Sass::Script::Color.new([1, 2, 3, 1]), eval("rgba(1, 2, 3, 1)")
|
88
60
|
assert_equal "#010203", resolve("rgba(1, 2, 3, 1)")
|
89
61
|
assert_equal "white", resolve("rgba(255, 255, 255, 1)")
|
90
62
|
end
|
@@ -119,11 +91,10 @@ class SassScriptTest < MiniTest::Test
|
|
119
91
|
assert_equal "#123", resolve("#112233", :style => :compressed)
|
120
92
|
assert_equal "#000", resolve("black", :style => :compressed)
|
121
93
|
assert_equal "red", resolve("#f00", :style => :compressed)
|
122
|
-
assert_equal "blue", resolve("
|
94
|
+
assert_equal "blue", resolve("#00f", :style => :compressed)
|
123
95
|
assert_equal "navy", resolve("#000080", :style => :compressed)
|
124
96
|
assert_equal "navy #fff", resolve("#000080 white", :style => :compressed)
|
125
97
|
assert_equal "This color is #fff", resolve('"This color is #{ white }"', :style => :compressed)
|
126
|
-
assert_equal "transparent", resolve("rgba(0, 0, 0, 0)", :style => :compressed)
|
127
98
|
end
|
128
99
|
|
129
100
|
def test_compressed_comma
|
@@ -133,8 +104,8 @@ class SassScriptTest < MiniTest::Test
|
|
133
104
|
end
|
134
105
|
|
135
106
|
def test_implicit_strings
|
136
|
-
assert_equal Sass::Script::
|
137
|
-
assert_equal Sass::Script::
|
107
|
+
assert_equal Sass::Script::String.new("foo"), eval("foo")
|
108
|
+
assert_equal Sass::Script::String.new("foo/bar"), eval("foo/bar")
|
138
109
|
end
|
139
110
|
|
140
111
|
def test_basic_interpolation
|
@@ -206,11 +177,6 @@ class SassScriptTest < MiniTest::Test
|
|
206
177
|
assert_equal "foo1bar5baz4bang", resolve('\'foo#{1 + "bar#{2 + 3}baz" + 4}bang\'')
|
207
178
|
end
|
208
179
|
|
209
|
-
def test_interpolation_with_newline
|
210
|
-
assert_equal "\nbang", resolve('"#{"\a "}bang"')
|
211
|
-
assert_equal "\n\nbang", resolve('"#{"\a "}\a bang"')
|
212
|
-
end
|
213
|
-
|
214
180
|
def test_rule_interpolation
|
215
181
|
assert_equal(<<CSS, render(<<SASS))
|
216
182
|
foo bar baz bang {
|
@@ -263,9 +229,9 @@ SASS
|
|
263
229
|
end
|
264
230
|
|
265
231
|
def test_dynamic_url
|
266
|
-
assert_equal "url(foo-bar)", resolve("url($foo)", {}, env('foo' => Sass::Script::
|
267
|
-
assert_equal "url(foo-bar baz)", resolve("url($foo $bar)", {}, env('foo' => Sass::Script::
|
268
|
-
assert_equal "url(foo baz)", resolve("url(foo $bar)", {}, env('bar' => Sass::Script::
|
232
|
+
assert_equal "url(foo-bar)", resolve("url($foo)", {}, env('foo' => Sass::Script::String.new("foo-bar")))
|
233
|
+
assert_equal "url(foo-bar baz)", resolve("url($foo $bar)", {}, env('foo' => Sass::Script::String.new("foo-bar"), 'bar' => Sass::Script::String.new("baz")))
|
234
|
+
assert_equal "url(foo baz)", resolve("url(foo $bar)", {}, env('bar' => Sass::Script::String.new("baz")))
|
269
235
|
assert_equal "url(foo bar)", resolve("url(foo bar)")
|
270
236
|
end
|
271
237
|
|
@@ -277,7 +243,7 @@ SASS
|
|
277
243
|
end
|
278
244
|
|
279
245
|
def test_hyphenated_variables
|
280
|
-
assert_equal("a-b", resolve("$a-b", {}, env("a-b" => Sass::Script::
|
246
|
+
assert_equal("a-b", resolve("$a-b", {}, env("a-b" => Sass::Script::String.new("a-b"))))
|
281
247
|
end
|
282
248
|
|
283
249
|
def test_ruby_equality
|
@@ -286,8 +252,8 @@ SASS
|
|
286
252
|
assert_equal eval('1 2 3.0'), eval('1 2 3')
|
287
253
|
assert_equal eval('1, 2, 3.0'), eval('1, 2, 3')
|
288
254
|
assert_equal eval('(1 2), (3, 4), (5 6)'), eval('(1 2), (3, 4), (5 6)')
|
289
|
-
|
290
|
-
|
255
|
+
assert_not_equal eval('1, 2, 3'), eval('1 2 3')
|
256
|
+
assert_not_equal eval('1'), eval('"1"')
|
291
257
|
end
|
292
258
|
|
293
259
|
def test_booleans
|
@@ -347,7 +313,6 @@ SASS
|
|
347
313
|
assert_equal '"foo", "bar"', resolve("'foo' , 'bar'")
|
348
314
|
assert_equal "true, 1", resolve('true , 1')
|
349
315
|
assert_equal "foobar", resolve('"foo" + "bar"')
|
350
|
-
assert_equal "\nfoo\nxyz", resolve('"\a foo" + "\axyz"')
|
351
316
|
assert_equal "true1", resolve('true + 1')
|
352
317
|
assert_equal '"foo"-"bar"', resolve("'foo' - 'bar'")
|
353
318
|
assert_equal "true-1", resolve('true - 1')
|
@@ -408,7 +373,7 @@ SASS
|
|
408
373
|
|
409
374
|
def test_equals
|
410
375
|
assert_equal("true", resolve('"foo" == $foo', {},
|
411
|
-
env("foo" => Sass::Script::
|
376
|
+
env("foo" => Sass::Script::String.new("foo"))))
|
412
377
|
assert_equal "true", resolve("1 == 1.0")
|
413
378
|
assert_equal "true", resolve("false != true")
|
414
379
|
assert_equal "false", resolve("1em == 1px")
|
@@ -433,12 +398,6 @@ SASS
|
|
433
398
|
assert_equal "true", resolve('() != null')
|
434
399
|
end
|
435
400
|
|
436
|
-
def test_mod
|
437
|
-
assert_equal "5", resolve("29 % 12")
|
438
|
-
assert_equal "5px", resolve("29px % 12")
|
439
|
-
assert_equal "5px", resolve("29px % 12px")
|
440
|
-
end
|
441
|
-
|
442
401
|
def test_operation_precedence
|
443
402
|
assert_equal "false true", resolve("true and false false or true")
|
444
403
|
assert_equal "true", resolve("false and true or true and true")
|
@@ -462,36 +421,6 @@ SASS
|
|
462
421
|
assert_equal "true", resolve("1.1cm == 11mm")
|
463
422
|
end
|
464
423
|
|
465
|
-
def test_length_units
|
466
|
-
assert_equal "2.54", resolve("(1in/1cm)")
|
467
|
-
assert_equal "2.3622", resolve("(1cm/1pc)")
|
468
|
-
assert_equal "4.23333", resolve("(1pc/1mm)")
|
469
|
-
assert_equal "2.83465", resolve("(1mm/1pt)")
|
470
|
-
assert_equal "1.33333", resolve("(1pt/1px)")
|
471
|
-
assert_equal "0.01042", resolve("(1px/1in)")
|
472
|
-
end
|
473
|
-
|
474
|
-
def test_angle_units
|
475
|
-
assert_equal "1.11111", resolve("(1deg/1grad)")
|
476
|
-
assert_equal "0.01571", resolve("(1grad/1rad)")
|
477
|
-
assert_equal "0.15915", resolve("(1rad/1turn)")
|
478
|
-
assert_equal "360", resolve("(1turn/1deg)")
|
479
|
-
end
|
480
|
-
|
481
|
-
def test_time_units
|
482
|
-
assert_equal "1000", resolve("(1s/1ms)")
|
483
|
-
end
|
484
|
-
|
485
|
-
def test_frequency_units
|
486
|
-
assert_equal "0.001", resolve("(1Hz/1kHz)")
|
487
|
-
end
|
488
|
-
|
489
|
-
def test_resolution_units
|
490
|
-
assert_equal "2.54", resolve("(1dpi/1dpcm)")
|
491
|
-
assert_equal "37.79528", resolve("(1dpcm/1dppx)")
|
492
|
-
assert_equal "0.01042", resolve("(1dppx/1dpi)")
|
493
|
-
end
|
494
|
-
|
495
424
|
def test_operations_have_options
|
496
425
|
assert_equal "Options defined!", resolve("assert_options(1 + 1)")
|
497
426
|
assert_equal "Options defined!", resolve("assert_options('bar' + 'baz')")
|
@@ -524,22 +453,22 @@ SASS
|
|
524
453
|
assert_equal "0.5", resolve("$var", {}, env("var" => eval("1px/2px")))
|
525
454
|
end
|
526
455
|
|
527
|
-
def
|
456
|
+
def test_colors_with_wrong_number_of_digits
|
457
|
+
assert_raise_message(Sass::SyntaxError,
|
458
|
+
"Colors must have either three or six digits: '#0'") {eval("#0")}
|
528
459
|
assert_raise_message(Sass::SyntaxError,
|
529
|
-
|
460
|
+
"Colors must have either three or six digits: '#12'") {eval("#12")}
|
530
461
|
assert_raise_message(Sass::SyntaxError,
|
531
|
-
|
462
|
+
"Colors must have either three or six digits: '#abcd'") {eval("#abcd")}
|
532
463
|
assert_raise_message(Sass::SyntaxError,
|
533
|
-
|
464
|
+
"Colors must have either three or six digits: '#abcdE'") {eval("#abcdE")}
|
534
465
|
assert_raise_message(Sass::SyntaxError,
|
535
|
-
|
536
|
-
assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "": expected expression (e.g. ' \
|
537
|
-
'1px, bold), was "#1234567"') {eval("#1234567")}
|
466
|
+
"Colors must have either three or six digits: '#abcdEFA'") {eval("#abcdEFA")}
|
538
467
|
end
|
539
468
|
|
540
469
|
def test_case_insensitive_color_names
|
541
|
-
assert_equal "
|
542
|
-
assert_equal "
|
470
|
+
assert_equal "blue", resolve("BLUE")
|
471
|
+
assert_equal "red", resolve("rEd")
|
543
472
|
assert_equal "#7f4000", resolve("mix(GrEeN, ReD)")
|
544
473
|
end
|
545
474
|
|
@@ -560,59 +489,6 @@ SASS
|
|
560
489
|
assert_equal "1 2 3", resolve("null 1 2 3")
|
561
490
|
end
|
562
491
|
|
563
|
-
def test_map_can_have_trailing_comma
|
564
|
-
assert_equal("(foo: 1, bar: 2)", eval("(foo: 1, bar: 2,)").to_sass)
|
565
|
-
end
|
566
|
-
|
567
|
-
def test_list_can_have_trailing_comma
|
568
|
-
assert_equal("1, 2, 3", resolve("1, 2, 3,"))
|
569
|
-
end
|
570
|
-
|
571
|
-
def test_trailing_comma_defines_singleton_list
|
572
|
-
assert_equal("1 2 3", resolve("nth((1 2 3,), 1)"))
|
573
|
-
end
|
574
|
-
|
575
|
-
def test_map_cannot_have_duplicate_keys
|
576
|
-
assert_raise_message(Sass::SyntaxError, 'Duplicate key "foo" in map (foo: bar, foo: baz).') do
|
577
|
-
eval("(foo: bar, foo: baz)")
|
578
|
-
end
|
579
|
-
assert_raise_message(Sass::SyntaxError, 'Duplicate key "foo" in map (foo: bar, fo + o: baz).') do
|
580
|
-
eval("(foo: bar, fo + o: baz)")
|
581
|
-
end
|
582
|
-
assert_raise_message(Sass::SyntaxError, 'Duplicate key "foo" in map (foo: bar, "foo": baz).') do
|
583
|
-
eval("(foo: bar, 'foo': baz)")
|
584
|
-
end
|
585
|
-
assert_raise_message(Sass::SyntaxError, 'Duplicate key 2px in map (2px: bar, 1px + 1px: baz).') do
|
586
|
-
eval("(2px: bar, 1px + 1px: baz)")
|
587
|
-
end
|
588
|
-
assert_raise_message(Sass::SyntaxError, 'Duplicate key #0000ff in map (blue: bar, #00f: baz).') do
|
589
|
-
eval("(blue: bar, #00f: baz)")
|
590
|
-
end
|
591
|
-
end
|
592
|
-
|
593
|
-
def test_non_duplicate_map_keys
|
594
|
-
# These shouldn't throw errors
|
595
|
-
eval("(foo: foo, bar: bar)")
|
596
|
-
eval("(2px: foo, 2: bar)")
|
597
|
-
eval("(2px: foo, 2em: bar)")
|
598
|
-
eval("('2px': foo, 2px: bar)")
|
599
|
-
end
|
600
|
-
|
601
|
-
def test_map_syntax_errors
|
602
|
-
assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "(foo:": expected expression (e.g. 1px, bold), was ")"') do
|
603
|
-
eval("(foo:)")
|
604
|
-
end
|
605
|
-
assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "(": expected ")", was ":bar)"') do
|
606
|
-
eval("(:bar)")
|
607
|
-
end
|
608
|
-
assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "(foo, bar": expected ")", was ": baz)"') do
|
609
|
-
eval("(foo, bar: baz)")
|
610
|
-
end
|
611
|
-
assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "(foo: bar, baz": expected ":", was ")"') do
|
612
|
-
eval("(foo: bar, baz)")
|
613
|
-
end
|
614
|
-
end
|
615
|
-
|
616
492
|
def test_deep_argument_error_not_unwrapped
|
617
493
|
# JRuby (as of 1.6.7.2) offers no way of distinguishing between
|
618
494
|
# argument errors caused by programming errors in a function and
|
@@ -620,7 +496,7 @@ SASS
|
|
620
496
|
return if RUBY_PLATFORM =~ /java/
|
621
497
|
|
622
498
|
# Don't validate the message; it's different on Rubinius.
|
623
|
-
|
499
|
+
assert_raise(ArgumentError) {resolve("arg-error()")}
|
624
500
|
end
|
625
501
|
|
626
502
|
def test_shallow_argument_error_unwrapped
|
@@ -628,268 +504,12 @@ SASS
|
|
628
504
|
end
|
629
505
|
|
630
506
|
def test_boolean_ops_short_circuit
|
631
|
-
assert_equal "false", resolve("$ie and $ie <= 7", {}, env('ie' => Sass::Script::
|
632
|
-
assert_equal "true", resolve("$ie or $undef", {}, env('ie' => Sass::Script::
|
633
|
-
end
|
634
|
-
|
635
|
-
def test_selector
|
636
|
-
env = Sass::Environment.new
|
637
|
-
assert_equal "true", resolve("& == null", {}, env)
|
638
|
-
|
639
|
-
env.selector = selector('.foo.bar .baz.bang, .bip.bop')
|
640
|
-
assert_equal ".foo.bar .baz.bang, .bip.bop", resolve("&", {}, env)
|
641
|
-
assert_equal ".foo.bar .baz.bang", resolve("nth(&, 1)", {}, env)
|
642
|
-
assert_equal ".bip.bop", resolve("nth(&, 2)", {}, env)
|
643
|
-
assert_equal ".foo.bar", resolve("nth(nth(&, 1), 1)", {}, env)
|
644
|
-
assert_equal ".baz.bang", resolve("nth(nth(&, 1), 2)", {}, env)
|
645
|
-
assert_equal ".bip.bop", resolve("nth(nth(&, 2), 1)", {}, env)
|
646
|
-
assert_equal "string", resolve("type-of(nth(nth(&, 1), 1))", {}, env)
|
647
|
-
|
648
|
-
env.selector = selector('.foo > .bar')
|
649
|
-
assert_equal ".foo > .bar", resolve("&", {}, env)
|
650
|
-
assert_equal ".foo > .bar", resolve("nth(&, 1)", {}, env)
|
651
|
-
assert_equal ".foo", resolve("nth(nth(&, 1), 1)", {}, env)
|
652
|
-
assert_equal ">", resolve("nth(nth(&, 1), 2)", {}, env)
|
653
|
-
assert_equal ".bar", resolve("nth(nth(&, 1), 3)", {}, env)
|
654
|
-
end
|
655
|
-
|
656
|
-
def test_selector_with_newlines
|
657
|
-
env = Sass::Environment.new
|
658
|
-
env.selector = selector(".foo.bar\n.baz.bang,\n\n.bip.bop")
|
659
|
-
assert_equal ".foo.bar .baz.bang, .bip.bop", resolve("&", {}, env)
|
660
|
-
assert_equal ".foo.bar .baz.bang", resolve("nth(&, 1)", {}, env)
|
661
|
-
assert_equal ".bip.bop", resolve("nth(&, 2)", {}, env)
|
662
|
-
assert_equal ".foo.bar", resolve("nth(nth(&, 1), 1)", {}, env)
|
663
|
-
assert_equal ".baz.bang", resolve("nth(nth(&, 1), 2)", {}, env)
|
664
|
-
assert_equal ".bip.bop", resolve("nth(nth(&, 2), 1)", {}, env)
|
665
|
-
assert_equal "string", resolve("type-of(nth(nth(&, 1), 1))", {}, env)
|
666
|
-
end
|
667
|
-
|
668
|
-
def test_setting_global_variable_globally
|
669
|
-
assert_no_warning {assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))}
|
670
|
-
.foo {
|
671
|
-
a: 1; }
|
672
|
-
|
673
|
-
.bar {
|
674
|
-
b: 2; }
|
675
|
-
CSS
|
676
|
-
$var: 1;
|
677
|
-
|
678
|
-
.foo {
|
679
|
-
a: $var;
|
680
|
-
}
|
681
|
-
|
682
|
-
$var: 2;
|
683
|
-
|
684
|
-
.bar {
|
685
|
-
b: $var;
|
686
|
-
}
|
687
|
-
SCSS
|
688
|
-
end
|
689
|
-
|
690
|
-
def test_setting_global_variable_locally
|
691
|
-
assert_no_warning {assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))}
|
692
|
-
.bar {
|
693
|
-
a: x;
|
694
|
-
b: y;
|
695
|
-
c: z; }
|
696
|
-
CSS
|
697
|
-
$var1: 1;
|
698
|
-
$var3: 3;
|
699
|
-
|
700
|
-
.foo {
|
701
|
-
$var1: x !global;
|
702
|
-
$var2: y !global;
|
703
|
-
@each $var3 in _ {
|
704
|
-
$var3: z !global;
|
705
|
-
}
|
706
|
-
}
|
707
|
-
|
708
|
-
.bar {
|
709
|
-
a: $var1;
|
710
|
-
b: $var2;
|
711
|
-
c: $var3;
|
712
|
-
}
|
713
|
-
SCSS
|
714
|
-
end
|
715
|
-
|
716
|
-
def test_setting_global_variable_locally_with_default
|
717
|
-
assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))
|
718
|
-
.bar {
|
719
|
-
a: 1;
|
720
|
-
b: y;
|
721
|
-
c: z; }
|
722
|
-
CSS
|
723
|
-
$var1: 1;
|
724
|
-
|
725
|
-
.foo {
|
726
|
-
$var1: x !global !default;
|
727
|
-
$var2: y !global !default;
|
728
|
-
@each $var3 in _ {
|
729
|
-
$var3: z !global !default;
|
730
|
-
}
|
731
|
-
}
|
732
|
-
|
733
|
-
.bar {
|
734
|
-
a: $var1;
|
735
|
-
b: $var2;
|
736
|
-
c: $var3;
|
737
|
-
}
|
738
|
-
SCSS
|
739
|
-
end
|
740
|
-
|
741
|
-
def test_setting_local_variable
|
742
|
-
assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))
|
743
|
-
.a {
|
744
|
-
value: inside; }
|
745
|
-
|
746
|
-
.b {
|
747
|
-
value: outside; }
|
748
|
-
CSS
|
749
|
-
$var: outside;
|
750
|
-
|
751
|
-
.a {
|
752
|
-
$var: inside;
|
753
|
-
value: $var;
|
754
|
-
}
|
755
|
-
|
756
|
-
.b {
|
757
|
-
value: $var;
|
758
|
-
}
|
759
|
-
SCSS
|
760
|
-
end
|
761
|
-
|
762
|
-
def test_setting_local_variable_from_inner_scope
|
763
|
-
assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))
|
764
|
-
.a .b {
|
765
|
-
value: inside; }
|
766
|
-
.a .c {
|
767
|
-
value: inside; }
|
768
|
-
CSS
|
769
|
-
.a {
|
770
|
-
$var: outside;
|
771
|
-
|
772
|
-
.b {
|
773
|
-
$var: inside;
|
774
|
-
value: $var;
|
775
|
-
}
|
776
|
-
|
777
|
-
.c {
|
778
|
-
value: $var;
|
779
|
-
}
|
780
|
-
}
|
781
|
-
SCSS
|
782
|
-
end
|
783
|
-
|
784
|
-
def test_color_format_is_preserved_by_default
|
785
|
-
assert_equal "blue", resolve("blue")
|
786
|
-
assert_equal "bLuE", resolve("bLuE")
|
787
|
-
assert_equal "#00f", resolve("#00f")
|
788
|
-
assert_equal "blue #00F", resolve("blue #00F")
|
789
|
-
assert_equal "blue", resolve("nth(blue #00F, 1)")
|
790
|
-
assert_equal "#00F", resolve("nth(blue #00F, 2)")
|
791
|
-
end
|
792
|
-
|
793
|
-
def test_color_format_isnt_always_preserved_in_compressed_style
|
794
|
-
assert_equal "red", resolve("red", :style => :compressed)
|
795
|
-
assert_equal "red", resolve("#f00", :style => :compressed)
|
796
|
-
assert_equal "red red", resolve("red #f00", :style => :compressed)
|
797
|
-
assert_equal "red", resolve("nth(red #f00, 2)", :style => :compressed)
|
798
|
-
end
|
799
|
-
|
800
|
-
def test_color_format_is_sometimes_preserved_in_compressed_style
|
801
|
-
assert_equal "ReD", resolve("ReD", :style => :compressed)
|
802
|
-
assert_equal "blue", resolve("blue", :style => :compressed)
|
803
|
-
assert_equal "#00f", resolve("#00f", :style => :compressed)
|
804
|
-
end
|
805
|
-
|
806
|
-
def test_color_format_isnt_preserved_when_modified
|
807
|
-
assert_equal "magenta", resolve("#f00 + #00f")
|
808
|
-
end
|
809
|
-
|
810
|
-
def test_ids
|
811
|
-
assert_equal "#foo", resolve("#foo")
|
812
|
-
assert_equal "#abcd", resolve("#abcd")
|
813
|
-
assert_equal "#abc-def", resolve("#abc-def")
|
814
|
-
assert_equal "#abc_def", resolve("#abc_def")
|
815
|
-
assert_equal "#uvw-xyz", resolve("#uvw-xyz")
|
816
|
-
assert_equal "#uvw_xyz", resolve("#uvw_xyz")
|
817
|
-
assert_equal "#uvwxyz", resolve("#uvw + xyz")
|
818
|
-
end
|
819
|
-
|
820
|
-
def test_scientific_notation
|
821
|
-
assert_equal "2000", resolve("2e3")
|
822
|
-
assert_equal "2000", resolve("2E3")
|
823
|
-
assert_equal "2000", resolve("2e+3")
|
824
|
-
assert_equal "2000em", resolve("2e3em")
|
825
|
-
assert_equal "25000000000", resolve("2.5e10")
|
826
|
-
assert_equal "0.1234", resolve("1234e-4")
|
827
|
-
assert_equal "12.34", resolve("1.234e1")
|
828
|
-
end
|
829
|
-
|
830
|
-
def test_identifier_units
|
831
|
-
assert_equal "5-foo", resolve("2-foo + 3-foo")
|
832
|
-
assert_equal "5-foo-", resolve("2-foo- + 3-foo-")
|
833
|
-
assert_equal "5-\\u2603", resolve("2-\\u2603 + 3-\\u2603")
|
834
|
-
end
|
835
|
-
|
836
|
-
def test_backslash_newline_in_string
|
837
|
-
assert_equal 'foobar', resolve("\"foo\\\nbar\"")
|
838
|
-
assert_equal 'foobar', resolve("'foo\\\nbar'")
|
839
|
-
end
|
840
|
-
|
841
|
-
def test_unclosed_special_fun
|
842
|
-
assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "calc(foo()": expected ")", was ""') do
|
843
|
-
resolve("calc(foo()")
|
844
|
-
end
|
845
|
-
assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "calc(#{\')\'}": expected ")", was ""') do
|
846
|
-
resolve("calc(\#{')'}")
|
847
|
-
end
|
848
|
-
assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "calc(#{foo": expected "}", was ""') do
|
849
|
-
resolve("calc(\#{foo")
|
850
|
-
end
|
851
|
-
end
|
852
|
-
|
853
|
-
def test_special_fun_with_interpolation
|
854
|
-
assert_equal "calc())", resolve("calc(\#{')'})")
|
855
|
-
assert_equal "calc(# {foo})", resolve("calc(# {foo})")
|
507
|
+
assert_equal "false", resolve("$ie and $ie <= 7", {}, env('ie' => Sass::Script::Bool.new(false)))
|
508
|
+
assert_equal "true", resolve("$ie or $undef", {}, env('ie' => Sass::Script::Bool.new(true)))
|
856
509
|
end
|
857
510
|
|
858
511
|
# Regression Tests
|
859
512
|
|
860
|
-
def test_repeatedly_modified_color
|
861
|
-
assert_equal(<<CSS, render(<<SASS))
|
862
|
-
a {
|
863
|
-
link-color: #161C14;
|
864
|
-
link-color-hover: black;
|
865
|
-
link-color-tap: rgba(22, 28, 20, 0.3); }
|
866
|
-
CSS
|
867
|
-
$green: #161C14
|
868
|
-
$link-color: $green
|
869
|
-
$link-color-hover: darken($link-color, 10%)
|
870
|
-
$link-color-tap: rgba($green, 0.3)
|
871
|
-
|
872
|
-
a
|
873
|
-
link-color: $link-color
|
874
|
-
link-color-hover: $link-color-hover
|
875
|
-
link-color-tap: $link-color-tap
|
876
|
-
SASS
|
877
|
-
end
|
878
|
-
|
879
|
-
def test_inspect_divided_numbers
|
880
|
-
assert_equal "1px/2px", resolve("inspect(1px/2px)")
|
881
|
-
assert_equal "0.5", resolve("inspect((1px/2px))")
|
882
|
-
end
|
883
|
-
|
884
|
-
def test_minus_without_whitespace
|
885
|
-
assert_equal "5px", resolve("15px-10px")
|
886
|
-
assert_equal "5px-", resolve("15px--10px-")
|
887
|
-
end
|
888
|
-
|
889
|
-
def test_minus_preceded_by_comment
|
890
|
-
assert_equal "15px -10px", resolve("15px/**/-10px")
|
891
|
-
end
|
892
|
-
|
893
513
|
def test_user_defined_function_forces_division
|
894
514
|
assert_equal(<<CSS, render(<<SASS))
|
895
515
|
a {
|
@@ -928,17 +548,6 @@ end
|
|
928
548
|
assert_equal "teal\\+bang(12)", resolve("teal\\+bang(12)")
|
929
549
|
end
|
930
550
|
|
931
|
-
def test_and_or_not_disallowed_as_function_names
|
932
|
-
%w[and or not].each do |name|
|
933
|
-
assert_raise_message(Sass::SyntaxError, "Invalid function name \"#{name}\".") do
|
934
|
-
render(<<SASS)
|
935
|
-
@function #{name}()
|
936
|
-
@return null
|
937
|
-
SASS
|
938
|
-
end
|
939
|
-
end
|
940
|
-
end
|
941
|
-
|
942
551
|
def test_interpolation_after_hash
|
943
552
|
assert_equal "#2", resolve('"##{1 + 1}"')
|
944
553
|
end
|
@@ -960,67 +569,26 @@ SASS
|
|
960
569
|
assert_equal "and-bang", resolve("and-bang")
|
961
570
|
end
|
962
571
|
|
963
|
-
def test_number_initialization
|
964
|
-
assert_equal Sass::Script::Value::Number.new(10, ["px"]), Sass::Script::Value::Number.new(10, "px")
|
965
|
-
assert_equal Sass::Script::Value::Number.new(10, ["px"], ["em"]), Sass::Script::Value::Number.new(10, "px", "em")
|
966
|
-
end
|
967
|
-
|
968
|
-
def test_is_unit
|
969
|
-
assert Sass::Script::Value::Number.new(10, "px").is_unit?("px")
|
970
|
-
assert Sass::Script::Value::Number.new(10).is_unit?(nil)
|
971
|
-
assert !Sass::Script::Value::Number.new(10, "px", "em").is_unit?("px")
|
972
|
-
assert !Sass::Script::Value::Number.new(10, [], "em").is_unit?("em")
|
973
|
-
assert !Sass::Script::Value::Number.new(10, ["px", "em"]).is_unit?("px")
|
974
|
-
end
|
975
|
-
|
976
|
-
def test_rename_redirect
|
977
|
-
assert_no_warning do
|
978
|
-
assert_equal Sass::Script::Value::Base, Sass::Script::Literal
|
979
|
-
assert_equal Sass::Script::Tree::Node, Sass::Script::Node
|
980
|
-
assert_equal Sass::Script::Tree::Operation, Sass::Script::Operation
|
981
|
-
assert_equal Sass::Script::Value::String, Sass::Script::String
|
982
|
-
end
|
983
|
-
end
|
984
|
-
|
985
|
-
def test_number_printing
|
986
|
-
assert_equal "1", resolve("1")
|
987
|
-
assert_equal "1", resolve("1.0")
|
988
|
-
assert_equal "1000000000", resolve("1000000000")
|
989
|
-
assert_equal "0.00001", resolve("0.00001")
|
990
|
-
assert_equal "1.12121", resolve("1.121214")
|
991
|
-
assert_equal "1.12122", resolve("1.121215")
|
992
|
-
assert_equal "Infinity", resolve("(1.0/0.0)")
|
993
|
-
assert_equal "-Infinity", resolve("(-1.0/0.0)")
|
994
|
-
assert_equal "NaN", resolve("(0.0/0.0)")
|
995
|
-
end
|
996
|
-
|
997
572
|
private
|
998
573
|
|
999
574
|
def resolve(str, opts = {}, environment = env)
|
1000
575
|
munge_filename opts
|
1001
576
|
val = eval(str, opts, environment)
|
1002
|
-
assert_kind_of Sass::Script::
|
1003
|
-
val.is_a?(Sass::Script::
|
1004
|
-
end
|
1005
|
-
|
1006
|
-
def resolve_quoted(str, opts = {}, environment = env)
|
1007
|
-
munge_filename opts
|
1008
|
-
val = eval(str, opts, environment)
|
1009
|
-
assert_kind_of Sass::Script::Value::Base, val
|
1010
|
-
val.to_s
|
577
|
+
assert_kind_of Sass::Script::Literal, val
|
578
|
+
val.is_a?(Sass::Script::String) ? val.value : val.to_s
|
1011
579
|
end
|
1012
580
|
|
1013
581
|
def assert_unquoted(str, opts = {}, environment = env)
|
1014
582
|
munge_filename opts
|
1015
583
|
val = eval(str, opts, environment)
|
1016
|
-
assert_kind_of Sass::Script::
|
584
|
+
assert_kind_of Sass::Script::String, val
|
1017
585
|
assert_equal :identifier, val.type
|
1018
586
|
end
|
1019
587
|
|
1020
588
|
def assert_quoted(str, opts = {}, environment = env)
|
1021
589
|
munge_filename opts
|
1022
590
|
val = eval(str, opts, environment)
|
1023
|
-
assert_kind_of Sass::Script::
|
591
|
+
assert_kind_of Sass::Script::String, val
|
1024
592
|
assert_equal :string, val.type
|
1025
593
|
end
|
1026
594
|
|
@@ -1042,13 +610,13 @@ SASS
|
|
1042
610
|
env
|
1043
611
|
end
|
1044
612
|
|
1045
|
-
def
|
1046
|
-
|
1047
|
-
|
1048
|
-
|
1049
|
-
|
1050
|
-
|
1051
|
-
|
1052
|
-
|
613
|
+
def test_number_printing
|
614
|
+
assert_equal "1", eval("1")
|
615
|
+
assert_equal "1", eval("1.0")
|
616
|
+
assert_equal "1.121", eval("1.1214")
|
617
|
+
assert_equal "1.122", eval("1.1215")
|
618
|
+
assert_equal "Infinity", eval("1.0/0.0")
|
619
|
+
assert_equal "-Infinity", eval("-1.0/0.0")
|
620
|
+
assert_equal "NaN", eval("0.0/0.0")
|
1053
621
|
end
|
1054
622
|
end
|