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
@@ -6,7 +6,7 @@ require 'sass/scss/css_parser'
6
6
  # These tests just test the parsing of CSS
7
7
  # (both standard and any hacks we intend to support).
8
8
  # Tests of SCSS-specific behavior go in scss_test.rb.
9
- class ScssCssTest < Test::Unit::TestCase
9
+ class ScssCssTest < MiniTest::Test
10
10
  include ScssTestHelper
11
11
 
12
12
  def test_basic_scss
@@ -94,7 +94,7 @@ foo {a /*: b; c */: d}
94
94
  SCSS
95
95
  end
96
96
 
97
- def test_crazy_comments
97
+ def test_crazy_comments
98
98
  # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/t040109-c17-comments-00-b.xht
99
99
  assert_equal <<CSS, render(<<SCSS)
100
100
  /* This is a CSS comment. */
@@ -499,10 +499,24 @@ SCSS
499
499
 
500
500
  def test_import_directive
501
501
  assert_parses '@import "foo.css";'
502
- assert_parses "@import 'foo.css';"
503
502
  assert_parses '@import url("foo.css");'
504
503
  assert_parses "@import url('foo.css');"
505
504
  assert_parses '@import url(foo.css);'
505
+
506
+ assert_equal <<CSS, render(<<SCSS)
507
+ @import "foo.css";
508
+ CSS
509
+ @import 'foo.css';
510
+ SCSS
511
+ end
512
+
513
+ def test_import_directive_with_backslash_newline
514
+ assert_equal <<CSS, render(<<SCSS)
515
+ @import "foobar.css";
516
+ CSS
517
+ @import "foo\\
518
+ bar.css";
519
+ SCSS
506
520
  end
507
521
 
508
522
  def test_string_import_directive_with_media
@@ -620,14 +634,14 @@ SCSS
620
634
 
621
635
  def test_supports
622
636
  assert_equal <<CSS, render(<<SCSS)
623
- @supports (a: b) and (c: d) or (not (d: e)) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
637
+ @supports (((a: b) and (c: d)) or (not (d: e))) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
624
638
  .foo {
625
639
  a: b; } }
626
640
  @supports (a: b) {
627
641
  .foo {
628
642
  a: b; } }
629
643
  CSS
630
- @supports (a: b) and (c: d) or (not (d: e)) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
644
+ @supports (((a: b) and (c: d)) or (not (d: e))) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
631
645
  .foo {
632
646
  a: b;
633
647
  }
@@ -639,17 +653,100 @@ CSS
639
653
  }
640
654
  }
641
655
  SCSS
656
+ end
642
657
 
658
+ def test_supports_with_prefix
643
659
  assert_equal <<CSS, render(<<SCSS)
644
- @-prefix-supports (a: b) and (c: d) or (not (d: e)) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
660
+ @-prefix-supports (((a: b) and (c: d)) or (not (d: e))) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
661
+ .foo {
662
+ a: b; } }
663
+ CSS
664
+ @-prefix-supports (((a: b) and (c: d)) or (not (d: e))) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
665
+ .foo {
666
+ a: b;
667
+ }
668
+ }
669
+ SCSS
670
+ end
671
+
672
+ def test_supports_allows_similar_operators_without_parens
673
+ assert_equal <<CSS, render(<<SCSS)
674
+ @supports (a: b) and (c: d) and (e: f) {
675
+ .foo {
676
+ a: b; } }
677
+ @supports (a: b) or (c: d) or (e: f) {
645
678
  .foo {
646
679
  a: b; } }
647
680
  CSS
648
- @-prefix-supports (a: b) and (c: d) or (not (d: e)) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
681
+ @supports (a: b) and (c: d) and (e: f) {
649
682
  .foo {
650
683
  a: b;
651
684
  }
652
685
  }
686
+
687
+ @supports (a: b) or (c: d) or (e: f) {
688
+ .foo {
689
+ a: b;
690
+ }
691
+ }
692
+ SCSS
693
+ end
694
+
695
+ def test_keyframes
696
+ assert_equal <<CSS, render(<<SCSS)
697
+ @keyframes identifier {
698
+ 0% {
699
+ top: 0;
700
+ left: 0; }
701
+ 30% {
702
+ top: 50px; }
703
+ 68%, 72% {
704
+ left: 50px; }
705
+ 100% {
706
+ top: 100px;
707
+ left: 100%; } }
708
+ CSS
709
+ @keyframes identifier {
710
+ 0% {top: 0; left: 0}
711
+ 30% {top: 50px}
712
+ 68%, 72% {left: 50px}
713
+ 100% {top: 100px; left: 100%}
714
+ }
715
+ SCSS
716
+ end
717
+
718
+ def test_keyframes_with_empty_rules
719
+ assert_equal <<CSS, render(<<SCSS)
720
+ @keyframes identifier {
721
+ 50% {
722
+ background-color: black; } }
723
+ CSS
724
+ @keyframes identifier {
725
+ 0% {}
726
+ 50% {background-color: black}
727
+ 100% {}
728
+ }
729
+ SCSS
730
+ end
731
+
732
+ def test_keyframes_with_custom_identifiers
733
+ assert_equal <<CSS, render(<<SCSS)
734
+ @-skrollr-keyframes identifier {
735
+ center-top {
736
+ left: 100%; }
737
+ top-bottom {
738
+ left: 0%; } }
739
+ CSS
740
+ @-skrollr-keyframes identifier {
741
+ center-top {
742
+ left: 100%;
743
+ }
744
+
745
+ top-bottom {
746
+ left: 0%;
747
+ }
748
+ }
749
+
653
750
  SCSS
654
751
  end
655
752
 
@@ -662,6 +759,8 @@ SCSS
662
759
  assert_selector_parses('E:not(s)')
663
760
  assert_selector_parses('E:not(s1, s2)')
664
761
  assert_selector_parses('E:matches(s1, s2)')
762
+ assert_selector_parses('E:has(s1, s2)')
763
+ assert_selector_parses('E:has(> s1, > s2)')
665
764
  assert_selector_parses('E.warning')
666
765
  assert_selector_parses('E#myid')
667
766
  assert_selector_parses('E[foo]')
@@ -712,20 +811,22 @@ SCSS
712
811
  assert_selector_parses('E:last-of-type')
713
812
  assert_selector_parses('E:nth-last-of-type(n)')
714
813
  assert_selector_parses('E:only-of-type')
715
- assert_selector_parses('E:nth-match(n of selector)')
716
- assert_selector_parses('E:nth-last-match(n of selector)')
717
- assert_selector_parses('E:column(selector)')
718
- assert_selector_parses('E:nth-column(n)')
719
- assert_selector_parses('E:nth-last-column(n)')
814
+ assert_selector_parses('E:nth-child(n of selector)')
815
+ assert_selector_parses('E:nth-last-child(n of selector)')
816
+ assert_selector_parses('E:nth-child(n)')
817
+ assert_selector_parses('E:nth-last-child(n)')
720
818
  assert_selector_parses('E F')
721
819
  assert_selector_parses('E > F')
722
820
  assert_selector_parses('E + F')
723
821
  assert_selector_parses('E ~ F')
724
- assert_selector_parses('E /foo/ F')
725
- assert_selector_parses('E! > F')
822
+ silence_warnings {assert_selector_parses('E /foo/ F')}
823
+ silence_warnings {assert_selector_parses('E! > F')}
726
824
 
727
- assert_selector_parses('E /ns|foo/ F')
728
- assert_selector_parses('E /*|foo/ F')
825
+ silence_warnings {assert_selector_parses('E /ns|foo/ F')}
826
+
827
+ # From http://dev.w3.org/csswg/css-scoping-1/
828
+ assert_selector_parses('E:host(s)')
829
+ assert_selector_parses('E:host-context(s)')
729
830
  end
730
831
 
731
832
  # Taken from http://dev.w3.org/csswg/selectors4/#overview, but without element
@@ -734,6 +835,8 @@ SCSS
734
835
  assert_selector_parses(':not(s)')
735
836
  assert_selector_parses(':not(s1, s2)')
736
837
  assert_selector_parses(':matches(s1, s2)')
838
+ assert_selector_parses(':has(s1, s2)')
839
+ assert_selector_parses(':has(> s1, > s2)')
737
840
  assert_selector_parses('.warning')
738
841
  assert_selector_parses('#myid')
739
842
  assert_selector_parses('[foo]')
@@ -784,11 +887,14 @@ SCSS
784
887
  assert_selector_parses(':last-of-type')
785
888
  assert_selector_parses(':nth-last-of-type(n)')
786
889
  assert_selector_parses(':only-of-type')
787
- assert_selector_parses(':nth-match(n of selector)')
788
- assert_selector_parses(':nth-last-match(n of selector)')
789
- assert_selector_parses(':column(selector)')
790
- assert_selector_parses(':nth-column(n)')
791
- assert_selector_parses(':nth-last-column(n)')
890
+ assert_selector_parses(':nth-child(n of selector)')
891
+ assert_selector_parses(':nth-last-child(n of selector)')
892
+ assert_selector_parses(':nth-child(n)')
893
+ assert_selector_parses(':nth-last-child(n)')
894
+
895
+ # From http://dev.w3.org/csswg/css-scoping-1/
896
+ assert_selector_parses(':host(s)')
897
+ assert_selector_parses(':host-context(s)')
792
898
  end
793
899
 
794
900
  def test_attribute_selectors_with_identifiers
@@ -828,15 +934,18 @@ SCSS
828
934
  def test_selectors_containing_selectors
829
935
  assert_selector_can_contain_selectors(':not(<sel>)')
830
936
  assert_selector_can_contain_selectors(':current(<sel>)')
831
- assert_selector_can_contain_selectors(':nth-match(n of <sel>)')
832
- assert_selector_can_contain_selectors(':nth-last-match(n of <sel>)')
833
- assert_selector_can_contain_selectors(':column(<sel>)')
937
+ assert_selector_can_contain_selectors(':nth-child(n of <sel>)')
938
+ assert_selector_can_contain_selectors(':nth-last-child(n of <sel>)')
834
939
  assert_selector_can_contain_selectors(':-moz-any(<sel>)')
940
+ assert_selector_can_contain_selectors(':has(<sel>)')
941
+ assert_selector_can_contain_selectors(':has(+ <sel>)')
942
+ assert_selector_can_contain_selectors(':host(<sel>)')
943
+ assert_selector_can_contain_selectors(':host-context(<sel>)')
835
944
  end
836
945
 
837
946
  def assert_selector_can_contain_selectors(sel)
838
947
  try = lambda {|subsel| assert_selector_parses(sel.gsub('<sel>', subsel))}
839
-
948
+
840
949
  try['foo|bar']
841
950
  try['*|bar']
842
951
 
@@ -888,11 +997,11 @@ SCSS
888
997
  end
889
998
 
890
999
  def test_expression_fallback_selectors
891
- assert_selector_parses('0%')
892
- assert_selector_parses('60%')
893
- assert_selector_parses('100%')
894
- assert_selector_parses('12px')
895
- assert_selector_parses('"foo"')
1000
+ assert_directive_parses('0%')
1001
+ assert_directive_parses('60%')
1002
+ assert_directive_parses('100%')
1003
+ assert_directive_parses('12px')
1004
+ assert_directive_parses('"foo"')
896
1005
  end
897
1006
 
898
1007
  def test_functional_pseudo_selectors
@@ -929,6 +1038,35 @@ SCSS
929
1038
  assert_equal "E + F {\n a: b; }\n", render("E+F { a: b;} ")
930
1039
  end
931
1040
 
1041
+ def test_escapes_in_selectors
1042
+ assert_selector_parses('.\!foo')
1043
+ assert_selector_parses('.\66 foo')
1044
+ assert_selector_parses('.\21 foo')
1045
+ end
1046
+
1047
+ def test_subject_selector_deprecation
1048
+ assert_warning(<<WARNING) {render(".foo .bar! .baz {a: b}")}
1049
+ DEPRECATION WARNING on line 1, column 1:
1050
+ The subject selector operator "!" is deprecated and will be removed in a future release.
1051
+ This operator has been replaced by ":has()" in the CSS spec.
1052
+ For example: .foo .bar:has(.baz)
1053
+ WARNING
1054
+
1055
+ assert_warning(<<WARNING) {render(".foo .bar! > .baz {a: b}")}
1056
+ DEPRECATION WARNING on line 1, column 1:
1057
+ The subject selector operator "!" is deprecated and will be removed in a future release.
1058
+ This operator has been replaced by ":has()" in the CSS spec.
1059
+ For example: .foo .bar:has(> .baz)
1060
+ WARNING
1061
+
1062
+ assert_warning(<<WARNING) {render(".foo .bar! {a: b}")}
1063
+ DEPRECATION WARNING on line 1, column 1:
1064
+ The subject selector operator "!" is deprecated and will be removed in a future release.
1065
+ This operator has been replaced by ":has()" in the CSS spec.
1066
+ For example: .foo .bar
1067
+ WARNING
1068
+ end
1069
+
932
1070
  ## Errors
933
1071
 
934
1072
  def test_invalid_directives
@@ -1014,8 +1152,41 @@ SCSS
1014
1152
  assert_equal 1, e.sass_line
1015
1153
  end
1016
1154
 
1155
+ def test_newline_in_property_value
1156
+ assert_equal(<<CSS, render(<<SCSS))
1157
+ .foo {
1158
+ bar: "bazbang"; }
1159
+ CSS
1160
+ .foo {
1161
+ bar: "baz\\
1162
+ bang";
1163
+ }
1164
+ SCSS
1165
+ end
1166
+
1017
1167
  ## Regressions
1018
1168
 
1169
+ def test_very_long_comment_doesnt_take_forever
1170
+ string = 'asdf' * (100000)
1171
+ assert_equal(<<CSS, render(<<SCSS))
1172
+ /*
1173
+ #{string}
1174
+ */
1175
+ CSS
1176
+ /*
1177
+ #{string}
1178
+ */
1179
+ SCSS
1180
+ end
1181
+
1182
+ def test_long_unclosed_comment_doesnt_take_forever
1183
+ assert_raise_message(Sass::SyntaxError,
1184
+ 'Invalid CSS after "/*": expected "/", was "//*************..."') {render(<<SCSS)}
1185
+ /*
1186
+ //**************************************************************************
1187
+ SCSS
1188
+ end
1189
+
1019
1190
  def test_double_space_string
1020
1191
  assert_equal(<<CSS, render(<<SCSS))
1021
1192
  .a {
@@ -1088,6 +1259,18 @@ SCSS
1088
1259
  #{selector} {
1089
1260
  a: b; }
1090
1261
  SCSS
1262
+
1263
+ assert_parses <<SCSS
1264
+ :not(#{selector}) {
1265
+ a: b; }
1266
+ SCSS
1267
+ end
1268
+
1269
+ def assert_directive_parses(param)
1270
+ assert_parses <<SCSS
1271
+ @unknown #{param} {
1272
+ a: b; }
1273
+ SCSS
1091
1274
  end
1092
1275
 
1093
1276
  def render(scss, options = {})
@@ -3,7 +3,7 @@
3
3
  require File.dirname(__FILE__) + '/../../test_helper'
4
4
  require 'sass/engine'
5
5
 
6
- class ScssRxTest < Test::Unit::TestCase
6
+ class ScssRxTest < MiniTest::Test
7
7
  include Sass::SCSS::RX
8
8
 
9
9
  def test_identifiers
@@ -26,6 +26,7 @@ class ScssRxTest < Test::Unit::TestCase
26
26
  assert_match IDENT, "_foo" # Can put a _ before anything
27
27
  assert_match IDENT, "_\xC3\xBFoo"
28
28
  assert_match IDENT, "_\\f oo"
29
+ assert_match IDENT, "--foo" # "Custom" identifier
29
30
 
30
31
  assert_match IDENT, "foo-bar"
31
32
  assert_match IDENT, "f012-23"
@@ -59,7 +60,6 @@ class ScssRxTest < Test::Unit::TestCase
59
60
  assert_no_match IDENT, ""
60
61
  assert_no_match IDENT, "1foo"
61
62
  assert_no_match IDENT, "-1foo"
62
- assert_no_match IDENT, "--foo"
63
63
  assert_no_match IDENT, "foo bar"
64
64
  assert_no_match IDENT, "foo~bar"
65
65
 
@@ -141,16 +141,20 @@ class ScssRxTest < Test::Unit::TestCase
141
141
  assert_equal "foo\\00007fbar", Sass::SCSS::RX.escape_ident("foo\177bar")
142
142
  end
143
143
 
144
+ def test_no_static_hyphenated_units
145
+ assert_no_match STATIC_VALUE, "20px-20px"
146
+ end
147
+
144
148
  private
145
149
 
146
150
  def assert_match(rx, str)
147
- assert_not_nil(match = rx.match(str))
151
+ refute_nil(match = rx.match(str))
148
152
  assert_equal str.size, match[0].size
149
153
  end
150
154
 
151
155
  def assert_no_match(rx, str)
152
156
  match = rx.match(str)
153
- assert_not_equal str.size, match && match[0].size
157
+ refute_equal str.size, match && match[0].size
154
158
  end
155
159
 
156
160
  end