391 lines
10 KiB
JavaScript
391 lines
10 KiB
JavaScript
/**
|
|
* @fileoverview Tests for no-unused-expressions rule.
|
|
* @author Michael Ficarra
|
|
*/
|
|
|
|
"use strict";
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Requirements
|
|
//------------------------------------------------------------------------------
|
|
|
|
const rule = require("../../src/rules/no-unused-expressions"),
|
|
RuleTester = require("../helpers/RuleTester");
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Tests
|
|
//------------------------------------------------------------------------------
|
|
|
|
const ruleTester = new RuleTester();
|
|
|
|
ruleTester.run("no-unused-expressions", rule, {
|
|
valid: [
|
|
// Original test cases.
|
|
"function f(){}",
|
|
"a = b",
|
|
"new a",
|
|
"{}",
|
|
"f(); g()",
|
|
"i++",
|
|
"a()",
|
|
{ code: "a && a()", options: [{ allowShortCircuit: true }] },
|
|
{ code: "a() || (b = c)", options: [{ allowShortCircuit: true }] },
|
|
{ code: "a ? b() : c()", options: [{ allowTernary: true }] },
|
|
{
|
|
code: "a ? b() || (c = d) : e()",
|
|
options: [{ allowShortCircuit: true, allowTernary: true }],
|
|
},
|
|
"delete foo.bar",
|
|
"void new C",
|
|
'"use strict";',
|
|
'"directive one"; "directive two"; f();',
|
|
'function foo() {"use strict"; return true; }',
|
|
{
|
|
code: 'var foo = () => {"use strict"; return true; }',
|
|
parserOptions: { ecmaVersion: 6 },
|
|
},
|
|
'function foo() {"directive one"; "directive two"; f(); }',
|
|
'function foo() { var foo = "use strict"; return true; }',
|
|
{
|
|
code: "function* foo(){ yield 0; }",
|
|
parserOptions: { ecmaVersion: 6 },
|
|
},
|
|
{
|
|
code: "async function foo() { await 5; }",
|
|
parserOptions: { ecmaVersion: 8 },
|
|
},
|
|
{
|
|
code: "async function foo() { await foo.bar; }",
|
|
parserOptions: { ecmaVersion: 8 },
|
|
},
|
|
{
|
|
code: "async function foo() { bar && await baz; }",
|
|
options: [{ allowShortCircuit: true }],
|
|
parserOptions: { ecmaVersion: 8 },
|
|
},
|
|
{
|
|
code: "async function foo() { foo ? await bar : await baz; }",
|
|
options: [{ allowTernary: true }],
|
|
parserOptions: { ecmaVersion: 8 },
|
|
},
|
|
{
|
|
code: "tag`tagged template literal`",
|
|
options: [{ allowTaggedTemplates: true }],
|
|
parserOptions: { ecmaVersion: 6 },
|
|
},
|
|
{
|
|
code: "shouldNotBeAffectedByAllowTemplateTagsOption()",
|
|
options: [{ allowTaggedTemplates: true }],
|
|
parserOptions: { ecmaVersion: 6 },
|
|
},
|
|
|
|
// Babel-specific test cases.
|
|
"let a = do { if (foo) { foo.bar; } }",
|
|
"let a = do { foo; }",
|
|
"let a = do { let b = 2; foo; }",
|
|
"let a = do { (foo + 1); }",
|
|
"let a = do { if (foo) { if (foo.bar) { foo.bar; } } }",
|
|
"let a = do { if (foo) { if (foo.bar) { foo.bar; } else if (foo.baz) { foo.baz; } } }",
|
|
"foo.bar?.();",
|
|
],
|
|
invalid: [
|
|
{
|
|
code: "0",
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "a",
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "f(), 0",
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "{0}",
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "[]",
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "a && b();",
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "a() || false",
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "a || (b = c)",
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "a ? b() || (c = d) : e",
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "`untagged template literal`",
|
|
parserOptions: { ecmaVersion: 6 },
|
|
errors: [
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
],
|
|
},
|
|
{
|
|
code: "tag`tagged template literal`",
|
|
parserOptions: { ecmaVersion: 6 },
|
|
errors: [
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
],
|
|
},
|
|
{
|
|
code: "a && b()",
|
|
options: [{ allowTernary: true }],
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "a ? b() : c()",
|
|
options: [{ allowShortCircuit: true }],
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "a || b",
|
|
options: [{ allowShortCircuit: true }],
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "a() && b",
|
|
options: [{ allowShortCircuit: true }],
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "a ? b : 0",
|
|
options: [{ allowTernary: true }],
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "a ? b : c()",
|
|
options: [{ allowTernary: true }],
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "foo.bar;",
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "!a",
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "+a",
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: '"directive one"; f(); "directive two";',
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: 'function foo() {"directive one"; f(); "directive two"; }',
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: 'if (0) { "not a directive"; f(); }',
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: 'function foo() { var foo = true; "use strict"; }',
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: 'var foo = () => { var foo = true; "use strict"; }',
|
|
parserOptions: { ecmaVersion: 6 },
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "`untagged template literal`",
|
|
options: [{ allowTaggedTemplates: true }],
|
|
parserOptions: { ecmaVersion: 6 },
|
|
errors: [
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
],
|
|
},
|
|
{
|
|
code: "`untagged template literal`",
|
|
options: [{ allowTaggedTemplates: false }],
|
|
parserOptions: { ecmaVersion: 6 },
|
|
errors: [
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
],
|
|
},
|
|
{
|
|
code: "tag`tagged template literal`",
|
|
options: [{ allowTaggedTemplates: false }],
|
|
parserOptions: { ecmaVersion: 6 },
|
|
errors: [
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
],
|
|
},
|
|
|
|
// Babel-specific test cases.
|
|
{
|
|
code: "let a = do { foo; let b = 2; }",
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: "let a = do { if (foo) { foo.bar } else { a; bar.foo } }",
|
|
errors: [
|
|
{
|
|
message:
|
|
"Expected an assignment or function call and instead saw an expression.",
|
|
type: "ExpressionStatement",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
});
|