scss-lint 0.25.1 → 0.26.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 (77) hide show
  1. checksums.yaml +4 -4
  2. data/config/default.yml +10 -1
  3. data/data/property-sort-orders/concentric.txt +99 -0
  4. data/lib/scss_lint.rb +1 -0
  5. data/lib/scss_lint/cli.rb +9 -3
  6. data/lib/scss_lint/exceptions.rb +4 -0
  7. data/lib/scss_lint/linter.rb +10 -1
  8. data/lib/scss_lint/linter/capitalization_in_selector.rb +14 -6
  9. data/lib/scss_lint/linter/compass/property_with_mixin.rb +9 -2
  10. data/lib/scss_lint/linter/indentation.rb +28 -6
  11. data/lib/scss_lint/linter/property_sort_order.rb +61 -9
  12. data/lib/scss_lint/linter/single_line_per_property.rb +53 -0
  13. data/lib/scss_lint/linter/single_line_per_selector.rb +6 -1
  14. data/lib/scss_lint/linter/space_after_comma.rb +27 -19
  15. data/lib/scss_lint/linter/space_before_brace.rb +5 -4
  16. data/lib/scss_lint/linter/trailing_semicolon.rb +53 -0
  17. data/lib/scss_lint/linter/unnecessary_parent_reference.rb +36 -0
  18. data/lib/scss_lint/reporter/default_reporter.rb +7 -2
  19. data/lib/scss_lint/reporter/xml_reporter.rb +2 -1
  20. data/lib/scss_lint/runner.rb +7 -3
  21. data/lib/scss_lint/version.rb +1 -1
  22. data/spec/scss_lint/cli_spec.rb +314 -0
  23. data/spec/scss_lint/config_spec.rb +439 -0
  24. data/spec/scss_lint/engine_spec.rb +24 -0
  25. data/spec/scss_lint/linter/border_zero_spec.rb +84 -0
  26. data/spec/scss_lint/linter/capitalization_in_selector_spec.rb +71 -0
  27. data/spec/scss_lint/linter/color_keyword_spec.rb +83 -0
  28. data/spec/scss_lint/linter/comment_spec.rb +55 -0
  29. data/spec/scss_lint/linter/compass/property_with_mixin_spec.rb +55 -0
  30. data/spec/scss_lint/linter/debug_statement_spec.rb +21 -0
  31. data/spec/scss_lint/linter/declaration_order_spec.rb +94 -0
  32. data/spec/scss_lint/linter/duplicate_property_spec.rb +176 -0
  33. data/spec/scss_lint/linter/else_placement_spec.rb +106 -0
  34. data/spec/scss_lint/linter/empty_line_between_blocks_spec.rb +263 -0
  35. data/spec/scss_lint/linter/empty_rule_spec.rb +27 -0
  36. data/spec/scss_lint/linter/final_newline_spec.rb +49 -0
  37. data/spec/scss_lint/linter/hex_length_spec.rb +104 -0
  38. data/spec/scss_lint/linter/hex_notation_spec.rb +104 -0
  39. data/spec/scss_lint/linter/hex_validation_spec.rb +36 -0
  40. data/spec/scss_lint/linter/id_with_extraneous_selector_spec.rb +139 -0
  41. data/spec/scss_lint/linter/indentation_spec.rb +242 -0
  42. data/spec/scss_lint/linter/leading_zero_spec.rb +233 -0
  43. data/spec/scss_lint/linter/mergeable_selector_spec.rb +283 -0
  44. data/spec/scss_lint/linter/name_format_spec.rb +206 -0
  45. data/spec/scss_lint/linter/placeholder_in_extend_spec.rb +63 -0
  46. data/spec/scss_lint/linter/property_sort_order_spec.rb +246 -0
  47. data/spec/scss_lint/linter/property_spelling_spec.rb +57 -0
  48. data/spec/scss_lint/linter/selector_depth_spec.rb +159 -0
  49. data/spec/scss_lint/linter/shorthand_spec.rb +172 -0
  50. data/spec/scss_lint/linter/single_line_per_property_spec.rb +73 -0
  51. data/spec/scss_lint/linter/single_line_per_selector_spec.rb +121 -0
  52. data/spec/scss_lint/linter/space_after_comma_spec.rb +315 -0
  53. data/spec/scss_lint/linter/space_after_property_colon_spec.rb +238 -0
  54. data/spec/scss_lint/linter/space_after_property_name_spec.rb +23 -0
  55. data/spec/scss_lint/linter/space_before_brace_spec.rb +447 -0
  56. data/spec/scss_lint/linter/space_between_parens_spec.rb +263 -0
  57. data/spec/scss_lint/linter/string_quotes_spec.rb +303 -0
  58. data/spec/scss_lint/linter/trailing_semicolon_spec.rb +188 -0
  59. data/spec/scss_lint/linter/unnecessary_mantissa_spec.rb +67 -0
  60. data/spec/scss_lint/linter/unnecessary_parent_reference_spec.rb +67 -0
  61. data/spec/scss_lint/linter/url_format_spec.rb +55 -0
  62. data/spec/scss_lint/linter/url_quotes_spec.rb +63 -0
  63. data/spec/scss_lint/linter/zero_unit_spec.rb +113 -0
  64. data/spec/scss_lint/linter_registry_spec.rb +50 -0
  65. data/spec/scss_lint/location_spec.rb +42 -0
  66. data/spec/scss_lint/reporter/config_reporter_spec.rb +42 -0
  67. data/spec/scss_lint/reporter/default_reporter_spec.rb +73 -0
  68. data/spec/scss_lint/reporter/files_reporter_spec.rb +38 -0
  69. data/spec/scss_lint/reporter/xml_reporter_spec.rb +103 -0
  70. data/spec/scss_lint/reporter_spec.rb +11 -0
  71. data/spec/scss_lint/runner_spec.rb +132 -0
  72. data/spec/scss_lint/selector_visitor_spec.rb +264 -0
  73. data/spec/spec_helper.rb +34 -0
  74. data/spec/support/isolated_environment.rb +25 -0
  75. data/spec/support/matchers/report_lint.rb +48 -0
  76. metadata +126 -8
  77. data/lib/scss_lint/linter/trailing_semicolon_after_property_value.rb +0 -40
@@ -0,0 +1,172 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::Shorthand do
4
+ context 'when a rule' do
5
+ context 'is empty' do
6
+ let(:css) { <<-CSS }
7
+ p {
8
+ }
9
+ CSS
10
+
11
+ it { should_not report_lint }
12
+ end
13
+
14
+ context 'contains properties with valid shorthand values' do
15
+ let(:css) { <<-CSS }
16
+ p {
17
+ border-radius: 1px 2px 1px 3px;
18
+ border-width: 1px;
19
+ color: rgba(0, 0, 0, .5);
20
+ margin: 1px 2px;
21
+ padding: 0 0 1px;
22
+ }
23
+ CSS
24
+
25
+ it { should_not report_lint }
26
+ end
27
+ end
28
+
29
+ context 'when a property' do
30
+ context 'has a value repeated 4 times' do
31
+ let(:css) { <<-CSS }
32
+ p {
33
+ padding: 1px 1px 1px 1px;
34
+ }
35
+ CSS
36
+
37
+ it { should report_lint line: 2 }
38
+ end
39
+
40
+ context 'has a value repeated 3 times' do
41
+ let(:css) { <<-CSS }
42
+ p {
43
+ padding: 3px 3px 3px;
44
+ }
45
+ CSS
46
+
47
+ it { should report_lint line: 2 }
48
+ end
49
+
50
+ context 'has interpolation in its name and starts with a shorthandable property' do
51
+ let(:css) { <<-CSS }
52
+ p {
53
+ border-color\#{$type}: 1px 1px;
54
+ }
55
+ CSS
56
+
57
+ it { should_not report_lint }
58
+ end
59
+
60
+ context 'has exactly two identical values' do
61
+ let(:css) { <<-CSS }
62
+ p {
63
+ padding: 10px 10px;
64
+ }
65
+ CSS
66
+
67
+ it { should report_lint line: 2 }
68
+ end
69
+
70
+ context 'appears to have two identical values, but cannot be shorthanded' do
71
+ let(:css) { <<-CSS }
72
+ p:before {
73
+ content: ' ';
74
+ }
75
+ CSS
76
+
77
+ it { should_not report_lint }
78
+ end
79
+
80
+ context 'has its first two values repeated' do
81
+ let(:css) { <<-CSS }
82
+ p {
83
+ padding: 1px 2px 1px 2px;
84
+ }
85
+ CSS
86
+
87
+ it { should report_lint line: 2 }
88
+ end
89
+
90
+ context 'has its first value repeated in the third position' do
91
+ let(:css) { <<-CSS }
92
+ p {
93
+ padding: 1px 2px 1px;
94
+ }
95
+ CSS
96
+
97
+ it { should report_lint line: 2 }
98
+ end
99
+
100
+ context 'has its second value repeated in the fourth position' do
101
+ let(:css) { <<-CSS }
102
+ p {
103
+ padding: 1px 2px 3px 2px;
104
+ }
105
+ CSS
106
+
107
+ it { should report_lint line: 2 }
108
+ end
109
+
110
+ context 'contains numeric values and function calls' do
111
+ let(:css) { <<-CSS }
112
+ p {
113
+ margin: 10px percentage(1 / 100);
114
+ }
115
+ CSS
116
+
117
+ it { should_not report_lint }
118
+ end
119
+
120
+ context 'contains a list of function calls that can be shortened' do
121
+ let(:css) { <<-CSS }
122
+ p {
123
+ margin: percentage(1 / 100) percentage(1 / 100);
124
+ }
125
+ CSS
126
+
127
+ it { should report_lint line: 2 }
128
+ end
129
+
130
+ context 'contains a list of function calls that cannot be shortened' do
131
+ let(:css) { <<-CSS }
132
+ p {
133
+ margin: percentage(1 / 100) percentage(5 / 100);
134
+ }
135
+ CSS
136
+
137
+ it { should_not report_lint }
138
+ end
139
+
140
+ context 'contains a list of variables that can be shortened' do
141
+ let(:css) { <<-CSS }
142
+ p {
143
+ margin: $my-var 1px $my-var;
144
+ }
145
+ CSS
146
+
147
+ it { should report_lint line: 2 }
148
+ end
149
+
150
+ context 'contains a number with no trailing semicolon' do
151
+ let(:css) { <<-CSS }
152
+ p {
153
+ margin: 4px
154
+ }
155
+ CSS
156
+
157
+ it { should_not report_lint }
158
+ end
159
+
160
+ context 'can be shortened and is followed by !important modifier' do
161
+ let(:css) { <<-CSS }
162
+ p {
163
+ padding: 1px 2px 3px 2px !important;
164
+ margin: 0 0 0 0 !important; // A comment
165
+ }
166
+ CSS
167
+
168
+ it { should report_lint line: 2 }
169
+ it { should report_lint line: 3 }
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::SingleLinePerProperty do
4
+ context 'when properties are each on their own line' do
5
+ let(:css) { <<-CSS }
6
+ p {
7
+ color: #fff;
8
+ margin: 0;
9
+ padding: 5px;
10
+ }
11
+ CSS
12
+
13
+ it { should_not report_lint }
14
+ end
15
+
16
+ context 'when two properties share a line' do
17
+ let(:css) { <<-CSS }
18
+ p {
19
+ color: #fff;
20
+ margin: 0; padding: 5px;
21
+ }
22
+ CSS
23
+
24
+ it { should_not report_lint line: 2 }
25
+ it { should report_lint line: 3, count: 1 }
26
+ end
27
+
28
+ context 'when multiple properties share a line' do
29
+ let(:css) { <<-CSS }
30
+ p {
31
+ color: #fff; margin: 0; padding: 5px;
32
+ }
33
+ CSS
34
+
35
+ it { should report_lint line: 2, count: 2 }
36
+ end
37
+
38
+ context 'when multiple properties share a line on a single line rule set' do
39
+ let(:css) { <<-CSS }
40
+ p { color: #fff; margin: 0; padding: 5px; }
41
+ CSS
42
+
43
+ context 'and single line rule sets are allowed' do
44
+ let(:linter_config) { { 'allow_single_line_rule_sets' => true } }
45
+
46
+ it { should_not report_lint }
47
+ end
48
+
49
+ context 'and single line rule sets are not allowed' do
50
+ let(:linter_config) { { 'allow_single_line_rule_sets' => false } }
51
+
52
+ it { should report_lint }
53
+ end
54
+ end
55
+
56
+ context 'when a single line rule set contains a single property' do
57
+ let(:css) { <<-CSS }
58
+ p { color: #fff; }
59
+ CSS
60
+
61
+ context 'and single line rule sets are allowed' do
62
+ let(:linter_config) { { 'allow_single_line_rule_sets' => true } }
63
+
64
+ it { should_not report_lint }
65
+ end
66
+
67
+ context 'and single line rule sets are not allowed' do
68
+ let(:linter_config) { { 'allow_single_line_rule_sets' => false } }
69
+
70
+ it { should report_lint }
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,121 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::SingleLinePerSelector do
4
+ context 'when rule has one selector' do
5
+ let(:css) { <<-CSS }
6
+ p {
7
+ }
8
+ CSS
9
+
10
+ it { should_not report_lint }
11
+ end
12
+
13
+ context 'when rule has one selector on each line' do
14
+ let(:css) { <<-CSS }
15
+ p,
16
+ a {
17
+ }
18
+ CSS
19
+
20
+ it { should_not report_lint }
21
+ end
22
+
23
+ context 'when rule contains multiple selectors on the same line' do
24
+ let(:css) { <<-CSS }
25
+ .first,
26
+ .second,
27
+ .third, .fourth,
28
+ .fifth {
29
+ }
30
+ CSS
31
+
32
+ it { should report_lint line: 1 }
33
+ end
34
+
35
+ context 'when commas are not at the end of the line' do
36
+ let(:css) { <<-CSS }
37
+ .foo
38
+ , .bar {
39
+ }
40
+ CSS
41
+
42
+ it { should report_lint }
43
+ end
44
+
45
+ context 'when commas are on their own line' do
46
+ let(:css) { <<-CSS }
47
+ .foo
48
+ ,
49
+ .bar {
50
+ }
51
+ CSS
52
+
53
+ it { should report_lint }
54
+ end
55
+
56
+ context 'when nested rule contains multiple selectors on the same line' do
57
+ let(:css) { <<-CSS }
58
+ #foo {
59
+ .first,
60
+ .second,
61
+ .third, .fourth,
62
+ .fifth {
63
+ }
64
+ }
65
+ CSS
66
+
67
+ it { should report_lint line: 2 }
68
+ end
69
+
70
+ context 'when rule contains interpolated selectors' do
71
+ let(:css) { <<-CSS }
72
+ .first,
73
+ \#{interpolated-selector}.thing,
74
+ .third {
75
+ }
76
+ CSS
77
+
78
+ it { should_not report_lint }
79
+ end
80
+
81
+ context 'when rule contains an interpolated selector not on its own line' do
82
+ let(:css) { <<-CSS }
83
+ .first,
84
+ .second, \#{interpolated-selector}.thing,
85
+ .fourth {
86
+ }
87
+ CSS
88
+
89
+ it { should report_lint line: 1 }
90
+ end
91
+
92
+ context 'when rule contains an inline comment' do
93
+ let(:css) { <<-CSS }
94
+ .first, /* A comment */
95
+ .second, // Another comment
96
+ .third {
97
+ }
98
+ CSS
99
+
100
+ it { should_not report_lint }
101
+ end
102
+
103
+ context 'when interpolation contains a comma' do
104
+ let(:css) { <<-CSS }
105
+ .my-\#{function(1, 2)}-selector .nested {
106
+ }
107
+ CSS
108
+
109
+ it { should_not report_lint }
110
+ end
111
+
112
+ context 'when selector contains an interpolated string' do
113
+ let(:css) { <<-CSS }
114
+ div,
115
+ \#{$selector},
116
+ p {}
117
+ CSS
118
+
119
+ it { should_not report_lint }
120
+ end
121
+ end
@@ -0,0 +1,315 @@
1
+ require 'spec_helper'
2
+
3
+ describe SCSSLint::Linter::SpaceAfterComma do
4
+ context 'in a mixin declaration' do
5
+ context 'where spaces do not follow commas' do
6
+ let(:css) { <<-CSS }
7
+ @mixin mixin($arg1,$arg2,$kwarg1: 'default',$kwarg2: 'default') {
8
+ }
9
+ CSS
10
+
11
+ it { should report_lint count: 3 }
12
+ end
13
+
14
+ context 'where spaces follow commas' do
15
+ let(:css) { <<-CSS }
16
+ @mixin mixin($arg1, $arg2, $kwarg1: 'default', $kwarg2: 'default') {
17
+ }
18
+ CSS
19
+
20
+ it { should_not report_lint }
21
+ end
22
+
23
+ context 'where spaces surround commas' do
24
+ let(:css) { <<-CSS }
25
+ @mixin mixin($arg1 , $arg2 , $kwarg1: 'default' , $kwarg2: 'default') {
26
+ }
27
+ CSS
28
+
29
+ it { should_not report_lint }
30
+ end
31
+
32
+ context 'where commas are followed by a newline' do
33
+ let(:css) { <<-CSS }
34
+ @mixin mixin($arg1,
35
+ $arg2,
36
+ $kwarg1: 'default',
37
+ $kwarg2: 'default') {
38
+ }
39
+ CSS
40
+
41
+ it { should_not report_lint }
42
+ end
43
+
44
+ context 'definining a variable argument' do
45
+ context 'where spaces do not follow commas' do
46
+ let(:css) { <<-CSS }
47
+ @mixin mixin($arg,$args...) {
48
+ }
49
+ CSS
50
+
51
+ it { should report_lint count: 1 }
52
+ end
53
+
54
+ context 'where spaces follow commas' do
55
+ let(:css) { <<-CSS }
56
+ @mixin mixin($arg, $args...) {
57
+ }
58
+ CSS
59
+
60
+ it { should_not report_lint }
61
+ end
62
+
63
+ context 'where spaces surround commas' do
64
+ let(:css) { <<-CSS }
65
+ @mixin mixin($arg , $args...) {
66
+ }
67
+ CSS
68
+
69
+ it { should_not report_lint }
70
+ end
71
+
72
+ context 'where commas are followed by a newline' do
73
+ let(:css) { <<-CSS }
74
+ @mixin mixin($arg,
75
+ $args...) {
76
+ }
77
+ CSS
78
+
79
+ it { should_not report_lint }
80
+ end
81
+ end
82
+ end
83
+
84
+ context 'in a mixin inclusion' do
85
+ context 'where spaces do not follow commas' do
86
+ let(:css) { <<-CSS }
87
+ p {
88
+ @include mixin(1,2,3,$args...,$kwarg1: 4,$kwarg2: 5,$kwargs...);
89
+ }
90
+ CSS
91
+
92
+ it { should report_lint count: 6 }
93
+ end
94
+
95
+ context 'where spaces follow commas' do
96
+ let(:css) { <<-CSS }
97
+ p {
98
+ @include mixin(1, 2, 3, $args..., $kwarg1: 4, $kwarg2: 5, $kwargs...);
99
+ }
100
+ CSS
101
+
102
+ it { should_not report_lint }
103
+ end
104
+
105
+ context 'where spaces surround commas' do
106
+ let(:css) { <<-CSS }
107
+ p {
108
+ @include mixin(1 , 2 , 3 , $args... , $kwarg1: 4 , $kwarg2: 5 , $kwargs...);
109
+ }
110
+ CSS
111
+
112
+ it { should_not report_lint }
113
+ end
114
+
115
+ context 'where commas are followed by a newline' do
116
+ let(:css) { <<-CSS }
117
+ p {
118
+ @include mixin(1,
119
+ 2,
120
+ 3,
121
+ $args...,
122
+ $kwarg1: 4,
123
+ $kwarg2: 5,
124
+ $kwargs...);
125
+ }
126
+ CSS
127
+
128
+ it { should_not report_lint }
129
+ end
130
+ end
131
+
132
+ context 'in a function declaration' do
133
+ context 'where spaces do not follow commas' do
134
+ let(:css) { <<-CSS }
135
+ @function func($arg1,$arg2,$kwarg1: 'default',$kwarg2: 'default') {
136
+ }
137
+ CSS
138
+
139
+ it { should report_lint count: 3 }
140
+ end
141
+
142
+ context 'where spaces follow commas' do
143
+ let(:css) { <<-CSS }
144
+ @function func($arg1, $arg2, $kwarg1: 'default', $kwarg2: 'default') {
145
+ }
146
+ CSS
147
+
148
+ it { should_not report_lint }
149
+ end
150
+
151
+ context 'where spaces surround commas' do
152
+ let(:css) { <<-CSS }
153
+ @function func($arg1 , $arg2 , $kwarg1: 'default' , $kwarg2: 'default') {
154
+ }
155
+ CSS
156
+
157
+ it { should_not report_lint }
158
+ end
159
+
160
+ context 'where commas are followed by a newline' do
161
+ let(:css) { <<-CSS }
162
+ @function func($arg1,
163
+ $arg2,
164
+ $kwarg1: 'default',
165
+ $kwarg2: 'default') {
166
+ }
167
+ CSS
168
+
169
+ it { should_not report_lint }
170
+ end
171
+
172
+ context 'definining a variable argument' do
173
+ context 'where spaces do not follow commas' do
174
+ let(:css) { <<-CSS }
175
+ @function func($arg,$args...) {
176
+ }
177
+ CSS
178
+
179
+ it { should report_lint count: 1 }
180
+ end
181
+
182
+ context 'where spaces follow commas' do
183
+ let(:css) { <<-CSS }
184
+ @function func($arg, $args...) {
185
+ }
186
+ CSS
187
+
188
+ it { should_not report_lint }
189
+ end
190
+
191
+ context 'where spaces surround commas' do
192
+ let(:css) { <<-CSS }
193
+ @function func($arg , $args...) {
194
+ }
195
+ CSS
196
+
197
+ it { should_not report_lint }
198
+ end
199
+
200
+ context 'where commas are followed by a newline' do
201
+ let(:css) { <<-CSS }
202
+ @function func($arg,
203
+ $args...) {
204
+ }
205
+ CSS
206
+
207
+ it { should_not report_lint }
208
+ end
209
+ end
210
+ end
211
+
212
+ context 'in a function invocation' do
213
+ context 'where spaces do not follow commas' do
214
+ let(:css) { <<-CSS }
215
+ p {
216
+ margin: func(1,2,3,$args...,$kwarg1: 4,$kwarg2: 5,$kwargs...);
217
+ }
218
+ CSS
219
+
220
+ it { should report_lint count: 6 }
221
+ end
222
+
223
+ context 'where spaces follow commas' do
224
+ let(:css) { <<-CSS }
225
+ p {
226
+ margin: func(1, 2, 3, $args..., $kwarg1: 4, $kwarg2: 5, $kwargs...);
227
+ }
228
+ CSS
229
+
230
+ it { should_not report_lint }
231
+ end
232
+
233
+ context 'where spaces surround commas' do
234
+ let(:css) { <<-CSS }
235
+ p {
236
+ margin: func(1 , 2 , 3 , $args... , $kwarg1: 4 , $kwarg2: 5 , $kwargs...);
237
+ }
238
+ CSS
239
+
240
+ it { should_not report_lint }
241
+ end
242
+
243
+ context 'where commas are followed by a newline' do
244
+ let(:css) { <<-CSS }
245
+ p {
246
+ margin: func(1,
247
+ 2,
248
+ 3,
249
+ $args...,
250
+ $kwarg1: 4,
251
+ $kwarg2: 5,
252
+ $kwargs...);
253
+ }
254
+ CSS
255
+
256
+ it { should_not report_lint }
257
+ end
258
+ end
259
+
260
+ context 'in a comma-separated literal list' do
261
+ context 'where spaces do not follow commas' do
262
+ let(:css) { <<-CSS }
263
+ p {
264
+ property: $a,$b,$c,$d;
265
+ }
266
+ CSS
267
+
268
+ it { should report_lint count: 3 }
269
+ end
270
+
271
+ context 'where spaces follow commas' do
272
+ let(:css) { <<-CSS }
273
+ p {
274
+ property: $a, $b, $c, $d;
275
+ }
276
+ CSS
277
+
278
+ it { should_not report_lint }
279
+ end
280
+
281
+ context 'where spaces surround commas' do
282
+ let(:css) { <<-CSS }
283
+ p {
284
+ property: $a , $b , $c , $d;
285
+ }
286
+ CSS
287
+
288
+ it { should_not report_lint }
289
+ end
290
+
291
+ context 'where commas are followed by a newline' do
292
+ let(:css) { <<-CSS }
293
+ p {
294
+ property: $a,
295
+ $b,
296
+ $c,
297
+ $d;
298
+ }
299
+ CSS
300
+
301
+ it { should_not report_lint }
302
+ end
303
+
304
+ context 'when commas are followed by a space and a newline' do
305
+ let(:css) { <<-CSS }
306
+ p {
307
+ property: $a,\s
308
+ $b;
309
+ }
310
+ CSS
311
+
312
+ it { should_not report_lint }
313
+ end
314
+ end
315
+ end