2 * @fileoverview Tests for space-before-block rule.
3 * @author Mathias Schreck <https://github.com/lo1tuma>
8 //------------------------------------------------------------------------------
10 //------------------------------------------------------------------------------
12 const rule
= require("../../../lib/rules/space-before-blocks"),
13 { RuleTester
} = require("../../../lib/rule-tester"),
14 fixtureParser
= require("../../fixtures/fixture-parser");
16 //------------------------------------------------------------------------------
18 //------------------------------------------------------------------------------
20 const ruleTester
= new RuleTester(),
21 alwaysArgs
= ["always"],
22 neverArgs
= ["never"],
23 functionsOnlyArgs
= [{ functions
: "always", keywords
: "never", classes
: "never" }],
24 keywordOnlyArgs
= [{ functions
: "never", keywords
: "always", classes
: "never" }],
25 classesOnlyArgs
= [{ functions
: "never", keywords
: "never", classes
: "always" }],
26 functionsAlwaysOthersOffArgs
= [{ functions
: "always", keywords
: "off", classes
: "off" }],
27 keywordAlwaysOthersOffArgs
= [{ functions
: "off", keywords
: "always", classes
: "off" }],
28 classesAlwaysOthersOffArgs
= [{ functions
: "off", keywords
: "off", classes
: "always" }],
29 functionsNeverOthersOffArgs
= [{ functions
: "never", keywords
: "off", classes
: "off" }],
30 keywordNeverOthersOffArgs
= [{ functions
: "off", keywords
: "never", classes
: "off" }],
31 classesNeverOthersOffArgs
= [{ functions
: "off", keywords
: "off", classes
: "never" }],
32 expectedSpacingError
= { messageId
: "missingSpace" },
33 expectedNoSpacingError
= { messageId
: "unexpectedSpace" };
35 ruleTester
.run("space-before-blocks", rule
, {
39 { code
: "if(a){}", options
: neverArgs
},
40 { code
: "if(a){}", options
: functionsOnlyArgs
},
41 { code
: "if(a) {}", options
: keywordOnlyArgs
},
42 { code
: "if(a){ function b() {} }", options
: functionsOnlyArgs
},
43 { code
: "if(a) { function b(){} }", options
: keywordOnlyArgs
},
45 { code
: "if(a)\n{}", options
: neverArgs
},
47 { code
: "if(a){}else{}", options
: neverArgs
},
48 { code
: "if(a){}else{}", options
: functionsOnlyArgs
},
49 { code
: "if(a) {} else {}", options
: keywordOnlyArgs
},
50 { code
: "if(a){ function b() {} }else{}", options
: functionsOnlyArgs
},
51 { code
: "if(a) { function b(){} } else {}", options
: keywordOnlyArgs
},
53 { code
: "function a(){}", options
: neverArgs
},
55 code
: "export default class{}",
56 options
: functionsOnlyArgs
,
57 parserOptions
: { ecmaVersion
: 6, sourceType
: "module" }
60 code
: "export default class {}",
61 options
: classesOnlyArgs
,
62 parserOptions
: { ecmaVersion
: 6, sourceType
: "module" }
65 code
: "export default function a() {}",
66 options
: functionsOnlyArgs
,
67 parserOptions
: { ecmaVersion
: 6, sourceType
: "module" }
70 code
: "export default function a(){}",
71 options
: keywordOnlyArgs
,
72 parserOptions
: { ecmaVersion
: 6, sourceType
: "module" }
74 { code
: "export function a(){}", options
: keywordOnlyArgs
, parserOptions
: { ecmaVersion
: 6, sourceType
: "module" } },
75 { code
: "export function a() {}", options
: functionsOnlyArgs
, parserOptions
: { ecmaVersion
: 6, sourceType
: "module" } },
76 { code
: "function a(){}", options
: keywordOnlyArgs
},
77 { code
: "function a() {}", options
: functionsOnlyArgs
},
78 { code
: "function a(){ if(b) {} }", options
: keywordOnlyArgs
},
79 { code
: "function a() { if(b){} }", options
: functionsOnlyArgs
},
80 "switch(a.b(c < d)) { case 'foo': foo(); break; default: if (a) { bar(); } }",
83 { code
: "switch(a.b(c < d)){ case 'foo': foo(); break; default: if (a){ bar(); } }", options
: neverArgs
},
84 { code
: "switch(a.b(c < d)){ case 'foo': foo(); break; default: if (a){ bar(); } }", options
: functionsOnlyArgs
},
85 { code
: "switch(a){}", options
: neverArgs
},
86 { code
: "switch(a){}", options
: functionsOnlyArgs
},
87 { code
: "switch(a) {}", options
: keywordOnlyArgs
},
89 { code
: "try{}catch(a){}", options
: neverArgs
},
90 { code
: "try{}catch(a){}", options
: functionsOnlyArgs
},
91 { code
: "try {} catch(a) {}", options
: keywordOnlyArgs
},
92 { code
: "try{ function b() {} }catch(a){}", options
: functionsOnlyArgs
},
93 { code
: "try { function b(){} } catch(a) {}", options
: keywordOnlyArgs
},
95 { code
: "for(;;){}", options
: neverArgs
},
96 { code
: "for(;;){}", options
: functionsOnlyArgs
},
97 { code
: "for(;;) {}", options
: keywordOnlyArgs
},
98 { code
: "for(;;){ function a() {} }", options
: functionsOnlyArgs
},
99 { code
: "for(;;) { function a(){} }", options
: keywordOnlyArgs
},
101 { code
: "while(a){}", options
: neverArgs
},
102 { code
: "while(a){}", options
: functionsOnlyArgs
},
103 { code
: "while(a) {}", options
: keywordOnlyArgs
},
104 { code
: "while(a){ function b() {} }", options
: functionsOnlyArgs
},
105 { code
: "while(a) { function b(){} }", options
: keywordOnlyArgs
},
107 code
: "class test { constructor() {} }",
108 options
: [{ functions
: "always", keywords
: "never" }],
109 parserOptions
: { ecmaVersion
: 6 }
112 code
: "class test { constructor(){} }",
113 options
: classesOnlyArgs
,
114 parserOptions
: { ecmaVersion
: 6 }
117 code
: "class test{ constructor() {} }",
118 options
: functionsOnlyArgs
,
119 parserOptions
: { ecmaVersion
: 6 }
122 code
: "class test {}",
123 options
: classesOnlyArgs
,
124 parserOptions
: { ecmaVersion
: 6 }
127 code
: "class test{}",
128 options
: functionsOnlyArgs
,
129 parserOptions
: { ecmaVersion
: 6 }
132 code
: "class test{}",
134 parserOptions
: { ecmaVersion
: 6 }
137 code
: "class test {}",
138 parserOptions
: { ecmaVersion
: 6 }
140 { code
: "function a(){if(b) {}}", options
: keywordAlwaysOthersOffArgs
},
141 { code
: "function a() {if(b) {}}", options
: keywordAlwaysOthersOffArgs
},
142 { code
: "function a() {if(b){}}", options
: functionsAlwaysOthersOffArgs
},
143 { code
: "function a() {if(b) {}}", options
: functionsAlwaysOthersOffArgs
},
145 code
: "class test { constructor(){if(a){}} }",
146 options
: classesAlwaysOthersOffArgs
,
147 parserOptions
: { ecmaVersion
: 6 }
150 code
: "class test { constructor() {if(a){}} }",
151 options
: classesAlwaysOthersOffArgs
,
152 parserOptions
: { ecmaVersion
: 6 }
155 code
: "class test { constructor(){if(a) {}} }",
156 options
: classesAlwaysOthersOffArgs
,
157 parserOptions
: { ecmaVersion
: 6 }
160 code
: "class test { constructor() {if(a) {}} }",
161 options
: classesAlwaysOthersOffArgs
,
162 parserOptions
: { ecmaVersion
: 6 }
164 { code
: "function a(){if(b){}}", options
: keywordNeverOthersOffArgs
},
165 { code
: "function a() {if(b){}}", options
: keywordNeverOthersOffArgs
},
166 { code
: "function a(){if(b){}}", options
: functionsNeverOthersOffArgs
},
167 { code
: "function a(){if(b) {}}", options
: functionsNeverOthersOffArgs
},
169 code
: "class test{ constructor(){if(a){}} }",
170 options
: classesNeverOthersOffArgs
,
171 parserOptions
: { ecmaVersion
: 6 }
174 code
: "class test{ constructor() {if(a){}} }",
175 options
: classesNeverOthersOffArgs
,
176 parserOptions
: { ecmaVersion
: 6 }
179 code
: "class test{ constructor(){if(a) {}} }",
180 options
: classesNeverOthersOffArgs
,
181 parserOptions
: { ecmaVersion
: 6 }
184 code
: "class test{ constructor() {if(a) {}} }",
185 options
: classesNeverOthersOffArgs
,
186 parserOptions
: { ecmaVersion
: 6 }
189 // https://github.com/eslint/eslint/issues/3769
190 { code
: "()=>{};", options
: ["always"], parserOptions
: { ecmaVersion
: 6 } },
191 { code
: "() => {};", options
: ["never"], parserOptions
: { ecmaVersion
: 6 } },
193 // https://github.com/eslint/eslint/issues/1338
195 { code
: "if(a){}else {}", options
: neverArgs
},
196 { code
: "try {}catch(a){}", options
: functionsOnlyArgs
},
197 { code
: "export default class{}", options
: classesOnlyArgs
, parserOptions
: { ecmaVersion
: 6, sourceType
: "module" } },
199 // https://github.com/eslint/eslint/issues/15082
200 { code
: "switch(x) { case 9:{ break; } }", options
: alwaysArgs
},
201 { code
: "switch(x){ case 9: { break; } }", options
: neverArgs
},
202 { code
: "switch(x) { case (9):{ break; } }", options
: alwaysArgs
},
203 { code
: "switch(x){ case (9): { break; } }", options
: neverArgs
},
204 { code
: "switch(x) { default:{ break; } }", options
: alwaysArgs
},
205 { code
: "switch(x){ default: { break; } }", options
: neverArgs
},
207 // not conflict with `keyword-spacing`
209 code
: "(class{ static{} })",
211 parserOptions
: { ecmaVersion
: 2022 }
214 code
: "(class { static {} })",
216 parserOptions
: { ecmaVersion
: 2022 }
223 errors
: [{ messageId
: "missingSpace", line
: 1, column
: 6 }]
228 options
: keywordOnlyArgs
,
229 errors
: [expectedSpacingError
]
234 options
: functionsOnlyArgs
,
235 errors
: [expectedNoSpacingError
]
238 code
: "if(a) { function a() {} }",
239 output
: "if(a){ function a() {} }",
240 options
: functionsOnlyArgs
,
241 errors
: [{ messageId
: "unexpectedSpace", line
: 1, column
: 7 }]
244 code
: "if(a) { function a() {} }",
245 output
: "if(a) { function a(){} }",
246 options
: keywordOnlyArgs
,
247 errors
: [{ messageId
: "unexpectedSpace", line
: 1, column
: 22 }]
253 errors
: [expectedNoSpacingError
]
256 code
: "function a(){}",
257 output
: "function a() {}",
258 errors
: [expectedSpacingError
]
261 code
: "function a() {}",
262 output
: "function a(){}",
264 errors
: [expectedNoSpacingError
]
267 code
: "function a() {}",
268 output
: "function a(){}",
270 errors
: [expectedNoSpacingError
]
273 code
: "function a(){ if (a){} }",
274 output
: "function a() { if (a){} }",
275 options
: functionsOnlyArgs
,
276 errors
: [{ messageId
: "missingSpace", line
: 1, column
: 13 }]
279 code
: "function a() { if (a) {} }",
280 output
: "function a(){ if (a) {} }",
281 options
: keywordOnlyArgs
,
282 errors
: [{ messageId
: "unexpectedSpace", line
: 1, column
: 14 }]
285 code
: "function a(){}",
286 output
: "function a() {}",
287 options
: functionsOnlyArgs
,
288 errors
: [expectedSpacingError
]
291 code
: "function a() {}",
292 output
: "function a(){}",
293 options
: keywordOnlyArgs
,
294 errors
: [expectedNoSpacingError
]
298 output
: "switch(a) {}",
299 errors
: [expectedSpacingError
]
302 code
: "switch(a) {}",
303 output
: "switch(a){}",
305 errors
: [expectedNoSpacingError
]
309 output
: "switch(a) {}",
310 options
: keywordOnlyArgs
,
311 errors
: [expectedSpacingError
]
314 code
: "switch(a) {}",
315 output
: "switch(a){}",
316 options
: functionsOnlyArgs
,
317 errors
: [expectedNoSpacingError
]
320 code
: "switch(a.b()){ case 'foo': foo(); break; default: if (a) { bar(); } }",
321 output
: "switch(a.b()) { case 'foo': foo(); break; default: if (a) { bar(); } }",
322 errors
: [expectedSpacingError
]
325 code
: "switch(a.b()) { case 'foo': foo(); break; default: if (a){ bar(); } }",
326 output
: "switch(a.b()){ case 'foo': foo(); break; default: if (a){ bar(); } }",
328 errors
: [expectedNoSpacingError
]
331 code
: "try{}catch(a){}",
332 output
: "try{}catch(a) {}",
333 errors
: [expectedSpacingError
]
336 code
: "try {}catch(a) {}",
337 output
: "try {}catch(a){}",
339 errors
: [expectedNoSpacingError
]
342 code
: "try {} catch(a){}",
343 output
: "try {} catch(a) {}",
344 options
: keywordOnlyArgs
,
345 errors
: [expectedSpacingError
]
348 code
: "try { function b() {} } catch(a) {}",
349 output
: "try { function b(){} } catch(a) {}",
350 options
: keywordOnlyArgs
,
351 errors
: [{ messageId
: "unexpectedSpace", line
: 1, column
: 20 }]
354 code
: "try{ function b(){} }catch(a){}",
355 output
: "try{ function b() {} }catch(a){}",
356 options
: functionsOnlyArgs
,
357 errors
: [{ messageId
: "missingSpace", line
: 1, column
: 18 }]
361 output
: "for(;;) {}",
362 errors
: [expectedSpacingError
]
368 errors
: [expectedNoSpacingError
]
372 output
: "for(;;) {}",
373 options
: keywordOnlyArgs
,
374 errors
: [expectedSpacingError
]
379 options
: functionsOnlyArgs
,
380 errors
: [expectedNoSpacingError
]
383 code
: "for(;;){ function a(){} }",
384 output
: "for(;;){ function a() {} }",
385 options
: functionsOnlyArgs
,
386 errors
: [expectedSpacingError
]
389 code
: "for(;;) { function a() {} }",
390 output
: "for(;;) { function a(){} }",
391 options
: keywordOnlyArgs
,
392 errors
: [expectedNoSpacingError
]
396 output
: "while(a) {}",
397 errors
: [expectedSpacingError
]
401 output
: "while(a){}",
403 errors
: [expectedNoSpacingError
]
407 output
: "while(a) {}",
408 options
: keywordOnlyArgs
,
409 errors
: [expectedSpacingError
]
413 output
: "while(a){}",
414 options
: functionsOnlyArgs
,
415 errors
: [expectedNoSpacingError
]
418 code
: "while(a){ function a(){} }",
419 output
: "while(a){ function a() {} }",
420 options
: functionsOnlyArgs
,
421 errors
: [expectedSpacingError
]
424 code
: "while(a) { function a() {} }",
425 output
: "while(a) { function a(){} }",
426 options
: keywordOnlyArgs
,
427 errors
: [expectedNoSpacingError
]
430 code
: "export function a() { if(b) {} }",
431 output
: "export function a() { if(b){} }",
432 options
: functionsOnlyArgs
,
433 parserOptions
: { ecmaVersion
: 6, sourceType
: "module" },
434 errors
: [expectedNoSpacingError
]
437 code
: "export function a(){ if(b){} }",
438 output
: "export function a(){ if(b) {} }",
439 options
: keywordOnlyArgs
,
440 parserOptions
: { ecmaVersion
: 6, sourceType
: "module" },
441 errors
: [expectedSpacingError
]
444 code
: "export function a(){}",
445 output
: "export function a() {}",
446 options
: functionsOnlyArgs
,
447 parserOptions
: { ecmaVersion
: 6, sourceType
: "module" },
448 errors
: [expectedSpacingError
]
451 code
: "export default function (a) {}",
452 output
: "export default function (a){}",
453 options
: keywordOnlyArgs
,
454 parserOptions
: { ecmaVersion
: 6, sourceType
: "module" },
455 errors
: [expectedNoSpacingError
]
458 code
: "export function a() {}",
459 output
: "export function a(){}",
460 options
: keywordOnlyArgs
,
461 parserOptions
: { ecmaVersion
: 6, sourceType
: "module" },
462 errors
: [expectedNoSpacingError
]
465 code
: "class test{}",
466 output
: "class test {}",
467 parserOptions
: { ecmaVersion
: 6 },
468 errors
: [expectedSpacingError
]
471 code
: "class test{}",
472 output
: "class test {}",
473 options
: classesOnlyArgs
,
474 parserOptions
: { ecmaVersion
: 6 },
475 errors
: [expectedSpacingError
]
478 code
: "class test{ constructor(){} }",
479 output
: "class test{ constructor() {} }",
480 options
: functionsOnlyArgs
,
481 parserOptions
: { ecmaVersion
: 6 },
482 errors
: [expectedSpacingError
]
485 code
: "class test { constructor() {} }",
486 output
: "class test { constructor(){} }",
487 options
: classesOnlyArgs
,
488 parserOptions
: { ecmaVersion
: 6 },
489 errors
: [expectedNoSpacingError
]
492 code
: "class test {}",
493 output
: "class test{}",
494 options
: functionsOnlyArgs
,
495 parserOptions
: { ecmaVersion
: 6 },
496 errors
: [expectedNoSpacingError
]
499 code
: "class test {}",
500 output
: "class test{}",
502 parserOptions
: { ecmaVersion
: 6 },
503 errors
: [expectedNoSpacingError
]
506 code
: "if(a){ function a(){} }",
507 output
: "if(a){ function a() {} }",
508 options
: functionsAlwaysOthersOffArgs
,
509 errors
: [expectedSpacingError
]
512 code
: "if(a) { function a(){} }",
513 output
: "if(a) { function a() {} }",
514 options
: functionsAlwaysOthersOffArgs
,
515 errors
: [expectedSpacingError
]
518 code
: "if(a){ function a(){} }",
519 output
: "if(a) { function a(){} }",
520 options
: keywordAlwaysOthersOffArgs
,
521 errors
: [expectedSpacingError
]
524 code
: "if(a){ function a() {} }",
525 output
: "if(a) { function a() {} }",
526 options
: keywordAlwaysOthersOffArgs
,
527 errors
: [expectedSpacingError
]
530 code
: "class test{ constructor(){} }",
531 output
: "class test { constructor(){} }",
532 options
: classesAlwaysOthersOffArgs
,
533 parserOptions
: { ecmaVersion
: 6 },
534 errors
: [expectedSpacingError
]
537 code
: "class test{ constructor() {} }",
538 output
: "class test { constructor() {} }",
539 options
: classesAlwaysOthersOffArgs
,
540 parserOptions
: { ecmaVersion
: 6 },
541 errors
: [expectedSpacingError
]
544 code
: "if(a){ function a() {} }",
545 output
: "if(a){ function a(){} }",
546 options
: functionsNeverOthersOffArgs
,
547 errors
: [expectedNoSpacingError
]
550 code
: "if(a) { function a() {} }",
551 output
: "if(a) { function a(){} }",
552 options
: functionsNeverOthersOffArgs
,
553 errors
: [expectedNoSpacingError
]
556 code
: "if(a) { function a(){} }",
557 output
: "if(a){ function a(){} }",
558 options
: keywordNeverOthersOffArgs
,
559 errors
: [expectedNoSpacingError
]
562 code
: "if(a) { function a() {} }",
563 output
: "if(a){ function a() {} }",
564 options
: keywordNeverOthersOffArgs
,
565 errors
: [expectedNoSpacingError
]
568 code
: "class test { constructor(){} }",
569 output
: "class test{ constructor(){} }",
570 options
: classesNeverOthersOffArgs
,
571 parserOptions
: { ecmaVersion
: 6 },
572 errors
: [expectedNoSpacingError
]
575 code
: "class test { constructor() {} }",
576 output
: "class test{ constructor() {} }",
577 options
: classesNeverOthersOffArgs
,
578 parserOptions
: { ecmaVersion
: 6 },
579 errors
: [expectedNoSpacingError
]
582 // https://github.com/eslint/eslint/issues/13553
584 code
: "class A { foo(bar: string): void{} }",
585 output
: "class A { foo(bar: string): void {} }",
586 parser
: fixtureParser("space-before-blocks", "return-type-keyword-1"),
587 errors
: [expectedSpacingError
]
590 code
: "function foo(): null {}",
591 output
: "function foo(): null{}",
593 parser
: fixtureParser("space-before-blocks", "return-type-keyword-2"),
594 errors
: [expectedNoSpacingError
]
597 // https://github.com/eslint/eslint/issues/15082 regression tests (only blocks after switch case colons should be excluded)
602 errors
: [expectedSpacingError
]
608 errors
: [expectedNoSpacingError
]
611 code
: "switch(x) { case 9: label:{ break; } }",
612 output
: "switch(x) { case 9: label: { break; } }",
614 errors
: [expectedSpacingError
]
617 code
: "switch(x){ case 9: label: { break; } }",
618 output
: "switch(x){ case 9: label:{ break; } }",
620 errors
: [expectedNoSpacingError
]
623 code
: "switch(x) { case 9: if(y){ break; } }",
624 output
: "switch(x) { case 9: if(y) { break; } }",
626 errors
: [expectedSpacingError
]
629 code
: "switch(x){ case 9: if(y) { break; } }",
630 output
: "switch(x){ case 9: if(y){ break; } }",
632 errors
: [expectedNoSpacingError
]
635 code
: "switch(x) { case 9: y;{ break; } }",
636 output
: "switch(x) { case 9: y; { break; } }",
638 errors
: [expectedSpacingError
]
641 code
: "switch(x){ case 9: y; { break; } }",
642 output
: "switch(x){ case 9: y;{ break; } }",
644 errors
: [expectedNoSpacingError
]
647 code
: "switch(x) { case 9: switch(y){} }",
648 output
: "switch(x) { case 9: switch(y) {} }",
650 errors
: [expectedSpacingError
]
653 code
: "switch(x){ case 9: switch(y) {} }",
654 output
: "switch(x){ case 9: switch(y){} }",
656 errors
: [expectedNoSpacingError
]