sass 3.5.2 → 3.7.4

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 (163) hide show
  1. checksums.yaml +4 -4
  2. data/CODE_OF_CONDUCT.md +1 -1
  3. data/CONTRIBUTING.md +3 -3
  4. data/README.md +17 -9
  5. data/VERSION +1 -1
  6. data/VERSION_DATE +1 -1
  7. data/extra/sass-spec-ref.sh +9 -1
  8. data/lib/sass/engine.rb +1 -9
  9. data/lib/sass/exec/base.rb +0 -2
  10. data/lib/sass/exec/sass_scss.rb +1 -5
  11. data/lib/sass/importers/filesystem.rb +4 -2
  12. data/lib/sass/logger/base.rb +11 -0
  13. data/lib/sass/script/css_parser.rb +4 -1
  14. data/lib/sass/script/functions.rb +76 -41
  15. data/lib/sass/script/lexer.rb +62 -19
  16. data/lib/sass/script/parser.rb +260 -93
  17. data/lib/sass/script/tree/funcall.rb +0 -4
  18. data/lib/sass/script/tree/interpolation.rb +0 -3
  19. data/lib/sass/script/tree/operation.rb +1 -1
  20. data/lib/sass/script/value/color.rb +3 -2
  21. data/lib/sass/script/value/helpers.rb +8 -2
  22. data/lib/sass/script/value/number.rb +2 -1
  23. data/lib/sass/scss/css_parser.rb +6 -1
  24. data/lib/sass/scss/parser.rb +48 -18
  25. data/lib/sass/scss/rx.rb +1 -1
  26. data/lib/sass/scss/static_parser.rb +15 -18
  27. data/lib/sass/selector/comma_sequence.rb +2 -1
  28. data/lib/sass/selector/pseudo.rb +1 -1
  29. data/lib/sass/selector/sequence.rb +0 -4
  30. data/lib/sass/source/map.rb +0 -4
  31. data/lib/sass/tree/rule_node.rb +3 -6
  32. data/lib/sass/tree/visitors/perform.rb +2 -6
  33. data/lib/sass/tree/visitors/to_css.rb +4 -11
  34. data/lib/sass/util.rb +60 -20
  35. data/lib/sass/version.rb +0 -2
  36. metadata +38 -162
  37. data/Rakefile +0 -338
  38. data/lib/test.css +0 -4
  39. data/lib/test.css.map +0 -7
  40. data/test/sass-spec.yml +0 -3
  41. data/test/sass/cache_test.rb +0 -130
  42. data/test/sass/callbacks_test.rb +0 -60
  43. data/test/sass/compiler_test.rb +0 -225
  44. data/test/sass/conversion_test.rb +0 -2138
  45. data/test/sass/css2sass_test.rb +0 -523
  46. data/test/sass/css_variable_test.rb +0 -237
  47. data/test/sass/data/hsl-rgb.txt +0 -319
  48. data/test/sass/encoding_test.rb +0 -188
  49. data/test/sass/engine_test.rb +0 -3499
  50. data/test/sass/exec_test.rb +0 -95
  51. data/test/sass/extend_test.rb +0 -1678
  52. data/test/sass/fixtures/test_staleness_check_across_importers.css +0 -1
  53. data/test/sass/fixtures/test_staleness_check_across_importers.scss +0 -1
  54. data/test/sass/functions_test.rb +0 -2021
  55. data/test/sass/importer_test.rb +0 -420
  56. data/test/sass/logger_test.rb +0 -57
  57. data/test/sass/mock_importer.rb +0 -49
  58. data/test/sass/more_results/more1.css +0 -9
  59. data/test/sass/more_results/more1_with_line_comments.css +0 -26
  60. data/test/sass/more_results/more_import.css +0 -29
  61. data/test/sass/more_templates/_more_partial.sass +0 -2
  62. data/test/sass/more_templates/more1.sass +0 -23
  63. data/test/sass/more_templates/more_import.sass +0 -11
  64. data/test/sass/plugin_test.rb +0 -552
  65. data/test/sass/results/alt.css +0 -4
  66. data/test/sass/results/basic.css +0 -9
  67. data/test/sass/results/cached_import_option.css +0 -3
  68. data/test/sass/results/compact.css +0 -5
  69. data/test/sass/results/complex.css +0 -86
  70. data/test/sass/results/compressed.css +0 -1
  71. data/test/sass/results/expanded.css +0 -19
  72. data/test/sass/results/filename_fn.css +0 -3
  73. data/test/sass/results/if.css +0 -3
  74. data/test/sass/results/import.css +0 -31
  75. data/test/sass/results/import_charset.css +0 -5
  76. data/test/sass/results/import_charset_ibm866.css +0 -5
  77. data/test/sass/results/import_content.css +0 -1
  78. data/test/sass/results/line_numbers.css +0 -49
  79. data/test/sass/results/mixins.css +0 -95
  80. data/test/sass/results/multiline.css +0 -24
  81. data/test/sass/results/nested.css +0 -22
  82. data/test/sass/results/options.css +0 -1
  83. data/test/sass/results/parent_ref.css +0 -13
  84. data/test/sass/results/script.css +0 -16
  85. data/test/sass/results/scss_import.css +0 -31
  86. data/test/sass/results/scss_importee.css +0 -2
  87. data/test/sass/results/subdir/nested_subdir/nested_subdir.css +0 -1
  88. data/test/sass/results/subdir/subdir.css +0 -3
  89. data/test/sass/results/units.css +0 -11
  90. data/test/sass/results/warn.css +0 -0
  91. data/test/sass/results/warn_imported.css +0 -0
  92. data/test/sass/script_conversion_test.rb +0 -365
  93. data/test/sass/script_test.rb +0 -1429
  94. data/test/sass/scss/css_test.rb +0 -1266
  95. data/test/sass/scss/rx_test.rb +0 -159
  96. data/test/sass/scss/scss_test.rb +0 -4238
  97. data/test/sass/scss/test_helper.rb +0 -37
  98. data/test/sass/source_map_test.rb +0 -1052
  99. data/test/sass/superselector_test.rb +0 -209
  100. data/test/sass/templates/_cached_import_option_partial.scss +0 -1
  101. data/test/sass/templates/_double_import_loop2.sass +0 -1
  102. data/test/sass/templates/_filename_fn_import.scss +0 -11
  103. data/test/sass/templates/_imported_charset_ibm866.sass +0 -4
  104. data/test/sass/templates/_imported_charset_utf8.sass +0 -4
  105. data/test/sass/templates/_imported_content.sass +0 -3
  106. data/test/sass/templates/_partial.sass +0 -2
  107. data/test/sass/templates/_same_name_different_partiality.scss +0 -1
  108. data/test/sass/templates/alt.sass +0 -16
  109. data/test/sass/templates/basic.sass +0 -23
  110. data/test/sass/templates/bork1.sass +0 -2
  111. data/test/sass/templates/bork2.sass +0 -2
  112. data/test/sass/templates/bork3.sass +0 -2
  113. data/test/sass/templates/bork4.sass +0 -2
  114. data/test/sass/templates/bork5.sass +0 -3
  115. data/test/sass/templates/cached_import_option.scss +0 -3
  116. data/test/sass/templates/compact.sass +0 -17
  117. data/test/sass/templates/complex.sass +0 -305
  118. data/test/sass/templates/compressed.sass +0 -15
  119. data/test/sass/templates/double_import_loop1.sass +0 -1
  120. data/test/sass/templates/expanded.sass +0 -17
  121. data/test/sass/templates/filename_fn.scss +0 -18
  122. data/test/sass/templates/if.sass +0 -11
  123. data/test/sass/templates/import.sass +0 -12
  124. data/test/sass/templates/import_charset.sass +0 -9
  125. data/test/sass/templates/import_charset_ibm866.sass +0 -11
  126. data/test/sass/templates/import_content.sass +0 -4
  127. data/test/sass/templates/importee.less +0 -2
  128. data/test/sass/templates/importee.sass +0 -19
  129. data/test/sass/templates/line_numbers.sass +0 -13
  130. data/test/sass/templates/mixin_bork.sass +0 -5
  131. data/test/sass/templates/mixins.sass +0 -76
  132. data/test/sass/templates/multiline.sass +0 -20
  133. data/test/sass/templates/nested.sass +0 -25
  134. data/test/sass/templates/nested_bork1.sass +0 -2
  135. data/test/sass/templates/nested_bork2.sass +0 -2
  136. data/test/sass/templates/nested_bork3.sass +0 -2
  137. data/test/sass/templates/nested_bork4.sass +0 -2
  138. data/test/sass/templates/nested_import.sass +0 -2
  139. data/test/sass/templates/nested_mixin_bork.sass +0 -6
  140. data/test/sass/templates/options.sass +0 -2
  141. data/test/sass/templates/parent_ref.sass +0 -25
  142. data/test/sass/templates/same_name_different_ext.sass +0 -2
  143. data/test/sass/templates/same_name_different_ext.scss +0 -1
  144. data/test/sass/templates/same_name_different_partiality.scss +0 -1
  145. data/test/sass/templates/script.sass +0 -101
  146. data/test/sass/templates/scss_import.scss +0 -12
  147. data/test/sass/templates/scss_importee.scss +0 -1
  148. data/test/sass/templates/single_import_loop.sass +0 -1
  149. data/test/sass/templates/subdir/import_up1.scss +0 -1
  150. data/test/sass/templates/subdir/import_up2.scss +0 -1
  151. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +0 -2
  152. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +0 -3
  153. data/test/sass/templates/subdir/subdir.sass +0 -6
  154. data/test/sass/templates/units.sass +0 -11
  155. data/test/sass/templates/warn.sass +0 -3
  156. data/test/sass/templates/warn_imported.sass +0 -4
  157. data/test/sass/test_helper.rb +0 -8
  158. data/test/sass/util/multibyte_string_scanner_test.rb +0 -152
  159. data/test/sass/util/normalized_map_test.rb +0 -50
  160. data/test/sass/util/subset_map_test.rb +0 -90
  161. data/test/sass/util_test.rb +0 -403
  162. data/test/sass/value_helpers_test.rb +0 -178
  163. data/test/test_helper.rb +0 -149
@@ -1,60 +0,0 @@
1
- require File.dirname(__FILE__) + '/../test_helper'
2
- require 'sass/callbacks'
3
-
4
- class CallerBack
5
- extend Sass::Callbacks
6
- define_callback :foo
7
- define_callback :bar
8
-
9
- def do_foo
10
- run_foo
11
- end
12
-
13
- def do_bar
14
- run_bar 12
15
- end
16
- end
17
-
18
- module ClassLevelCallerBack
19
- extend Sass::Callbacks
20
- define_callback :foo
21
- extend self
22
-
23
- def do_foo
24
- run_foo
25
- end
26
- end
27
-
28
- class SassCallbacksTest < MiniTest::Test
29
- def test_simple_callback
30
- cb = CallerBack.new
31
- there = false
32
- cb.on_foo {there = true}
33
- cb.do_foo
34
- assert there, "Expected callback to be called."
35
- end
36
-
37
- def test_multiple_callbacks
38
- cb = CallerBack.new
39
- str = ""
40
- cb.on_foo {str += "first"}
41
- cb.on_foo {str += " second"}
42
- cb.do_foo
43
- assert_equal "first second", str
44
- end
45
-
46
- def test_callback_with_arg
47
- cb = CallerBack.new
48
- val = nil
49
- cb.on_bar {|a| val = a}
50
- cb.do_bar
51
- assert_equal 12, val
52
- end
53
-
54
- def test_class_level_callback
55
- there = false
56
- ClassLevelCallerBack.on_foo {there = true}
57
- ClassLevelCallerBack.do_foo
58
- assert there, "Expected callback to be called."
59
- end
60
- end
@@ -1,225 +0,0 @@
1
- require 'minitest/autorun'
2
- require File.dirname(__FILE__) + '/../test_helper'
3
- require 'sass/plugin'
4
- require 'sass/plugin/compiler'
5
-
6
- class CompilerTest < MiniTest::Test
7
- class FakeListener
8
- attr_accessor :options
9
- attr_accessor :directories
10
- attr_reader :start_called
11
- attr_reader :thread
12
-
13
- def initialize(*args, &on_filesystem_event)
14
- self.options = args.last.is_a?(Hash) ? args.pop : {}
15
- self.directories = args
16
- @on_filesystem_event = on_filesystem_event
17
- @start_called = false
18
- reset_events!
19
- end
20
-
21
- def fire_events!(*args)
22
- @on_filesystem_event.call(@modified, @added, @removed)
23
- reset_events!
24
- end
25
-
26
- def changed(filename)
27
- @modified << File.expand_path(filename)
28
- end
29
-
30
- def added(filename)
31
- @added << File.expand_path(filename)
32
- end
33
-
34
- def removed(filename)
35
- @removed << File.expand_path(filename)
36
- end
37
-
38
- def on_start!(&run_during_start)
39
- @run_during_start = run_during_start
40
- end
41
-
42
- def start!
43
- @run_during_start.call(self) if @run_during_start
44
- end
45
-
46
- def start
47
- parent = Thread.current
48
- @thread = Thread.new do
49
- @run_during_start.call(self) if @run_during_start
50
- parent.raise Interrupt
51
- end
52
- end
53
-
54
- def stop
55
- end
56
-
57
- def reset_events!
58
- @modified = []
59
- @added = []
60
- @removed = []
61
- end
62
- end
63
-
64
- module MockWatcher
65
- attr_accessor :run_during_start
66
- attr_accessor :update_stylesheets_times
67
- attr_accessor :update_stylesheets_called_with
68
- attr_accessor :deleted_css_files
69
-
70
- def fake_listener
71
- @fake_listener
72
- end
73
-
74
- def update_stylesheets(individual_files)
75
- @update_stylesheets_times ||= 0
76
- @update_stylesheets_times += 1
77
- (@update_stylesheets_called_with ||= []) << individual_files
78
- end
79
-
80
- def try_delete_css(css_filename)
81
- (@deleted_css_files ||= []) << css_filename
82
- end
83
-
84
- private
85
- def create_listener(*args, &on_filesystem_event)
86
- args.pop if args.last.is_a?(Hash)
87
- @fake_listener = FakeListener.new(*args, &on_filesystem_event)
88
- @fake_listener.on_start!(&run_during_start)
89
- @fake_listener
90
- end
91
- end
92
-
93
- def test_initialize
94
- watcher
95
- end
96
-
97
- def test_watch_starts_the_listener
98
- start_called = false
99
- c = watcher do |listener|
100
- start_called = true
101
- end
102
- c.watch
103
- assert start_called, "start! was not called"
104
- end
105
-
106
- def test_sass_callbacks_fire_from_listener_events
107
- c = watcher do |listener|
108
- listener.changed "changed.scss"
109
- listener.added "added.scss"
110
- listener.removed "removed.scss"
111
- listener.fire_events!
112
- end
113
-
114
- modified_fired = false
115
- c.on_template_modified do |sass_file|
116
- modified_fired = true
117
- assert_equal "changed.scss", sass_file
118
- end
119
-
120
- added_fired = false
121
- c.on_template_created do |sass_file|
122
- added_fired = true
123
- assert_equal "added.scss", sass_file
124
- end
125
-
126
- removed_fired = false
127
- c.on_template_deleted do |sass_file|
128
- removed_fired = true
129
- assert_equal "removed.scss", sass_file
130
- end
131
-
132
- c.watch
133
-
134
- assert_equal 2, c.update_stylesheets_times
135
- assert modified_fired
136
- assert added_fired
137
- assert removed_fired
138
- end
139
-
140
- def test_removing_a_sass_file_removes_corresponding_css_file
141
- c = watcher do |listener|
142
- listener.removed "remove_me.scss"
143
- listener.fire_events!
144
- end
145
-
146
- c.watch
147
-
148
- assert_equal "./remove_me.css", c.deleted_css_files.first
149
- end
150
-
151
- def test_an_importer_can_watch_an_image
152
- image_importer = Sass::Importers::Filesystem.new(".")
153
- class << image_importer
154
- def watched_file?(filename)
155
- filename =~ /\.png$/
156
- end
157
- end
158
- c = watcher(:load_paths => [image_importer]) do |listener|
159
- listener.changed "image.png"
160
- listener.fire_events!
161
- end
162
-
163
- modified_fired = false
164
- c.on_template_modified do |f|
165
- modified_fired = true
166
- assert_equal "image.png", f
167
- end
168
-
169
- c.watch
170
-
171
- assert_equal 2, c.update_stylesheets_times
172
- assert modified_fired
173
- end
174
-
175
- def test_watching_specific_files_and_one_is_deleted
176
- directories = nil
177
- c = watcher do |listener|
178
- directories = listener.directories
179
- listener.removed File.expand_path("./foo.scss")
180
- listener.fire_events!
181
- end
182
- c.watch([[File.expand_path("./foo.scss"), File.expand_path("./foo.css"), nil]])
183
- assert directories.include?(File.expand_path(".")), directories.inspect
184
- assert_equal File.expand_path("./foo.css"), c.deleted_css_files.first, "the corresponding css file was not deleted"
185
- assert_equal [], c.update_stylesheets_called_with[1], "the sass file should not have been compiled"
186
- end
187
-
188
- def test_watched_directories_are_dedupped
189
- directories = nil
190
- c = watcher(:load_paths => [".", "./foo", "."]) do |listener|
191
- directories = listener.directories
192
- end
193
- c.watch
194
- assert_equal [File.expand_path(".")], directories
195
- end
196
-
197
- def test_a_changed_css_in_a_watched_directory_does_not_force_a_compile
198
- c = watcher do |listener|
199
- listener.changed "foo.css"
200
- listener.fire_events!
201
- end
202
-
203
- c.on_template_modified do |f|
204
- assert false, "Should not have been called"
205
- end
206
-
207
- c.watch
208
-
209
- assert_equal 1, c.update_stylesheets_times
210
- end
211
-
212
- private
213
-
214
- def default_options
215
- {:template_location => [[".","."]]}
216
- end
217
-
218
- def watcher(options = {}, &run_during_start)
219
- options = default_options.merge(options)
220
- watcher = Sass::Plugin::Compiler.new(options)
221
- watcher.extend(MockWatcher)
222
- watcher.run_during_start = run_during_start
223
- watcher
224
- end
225
- end
@@ -1,2138 +0,0 @@
1
- require File.dirname(__FILE__) + '/../test_helper'
2
-
3
- class ConversionTest < MiniTest::Test
4
- def test_basic
5
- assert_converts <<SASS, <<SCSS
6
- foo bar
7
- baz: bang
8
- bip: bop
9
- SASS
10
- foo bar {
11
- baz: bang;
12
- bip: bop;
13
- }
14
- SCSS
15
- silence_warnings {assert_converts <<SASS, <<SCSS, options: {old: true}}
16
- foo bar
17
- :baz bang
18
- :bip bop
19
- SASS
20
- foo bar {
21
- baz: bang;
22
- bip: bop;
23
- }
24
- SCSS
25
- end
26
-
27
- def test_empty_selector
28
- assert_converts "foo bar", "foo bar {}"
29
- end
30
-
31
- def test_empty_directive
32
- assert_converts "@media screen", "@media screen {}"
33
- end
34
-
35
- def test_empty_control_directive
36
- assert_converts "@if false", "@if false {}"
37
- end
38
-
39
- def test_nesting
40
- assert_converts <<SASS, <<SCSS
41
- foo bar
42
- baz bang
43
- baz: bang
44
- bip: bop
45
-
46
- blat: boo
47
- SASS
48
- foo bar {
49
- baz bang {
50
- baz: bang;
51
- bip: bop;
52
- }
53
-
54
- blat: boo;
55
- }
56
- SCSS
57
- end
58
-
59
- def test_nesting_with_parent_ref
60
- assert_converts <<SASS, <<SCSS
61
- foo bar
62
- &:hover
63
- baz: bang
64
- SASS
65
- foo bar {
66
- &:hover {
67
- baz: bang;
68
- }
69
- }
70
- SCSS
71
- end
72
-
73
- def test_selector_interpolation
74
- assert_converts <<SASS, <<SCSS
75
- foo \#{$bar + "baz"}.bip
76
- baz: bang
77
-
78
- foo /\#{$bar + "baz"}/ .bip
79
- baz: bang
80
- SASS
81
- foo \#{$bar + "baz"}.bip {
82
- baz: bang;
83
- }
84
-
85
- foo /\#{$bar + "baz"}/ .bip {
86
- baz: bang;
87
- }
88
- SCSS
89
- end
90
-
91
- def test_multiline_selector_with_commas
92
- assert_converts <<SASS, <<SCSS
93
- foo bar,
94
- baz bang
95
- baz: bang
96
- SASS
97
- foo bar,
98
- baz bang {
99
- baz: bang;
100
- }
101
- SCSS
102
-
103
- assert_converts <<SASS, <<SCSS
104
- blat
105
- foo bar,
106
- baz bang
107
- baz: bang
108
- SASS
109
- blat {
110
- foo bar,
111
- baz bang {
112
- baz: bang;
113
- }
114
- }
115
- SCSS
116
- end
117
-
118
- def test_multiline_selector_without_commas
119
- assert_scss_to_sass <<SASS, <<SCSS
120
- foo bar baz bang
121
- baz: bang
122
- SASS
123
- foo bar
124
- baz bang {
125
- baz: bang;
126
- }
127
- SCSS
128
-
129
- assert_scss_to_scss <<SCSS
130
- foo bar
131
- baz bang {
132
- baz: bang;
133
- }
134
- SCSS
135
- end
136
-
137
- def test_escaped_selector
138
- assert_converts <<SASS, <<SCSS
139
- foo bar
140
- \\:hover
141
- baz: bang
142
- SASS
143
- foo bar {
144
- :hover {
145
- baz: bang;
146
- }
147
- }
148
- SCSS
149
- end
150
-
151
- def test_property_name_interpolation
152
- assert_converts <<SASS, <<SCSS
153
- foo bar
154
- baz\#{$bang}bip\#{$bop}: 12
155
- SASS
156
- foo bar {
157
- baz\#{$bang}bip\#{$bop}: 12;
158
- }
159
- SCSS
160
- end
161
-
162
- def test_property_value_interpolation
163
- assert_converts <<SASS, <<SCSS
164
- foo bar
165
- baz: 12 \#{$bang} bip \#{"bop"} blat
166
- SASS
167
- foo bar {
168
- baz: 12 \#{$bang} bip \#{"bop"} blat;
169
- }
170
- SCSS
171
- end
172
-
173
- def test_dynamic_properties
174
- assert_converts <<SASS, <<SCSS
175
- foo bar
176
- baz: 12 $bang "bip"
177
- SASS
178
- foo bar {
179
- baz: 12 $bang "bip";
180
- }
181
- SCSS
182
- end
183
-
184
- def test_dynamic_properties_with_old
185
- silence_warnings {assert_converts <<SASS, <<SCSS, options: {old: true}}
186
- foo bar
187
- :baz 12 $bang "bip"
188
- SASS
189
- foo bar {
190
- baz: 12 $bang "bip";
191
- }
192
- SCSS
193
- end
194
-
195
- def test_multiline_properties
196
- assert_scss_to_sass <<SASS, <<SCSS
197
- foo bar
198
- baz: bip bam boon
199
- SASS
200
- foo bar {
201
- baz:
202
- bip
203
- bam
204
- boon;
205
- }
206
- SCSS
207
-
208
- assert_scss_to_scss <<OUT, source: <<IN
209
- foo bar {
210
- baz: bip bam boon;
211
- }
212
- OUT
213
- foo bar {
214
- baz:
215
- bip
216
- bam
217
- boon;
218
- }
219
- IN
220
- end
221
-
222
- def test_multiline_dynamic_properties
223
- assert_scss_to_sass <<SASS, <<SCSS
224
- foo bar
225
- baz: $bip "bam" 12px
226
- SASS
227
- foo bar {
228
- baz:
229
- $bip
230
- "bam"
231
- 12px;
232
- }
233
- SCSS
234
-
235
- assert_scss_to_scss <<OUT, source: <<IN
236
- foo bar {
237
- baz: $bip "bam" 12px;
238
- }
239
- OUT
240
- foo bar {
241
- baz:
242
- $bip
243
- "bam"
244
- 12px;
245
- }
246
- IN
247
- end
248
-
249
- def test_silent_comments
250
- assert_converts <<SASS, <<SCSS
251
- // foo
252
-
253
- // bar
254
-
255
- // baz
256
-
257
- foo bar
258
- a: b
259
- SASS
260
- // foo
261
-
262
- // bar
263
-
264
- // baz
265
-
266
- foo bar {
267
- a: b;
268
- }
269
- SCSS
270
-
271
- assert_converts <<SASS, <<SCSS
272
- // foo
273
- // bar
274
- // baz
275
- // bang
276
-
277
- foo bar
278
- a: b
279
- SASS
280
- // foo
281
- // bar
282
- // baz
283
- // bang
284
-
285
- foo bar {
286
- a: b;
287
- }
288
- SCSS
289
-
290
- assert_converts <<SASS, <<SCSS
291
- // foo
292
- // bar
293
- // baz
294
- // bang
295
-
296
- foo bar
297
- a: b
298
- SASS
299
- // foo
300
- // bar
301
- // baz
302
- // bang
303
-
304
- foo bar {
305
- a: b;
306
- }
307
- SCSS
308
- end
309
-
310
- def test_nested_silent_comments
311
- assert_converts <<SASS, <<SCSS
312
- foo
313
- bar: baz
314
-
315
- // bip bop
316
- // beep boop
317
- bang: bizz
318
-
319
- // bubble bubble
320
- // toil trouble
321
- SASS
322
- foo {
323
- bar: baz;
324
-
325
- // bip bop
326
- // beep boop
327
- bang: bizz;
328
-
329
- // bubble bubble
330
- // toil trouble
331
- }
332
- SCSS
333
-
334
- assert_sass_to_scss <<SCSS, <<SASS
335
- foo {
336
- bar: baz;
337
-
338
- // bip bop
339
- // beep boop
340
- // bap blimp
341
- bang: bizz;
342
-
343
- // bubble bubble
344
- // toil trouble
345
- // gorp
346
- }
347
- SCSS
348
- foo
349
- bar: baz
350
-
351
- // bip bop
352
- beep boop
353
- bap blimp
354
- bang: bizz
355
-
356
- // bubble bubble
357
- toil trouble
358
- gorp
359
- SASS
360
- end
361
-
362
- def test_preserves_triple_slash_comments
363
- assert_converts <<SASS, <<SCSS
364
- /// foo
365
- /// bar
366
- foo
367
- /// bip bop
368
- /// beep boop
369
- SASS
370
- /// foo
371
- /// bar
372
- foo {
373
- /// bip bop
374
- /// beep boop
375
- }
376
- SCSS
377
- end
378
-
379
- def test_loud_comments
380
- assert_converts <<SASS, <<SCSS
381
- /* foo
382
-
383
- /* bar
384
-
385
- /* baz
386
-
387
- foo bar
388
- a: b
389
- SASS
390
- /* foo */
391
-
392
- /* bar */
393
-
394
- /* baz */
395
-
396
- foo bar {
397
- a: b;
398
- }
399
- SCSS
400
-
401
- assert_scss_to_sass <<SASS, <<SCSS
402
- /* foo
403
- * bar
404
- * baz
405
- * bang
406
-
407
- foo bar
408
- a: b
409
- SASS
410
- /* foo
411
- bar
412
- baz
413
- bang */
414
-
415
- foo bar {
416
- a: b;
417
- }
418
- SCSS
419
-
420
- assert_scss_to_scss <<SCSS
421
- /* foo
422
- bar
423
- baz
424
- bang */
425
-
426
- foo bar {
427
- a: b;
428
- }
429
- SCSS
430
-
431
- assert_converts <<SASS, <<SCSS
432
- /* foo
433
- * bar
434
- * baz
435
- * bang
436
-
437
- foo bar
438
- a: b
439
- SASS
440
- /* foo
441
- * bar
442
- * baz
443
- * bang */
444
-
445
- foo bar {
446
- a: b;
447
- }
448
- SCSS
449
- end
450
-
451
- def test_nested_loud_comments
452
- assert_converts <<SASS, <<SCSS
453
- foo
454
- bar: baz
455
-
456
- /* bip bop
457
- * beep boop
458
- bang: bizz
459
-
460
- /* bubble bubble
461
- * toil trouble
462
- SASS
463
- foo {
464
- bar: baz;
465
-
466
- /* bip bop
467
- * beep boop */
468
- bang: bizz;
469
-
470
- /* bubble bubble
471
- * toil trouble */
472
- }
473
- SCSS
474
-
475
- assert_sass_to_scss <<SCSS, <<SASS
476
- foo {
477
- bar: baz;
478
-
479
- /* bip bop
480
- * beep boop
481
- * bap blimp */
482
- bang: bizz;
483
-
484
- /* bubble bubble
485
- * toil trouble
486
- * gorp */
487
- }
488
- SCSS
489
- foo
490
- bar: baz
491
-
492
- /* bip bop
493
- beep boop
494
- bap blimp
495
- bang: bizz
496
-
497
- /* bubble bubble
498
- toil trouble
499
- gorp
500
- SASS
501
- end
502
-
503
- def test_preserves_double_star_comments
504
- assert_converts <<SASS, <<SCSS
505
- /** foo
506
- * bar
507
- foo
508
- /** bip bop
509
- * beep boop
510
- SASS
511
- /** foo
512
- * bar */
513
- foo {
514
- /** bip bop
515
- * beep boop */
516
- }
517
- SCSS
518
- end
519
-
520
- def test_loud_comments_with_weird_indentation
521
- assert_scss_to_sass <<SASS, <<SCSS
522
- foo
523
- /* foo
524
- * bar
525
- * baz
526
- a: b
527
- SASS
528
- foo {
529
- /* foo
530
- bar
531
- baz */
532
- a: b;
533
- }
534
- SCSS
535
-
536
- assert_sass_to_scss <<SCSS, <<SASS
537
- foo {
538
- /* foo
539
- * bar
540
- * baz */
541
- a: b;
542
- }
543
- SCSS
544
- foo
545
- /* foo
546
- bar
547
- baz
548
- a: b
549
- SASS
550
- end
551
-
552
- def test_loud_comment_containing_silent_comment
553
- assert_scss_to_sass <<SASS, <<SCSS
554
- /*
555
- *// foo bar
556
- SASS
557
- /*
558
- // foo bar
559
- */
560
- SCSS
561
- end
562
-
563
- def test_silent_comment_containing_loud_comment
564
- assert_scss_to_sass <<SASS, <<SCSS
565
- // /*
566
- // * foo bar
567
- // */
568
- SASS
569
- // /*
570
- // * foo bar
571
- // */
572
- SCSS
573
- end
574
-
575
- def test_immediately_preceding_comments
576
- assert_converts <<SASS, <<SCSS
577
- /* Foo
578
- * Bar
579
- * Baz
580
- .foo#bar
581
- a: b
582
- SASS
583
- /* Foo
584
- * Bar
585
- * Baz */
586
- .foo#bar {
587
- a: b;
588
- }
589
- SCSS
590
-
591
- assert_converts <<SASS, <<SCSS
592
- // Foo
593
- // Bar
594
- // Baz
595
- =foo
596
- a: b
597
- SASS
598
- // Foo
599
- // Bar
600
- // Baz
601
- @mixin foo {
602
- a: b;
603
- }
604
- SCSS
605
- end
606
-
607
- def test_immediately_following_comments
608
- assert_sass_to_scss <<SCSS, <<SASS
609
- .foobar {
610
- // trailing comment
611
- a: 1px;
612
- }
613
- SCSS
614
- .foobar // trailing comment
615
- a: 1px
616
- SASS
617
-
618
- assert_sass_to_scss <<SCSS, <<SASS
619
- .foobar {
620
- // trailing comment
621
- a: 1px;
622
- }
623
- SCSS
624
- .foobar /* trailing comment */
625
- a: 1px
626
- SASS
627
- end
628
-
629
- def test_debug
630
- assert_converts <<SASS, <<SCSS
631
- foo
632
- @debug 12px
633
-
634
- bar: baz
635
- SASS
636
- foo {
637
- @debug 12px;
638
-
639
- bar: baz;
640
- }
641
- SCSS
642
- end
643
-
644
- def test_error
645
- assert_converts <<SASS, <<SCSS
646
- foo
647
- @error "oh no!"
648
-
649
- bar: baz
650
- SASS
651
- foo {
652
- @error "oh no!";
653
-
654
- bar: baz;
655
- }
656
- SCSS
657
- end
658
-
659
- def test_directive_without_children
660
- assert_converts <<SASS, <<SCSS
661
- foo
662
- @foo #bar "baz"
663
-
664
- bar: baz
665
- SASS
666
- foo {
667
- @foo #bar "baz";
668
-
669
- bar: baz;
670
- }
671
- SCSS
672
- end
673
-
674
- def test_directive_with_prop_children
675
- assert_converts <<SASS, <<SCSS
676
- foo
677
- @foo #bar "baz"
678
- a: b
679
- c: d
680
-
681
- bar: baz
682
- SASS
683
- foo {
684
- @foo #bar "baz" {
685
- a: b;
686
- c: d;
687
- }
688
-
689
- bar: baz;
690
- }
691
- SCSS
692
- end
693
-
694
- def test_directive_with_rule_children
695
- assert_converts <<SASS, <<SCSS
696
- foo
697
- @foo #bar "baz"
698
- #blat
699
- a: b
700
-
701
- .bang
702
- c: d
703
- e: f
704
-
705
- bar: baz
706
- SASS
707
- foo {
708
- @foo #bar "baz" {
709
- #blat {
710
- a: b;
711
- }
712
-
713
- .bang {
714
- c: d;
715
- e: f;
716
- }
717
- }
718
-
719
- bar: baz;
720
- }
721
- SCSS
722
- end
723
-
724
- def test_directive_with_rule_and_prop_children
725
- assert_converts <<SASS, <<SCSS
726
- foo
727
- @foo #bar "baz"
728
- g: h
729
-
730
- #blat
731
- a: b
732
-
733
- .bang
734
- c: d
735
- e: f
736
-
737
- i: j
738
-
739
- bar: baz
740
- SASS
741
- foo {
742
- @foo #bar "baz" {
743
- g: h;
744
-
745
- #blat {
746
- a: b;
747
- }
748
-
749
- .bang {
750
- c: d;
751
- e: f;
752
- }
753
-
754
- i: j;
755
- }
756
-
757
- bar: baz;
758
- }
759
- SCSS
760
- end
761
-
762
- def test_charset
763
- assert_converts <<SASS, <<SCSS
764
- @charset "utf-8"
765
- SASS
766
- @charset "utf-8";
767
- SCSS
768
- end
769
-
770
- def test_for
771
- assert_converts <<SASS, <<SCSS
772
- foo
773
- @for $a from $b to $c
774
- a: b
775
-
776
- @for $c from 1 to 16
777
- d: e
778
- f: g
779
- SASS
780
- foo {
781
- @for $a from $b to $c {
782
- a: b;
783
- }
784
-
785
- @for $c from 1 to 16 {
786
- d: e;
787
- f: g;
788
- }
789
- }
790
- SCSS
791
- end
792
-
793
- def test_while
794
- assert_converts <<SASS, <<SCSS
795
- foo
796
- @while flaz($a + $b)
797
- a: b
798
-
799
- @while 1
800
- d: e
801
- f: g
802
- SASS
803
- foo {
804
- @while flaz($a + $b) {
805
- a: b;
806
- }
807
-
808
- @while 1 {
809
- d: e;
810
- f: g;
811
- }
812
- }
813
- SCSS
814
- end
815
-
816
- def test_if
817
- assert_converts <<SASS, <<SCSS
818
- foo
819
- @if $foo or $bar
820
- a: b
821
-
822
- @if $baz
823
- d: e
824
- @else if $bang
825
- f: g
826
- @else
827
- h: i
828
- SASS
829
- foo {
830
- @if $foo or $bar {
831
- a: b;
832
- }
833
-
834
- @if $baz {
835
- d: e;
836
- }
837
- @else if $bang {
838
- f: g;
839
- }
840
- @else {
841
- h: i;
842
- }
843
- }
844
- SCSS
845
- end
846
-
847
- def test_each
848
- assert_converts <<SASS, <<SCSS
849
- a
850
- @each $number in 1px 2px 3px 4px
851
- b: $number
852
-
853
- c
854
- @each $str in foo, bar, baz, bang
855
- d: $str
856
-
857
- c
858
- @each $key, $value in (foo: 1, bar: 2, baz: 3)
859
- \#{$key}: $value
860
- SASS
861
- a {
862
- @each $number in 1px 2px 3px 4px {
863
- b: $number;
864
- }
865
- }
866
-
867
- c {
868
- @each $str in foo, bar, baz, bang {
869
- d: $str;
870
- }
871
- }
872
-
873
- c {
874
- @each $key, $value in (foo: 1, bar: 2, baz: 3) {
875
- \#{$key}: $value;
876
- }
877
- }
878
- SCSS
879
- end
880
-
881
- def test_import
882
- assert_converts <<SASS, <<SCSS
883
- @import foo
884
-
885
- @import url(bar.css)
886
-
887
- foo
888
- bar: baz
889
- SASS
890
- @import "foo";
891
-
892
- @import url(bar.css);
893
-
894
- foo {
895
- bar: baz;
896
- }
897
- SCSS
898
-
899
- assert_converts <<SASS, <<SCSS
900
- @import foo.css
901
-
902
- @import url(bar.css)
903
-
904
- foo
905
- bar: baz
906
- SASS
907
- @import "foo.css";
908
-
909
- @import url(bar.css);
910
-
911
- foo {
912
- bar: baz;
913
- }
914
- SCSS
915
- end
916
-
917
- def test_import_as_directive_in_sass
918
- assert_equal "@import foo.css\n", to_sass('@import "foo.css"')
919
- end
920
-
921
- def test_import_as_directive_in_scss
922
- assert_converts <<SASS, <<SCSS
923
- @import "foo.css" print
924
- SASS
925
- @import "foo.css" print;
926
- SCSS
927
-
928
- assert_converts <<SASS, <<SCSS
929
- @import url(foo.css) screen, print
930
- SASS
931
- @import url(foo.css) screen, print;
932
- SCSS
933
- end
934
-
935
- def test_adjacent_imports
936
- assert_converts <<SASS, <<SCSS
937
- @import foo.sass
938
- @import bar.scss
939
- @import baz
940
- SASS
941
- @import "foo.sass";
942
- @import "bar.scss";
943
- @import "baz";
944
- SCSS
945
- end
946
-
947
- def test_non_adjacent_imports
948
- assert_converts <<SASS, <<SCSS
949
- @import foo.sass
950
-
951
- @import bar.scss
952
-
953
- @import baz
954
- SASS
955
- @import "foo.sass";
956
-
957
- @import "bar.scss";
958
-
959
- @import "baz";
960
- SCSS
961
- end
962
-
963
- def test_import_with_interpolation
964
- assert_converts <<SASS, <<SCSS
965
- $family: unquote("Droid+Sans")
966
-
967
- @import url("http://fonts.googleapis.com/css?family=\#{$family}")
968
- SASS
969
- $family: unquote("Droid+Sans");
970
-
971
- @import url("http://fonts.googleapis.com/css?family=\#{$family}");
972
- SCSS
973
- end
974
-
975
- def test_extend
976
- assert_converts <<SASS, <<SCSS
977
- .foo
978
- @extend .bar
979
-
980
- @extend .baz:bang
981
- SASS
982
- .foo {
983
- @extend .bar;
984
-
985
- @extend .baz:bang;
986
- }
987
- SCSS
988
- end
989
-
990
- def test_comma_extendee
991
- assert_converts <<SASS, <<SCSS
992
- .baz
993
- @extend .foo, .bar
994
- SASS
995
- .baz {
996
- @extend .foo, .bar;
997
- }
998
- SCSS
999
- end
1000
-
1001
- def test_argless_mixin_definition
1002
- assert_converts <<SASS, <<SCSS
1003
- =foo-bar
1004
- baz
1005
- a: b
1006
- SASS
1007
- @mixin foo-bar {
1008
- baz {
1009
- a: b;
1010
- }
1011
- }
1012
- SCSS
1013
-
1014
- assert_scss_to_sass <<SASS, <<SCSS
1015
- =foo-bar
1016
- baz
1017
- a: b
1018
- SASS
1019
- @mixin foo-bar() {
1020
- baz {
1021
- a: b;
1022
- }
1023
- }
1024
- SCSS
1025
-
1026
- assert_sass_to_scss <<SCSS, <<SASS
1027
- @mixin foo-bar {
1028
- baz {
1029
- a: b;
1030
- }
1031
- }
1032
- SCSS
1033
- =foo-bar()
1034
- baz
1035
- a: b
1036
- SASS
1037
- end
1038
-
1039
- def test_mixin_definition_without_defaults
1040
- assert_converts <<SASS, <<SCSS
1041
- =foo-bar($baz, $bang)
1042
- baz
1043
- a: $baz $bang
1044
- SASS
1045
- @mixin foo-bar($baz, $bang) {
1046
- baz {
1047
- a: $baz $bang;
1048
- }
1049
- }
1050
- SCSS
1051
- end
1052
-
1053
- def test_mixin_definition_with_defaults
1054
- assert_converts <<SASS, <<SCSS
1055
- =foo-bar($baz, $bang: 12px)
1056
- baz
1057
- a: $baz $bang
1058
- SASS
1059
- @mixin foo-bar($baz, $bang: 12px) {
1060
- baz {
1061
- a: $baz $bang;
1062
- }
1063
- }
1064
- SCSS
1065
-
1066
- assert_sass_to_scss <<SCSS, <<SASS
1067
- @mixin foo-bar($baz, $bang: foo) {
1068
- baz {
1069
- a: $baz $bang;
1070
- }
1071
- }
1072
- SCSS
1073
- =foo-bar($baz, $bang: foo)
1074
- baz
1075
- a: $baz $bang
1076
- SASS
1077
- end
1078
-
1079
- def test_argless_mixin_include
1080
- assert_converts <<SASS, <<SCSS
1081
- foo
1082
- +foo-bar
1083
-
1084
- a: blip
1085
- SASS
1086
- foo {
1087
- @include foo-bar;
1088
-
1089
- a: blip;
1090
- }
1091
- SCSS
1092
- end
1093
-
1094
- def test_mixin_include
1095
- assert_converts <<SASS, <<SCSS
1096
- foo
1097
- +foo-bar(12px, "blaz")
1098
-
1099
- a: blip
1100
- SASS
1101
- foo {
1102
- @include foo-bar(12px, "blaz");
1103
-
1104
- a: blip;
1105
- }
1106
- SCSS
1107
- end
1108
-
1109
- def test_mixin_include_with_keyword_args
1110
- assert_converts <<SASS, <<SCSS
1111
- foo
1112
- +foo-bar(12px, "blaz", $blip: blap, $bloop: blop)
1113
-
1114
- +foo-bar($blip: blap, $bloop: blop)
1115
-
1116
- a: blip
1117
- SASS
1118
- foo {
1119
- @include foo-bar(12px, "blaz", $blip: blap, $bloop: blop);
1120
-
1121
- @include foo-bar($blip: blap, $bloop: blop);
1122
-
1123
- a: blip;
1124
- }
1125
- SCSS
1126
- end
1127
-
1128
- def test_consecutive_mixin_includes
1129
- assert_converts <<SASS, <<SCSS
1130
- foo
1131
- +foo-bar
1132
- +foo-bar
1133
-
1134
- a: blip
1135
- SASS
1136
- foo {
1137
- @include foo-bar;
1138
- @include foo-bar;
1139
-
1140
- a: blip;
1141
- }
1142
- SCSS
1143
- end
1144
-
1145
- def test_mixin_include_with_hyphen_conversion_keyword_arg
1146
- assert_converts <<SASS, <<SCSS
1147
- foo
1148
- +foo-bar($a-b_c: val)
1149
-
1150
- a: blip
1151
- SASS
1152
- foo {
1153
- @include foo-bar($a-b_c: val);
1154
-
1155
- a: blip;
1156
- }
1157
- SCSS
1158
- end
1159
-
1160
- def test_argless_function_definition
1161
- assert_converts <<SASS, <<SCSS
1162
- @function foo()
1163
- $var: 1 + 1
1164
-
1165
- @return $var
1166
- SASS
1167
- @function foo() {
1168
- $var: 1 + 1;
1169
-
1170
- @return $var;
1171
- }
1172
- SCSS
1173
- end
1174
-
1175
- def test_function_definition_without_defaults
1176
- assert_converts <<SASS, <<SCSS
1177
- @function foo($var1, $var2)
1178
- @if $var1
1179
- @return $var1 + $var2
1180
- SASS
1181
- @function foo($var1, $var2) {
1182
- @if $var1 {
1183
- @return $var1 + $var2;
1184
- }
1185
- }
1186
- SCSS
1187
- end
1188
-
1189
- def test_function_definition_with_defaults
1190
- assert_converts <<SASS, <<SCSS
1191
- @function foo($var1, $var2: foo)
1192
- @if $var1
1193
- @return $var1 + $var2
1194
- SASS
1195
- @function foo($var1, $var2: foo) {
1196
- @if $var1 {
1197
- @return $var1 + $var2;
1198
- }
1199
- }
1200
- SCSS
1201
- end
1202
-
1203
- def test_variable_definition
1204
- assert_converts <<SASS, <<SCSS
1205
- $var1: 12px + 15px
1206
-
1207
- foo
1208
- $var2: flaz(#abcdef)
1209
-
1210
- val: $var1 $var2
1211
- SASS
1212
- $var1: 12px + 15px;
1213
-
1214
- foo {
1215
- $var2: flaz(#abcdef);
1216
-
1217
- val: $var1 $var2;
1218
- }
1219
- SCSS
1220
- end
1221
-
1222
- def test_guarded_variable_definition
1223
- assert_converts <<SASS, <<SCSS
1224
- $var1: 12px + 15px !default
1225
-
1226
- foo
1227
- $var2: flaz(#abcdef) !default
1228
-
1229
- val: $var1 $var2
1230
- SASS
1231
- $var1: 12px + 15px !default;
1232
-
1233
- foo {
1234
- $var2: flaz(#abcdef) !default;
1235
-
1236
- val: $var1 $var2;
1237
- }
1238
- SCSS
1239
- end
1240
-
1241
- def test_multiple_variable_definitions
1242
- assert_converts <<SASS, <<SCSS
1243
- $var1: foo
1244
- $var2: bar
1245
- $var3: baz
1246
-
1247
- $var4: bip
1248
- $var5: bap
1249
- SASS
1250
- $var1: foo;
1251
- $var2: bar;
1252
- $var3: baz;
1253
-
1254
- $var4: bip;
1255
- $var5: bap;
1256
- SCSS
1257
- end
1258
-
1259
- def test_division_asserted_with_parens
1260
- assert_converts <<SASS, <<SCSS
1261
- foo
1262
- a: (1px / 2px)
1263
- SASS
1264
- foo {
1265
- a: (1px / 2px);
1266
- }
1267
- SCSS
1268
- end
1269
-
1270
- def test_division_not_asserted_when_unnecessary
1271
- assert_converts <<SASS, <<SCSS
1272
- $var: 1px / 2px
1273
-
1274
- foo
1275
- a: $var
1276
- SASS
1277
- $var: 1px / 2px;
1278
-
1279
- foo {
1280
- a: $var;
1281
- }
1282
- SCSS
1283
-
1284
- assert_converts <<SASS, <<SCSS
1285
- $var: 1px
1286
-
1287
- foo
1288
- a: $var / 2px
1289
- SASS
1290
- $var: 1px;
1291
-
1292
- foo {
1293
- a: $var / 2px;
1294
- }
1295
- SCSS
1296
-
1297
- assert_converts <<SASS, <<SCSS
1298
- foo
1299
- a: 1 + 1px / 2px
1300
- SASS
1301
- foo {
1302
- a: 1 + 1px / 2px;
1303
- }
1304
- SCSS
1305
- end
1306
-
1307
- def test_literal_slash
1308
- assert_converts <<SASS, <<SCSS
1309
- foo
1310
- a: 1px / 2px
1311
- SASS
1312
- foo {
1313
- a: 1px / 2px;
1314
- }
1315
- SCSS
1316
-
1317
- # Regression test for issue 1787
1318
- assert_converts <<SASS, <<SCSS
1319
- foo
1320
- a: 1px / 2px 3px
1321
- SASS
1322
- foo {
1323
- a: 1px / 2px 3px;
1324
- }
1325
- SCSS
1326
- end
1327
-
1328
- def test_directive_with_interpolation
1329
- assert_converts <<SASS, <<SCSS
1330
- $baz: 12
1331
-
1332
- @foo bar\#{$baz} qux
1333
- a: b
1334
- SASS
1335
- $baz: 12;
1336
-
1337
- @foo bar\#{$baz} qux {
1338
- a: b;
1339
- }
1340
- SCSS
1341
- end
1342
-
1343
- def test_media_with_interpolation
1344
- assert_converts <<SASS, <<SCSS
1345
- $baz: 12
1346
-
1347
- @media bar\#{$baz}
1348
- a: b
1349
- SASS
1350
- $baz: 12;
1351
-
1352
- @media bar\#{$baz} {
1353
- a: b;
1354
- }
1355
- SCSS
1356
- end
1357
-
1358
- def test_media_with_expressions
1359
- assert_converts <<SASS, <<SCSS
1360
- $media1: screen
1361
- $media2: print
1362
- $var: -webkit-min-device-pixel-ratio
1363
- $val: 20
1364
-
1365
- @media \#{$media1} and ($var + "-foo": $val + 5), only \#{$media2}
1366
- a: b
1367
- SASS
1368
- $media1: screen;
1369
- $media2: print;
1370
- $var: -webkit-min-device-pixel-ratio;
1371
- $val: 20;
1372
-
1373
- @media \#{$media1} and ($var + "-foo": $val + 5), only \#{$media2} {
1374
- a: b;
1375
- }
1376
- SCSS
1377
- end
1378
-
1379
- def test_media_with_feature
1380
- assert_converts <<SASS, <<SCSS
1381
- @media screen and (-webkit-transform-3d)
1382
- a: b
1383
- SASS
1384
- @media screen and (-webkit-transform-3d) {
1385
- a: b;
1386
- }
1387
- SCSS
1388
- end
1389
-
1390
- def test_supports_with_expressions
1391
- assert_converts <<SASS, <<SCSS
1392
- $query: "(feature1: val)"
1393
- $feature: feature2
1394
- $val: val
1395
-
1396
- @supports (\#{$query} and ($feature: $val)) or (not ($feature + 3: $val + 4))
1397
- foo
1398
- a: b
1399
- SASS
1400
- $query: "(feature1: val)";
1401
- $feature: feature2;
1402
- $val: val;
1403
-
1404
- @supports (\#{$query} and ($feature: $val)) or (not ($feature + 3: $val + 4)) {
1405
- foo {
1406
- a: b;
1407
- }
1408
- }
1409
- SCSS
1410
- end
1411
-
1412
- # Hacks
1413
-
1414
- def test_declaration_hacks
1415
- assert_converts <<SASS, <<SCSS
1416
- foo
1417
- _name: val
1418
- *name: val
1419
- #name: val
1420
- .name: val
1421
- name/**/: val
1422
- name/*\\**/: val
1423
- name: val
1424
- SASS
1425
- foo {
1426
- _name: val;
1427
- *name: val;
1428
- #name: val;
1429
- .name: val;
1430
- name/**/: val;
1431
- name/*\\**/: val;
1432
- name: val;
1433
- }
1434
- SCSS
1435
- end
1436
-
1437
- def test_old_declaration_hacks
1438
- silence_warnings {assert_converts <<SASS, <<SCSS, options: {old: true}}
1439
- foo
1440
- :_name val
1441
- :*name val
1442
- :#name val
1443
- :.name val
1444
- :name val
1445
- SASS
1446
- foo {
1447
- _name: val;
1448
- *name: val;
1449
- #name: val;
1450
- .name: val;
1451
- name: val;
1452
- }
1453
- SCSS
1454
- end
1455
-
1456
- def test_selector_hacks
1457
- assert_selector_renders = lambda do |s|
1458
- assert_converts <<SASS, <<SCSS
1459
- #{s}
1460
- a: b
1461
- SASS
1462
- #{s} {
1463
- a: b;
1464
- }
1465
- SCSS
1466
- end
1467
-
1468
- assert_selector_renders['> E']
1469
- assert_selector_renders['+ E']
1470
- assert_selector_renders['~ E']
1471
- assert_selector_renders['> > E']
1472
-
1473
- assert_selector_renders['E*']
1474
- assert_selector_renders['E*.foo']
1475
- assert_selector_renders['E*:hover']
1476
- end
1477
-
1478
- def test_disallowed_colon_hack
1479
- assert_raise_message(Sass::SyntaxError, 'The ":name: val" hack is not allowed in the Sass indented syntax') do
1480
- to_sass("foo {:name: val;}", :syntax => :scss)
1481
- end
1482
- end
1483
-
1484
- def test_nested_properties
1485
- assert_converts <<SASS, <<SCSS
1486
- div
1487
- before: before
1488
- background:
1489
- color: blue
1490
- repeat: no-repeat
1491
- after: after
1492
- SASS
1493
- div {
1494
- before: before;
1495
- background: {
1496
- color: blue;
1497
- repeat: no-repeat;
1498
- };
1499
- after: after;
1500
- }
1501
-
1502
- SCSS
1503
- end
1504
-
1505
- def test_dasherize
1506
- assert_sass_to_scss(<<SCSS, <<SASS, options: {dasherize: true})
1507
- @mixin under-scored-mixin($under-scored-arg: $under-scored-default) {
1508
- bar: $under-scored-arg;
1509
- }
1510
-
1511
- div {
1512
- foo: under-scored-fn($under-scored-var + "before\#{$another-under-scored-var}after");
1513
-
1514
- @include under-scored-mixin($passed-arg);
1515
-
1516
- selector-\#{$under-scored-interp}: bold;
1517
- }
1518
-
1519
- @if $under-scored {
1520
- @for $for-var from $from-var to $to-var {
1521
- @while $while-var == true {
1522
- $while-var: false;
1523
- }
1524
- }
1525
- }
1526
- SCSS
1527
- =under_scored_mixin($under_scored_arg: $under_scored_default)
1528
- bar: $under_scored_arg
1529
- div
1530
- foo: under_scored_fn($under_scored_var + "before\#{$another_under_scored_var}after")
1531
- +under_scored_mixin($passed_arg)
1532
- selector-\#{$under_scored_interp}: bold
1533
- @if $under_scored
1534
- @for $for_var from $from_var to $to_var
1535
- @while $while_var == true
1536
- $while_var : false
1537
- SASS
1538
- end
1539
-
1540
- def test_loud_comment_conversion
1541
- assert_converts(<<SASS, <<SCSS)
1542
- /*! \#{"interpolated"}
1543
- SASS
1544
- /*! \#{"interpolated"} */
1545
- SCSS
1546
- end
1547
-
1548
- def test_content_conversion
1549
- assert_converts(<<SASS, <<SCSS)
1550
- $color: blue
1551
-
1552
- =context($class, $color: red)
1553
- .\#{$class}
1554
- background-color: $color
1555
-
1556
- @content
1557
-
1558
- border-color: $color
1559
-
1560
- +context(parent)
1561
- +context(child, $color: yellow)
1562
- color: $color
1563
- SASS
1564
- $color: blue;
1565
-
1566
- @mixin context($class, $color: red) {
1567
- .\#{$class} {
1568
- background-color: $color;
1569
-
1570
- @content;
1571
-
1572
- border-color: $color;
1573
- }
1574
- }
1575
-
1576
- @include context(parent) {
1577
- @include context(child, $color: yellow) {
1578
- color: $color;
1579
- }
1580
- }
1581
- SCSS
1582
-
1583
- end
1584
-
1585
- def test_empty_content
1586
- assert_scss_to_scss(<<SCSS)
1587
- @mixin foo {
1588
- @content;
1589
- }
1590
-
1591
- @include foo {}
1592
- SCSS
1593
- end
1594
-
1595
- def test_placeholder_conversion
1596
- assert_converts(<<SASS, <<SCSS)
1597
- #content a%foo.bar
1598
- color: blue
1599
- SASS
1600
- #content a%foo.bar {
1601
- color: blue;
1602
- }
1603
- SCSS
1604
- end
1605
-
1606
- def test_reference_selector
1607
- assert_converts(<<SASS, <<SCSS)
1608
- foo /bar|baz/ bang
1609
- a: b
1610
- SASS
1611
- foo /bar|baz/ bang {
1612
- a: b;
1613
- }
1614
- SCSS
1615
- end
1616
-
1617
- def test_subject
1618
- assert_converts(<<SASS, <<SCSS)
1619
- foo bar! baz
1620
- a: b
1621
- SASS
1622
- foo bar! baz {
1623
- a: b;
1624
- }
1625
- SCSS
1626
- end
1627
-
1628
- def test_placeholder_interoplation_conversion
1629
- assert_converts(<<SASS, <<SCSS)
1630
- $foo: foo
1631
-
1632
- %\#{$foo}
1633
- color: blue
1634
-
1635
- .bar
1636
- @extend %foo
1637
- SASS
1638
- $foo: foo;
1639
-
1640
- %\#{$foo} {
1641
- color: blue;
1642
- }
1643
-
1644
- .bar {
1645
- @extend %foo;
1646
- }
1647
- SCSS
1648
- end
1649
-
1650
- def test_indent
1651
- assert_converts <<SASS, <<SCSS, options: {indent: " "}
1652
- foo bar
1653
- baz bang
1654
- baz: bang
1655
- bip: bop
1656
-
1657
- blat: boo
1658
- SASS
1659
- foo bar {
1660
- baz bang {
1661
- baz: bang;
1662
- bip: bop;
1663
- }
1664
-
1665
- blat: boo;
1666
- }
1667
- SCSS
1668
-
1669
- assert_converts <<SASS, <<SCSS, options: {indent: "\t"}
1670
- foo bar
1671
- baz bang
1672
- baz: bang
1673
- bip: bop
1674
-
1675
- blat: boo
1676
- SASS
1677
- foo bar {
1678
- baz bang {
1679
- baz: bang;
1680
- bip: bop;
1681
- }
1682
-
1683
- blat: boo;
1684
- }
1685
- SCSS
1686
-
1687
- assert_sass_to_scss <<SCSS, <<SASS, options: {indent: " "}
1688
- foo bar {
1689
- baz bang {
1690
- baz: bang;
1691
- bip: bop;
1692
- }
1693
-
1694
- blat: boo;
1695
- }
1696
- SCSS
1697
- foo bar
1698
- baz bang
1699
- baz: bang
1700
- bip: bop
1701
-
1702
- blat: boo
1703
- SASS
1704
-
1705
- assert_sass_to_scss <<SCSS, <<SASS, options: {indent: "\t"}
1706
- foo bar {
1707
- baz bang {
1708
- baz: bang;
1709
- bip: bop;
1710
- }
1711
-
1712
- blat: boo;
1713
- }
1714
- SCSS
1715
- foo bar
1716
- baz bang
1717
- baz: bang
1718
- bip: bop
1719
-
1720
- blat: boo
1721
- SASS
1722
-
1723
- assert_scss_to_sass <<SASS, <<SCSS, options: {indent: " "}
1724
- foo bar
1725
- baz bang
1726
- baz: bang
1727
- bip: bop
1728
-
1729
- blat: boo
1730
- SASS
1731
- foo bar {
1732
- baz bang {
1733
- baz: bang;
1734
- bip: bop;
1735
- }
1736
-
1737
- blat: boo;
1738
- }
1739
- SCSS
1740
-
1741
- assert_scss_to_sass <<SASS, <<SCSS, options: {indent: "\t"}
1742
- foo bar
1743
- baz bang
1744
- baz: bang
1745
- bip: bop
1746
-
1747
- blat: boo
1748
- SASS
1749
- foo bar {
1750
- baz bang {
1751
- baz: bang;
1752
- bip: bop;
1753
- }
1754
-
1755
- blat: boo;
1756
- }
1757
- SCSS
1758
- end
1759
-
1760
- def test_extend_with_optional
1761
- assert_converts <<SASS, <<SCSS
1762
- foo
1763
- @extend .bar !optional
1764
- SASS
1765
- foo {
1766
- @extend .bar !optional;
1767
- }
1768
- SCSS
1769
- end
1770
-
1771
- def test_mixin_var_args
1772
- assert_converts <<SASS, <<SCSS
1773
- =foo($args...)
1774
- a: b
1775
-
1776
- =bar($a, $args...)
1777
- a: b
1778
-
1779
- .foo
1780
- +foo($list...)
1781
-
1782
- +bar(1, $list...)
1783
- SASS
1784
- @mixin foo($args...) {
1785
- a: b;
1786
- }
1787
-
1788
- @mixin bar($a, $args...) {
1789
- a: b;
1790
- }
1791
-
1792
- .foo {
1793
- @include foo($list...);
1794
-
1795
- @include bar(1, $list...);
1796
- }
1797
- SCSS
1798
- end
1799
-
1800
- def test_mixin_var_kwargs
1801
- assert_converts <<SASS, <<SCSS
1802
- =foo($a: b, $c: d)
1803
- a: $a
1804
- c: $c
1805
-
1806
- .foo
1807
- +foo($list..., $map...)
1808
-
1809
- +foo(pos, $list..., $kwd: val, $map...)
1810
- SASS
1811
- @mixin foo($a: b, $c: d) {
1812
- a: $a;
1813
- c: $c;
1814
- }
1815
-
1816
- .foo {
1817
- @include foo($list..., $map...);
1818
-
1819
- @include foo(pos, $list..., $kwd: val, $map...);
1820
- }
1821
- SCSS
1822
- end
1823
-
1824
- def test_function_var_args
1825
- assert_converts <<SASS, <<SCSS
1826
- @function foo($args...)
1827
- @return foo
1828
-
1829
- @function bar($a, $args...)
1830
- @return bar
1831
-
1832
- .foo
1833
- a: foo($list...)
1834
- b: bar(1, $list...)
1835
- SASS
1836
- @function foo($args...) {
1837
- @return foo;
1838
- }
1839
-
1840
- @function bar($a, $args...) {
1841
- @return bar;
1842
- }
1843
-
1844
- .foo {
1845
- a: foo($list...);
1846
- b: bar(1, $list...);
1847
- }
1848
- SCSS
1849
- end
1850
-
1851
- def test_function_var_kwargs
1852
- assert_converts <<SASS, <<SCSS
1853
- @function foo($a: b, $c: d)
1854
- @return foo
1855
-
1856
- .foo
1857
- a: foo($list..., $map...)
1858
- b: foo(pos, $list..., $kwd: val, $map...)
1859
- SASS
1860
- @function foo($a: b, $c: d) {
1861
- @return foo;
1862
- }
1863
-
1864
- .foo {
1865
- a: foo($list..., $map...);
1866
- b: foo(pos, $list..., $kwd: val, $map...);
1867
- }
1868
- SCSS
1869
- end
1870
-
1871
- def test_at_root
1872
- assert_converts <<SASS, <<SCSS
1873
- .foo
1874
- @at-root
1875
- .bar
1876
- a: b
1877
-
1878
- .baz
1879
- c: d
1880
- SASS
1881
- .foo {
1882
- @at-root {
1883
- .bar {
1884
- a: b;
1885
- }
1886
-
1887
- .baz {
1888
- c: d;
1889
- }
1890
- }
1891
- }
1892
- SCSS
1893
- end
1894
-
1895
- def test_at_root_with_selector
1896
- assert_converts <<SASS, <<SCSS
1897
- .foo
1898
- @at-root .bar
1899
- a: b
1900
- SASS
1901
- .foo {
1902
- @at-root .bar {
1903
- a: b;
1904
- }
1905
- }
1906
- SCSS
1907
- end
1908
-
1909
- def test_at_root_without
1910
- assert_converts <<SASS, <<SCSS
1911
- .foo
1912
- @at-root (without: media rule)
1913
- a: b
1914
- SASS
1915
- .foo {
1916
- @at-root (without: media rule) {
1917
- a: b;
1918
- }
1919
- }
1920
- SCSS
1921
- end
1922
-
1923
- def test_at_root_with
1924
- assert_converts <<SASS, <<SCSS
1925
- .foo
1926
- @at-root (with: media rule)
1927
- a: b
1928
- SASS
1929
- .foo {
1930
- @at-root (with: media rule) {
1931
- a: b;
1932
- }
1933
- }
1934
- SCSS
1935
- end
1936
-
1937
- def test_function_var_kwargs_with_list
1938
- assert_converts <<SASS, <<SCSS
1939
- @function foo($a: b, $c: d)
1940
- @return $a, $c
1941
-
1942
- .foo
1943
- a: foo($list..., $map...)
1944
- SASS
1945
- @function foo($a: b, $c: d) {
1946
- @return $a, $c;
1947
- }
1948
-
1949
- .foo {
1950
- a: foo($list..., $map...);
1951
- }
1952
- SCSS
1953
- end
1954
-
1955
- def test_keyframes
1956
- assert_converts(<<SASS, <<SCSS)
1957
- @keyframes identifier
1958
- 0%
1959
- top: 0
1960
- left: 0
1961
-
1962
- 30%
1963
- top: 50px
1964
-
1965
- 68%, 72%
1966
- left: 50px
1967
-
1968
- 100%
1969
- top: 100px
1970
- left: 100%
1971
- SASS
1972
- @keyframes identifier {
1973
- 0% {
1974
- top: 0;
1975
- left: 0;
1976
- }
1977
-
1978
- 30% {
1979
- top: 50px;
1980
- }
1981
-
1982
- 68%, 72% {
1983
- left: 50px;
1984
- }
1985
-
1986
- 100% {
1987
- top: 100px;
1988
- left: 100%;
1989
- }
1990
- }
1991
- SCSS
1992
- end
1993
-
1994
- ## Regression Tests
1995
-
1996
- def test_list_in_args
1997
- assert_converts(<<SASS, <<SCSS)
1998
- +mixin((a, b, c))
1999
-
2000
- +mixin($arg: (a, b, c))
2001
-
2002
- +mixin(a, b, (c, d, e)...)
2003
- SASS
2004
- @include mixin((a, b, c));
2005
-
2006
- @include mixin($arg: (a, b, c));
2007
-
2008
- @include mixin(a, b, (c, d, e)...);
2009
- SCSS
2010
- end
2011
-
2012
- def test_media_query_with_expr
2013
- assert_converts <<SASS, <<SCSS
2014
- @media foo and (bar: baz)
2015
- a: b
2016
- SASS
2017
- @media foo and (bar: baz) {
2018
- a: b;
2019
- }
2020
- SCSS
2021
- end
2022
-
2023
- def test_nested_if_statements
2024
- assert_converts(<<SASS, <<SCSS)
2025
- @if $foo
2026
- one
2027
- a: b
2028
- @else
2029
- @if $bar
2030
- two
2031
- a: b
2032
- @else
2033
- three
2034
- a: b
2035
- SASS
2036
- @if $foo {
2037
- one {
2038
- a: b;
2039
- }
2040
- }
2041
- @else {
2042
- @if $bar {
2043
- two {
2044
- a: b;
2045
- }
2046
- }
2047
- @else {
2048
- three {
2049
- a: b;
2050
- }
2051
- }
2052
- }
2053
- SCSS
2054
- end
2055
-
2056
- def test_comment_indentation
2057
- assert_converts(<<SASS, <<SCSS, options: {indent: ' '})
2058
- foo
2059
- // bar
2060
- /* baz
2061
- a: b
2062
- SASS
2063
- foo {
2064
- // bar
2065
- /* baz */
2066
- a: b;
2067
- }
2068
- SCSS
2069
- end
2070
-
2071
- def test_keyword_arguments
2072
- assert_converts(<<SASS, <<SCSS, options: {dasherize: true})
2073
- $foo: foo($dash-ed: 2px)
2074
- SASS
2075
- $foo: foo($dash-ed: 2px);
2076
- SCSS
2077
- assert_scss_to_sass(<<SASS, <<SCSS, options: {dasherize: true})
2078
- $foo: foo($dash-ed: 2px)
2079
- SASS
2080
- $foo: foo($dash_ed: 2px);
2081
- SCSS
2082
- assert_sass_to_scss(<<SCSS, <<SASS, options: {dasherize: true})
2083
- $foo: foo($dash-ed: 2px);
2084
- SCSS
2085
- $foo: foo($dash_ed: 2px)
2086
- SASS
2087
- assert_converts(<<SASS, <<SCSS)
2088
- $foo: foo($under_scored: 1px)
2089
- SASS
2090
- $foo: foo($under_scored: 1px);
2091
- SCSS
2092
- assert_converts(<<SASS, <<SCSS)
2093
- $foo: foo($dash-ed: 2px, $under_scored: 1px)
2094
- SASS
2095
- $foo: foo($dash-ed: 2px, $under_scored: 1px);
2096
- SCSS
2097
- end
2098
-
2099
- def test_ambiguous_negation
2100
- assert_converts(<<SASS, <<SCSS, options: {indent: ' '})
2101
- foo
2102
- ok: -$foo
2103
- comma: 10px, -$foo
2104
- needs-parens: 10px (-$foo)
2105
- SASS
2106
- foo {
2107
- ok: -$foo;
2108
- comma: 10px, -$foo;
2109
- needs-parens: 10px (-$foo);
2110
- }
2111
- SCSS
2112
- end
2113
-
2114
- def test_variable_with_global
2115
- assert_converts(<<SASS, <<SCSS)
2116
- $var: 1
2117
-
2118
- foo
2119
- $var: 2 !global
2120
- $var: 3 !global !default
2121
- SASS
2122
- $var: 1;
2123
-
2124
- foo {
2125
- $var: 2 !global;
2126
- $var: 3 !global !default;
2127
- }
2128
- SCSS
2129
- end
2130
-
2131
- def test_import_with_supports_clause
2132
- assert_converts(<<'SASS', <<'SCSS')
2133
- @import url("fallback-layout.css") supports(not (display: #{$display-type}))
2134
- SASS
2135
- @import url("fallback-layout.css") supports(not (display: #{$display-type}));
2136
- SCSS
2137
- end
2138
- end