]> git.proxmox.com Git - pve-eslint.git/blob - eslint/tests/lib/rules/no-unused-expressions.js
6f49a0a24fba523a69185ea53c30da5c86ed4cdf
[pve-eslint.git] / eslint / tests / lib / rules / no-unused-expressions.js
1 /**
2 * @fileoverview Tests for no-unused-expressions rule.
3 * @author Michael Ficarra
4 */
5
6 "use strict";
7
8 //------------------------------------------------------------------------------
9 // Requirements
10 //------------------------------------------------------------------------------
11
12 const rule = require("../../../lib/rules/no-unused-expressions"),
13 { RuleTester } = require("../../../lib/rule-tester");
14
15 //------------------------------------------------------------------------------
16 // Tests
17 //------------------------------------------------------------------------------
18
19 const ruleTester = new RuleTester();
20
21 ruleTester.run("no-unused-expressions", rule, {
22 valid: [
23 "function f(){}",
24 "a = b",
25 "new a",
26 "{}",
27 "f(); g()",
28 "i++",
29 "a()",
30 { code: "a && a()", options: [{ allowShortCircuit: true }] },
31 { code: "a() || (b = c)", options: [{ allowShortCircuit: true }] },
32 { code: "a ? b() : c()", options: [{ allowTernary: true }] },
33 { code: "a ? b() || (c = d) : e()", options: [{ allowShortCircuit: true, allowTernary: true }] },
34 "delete foo.bar",
35 "void new C",
36 "\"use strict\";",
37 "\"directive one\"; \"directive two\"; f();",
38 "function foo() {\"use strict\"; return true; }",
39 { code: "var foo = () => {\"use strict\"; return true; }", parserOptions: { ecmaVersion: 6 } },
40 "function foo() {\"directive one\"; \"directive two\"; f(); }",
41 "function foo() { var foo = \"use strict\"; return true; }",
42 {
43 code: "function* foo(){ yield 0; }",
44 parserOptions: { ecmaVersion: 6 }
45 },
46 {
47 code: "async function foo() { await 5; }",
48 parserOptions: { ecmaVersion: 8 }
49 },
50 {
51 code: "async function foo() { await foo.bar; }",
52 parserOptions: { ecmaVersion: 8 }
53 },
54 {
55 code: "async function foo() { bar && await baz; }",
56 options: [{ allowShortCircuit: true }],
57 parserOptions: { ecmaVersion: 8 }
58 },
59 {
60 code: "async function foo() { foo ? await bar : await baz; }",
61 options: [{ allowTernary: true }],
62 parserOptions: { ecmaVersion: 8 }
63 },
64 {
65 code: "tag`tagged template literal`",
66 options: [{ allowTaggedTemplates: true }],
67 parserOptions: { ecmaVersion: 6 }
68 },
69 {
70 code: "shouldNotBeAffectedByAllowTemplateTagsOption()",
71 options: [{ allowTaggedTemplates: true }],
72 parserOptions: { ecmaVersion: 6 }
73 },
74 {
75 code: "import(\"foo\")",
76 parserOptions: { ecmaVersion: 11 }
77 },
78 {
79 code: "func?.(\"foo\")",
80 parserOptions: { ecmaVersion: 11 }
81 },
82 {
83 code: "obj?.foo(\"bar\")",
84 parserOptions: { ecmaVersion: 11 }
85 },
86
87 // JSX
88 {
89 code: "<div />",
90 parserOptions: { ecmaFeatures: { jsx: true } }
91 },
92 {
93 code: "<></>",
94 parserOptions: { ecmaFeatures: { jsx: true } }
95 },
96 {
97 code: "var partial = <div />",
98 parserOptions: { ecmaFeatures: { jsx: true } }
99 },
100 {
101 code: "var partial = <div />",
102 options: [{ enforceForJSX: true }],
103 parserOptions: { ecmaFeatures: { jsx: true } }
104 },
105 {
106 code: "var partial = <></>",
107 options: [{ enforceForJSX: true }],
108 parserOptions: { ecmaFeatures: { jsx: true } }
109 }
110 ],
111 invalid: [
112 { code: "0", errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
113 { code: "a", errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
114 { code: "f(), 0", errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
115 { code: "{0}", errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
116 { code: "[]", errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
117 { code: "a && b();", errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
118 { code: "a() || false", errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
119 { code: "a || (b = c)", errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
120 { code: "a ? b() || (c = d) : e", errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
121 {
122 code: "`untagged template literal`",
123 parserOptions: { ecmaVersion: 6 },
124 errors: [{ messageId: "unusedExpression" }]
125 },
126 {
127 code: "tag`tagged template literal`",
128 parserOptions: { ecmaVersion: 6 },
129 errors: [{ messageId: "unusedExpression" }]
130 },
131 { code: "a && b()", options: [{ allowTernary: true }], errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
132 { code: "a ? b() : c()", options: [{ allowShortCircuit: true }], errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
133 { code: "a || b", options: [{ allowShortCircuit: true }], errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
134 { code: "a() && b", options: [{ allowShortCircuit: true }], errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
135 { code: "a ? b : 0", options: [{ allowTernary: true }], errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
136 { code: "a ? b : c()", options: [{ allowTernary: true }], errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
137 { code: "foo.bar;", errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
138 { code: "!a", errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
139 { code: "+a", errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
140 { code: "\"directive one\"; f(); \"directive two\";", errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
141 { code: "function foo() {\"directive one\"; f(); \"directive two\"; }", errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
142 { code: "if (0) { \"not a directive\"; f(); }", errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
143 { code: "function foo() { var foo = true; \"use strict\"; }", errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
144 { code: "var foo = () => { var foo = true; \"use strict\"; }", parserOptions: { ecmaVersion: 6 }, errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }] },
145 {
146 code: "`untagged template literal`",
147 options: [{ allowTaggedTemplates: true }],
148 parserOptions: { ecmaVersion: 6 },
149 errors: [{ messageId: "unusedExpression" }]
150 },
151 {
152 code: "`untagged template literal`",
153 options: [{ allowTaggedTemplates: false }],
154 parserOptions: { ecmaVersion: 6 },
155 errors: [{ messageId: "unusedExpression" }]
156 },
157 {
158 code: "tag`tagged template literal`",
159 options: [{ allowTaggedTemplates: false }],
160 parserOptions: { ecmaVersion: 6 },
161 errors: [{ messageId: "unusedExpression" }]
162 },
163
164 // Optional chaining
165 {
166 code: "obj?.foo",
167 parserOptions: { ecmaVersion: 2020 },
168 errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }]
169 },
170 {
171 code: "obj?.foo.bar",
172 parserOptions: { ecmaVersion: 2020 },
173 errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }]
174 },
175 {
176 code: "obj?.foo().bar",
177 parserOptions: { ecmaVersion: 2020 },
178 errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }]
179 },
180
181 // JSX
182 {
183 code: "<div />",
184 options: [{ enforceForJSX: true }],
185 parserOptions: { ecmaFeatures: { jsx: true } },
186 errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }]
187 },
188 {
189 code: "<></>",
190 options: [{ enforceForJSX: true }],
191 parserOptions: { ecmaFeatures: { jsx: true } },
192 errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }]
193 }
194 ]
195 });