haml-edge 2.1.1

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.
Files changed (180) hide show
  1. data/EDGE_GEM_VERSION +1 -0
  2. data/FAQ +138 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +332 -0
  5. data/REVISION +1 -0
  6. data/Rakefile +226 -0
  7. data/VERSION +1 -0
  8. data/bin/css2sass +7 -0
  9. data/bin/haml +9 -0
  10. data/bin/html2haml +7 -0
  11. data/bin/sass +8 -0
  12. data/extra/edge_gem_watch.rb +13 -0
  13. data/extra/haml-mode.el +596 -0
  14. data/extra/sass-mode.el +200 -0
  15. data/init.rb +8 -0
  16. data/lib/haml/buffer.rb +255 -0
  17. data/lib/haml/engine.rb +268 -0
  18. data/lib/haml/error.rb +22 -0
  19. data/lib/haml/exec.rb +395 -0
  20. data/lib/haml/filters.rb +275 -0
  21. data/lib/haml/helpers/action_view_extensions.rb +45 -0
  22. data/lib/haml/helpers/action_view_mods.rb +181 -0
  23. data/lib/haml/helpers.rb +488 -0
  24. data/lib/haml/html.rb +222 -0
  25. data/lib/haml/precompiler.rb +904 -0
  26. data/lib/haml/shared.rb +45 -0
  27. data/lib/haml/template/patch.rb +58 -0
  28. data/lib/haml/template/plugin.rb +72 -0
  29. data/lib/haml/template.rb +42 -0
  30. data/lib/haml/util.rb +88 -0
  31. data/lib/haml/version.rb +47 -0
  32. data/lib/haml.rb +1044 -0
  33. data/lib/sass/css.rb +388 -0
  34. data/lib/sass/engine.rb +495 -0
  35. data/lib/sass/environment.rb +46 -0
  36. data/lib/sass/error.rb +35 -0
  37. data/lib/sass/plugin/merb.rb +56 -0
  38. data/lib/sass/plugin/rails.rb +24 -0
  39. data/lib/sass/plugin.rb +204 -0
  40. data/lib/sass/repl.rb +51 -0
  41. data/lib/sass/script/bool.rb +13 -0
  42. data/lib/sass/script/color.rb +97 -0
  43. data/lib/sass/script/funcall.rb +29 -0
  44. data/lib/sass/script/functions.rb +134 -0
  45. data/lib/sass/script/lexer.rb +148 -0
  46. data/lib/sass/script/literal.rb +82 -0
  47. data/lib/sass/script/number.rb +231 -0
  48. data/lib/sass/script/operation.rb +30 -0
  49. data/lib/sass/script/parser.rb +142 -0
  50. data/lib/sass/script/string.rb +9 -0
  51. data/lib/sass/script/unary_operation.rb +21 -0
  52. data/lib/sass/script/variable.rb +20 -0
  53. data/lib/sass/script.rb +38 -0
  54. data/lib/sass/tree/attr_node.rb +64 -0
  55. data/lib/sass/tree/comment_node.rb +30 -0
  56. data/lib/sass/tree/debug_node.rb +22 -0
  57. data/lib/sass/tree/directive_node.rb +50 -0
  58. data/lib/sass/tree/file_node.rb +27 -0
  59. data/lib/sass/tree/for_node.rb +29 -0
  60. data/lib/sass/tree/if_node.rb +27 -0
  61. data/lib/sass/tree/mixin_def_node.rb +18 -0
  62. data/lib/sass/tree/mixin_node.rb +35 -0
  63. data/lib/sass/tree/node.rb +99 -0
  64. data/lib/sass/tree/rule_node.rb +161 -0
  65. data/lib/sass/tree/variable_node.rb +24 -0
  66. data/lib/sass/tree/while_node.rb +21 -0
  67. data/lib/sass.rb +1062 -0
  68. data/rails/init.rb +1 -0
  69. data/test/benchmark.rb +99 -0
  70. data/test/haml/engine_test.rb +795 -0
  71. data/test/haml/helper_test.rb +228 -0
  72. data/test/haml/html2haml_test.rb +108 -0
  73. data/test/haml/markaby/standard.mab +52 -0
  74. data/test/haml/mocks/article.rb +6 -0
  75. data/test/haml/results/content_for_layout.xhtml +15 -0
  76. data/test/haml/results/eval_suppressed.xhtml +9 -0
  77. data/test/haml/results/filters.xhtml +62 -0
  78. data/test/haml/results/helpers.xhtml +93 -0
  79. data/test/haml/results/helpful.xhtml +10 -0
  80. data/test/haml/results/just_stuff.xhtml +68 -0
  81. data/test/haml/results/list.xhtml +12 -0
  82. data/test/haml/results/nuke_inner_whitespace.xhtml +40 -0
  83. data/test/haml/results/nuke_outer_whitespace.xhtml +148 -0
  84. data/test/haml/results/original_engine.xhtml +20 -0
  85. data/test/haml/results/partial_layout.xhtml +5 -0
  86. data/test/haml/results/partials.xhtml +21 -0
  87. data/test/haml/results/render_layout.xhtml +3 -0
  88. data/test/haml/results/silent_script.xhtml +74 -0
  89. data/test/haml/results/standard.xhtml +162 -0
  90. data/test/haml/results/tag_parsing.xhtml +23 -0
  91. data/test/haml/results/very_basic.xhtml +5 -0
  92. data/test/haml/results/whitespace_handling.xhtml +89 -0
  93. data/test/haml/rhtml/_av_partial_1.rhtml +12 -0
  94. data/test/haml/rhtml/_av_partial_2.rhtml +8 -0
  95. data/test/haml/rhtml/action_view.rhtml +62 -0
  96. data/test/haml/rhtml/standard.rhtml +54 -0
  97. data/test/haml/template_test.rb +204 -0
  98. data/test/haml/templates/_av_partial_1.haml +9 -0
  99. data/test/haml/templates/_av_partial_1_ugly.haml +9 -0
  100. data/test/haml/templates/_av_partial_2.haml +5 -0
  101. data/test/haml/templates/_av_partial_2_ugly.haml +5 -0
  102. data/test/haml/templates/_layout.erb +3 -0
  103. data/test/haml/templates/_layout_for_partial.haml +3 -0
  104. data/test/haml/templates/_partial.haml +8 -0
  105. data/test/haml/templates/_text_area.haml +3 -0
  106. data/test/haml/templates/action_view.haml +47 -0
  107. data/test/haml/templates/action_view_ugly.haml +47 -0
  108. data/test/haml/templates/breakage.haml +8 -0
  109. data/test/haml/templates/content_for_layout.haml +10 -0
  110. data/test/haml/templates/eval_suppressed.haml +11 -0
  111. data/test/haml/templates/filters.haml +66 -0
  112. data/test/haml/templates/helpers.haml +95 -0
  113. data/test/haml/templates/helpful.haml +11 -0
  114. data/test/haml/templates/just_stuff.haml +83 -0
  115. data/test/haml/templates/list.haml +12 -0
  116. data/test/haml/templates/nuke_inner_whitespace.haml +32 -0
  117. data/test/haml/templates/nuke_outer_whitespace.haml +144 -0
  118. data/test/haml/templates/original_engine.haml +17 -0
  119. data/test/haml/templates/partial_layout.haml +3 -0
  120. data/test/haml/templates/partialize.haml +1 -0
  121. data/test/haml/templates/partials.haml +12 -0
  122. data/test/haml/templates/render_layout.haml +2 -0
  123. data/test/haml/templates/silent_script.haml +40 -0
  124. data/test/haml/templates/standard.haml +42 -0
  125. data/test/haml/templates/standard_ugly.haml +42 -0
  126. data/test/haml/templates/tag_parsing.haml +21 -0
  127. data/test/haml/templates/very_basic.haml +4 -0
  128. data/test/haml/templates/whitespace_handling.haml +87 -0
  129. data/test/haml/util_test.rb +87 -0
  130. data/test/linked_rails.rb +12 -0
  131. data/test/sass/css2sass_test.rb +193 -0
  132. data/test/sass/engine_test.rb +709 -0
  133. data/test/sass/functions_test.rb +109 -0
  134. data/test/sass/more_results/more1.css +9 -0
  135. data/test/sass/more_results/more1_with_line_comments.css +26 -0
  136. data/test/sass/more_results/more_import.css +29 -0
  137. data/test/sass/more_templates/_more_partial.sass +2 -0
  138. data/test/sass/more_templates/more1.sass +23 -0
  139. data/test/sass/more_templates/more_import.sass +11 -0
  140. data/test/sass/plugin_test.rb +213 -0
  141. data/test/sass/results/alt.css +4 -0
  142. data/test/sass/results/basic.css +9 -0
  143. data/test/sass/results/compact.css +5 -0
  144. data/test/sass/results/complex.css +87 -0
  145. data/test/sass/results/compressed.css +1 -0
  146. data/test/sass/results/expanded.css +19 -0
  147. data/test/sass/results/import.css +29 -0
  148. data/test/sass/results/line_numbers.css +49 -0
  149. data/test/sass/results/mixins.css +95 -0
  150. data/test/sass/results/multiline.css +24 -0
  151. data/test/sass/results/nested.css +22 -0
  152. data/test/sass/results/parent_ref.css +13 -0
  153. data/test/sass/results/script.css +16 -0
  154. data/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
  155. data/test/sass/results/subdir/subdir.css +3 -0
  156. data/test/sass/results/units.css +11 -0
  157. data/test/sass/script_test.rb +250 -0
  158. data/test/sass/templates/_partial.sass +2 -0
  159. data/test/sass/templates/alt.sass +16 -0
  160. data/test/sass/templates/basic.sass +23 -0
  161. data/test/sass/templates/bork.sass +2 -0
  162. data/test/sass/templates/bork2.sass +2 -0
  163. data/test/sass/templates/compact.sass +17 -0
  164. data/test/sass/templates/complex.sass +309 -0
  165. data/test/sass/templates/compressed.sass +15 -0
  166. data/test/sass/templates/expanded.sass +17 -0
  167. data/test/sass/templates/import.sass +11 -0
  168. data/test/sass/templates/importee.sass +19 -0
  169. data/test/sass/templates/line_numbers.sass +13 -0
  170. data/test/sass/templates/mixins.sass +76 -0
  171. data/test/sass/templates/multiline.sass +20 -0
  172. data/test/sass/templates/nested.sass +25 -0
  173. data/test/sass/templates/parent_ref.sass +25 -0
  174. data/test/sass/templates/script.sass +101 -0
  175. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
  176. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
  177. data/test/sass/templates/subdir/subdir.sass +6 -0
  178. data/test/sass/templates/units.sass +11 -0
  179. data/test/test_helper.rb +21 -0
  180. metadata +278 -0
@@ -0,0 +1,95 @@
1
+ #main {
2
+ width: 15em;
3
+ color: #0000ff;
4
+ }
5
+ #main p {
6
+ border-top-width: 2px;
7
+ border-top-color: #ffcc00;
8
+ border-left-width: 1px;
9
+ border-left-color: #000;
10
+ -moz-border-radius: 10px;
11
+ border-style: dotted;
12
+ border-width: 2px;
13
+ }
14
+ #main .cool {
15
+ width: 100px;
16
+ }
17
+
18
+ #left {
19
+ border-top-width: 2px;
20
+ border-top-color: #ffcc00;
21
+ border-left-width: 1px;
22
+ border-left-color: #000;
23
+ -moz-border-radius: 10px;
24
+ font-size: 2em;
25
+ font-weight: bold;
26
+ float: left;
27
+ }
28
+
29
+ #right {
30
+ border-top-width: 2px;
31
+ border-top-color: #ffcc00;
32
+ border-left-width: 1px;
33
+ border-left-color: #000;
34
+ -moz-border-radius: 10px;
35
+ color: #f00;
36
+ font-size: 20px;
37
+ float: right;
38
+ }
39
+
40
+ .bordered {
41
+ border-top-width: 2px;
42
+ border-top-color: #ffcc00;
43
+ border-left-width: 1px;
44
+ border-left-color: #000;
45
+ -moz-border-radius: 10px;
46
+ }
47
+
48
+ .complex {
49
+ color: #f00;
50
+ font-size: 20px;
51
+ text-decoration: none;
52
+ }
53
+ .complex:after {
54
+ content: ".";
55
+ display: block;
56
+ height: 0;
57
+ clear: both;
58
+ visibility: hidden;
59
+ }
60
+ * html .complex {
61
+ height: 1px;
62
+ color: #f00;
63
+ font-size: 20px;
64
+ }
65
+
66
+ .more-complex {
67
+ color: #f00;
68
+ font-size: 20px;
69
+ text-decoration: none;
70
+ display: inline;
71
+ -webkit-nonsense-top-right: 1px;
72
+ -webkit-nonsense-bottom-left: 1px;
73
+ }
74
+ .more-complex:after {
75
+ content: ".";
76
+ display: block;
77
+ height: 0;
78
+ clear: both;
79
+ visibility: hidden;
80
+ }
81
+ * html .more-complex {
82
+ height: 1px;
83
+ color: #f00;
84
+ font-size: 20px;
85
+ }
86
+ .more-complex a:hover {
87
+ text-decoration: underline;
88
+ color: #f00;
89
+ font-size: 20px;
90
+ border-top-width: 2px;
91
+ border-top-color: #ffcc00;
92
+ border-left-width: 1px;
93
+ border-left-color: #000;
94
+ -moz-border-radius: 10px;
95
+ }
@@ -0,0 +1,24 @@
1
+ #main,
2
+ #header {
3
+ height: 50px; }
4
+ #main div,
5
+ #header div {
6
+ width: 100px; }
7
+ #main div a span,
8
+ #main div em span,
9
+ #header div a span,
10
+ #header div em span {
11
+ color: pink; }
12
+
13
+ #one div.nested,
14
+ #one span.nested,
15
+ #one p.nested,
16
+ #two div.nested,
17
+ #two span.nested,
18
+ #two p.nested,
19
+ #three div.nested,
20
+ #three span.nested,
21
+ #three p.nested {
22
+ font-weight: bold;
23
+ border-color: red;
24
+ display: block; }
@@ -0,0 +1,22 @@
1
+ #main {
2
+ width: 15em;
3
+ color: #0000ff; }
4
+ #main p {
5
+ border-style: dotted;
6
+ /* Nested comment
7
+ * More nested stuff */
8
+ border-width: 2px; }
9
+ #main .cool {
10
+ width: 100px; }
11
+
12
+ #left {
13
+ font-size: 2em;
14
+ font-weight: bold;
15
+ float: left; }
16
+
17
+ #right .header {
18
+ border-style: solid; }
19
+ #right .body {
20
+ border-style: dotted; }
21
+ #right .footer {
22
+ border-style: dashed; }
@@ -0,0 +1,13 @@
1
+ a { color: #000; }
2
+ a:hover { color: #f00; }
3
+
4
+ p, div { width: 100em; }
5
+ p foo, div foo { width: 10em; }
6
+ p:hover, p bar, div:hover, div bar { height: 20em; }
7
+
8
+ #cool { border-style: solid; border-width: 2em; }
9
+ .ie7 #cool, .ie6 #cool { content: string(Totally not cool.); }
10
+ .firefox #cool { content: string(Quite cool.); }
11
+
12
+ .wow, .snazzy { font-family: fantasy; }
13
+ .wow:hover, .wow:visited, .snazzy:hover, .snazzy:visited { font-weight: bold; }
@@ -0,0 +1,16 @@
1
+ #main { content: Hello!; qstr: Quo"ted"!; hstr: Hyph-en!; width: 30em; background-color: #000; 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
+
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
+
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
+
8
+ #times { num-num: 7; num-col: #7496b8; col-num: #092345; col-col: #243648; }
9
+
10
+ #div { num-num: 3.333; num-num2: 3.333; col-num: #092345; col-col: #0b0d0f; comp: 1px; }
11
+
12
+ #mod { num-num: 2; col-col: #0f0e05; col-num: #020001; }
13
+
14
+ #const { escaped-quote: !foo; default: Hello! !important; }
15
+
16
+ #regression { a: 4; }
@@ -0,0 +1 @@
1
+ #pi { width: 314px; }
@@ -0,0 +1,3 @@
1
+ #nested { relative: true; }
2
+
3
+ #subdir { font-size: 20px; font-weight: bold; }
@@ -0,0 +1,11 @@
1
+ b {
2
+ foo: 5px;
3
+ bar: 24px;
4
+ baz: 66.667%;
5
+ many-units: 32em;
6
+ mm: 15mm;
7
+ pc: 2pc;
8
+ pt: -72pt;
9
+ inches: 2in;
10
+ more-inches: 3.5in;
11
+ mixed: 6px; }
@@ -0,0 +1,250 @@
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_warning_reporting
65
+ assert_warning(<<WARN) {eval("foo")}
66
+ DEPRECATION WARNING:
67
+ On line 1, character 1 of 'test_warning_reporting_inline.sass'
68
+ Implicit strings have been deprecated and will be removed in version 2.4.
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_warning_reporting_inline.sass'
74
+ Implicit strings have been deprecated and will be removed in version 2.4.
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_warning_reporting_inline.sass'
80
+ Implicit strings have been deprecated and will be removed in version 2.4.
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_warning_reporting_inline.sass'
88
+ Implicit strings have been deprecated and will be removed in version 2.4.
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 2.4.
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_ruby_equality
106
+ assert_equal eval('"foo"'), eval('"foo"')
107
+ assert_equal eval('1'), eval('1.0')
108
+ assert_not_equal eval('1'), eval('"1"')
109
+ end
110
+
111
+ def test_booleans
112
+ assert_equal "true", resolve("true")
113
+ assert_equal "false", resolve("false")
114
+ end
115
+
116
+ def test_boolean_ops
117
+ assert_equal "true", resolve("true and true")
118
+ assert_equal "true", resolve("false or true")
119
+ assert_equal "true", resolve("true or false")
120
+ assert_equal "true", resolve("true or true")
121
+ assert_equal "false", resolve("false or false")
122
+ assert_equal "false", resolve("false and true")
123
+ assert_equal "false", resolve("true and false")
124
+ assert_equal "false", resolve("false and false")
125
+
126
+ assert_equal "true", resolve("not false")
127
+ assert_equal "false", resolve("not true")
128
+ assert_equal "true", resolve("not not true")
129
+
130
+ assert_equal "1", resolve("false or 1")
131
+ assert_equal "false", resolve("false and 1")
132
+ assert_equal "2", resolve("2 or 3")
133
+ assert_equal "3", resolve("2 and 3")
134
+ end
135
+
136
+ def test_arithmetic_ops
137
+ assert_equal "2", resolve("1 + 1")
138
+ assert_equal "0", resolve("1 - 1")
139
+ assert_equal "8", resolve("2 * 4")
140
+ assert_equal "0.5", resolve("2 / 4")
141
+ assert_equal "2", resolve("4 / 2")
142
+
143
+ assert_equal "-1", resolve("-1")
144
+ end
145
+
146
+ def test_string_ops
147
+ assert_equal "foo bar", resolve('"foo" "bar"')
148
+ assert_equal "true 1", resolve('true 1')
149
+ assert_equal "foo, bar", resolve('"foo" , "bar"')
150
+ assert_equal "true, 1", resolve('true , 1')
151
+ assert_equal "foobar", resolve('"foo" + "bar"')
152
+ assert_equal "true1", resolve('true + 1')
153
+ assert_equal "foo-bar", resolve('"foo" - "bar"')
154
+ assert_equal "true-1", resolve('true - 1')
155
+ assert_equal "foo/bar", resolve('"foo" / "bar"')
156
+ assert_equal "true/1", resolve('true / 1')
157
+
158
+ assert_equal "-bar", resolve('- "bar"')
159
+ assert_equal "-true", resolve('- true')
160
+ assert_equal "/bar", resolve('/ "bar"')
161
+ assert_equal "/true", resolve('/ true')
162
+ end
163
+
164
+ def test_relational_ops
165
+ assert_equal "false", resolve("1 > 2")
166
+ assert_equal "false", resolve("2 > 2")
167
+ assert_equal "true", resolve("3 > 2")
168
+ assert_equal "false", resolve("1 >= 2")
169
+ assert_equal "true", resolve("2 >= 2")
170
+ assert_equal "true", resolve("3 >= 2")
171
+ assert_equal "true", resolve("1 < 2")
172
+ assert_equal "false", resolve("2 < 2")
173
+ assert_equal "false", resolve("3 < 2")
174
+ assert_equal "true", resolve("1 <= 2")
175
+ assert_equal "true", resolve("2 <= 2")
176
+ assert_equal "false", resolve("3 <= 2")
177
+ end
178
+
179
+ def test_equals
180
+ assert_equal("true", resolve('"foo" == !foo', {},
181
+ env("foo" => Sass::Script::String.new("foo"))))
182
+ assert_equal "true", resolve("1 == 1.0")
183
+ assert_equal "true", resolve("false != true")
184
+ assert_equal "false", resolve("1em == 1px")
185
+ assert_equal "false", resolve("12 != 12")
186
+ end
187
+
188
+ def test_operation_precedence
189
+ assert_equal "false true", resolve("true and false false or true")
190
+ assert_equal "true", resolve("false and true or true and true")
191
+ assert_equal "true", resolve("1 == 2 or 3 == 3")
192
+ assert_equal "true", resolve("1 < 2 == 3 >= 3")
193
+ assert_equal "true", resolve("1 + 3 > 4 - 2")
194
+ assert_equal "11", resolve("1 + 2 * 3 + 4")
195
+ end
196
+
197
+ def test_functions
198
+ assert_equal "#80ff80", resolve("hsl(120, 100%, 75%)")
199
+ assert_equal "#81ff81", resolve("hsl(120, 100%, 75%) + #010001")
200
+ end
201
+
202
+ private
203
+
204
+ def resolve(str, opts = {}, environment = env)
205
+ munge_filename opts
206
+ eval(str, opts, environment).to_s
207
+ end
208
+
209
+ def eval(str, opts = {}, environment = env)
210
+ munge_filename opts
211
+ Sass::Script.parse(str, opts[:line] || 1,
212
+ opts[:offset] || 0, opts[:filename]).perform(environment)
213
+ end
214
+
215
+ def render(sass, options = {})
216
+ munge_filename options
217
+ Sass::Engine.new(sass, options).render
218
+ end
219
+
220
+ def assert_warning(message)
221
+ the_real_stderr, $stderr = $stderr, StringIO.new
222
+ yield
223
+ assert_equal message.strip, $stderr.string.strip
224
+ ensure
225
+ $stderr = the_real_stderr
226
+ end
227
+
228
+ def silence_warnings
229
+ the_real_stderr, $stderr = $stderr, StringIO.new
230
+ yield
231
+ ensure
232
+ $stderr = the_real_stderr
233
+ end
234
+
235
+ def env(hash = {})
236
+ env = Sass::Environment.new
237
+ hash.each {|k, v| env.set_var(k, v)}
238
+ env
239
+ end
240
+
241
+ def test_number_printing
242
+ assert_equal "1", eval("1")
243
+ assert_equal "1", eval("1.0")
244
+ assert_equal "1.121", eval("1.1214")
245
+ assert_equal "1.122", eval("1.1215")
246
+ assert_equal "Infinity", eval("1.0/0.0")
247
+ assert_equal "-Infinity", eval("-1.0/0.0")
248
+ assert_equal "NaN", eval("0.0/0.0")
249
+ end
250
+ end
@@ -0,0 +1,2 @@
1
+ #foo
2
+ :background-color #baf
@@ -0,0 +1,16 @@
1
+ h1
2
+ :float left
3
+ :width 274px
4
+ height: 75px
5
+ margin: 0
6
+ background:
7
+ repeat: no-repeat
8
+ :image none
9
+ a:hover, a:visited
10
+ color: green
11
+ b:hover
12
+ color: red
13
+ :background-color green
14
+ const
15
+ nosp= 1 + 2
16
+ sp = 1 + 2
@@ -0,0 +1,23 @@
1
+
2
+
3
+ body
4
+ :font Arial
5
+ :background blue
6
+
7
+ #page
8
+ :width 700px
9
+ :height 100
10
+ #header
11
+ :height 300px
12
+ h1
13
+ :font-size 50px
14
+ :color blue
15
+
16
+ #content.user.show
17
+ #container.top
18
+ #column.left
19
+ :width 100px
20
+ #column.right
21
+ :width 600px
22
+ #container.bottom
23
+ :background brown
@@ -0,0 +1,2 @@
1
+ bork
2
+ :bork= !bork
@@ -0,0 +1,2 @@
1
+ bork
2
+ :bork: bork;
@@ -0,0 +1,17 @@
1
+ #main
2
+ :width 15em
3
+ :color #0000ff
4
+ p
5
+ :border
6
+ :style dotted
7
+ /* Nested comment
8
+ More nested stuff
9
+ :width 2px
10
+ .cool
11
+ :width 100px
12
+
13
+ #left
14
+ :font
15
+ :size 2em
16
+ :weight bold
17
+ :float left