sass 3.4.25 → 3.5.0

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 (135) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/Rakefile +2 -117
  4. data/VERSION +1 -1
  5. data/VERSION_DATE +1 -1
  6. data/VERSION_NAME +1 -1
  7. data/lib/sass/cache_stores/filesystem.rb +1 -1
  8. data/lib/sass/css.rb +1 -2
  9. data/lib/sass/engine.rb +38 -20
  10. data/lib/sass/environment.rb +26 -5
  11. data/lib/sass/error.rb +2 -2
  12. data/lib/sass/exec/base.rb +2 -11
  13. data/lib/sass/features.rb +1 -0
  14. data/lib/sass/importers/filesystem.rb +2 -2
  15. data/lib/sass/plugin/compiler.rb +20 -50
  16. data/lib/sass/plugin/configuration.rb +2 -2
  17. data/lib/sass/railtie.rb +1 -1
  18. data/lib/sass/script/functions.rb +235 -43
  19. data/lib/sass/script/lexer.rb +13 -2
  20. data/lib/sass/script/parser.rb +69 -67
  21. data/lib/sass/script/tree/funcall.rb +35 -30
  22. data/lib/sass/script/tree/list_literal.rb +23 -8
  23. data/lib/sass/script/tree/map_literal.rb +2 -2
  24. data/lib/sass/script/tree/node.rb +0 -8
  25. data/lib/sass/script/tree/operation.rb +0 -7
  26. data/lib/sass/script/value/arg_list.rb +1 -1
  27. data/lib/sass/script/value/base.rb +17 -0
  28. data/lib/sass/script/value/callable.rb +25 -0
  29. data/lib/sass/script/value/color.rb +5 -0
  30. data/lib/sass/script/value/function.rb +19 -0
  31. data/lib/sass/script/value/helpers.rb +29 -9
  32. data/lib/sass/script/value/list.rb +35 -14
  33. data/lib/sass/script/value/map.rb +2 -2
  34. data/lib/sass/script/value/number.rb +1 -1
  35. data/lib/sass/script/value.rb +2 -0
  36. data/lib/sass/scss/parser.rb +99 -40
  37. data/lib/sass/scss/rx.rb +4 -10
  38. data/lib/sass/scss/static_parser.rb +5 -24
  39. data/lib/sass/selector/abstract_sequence.rb +7 -6
  40. data/lib/sass/selector/comma_sequence.rb +7 -4
  41. data/lib/sass/selector/pseudo.rb +19 -2
  42. data/lib/sass/selector/sequence.rb +35 -6
  43. data/lib/sass/selector/simple.rb +9 -2
  44. data/lib/sass/selector/simple_sequence.rb +8 -4
  45. data/lib/sass/selector.rb +4 -0
  46. data/lib/sass/source/map.rb +2 -2
  47. data/lib/sass/stack.rb +21 -1
  48. data/lib/sass/tree/charset_node.rb +1 -1
  49. data/lib/sass/tree/prop_node.rb +45 -53
  50. data/lib/sass/tree/rule_node.rb +3 -2
  51. data/lib/sass/tree/visitors/check_nesting.rb +1 -1
  52. data/lib/sass/tree/visitors/convert.rb +2 -3
  53. data/lib/sass/tree/visitors/cssize.rb +4 -15
  54. data/lib/sass/tree/visitors/deep_copy.rb +1 -1
  55. data/lib/sass/tree/visitors/extend.rb +2 -8
  56. data/lib/sass/tree/visitors/perform.rb +21 -9
  57. data/lib/sass/tree/visitors/set_options.rb +1 -1
  58. data/lib/sass/tree/visitors/to_css.rb +47 -13
  59. data/lib/sass/util/multibyte_string_scanner.rb +127 -131
  60. data/lib/sass/util/normalized_map.rb +1 -8
  61. data/lib/sass/util.rb +12 -290
  62. data/lib/sass/version.rb +0 -2
  63. data/lib/sass.rb +0 -7
  64. data/test/sass/cache_test.rb +0 -1
  65. data/test/sass/callbacks_test.rb +0 -1
  66. data/test/sass/compiler_test.rb +4 -15
  67. data/test/sass/conversion_test.rb +113 -163
  68. data/test/sass/css2sass_test.rb +16 -19
  69. data/test/sass/css_variable_test.rb +176 -71
  70. data/test/sass/encoding_test.rb +2 -33
  71. data/test/sass/engine_test.rb +71 -19
  72. data/test/sass/exec_test.rb +0 -1
  73. data/test/sass/extend_test.rb +37 -92
  74. data/test/sass/functions_test.rb +58 -14
  75. data/test/sass/importer_test.rb +2 -3
  76. data/test/sass/logger_test.rb +0 -1
  77. data/test/sass/plugin_test.rb +6 -10
  78. data/test/sass/results/script.css +1 -1
  79. data/test/sass/results/units.css +2 -2
  80. data/test/sass/script_conversion_test.rb +10 -2
  81. data/test/sass/script_test.rb +22 -24
  82. data/test/sass/scss/css_test.rb +3 -18
  83. data/test/sass/scss/rx_test.rb +0 -1
  84. data/test/sass/scss/scss_test.rb +49 -16
  85. data/test/sass/source_map_test.rb +13 -16
  86. data/test/sass/superselector_test.rb +0 -1
  87. data/test/sass/util/multibyte_string_scanner_test.rb +121 -124
  88. data/test/sass/util/normalized_map_test.rb +0 -1
  89. data/test/sass/util/subset_map_test.rb +0 -1
  90. data/test/sass/util_test.rb +4 -39
  91. data/test/sass/value_helpers_test.rb +0 -1
  92. data/test/sass-spec.yml +1 -1
  93. data/test/test_helper.rb +39 -0
  94. metadata +19 -44
  95. data/lib/sass/script/css_variable_warning.rb +0 -52
  96. data/lib/sass/util/cross_platform_random.rb +0 -19
  97. data/lib/sass/util/ordered_hash.rb +0 -192
  98. data/test/sass/results/import_charset_1_8.css +0 -5
  99. data/test/sass/templates/import_charset_1_8.sass +0 -6
  100. data/vendor/listen/CHANGELOG.md +0 -1
  101. data/vendor/listen/CONTRIBUTING.md +0 -38
  102. data/vendor/listen/Gemfile +0 -20
  103. data/vendor/listen/Guardfile +0 -8
  104. data/vendor/listen/LICENSE +0 -20
  105. data/vendor/listen/README.md +0 -349
  106. data/vendor/listen/Rakefile +0 -5
  107. data/vendor/listen/Vagrantfile +0 -96
  108. data/vendor/listen/lib/listen/adapter.rb +0 -327
  109. data/vendor/listen/lib/listen/adapters/bsd.rb +0 -75
  110. data/vendor/listen/lib/listen/adapters/darwin.rb +0 -48
  111. data/vendor/listen/lib/listen/adapters/linux.rb +0 -81
  112. data/vendor/listen/lib/listen/adapters/polling.rb +0 -58
  113. data/vendor/listen/lib/listen/adapters/windows.rb +0 -91
  114. data/vendor/listen/lib/listen/directory_record.rb +0 -406
  115. data/vendor/listen/lib/listen/listener.rb +0 -323
  116. data/vendor/listen/lib/listen/turnstile.rb +0 -32
  117. data/vendor/listen/lib/listen/version.rb +0 -3
  118. data/vendor/listen/lib/listen.rb +0 -54
  119. data/vendor/listen/listen.gemspec +0 -28
  120. data/vendor/listen/spec/listen/adapter_spec.rb +0 -149
  121. data/vendor/listen/spec/listen/adapters/bsd_spec.rb +0 -36
  122. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +0 -37
  123. data/vendor/listen/spec/listen/adapters/linux_spec.rb +0 -47
  124. data/vendor/listen/spec/listen/adapters/polling_spec.rb +0 -68
  125. data/vendor/listen/spec/listen/adapters/windows_spec.rb +0 -30
  126. data/vendor/listen/spec/listen/directory_record_spec.rb +0 -1250
  127. data/vendor/listen/spec/listen/listener_spec.rb +0 -258
  128. data/vendor/listen/spec/listen/turnstile_spec.rb +0 -56
  129. data/vendor/listen/spec/listen_spec.rb +0 -67
  130. data/vendor/listen/spec/spec_helper.rb +0 -25
  131. data/vendor/listen/spec/support/adapter_helper.rb +0 -666
  132. data/vendor/listen/spec/support/directory_record_helper.rb +0 -57
  133. data/vendor/listen/spec/support/fixtures_helper.rb +0 -29
  134. data/vendor/listen/spec/support/listeners_helper.rb +0 -179
  135. data/vendor/listen/spec/support/platform_helper.rb +0 -15
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: utf-8 -*-
3
2
  require File.dirname(__FILE__) + '/../../test_helper'
4
3
  require 'sass/engine'
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: utf-8 -*-
3
2
  require File.dirname(__FILE__) + '/test_helper'
4
3
 
@@ -3389,22 +3388,22 @@ SCSS
3389
3388
  def test_uses_property_exception_with_star_hack
3390
3389
  render <<SCSS
3391
3390
  foo {
3392
- *bar:baz [fail]; }
3391
+ *bar:baz <fail>; }
3393
3392
  SCSS
3394
3393
  assert(false, "Expected syntax error")
3395
3394
  rescue Sass::SyntaxError => e
3396
- assert_equal 'Invalid CSS after " *bar:baz ": expected ";", was "[fail]; }"', e.message
3395
+ assert_equal 'Invalid CSS after " *bar:baz <fail>": expected expression (e.g. 1px, bold), was "; }"', e.message
3397
3396
  assert_equal 2, e.sass_line
3398
3397
  end
3399
3398
 
3400
3399
  def test_uses_property_exception_with_colon_hack
3401
3400
  render <<SCSS
3402
3401
  foo {
3403
- :bar:baz [fail]; }
3402
+ :bar:baz <fail>; }
3404
3403
  SCSS
3405
3404
  assert(false, "Expected syntax error")
3406
3405
  rescue Sass::SyntaxError => e
3407
- assert_equal 'Invalid CSS after " :bar:baz ": expected ";", was "[fail]; }"', e.message
3406
+ assert_equal 'Invalid CSS after " :bar:baz <fail>": expected expression (e.g. 1px, bold), was "; }"', e.message
3408
3407
  assert_equal 2, e.sass_line
3409
3408
  end
3410
3409
 
@@ -3422,22 +3421,22 @@ SCSS
3422
3421
  def test_uses_property_exception_with_space_after_name
3423
3422
  render <<SCSS
3424
3423
  foo {
3425
- bar: baz [fail]; }
3424
+ bar: baz <fail>; }
3426
3425
  SCSS
3427
3426
  assert(false, "Expected syntax error")
3428
3427
  rescue Sass::SyntaxError => e
3429
- assert_equal 'Invalid CSS after " bar: baz ": expected ";", was "[fail]; }"', e.message
3428
+ assert_equal 'Invalid CSS after " bar: baz <fail>": expected expression (e.g. 1px, bold), was "; }"', e.message
3430
3429
  assert_equal 2, e.sass_line
3431
3430
  end
3432
3431
 
3433
3432
  def test_uses_property_exception_with_non_identifier_after_name
3434
3433
  render <<SCSS
3435
3434
  foo {
3436
- bar:1px [fail]; }
3435
+ bar:1px <fail>; }
3437
3436
  SCSS
3438
3437
  assert(false, "Expected syntax error")
3439
3438
  rescue Sass::SyntaxError => e
3440
- assert_equal 'Invalid CSS after " bar:1px ": expected ";", was "[fail]; }"', e.message
3439
+ assert_equal 'Invalid CSS after " bar:1px <fail>": expected expression (e.g. 1px, bold), was "; }"', e.message
3441
3440
  assert_equal 2, e.sass_line
3442
3441
  end
3443
3442
 
@@ -3827,7 +3826,7 @@ SCSS
3827
3826
  def test_parsing_decimals_followed_by_comments_doesnt_take_forever
3828
3827
  assert_equal(<<CSS, render(<<SCSS))
3829
3828
  .foo {
3830
- padding: 4.21053% 4.21053% 5.63158%; }
3829
+ padding: 4.2105263158% 4.2105263158% 5.6315789474%; }
3831
3830
  CSS
3832
3831
  .foo {
3833
3832
  padding: 4.21052631578947% 4.21052631578947% 5.631578947368421% /**/
@@ -3942,12 +3941,13 @@ a.\#{"foo"} b
3942
3941
  SCSS
3943
3942
  end
3944
3943
 
3945
- def test_extra_comma_in_mixin_arglist_error
3946
- assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
3947
- Invalid CSS after "...clude foo(bar, ": expected mixin argument, was ");"
3948
- MESSAGE
3949
- @mixin foo($a1, $a2) {
3950
- baz: $a1 $a2;
3944
+ def test_extra_comma_in_mixin_arglist
3945
+ assert_equal <<CSS, render(<<SCSS)
3946
+ .bar {
3947
+ baz: bar; }
3948
+ CSS
3949
+ @mixin foo($a1,) {
3950
+ baz: $a1;
3951
3951
  }
3952
3952
 
3953
3953
  .bar {
@@ -3956,6 +3956,39 @@ MESSAGE
3956
3956
  SCSS
3957
3957
  end
3958
3958
 
3959
+
3960
+ def test_extra_comma_between_parameters_in_mixin_arglist
3961
+ assert_raise_message(Sass::SyntaxError, "Invalid CSS after \"...nclude foo(bar,\": expected \")\", was \", baz );\"") {render <<SCSS}
3962
+ @mixin foo($a1, $a2) {
3963
+ baz: $a1;
3964
+ bef: $a2;
3965
+ }
3966
+
3967
+ .bar {
3968
+ @include foo(bar,, baz );
3969
+ }
3970
+ SCSS
3971
+ end
3972
+
3973
+
3974
+ def test_extra_comma_in_mixin_arglist_ending_needs_have_parentheses_after
3975
+ assert_raise_message(Sass::SyntaxError, "Invalid CSS after \" bri,\": expected \")\", was \"};\"") {render <<SCSS}
3976
+ @mixin foo($a1, $a2) {
3977
+ baz: $a1;
3978
+ bal: $a2;
3979
+ }
3980
+
3981
+ .bar {
3982
+ @include foo(
3983
+ bar,
3984
+ bri,
3985
+ };
3986
+ }
3987
+ SCSS
3988
+ end
3989
+
3990
+
3991
+
3959
3992
  def test_interpolation
3960
3993
  assert_equal <<CSS, render(<<SCSS)
3961
3994
  ul li#foo a span.label {
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: utf-8 -*-
3
2
  require File.dirname(__FILE__) + '/../test_helper'
4
3
  require File.dirname(__FILE__) + '/test_helper'
@@ -61,7 +60,7 @@ JSON
61
60
  end
62
61
 
63
62
  def test_simple_mapping_with_file_uris
64
- uri = Sass::Util.file_uri_from_path(Sass::Util.absolute_path(filename_for_test(:scss)))
63
+ uri = Sass::Util.file_uri_from_path(File.absolute_path(filename_for_test(:scss)))
65
64
  assert_parses_with_sourcemap <<SCSS, <<CSS, <<JSON, :sourcemap => :file
66
65
  a {
67
66
  foo: bar;
@@ -137,9 +136,8 @@ CSS
137
136
  JSON
138
137
  end
139
138
 
140
- unless Sass::Util.ruby1_8?
141
- def test_simple_charset_mapping_scss
142
- assert_parses_with_sourcemap <<SCSS, <<CSS, <<JSON
139
+ def test_simple_charset_mapping_scss
140
+ assert_parses_with_sourcemap <<SCSS, <<CSS, <<JSON
143
141
  a {
144
142
  fóó: bár;
145
143
  }
@@ -158,10 +156,10 @@ CSS
158
156
  "file": "test.css"
159
157
  }
160
158
  JSON
161
- end
159
+ end
162
160
 
163
- def test_simple_charset_mapping_sass
164
- assert_parses_with_sourcemap <<SASS, <<CSS, <<JSON, :syntax => :sass
161
+ def test_simple_charset_mapping_sass
162
+ assert_parses_with_sourcemap <<SASS, <<CSS, <<JSON, :syntax => :sass
165
163
  a
166
164
  fóó: bár
167
165
  SASS
@@ -179,10 +177,10 @@ CSS
179
177
  "file": "test.css"
180
178
  }
181
179
  JSON
182
- end
180
+ end
183
181
 
184
- def test_different_charset_than_encoding_scss
185
- assert_parses_with_sourcemap(<<SCSS.force_encoding("IBM866"), <<CSS, <<JSON)
182
+ def test_different_charset_than_encoding_scss
183
+ assert_parses_with_sourcemap(<<SCSS.force_encoding("IBM866"), <<CSS, <<JSON)
186
184
  @charset "IBM866";
187
185
  f\x86\x86 {
188
186
  \x86: b;
@@ -202,10 +200,10 @@ CSS
202
200
  "file": "test.css"
203
201
  }
204
202
  JSON
205
- end
203
+ end
206
204
 
207
- def test_different_charset_than_encoding_sass
208
- assert_parses_with_sourcemap(<<SASS.force_encoding("IBM866"), <<CSS, <<JSON, :syntax => :sass)
205
+ def test_different_charset_than_encoding_sass
206
+ assert_parses_with_sourcemap(<<SASS.force_encoding("IBM866"), <<CSS, <<JSON, :syntax => :sass)
209
207
  @charset "IBM866"
210
208
  f\x86\x86
211
209
  \x86: b
@@ -224,7 +222,6 @@ CSS
224
222
  "file": "test.css"
225
223
  }
226
224
  JSON
227
- end
228
225
  end
229
226
 
230
227
  def test_import_sourcemap_scss
@@ -796,7 +793,7 @@ SCSS
796
793
 
797
794
  interpolated = engine.to_tree.children.
798
795
  first.children.
799
- first.value.children[1]
796
+ first.value.first.children[1]
800
797
  assert_equal "123", interpolated.to_sass
801
798
  range = interpolated.source_range
802
799
  assert_equal 3, range.start_pos.line
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  require File.dirname(__FILE__) + '/../test_helper'
3
2
 
4
3
  class SuperselectorTest < MiniTest::Test
@@ -1,155 +1,152 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: utf-8 -*-
3
2
  require File.dirname(__FILE__) + '/../../test_helper'
4
3
 
5
- unless Sass::Util.ruby1_8?
6
- class MultibyteStringScannerTest < MiniTest::Test
7
- def setup
8
- @scanner = Sass::Util::MultibyteStringScanner.new("cölorfül")
9
- end
4
+ class MultibyteStringScannerTest < MiniTest::Test
5
+ def setup
6
+ @scanner = Sass::Util::MultibyteStringScanner.new("cölorfül")
7
+ end
10
8
 
11
- def test_initial
12
- assert_scanner_state 0, 0, nil, nil
13
- end
9
+ def test_initial
10
+ assert_scanner_state 0, 0, nil, nil
11
+ end
14
12
 
15
- def test_check
16
- assert_equal 'cö', @scanner.check(/../)
17
- assert_scanner_state 0, 0, 2, 3
18
- assert_equal 0, @scanner.pos
19
- assert_equal 0, @scanner.pos
20
- assert_equal 2, @scanner.matched_size
21
- assert_equal 3, @scanner.byte_matched_size
22
- end
13
+ def test_check
14
+ assert_equal 'cö', @scanner.check(/../)
15
+ assert_scanner_state 0, 0, 2, 3
16
+ assert_equal 0, @scanner.pos
17
+ assert_equal 0, @scanner.pos
18
+ assert_equal 2, @scanner.matched_size
19
+ assert_equal 3, @scanner.byte_matched_size
20
+ end
23
21
 
24
- def test_check_until
25
- assert_equal 'cölorfü', @scanner.check_until(/f./)
26
- assert_scanner_state 0, 0, 2, 3
27
- end
22
+ def test_check_until
23
+ assert_equal 'cölorfü', @scanner.check_until(/f./)
24
+ assert_scanner_state 0, 0, 2, 3
25
+ end
28
26
 
29
- def test_getch
30
- assert_equal 'c', @scanner.getch
31
- assert_equal 'ö', @scanner.getch
32
- assert_scanner_state 2, 3, 1, 2
33
- end
27
+ def test_getch
28
+ assert_equal 'c', @scanner.getch
29
+ assert_equal 'ö', @scanner.getch
30
+ assert_scanner_state 2, 3, 1, 2
31
+ end
34
32
 
35
- def test_match?
36
- assert_equal 2, @scanner.match?(/../)
37
- assert_scanner_state 0, 0, 2, 3
38
- end
33
+ def test_match?
34
+ assert_equal 2, @scanner.match?(/../)
35
+ assert_scanner_state 0, 0, 2, 3
36
+ end
39
37
 
40
- def test_peek
41
- assert_equal 'cö', @scanner.peek(2)
42
- assert_scanner_state 0, 0, nil, nil
43
- end
38
+ def test_peek
39
+ assert_equal 'cö', @scanner.peek(2)
40
+ assert_scanner_state 0, 0, nil, nil
41
+ end
44
42
 
45
- def test_rest_size
46
- assert_equal 'cö', @scanner.scan(/../)
47
- assert_equal 6, @scanner.rest_size
48
- end
43
+ def test_rest_size
44
+ assert_equal 'cö', @scanner.scan(/../)
45
+ assert_equal 6, @scanner.rest_size
46
+ end
49
47
 
50
- def test_scan
51
- assert_equal 'cö', @scanner.scan(/../)
52
- assert_scanner_state 2, 3, 2, 3
53
- end
48
+ def test_scan
49
+ assert_equal 'cö', @scanner.scan(/../)
50
+ assert_scanner_state 2, 3, 2, 3
51
+ end
54
52
 
55
- def test_scan_until
56
- assert_equal 'cölorfü', @scanner.scan_until(/f./)
57
- assert_scanner_state 7, 9, 2, 3
58
- end
53
+ def test_scan_until
54
+ assert_equal 'cölorfü', @scanner.scan_until(/f./)
55
+ assert_scanner_state 7, 9, 2, 3
56
+ end
59
57
 
60
- def test_skip
61
- assert_equal 2, @scanner.skip(/../)
62
- assert_scanner_state 2, 3, 2, 3
63
- end
58
+ def test_skip
59
+ assert_equal 2, @scanner.skip(/../)
60
+ assert_scanner_state 2, 3, 2, 3
61
+ end
64
62
 
65
- def test_skip_until
66
- assert_equal 7, @scanner.skip_until(/f./)
67
- assert_scanner_state 7, 9, 2, 3
68
- end
63
+ def test_skip_until
64
+ assert_equal 7, @scanner.skip_until(/f./)
65
+ assert_scanner_state 7, 9, 2, 3
66
+ end
69
67
 
70
- def test_set_pos
71
- @scanner.pos = 7
72
- assert_scanner_state 7, 9, nil, nil
73
- @scanner.pos = 6
74
- assert_scanner_state 6, 7, nil, nil
75
- @scanner.pos = 1
76
- assert_scanner_state 1, 1, nil, nil
77
- end
68
+ def test_set_pos
69
+ @scanner.pos = 7
70
+ assert_scanner_state 7, 9, nil, nil
71
+ @scanner.pos = 6
72
+ assert_scanner_state 6, 7, nil, nil
73
+ @scanner.pos = 1
74
+ assert_scanner_state 1, 1, nil, nil
75
+ end
78
76
 
79
- def test_reset
80
- @scanner.scan(/../)
81
- @scanner.reset
82
- assert_scanner_state 0, 0, nil, nil
83
- end
77
+ def test_reset
78
+ @scanner.scan(/../)
79
+ @scanner.reset
80
+ assert_scanner_state 0, 0, nil, nil
81
+ end
84
82
 
85
- def test_scan_full
86
- assert_equal 'cö', @scanner.scan_full(/../, true, true)
87
- assert_scanner_state 2, 3, 2, 3
83
+ def test_scan_full
84
+ assert_equal 'cö', @scanner.scan_full(/../, true, true)
85
+ assert_scanner_state 2, 3, 2, 3
88
86
 
89
- @scanner.reset
90
- assert_equal 'cö', @scanner.scan_full(/../, false, true)
91
- assert_scanner_state 0, 0, 2, 3
87
+ @scanner.reset
88
+ assert_equal 'cö', @scanner.scan_full(/../, false, true)
89
+ assert_scanner_state 0, 0, 2, 3
92
90
 
93
- @scanner.reset
94
- assert_nil @scanner.scan_full(/../, true, false)
95
- assert_scanner_state 2, 3, 2, 3
91
+ @scanner.reset
92
+ assert_nil @scanner.scan_full(/../, true, false)
93
+ assert_scanner_state 2, 3, 2, 3
96
94
 
97
- @scanner.reset
98
- assert_nil @scanner.scan_full(/../, false, false)
99
- assert_scanner_state 0, 0, 2, 3
100
- end
95
+ @scanner.reset
96
+ assert_nil @scanner.scan_full(/../, false, false)
97
+ assert_scanner_state 0, 0, 2, 3
98
+ end
101
99
 
102
- def test_search_full
103
- assert_equal 'cölorfü', @scanner.search_full(/f./, true, true)
104
- assert_scanner_state 7, 9, 2, 3
100
+ def test_search_full
101
+ assert_equal 'cölorfü', @scanner.search_full(/f./, true, true)
102
+ assert_scanner_state 7, 9, 2, 3
105
103
 
106
- @scanner.reset
107
- assert_equal 'cölorfü', @scanner.search_full(/f./, false, true)
108
- assert_scanner_state 0, 0, 2, 3
104
+ @scanner.reset
105
+ assert_equal 'cölorfü', @scanner.search_full(/f./, false, true)
106
+ assert_scanner_state 0, 0, 2, 3
109
107
 
110
- @scanner.reset
111
- assert_nil @scanner.search_full(/f./, true, false)
112
- assert_scanner_state 7, 9, 2, 3
108
+ @scanner.reset
109
+ assert_nil @scanner.search_full(/f./, true, false)
110
+ assert_scanner_state 7, 9, 2, 3
113
111
 
114
- @scanner.reset
115
- assert_nil @scanner.search_full(/f./, false, false)
116
- assert_scanner_state 0, 0, 2, 3
117
- end
112
+ @scanner.reset
113
+ assert_nil @scanner.search_full(/f./, false, false)
114
+ assert_scanner_state 0, 0, 2, 3
115
+ end
118
116
 
119
- def test_set_string
120
- @scanner.scan(/../)
121
- @scanner.string = 'föóbâr'
122
- assert_scanner_state 0, 0, nil, nil
123
- end
117
+ def test_set_string
118
+ @scanner.scan(/../)
119
+ @scanner.string = 'föóbâr'
120
+ assert_scanner_state 0, 0, nil, nil
121
+ end
124
122
 
125
- def test_terminate
126
- @scanner.scan(/../)
127
- @scanner.terminate
128
- assert_scanner_state 8, 10, nil, nil
129
- end
123
+ def test_terminate
124
+ @scanner.scan(/../)
125
+ @scanner.terminate
126
+ assert_scanner_state 8, 10, nil, nil
127
+ end
130
128
 
131
- def test_unscan
132
- @scanner.scan(/../)
133
- @scanner.scan_until(/f./)
134
- @scanner.unscan
135
- assert_scanner_state 2, 3, nil, nil
136
- end
129
+ def test_unscan
130
+ @scanner.scan(/../)
131
+ @scanner.scan_until(/f./)
132
+ @scanner.unscan
133
+ assert_scanner_state 2, 3, nil, nil
134
+ end
137
135
 
138
- private
139
-
140
- def assert_scanner_state(pos, byte_pos, matched_size, byte_matched_size)
141
- assert_equal pos, @scanner.pos, 'pos'
142
- assert_equal byte_pos, @scanner.byte_pos, 'byte_pos'
143
- if matched_size.nil?
144
- assert_nil @scanner.matched_size, 'matched_size'
145
- else
146
- assert_equal matched_size, @scanner.matched_size, 'matched_size'
147
- end
148
- if byte_matched_size.nil?
149
- assert_nil @scanner.byte_matched_size, 'byte_matched_size'
150
- else
151
- assert_equal byte_matched_size, @scanner.byte_matched_size, 'byte_matched_size'
152
- end
136
+ private
137
+
138
+ def assert_scanner_state(pos, byte_pos, matched_size, byte_matched_size)
139
+ assert_equal pos, @scanner.pos, 'pos'
140
+ assert_equal byte_pos, @scanner.byte_pos, 'byte_pos'
141
+ if matched_size.nil?
142
+ assert_nil @scanner.matched_size, 'matched_size'
143
+ else
144
+ assert_equal matched_size, @scanner.matched_size, 'matched_size'
145
+ end
146
+ if byte_matched_size.nil?
147
+ assert_nil @scanner.byte_matched_size, 'byte_matched_size'
148
+ else
149
+ assert_equal byte_matched_size, @scanner.byte_matched_size, 'byte_matched_size'
153
150
  end
154
151
  end
155
152
  end
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  require File.dirname(__FILE__) + '/../../test_helper'
3
2
  require 'sass/util/normalized_map'
4
3
 
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  require File.dirname(__FILE__) + '/../../test_helper'
3
2
 
4
3
  class SubsetMapTest < MiniTest::Test
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  require File.dirname(__FILE__) + '/../test_helper'
3
2
  require 'pathname'
4
3
  require 'tmpdir'
@@ -10,14 +9,6 @@ class UtilTest < MiniTest::Test
10
9
  assert(File.exist?(scope("Rakefile")))
11
10
  end
12
11
 
13
- def test_to_hash
14
- assert_equal({
15
- :foo => 1,
16
- :bar => 2,
17
- :baz => 3
18
- }, to_hash([[:foo, 1], [:bar, 2], [:baz, 3]]))
19
- end
20
-
21
12
  def test_map_keys
22
13
  assert_equal({
23
14
  "foo" => 1,
@@ -52,7 +43,6 @@ class UtilTest < MiniTest::Test
52
43
  end
53
44
 
54
45
  def test_powerset
55
- return unless Set[Set[]] == Set[Set[]] # There's a bug in Ruby 1.8.6 that breaks nested set equality
56
46
  assert_equal([[].to_set].to_set,
57
47
  powerset([]))
58
48
  assert_equal([[].to_set, [1].to_set].to_set,
@@ -139,13 +129,6 @@ class UtilTest < MiniTest::Test
139
129
  lcs([-5, 3, 2, 8], [-4, 1, 8]) {|a, b| (a - b).abs <= 1 && [a, b].max})
140
130
  end
141
131
 
142
- def test_group_by_to_a
143
- assert_equal([[1, [1, 3, 5, 7]], [0, [2, 4, 6, 8]]],
144
- group_by_to_a(1..8) {|i| i % 2})
145
- assert_equal([[1, [1, 4, 7, 10]], [2, [2, 5, 8, 11]], [0, [3, 6, 9, 12]]],
146
- group_by_to_a(1..12) {|i| i % 3})
147
- end
148
-
149
132
  def test_subsequence
150
133
  assert(subsequence?([1, 2, 3], [1, 2, 3]))
151
134
  assert(subsequence?([1, 2, 3], [1, :a, 2, :b, 3]))
@@ -180,32 +163,12 @@ class UtilTest < MiniTest::Test
180
163
  $stderr = old_stderr
181
164
  end
182
165
 
183
- def test_has
184
- assert(has?(:instance_method, String, :chomp!))
185
- assert(has?(:private_instance_method, Sass::Engine, :parse_interp))
186
- end
187
-
188
- def test_enum_with_index
189
- assert_equal(%w[foo0 bar1 baz2],
190
- enum_with_index(%w[foo bar baz]).map {|s, i| "#{s}#{i}"})
191
- end
192
-
193
- def test_enum_cons
194
- assert_equal(%w[foobar barbaz],
195
- enum_cons(%w[foo bar baz], 2).map {|s1, s2| "#{s1}#{s2}"})
196
- end
197
-
198
166
  def test_extract
199
167
  arr = [1, 2, 3, 4, 5]
200
168
  assert_equal([1, 3, 5], extract!(arr) {|e| e % 2 == 1})
201
169
  assert_equal([2, 4], arr)
202
170
  end
203
171
 
204
- def test_ord
205
- assert_equal(102, ord("f"))
206
- assert_equal(98, ord("bar"))
207
- end
208
-
209
172
  def test_flatten_vertically
210
173
  assert_equal([1, 2, 3], flatten_vertically([1, 2, 3]))
211
174
  assert_equal([1, 3, 5, 2, 4, 6], flatten_vertically([[1, 2], [3, 4], [5, 6]]))
@@ -356,8 +319,10 @@ WARNING
356
319
 
357
320
  def test_round_respects_precision
358
321
  original_precision = Sass::Script::Value::Number.precision
359
- assert_equal 0, Sass::Util.round(0.49999)
360
- assert_equal 1, Sass::Util.round(0.499999)
322
+ assert_equal 0, Sass::Util.round(0.4999999999)
323
+ # 10 9s doesn't work because 0.49999999999 - 0.5 is very slightly greater
324
+ # than -0.1e11 due to float nonsense.
325
+ assert_equal 1, Sass::Util.round(0.499999999999)
361
326
  Sass::Script::Value::Number.precision = 6
362
327
  assert_equal 0, Sass::Util.round(0.499999)
363
328
  assert_equal 1, Sass::Util.round(0.49999999)
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  require File.dirname(__FILE__) + '/../test_helper'
3
2
 
4
3
  class ValueHelpersTest < MiniTest::Test
data/test/sass-spec.yml CHANGED
@@ -1,3 +1,3 @@
1
1
  ---
2
2
  :enabled: true
3
- :language_version: '3.4'
3
+ :language_version: '3.5'
data/test/test_helper.rb CHANGED
@@ -93,6 +93,45 @@ class MiniTest::Test
93
93
  else
94
94
  flunk "Expected exception on line #{line}, none raised"
95
95
  end
96
+
97
+ def assert_sass_to_sass(sass, options: {})
98
+ assert_equal(sass.rstrip, to_sass(sass, options).rstrip,
99
+ "Expected Sass to transform to itself")
100
+ end
101
+
102
+ def assert_scss_to_sass(sass, scss, options: {})
103
+ assert_equal(sass.rstrip, to_sass(scss, options.merge(:syntax => :scss)).rstrip,
104
+ "Expected SCSS to transform to Sass")
105
+ end
106
+
107
+ def assert_scss_to_scss(scss, source: scss, options: {})
108
+ assert_equal(scss.rstrip, to_scss(source, options.merge(:syntax => :scss)).rstrip,
109
+ "Expected SCSS to transform to #{scss == source ? 'itself' : 'SCSS'}")
110
+ end
111
+
112
+ def assert_sass_to_scss(scss, sass, options: {})
113
+ assert_equal(scss.rstrip, to_scss(sass, options).rstrip,
114
+ "Expected Sass to transform to SCSS")
115
+ end
116
+
117
+ def assert_converts(sass, scss, options: {})
118
+ assert_sass_to_sass(sass, options: options)
119
+ assert_scss_to_sass(sass, scss, options: options)
120
+ assert_scss_to_scss(scss, options: options)
121
+ assert_sass_to_scss(scss, sass, options: options)
122
+ end
123
+
124
+ def to_sass(scss, options = {})
125
+ Sass::Util.silence_sass_warnings do
126
+ Sass::Engine.new(scss, options).to_tree.to_sass(options)
127
+ end
128
+ end
129
+
130
+ def to_scss(sass, options = {})
131
+ Sass::Util.silence_sass_warnings do
132
+ Sass::Engine.new(sass, options).to_tree.to_scss(options)
133
+ end
134
+ end
96
135
  end
97
136
 
98
137
  module PublicApiLinter