-
-
Notifications
You must be signed in to change notification settings - Fork 4.5k
/
no-constant-condition.js
322 lines (299 loc) · 17 KB
/
no-constant-condition.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
/**
* @fileoverview Tests for no-constant-condition rule.
* @author Christian Schulz <http://rndm.de>
*/
"use strict";
//------------------------------------------------------------------------------
// Requirements
//------------------------------------------------------------------------------
const rule = require("../../../lib/rules/no-constant-condition"),
{ RuleTester } = require("../../../lib/rule-tester");
//------------------------------------------------------------------------------
// Tests
//------------------------------------------------------------------------------
const ruleTester = new RuleTester({ parserOptions: { ecmaVersion: 6 } });
ruleTester.run("no-constant-condition", rule, {
valid: [
"if(a);",
"if(a == 0);",
"if(a = f());",
"if(1, a);",
"if ('every' in []);",
"if (`\\\n${a}`) {}",
"if (`${a}`);",
"if (`${foo()}`);",
"if (`${a === 'b' && b==='a'}`);",
"if (`foo${a}` === 'fooa');",
"if (tag`a`);",
"if (tag`${a}`);",
"if (+(a || true));",
"if (-(a || true));",
"if (~(a || 1));",
"if (+(a && 0) === +(b && 0));",
"while(~!a);",
"while(a = b);",
"while(`${a}`);",
"for(;x < 10;);",
"for(;;);",
"for(;`${a}`;);",
"do{ }while(x)",
"q > 0 ? 1 : 2;",
"`${a}` === a ? 1 : 2",
"`foo${a}` === a ? 1 : 2",
"tag`a` === a ? 1 : 2",
"tag`${a}` === a ? 1 : 2",
"while(x += 3) {}",
"while(tag`a`) {}",
"while(tag`${a}`) {}",
"while(`\\\n${a}`) {}",
// #5228, typeof conditions
"if(typeof x === 'undefined'){}",
"if(`${typeof x}` === 'undefined'){}",
"if(a === 'str' && typeof b){}",
"typeof a == typeof b",
"typeof 'a' === 'string'|| typeof b === 'string'",
"`${typeof 'a'}` === 'string'|| `${typeof b}` === 'string'",
// #5726, void conditions
"if (void a || a);",
"if (a || void a);",
// #5693
"if(xyz === 'str1' && abc==='str2'){}",
"if(xyz === 'str1' || abc==='str2'){}",
"if(xyz === 'str1' || abc==='str2' && pqr === 5){}",
"if(typeof abc === 'string' && abc==='str2'){}",
"if(false || abc==='str'){}",
"if(true && abc==='str'){}",
"if(typeof 'str' && abc==='str'){}",
"if(abc==='str' || false || def ==='str'){}",
"if(true && abc==='str' || def ==='str'){}",
"if(true && typeof abc==='string'){}",
// #11181, string literals
"if('str1' && a){}",
"if(a && 'str'){}",
// #11306
"if ((foo || true) === 'baz') {}",
"if ((foo || 'bar') === 'baz') {}",
"if ((foo || 'bar') !== 'baz') {}",
"if ((foo || 'bar') == 'baz') {}",
"if ((foo || 'bar') != 'baz') {}",
"if ((foo || 233) > 666) {}",
"if ((foo || 233) < 666) {}",
"if ((foo || 233) >= 666) {}",
"if ((foo || 233) <= 666) {}",
"if ((key || 'k') in obj) {}",
"if ((foo || {}) instanceof obj) {}",
"if ((foo || 'bar' || 'bar') === 'bar');",
{
code: "if ((foo || 1n) === 'baz') {}",
parserOptions: { ecmaVersion: 11 }
},
{
code: "if (a && 0n || b);",
parserOptions: { ecmaVersion: 11 }
},
{
code: "if(1n && a){};",
parserOptions: { ecmaVersion: 11 }
},
// #12225
"if ('' + [y] === '' + [ty]) {}",
"if ('a' === '' + [ty]) {}",
"if ('' + [y, m, d] === 'a') {}",
"if ('' + [y, 'm'] === '' + [ty, 'tm']) {}",
"if ('' + [y, 'm'] === '' + ['ty']) {}",
"if ([,] in\n\n($2))\n ;\nelse\n ;",
"if ([...x]+'' === 'y'){}",
// { checkLoops: false }
{ code: "while(true);", options: [{ checkLoops: false }] },
{ code: "for(;true;);", options: [{ checkLoops: false }] },
{ code: "do{}while(true)", options: [{ checkLoops: false }] },
"function* foo(){while(true){yield 'foo';}}",
"function* foo(){for(;true;){yield 'foo';}}",
"function* foo(){do{yield 'foo';}while(true)}",
"function* foo(){while (true) { while(true) {yield;}}}",
"function* foo() {for (; yield; ) {}}",
"function* foo() {for (; ; yield) {}}",
"function* foo() {while (true) {function* foo() {yield;}yield;}}",
"function* foo() { for (let x = yield; x < 10; x++) {yield;}yield;}",
"function* foo() { for (let x = yield; ; x++) { yield; }}"
],
invalid: [
{ code: "for(;true;);", errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "for(;``;);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "for(;`foo`;);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "for(;`foo${bar}`;);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "do{}while(true)", errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "do{}while('1')", errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "do{}while(0)", errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "do{}while(t = -2)", errors: [{ messageId: "unexpected", type: "AssignmentExpression" }] },
{ code: "do{}while(``)", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "do{}while(`foo`)", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "do{}while(`foo${bar}`)", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "true ? 1 : 2;", errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "1 ? 1 : 2;", errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "q = 0 ? 1 : 2;", errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "(q = 0) ? 1 : 2;", errors: [{ messageId: "unexpected", type: "AssignmentExpression" }] },
{ code: "`` ? 1 : 2;", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "`foo` ? 1 : 2;", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "`foo${bar}` ? 1 : 2;", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "if(-2);", errors: [{ messageId: "unexpected", type: "UnaryExpression" }] },
{ code: "if(true);", errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "if(1);", errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "if({});", errors: [{ messageId: "unexpected", type: "ObjectExpression" }] },
{ code: "if(0 < 1);", errors: [{ messageId: "unexpected", type: "BinaryExpression" }] },
{ code: "if(0 || 1);", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
{ code: "if(a, 1);", errors: [{ messageId: "unexpected", type: "SequenceExpression" }] },
{ code: "if(`foo`);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "if(``);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "if(`\\\n`);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "if(`${'bar'}`);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "if(`${'bar' + `foo`}`);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "if(`foo${false || true}`);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "if(`foo${0 || 1}`);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "if(`foo${bar}`);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "if(`${bar}foo`);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "if(!(true || a));", errors: [{ messageId: "unexpected", type: "UnaryExpression" }] },
{ code: "if(!(a && void b && c));", errors: [{ messageId: "unexpected", type: "UnaryExpression" }] },
{ code: "if(0 || !(a && null));", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
{ code: "if(1 + !(a || true));", errors: [{ messageId: "unexpected", type: "BinaryExpression" }] },
{ code: "if(!(null && a) > 1);", errors: [{ messageId: "unexpected", type: "BinaryExpression" }] },
{ code: "if(+(!(a && 0)));", errors: [{ messageId: "unexpected", type: "UnaryExpression" }] },
{ code: "if(!typeof a === 'string');", errors: [{ messageId: "unexpected", type: "BinaryExpression" }] },
{ code: "if(-('foo' || a));", errors: [{ messageId: "unexpected", type: "UnaryExpression" }] },
{ code: "if(+(void a && b) === ~(1 || c));", errors: [{ messageId: "unexpected", type: "BinaryExpression" }] },
{ code: "while([]);", errors: [{ messageId: "unexpected", type: "ArrayExpression" }] },
{ code: "while(~!0);", errors: [{ messageId: "unexpected", type: "UnaryExpression" }] },
{ code: "while(x = 1);", errors: [{ messageId: "unexpected", type: "AssignmentExpression" }] },
{ code: "while(function(){});", errors: [{ messageId: "unexpected", type: "FunctionExpression" }] },
{ code: "while(true);", errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "while(1);", errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "while(() => {});", errors: [{ messageId: "unexpected", type: "ArrowFunctionExpression" }] },
{ code: "while(`foo`);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "while(``);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "while(`${'foo'}`);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "while(`${'foo' + 'bar'}`);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
// #5228 , typeof conditions
{ code: "if(typeof x){}", errors: [{ messageId: "unexpected", type: "UnaryExpression" }] },
{ code: "if(`${typeof x}`){}", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "if(`${''}${typeof x}`){}", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] },
{ code: "if(typeof 'abc' === 'string'){}", errors: [{ messageId: "unexpected", type: "BinaryExpression" }] },
{ code: "if(a = typeof b){}", errors: [{ messageId: "unexpected", type: "AssignmentExpression" }] },
{ code: "if(a, typeof b){}", errors: [{ messageId: "unexpected", type: "SequenceExpression" }] },
{ code: "if(typeof 'a' == 'string' || typeof 'b' == 'string'){}", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
{ code: "while(typeof x){}", errors: [{ messageId: "unexpected", type: "UnaryExpression" }] },
// #5726, void conditions
{ code: "if(1 || void x);", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
{ code: "if(void x);", errors: [{ messageId: "unexpected", type: "UnaryExpression" }] },
{ code: "if(y = void x);", errors: [{ messageId: "unexpected", type: "AssignmentExpression" }] },
{ code: "if(x, void x);", errors: [{ messageId: "unexpected", type: "SequenceExpression" }] },
{ code: "if(void x === void y);", errors: [{ messageId: "unexpected", type: "BinaryExpression" }] },
{ code: "if(void x && a);", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
{ code: "if(a && void x);", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
// #5693
{ code: "if(false && abc==='str'){}", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
{ code: "if(true || abc==='str'){}", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
{ code: "if(1 || abc==='str'){}", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
{ code: "if(abc==='str' || true){}", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
{ code: "if(abc==='str' || true || def ==='str'){}", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
{ code: "if(false || true){}", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
{ code: "if(typeof abc==='str' || true){}", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
// #11181, string literals
{ code: "if('str' || a){}", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
{ code: "if('str' || abc==='str'){}", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
{ code: "if('str1' || 'str2'){}", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
{ code: "if('str1' && 'str2'){}", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
{ code: "if(abc==='str' || 'str'){}", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
{ code: "if(a || 'str'){}", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] },
{
code: "function* foo(){while(true){} yield 'foo';}",
errors: [{ messageId: "unexpected", type: "Literal" }]
},
{
code: "function* foo(){while(true){if (true) {yield 'foo';}}}",
errors: [{ messageId: "unexpected", type: "Literal" }]
},
{
code: "function* foo(){while(true){yield 'foo';} while(true) {}}",
errors: [{ messageId: "unexpected", type: "Literal" }]
},
{
code: "var a = function* foo(){while(true){} yield 'foo';}",
errors: [{ messageId: "unexpected", type: "Literal" }]
},
{
code: "while (true) { function* foo() {yield;}}",
errors: [{ messageId: "unexpected", type: "Literal" }]
},
{
code: "function* foo(){if (true) {yield 'foo';}}",
errors: [{ messageId: "unexpected", type: "Literal" }]
},
{
code: "function* foo() {for (let foo = yield; true;) {}}",
errors: [{ messageId: "unexpected", type: "Literal" }]
},
{
code: "function* foo() {for (foo = yield; true;) {}}",
errors: [{ messageId: "unexpected", type: "Literal" }]
},
{
code: "function foo() {while (true) {function* bar() {while (true) {yield;}}}}",
errors: [{ messageId: "unexpected", type: "Literal" }]
},
{
code: "function foo() {while (true) {const bar = function*() {while (true) {yield;}}}}",
errors: [{ messageId: "unexpected", type: "Literal" }]
},
{
code: "function* foo() { for (let foo = 1 + 2 + 3 + (yield); true; baz) {}}",
errors: [{ messageId: "unexpected", type: "Literal" }]
},
// #12225
{
code: "if([a]) {}",
errors: [{ messageId: "unexpected", type: "ArrayExpression" }]
},
{
code: "if([]) {}",
errors: [{ messageId: "unexpected", type: "ArrayExpression" }]
},
{
code: "if(''+['a']) {}",
errors: [{ messageId: "unexpected", type: "BinaryExpression" }]
},
{
code: "if(''+[]) {}",
errors: [{ messageId: "unexpected", type: "BinaryExpression" }]
},
{
code: "if([a]==[a]) {}",
errors: [{ messageId: "unexpected", type: "BinaryExpression" }]
},
{
code: "if([a] - '') {}",
errors: [{ messageId: "unexpected", type: "BinaryExpression" }]
},
{
code: "if(+[a]) {}",
errors: [{ messageId: "unexpected", type: "UnaryExpression" }]
},
{
code: "if(+1) {}",
errors: [{ messageId: "unexpected", type: "UnaryExpression" }]
},
{
code: "if ([,] + ''){}",
errors: [{ messageId: "unexpected", type: "BinaryExpression" }]
},
// #13238
{ code: "if(/foo/ui);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "if(0n);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "if(0b0n);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "if(0o0n);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "if(0x0n);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "if(0b1n);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "if(0o1n);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "if(0x1n);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "Literal" }] },
{ code: "if(0x1n || foo);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "LogicalExpression" }] }
]
});