sass 3.3.0 → 3.4.25

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 (208) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +3 -1
  3. data/CODE_OF_CONDUCT.md +10 -0
  4. data/CONTRIBUTING.md +148 -0
  5. data/MIT-LICENSE +1 -1
  6. data/README.md +76 -62
  7. data/Rakefile +104 -24
  8. data/VERSION +1 -1
  9. data/VERSION_DATE +1 -1
  10. data/VERSION_NAME +1 -1
  11. data/bin/sass +1 -1
  12. data/bin/scss +1 -1
  13. data/extra/sass-spec-ref.sh +32 -0
  14. data/extra/update_watch.rb +1 -1
  15. data/lib/sass/cache_stores/filesystem.rb +9 -5
  16. data/lib/sass/cache_stores/memory.rb +4 -5
  17. data/lib/sass/callbacks.rb +2 -2
  18. data/lib/sass/css.rb +12 -13
  19. data/lib/sass/deprecation.rb +55 -0
  20. data/lib/sass/engine.rb +106 -70
  21. data/lib/sass/environment.rb +39 -19
  22. data/lib/sass/error.rb +17 -20
  23. data/lib/sass/exec/base.rb +199 -0
  24. data/lib/sass/exec/sass_convert.rb +283 -0
  25. data/lib/sass/exec/sass_scss.rb +440 -0
  26. data/lib/sass/exec.rb +5 -771
  27. data/lib/sass/features.rb +9 -2
  28. data/lib/sass/importers/base.rb +8 -3
  29. data/lib/sass/importers/filesystem.rb +30 -38
  30. data/lib/sass/logger/base.rb +8 -2
  31. data/lib/sass/logger/delayed.rb +50 -0
  32. data/lib/sass/logger.rb +8 -3
  33. data/lib/sass/media.rb +1 -4
  34. data/lib/sass/plugin/compiler.rb +224 -90
  35. data/lib/sass/plugin/configuration.rb +38 -22
  36. data/lib/sass/plugin/merb.rb +2 -2
  37. data/lib/sass/plugin/rack.rb +3 -3
  38. data/lib/sass/plugin/rails.rb +1 -1
  39. data/lib/sass/plugin/staleness_checker.rb +4 -4
  40. data/lib/sass/plugin.rb +6 -5
  41. data/lib/sass/script/css_lexer.rb +1 -1
  42. data/lib/sass/script/css_parser.rb +2 -3
  43. data/lib/sass/script/css_variable_warning.rb +52 -0
  44. data/lib/sass/script/functions.rb +739 -318
  45. data/lib/sass/script/lexer.rb +134 -54
  46. data/lib/sass/script/parser.rb +252 -56
  47. data/lib/sass/script/tree/funcall.rb +13 -6
  48. data/lib/sass/script/tree/interpolation.rb +127 -4
  49. data/lib/sass/script/tree/list_literal.rb +31 -4
  50. data/lib/sass/script/tree/literal.rb +4 -0
  51. data/lib/sass/script/tree/node.rb +21 -3
  52. data/lib/sass/script/tree/operation.rb +54 -1
  53. data/lib/sass/script/tree/selector.rb +26 -0
  54. data/lib/sass/script/tree/string_interpolation.rb +59 -38
  55. data/lib/sass/script/tree/variable.rb +1 -1
  56. data/lib/sass/script/tree.rb +1 -0
  57. data/lib/sass/script/value/base.rb +17 -14
  58. data/lib/sass/script/value/bool.rb +0 -5
  59. data/lib/sass/script/value/color.rb +78 -42
  60. data/lib/sass/script/value/helpers.rb +119 -2
  61. data/lib/sass/script/value/list.rb +0 -15
  62. data/lib/sass/script/value/map.rb +1 -1
  63. data/lib/sass/script/value/null.rb +0 -5
  64. data/lib/sass/script/value/number.rb +112 -31
  65. data/lib/sass/script/value/string.rb +102 -13
  66. data/lib/sass/script/value.rb +0 -1
  67. data/lib/sass/script.rb +3 -3
  68. data/lib/sass/scss/css_parser.rb +24 -4
  69. data/lib/sass/scss/parser.rb +290 -383
  70. data/lib/sass/scss/rx.rb +17 -9
  71. data/lib/sass/scss/static_parser.rb +306 -4
  72. data/lib/sass/scss.rb +0 -2
  73. data/lib/sass/selector/abstract_sequence.rb +35 -18
  74. data/lib/sass/selector/comma_sequence.rb +114 -19
  75. data/lib/sass/selector/pseudo.rb +266 -0
  76. data/lib/sass/selector/sequence.rb +146 -40
  77. data/lib/sass/selector/simple.rb +22 -33
  78. data/lib/sass/selector/simple_sequence.rb +122 -39
  79. data/lib/sass/selector.rb +57 -197
  80. data/lib/sass/shared.rb +2 -2
  81. data/lib/sass/source/map.rb +31 -14
  82. data/lib/sass/source/position.rb +4 -4
  83. data/lib/sass/stack.rb +2 -8
  84. data/lib/sass/supports.rb +10 -13
  85. data/lib/sass/tree/at_root_node.rb +1 -0
  86. data/lib/sass/tree/charset_node.rb +1 -1
  87. data/lib/sass/tree/comment_node.rb +1 -1
  88. data/lib/sass/tree/css_import_node.rb +9 -1
  89. data/lib/sass/tree/directive_node.rb +8 -2
  90. data/lib/sass/tree/error_node.rb +18 -0
  91. data/lib/sass/tree/extend_node.rb +1 -1
  92. data/lib/sass/tree/function_node.rb +9 -0
  93. data/lib/sass/tree/import_node.rb +6 -5
  94. data/lib/sass/tree/keyframe_rule_node.rb +15 -0
  95. data/lib/sass/tree/node.rb +5 -3
  96. data/lib/sass/tree/prop_node.rb +6 -7
  97. data/lib/sass/tree/rule_node.rb +26 -11
  98. data/lib/sass/tree/visitors/check_nesting.rb +56 -32
  99. data/lib/sass/tree/visitors/convert.rb +59 -44
  100. data/lib/sass/tree/visitors/cssize.rb +34 -30
  101. data/lib/sass/tree/visitors/deep_copy.rb +6 -1
  102. data/lib/sass/tree/visitors/extend.rb +15 -13
  103. data/lib/sass/tree/visitors/perform.rb +87 -50
  104. data/lib/sass/tree/visitors/set_options.rb +15 -1
  105. data/lib/sass/tree/visitors/to_css.rb +72 -43
  106. data/lib/sass/util/multibyte_string_scanner.rb +0 -2
  107. data/lib/sass/util/normalized_map.rb +0 -1
  108. data/lib/sass/util/subset_map.rb +2 -3
  109. data/lib/sass/util.rb +334 -154
  110. data/lib/sass/version.rb +7 -7
  111. data/lib/sass.rb +10 -8
  112. data/test/sass/cache_test.rb +62 -20
  113. data/test/sass/callbacks_test.rb +1 -1
  114. data/test/sass/compiler_test.rb +24 -11
  115. data/test/sass/conversion_test.rb +241 -50
  116. data/test/sass/css2sass_test.rb +73 -5
  117. data/test/sass/css_variable_test.rb +132 -0
  118. data/test/sass/encoding_test.rb +219 -0
  119. data/test/sass/engine_test.rb +343 -260
  120. data/test/sass/exec_test.rb +12 -2
  121. data/test/sass/extend_test.rb +333 -44
  122. data/test/sass/functions_test.rb +353 -260
  123. data/test/sass/importer_test.rb +40 -21
  124. data/test/sass/logger_test.rb +1 -1
  125. data/test/sass/more_results/more_import.css +1 -1
  126. data/test/sass/more_templates/more1.sass +10 -10
  127. data/test/sass/more_templates/more_import.sass +2 -2
  128. data/test/sass/plugin_test.rb +24 -21
  129. data/test/sass/results/compact.css +1 -1
  130. data/test/sass/results/complex.css +4 -4
  131. data/test/sass/results/expanded.css +1 -1
  132. data/test/sass/results/import.css +1 -1
  133. data/test/sass/results/import_charset_ibm866.css +2 -2
  134. data/test/sass/results/mixins.css +17 -17
  135. data/test/sass/results/nested.css +1 -1
  136. data/test/sass/results/parent_ref.css +2 -2
  137. data/test/sass/results/script.css +5 -5
  138. data/test/sass/results/scss_import.css +1 -1
  139. data/test/sass/script_conversion_test.rb +71 -39
  140. data/test/sass/script_test.rb +714 -123
  141. data/test/sass/scss/css_test.rb +213 -30
  142. data/test/sass/scss/rx_test.rb +8 -4
  143. data/test/sass/scss/scss_test.rb +766 -22
  144. data/test/sass/source_map_test.rb +263 -95
  145. data/test/sass/superselector_test.rb +210 -0
  146. data/test/sass/templates/_partial.sass +1 -1
  147. data/test/sass/templates/basic.sass +10 -10
  148. data/test/sass/templates/bork1.sass +1 -1
  149. data/test/sass/templates/bork5.sass +1 -1
  150. data/test/sass/templates/compact.sass +10 -10
  151. data/test/sass/templates/complex.sass +187 -187
  152. data/test/sass/templates/compressed.sass +10 -10
  153. data/test/sass/templates/expanded.sass +10 -10
  154. data/test/sass/templates/import.sass +2 -2
  155. data/test/sass/templates/importee.sass +3 -3
  156. data/test/sass/templates/mixins.sass +22 -22
  157. data/test/sass/templates/multiline.sass +4 -4
  158. data/test/sass/templates/nested.sass +13 -13
  159. data/test/sass/templates/parent_ref.sass +12 -12
  160. data/test/sass/templates/script.sass +70 -70
  161. data/test/sass/templates/scss_import.scss +2 -1
  162. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +1 -1
  163. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +2 -2
  164. data/test/sass/templates/subdir/subdir.sass +3 -3
  165. data/test/sass/templates/units.sass +10 -10
  166. data/test/sass/test_helper.rb +1 -1
  167. data/test/sass/util/multibyte_string_scanner_test.rb +11 -3
  168. data/test/sass/util/normalized_map_test.rb +1 -1
  169. data/test/sass/util/subset_map_test.rb +2 -2
  170. data/test/sass/util_test.rb +46 -45
  171. data/test/sass/value_helpers_test.rb +5 -7
  172. data/test/sass-spec.yml +3 -0
  173. data/test/test_helper.rb +7 -6
  174. data/vendor/listen/CHANGELOG.md +1 -228
  175. data/vendor/listen/Gemfile +5 -15
  176. data/vendor/listen/README.md +111 -77
  177. data/vendor/listen/Rakefile +0 -42
  178. data/vendor/listen/lib/listen/adapter.rb +195 -82
  179. data/vendor/listen/lib/listen/adapters/bsd.rb +27 -64
  180. data/vendor/listen/lib/listen/adapters/darwin.rb +21 -58
  181. data/vendor/listen/lib/listen/adapters/linux.rb +23 -55
  182. data/vendor/listen/lib/listen/adapters/polling.rb +25 -34
  183. data/vendor/listen/lib/listen/adapters/windows.rb +50 -46
  184. data/vendor/listen/lib/listen/directory_record.rb +96 -61
  185. data/vendor/listen/lib/listen/listener.rb +135 -37
  186. data/vendor/listen/lib/listen/turnstile.rb +9 -5
  187. data/vendor/listen/lib/listen/version.rb +1 -1
  188. data/vendor/listen/lib/listen.rb +33 -19
  189. data/vendor/listen/listen.gemspec +6 -0
  190. data/vendor/listen/spec/listen/adapter_spec.rb +43 -77
  191. data/vendor/listen/spec/listen/adapters/polling_spec.rb +8 -8
  192. data/vendor/listen/spec/listen/directory_record_spec.rb +81 -56
  193. data/vendor/listen/spec/listen/listener_spec.rb +128 -39
  194. data/vendor/listen/spec/listen_spec.rb +15 -21
  195. data/vendor/listen/spec/spec_helper.rb +4 -0
  196. data/vendor/listen/spec/support/adapter_helper.rb +52 -15
  197. data/vendor/listen/spec/support/directory_record_helper.rb +7 -5
  198. data/vendor/listen/spec/support/listeners_helper.rb +30 -7
  199. metadata +310 -300
  200. data/CONTRIBUTING +0 -3
  201. data/ext/mkrf_conf.rb +0 -27
  202. data/lib/sass/script/value/deprecated_false.rb +0 -55
  203. data/lib/sass/scss/script_lexer.rb +0 -15
  204. data/lib/sass/scss/script_parser.rb +0 -25
  205. data/vendor/listen/lib/listen/dependency_manager.rb +0 -126
  206. data/vendor/listen/lib/listen/multi_listener.rb +0 -143
  207. data/vendor/listen/spec/listen/dependency_manager_spec.rb +0 -107
  208. data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -174
@@ -17,6 +17,11 @@ module Sass::Script::Functions::UserFunctions
17
17
  return Sass::Script::Value::Null.new
18
18
  end
19
19
 
20
+ def set_a_global_variable(name, value)
21
+ environment.set_global_var(name.value, value)
22
+ return Sass::Script::Value::Null.new
23
+ end
24
+
20
25
  def get_a_variable(name)
21
26
  environment.var(name.value) || Sass::Script::Value::String.new("undefined")
22
27
  end
@@ -26,7 +31,7 @@ module Sass::Script::Functions
26
31
  include Sass::Script::Functions::UserFunctions
27
32
  end
28
33
 
29
- class SassEngineTest < Test::Unit::TestCase
34
+ class SassEngineTest < MiniTest::Test
30
35
  FAKE_FILE_NAME = __FILE__.gsub(/rb$/,"sass")
31
36
  # A map of erroneous Sass documents to the error messages they should produce.
32
37
  # The error messages may be arrays;
@@ -68,12 +73,11 @@ MSG
68
73
  "$a: 1b >= 2c" => "Incompatible units: 'c' and 'b'.",
69
74
  "a\n b: 1b * 2c" => "2b*c isn't a valid CSS value.",
70
75
  "a\n b: 1b % 2c" => "Incompatible units: 'c' and 'b'.",
71
- "$a: 2px + #ccc" => "Cannot add a number with units (2px) to a color (#cccccc).",
72
- "$a: #ccc + 2px" => "Cannot add a number with units (2px) to a color (#cccccc).",
76
+ "$a: 2px + #ccc" => "Cannot add a number with units (2px) to a color (#ccc).",
77
+ "$a: #ccc + 2px" => "Cannot add a number with units (2px) to a color (#ccc).",
73
78
  "& a\n :b c" => ["Base-level rules cannot contain the parent-selector-referencing character '&'.", 1],
74
79
  "a\n :b\n c" => "Illegal nesting: Only properties may be nested beneath properties.",
75
80
  "$a: b\n :c d\n" => "Illegal nesting: Nothing may be nested beneath variable declarations.",
76
- "$a: b\n :c d\n" => "Illegal nesting: Nothing may be nested beneath variable declarations.",
77
81
  "@import templates/basic\n foo" => "Illegal nesting: Nothing may be nested beneath import directives.",
78
82
  "foo\n @import foo.css" => "CSS import directives may only be used at the root of a document.",
79
83
  "@if true\n @import foo" => "Import directives may not be used within control directives or mixins.",
@@ -141,6 +145,8 @@ MSG
141
145
  '@while' => "Invalid while directive '@while': expected expression.",
142
146
  '@debug' => "Invalid debug directive '@debug': expected expression.",
143
147
  %Q{@debug "a message"\n "nested message"} => "Illegal nesting: Nothing may be nested beneath debug directives.",
148
+ '@error' => "Invalid error directive '@error': expected expression.",
149
+ %Q{@error "a message"\n "nested message"} => "Illegal nesting: Nothing may be nested beneath error directives.",
144
150
  '@warn' => "Invalid warn directive '@warn': expected expression.",
145
151
  %Q{@warn "a message"\n "nested message"} => "Illegal nesting: Nothing may be nested beneath warn directives.",
146
152
  "/* foo\n bar\n baz" => "Inconsistent indentation: previous line was indented by 4 spaces, but this line was indented by 2 spaces.",
@@ -171,6 +177,8 @@ MSG
171
177
  "& foo\n bar: baz\n blat: bang" => ["Base-level rules cannot contain the parent-selector-referencing character '&'.", 1],
172
178
  "a\n b: c\n& foo\n bar: baz\n blat: bang" => ["Base-level rules cannot contain the parent-selector-referencing character '&'.", 3],
173
179
  "@" => "Invalid directive: '@'.",
180
+ "$r: 20em * #ccc" => ["Cannot multiply a number with units (20em) to a color (#ccc).", 1],
181
+ "$r: #ccc / 1em" => ["Cannot divide a number with units (1em) to a color (#ccc).", 1],
174
182
  }
175
183
 
176
184
  def teardown
@@ -280,10 +288,10 @@ ERROR
280
288
  def test_exception_line
281
289
  to_render = <<SASS
282
290
  rule
283
- :prop val
291
+ prop: val
284
292
  // comment!
285
293
 
286
- :broken
294
+ broken:
287
295
  SASS
288
296
  begin
289
297
  Sass::Engine.new(to_render).render
@@ -297,10 +305,10 @@ SASS
297
305
  def test_exception_location
298
306
  to_render = <<SASS
299
307
  rule
300
- :prop val
308
+ prop: val
301
309
  // comment!
302
310
 
303
- :broken
311
+ broken:
304
312
  SASS
305
313
  begin
306
314
  Sass::Engine.new(to_render, :filename => FAKE_FILE_NAME, :line => (__LINE__-7)).render
@@ -526,9 +534,9 @@ ERR
526
534
  opts = {:full_exception => true, :line => 362}
527
535
  render(("a\n b: c\n" * 10) + "d\n e:\n" + ("f\n g: h\n" * 10), opts)
528
536
  rescue Sass::SyntaxError => e
529
- assert_equal(<<CSS, Sass::SyntaxError.exception_to_css(e, opts).split("\n")[0..15].join("\n"))
537
+ assert_equal(<<CSS, Sass::SyntaxError.exception_to_css(e, opts[:line]).split("\n")[0..15].join("\n"))
530
538
  /*
531
- Syntax error: Invalid property: "e:" (no value).
539
+ Error: Invalid property: "e:" (no value).
532
540
  on line 383 of test_exception_css_with_offset_inline.sass
533
541
 
534
542
  378: a
@@ -548,8 +556,7 @@ CSS
548
556
  end
549
557
 
550
558
  def test_exception_css_with_mixins
551
- opts = {:full_exception => true}
552
- render(<<SASS, opts)
559
+ render(<<SASS, :full_exception => true)
553
560
  =error-mixin($a)
554
561
  color: $a * 1em * 1px
555
562
 
@@ -560,9 +567,9 @@ CSS
560
567
  +outer-mixin(12)
561
568
  SASS
562
569
  rescue Sass::SyntaxError => e
563
- assert_equal(<<CSS, Sass::SyntaxError.exception_to_css(e, opts).split("\n")[0..13].join("\n"))
570
+ assert_equal(<<CSS, Sass::SyntaxError.exception_to_css(e).split("\n")[0..13].join("\n"))
564
571
  /*
565
- Syntax error: 12em*px isn't a valid CSS value.
572
+ Error: 12em*px isn't a valid CSS value.
566
573
  on line 2 of test_exception_css_with_mixins_inline.sass, in `error-mixin'
567
574
  from line 5 of test_exception_css_with_mixins_inline.sass, in `outer-mixin'
568
575
  from line 8 of test_exception_css_with_mixins_inline.sass
@@ -580,8 +587,7 @@ CSS
580
587
  end
581
588
 
582
589
  def test_cssize_exception_css
583
- opts = {:full_exception => true}
584
- render(<<SASS, opts)
590
+ render(<<SASS, :full_exception => true)
585
591
  .filler
586
592
  stuff: "stuff!"
587
593
 
@@ -591,9 +597,9 @@ a: b
591
597
  a: b
592
598
  SASS
593
599
  rescue Sass::SyntaxError => e
594
- assert_equal(<<CSS, Sass::SyntaxError.exception_to_css(e, opts).split("\n")[0..11].join("\n"))
600
+ assert_equal(<<CSS, Sass::SyntaxError.exception_to_css(e).split("\n")[0..11].join("\n"))
595
601
  /*
596
- Syntax error: Properties are only allowed within rules, directives, mixin includes, or other properties.
602
+ Error: Properties are only allowed within rules, directives, mixin includes, or other properties.
597
603
  on line 4 of test_cssize_exception_css_inline.sass
598
604
 
599
605
  1: .filler
@@ -613,12 +619,12 @@ CSS
613
619
  end
614
620
 
615
621
  def test_http_import
616
- assert_equal("@import url(http://fonts.googleapis.com/css?family=Droid+Sans);\n",
622
+ assert_equal("@import \"http://fonts.googleapis.com/css?family=Droid+Sans\";\n",
617
623
  render("@import \"http://fonts.googleapis.com/css?family=Droid+Sans\""))
618
624
  end
619
625
 
620
626
  def test_protocol_relative_import
621
- assert_equal("@import url(//fonts.googleapis.com/css?family=Droid+Sans);\n",
627
+ assert_equal("@import \"//fonts.googleapis.com/css?family=Droid+Sans\";\n",
622
628
  render("@import \"//fonts.googleapis.com/css?family=Droid+Sans\""))
623
629
  end
624
630
 
@@ -648,18 +654,18 @@ SASS
648
654
 
649
655
  def test_sass_import
650
656
  sassc_file = sassc_path("importee")
651
- assert !File.exists?(sassc_file)
657
+ assert !File.exist?(sassc_file)
652
658
  renders_correctly "import", { :style => :compact, :load_paths => [File.dirname(__FILE__) + "/templates"] }
653
- assert File.exists?(sassc_file)
659
+ assert File.exist?(sassc_file)
654
660
  end
655
661
 
656
662
  def test_sass_pathname_import
657
663
  sassc_file = sassc_path("importee")
658
- assert !File.exists?(sassc_file)
664
+ assert !File.exist?(sassc_file)
659
665
  renders_correctly("import",
660
666
  :style => :compact,
661
667
  :load_paths => [Pathname.new(File.dirname(__FILE__) + "/templates")])
662
- assert File.exists?(sassc_file)
668
+ assert File.exist?(sassc_file)
663
669
  end
664
670
 
665
671
  def test_import_from_global_load_paths
@@ -675,7 +681,6 @@ SASS
675
681
  def test_nonexistent_import
676
682
  assert_raise_message(Sass::SyntaxError, <<ERR.rstrip) do
677
683
  File to import not found or unreadable: nonexistent.sass.
678
- Load path: #{Dir.pwd}
679
684
  ERR
680
685
  render("@import nonexistent.sass")
681
686
  end
@@ -684,30 +689,29 @@ ERR
684
689
  def test_nonexistent_extensionless_import
685
690
  assert_raise_message(Sass::SyntaxError, <<ERR.rstrip) do
686
691
  File to import not found or unreadable: nonexistent.
687
- Load path: #{Dir.pwd}
688
692
  ERR
689
693
  render("@import nonexistent")
690
694
  end
691
695
  end
692
696
 
693
697
  def test_no_cache
694
- assert !File.exists?(sassc_path("importee"))
698
+ assert !File.exist?(sassc_path("importee"))
695
699
  renders_correctly("import", {
696
700
  :style => :compact, :cache => false,
697
701
  :load_paths => [File.dirname(__FILE__) + "/templates"],
698
702
  })
699
- assert !File.exists?(sassc_path("importee"))
703
+ assert !File.exist?(sassc_path("importee"))
700
704
  end
701
705
 
702
706
  def test_import_in_rule
703
707
  assert_equal(<<CSS, render(<<SASS, :load_paths => [File.dirname(__FILE__) + '/templates/']))
704
708
  .foo #foo {
705
- background-color: #bbaaff; }
709
+ background-color: #baf; }
706
710
 
707
711
  .bar {
708
712
  a: b; }
709
713
  .bar #foo {
710
- background-color: #bbaaff; }
714
+ background-color: #baf; }
711
715
  CSS
712
716
  .foo
713
717
  @import partial
@@ -745,22 +749,22 @@ SASS
745
749
 
746
750
  def test_basic_multiline_selector
747
751
  assert_equal("#foo #bar,\n#baz #boom {\n foo: bar; }\n",
748
- render("#foo #bar,\n#baz #boom\n :foo bar"))
752
+ render("#foo #bar,\n#baz #boom\n foo: bar"))
749
753
  assert_equal("#foo #bar,\n#foo #baz {\n foo: bar; }\n",
750
- render("#foo\n #bar,\n #baz\n :foo bar"))
754
+ render("#foo\n #bar,\n #baz\n foo: bar"))
751
755
  assert_equal("#foo,\n#bar {\n foo: bar; }\n #foo #baz,\n #bar #baz {\n foo: bar; }\n",
752
- render("#foo,\n#bar\n :foo bar\n #baz\n :foo bar"))
756
+ render("#foo,\n#bar\n foo: bar\n #baz\n foo: bar"))
753
757
  assert_equal("#foo #bar, #baz #boom { foo: bar; }\n",
754
- render("#foo #bar,\n#baz #boom\n :foo bar", :style => :compact))
758
+ render("#foo #bar,\n#baz #boom\n foo: bar", :style => :compact))
755
759
 
756
760
  assert_equal("#foo #bar,#baz #boom{foo:bar}\n",
757
- render("#foo #bar,\n#baz #boom\n :foo bar", :style => :compressed))
761
+ render("#foo #bar,\n#baz #boom\n foo: bar", :style => :compressed))
758
762
 
759
763
  assert_equal("#foo #bar,\n#baz #boom {\n foo: bar; }\n",
760
- render("#foo #bar,,\n,#baz #boom,\n :foo bar"))
764
+ render("#foo #bar,,\n,#baz #boom,\n foo: bar"))
761
765
 
762
766
  assert_equal("#bip #bop {\n foo: bar; }\n",
763
- render("#bip #bop,, ,\n :foo bar"))
767
+ render("#bip #bop,, ,\n foo: bar"))
764
768
  end
765
769
 
766
770
  def test_complex_multiline_selector
@@ -779,7 +783,7 @@ SASS
779
783
  end
780
784
 
781
785
  begin
782
- render("a\n :b c", :property_syntax => :new)
786
+ silence_warnings {render("a\n :b c", :property_syntax => :new)}
783
787
  assert_equal(2, e.sass_line)
784
788
  rescue Sass::SyntaxError => e
785
789
  assert_equal("Illegal property syntax: can't use old syntax when :property_syntax => :new is set.",
@@ -802,53 +806,53 @@ SASS
802
806
  def test_directive
803
807
  assert_equal("@a b;\n", render("@a b"))
804
808
 
805
- assert_equal("@a {\n b: c; }\n", render("@a\n :b c"))
806
- assert_equal("@a { b: c; }\n", render("@a\n :b c", :style => :compact))
807
- assert_equal("@a {\n b: c;\n}\n", render("@a\n :b c", :style => :expanded))
808
- assert_equal("@a{b:c}\n", render("@a\n :b c", :style => :compressed))
809
+ assert_equal("@a {\n b: c; }\n", render("@a\n b: c"))
810
+ assert_equal("@a { b: c; }\n", render("@a\n b: c", :style => :compact))
811
+ assert_equal("@a {\n b: c;\n}\n", render("@a\n b: c", :style => :expanded))
812
+ assert_equal("@a{b:c}\n", render("@a\n b: c", :style => :compressed))
809
813
 
810
814
  assert_equal("@a {\n b: c;\n d: e; }\n",
811
- render("@a\n :b c\n :d e"))
815
+ render("@a\n b: c\n d: e"))
812
816
  assert_equal("@a { b: c; d: e; }\n",
813
- render("@a\n :b c\n :d e", :style => :compact))
817
+ render("@a\n b: c\n d: e", :style => :compact))
814
818
  assert_equal("@a {\n b: c;\n d: e;\n}\n",
815
- render("@a\n :b c\n :d e", :style => :expanded))
819
+ render("@a\n b: c\n d: e", :style => :expanded))
816
820
  assert_equal("@a{b:c;d:e}\n",
817
- render("@a\n :b c\n :d e", :style => :compressed))
821
+ render("@a\n b: c\n d: e", :style => :compressed))
818
822
 
819
823
  assert_equal("@a {\n #b {\n c: d; } }\n",
820
- render("@a\n #b\n :c d"))
824
+ render("@a\n #b\n c: d"))
821
825
  assert_equal("@a { #b { c: d; } }\n",
822
- render("@a\n #b\n :c d", :style => :compact))
826
+ render("@a\n #b\n c: d", :style => :compact))
823
827
  assert_equal("@a {\n #b {\n c: d;\n }\n}\n",
824
- render("@a\n #b\n :c d", :style => :expanded))
828
+ render("@a\n #b\n c: d", :style => :expanded))
825
829
  assert_equal("@a{#b{c:d}}\n",
826
- render("@a\n #b\n :c d", :style => :compressed))
830
+ render("@a\n #b\n c: d", :style => :compressed))
827
831
 
828
832
  assert_equal("@a {\n #b {\n a: b; }\n #b #c {\n d: e; } }\n",
829
- render("@a\n #b\n :a b\n #c\n :d e"))
833
+ render("@a\n #b\n a: b\n #c\n d: e"))
830
834
  assert_equal("@a { #b { a: b; }\n #b #c { d: e; } }\n",
831
- render("@a\n #b\n :a b\n #c\n :d e", :style => :compact))
835
+ render("@a\n #b\n a: b\n #c\n d: e", :style => :compact))
832
836
  assert_equal("@a {\n #b {\n a: b;\n }\n #b #c {\n d: e;\n }\n}\n",
833
- render("@a\n #b\n :a b\n #c\n :d e", :style => :expanded))
837
+ render("@a\n #b\n a: b\n #c\n d: e", :style => :expanded))
834
838
  assert_equal("@a{#b{a:b}#b #c{d:e}}\n",
835
- render("@a\n #b\n :a b\n #c\n :d e", :style => :compressed))
839
+ render("@a\n #b\n a: b\n #c\n d: e", :style => :compressed))
836
840
 
837
841
  assert_equal("@a {\n #foo,\n #bar {\n b: c; } }\n",
838
- render("@a\n #foo, \n #bar\n :b c"))
842
+ render("@a\n #foo, \n #bar\n b: c"))
839
843
  assert_equal("@a { #foo, #bar { b: c; } }\n",
840
- render("@a\n #foo, \n #bar\n :b c", :style => :compact))
844
+ render("@a\n #foo, \n #bar\n b: c", :style => :compact))
841
845
  assert_equal("@a {\n #foo,\n #bar {\n b: c;\n }\n}\n",
842
- render("@a\n #foo, \n #bar\n :b c", :style => :expanded))
846
+ render("@a\n #foo, \n #bar\n b: c", :style => :expanded))
843
847
  assert_equal("@a{#foo,#bar{b:c}}\n",
844
- render("@a\n #foo, \n #bar\n :b c", :style => :compressed))
848
+ render("@a\n #foo, \n #bar\n b: c", :style => :compressed))
845
849
 
846
850
  to_render = <<END
847
851
  @a
848
- :b c
852
+ b: c
849
853
  #d
850
- :e f
851
- :g h
854
+ e: f
855
+ g: h
852
856
  END
853
857
  rendered = <<END
854
858
  @a { b: c;
@@ -1026,7 +1030,6 @@ SASS
1026
1030
  @-webkit-keyframes warm {
1027
1031
  from {
1028
1032
  color: black; }
1029
-
1030
1033
  to {
1031
1034
  color: red; } }
1032
1035
  CSS
@@ -1130,9 +1133,15 @@ SASS
1130
1133
  end
1131
1134
 
1132
1135
  def test_default_values_for_mixin_arguments
1133
- assert_equal("white {\n color: white; }\n\nblack {\n color: black; }\n", render(<<SASS))
1136
+ assert_equal(<<CSS, render(<<SASS))
1137
+ white {
1138
+ color: #FFF; }
1139
+
1140
+ black {
1141
+ color: #000; }
1142
+ CSS
1134
1143
  =foo($a: #FFF)
1135
- :color $a
1144
+ color: $a
1136
1145
  white
1137
1146
  +foo
1138
1147
  black
@@ -1140,25 +1149,25 @@ black
1140
1149
  SASS
1141
1150
  assert_equal(<<CSS, render(<<SASS))
1142
1151
  one {
1143
- color: white;
1152
+ color: #fff;
1144
1153
  padding: 1px;
1145
1154
  margin: 4px; }
1146
1155
 
1147
1156
  two {
1148
- color: white;
1157
+ color: #fff;
1149
1158
  padding: 2px;
1150
1159
  margin: 5px; }
1151
1160
 
1152
1161
  three {
1153
- color: white;
1162
+ color: #fff;
1154
1163
  padding: 2px;
1155
1164
  margin: 3px; }
1156
1165
  CSS
1157
1166
  $a: 5px
1158
1167
  =foo($a, $b: 1px, $c: 3px + $b)
1159
- :color $a
1160
- :padding $b
1161
- :margin $c
1168
+ color: $a
1169
+ padding: $b
1170
+ margin: $c
1162
1171
  one
1163
1172
  +foo(#fff)
1164
1173
  two
@@ -1168,17 +1177,17 @@ three
1168
1177
  SASS
1169
1178
  assert_equal(<<CSS, render(<<SASS))
1170
1179
  one {
1171
- color: white;
1180
+ color: #fff;
1172
1181
  padding: 1px;
1173
1182
  margin: 4px; }
1174
1183
 
1175
1184
  two {
1176
- color: white;
1185
+ color: #fff;
1177
1186
  padding: 2px;
1178
1187
  margin: 5px; }
1179
1188
 
1180
1189
  three {
1181
- color: white;
1190
+ color: #fff;
1182
1191
  padding: 2px;
1183
1192
  margin: 3px; }
1184
1193
  CSS
@@ -1383,7 +1392,7 @@ CSS
1383
1392
  $variable: 0
1384
1393
  bar
1385
1394
  $local: 10
1386
- -no-op: set-a-variable(variable, 5)
1395
+ -no-op: set-a-global-variable(variable, 5)
1387
1396
  a: $variable
1388
1397
  SASS
1389
1398
  end
@@ -1617,31 +1626,6 @@ a
1617
1626
  SASS
1618
1627
  end
1619
1628
 
1620
- def test_variable_scope
1621
- silence_warnings {assert_equal(<<CSS, render(<<SASS))}
1622
- a {
1623
- b-1: c;
1624
- b-2: c;
1625
- d: 12; }
1626
-
1627
- b {
1628
- d: 17; }
1629
- CSS
1630
- $i: 12
1631
- a
1632
- @for $i from 1 through 2
1633
- b-\#{$i}: c
1634
- d: $i
1635
-
1636
- =foo
1637
- $i: 17
1638
-
1639
- b
1640
- +foo
1641
- d: $i
1642
- SASS
1643
- end
1644
-
1645
1629
  def test_hyphen_underscore_insensitive_variables
1646
1630
  assert_equal(<<CSS, render(<<SASS))
1647
1631
  d {
@@ -1684,7 +1668,7 @@ SASS
1684
1668
  end
1685
1669
 
1686
1670
  def test_argument_error
1687
- assert_raise(Sass::SyntaxError) { render("a\n b: hsl(1)") }
1671
+ assert_raises(Sass::SyntaxError) { render("a\n b: hsl(1)") }
1688
1672
  end
1689
1673
 
1690
1674
  def test_comments_at_the_top_of_a_document
@@ -2029,10 +2013,10 @@ $var: "bar"
2029
2013
  SASS
2030
2014
  end
2031
2015
 
2032
- def test_interpolation_doesnt_deep_unquote_strings
2016
+ def test_interpolation_deep_unquotes_strings
2033
2017
  assert_equal(<<CSS, render(<<SASS))
2034
2018
  .foo {
2035
- a: "bar" "baz"; }
2019
+ a: bar baz; }
2036
2020
  CSS
2037
2021
  .foo
2038
2022
  a: \#{"bar" "baz"}
@@ -2074,20 +2058,21 @@ SASS
2074
2058
  end
2075
2059
 
2076
2060
  def test_warn_with_imports
2061
+ prefix = Sass::Util.cleanpath(File.dirname(__FILE__)).to_s
2077
2062
  expected_warning = <<WARN
2078
2063
  WARNING: In the main file
2079
- on line 1 of #{File.dirname(__FILE__)}/templates/warn.sass
2064
+ on line 1 of #{prefix}/templates/warn.sass
2080
2065
 
2081
2066
  WARNING: Imported
2082
- on line 1 of #{File.dirname(__FILE__)}/templates/warn_imported.sass
2083
- from line 2 of #{File.dirname(__FILE__)}/templates/warn.sass
2067
+ on line 1 of #{prefix}/templates/warn_imported.sass
2068
+ from line 2 of #{prefix}/templates/warn.sass
2084
2069
 
2085
2070
  WARNING: In an imported mixin
2086
- on line 4 of #{File.dirname(__FILE__)}/templates/warn_imported.sass, in `emits-a-warning'
2087
- from line 3 of #{File.dirname(__FILE__)}/templates/warn.sass
2071
+ on line 4 of #{prefix}/templates/warn_imported.sass, in `emits-a-warning'
2072
+ from line 3 of #{prefix}/templates/warn.sass
2088
2073
  WARN
2089
2074
  assert_warning expected_warning do
2090
- renders_correctly "warn", :style => :compact, :load_paths => [File.dirname(__FILE__) + "/templates"]
2075
+ renders_correctly "warn", :style => :compact, :load_paths => ["#{prefix}/templates"]
2091
2076
  end
2092
2077
  end
2093
2078
 
@@ -2472,6 +2457,18 @@ SASS
2472
2457
 
2473
2458
  # Regression tests
2474
2459
 
2460
+ def test_interpolation_in_multiline_selector
2461
+ assert_equal(<<CSS, render(<<SASS))
2462
+ .foo,
2463
+ .bar {
2464
+ a: b; }
2465
+ CSS
2466
+ .foo,
2467
+ \#{".bar"}
2468
+ a: b
2469
+ SASS
2470
+ end
2471
+
2475
2472
  def test_list_separator_with_arg_list
2476
2473
  assert_equal(<<CSS, render(<<SASS))
2477
2474
  .test {
@@ -2601,29 +2598,29 @@ SASS
2601
2598
  border-style: solid; }
2602
2599
  RESULT
2603
2600
  .box
2604
- :border
2605
- //:color black
2606
- :style solid
2601
+ border:
2602
+ //color: black
2603
+ style: solid
2607
2604
  SOURCE
2608
2605
 
2609
2606
  assert_equal(<<RESULT, render(<<SOURCE))
2610
2607
  .box {
2611
- /* :color black */
2608
+ /* color: black */
2612
2609
  border-style: solid; }
2613
2610
  RESULT
2614
2611
  .box
2615
- :border
2616
- /* :color black
2617
- :style solid
2612
+ border:
2613
+ /* color: black
2614
+ style: solid
2618
2615
  SOURCE
2619
2616
 
2620
2617
  assert_equal(<<RESULT, render(<<SOURCE, :style => :compressed))
2621
2618
  .box{border-style:solid}
2622
2619
  RESULT
2623
2620
  .box
2624
- :border
2625
- /*:color black
2626
- :style solid
2621
+ border:
2622
+ /*color: black
2623
+ style: solid
2627
2624
  SOURCE
2628
2625
  end
2629
2626
 
@@ -2898,145 +2895,6 @@ CSS
2898
2895
  SASS
2899
2896
  end
2900
2897
 
2901
- # Encodings
2902
-
2903
- unless Sass::Util.ruby1_8?
2904
- def test_encoding_error
2905
- render("foo\nbar\nb\xFEaz".force_encoding("utf-8"))
2906
- assert(false, "Expected exception")
2907
- rescue Sass::SyntaxError => e
2908
- assert_equal(3, e.sass_line)
2909
- assert_equal('Invalid UTF-8 character "\xFE"', e.message)
2910
- end
2911
-
2912
- def test_ascii_incompatible_encoding_error
2913
- template = "foo\nbar\nb_z".encode("utf-16le")
2914
- template[9] = "\xFE".force_encoding("utf-16le")
2915
- render(template)
2916
- assert(false, "Expected exception")
2917
- rescue Sass::SyntaxError => e
2918
- assert_equal(3, e.sass_line)
2919
- assert_equal('Invalid UTF-16LE character "\xFE"', e.message)
2920
- end
2921
-
2922
- def test_same_charset_as_encoding
2923
- assert_renders_encoded(<<CSS, <<SASS)
2924
- @charset "UTF-8";
2925
- fóó {
2926
- a: b; }
2927
- CSS
2928
- @charset "utf-8"
2929
- fóó
2930
- a: b
2931
- SASS
2932
- end
2933
-
2934
- def test_different_charset_than_encoding
2935
- assert_renders_encoded(<<CSS.force_encoding("IBM866"), <<SASS)
2936
- @charset "IBM866";
2937
- fóó {
2938
- a: b; }
2939
- CSS
2940
- @charset "ibm866"
2941
- fóó
2942
- a: b
2943
- SASS
2944
- end
2945
-
2946
- def test_different_encoding_than_system
2947
- assert_renders_encoded(<<CSS.encode("IBM866"), <<SASS.encode("IBM866"))
2948
- @charset "IBM866";
2949
- тАЬ {
2950
- a: b; }
2951
- CSS
2952
- тАЬ
2953
- a: b
2954
- SASS
2955
- end
2956
-
2957
- def test_multibyte_charset
2958
- assert_renders_encoded(<<CSS.encode("UTF-16LE"), <<SASS.encode("UTF-16LE").force_encoding("UTF-8"))
2959
- @charset "UTF-16LE";
2960
- fóó {
2961
- a: b; }
2962
- CSS
2963
- @charset "utf-16le"
2964
- fóó
2965
- a: b
2966
- SASS
2967
- end
2968
-
2969
- def test_multibyte_charset_without_endian_specifier
2970
- assert_renders_encoded(<<CSS.encode("UTF-32BE"), <<SASS.encode("UTF-32BE").force_encoding("UTF-8"))
2971
- @charset "UTF-32BE";
2972
- fóó {
2973
- a: b; }
2974
- CSS
2975
- @charset "utf-32"
2976
- fóó
2977
- a: b
2978
- SASS
2979
- end
2980
-
2981
- def test_utf8_bom
2982
- assert_renders_encoded(<<CSS, <<SASS.force_encoding("BINARY"))
2983
- @charset "UTF-8";
2984
- fóó {
2985
- a: b; }
2986
- CSS
2987
- \uFEFFfóó
2988
- a: b
2989
- SASS
2990
- end
2991
-
2992
- def test_utf16le_bom
2993
- assert_renders_encoded(<<CSS.encode("UTF-16LE"), <<SASS.encode("UTF-16LE").force_encoding("BINARY"))
2994
- @charset "UTF-16LE";
2995
- fóó {
2996
- a: b; }
2997
- CSS
2998
- \uFEFFfóó
2999
- a: b
3000
- SASS
3001
- end
3002
-
3003
- def test_utf32be_bom
3004
- assert_renders_encoded(<<CSS.encode("UTF-32BE"), <<SASS.encode("UTF-32BE").force_encoding("BINARY"))
3005
- @charset "UTF-32BE";
3006
- fóó {
3007
- a: b; }
3008
- CSS
3009
- \uFEFFfóó
3010
- a: b
3011
- SASS
3012
- end
3013
-
3014
- # Encoding Regression Test
3015
-
3016
- def test_multibyte_prop_name
3017
- assert_equal(<<CSS, render(<<SASS))
3018
- @charset "UTF-8";
3019
- #bar {
3020
- cölor: blue; }
3021
- CSS
3022
- #bar
3023
- cölor: blue
3024
- SASS
3025
- end
3026
-
3027
- def test_multibyte_and_interpolation
3028
- assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))
3029
- #bar {
3030
- background: a 0%; }
3031
- CSS
3032
- #bar {
3033
- // 
3034
- background: \#{a} 0%;
3035
- }
3036
- SCSS
3037
- end
3038
- end
3039
-
3040
2898
  def test_original_filename_set
3041
2899
  importer = MockImporter.new
3042
2900
  importer.add_import("imported", "div{color:red}")
@@ -3057,7 +2915,7 @@ SCSS
3057
2915
  assert_equal <<CSS, render(<<SASS)
3058
2916
  div {
3059
2917
  maximum: 1.00000001;
3060
- too-much: 1.0; }
2918
+ too-much: 1; }
3061
2919
  CSS
3062
2920
  div
3063
2921
  maximum : 1.00000001
@@ -3287,6 +3145,13 @@ test_debug_inspects_sass_objects_inline.scss:1 DEBUG: (a: 1, b: 2)
3287
3145
  END
3288
3146
  end
3289
3147
 
3148
+ def test_error_throws_sass_objects
3149
+ assert_raise_message(Sass::SyntaxError, "(a: 1, b: 2)") {render("@error (a: 1, b: 2)")}
3150
+ assert_raise_message(Sass::SyntaxError, "(a: 1, b: 2)") do
3151
+ render("$map: (a: 1, b: 2); @error $map", :syntax => :scss)
3152
+ end
3153
+ end
3154
+
3290
3155
  def test_default_arg_before_splat
3291
3156
  assert_equal <<CSS, render(<<SASS, :syntax => :scss)
3292
3157
  .foo-positional {
@@ -3315,10 +3180,227 @@ CSS
3315
3180
  SASS
3316
3181
  end
3317
3182
 
3183
+ def test_keyframes
3184
+ assert_equal <<CSS, render(<<SASS)
3185
+ @keyframes identifier {
3186
+ 0% {
3187
+ top: 0;
3188
+ left: 0; }
3189
+ 30% {
3190
+ top: 50px; }
3191
+ 68%, 72% {
3192
+ left: 50px; }
3193
+ 100% {
3194
+ top: 100px;
3195
+ left: 100%; } }
3196
+ CSS
3197
+ @keyframes identifier
3198
+ 0%
3199
+ top: 0
3200
+ left: 0
3201
+ \#{"30%"}
3202
+ top: 50px
3203
+ 68%, 72%
3204
+ left: 50px
3205
+ 100%
3206
+ top: 100px
3207
+ left: 100%
3208
+ SASS
3209
+ end
3210
+
3211
+ def test_prefixed_keyframes
3212
+ assert_equal <<CSS, render(<<SASS)
3213
+ @-moz-keyframes identifier {
3214
+ 0% {
3215
+ top: 0;
3216
+ left: 0; }
3217
+ 30% {
3218
+ top: 50px; }
3219
+ 68%, 72% {
3220
+ left: 50px; }
3221
+ 100% {
3222
+ top: 100px;
3223
+ left: 100%; } }
3224
+ CSS
3225
+ @-moz-keyframes identifier
3226
+ 0%
3227
+ top: 0
3228
+ left: 0
3229
+ \#{"30%"}
3230
+ top: 50px
3231
+ 68%, 72%
3232
+ left: 50px
3233
+ 100%
3234
+ top: 100px
3235
+ left: 100%
3236
+ SASS
3237
+ end
3238
+
3239
+ def test_uppercase_keyframes
3240
+ assert_equal <<CSS, render(<<SASS)
3241
+ @KEYFRAMES identifier {
3242
+ 0% {
3243
+ top: 0;
3244
+ left: 0; }
3245
+ 30% {
3246
+ top: 50px; }
3247
+ 68%, 72% {
3248
+ left: 50px; }
3249
+ 100% {
3250
+ top: 100px;
3251
+ left: 100%; } }
3252
+ CSS
3253
+ @KEYFRAMES identifier
3254
+ 0%
3255
+ top: 0
3256
+ left: 0
3257
+ \#{"30%"}
3258
+ top: 50px
3259
+ 68%, 72%
3260
+ left: 50px
3261
+ 100%
3262
+ top: 100px
3263
+ left: 100%
3264
+ SASS
3265
+ end
3266
+
3267
+ def test_compressed_unknown_directive
3268
+ assert_equal(<<CSS, render(<<SASS, :style => :compressed))
3269
+ x{@foo;a:b;@bar}
3270
+ CSS
3271
+ x
3272
+ @foo
3273
+ a: b
3274
+ @bar
3275
+ SASS
3276
+ end
3277
+
3278
+ def test_compressed_unknown_directive_in_directive
3279
+ assert_equal(<<CSS, render(<<SASS, :style => :compressed))
3280
+ @x{@foo;a:b;@bar}
3281
+ CSS
3282
+ @x
3283
+ @foo
3284
+ a: b
3285
+ @bar
3286
+ SASS
3287
+ end
3288
+
3289
+ def test_compressed_unknown_directive_with_children_in_directive
3290
+ assert_equal(<<CSS, render(<<SASS, :style => :compressed))
3291
+ @x{@foo{a:b}c:d;@bar{e:f}}
3292
+ CSS
3293
+ @x
3294
+ @foo
3295
+ a: b
3296
+ c: d
3297
+ @bar
3298
+ e: f
3299
+ SASS
3300
+ end
3301
+
3302
+ def test_compressed_rule_in_directive
3303
+ assert_equal(<<CSS, render(<<SASS, :style => :compressed))
3304
+ @x{foo{a:b}c:d;bar{e:f}}
3305
+ CSS
3306
+ @x
3307
+ foo
3308
+ a: b
3309
+ c: d
3310
+ bar
3311
+ e: f
3312
+ SASS
3313
+ end
3314
+
3315
+ def test_import_two_css_files_issue_1806
3316
+ assert_equal(<<CSS, render(<<SASS, :syntax => :scss, :style => :compressed))
3317
+ @import url(\"foo.css\");@import url(\"bar.css\");@import url(\"baz.css\")
3318
+ CSS
3319
+ @import url("foo.css");
3320
+ @import url("bar.css");
3321
+ @import url("baz.css");
3322
+ SASS
3323
+ end
3324
+
3325
+ def test_numeric_formatting_of_integers
3326
+ assert_equal(<<CSS, render(<<SASS, :syntax => :scss, :style => :compressed))
3327
+ a{near:3.00001;plus:3;minus:3;negative:-3}
3328
+ CSS
3329
+ a {
3330
+ near: (3 + 0.00001);
3331
+ plus: (3 + 0.0000001);
3332
+ minus: (3 - 0.0000001);
3333
+ negative: (-3 + 0.0000001);
3334
+ }
3335
+ SASS
3336
+ end
3337
+
3338
+ def test_escaped_semicolons_are_not_compressed
3339
+ assert_equal(<<'CSS', render(<<'SASS', :syntax => :scss, :style => :compressed))
3340
+ div{color:#f00000\9\0\;}
3341
+ CSS
3342
+ div {
3343
+ color: #f00000\9\0\;
3344
+ }
3345
+ SASS
3346
+ end
3347
+
3348
+ def test_compressed_output_of_nth_selectors
3349
+ assert_equal(<<CSS, render(<<SASS, :syntax => :scss, :style => :compressed))
3350
+ :nth-of-type(2n-1),:nth-child(2n-1),:nth(2n-1),:nth-of-type(2n-1),:nth-of-type(2n-1){color:red}:nth-of-type(2n+1),:nth-child(2n+1),:nth(2n+1),:nth-of-type(2n+1),:nth-of-type(2n+1){color:red}
3351
+ CSS
3352
+ :nth-of-type(2n-1), :nth-child(2n- 1), :nth(2n -1), :nth-of-type(2n - 1), :nth-of-type( 2n - 1 ) {
3353
+ color: red }
3354
+ :nth-of-type(2n+1), :nth-child(2n+ 1), :nth(2n +1), :nth-of-type(2n + 1), :nth-of-type( 2n + 1 ) {
3355
+ color: red }
3356
+ SASS
3357
+ end
3358
+
3359
+ def test_descendant_selectors_with_leading_dash
3360
+ assert_equal(<<CSS, render(<<SASS, :syntax => :scss, :style => :compressed))
3361
+ a -b{color:red}
3362
+ CSS
3363
+ a -b {
3364
+ color: red }
3365
+ SASS
3366
+ end
3367
+
3368
+ def test_import_with_supports_clause_interp
3369
+ assert_equal(<<CSS, render(<<'SASS', :style => :compressed))
3370
+ @import url("fallback-layout.css") supports(not (display: flex))
3371
+ CSS
3372
+ $display-type: flex
3373
+ @import url("fallback-layout.css") supports(not (display: #{$display-type}))
3374
+ SASS
3375
+ end
3376
+
3377
+ def test_import_with_supports_clause
3378
+ assert_equal(<<CSS, render(<<SASS, :style => :compressed))
3379
+ @import url("fallback-layout.css") supports(not (display: flex))
3380
+ CSS
3381
+ @import url("fallback-layout.css") supports(not (display: flex))
3382
+ SASS
3383
+ end
3384
+
3385
+ def test_compressed_commas_in_attribute_selectors
3386
+ assert_equal(<<CSS, render(<<SASS, :style => :compressed))
3387
+ .classname[a="1, 2, 3"],.another[b="4, 5, 6"]{color:red}
3388
+ CSS
3389
+ .classname[a="1, 2, 3"], .another[b="4, 5, 6"]
3390
+ color: red
3391
+ SASS
3392
+ end
3393
+
3318
3394
  private
3319
3395
 
3320
3396
  def assert_hash_has(hash, expected)
3321
- expected.each {|k, v| assert_equal(v, hash[k])}
3397
+ expected.each do |k, v|
3398
+ if v.nil?
3399
+ assert_nil(hash[k])
3400
+ else
3401
+ assert_equal(v, hash[k])
3402
+ end
3403
+ end
3322
3404
  end
3323
3405
 
3324
3406
  def assert_renders_encoded(css, sass)
@@ -3350,7 +3432,8 @@ SASS
3350
3432
  end
3351
3433
 
3352
3434
  def filename(name, type)
3353
- File.dirname(__FILE__) + "/#{type == 'sass' ? 'templates' : 'results'}/#{name}.#{type}"
3435
+ path = File.dirname(__FILE__) + "/#{type == 'sass' ? 'templates' : 'results'}/#{name}.#{type}"
3436
+ Sass::Util.cleanpath(path).to_s
3354
3437
  end
3355
3438
 
3356
3439
  def sassc_path(template)