2 * @fileoverview Tests for no-implicit-coercion rule.
3 * @author Toru Nagashima
8 //------------------------------------------------------------------------------
10 //------------------------------------------------------------------------------
12 const rule
= require("../../../lib/rules/no-implicit-coercion");
13 const { RuleTester
} = require("../../../lib/rule-tester");
15 //------------------------------------------------------------------------------
17 //------------------------------------------------------------------------------
19 const ruleTester
= new RuleTester();
21 ruleTester
.run("no-implicit-coercion", rule
, {
24 "foo.indexOf(1) !== -1",
40 "1 * parseFloat(foo)",
43 "parseFloat(foo) * 1",
44 "1 * 1234 * 678 * Number(foo)",
45 "1 * 1234 * 678 * parseInt(foo)",
46 "1234 * 1 * 678 * Number(foo)",
47 "1234 * 1 * Number(foo) * Number(bar)",
48 "1234 * 1 * Number(foo) * parseInt(bar)",
49 "1234 * 1 * Number(foo) * parseFloat(bar)",
50 "1234 * 1 * parseInt(foo) * parseFloat(bar)",
51 "1234 * 1 * parseInt(foo) * Number(bar)",
52 "1234 * 1 * parseFloat(foo) * Number(bar)",
53 "1234 * Number(foo) * 1 * Number(bar)",
54 "1234 * parseInt(foo) * 1 * Number(bar)",
55 "1234 * parseFloat(foo) * 1 * parseInt(bar)",
56 "1234 * parseFloat(foo) * 1 * Number(bar)",
61 "1234*1*foo*Number(bar)",
62 "1234*1*Number(foo)*bar",
63 "1234*1*parseInt(foo)*bar",
67 { code
: "foo + `${bar}`", parserOptions
: { ecmaVersion
: 6 } },
69 { code
: "!!foo", options
: [{ boolean: false }] },
70 { code
: "~foo.indexOf(1)", options
: [{ boolean: false }] },
71 { code
: "+foo", options
: [{ number
: false }] },
72 { code
: "1*foo", options
: [{ number
: false }] },
73 { code
: "\"\"+foo", options
: [{ string
: false }] },
74 { code
: "foo += \"\"", options
: [{ string
: false }] },
75 { code
: "var a = !!foo", options
: [{ boolean: true, allow
: ["!!"] }] },
76 { code
: "var a = ~foo.indexOf(1)", options
: [{ boolean: true, allow
: ["~"] }] },
77 { code
: "var a = ~foo", options
: [{ boolean: true }] },
78 { code
: "var a = 1 * foo", options
: [{ boolean: true, allow
: ["*"] }] },
79 { code
: "var a = +foo", options
: [{ boolean: true, allow
: ["+"] }] },
80 { code
: "var a = \"\" + foo", options
: [{ boolean: true, string
: true, allow
: ["+"] }] },
82 // https://github.com/eslint/eslint/issues/7057
84 { code
: "`` + 'foo'", parserOptions
: { ecmaVersion
: 6 } },
85 { code
: "'' + `${foo}`", parserOptions
: { ecmaVersion
: 6 } },
87 { code
: "'foo' + ``", parserOptions
: { ecmaVersion
: 6 } },
88 { code
: "`${foo}` + ''", parserOptions
: { ecmaVersion
: 6 } },
90 { code
: "foo += `${bar}`", parserOptions
: { ecmaVersion
: 6 } },
91 { code
: "`a${foo}`", options
: [{ disallowTemplateShorthand
: true }], parserOptions
: { ecmaVersion
: 6 } },
92 { code
: "`${foo}b`", options
: [{ disallowTemplateShorthand
: true }], parserOptions
: { ecmaVersion
: 6 } },
93 { code
: "`${foo}${bar}`", options
: [{ disallowTemplateShorthand
: true }], parserOptions
: { ecmaVersion
: 6 } },
94 { code
: "tag`${foo}`", options
: [{ disallowTemplateShorthand
: true }], parserOptions
: { ecmaVersion
: 6 } },
95 { code
: "`${foo}`", parserOptions
: { ecmaVersion
: 6 } },
96 { code
: "`${foo}`", options
: [{ }], parserOptions
: { ecmaVersion
: 6 } },
97 { code
: "`${foo}`", options
: [{ disallowTemplateShorthand
: false }], parserOptions
: { ecmaVersion
: 6 } },
100 // https://github.com/eslint/eslint/issues/14623
103 { code
: "`` + String(foo)", parserOptions
: { ecmaVersion
: 6 } },
104 { code
: "String(foo) + ``", parserOptions
: { ecmaVersion
: 6 } },
105 { code
: "`${'foo'}`", options
: [{ disallowTemplateShorthand
: true }], parserOptions
: { ecmaVersion
: 6 } },
106 { code
: "`${`foo`}`", options
: [{ disallowTemplateShorthand
: true }], parserOptions
: { ecmaVersion
: 6 } },
107 { code
: "`${String(foo)}`", options
: [{ disallowTemplateShorthand
: true }], parserOptions
: { ecmaVersion
: 6 } },
109 // https://github.com/eslint/eslint/issues/16373
110 "console.log(Math.PI * 1/4)",
117 output
: "Boolean(foo)",
119 messageId
: "useRecommendation",
120 data
: { recommendation
: "Boolean(foo)" },
121 type
: "UnaryExpression"
125 code
: "!!(foo + bar)",
126 output
: "Boolean(foo + bar)",
128 messageId
: "useRecommendation",
129 data
: { recommendation
: "Boolean(foo + bar)" },
130 type
: "UnaryExpression"
134 code
: "~foo.indexOf(1)",
137 messageId
: "useRecommendation",
138 data
: { recommendation
: "foo.indexOf(1) !== -1" },
139 type
: "UnaryExpression"
143 code
: "~foo.bar.indexOf(2)",
146 messageId
: "useRecommendation",
147 data
: { recommendation
: "foo.bar.indexOf(2) !== -1" },
148 type
: "UnaryExpression"
153 output
: "Number(foo)",
155 messageId
: "useRecommendation",
156 data
: { recommendation
: "Number(foo)" },
157 type
: "UnaryExpression"
162 output
: "Number(foo.bar)",
164 messageId
: "useRecommendation",
165 data
: { recommendation
: "Number(foo.bar)" },
166 type
: "UnaryExpression"
171 output
: "Number(foo)",
173 messageId
: "useRecommendation",
174 data
: { recommendation
: "Number(foo)" },
175 type
: "BinaryExpression"
180 output
: "Number(foo)",
182 messageId
: "useRecommendation",
183 data
: { recommendation
: "Number(foo)" },
184 type
: "BinaryExpression"
189 output
: "Number(foo.bar)",
191 messageId
: "useRecommendation",
192 data
: { recommendation
: "Number(foo.bar)" },
193 type
: "BinaryExpression"
198 output
: "String(foo)",
200 messageId
: "useRecommendation",
201 data
: { recommendation
: "String(foo)" },
202 type
: "BinaryExpression"
207 output
: "String(foo)",
208 parserOptions
: { ecmaVersion
: 6 },
210 messageId
: "useRecommendation",
211 data
: { recommendation
: "String(foo)" },
212 type
: "BinaryExpression"
217 output
: "String(foo)",
219 messageId
: "useRecommendation",
220 data
: { recommendation
: "String(foo)" },
221 type
: "BinaryExpression"
226 output
: "String(foo)",
227 parserOptions
: { ecmaVersion
: 6 },
229 messageId
: "useRecommendation",
230 data
: { recommendation
: "String(foo)" },
231 type
: "BinaryExpression"
235 code
: "\"\"+foo.bar",
236 output
: "String(foo.bar)",
238 messageId
: "useRecommendation",
239 data
: { recommendation
: "String(foo.bar)" },
240 type
: "BinaryExpression"
245 output
: "String(foo.bar)",
246 parserOptions
: { ecmaVersion
: 6 },
248 messageId
: "useRecommendation",
249 data
: { recommendation
: "String(foo.bar)" },
250 type
: "BinaryExpression"
254 code
: "foo.bar+\"\"",
255 output
: "String(foo.bar)",
257 messageId
: "useRecommendation",
258 data
: { recommendation
: "String(foo.bar)" },
259 type
: "BinaryExpression"
264 output
: "String(foo.bar)",
265 parserOptions
: { ecmaVersion
: 6 },
267 messageId
: "useRecommendation",
268 data
: { recommendation
: "String(foo.bar)" },
269 type
: "BinaryExpression"
274 output
: "String(foo)",
275 options
: [{ disallowTemplateShorthand
: true }],
276 parserOptions
: { ecmaVersion
: 6 },
278 messageId
: "useRecommendation",
279 data
: { recommendation
: "String(foo)" },
280 type
: "TemplateLiteral"
284 code
: "`\\\n${foo}`",
285 output
: "String(foo)",
286 options
: [{ disallowTemplateShorthand
: true }],
287 parserOptions
: { ecmaVersion
: 6 },
289 messageId
: "useRecommendation",
290 data
: { recommendation
: "String(foo)" },
291 type
: "TemplateLiteral"
295 code
: "`${foo}\\\n`",
296 output
: "String(foo)",
297 options
: [{ disallowTemplateShorthand
: true }],
298 parserOptions
: { ecmaVersion
: 6 },
300 messageId
: "useRecommendation",
301 data
: { recommendation
: "String(foo)" },
302 type
: "TemplateLiteral"
307 output
: "foo = String(foo)",
309 messageId
: "useRecommendation",
310 data
: { recommendation
: "foo = String(foo)" },
311 type
: "AssignmentExpression"
316 output
: "foo = String(foo)",
317 parserOptions
: { ecmaVersion
: 6 },
319 messageId
: "useRecommendation",
320 data
: { recommendation
: "foo = String(foo)" },
321 type
: "AssignmentExpression"
325 code
: "var a = !!foo",
326 output
: "var a = Boolean(foo)",
327 options
: [{ boolean: true, allow
: ["~"] }],
329 messageId
: "useRecommendation",
330 data
: { recommendation
: "Boolean(foo)" },
331 type
: "UnaryExpression"
335 code
: "var a = ~foo.indexOf(1)",
337 options
: [{ boolean: true, allow
: ["!!"] }],
339 messageId
: "useRecommendation",
340 data
: { recommendation
: "foo.indexOf(1) !== -1" },
341 type
: "UnaryExpression"
345 code
: "var a = 1 * foo",
346 output
: "var a = Number(foo)",
347 options
: [{ boolean: true, allow
: ["+"] }],
349 messageId
: "useRecommendation",
350 data
: { recommendation
: "Number(foo)" },
351 type
: "BinaryExpression"
355 code
: "var a = +foo",
356 output
: "var a = Number(foo)",
357 options
: [{ boolean: true, allow
: ["*"] }],
359 messageId
: "useRecommendation",
360 data
: { recommendation
: "Number(foo)" },
361 type
: "UnaryExpression"
365 code
: "var a = \"\" + foo",
366 output
: "var a = String(foo)",
367 options
: [{ boolean: true, allow
: ["*"] }],
369 messageId
: "useRecommendation",
370 data
: { recommendation
: "String(foo)" },
371 type
: "BinaryExpression"
375 code
: "var a = `` + foo",
376 output
: "var a = String(foo)",
377 options
: [{ boolean: true, allow
: ["*"] }],
378 parserOptions
: { ecmaVersion
: 6 },
380 messageId
: "useRecommendation",
381 data
: { recommendation
: "String(foo)" },
382 type
: "BinaryExpression"
387 output
: "typeof Number(foo)",
389 messageId
: "useRecommendation",
390 data
: { recommendation
: "Number(foo)" },
391 type
: "UnaryExpression"
396 output
: "typeof Number(foo)",
398 messageId
: "useRecommendation",
399 data
: { recommendation
: "Number(foo)" },
400 type
: "UnaryExpression"
404 code
: "let x ='' + 1n;",
405 output
: "let x =String(1n);",
406 parserOptions
: { ecmaVersion
: 2020 },
408 messageId
: "useRecommendation",
409 data
: { recommendation
: "String(1n)" },
410 type
: "BinaryExpression"
416 code
: "~foo?.indexOf(1)",
418 parserOptions
: { ecmaVersion
: 2020 },
420 messageId
: "useRecommendation",
421 data
: { recommendation
: "foo?.indexOf(1) >= 0" },
422 type
: "UnaryExpression"
426 code
: "~(foo?.indexOf)(1)",
428 parserOptions
: { ecmaVersion
: 2020 },
430 messageId
: "useRecommendation",
431 data
: { recommendation
: "(foo?.indexOf)(1) !== -1" },
432 type
: "UnaryExpression"
436 // https://github.com/eslint/eslint/issues/16373 regression tests
439 output
: "Number(a) / 2",
441 messageId
: "useRecommendation",
442 data
: { recommendation
: "Number(a)" },
443 type
: "BinaryExpression"
448 output
: "(Number(a)) / 2",
450 messageId
: "useRecommendation",
451 data
: { recommendation
: "Number(a)" },
452 type
: "BinaryExpression"
456 code
: "a * 1 / (b * 1)",
457 output
: "a * 1 / (Number(b))",
459 messageId
: "useRecommendation",
460 data
: { recommendation
: "Number(b)" },
461 type
: "BinaryExpression"
466 output
: "Number(a) + 2",
468 messageId
: "useRecommendation",
469 data
: { recommendation
: "Number(a)" },
470 type
: "BinaryExpression"