haml 3.1.3 → 3.1.4

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of haml might be problematic. Click here for more details.

Files changed (134) hide show
  1. data/Rakefile +42 -17
  2. data/VERSION +1 -1
  3. data/lib/haml/compiler.rb +3 -3
  4. data/lib/haml/helpers/action_view_mods.rb +4 -3
  5. data/lib/haml/template.rb +3 -1
  6. data/test/gemfiles/Gemfile.rails-2.0.x +8 -0
  7. data/test/gemfiles/Gemfile.rails-2.0.x.lock +38 -0
  8. data/test/gemfiles/Gemfile.rails-2.1.x +8 -0
  9. data/test/gemfiles/Gemfile.rails-2.1.x.lock +38 -0
  10. data/test/gemfiles/Gemfile.rails-2.2.x +8 -0
  11. data/test/gemfiles/Gemfile.rails-2.2.x.lock +38 -0
  12. data/test/gemfiles/Gemfile.rails-2.3.x +8 -0
  13. data/test/gemfiles/Gemfile.rails-2.3.x.lock +40 -0
  14. data/test/gemfiles/Gemfile.rails-3.0.x +8 -0
  15. data/test/gemfiles/Gemfile.rails-3.0.x.lock +85 -0
  16. data/test/gemfiles/Gemfile.rails-3.1.x +8 -0
  17. data/test/gemfiles/Gemfile.rails-3.1.x.lock +98 -0
  18. data/test/gemfiles/Gemfile.rails-xss-2.3.x +9 -0
  19. data/test/gemfiles/Gemfile.rails-xss-2.3.x.lock +42 -0
  20. data/test/haml/engine_test.rb +19 -0
  21. data/test/haml/html2haml_test.rb +1 -1
  22. data/test/haml/template_test.rb +20 -2
  23. data/test/haml/templates/partial_layout.haml +4 -1
  24. data/test/linked_rails.rb +4 -4
  25. data/vendor/sass/VERSION +1 -1
  26. data/vendor/sass/doc-src/SASS_CHANGELOG.md +115 -2
  27. data/vendor/sass/doc-src/SASS_REFERENCE.md +12 -4
  28. data/vendor/sass/lib/sass.rb +1 -0
  29. data/vendor/sass/lib/sass/cache_stores/base.rb +3 -1
  30. data/vendor/sass/lib/sass/cache_stores/filesystem.rb +2 -0
  31. data/vendor/sass/lib/sass/css.rb +2 -1
  32. data/vendor/sass/lib/sass/engine.rb +39 -23
  33. data/vendor/sass/lib/sass/environment.rb +11 -0
  34. data/vendor/sass/lib/sass/exec.rb +14 -1
  35. data/vendor/sass/lib/sass/importers/base.rb +2 -1
  36. data/vendor/sass/lib/sass/importers/filesystem.rb +18 -13
  37. data/vendor/sass/lib/sass/less.rb +2 -2
  38. data/vendor/sass/lib/sass/logger.rb +15 -0
  39. data/vendor/sass/lib/sass/logger/base.rb +32 -0
  40. data/vendor/sass/lib/sass/logger/log_level.rb +49 -0
  41. data/vendor/sass/lib/sass/plugin.rb +4 -8
  42. data/vendor/sass/lib/sass/plugin/compiler.rb +42 -17
  43. data/vendor/sass/lib/sass/plugin/configuration.rb +0 -2
  44. data/vendor/sass/lib/sass/railtie.rb +1 -1
  45. data/vendor/sass/lib/sass/script/funcall.rb +14 -1
  46. data/vendor/sass/lib/sass/script/functions.rb +44 -1
  47. data/vendor/sass/lib/sass/script/interpolation.rb +9 -0
  48. data/vendor/sass/lib/sass/script/lexer.rb +6 -1
  49. data/vendor/sass/lib/sass/script/list.rb +7 -0
  50. data/vendor/sass/lib/sass/script/literal.rb +5 -0
  51. data/vendor/sass/lib/sass/script/node.rb +8 -0
  52. data/vendor/sass/lib/sass/script/number.rb +28 -5
  53. data/vendor/sass/lib/sass/script/operation.rb +8 -0
  54. data/vendor/sass/lib/sass/script/parser.rb +12 -5
  55. data/vendor/sass/lib/sass/script/string_interpolation.rb +9 -0
  56. data/vendor/sass/lib/sass/script/unary_operation.rb +7 -0
  57. data/vendor/sass/lib/sass/script/variable.rb +5 -0
  58. data/vendor/sass/lib/sass/scss/parser.rb +78 -38
  59. data/vendor/sass/lib/sass/scss/rx.rb +2 -1
  60. data/vendor/sass/lib/sass/scss/static_parser.rb +2 -2
  61. data/vendor/sass/lib/sass/shared.rb +1 -1
  62. data/vendor/sass/lib/sass/tree/comment_node.rb +24 -11
  63. data/vendor/sass/lib/sass/tree/debug_node.rb +1 -1
  64. data/vendor/sass/lib/sass/tree/each_node.rb +1 -1
  65. data/vendor/sass/lib/sass/tree/extend_node.rb +1 -1
  66. data/vendor/sass/lib/sass/tree/for_node.rb +2 -2
  67. data/vendor/sass/lib/sass/tree/function_node.rb +1 -1
  68. data/vendor/sass/lib/sass/tree/if_node.rb +1 -14
  69. data/vendor/sass/lib/sass/tree/mixin_def_node.rb +1 -1
  70. data/vendor/sass/lib/sass/tree/mixin_node.rb +2 -2
  71. data/vendor/sass/lib/sass/tree/node.rb +2 -5
  72. data/vendor/sass/lib/sass/tree/prop_node.rb +2 -9
  73. data/vendor/sass/lib/sass/tree/return_node.rb +1 -1
  74. data/vendor/sass/lib/sass/tree/rule_node.rb +9 -2
  75. data/vendor/sass/lib/sass/tree/variable_node.rb +1 -1
  76. data/vendor/sass/lib/sass/tree/visitors/check_nesting.rb +17 -18
  77. data/vendor/sass/lib/sass/tree/visitors/convert.rb +10 -5
  78. data/vendor/sass/lib/sass/tree/visitors/deep_copy.rb +87 -0
  79. data/vendor/sass/lib/sass/tree/visitors/perform.rb +50 -19
  80. data/vendor/sass/lib/sass/tree/visitors/set_options.rb +97 -0
  81. data/vendor/sass/lib/sass/tree/visitors/to_css.rb +9 -15
  82. data/vendor/sass/lib/sass/tree/warn_node.rb +1 -1
  83. data/vendor/sass/lib/sass/tree/while_node.rb +1 -1
  84. data/vendor/sass/lib/sass/util.rb +58 -6
  85. data/vendor/sass/sass.gemspec +2 -1
  86. data/vendor/sass/test/Gemfile +4 -0
  87. data/vendor/sass/test/Gemfile.lock +19 -0
  88. data/vendor/sass/test/sass/cache_test.rb +15 -0
  89. data/vendor/sass/test/sass/conversion_test.rb +2 -6
  90. data/vendor/sass/test/sass/css2sass_test.rb +9 -0
  91. data/vendor/sass/test/sass/engine_test.rb +124 -26
  92. data/vendor/sass/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
  93. data/vendor/sass/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
  94. data/vendor/sass/test/sass/functions_test.rb +13 -0
  95. data/vendor/sass/test/sass/importer_test.rb +110 -0
  96. data/vendor/sass/test/sass/logger_test.rb +58 -0
  97. data/vendor/sass/test/sass/plugin_test.rb +16 -13
  98. data/vendor/sass/test/sass/script_conversion_test.rb +2 -0
  99. data/vendor/sass/test/sass/script_test.rb +18 -0
  100. data/vendor/sass/test/sass/scss/css_test.rb +7 -1
  101. data/vendor/sass/test/sass/scss/scss_test.rb +37 -13
  102. data/vendor/sass/test/sass/templates/bork5.sass +3 -0
  103. data/vendor/sass/test/sass/templates/nested_bork5.sass +2 -0
  104. data/vendor/sass/test/sass/test_helper.rb +1 -1
  105. data/vendor/sass/test/sass/util_test.rb +12 -0
  106. data/vendor/sass/vendor/fssm/Gemfile +3 -0
  107. data/vendor/sass/vendor/fssm/LICENSE +1 -1
  108. data/vendor/sass/vendor/fssm/README.markdown +55 -27
  109. data/vendor/sass/vendor/fssm/Rakefile +6 -54
  110. data/vendor/sass/vendor/fssm/example.rb +6 -3
  111. data/vendor/sass/vendor/fssm/fssm.gemspec +17 -70
  112. data/vendor/sass/vendor/fssm/lib/fssm.rb +7 -3
  113. data/vendor/sass/vendor/fssm/lib/fssm/backends/fsevents.rb +1 -1
  114. data/vendor/sass/vendor/fssm/lib/fssm/backends/inotify.rb +2 -2
  115. data/vendor/sass/vendor/fssm/lib/fssm/backends/polling.rb +2 -2
  116. data/vendor/sass/vendor/fssm/lib/fssm/backends/rbfsevent.rb +42 -0
  117. data/vendor/sass/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +10 -10
  118. data/vendor/sass/vendor/fssm/lib/fssm/monitor.rb +19 -9
  119. data/vendor/sass/vendor/fssm/lib/fssm/path.rb +24 -21
  120. data/vendor/sass/vendor/fssm/lib/fssm/pathname.rb +13 -479
  121. data/vendor/sass/vendor/fssm/lib/fssm/state/directory.rb +29 -11
  122. data/vendor/sass/vendor/fssm/lib/fssm/state/file.rb +1 -1
  123. data/vendor/sass/vendor/fssm/lib/fssm/support.rb +41 -12
  124. data/vendor/sass/vendor/fssm/lib/fssm/tree.rb +6 -6
  125. data/vendor/sass/vendor/fssm/lib/fssm/version.rb +3 -0
  126. data/vendor/sass/vendor/fssm/profile/prof-cache.rb +3 -3
  127. data/vendor/sass/vendor/fssm/profile/prof-pathname-rubinius.rb +35 -0
  128. data/vendor/sass/vendor/fssm/profile/prof-pathname.rb +7 -7
  129. data/vendor/sass/vendor/fssm/spec/count_down_latch.rb +151 -0
  130. data/vendor/sass/vendor/fssm/spec/monitor_spec.rb +202 -0
  131. data/vendor/sass/vendor/fssm/spec/path_spec.rb +36 -15
  132. data/vendor/sass/vendor/fssm/spec/spec_helper.rb +6 -6
  133. metadata +36 -5
  134. data/vendor/sass/vendor/fssm/VERSION.yml +0 -5
@@ -965,6 +965,19 @@ MSG
965
965
  assert_error_message("Separator name must be space, comma, or auto for `append'", "append(1, 2, baboon)")
966
966
  end
967
967
 
968
+ def test_zip
969
+ assert_equal("1 3 5, 2 4 6", evaluate("zip(1 2, 3 4, 5 6)"))
970
+ assert_equal("1 4 7, 2 5 8", evaluate("zip(1 2 3, 4 5 6, 7 8)"))
971
+ end
972
+
973
+ def test_index
974
+ assert_equal("1", evaluate("index(1px solid blue, 1px)"))
975
+ assert_equal("2", evaluate("index(1px solid blue, solid)"))
976
+ assert_equal("3", evaluate("index(1px solid blue, #00f)"))
977
+ assert_equal("false", evaluate("index(1px solid blue, 1em)"))
978
+ assert_equal("false", evaluate("index(1px solid blue, notfound)"))
979
+ end
980
+
968
981
  def test_if
969
982
  assert_equal("1px", evaluate("if(true, 1px, 2px)"))
970
983
  assert_equal("2px", evaluate("if(false, 1px, 2px)"))
@@ -2,6 +2,8 @@
2
2
  require File.dirname(__FILE__) + '/../test_helper'
3
3
  require File.dirname(__FILE__) + '/test_helper'
4
4
 
5
+ require 'sass/plugin'
6
+
5
7
  class ImporterTest < Test::Unit::TestCase
6
8
 
7
9
  class FruitImporter < Sass::Importers::Base
@@ -38,6 +40,72 @@ class ImporterTest < Test::Unit::TestCase
38
40
  end
39
41
  end
40
42
 
43
+ # This importer maps one import to another import
44
+ # based on the mappings passed to importer's constructor.
45
+ class IndirectImporter < Sass::Importers::Base
46
+ def initialize(mappings, mtimes)
47
+ @mappings = mappings
48
+ @mtimes = mtimes
49
+ end
50
+ def find_relative(uri, base, options)
51
+ nil
52
+ end
53
+ def find(name, options)
54
+ if @mappings.has_key?(name)
55
+ Sass::Engine.new(
56
+ %Q[@import "#{@mappings[name]}";],
57
+ options.merge(
58
+ :filename => name,
59
+ :syntax => :scss,
60
+ :importer => self
61
+ )
62
+ )
63
+ end
64
+ end
65
+ def mtime(uri, options)
66
+ @mtimes.fetch(uri, @mtimes.has_key?(uri) ? Time.now : nil)
67
+ end
68
+ def key(uri, options)
69
+ [self.class.name, uri]
70
+ end
71
+ def to_s
72
+ "IndirectImporter(#{@mappings.keys.join(", ")})"
73
+ end
74
+ end
75
+
76
+ # This importer maps the import to single class
77
+ # based on the mappings passed to importer's constructor.
78
+ class ClassImporter < Sass::Importers::Base
79
+ def initialize(mappings, mtimes)
80
+ @mappings = mappings
81
+ @mtimes = mtimes
82
+ end
83
+ def find_relative(uri, base, options)
84
+ nil
85
+ end
86
+ def find(name, options)
87
+ if @mappings.has_key?(name)
88
+ Sass::Engine.new(
89
+ %Q[.#{name}{#{@mappings[name]}}],
90
+ options.merge(
91
+ :filename => name,
92
+ :syntax => :scss,
93
+ :importer => self
94
+ )
95
+ )
96
+ end
97
+ end
98
+ def mtime(uri, options)
99
+ @mtimes.fetch(uri, @mtimes.has_key?(uri) ? Time.now : nil)
100
+ end
101
+ def key(uri, options)
102
+ [self.class.name, uri]
103
+ end
104
+ def to_s
105
+ "ClassImporter(#{@mappings.keys.join(", ")})"
106
+ end
107
+ end
108
+
41
109
  def test_can_resolve_generated_imports
42
110
  scss_file = %Q{
43
111
  $pear-color: green;
@@ -79,4 +147,46 @@ CSS
79
147
  ensure
80
148
  FileUtils.rm_rf(absolutize("tmp"))
81
149
  end
150
+
151
+ def test_staleness_check_across_importers
152
+ file_system_importer = Sass::Importers::Filesystem.new(fixture_dir)
153
+ # Make sure the first import is older
154
+ indirect_importer = IndirectImporter.new({"apple" => "pear"}, {"apple" => Time.now - 1})
155
+ # Make css file is newer so the dependencies are the only way for the css file to be out of date.
156
+ FileUtils.touch(fixture_file("test_staleness_check_across_importers.css"))
157
+ # Make sure the first import is older
158
+ class_importer = ClassImporter.new({"pear" => %Q{color: green;}}, {"pear" => Time.now + 1})
159
+
160
+ options = {
161
+ :style => :compact,
162
+ :filename => fixture_file("test_staleness_check_across_importers.scss"),
163
+ :importer => file_system_importer,
164
+ :load_paths => [file_system_importer, indirect_importer, class_importer],
165
+ :syntax => :scss
166
+ }
167
+
168
+ assert_equal File.read(fixture_file("test_staleness_check_across_importers.css")),
169
+ Sass::Engine.new(File.read(fixture_file("test_staleness_check_across_importers.scss")), options).render
170
+
171
+ checker = Sass::Plugin::StalenessChecker.new(options)
172
+
173
+ assert checker.stylesheet_needs_update?(
174
+ fixture_file("test_staleness_check_across_importers.css"),
175
+ fixture_file("test_staleness_check_across_importers.scss"),
176
+ file_system_importer
177
+ )
178
+ end
179
+
180
+ def fixture_dir
181
+ File.join(File.dirname(__FILE__), "fixtures")
182
+ end
183
+
184
+ def fixture_file(path)
185
+ File.join(fixture_dir, path)
186
+ end
187
+
188
+ def test_absolute_files_across_template_locations
189
+ importer = Sass::Importers::Filesystem.new(absolutize 'templates')
190
+ assert_not_nil importer.mtime(absolutize('more_templates/more1.sass'), {})
191
+ end
82
192
  end
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../test_helper'
3
+ require 'pathname'
4
+
5
+ class LoggerTest < Test::Unit::TestCase
6
+
7
+ class InterceptedLogger < Sass::Logger::Base
8
+
9
+ attr_accessor :messages
10
+
11
+ def initialize(*args)
12
+ super
13
+ self.messages = []
14
+ end
15
+
16
+ def reset!
17
+ self.messages = []
18
+ end
19
+
20
+ def _log(*args)
21
+ messages << [args]
22
+ end
23
+
24
+ end
25
+
26
+ def test_global_sass_logger_instance_exists
27
+ assert Sass.logger.respond_to?(:warn)
28
+ end
29
+
30
+ def test_log_level_orders
31
+ logged_levels = {
32
+ :trace => [ [], [:trace, :debug, :info, :warn, :error]],
33
+ :debug => [ [:trace], [:debug, :info, :warn, :error]],
34
+ :info => [ [:trace, :debug], [:info, :warn, :error]],
35
+ :warn => [ [:trace, :debug, :info], [:warn, :error]],
36
+ :error => [ [:trace, :debug, :info, :warn], [:error]]
37
+ }
38
+ logged_levels.each do |level, (should_not_be_logged, should_be_logged)|
39
+ logger = Sass::Logger::Base.new(level)
40
+ should_not_be_logged.each do |should_level|
41
+ assert !logger.logging_level?(should_level)
42
+ end
43
+ should_be_logged.each do |should_level|
44
+ assert logger.logging_level?(should_level)
45
+ end
46
+ end
47
+ end
48
+
49
+ def test_logging_can_be_disabled
50
+ logger = InterceptedLogger.new
51
+ logger.error("message #1")
52
+ assert_equal 1, logger.messages.size
53
+ logger.reset!
54
+ logger.disabled = true
55
+ logger.error("message #2")
56
+ assert_equal 0, logger.messages.size
57
+ end
58
+ end
@@ -183,6 +183,7 @@ CSS
183
183
 
184
184
  def test_updating_stylesheets_callback
185
185
  # Should run even when there's nothing to update
186
+ Sass::Plugin.options[:template_location] = nil
186
187
  assert_callback :updating_stylesheets, []
187
188
  end
188
189
 
@@ -196,25 +197,25 @@ CSS
196
197
  assert_no_callback :updating_stylesheets
197
198
  end
198
199
 
199
- def test_updating_stylesheet_callback_for_updated_template
200
+ def test_updated_stylesheet_callback_for_updated_template
200
201
  Sass::Plugin.options[:always_update] = false
201
202
  touch 'basic'
202
- assert_no_callback :updating_stylesheet, template_loc("complex"), tempfile_loc("complex") do
203
+ assert_no_callback :updated_stylesheet, template_loc("complex"), tempfile_loc("complex") do
203
204
  assert_callbacks(
204
- [:updating_stylesheet, template_loc("basic"), tempfile_loc("basic")],
205
- [:updating_stylesheet, template_loc("import"), tempfile_loc("import")])
205
+ [:updated_stylesheet, template_loc("basic"), tempfile_loc("basic")],
206
+ [:updated_stylesheet, template_loc("import"), tempfile_loc("import")])
206
207
  end
207
208
  end
208
209
 
209
- def test_updating_stylesheet_callback_for_fresh_template
210
+ def test_updated_stylesheet_callback_for_fresh_template
210
211
  Sass::Plugin.options[:always_update] = false
211
- assert_no_callback :updating_stylesheet
212
+ assert_no_callback :updated_stylesheet
212
213
  end
213
214
 
214
- def test_updating_stylesheet_callback_for_error_template
215
+ def test_updated_stylesheet_callback_for_error_template
215
216
  Sass::Plugin.options[:always_update] = false
216
217
  touch 'bork1'
217
- assert_no_callback :updating_stylesheet
218
+ assert_no_callback :updated_stylesheet
218
219
  end
219
220
 
220
221
  def test_not_updating_stylesheet_callback_for_fresh_template
@@ -226,8 +227,8 @@ CSS
226
227
  Sass::Plugin.options[:always_update] = false
227
228
  assert_callback :not_updating_stylesheet, template_loc("complex"), tempfile_loc("complex") do
228
229
  assert_no_callbacks(
229
- [:updating_stylesheet, template_loc("basic"), tempfile_loc("basic")],
230
- [:updating_stylesheet, template_loc("import"), tempfile_loc("import")])
230
+ [:updated_stylesheet, template_loc("basic"), tempfile_loc("basic")],
231
+ [:updated_stylesheet, template_loc("import"), tempfile_loc("import")])
231
232
  end
232
233
  end
233
234
 
@@ -347,9 +348,11 @@ CSS
347
348
 
348
349
  def assert_callback(name, *expected_args)
349
350
  run = false
351
+ received_args = nil
350
352
  Sass::Plugin.send("on_#{name}") do |*args|
351
- run ||= expected_args.zip(args).all? do |ea, a|
352
- ea.respond_to?(:call) ? ea.call(a) : ea == a
353
+ received_args = args
354
+ run ||= expected_args.zip(received_args).all? do |ea, ra|
355
+ ea.respond_to?(:call) ? ea.call(ra) : ea == ra
353
356
  end
354
357
  end
355
358
 
@@ -359,7 +362,7 @@ CSS
359
362
  check_for_updates!
360
363
  end
361
364
 
362
- assert run, "Expected #{name} callback to be run with arguments:\n #{expected_args.inspect}"
365
+ assert run, "Expected #{name} callback to be run with arguments:\n #{expected_args.inspect}\nHowever, it got:\n #{received_args.inspect}"
363
366
  end
364
367
 
365
368
  def assert_no_callback(name, *unexpected_args)
@@ -223,6 +223,8 @@ RUBY
223
223
  assert_renders '#{1 + 2}, #{3 + 4}'
224
224
  assert_renders '#{1 + 2} ,#{3 + 4}'
225
225
  assert_renders '#{1 + 2},#{3 + 4}'
226
+ assert_renders '#{1 + 2}, #{3 + 4}, #{5 + 6}'
227
+ assert_renders '3, #{3 + 4}, 11'
226
228
 
227
229
  assert_renders '3 / #{3 + 4}'
228
230
  assert_renders '3 /#{3 + 4}'
@@ -7,6 +7,14 @@ module Sass::Script::Functions::UserFunctions
7
7
  val.options[:foo]
8
8
  Sass::Script::String.new("Options defined!")
9
9
  end
10
+
11
+ def arg_error
12
+ assert_options
13
+ end
14
+ end
15
+
16
+ module Sass::Script::Functions
17
+ include Sass::Script::Functions::UserFunctions
10
18
  end
11
19
 
12
20
  class SassScriptTest < Test::Unit::TestCase
@@ -130,6 +138,8 @@ class SassScriptTest < Test::Unit::TestCase
130
138
  assert_equal '3, 7', resolve('#{1 + 2}, #{3 + 4}')
131
139
  assert_equal '3 ,7', resolve('#{1 + 2} ,#{3 + 4}')
132
140
  assert_equal '3,7', resolve('#{1 + 2},#{3 + 4}')
141
+ assert_equal '3, 7, 11', resolve('#{1 + 2}, #{3 + 4}, #{5 + 6}')
142
+ assert_equal '3, 7, 11', resolve('3, #{3 + 4}, 11')
133
143
 
134
144
  assert_equal '3 / 7', resolve('3 / #{3 + 4}')
135
145
  assert_equal '3 /7', resolve('3 /#{3 + 4}')
@@ -414,6 +424,14 @@ SASS
414
424
  assert_raise_message(Sass::SyntaxError, "() isn't a valid CSS value.") {resolve("nth(append((), ()), 1)")}
415
425
  end
416
426
 
427
+ def test_deep_argument_error_not_unwrapped
428
+ assert_raise_message(ArgumentError, 'wrong number of arguments (0 for 1)') {resolve("arg-error()")}
429
+ end
430
+
431
+ def test_shallow_argument_error_unwrapped
432
+ assert_raise_message(Sass::SyntaxError, "wrong number of arguments (1 for 0) for `arg-error'") {resolve("arg-error(1)")}
433
+ end
434
+
417
435
  # Regression Tests
418
436
 
419
437
  def test_funcall_has_higher_precedence_than_color_name
@@ -800,6 +800,12 @@ SCSS
800
800
  assert_selector_parses('E*:hover')
801
801
  end
802
802
 
803
+ def test_spaceless_combo_selectors
804
+ assert_equal "E > F {\n a: b; }\n", render("E>F { a: b;} ")
805
+ assert_equal "E ~ F {\n a: b; }\n", render("E~F { a: b;} ")
806
+ assert_equal "E + F {\n a: b; }\n", render("E+F { a: b;} ")
807
+ end
808
+
803
809
  ## Errors
804
810
 
805
811
  def test_invalid_directives
@@ -909,7 +915,7 @@ SCSS
909
915
  end
910
916
 
911
917
  def render(scss, options = {})
912
- tree = Sass::SCSS::CssParser.new(scss).parse
918
+ tree = Sass::SCSS::CssParser.new(scss, options[:filename]).parse
913
919
  tree.options = Sass::Engine::DEFAULT_OPTIONS.merge(options)
914
920
  tree.render
915
921
  end
@@ -118,11 +118,11 @@ SCSS
118
118
  def test_warn_directive
119
119
  expected_warning = <<EXPECTATION
120
120
  WARNING: this is a warning
121
- on line 2 of test_warn_directive_inline.scss
121
+ on line 2 of test_warn_directive_inline.scss
122
122
 
123
123
  WARNING: this is a mixin
124
- on line 1 of test_warn_directive_inline.scss, in `foo'
125
- from line 3 of test_warn_directive_inline.scss
124
+ on line 1 of test_warn_directive_inline.scss, in `foo'
125
+ from line 3 of test_warn_directive_inline.scss
126
126
  EXPECTATION
127
127
  assert_warning expected_warning do
128
128
  assert_equal <<CSS, render(<<SCSS)
@@ -892,7 +892,8 @@ SCSS
892
892
  end
893
893
 
894
894
  def test_uses_property_exception_with_star_hack
895
- render <<SCSS
895
+ # Silence the "beginning of selector" warning
896
+ Sass::Util.silence_warnings {render <<SCSS}
896
897
  foo {
897
898
  *bar:baz [fail]; }
898
899
  SCSS
@@ -1029,11 +1030,10 @@ SCSS
1029
1030
  end
1030
1031
 
1031
1032
  def test_parent_in_mid_selector_error
1032
- assert_raise_message(Sass::SyntaxError, <<MESSAGE) {render <<SCSS}
1033
+ assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
1033
1034
  Invalid CSS after ".foo": expected "{", was "&.bar"
1034
1035
 
1035
- In Sass 3, the parent selector & can only be used where element names are valid,
1036
- since it could potentially be replaced by an element name.
1036
+ "&" may only be used at the beginning of a selector.
1037
1037
  MESSAGE
1038
1038
  flim {
1039
1039
  .foo&.bar {a: b}
@@ -1042,11 +1042,10 @@ SCSS
1042
1042
  end
1043
1043
 
1044
1044
  def test_parent_in_mid_selector_error
1045
- assert_raise_message(Sass::SyntaxError, <<MESSAGE) {render <<SCSS}
1045
+ assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
1046
1046
  Invalid CSS after " .foo.bar": expected "{", was "& {a: b}"
1047
1047
 
1048
- In Sass 3, the parent selector & can only be used where element names are valid,
1049
- since it could potentially be replaced by an element name.
1048
+ "&" may only be used at the beginning of a selector.
1050
1049
  MESSAGE
1051
1050
  flim {
1052
1051
  .foo.bar& {a: b}
@@ -1055,11 +1054,10 @@ SCSS
1055
1054
  end
1056
1055
 
1057
1056
  def test_double_parent_selector_error
1058
- assert_raise_message(Sass::SyntaxError, <<MESSAGE) {render <<SCSS}
1057
+ assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
1059
1058
  Invalid CSS after " &": expected "{", was "& {a: b}"
1060
1059
 
1061
- In Sass 3, the parent selector & can only be used where element names are valid,
1062
- since it could potentially be replaced by an element name.
1060
+ "&" may only be used at the beginning of a selector.
1063
1061
  MESSAGE
1064
1062
  flim {
1065
1063
  && {a: b}
@@ -1097,6 +1095,24 @@ SCSS
1097
1095
 
1098
1096
  # Regression
1099
1097
 
1098
+ def test_prop_name_interpolation_after_hyphen
1099
+ assert_equal <<CSS, render(<<SCSS)
1100
+ a {
1101
+ -foo-bar: b; }
1102
+ CSS
1103
+ a { -\#{"foo"}-bar: b; }
1104
+ SCSS
1105
+ end
1106
+
1107
+ def test_star_plus_and_parent
1108
+ assert_equal <<CSS, render(<<SCSS)
1109
+ * + html foo {
1110
+ a: b; }
1111
+ CSS
1112
+ foo {*+html & {a: b}}
1113
+ SCSS
1114
+ end
1115
+
1100
1116
  def test_weird_added_space
1101
1117
  assert_equal <<CSS, render(<<SCSS)
1102
1118
  foo {
@@ -1244,6 +1260,14 @@ foo {
1244
1260
  a: $var1;
1245
1261
  b: $var2;
1246
1262
  c: $var3; }
1263
+ SCSS
1264
+ end
1265
+
1266
+ def test_options_passed_to_script
1267
+ assert_equal <<CSS, render(<<SCSS, :style => :compressed)
1268
+ foo{color:#000}
1269
+ CSS
1270
+ foo {color: darken(black, 10%)}
1247
1271
  SCSS
1248
1272
  end
1249
1273
  end