sass 3.3.0 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +58 -50
  4. data/Rakefile +1 -4
  5. data/VERSION +1 -1
  6. data/VERSION_DATE +1 -1
  7. data/VERSION_NAME +1 -1
  8. data/bin/sass +1 -1
  9. data/bin/scss +1 -1
  10. data/lib/sass/cache_stores/filesystem.rb +6 -2
  11. data/lib/sass/css.rb +1 -3
  12. data/lib/sass/engine.rb +37 -46
  13. data/lib/sass/environment.rb +13 -17
  14. data/lib/sass/error.rb +6 -9
  15. data/lib/sass/exec/base.rb +187 -0
  16. data/lib/sass/exec/sass_convert.rb +264 -0
  17. data/lib/sass/exec/sass_scss.rb +424 -0
  18. data/lib/sass/exec.rb +5 -771
  19. data/lib/sass/features.rb +7 -0
  20. data/lib/sass/importers/base.rb +7 -2
  21. data/lib/sass/importers/filesystem.rb +9 -25
  22. data/lib/sass/importers.rb +0 -1
  23. data/lib/sass/media.rb +1 -4
  24. data/lib/sass/plugin/compiler.rb +200 -83
  25. data/lib/sass/plugin/staleness_checker.rb +1 -1
  26. data/lib/sass/plugin.rb +3 -3
  27. data/lib/sass/script/css_lexer.rb +1 -1
  28. data/lib/sass/script/functions.rb +622 -268
  29. data/lib/sass/script/lexer.rb +99 -34
  30. data/lib/sass/script/parser.rb +24 -23
  31. data/lib/sass/script/tree/funcall.rb +1 -1
  32. data/lib/sass/script/tree/interpolation.rb +20 -2
  33. data/lib/sass/script/tree/selector.rb +26 -0
  34. data/lib/sass/script/tree/string_interpolation.rb +1 -1
  35. data/lib/sass/script/tree.rb +1 -0
  36. data/lib/sass/script/value/base.rb +7 -5
  37. data/lib/sass/script/value/bool.rb +0 -5
  38. data/lib/sass/script/value/color.rb +39 -21
  39. data/lib/sass/script/value/helpers.rb +107 -0
  40. data/lib/sass/script/value/list.rb +0 -15
  41. data/lib/sass/script/value/null.rb +0 -5
  42. data/lib/sass/script/value/number.rb +62 -14
  43. data/lib/sass/script/value/string.rb +59 -11
  44. data/lib/sass/script/value.rb +0 -1
  45. data/lib/sass/scss/css_parser.rb +8 -2
  46. data/lib/sass/scss/parser.rb +190 -328
  47. data/lib/sass/scss/rx.rb +15 -6
  48. data/lib/sass/scss/static_parser.rb +298 -1
  49. data/lib/sass/selector/abstract_sequence.rb +28 -13
  50. data/lib/sass/selector/comma_sequence.rb +92 -13
  51. data/lib/sass/selector/pseudo.rb +256 -0
  52. data/lib/sass/selector/sequence.rb +94 -24
  53. data/lib/sass/selector/simple.rb +14 -25
  54. data/lib/sass/selector/simple_sequence.rb +97 -33
  55. data/lib/sass/selector.rb +57 -194
  56. data/lib/sass/shared.rb +1 -1
  57. data/lib/sass/source/map.rb +26 -12
  58. data/lib/sass/stack.rb +0 -6
  59. data/lib/sass/supports.rb +2 -3
  60. data/lib/sass/tree/at_root_node.rb +1 -0
  61. data/lib/sass/tree/charset_node.rb +1 -1
  62. data/lib/sass/tree/directive_node.rb +8 -2
  63. data/lib/sass/tree/error_node.rb +18 -0
  64. data/lib/sass/tree/extend_node.rb +1 -1
  65. data/lib/sass/tree/function_node.rb +4 -0
  66. data/lib/sass/tree/keyframe_rule_node.rb +15 -0
  67. data/lib/sass/tree/prop_node.rb +1 -1
  68. data/lib/sass/tree/rule_node.rb +12 -7
  69. data/lib/sass/tree/visitors/check_nesting.rb +38 -10
  70. data/lib/sass/tree/visitors/convert.rb +16 -18
  71. data/lib/sass/tree/visitors/cssize.rb +29 -29
  72. data/lib/sass/tree/visitors/deep_copy.rb +5 -0
  73. data/lib/sass/tree/visitors/perform.rb +45 -33
  74. data/lib/sass/tree/visitors/set_options.rb +14 -0
  75. data/lib/sass/tree/visitors/to_css.rb +15 -14
  76. data/lib/sass/util/subset_map.rb +1 -1
  77. data/lib/sass/util.rb +222 -99
  78. data/lib/sass/version.rb +5 -5
  79. data/lib/sass.rb +0 -5
  80. data/test/sass/cache_test.rb +62 -20
  81. data/test/sass/callbacks_test.rb +1 -1
  82. data/test/sass/compiler_test.rb +19 -10
  83. data/test/sass/conversion_test.rb +58 -1
  84. data/test/sass/css2sass_test.rb +23 -4
  85. data/test/sass/encoding_test.rb +219 -0
  86. data/test/sass/engine_test.rb +136 -199
  87. data/test/sass/exec_test.rb +2 -2
  88. data/test/sass/extend_test.rb +236 -19
  89. data/test/sass/functions_test.rb +295 -253
  90. data/test/sass/importer_test.rb +31 -21
  91. data/test/sass/logger_test.rb +1 -1
  92. data/test/sass/more_results/more_import.css +1 -1
  93. data/test/sass/plugin_test.rb +14 -13
  94. data/test/sass/results/compact.css +1 -1
  95. data/test/sass/results/complex.css +4 -4
  96. data/test/sass/results/expanded.css +1 -1
  97. data/test/sass/results/import.css +1 -1
  98. data/test/sass/results/import_charset_ibm866.css +2 -2
  99. data/test/sass/results/mixins.css +17 -17
  100. data/test/sass/results/nested.css +1 -1
  101. data/test/sass/results/parent_ref.css +2 -2
  102. data/test/sass/results/script.css +3 -3
  103. data/test/sass/results/scss_import.css +1 -1
  104. data/test/sass/script_conversion_test.rb +10 -7
  105. data/test/sass/script_test.rb +288 -74
  106. data/test/sass/scss/css_test.rb +141 -24
  107. data/test/sass/scss/rx_test.rb +4 -4
  108. data/test/sass/scss/scss_test.rb +457 -18
  109. data/test/sass/source_map_test.rb +115 -25
  110. data/test/sass/superselector_test.rb +191 -0
  111. data/test/sass/templates/scss_import.scss +2 -1
  112. data/test/sass/test_helper.rb +1 -1
  113. data/test/sass/util/multibyte_string_scanner_test.rb +1 -1
  114. data/test/sass/util/normalized_map_test.rb +1 -1
  115. data/test/sass/util/subset_map_test.rb +2 -2
  116. data/test/sass/util_test.rb +31 -1
  117. data/test/sass/value_helpers_test.rb +5 -7
  118. data/test/test_helper.rb +2 -2
  119. data/vendor/listen/CHANGELOG.md +1 -228
  120. data/vendor/listen/Gemfile +5 -15
  121. data/vendor/listen/README.md +111 -77
  122. data/vendor/listen/Rakefile +0 -42
  123. data/vendor/listen/lib/listen/adapter.rb +195 -82
  124. data/vendor/listen/lib/listen/adapters/bsd.rb +27 -64
  125. data/vendor/listen/lib/listen/adapters/darwin.rb +21 -58
  126. data/vendor/listen/lib/listen/adapters/linux.rb +23 -55
  127. data/vendor/listen/lib/listen/adapters/polling.rb +25 -34
  128. data/vendor/listen/lib/listen/adapters/windows.rb +50 -46
  129. data/vendor/listen/lib/listen/directory_record.rb +96 -61
  130. data/vendor/listen/lib/listen/listener.rb +135 -37
  131. data/vendor/listen/lib/listen/turnstile.rb +9 -5
  132. data/vendor/listen/lib/listen/version.rb +1 -1
  133. data/vendor/listen/lib/listen.rb +33 -19
  134. data/vendor/listen/listen.gemspec +6 -0
  135. data/vendor/listen/spec/listen/adapter_spec.rb +43 -77
  136. data/vendor/listen/spec/listen/adapters/polling_spec.rb +8 -8
  137. data/vendor/listen/spec/listen/directory_record_spec.rb +81 -56
  138. data/vendor/listen/spec/listen/listener_spec.rb +128 -39
  139. data/vendor/listen/spec/listen_spec.rb +15 -21
  140. data/vendor/listen/spec/spec_helper.rb +4 -0
  141. data/vendor/listen/spec/support/adapter_helper.rb +52 -15
  142. data/vendor/listen/spec/support/directory_record_helper.rb +7 -5
  143. data/vendor/listen/spec/support/listeners_helper.rb +30 -7
  144. metadata +25 -22
  145. data/ext/mkrf_conf.rb +0 -27
  146. data/lib/sass/importers/deprecated_path.rb +0 -51
  147. data/lib/sass/script/value/deprecated_false.rb +0 -55
  148. data/vendor/listen/lib/listen/dependency_manager.rb +0 -126
  149. data/vendor/listen/lib/listen/multi_listener.rb +0 -143
  150. data/vendor/listen/spec/listen/dependency_manager_spec.rb +0 -107
  151. data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -174
@@ -2,7 +2,7 @@
2
2
  # -*- coding: utf-8 -*-
3
3
  require File.dirname(__FILE__) + '/test_helper'
4
4
 
5
- class ScssTest < Test::Unit::TestCase
5
+ class ScssTest < MiniTest::Test
6
6
  include ScssTestHelper
7
7
 
8
8
  ## One-Line Comments
@@ -115,6 +115,14 @@ SCSS
115
115
  end
116
116
  end
117
117
 
118
+ def test_error_directive
119
+ assert_raise_message(Sass::SyntaxError, "hello world!") {render(<<SCSS)}
120
+ foo {a: b}
121
+ @error "hello world!";
122
+ bar {c: d}
123
+ SCSS
124
+ end
125
+
118
126
  def test_warn_directive
119
127
  expected_warning = <<EXPECTATION
120
128
  WARNING: this is a warning
@@ -536,11 +544,17 @@ foo :baz {
536
544
  c: d; }
537
545
  foo bang:bop {
538
546
  e: f; }
547
+ foo ::qux {
548
+ g: h; }
549
+ foo zap::fblthp {
550
+ i: j; }
539
551
  CSS
540
552
  foo {
541
553
  .bar {a: b}
542
554
  :baz {c: d}
543
- bang:bop {e: f}}
555
+ bang:bop {e: f}
556
+ ::qux {g: h}
557
+ zap::fblthp {i: j}}
544
558
  SCSS
545
559
  end
546
560
 
@@ -645,7 +659,7 @@ SCSS
645
659
  end
646
660
 
647
661
  def test_parent_selector_with_subject
648
- assert_equal <<CSS, render(<<SCSS)
662
+ silence_warnings {assert_equal <<CSS, render(<<SCSS)}
649
663
  bar foo.baz! .bip {
650
664
  a: b; }
651
665
 
@@ -799,18 +813,27 @@ SCSS
799
813
  def test_no_namespace_properties_without_space_even_when_its_unambiguous
800
814
  render(<<SCSS)
801
815
  foo {
802
- bar:1px {
816
+ bar:baz calc(1 + 2) {
803
817
  bip: bop }}
804
818
  SCSS
805
819
  assert(false, "Expected syntax error")
806
820
  rescue Sass::SyntaxError => e
807
- assert_equal <<MESSAGE, e.message
808
- Invalid CSS: a space is required between a property and its definition
809
- when it has other properties nested beneath it.
810
- MESSAGE
821
+ assert_equal 'Invalid CSS after "bar:baz calc": expected selector, was "(1 + 2)"', e.message
811
822
  assert_equal 2, e.sass_line
812
823
  end
813
824
 
825
+ def test_namespace_properties_without_space_allowed_for_non_identifier
826
+ assert_equal <<CSS, render(<<SCSS)
827
+ foo {
828
+ bar: 1px;
829
+ bar-bip: bop; }
830
+ CSS
831
+ foo {
832
+ bar:1px {
833
+ bip: bop }}
834
+ SCSS
835
+ end
836
+
814
837
  ## Mixins
815
838
 
816
839
  def test_basic_mixins
@@ -903,6 +926,33 @@ CSS
903
926
  SCSS
904
927
  end
905
928
 
929
+ def test_keyframes_rules_in_content
930
+ assert_equal <<CSS, render(<<SCSS)
931
+ @keyframes identifier {
932
+ 0% {
933
+ top: 0;
934
+ left: 0; }
935
+ 30% {
936
+ top: 50px; }
937
+ 68%, 72% {
938
+ left: 50px; }
939
+ 100% {
940
+ top: 100px;
941
+ left: 100%; } }
942
+ CSS
943
+ @mixin keyframes {
944
+ @keyframes identifier { @content }
945
+ }
946
+
947
+ @include keyframes {
948
+ 0% {top: 0; left: 0}
949
+ \#{"30%"} {top: 50px}
950
+ 68%, 72% {left: 50px}
951
+ 100% {top: 100px; left: 100%}
952
+ }
953
+ SCSS
954
+ end
955
+
906
956
  ## Functions
907
957
 
908
958
  def test_basic_function
@@ -1884,10 +1934,10 @@ SCSS
1884
1934
 
1885
1935
  def test_basic_selector_interpolation
1886
1936
  assert_equal <<CSS, render(<<SCSS)
1887
- foo 3 baz {
1937
+ foo ab baz {
1888
1938
  a: b; }
1889
1939
  CSS
1890
- foo \#{1 + 2} baz {a: b}
1940
+ foo \#{'a' + 'b'} baz {a: b}
1891
1941
  SCSS
1892
1942
  assert_equal <<CSS, render(<<SCSS)
1893
1943
  foo.bar baz {
@@ -2013,7 +2063,7 @@ SCSS
2013
2063
  end
2014
2064
 
2015
2065
  def test_parent_selector_with_parent_and_subject
2016
- assert_equal <<CSS, render(<<SCSS)
2066
+ silence_warnings {assert_equal <<CSS, render(<<SCSS)}
2017
2067
  bar foo.baz! .bip {
2018
2068
  c: d; }
2019
2069
  CSS
@@ -2186,6 +2236,69 @@ $domain: "sass-lang.com";
2186
2236
  SCSS
2187
2237
  end
2188
2238
 
2239
+ def test_color_interpolation_warning_in_selector
2240
+ assert_warning(<<WARNING) {assert_equal <<CSS, render(<<SCSS)}
2241
+ WARNING on line 1, column 4 of #{filename_for_test(:scss)}:
2242
+ You probably don't mean to use the color value `blue' in interpolation here.
2243
+ It may end up represented as #0000ff, which will likely produce invalid CSS.
2244
+ Always quote color names when using them as strings (for example, "blue").
2245
+ If you really want to use the color value here, use `"" + blue'.
2246
+ WARNING
2247
+ fooblue {
2248
+ a: b; }
2249
+ CSS
2250
+ foo\#{blue} {a: b}
2251
+ SCSS
2252
+ end
2253
+
2254
+ def test_color_interpolation_warning_in_directive
2255
+ assert_warning(<<WARNING) {assert_equal <<CSS, render(<<SCSS)}
2256
+ WARNING on line 1, column 12 of #{filename_for_test(:scss)}:
2257
+ You probably don't mean to use the color value `blue' in interpolation here.
2258
+ It may end up represented as #0000ff, which will likely produce invalid CSS.
2259
+ Always quote color names when using them as strings (for example, "blue").
2260
+ If you really want to use the color value here, use `"" + blue'.
2261
+ WARNING
2262
+ @fblthp fooblue {
2263
+ a: b; }
2264
+ CSS
2265
+ @fblthp foo\#{blue} {a: b}
2266
+ SCSS
2267
+ end
2268
+
2269
+ def test_color_interpolation_warning_in_property_name
2270
+ assert_warning(<<WARNING) {assert_equal <<CSS, render(<<SCSS)}
2271
+ WARNING on line 1, column 8 of #{filename_for_test(:scss)}:
2272
+ You probably don't mean to use the color value `blue' in interpolation here.
2273
+ It may end up represented as #0000ff, which will likely produce invalid CSS.
2274
+ Always quote color names when using them as strings (for example, "blue").
2275
+ If you really want to use the color value here, use `"" + blue'.
2276
+ WARNING
2277
+ foo {
2278
+ a-blue: b; }
2279
+ CSS
2280
+ foo {a-\#{blue}: b}
2281
+ SCSS
2282
+ end
2283
+
2284
+ def test_no_color_interpolation_warning_in_property_value
2285
+ assert_no_warning {assert_equal <<CSS, render(<<SCSS)}
2286
+ foo {
2287
+ a: b-blue; }
2288
+ CSS
2289
+ foo {a: b-\#{blue}}
2290
+ SCSS
2291
+ end
2292
+
2293
+ def test_no_color_interpolation_warning_for_nameless_color
2294
+ assert_no_warning {assert_equal <<CSS, render(<<SCSS)}
2295
+ foo-#abcdef {
2296
+ a: b; }
2297
+ CSS
2298
+ foo-\#{#abcdef} {a: b}
2299
+ SCSS
2300
+ end
2301
+
2189
2302
  def test_nested_mixin_def
2190
2303
  assert_equal <<CSS, render(<<SCSS)
2191
2304
  foo {
@@ -2848,8 +2961,283 @@ CSS
2848
2961
  SCSS
2849
2962
  end
2850
2963
 
2964
+ def test_at_root_without_keyframes_in_keyframe_rule
2965
+ assert_equal <<CSS, render(<<SCSS)
2966
+ .foo {
2967
+ a: b; }
2968
+ CSS
2969
+ @keyframes identifier {
2970
+ 0% {
2971
+ @at-root (without: keyframes) {
2972
+ .foo {a: b}
2973
+ }
2974
+ }
2975
+ }
2976
+ SCSS
2977
+ end
2978
+
2979
+ def test_at_root_without_rule_in_keyframe_rule
2980
+ assert_equal <<CSS, render(<<SCSS)
2981
+ @keyframes identifier {
2982
+ 0% {
2983
+ a: b; } }
2984
+ CSS
2985
+ @keyframes identifier {
2986
+ 0% {
2987
+ @at-root (without: rule) {a: b}
2988
+ }
2989
+ }
2990
+ SCSS
2991
+ end
2992
+
2993
+ ## Selector Script
2994
+
2995
+ def test_selector_script
2996
+ assert_equal(<<CSS, render(<<SCSS))
2997
+ .foo .bar {
2998
+ content: ".foo .bar"; }
2999
+ CSS
3000
+ .foo .bar {
3001
+ content: "\#{&}";
3002
+ }
3003
+ SCSS
3004
+ end
3005
+
3006
+ def test_nested_selector_script
3007
+ assert_equal(<<CSS, render(<<SCSS))
3008
+ .foo .bar {
3009
+ content: ".foo .bar"; }
3010
+ CSS
3011
+ .foo {
3012
+ .bar {
3013
+ content: "\#{&}";
3014
+ }
3015
+ }
3016
+ SCSS
3017
+ end
3018
+
3019
+ def test_nested_selector_script_with_outer_comma_selector
3020
+ assert_equal(<<CSS, render(<<SCSS))
3021
+ .foo .baz, .bar .baz {
3022
+ content: ".foo .baz, .bar .baz"; }
3023
+ CSS
3024
+ .foo, .bar {
3025
+ .baz {
3026
+ content: "\#{&}";
3027
+ }
3028
+ }
3029
+ SCSS
3030
+ end
3031
+
3032
+ def test_nested_selector_script_with_inner_comma_selector
3033
+ assert_equal(<<CSS, render(<<SCSS))
3034
+ .foo .bar, .foo .baz {
3035
+ content: ".foo .bar, .foo .baz"; }
3036
+ CSS
3037
+ .foo {
3038
+ .bar, .baz {
3039
+ content: "\#{&}";
3040
+ }
3041
+ }
3042
+ SCSS
3043
+ end
3044
+
3045
+ def test_selector_script_through_mixin
3046
+ assert_equal(<<CSS, render(<<SCSS))
3047
+ .foo {
3048
+ content: ".foo"; }
3049
+ CSS
3050
+ @mixin mixin {
3051
+ content: "\#{&}";
3052
+ }
3053
+
3054
+ .foo {
3055
+ @include mixin;
3056
+ }
3057
+ SCSS
3058
+ end
3059
+
3060
+ def test_selector_script_through_content
3061
+ assert_equal(<<CSS, render(<<SCSS))
3062
+ .foo {
3063
+ content: ".foo"; }
3064
+ CSS
3065
+ @mixin mixin {
3066
+ @content;
3067
+ }
3068
+
3069
+ .foo {
3070
+ @include mixin {
3071
+ content: "\#{&}";
3072
+ }
3073
+ }
3074
+ SCSS
3075
+ end
3076
+
3077
+ def test_selector_script_through_function
3078
+ assert_equal(<<CSS, render(<<SCSS))
3079
+ .foo {
3080
+ content: ".foo"; }
3081
+ CSS
3082
+ @function fn() {
3083
+ @return "\#{&}";
3084
+ }
3085
+
3086
+ .foo {
3087
+ content: fn();
3088
+ }
3089
+ SCSS
3090
+ end
3091
+
3092
+ def test_selector_script_through_media
3093
+ assert_equal(<<CSS, render(<<SCSS))
3094
+ .foo {
3095
+ content: "outer"; }
3096
+ @media screen {
3097
+ .foo .bar {
3098
+ content: ".foo .bar"; } }
3099
+ CSS
3100
+ .foo {
3101
+ content: "outer";
3102
+ @media screen {
3103
+ .bar {
3104
+ content: "\#{&}";
3105
+ }
3106
+ }
3107
+ }
3108
+ SCSS
3109
+ end
3110
+
3111
+ def test_selector_script_save_and_reuse
3112
+ assert_equal(<<CSS, render(<<SCSS))
3113
+ .bar {
3114
+ content: ".foo"; }
3115
+ CSS
3116
+ $var: null;
3117
+ .foo {
3118
+ $var: & !global;
3119
+ }
3120
+
3121
+ .bar {
3122
+ content: "\#{$var}";
3123
+ }
3124
+ SCSS
3125
+ end
3126
+
3127
+ def test_selector_script_with_at_root
3128
+ assert_equal(<<CSS, render(<<SCSS))
3129
+ .foo-bar {
3130
+ a: b; }
3131
+ CSS
3132
+ .foo {
3133
+ @at-root \#{&}-bar {
3134
+ a: b;
3135
+ }
3136
+ }
3137
+ SCSS
3138
+ end
3139
+
3140
+ def test_multi_level_at_root_with_inner_selector_script
3141
+ assert_equal <<CSS, render(<<SCSS)
3142
+ .bar {
3143
+ a: b; }
3144
+ CSS
3145
+ .foo {
3146
+ @at-root .bar {
3147
+ @at-root \#{&} {
3148
+ a: b;
3149
+ }
3150
+ }
3151
+ }
3152
+ SCSS
3153
+ end
3154
+
3155
+ def test_at_root_with_at_root_through_mixin
3156
+ assert_equal(<<CSS, render(<<SCSS))
3157
+ .bar-baz {
3158
+ a: b; }
3159
+ CSS
3160
+ @mixin foo {
3161
+ .bar {
3162
+ @at-root \#{&}-baz {
3163
+ a: b;
3164
+ }
3165
+ }
3166
+ }
3167
+
3168
+ @include foo;
3169
+ SCSS
3170
+ end
3171
+
3172
+ # See https://github.com/sass/sass/issues/1294
3173
+ def test_extend_top_leveled_by_at_root
3174
+ render(<<SCSS)
3175
+ .span-10 {
3176
+ @at-root (without: all) {
3177
+ @extend %column;
3178
+ }
3179
+ }
3180
+ SCSS
3181
+
3182
+ assert(false, "Expected syntax error")
3183
+ rescue Sass::SyntaxError => e
3184
+ assert_equal "Extend directives may only be used within rules.", e.message
3185
+ assert_equal 3, e.sass_line
3186
+ end
3187
+
3188
+ def test_at_root_doesnt_always_break_blocks
3189
+ assert_equal <<CSS, render(<<SCSS)
3190
+ .foo {
3191
+ a: b; }
3192
+
3193
+ @media screen {
3194
+ .foo {
3195
+ c: d; }
3196
+ .bar {
3197
+ e: f; } }
3198
+ CSS
3199
+ %base {
3200
+ a: b;
3201
+ }
3202
+
3203
+ @media screen {
3204
+ .foo {
3205
+ c: d;
3206
+ @at-root (without: media) {
3207
+ @extend %base;
3208
+ }
3209
+ }
3210
+
3211
+ .bar {e: f}
3212
+ }
3213
+ SCSS
3214
+ end
3215
+
2851
3216
  ## Errors
2852
3217
 
3218
+ def test_keyframes_rule_outside_of_keyframes
3219
+ render <<SCSS
3220
+ 0% {
3221
+ top: 0; }
3222
+ SCSS
3223
+ assert(false, "Expected syntax error")
3224
+ rescue Sass::SyntaxError => e
3225
+ assert_equal 'Invalid CSS after "": expected selector, was "0%"', e.message
3226
+ assert_equal 1, e.sass_line
3227
+ end
3228
+
3229
+ def test_selector_rule_in_keyframes
3230
+ render <<SCSS
3231
+ @keyframes identifier {
3232
+ .foo {
3233
+ top: 0; } }
3234
+ SCSS
3235
+ assert(false, "Expected syntax error")
3236
+ rescue Sass::SyntaxError => e
3237
+ assert_equal 'Invalid CSS after "": expected keyframes selector (e.g. 10%), was ".foo"', e.message
3238
+ assert_equal 2, e.sass_line
3239
+ end
3240
+
2853
3241
  def test_nested_mixin_def_is_scoped
2854
3242
  render <<SCSS
2855
3243
  foo {
@@ -2904,7 +3292,7 @@ foo {
2904
3292
  SCSS
2905
3293
  assert(false, "Expected syntax error")
2906
3294
  rescue Sass::SyntaxError => e
2907
- assert_equal 'Invalid CSS after " .bar:baz ": expected "{", was "<fail>; }"', e.message
3295
+ assert_equal 'Invalid CSS after " .bar:baz <fail>": expected expression (e.g. 1px, bold), was "; }"', e.message
2908
3296
  assert_equal 2, e.sass_line
2909
3297
  end
2910
3298
 
@@ -3014,7 +3402,7 @@ SCSS
3014
3402
 
3015
3403
  def test_parent_in_mid_selector_error
3016
3404
  assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
3017
- Invalid CSS after " .foo": expected "{", was "&.bar {a: b}"
3405
+ Invalid CSS after ".foo": expected "{", was "&.bar"
3018
3406
 
3019
3407
  "&.bar" may only be used at the beginning of a compound selector.
3020
3408
  MESSAGE
@@ -3026,7 +3414,7 @@ SCSS
3026
3414
 
3027
3415
  def test_parent_after_selector_error
3028
3416
  assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
3029
- Invalid CSS after " .foo.bar": expected "{", was "& {a: b}"
3417
+ Invalid CSS after ".foo.bar": expected "{", was "&"
3030
3418
 
3031
3419
  "&" may only be used at the beginning of a compound selector.
3032
3420
  MESSAGE
@@ -3038,7 +3426,7 @@ SCSS
3038
3426
 
3039
3427
  def test_double_parent_selector_error
3040
3428
  assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
3041
- Invalid CSS after " &": expected "{", was "& {a: b}"
3429
+ Invalid CSS after "&": expected "{", was "&"
3042
3430
 
3043
3431
  "&" may only be used at the beginning of a compound selector.
3044
3432
  MESSAGE
@@ -3098,8 +3486,59 @@ MESSAGE
3098
3486
  SCSS
3099
3487
  end
3100
3488
 
3489
+ def test_empty_media_query_error
3490
+ assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render(<<SCSS)}
3491
+ Invalid CSS after "": expected media query list, was ""
3492
+ MESSAGE
3493
+ @media \#{""} {
3494
+ foo {a: b}
3495
+ }
3496
+ SCSS
3497
+ end
3498
+
3499
+ def test_newline_in_property_value
3500
+ assert_equal(<<CSS, render(<<SCSS))
3501
+ .foo {
3502
+ bar: "bazbang"; }
3503
+ CSS
3504
+ .foo {
3505
+ $var: "baz\\
3506
+ bang";
3507
+ bar: $var;
3508
+ }
3509
+ SCSS
3510
+ end
3511
+
3512
+ def test_raw_newline_warning
3513
+ assert_warning(<<MESSAGE.rstrip) {assert_equal(<<CSS, render(<<SCSS))}
3514
+ DEPRECATION WARNING on line 2, column 9 of #{filename_for_test :scss}:
3515
+ Unescaped multiline strings are deprecated and will be removed in a future version of Sass.
3516
+ To include a newline in a string, use "\\a" or "\\a " as in CSS.
3517
+ MESSAGE
3518
+ .foo {
3519
+ bar: "baz\\a bang"; }
3520
+ CSS
3521
+ .foo {
3522
+ $var: "baz
3523
+ bang";
3524
+ bar: $var;
3525
+ }
3526
+ SCSS
3527
+ end
3528
+
3101
3529
  # Regression
3102
-
3530
+
3531
+ def test_top_level_unknown_directive_in_at_root
3532
+ assert_equal(<<CSS, render(<<SCSS))
3533
+ @fblthp {
3534
+ a: b; }
3535
+ CSS
3536
+ @at-root {
3537
+ @fblthp {a: b}
3538
+ }
3539
+ SCSS
3540
+ end
3541
+
3103
3542
  def test_parent_ref_with_newline
3104
3543
  assert_equal(<<CSS, render(<<SCSS))
3105
3544
  a.c
@@ -3422,10 +3861,10 @@ SCSS
3422
3861
  }
3423
3862
  .aaa .aaa .aaa {
3424
3863
  background-color: black;
3425
- }
3864
+ }
3426
3865
  .bbb {
3427
3866
  @extend .aaa;
3428
- }
3867
+ }
3429
3868
  .xxx {
3430
3869
  @extend .bbb;
3431
3870
  }