Changesets can be listed by changeset number.
The Git repository is here.
- Revision:
- 373
- Log:
Initial import of Radiant 0.9.1, which is now packaged as a gem. This is an
import of the tagged 0.9.1 source checked out from GitHub, which isn't quite
the same as the gem distribution - but it doesn't seem to be available in an
archived form and the installed gem already has modifications, so this is
the closest I can get.
- Author:
- rool
- Date:
- Mon Mar 21 13:40:05 +0000 2011
- Size:
- 8678 Bytes
- Properties:
- Property svn:executable is set to *
1 | #!/usr/bin/env ruby |
2 | require File.dirname(__FILE__) + '/../test_helper' |
3 | require 'sass/engine' |
4 | |
5 | class SassScriptTest < Test::Unit::TestCase |
6 | include Sass::Script |
7 | |
8 | def test_color_checks_input |
9 | assert_raise(Sass::SyntaxError, "Color values must be between 0 and 255") {Color.new([1, 2, -1])} |
10 | assert_raise(Sass::SyntaxError, "Color values must be between 0 and 255") {Color.new([256, 2, 3])} |
11 | end |
12 | |
13 | def test_string_escapes |
14 | assert_equal '"', resolve("\"\\\"\"") |
15 | assert_equal "\\", resolve("\"\\\\\"") |
16 | assert_equal "\\02fa", resolve("\"\\02fa\"") |
17 | end |
18 | |
19 | def test_color_names |
20 | assert_equal "white", resolve("white") |
21 | assert_equal "white", resolve("#ffffff") |
22 | assert_equal "#fffffe", resolve("white - #000001") |
23 | end |
24 | |
25 | def test_implicit_strings |
26 | silence_warnings do |
27 | assert_equal Sass::Script::String.new("foo"), eval("foo") |
28 | assert_equal Sass::Script::String.new("foo bar"), eval("foo bar") |
29 | assert_equal Sass::Script::String.new("foo/bar"), eval("foo/bar") |
30 | end |
31 | end |
32 | |
33 | def test_interpolation |
34 | assert_equal "foo bar, baz bang", resolve('"foo #{"bar"}, #{"baz"} bang"') |
35 | assert_equal "foo bar baz bang", resolve('"foo #{"#{"ba" + "r"} baz"} bang"') |
36 | assert_equal 'foo #{bar baz} bang', resolve('"foo \#{#{"ba" + "r"} baz} bang"') |
37 | assert_equal 'foo #{baz bang', resolve('"foo #{"\#{" + "baz"} bang"') |
38 | end |
39 | |
40 | def test_rule_interpolation |
41 | assert_equal(<<CSS, render(<<SASS)) |
42 | foo bar baz bang { |
43 | a: b; } |
44 | CSS |
45 | foo \#{"\#{"ba" + "r"} baz"} bang |
46 | a: b |
47 | SASS |
48 | assert_equal(<<CSS, render(<<SASS)) |
49 | foo \#{bar baz} bang { |
50 | a: b; } |
51 | CSS |
52 | foo \\\#{\#{"ba" + "r"} baz} bang |
53 | a: b |
54 | SASS |
55 | assert_equal(<<CSS, render(<<SASS)) |
56 | foo \#{baz bang { |
57 | a: b; } |
58 | CSS |
59 | foo \#{"\\\#{" + "baz"} bang |
60 | a: b |
61 | SASS |
62 | end |
63 | |
64 | def test_implicit_string_warning |
65 | assert_warning(<<WARN) {eval("foo")} |
66 | DEPRECATION WARNING: |
67 | On line 1, character 1 of 'test_implicit_string_warning_inline.sass' |
68 | Implicit strings have been deprecated and will be removed in version 3.0. |
69 | 'foo' was not quoted. Please add double quotes (e.g. "foo"). |
70 | WARN |
71 | assert_warning(<<WARN) {eval("1 + foo")} |
72 | DEPRECATION WARNING: |
73 | On line 1, character 5 of 'test_implicit_string_warning_inline.sass' |
74 | Implicit strings have been deprecated and will be removed in version 3.0. |
75 | 'foo' was not quoted. Please add double quotes (e.g. "foo"). |
76 | WARN |
77 | assert_warning(<<WARN) {render("@if 1 + foo")} |
78 | DEPRECATION WARNING: |
79 | On line 1, character 9 of 'test_implicit_string_warning_inline.sass' |
80 | Implicit strings have been deprecated and will be removed in version 3.0. |
81 | 'foo' was not quoted. Please add double quotes (e.g. "foo"). |
82 | WARN |
83 | |
84 | # Regression |
85 | assert_warning(<<WARN) {render("@if if")} |
86 | DEPRECATION WARNING: |
87 | On line 1, character 5 of 'test_implicit_string_warning_inline.sass' |
88 | Implicit strings have been deprecated and will be removed in version 3.0. |
89 | 'if' was not quoted. Please add double quotes (e.g. "if"). |
90 | WARN |
91 | end |
92 | |
93 | def test_inaccessible_functions |
94 | assert_warning <<WARN do |
95 | DEPRECATION WARNING: |
96 | On line 2, character 6 of 'test_inaccessible_functions_inline.sass' |
97 | Implicit strings have been deprecated and will be removed in version 3.0. |
98 | 'to_s' was not quoted. Please add double quotes (e.g. "to_s"). |
99 | WARN |
100 | assert_equal "send(to_s)", resolve("send(to_s)", :line => 2) |
101 | end |
102 | assert_equal "public_instance_methods()", resolve("public_instance_methods()") |
103 | end |
104 | |
105 | def test_hyphen_warning |
106 | a = Sass::Script::String.new("a") |
107 | b = Sass::Script::String.new("b") |
108 | assert_warning(<<WARN) {eval("!a-!b", {}, env("a" => a, "b" => b))} |
109 | DEPRECATION WARNING: |
110 | On line 1, character 3 of 'test_hyphen_warning_inline.sass' |
111 | - will be allowed as part of variable names in version 3.0. |
112 | Please add whitespace to separate it from the previous token. |
113 | WARN |
114 | |
115 | assert_warning(<<WARN) {eval("true-false")} |
116 | DEPRECATION WARNING: |
117 | On line 1, character 5 of 'test_hyphen_warning_inline.sass' |
118 | - will be allowed as part of variable names in version 3.0. |
119 | Please add whitespace to separate it from the previous token. |
120 | WARN |
121 | end |
122 | |
123 | def test_ruby_equality |
124 | assert_equal eval('"foo"'), eval('"foo"') |
125 | assert_equal eval('1'), eval('1.0') |
126 | assert_not_equal eval('1'), eval('"1"') |
127 | end |
128 | |
129 | def test_booleans |
130 | assert_equal "true", resolve("true") |
131 | assert_equal "false", resolve("false") |
132 | end |
133 | |
134 | def test_boolean_ops |
135 | assert_equal "true", resolve("true and true") |
136 | assert_equal "true", resolve("false or true") |
137 | assert_equal "true", resolve("true or false") |
138 | assert_equal "true", resolve("true or true") |
139 | assert_equal "false", resolve("false or false") |
140 | assert_equal "false", resolve("false and true") |
141 | assert_equal "false", resolve("true and false") |
142 | assert_equal "false", resolve("false and false") |
143 | |
144 | assert_equal "true", resolve("not false") |
145 | assert_equal "false", resolve("not true") |
146 | assert_equal "true", resolve("not not true") |
147 | |
148 | assert_equal "1", resolve("false or 1") |
149 | assert_equal "false", resolve("false and 1") |
150 | assert_equal "2", resolve("2 or 3") |
151 | assert_equal "3", resolve("2 and 3") |
152 | end |
153 | |
154 | def test_arithmetic_ops |
155 | assert_equal "2", resolve("1 + 1") |
156 | assert_equal "0", resolve("1 - 1") |
157 | assert_equal "8", resolve("2 * 4") |
158 | assert_equal "0.5", resolve("2 / 4") |
159 | assert_equal "2", resolve("4 / 2") |
160 | |
161 | assert_equal "-1", resolve("-1") |
162 | end |
163 | |
164 | def test_string_ops |
165 | assert_equal "foo bar", resolve('"foo" "bar"') |
166 | assert_equal "true 1", resolve('true 1') |
167 | assert_equal "foo, bar", resolve('"foo" , "bar"') |
168 | assert_equal "true, 1", resolve('true , 1') |
169 | assert_equal "foobar", resolve('"foo" + "bar"') |
170 | assert_equal "true1", resolve('true + 1') |
171 | assert_equal "foo-bar", resolve('"foo" - "bar"') |
172 | assert_equal "true-1", resolve('true - 1') |
173 | assert_equal "foo/bar", resolve('"foo" / "bar"') |
174 | assert_equal "true/1", resolve('true / 1') |
175 | |
176 | assert_equal "-bar", resolve('- "bar"') |
177 | assert_equal "-true", resolve('- true') |
178 | assert_equal "/bar", resolve('/ "bar"') |
179 | assert_equal "/true", resolve('/ true') |
180 | end |
181 | |
182 | def test_relational_ops |
183 | assert_equal "false", resolve("1 > 2") |
184 | assert_equal "false", resolve("2 > 2") |
185 | assert_equal "true", resolve("3 > 2") |
186 | assert_equal "false", resolve("1 >= 2") |
187 | assert_equal "true", resolve("2 >= 2") |
188 | assert_equal "true", resolve("3 >= 2") |
189 | assert_equal "true", resolve("1 < 2") |
190 | assert_equal "false", resolve("2 < 2") |
191 | assert_equal "false", resolve("3 < 2") |
192 | assert_equal "true", resolve("1 <= 2") |
193 | assert_equal "true", resolve("2 <= 2") |
194 | assert_equal "false", resolve("3 <= 2") |
195 | end |
196 | |
197 | def test_equals |
198 | assert_equal("true", resolve('"foo" == !foo', {}, |
199 | env("foo" => Sass::Script::String.new("foo")))) |
200 | assert_equal "true", resolve("1 == 1.0") |
201 | assert_equal "true", resolve("false != true") |
202 | assert_equal "false", resolve("1em == 1px") |
203 | assert_equal "false", resolve("12 != 12") |
204 | end |
205 | |
206 | def test_operation_precedence |
207 | assert_equal "false true", resolve("true and false false or true") |
208 | assert_equal "true", resolve("false and true or true and true") |
209 | assert_equal "true", resolve("1 == 2 or 3 == 3") |
210 | assert_equal "true", resolve("1 < 2 == 3 >= 3") |
211 | assert_equal "true", resolve("1 + 3 > 4 - 2") |
212 | assert_equal "11", resolve("1 + 2 * 3 + 4") |
213 | end |
214 | |
215 | def test_functions |
216 | assert_equal "#80ff80", resolve("hsl(120, 100%, 75%)") |
217 | assert_equal "#81ff81", resolve("hsl(120, 100%, 75%) + #010001") |
218 | end |
219 | |
220 | def test_operator_unit_conversion |
221 | assert_equal "1.1cm", resolve("1cm + 1mm") |
222 | assert_equal "true", resolve("2mm < 1cm") |
223 | assert_equal "true", resolve("10mm == 1cm") |
224 | assert_equal "true", resolve("1 == 1cm") |
225 | assert_equal "true", resolve("1.1cm == 11mm") |
226 | end |
227 | |
228 | # Regression tests |
229 | |
230 | def test_interpolation_after_hash |
231 | assert_equal "#2", resolve('"##{1 + 1}"') |
232 | end |
233 | |
234 | private |
235 | |
236 | def resolve(str, opts = {}, environment = env) |
237 | munge_filename opts |
238 | eval(str, opts, environment).to_s |
239 | end |
240 | |
241 | def eval(str, opts = {}, environment = env) |
242 | munge_filename opts |
243 | Sass::Script.parse(str, opts[:line] || 1, |
244 | opts[:offset] || 0, opts[:filename]).perform(environment) |
245 | end |
246 | |
247 | def render(sass, options = {}) |
248 | munge_filename options |
249 | Sass::Engine.new(sass, options).render |
250 | end |
251 | |
252 | def env(hash = {}) |
253 | env = Sass::Environment.new |
254 | hash.each {|k, v| env.set_var(k, v)} |
255 | env |
256 | end |
257 | |
258 | def test_number_printing |
259 | assert_equal "1", eval("1") |
260 | assert_equal "1", eval("1.0") |
261 | assert_equal "1.121", eval("1.1214") |
262 | assert_equal "1.122", eval("1.1215") |
263 | assert_equal "Infinity", eval("1.0/0.0") |
264 | assert_equal "-Infinity", eval("-1.0/0.0") |
265 | assert_equal "NaN", eval("0.0/0.0") |
266 | end |
267 | end |