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
@@ -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
|