Skip to content

Commit fc58310

Browse files
Add more v flag tests (#627)
* Add more `v` flag tests * Some more tests * Even more * Create thin-insects-cover.md
1 parent 2b64a09 commit fc58310

22 files changed

+198
-21
lines changed

Diff for: .changeset/thin-insects-cover.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"eslint-plugin-regexp": patch
3+
---
4+
5+
Add more `v` flag tests

Diff for: tests/lib/rules/no-useless-assertions.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import rule from "../../../lib/rules/no-useless-assertions"
33

44
const tester = new RuleTester({
55
parserOptions: {
6-
ecmaVersion: 2020,
6+
ecmaVersion: "latest",
77
sourceType: "module",
88
},
99
})
@@ -67,6 +67,15 @@ tester.run("no-useless-assertions", rule as any, {
6767
},
6868
],
6969
},
70+
{
71+
code: String.raw`/a\b[\q{foo}]/v`,
72+
errors: [
73+
{
74+
message:
75+
"'\\b' will always reject because it is preceded by a word character and followed by a word character.",
76+
},
77+
],
78+
},
7079
{
7180
code: String.raw`/,\b,/`,
7281
errors: [

Diff for: tests/lib/rules/no-useless-backreference.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import rule from "../../../lib/rules/no-useless-backreference"
33

44
const tester = new RuleTester({
55
parserOptions: {
6-
ecmaVersion: 2020,
6+
ecmaVersion: "latest",
77
sourceType: "module",
88
},
99
})
@@ -31,6 +31,10 @@ tester.run("no-useless-backreference", rule as any, {
3131
code: "/(\\b)a\\1/",
3232
errors: [{ messageId: "empty" }],
3333
},
34+
{
35+
code: "/([\\q{}])a\\1/v",
36+
errors: [{ messageId: "empty" }],
37+
},
3438
{
3539
code: "/(\\b|a{0})a\\1/",
3640
errors: [{ messageId: "empty" }],

Diff for: tests/lib/rules/no-useless-flag.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { rules } from "../../../lib/utils/rules"
66

77
const tester = new RuleTester({
88
parserOptions: {
9-
ecmaVersion: 2020,
9+
ecmaVersion: "latest",
1010
sourceType: "module",
1111
},
1212
})
@@ -218,6 +218,8 @@ tester.run("no-useless-flag", rule as any, {
218218
const orig = /\w/i; // eslint-disable-line
219219
const clone = new RegExp(orig);
220220
`,
221+
String.raw`/a/u`,
222+
String.raw`/a/v`,
221223
],
222224
invalid: [
223225
// i

Diff for: tests/lib/rules/no-useless-lazy.ts

+11-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import rule from "../../../lib/rules/no-useless-lazy"
33

44
const tester = new RuleTester({
55
parserOptions: {
6-
ecmaVersion: 2020,
6+
ecmaVersion: "latest",
77
sourceType: "module",
88
},
99
})
@@ -34,6 +34,11 @@ tester.run("no-useless-lazy", rule as any, {
3434
},
3535
],
3636
},
37+
{
38+
code: `/a{1}?/v`,
39+
output: `/a{1}/v`,
40+
errors: [{ messageId: "constant" }],
41+
},
3742
{
3843
code: `/a{4}?/`,
3944
output: `/a{4}/`,
@@ -72,6 +77,11 @@ tester.run("no-useless-lazy", rule as any, {
7277
output: `/a+b+/`,
7378
errors: [{ messageId: "possessive" }],
7479
},
80+
{
81+
code: String.raw`/[\q{aa|ab}]+?b+/v`,
82+
output: String.raw`/[\q{aa|ab}]+b+/v`,
83+
errors: [{ messageId: "possessive" }],
84+
},
7585
{
7686
code: `/a*?b+/`,
7787
output: `/a*b+/`,

Diff for: tests/lib/rules/no-useless-non-capturing-group.ts

+14-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import rule from "../../../lib/rules/no-useless-non-capturing-group"
33

44
const tester = new RuleTester({
55
parserOptions: {
6-
ecmaVersion: 2020,
6+
ecmaVersion: "latest",
77
sourceType: "module",
88
},
99
})
@@ -91,6 +91,19 @@ tester.run("no-useless-non-capturing-group", rule as any, {
9191
},
9292
],
9393
},
94+
{
95+
code: `/(?:abcd)/v.test(str)`,
96+
output: `/abcd/v.test(str)`,
97+
errors: [
98+
{
99+
message: "Unexpected quantifier Non-capturing group.",
100+
line: 1,
101+
column: 2,
102+
endLine: 1,
103+
endColumn: 5,
104+
},
105+
],
106+
},
94107
{
95108
code: `/(?:[abcd])/.test(str)`,
96109
output: `/[abcd]/.test(str)`,

Diff for: tests/lib/rules/no-useless-quantifier.ts

+16-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import rule from "../../../lib/rules/no-useless-quantifier"
33

44
const tester = new RuleTester({
55
parserOptions: {
6-
ecmaVersion: 2020,
6+
ecmaVersion: "latest",
77
sourceType: "module",
88
},
99
})
@@ -45,6 +45,21 @@ tester.run("no-useless-quantifier", rule as any, {
4545
},
4646
],
4747
},
48+
{
49+
code: String.raw`/(?:[\q{}])+/v`,
50+
output: null,
51+
errors: [
52+
{
53+
messageId: "empty",
54+
suggestions: [
55+
{
56+
messageId: "remove",
57+
output: String.raw`/(?:[\q{}])/v`,
58+
},
59+
],
60+
},
61+
],
62+
},
4863
{
4964
code: String.raw`/(?:|(?:)){5,9}/`,
5065
output: null,

Diff for: tests/lib/rules/no-useless-range.ts

+15-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import rule from "../../../lib/rules/no-useless-range"
33

44
const tester = new RuleTester({
55
parserOptions: {
6-
ecmaVersion: 2020,
6+
ecmaVersion: "latest",
77
sourceType: "module",
88
},
99
})
@@ -23,6 +23,13 @@ tester.run("no-useless-range", rule as any, {
2323
},
2424
],
2525
},
26+
{
27+
code: `/[a-a]/v`,
28+
output: `/[a]/v`,
29+
errors: [
30+
"Unexpected unnecessary character ranges. The hyphen is unnecessary.",
31+
],
32+
},
2633
{
2734
code: `/[a-b]/`,
2835
output: `/[ab]/`,
@@ -35,6 +42,13 @@ tester.run("no-useless-range", rule as any, {
3542
},
3643
],
3744
},
45+
{
46+
code: `/[a-b]/v`,
47+
output: `/[ab]/v`,
48+
errors: [
49+
"Unexpected unnecessary character ranges. The hyphen is unnecessary.",
50+
],
51+
},
3852
{
3953
code: `/[a-a-c-c]/`,
4054
output: `/[a\\-c]/`,

Diff for: tests/lib/rules/no-useless-two-nums-quantifier.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import rule from "../../../lib/rules/no-useless-two-nums-quantifier"
33

44
const tester = new RuleTester({
55
parserOptions: {
6-
ecmaVersion: 2020,
6+
ecmaVersion: "latest",
77
sourceType: "module",
88
},
99
})
@@ -42,5 +42,10 @@ tester.run("no-useless-two-nums-quantifier", rule as any, {
4242
output: "/a{100}?/",
4343
errors: ["Unexpected quantifier '{100,100}'."],
4444
},
45+
{
46+
code: "/a{100,100}?/v",
47+
output: "/a{100}?/v",
48+
errors: 1,
49+
},
4550
],
4651
})

Diff for: tests/lib/rules/no-zero-quantifier.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import rule from "../../../lib/rules/no-zero-quantifier"
33

44
const tester = new RuleTester({
55
parserOptions: {
6-
ecmaVersion: 2020,
6+
ecmaVersion: "latest",
77
sourceType: "module",
88
},
99
})
@@ -22,6 +22,15 @@ tester.run("no-zero-quantifier", rule as any, {
2222
},
2323
],
2424
},
25+
{
26+
code: `/a{0}/v`,
27+
errors: [
28+
{
29+
messageId: "unexpected",
30+
suggestions: [{ output: `/(?:)/v` }],
31+
},
32+
],
33+
},
2534
{
2635
code: `/a{0,0}/`,
2736
errors: [

Diff for: tests/lib/rules/optimal-lookaround-quantifier.ts

+12-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import rule from "../../../lib/rules/optimal-lookaround-quantifier"
33

44
const tester = new RuleTester({
55
parserOptions: {
6-
ecmaVersion: 2020,
6+
ecmaVersion: "latest",
77
sourceType: "module",
88
},
99
})
@@ -22,6 +22,17 @@ tester.run("optimal-lookaround-quantifier", rule as any, {
2222
},
2323
],
2424
},
25+
{
26+
code: `/(?=ba*)/v`,
27+
errors: [
28+
{
29+
message:
30+
"The quantified expression 'a*' at the end of the expression tree should only be matched a constant number of times. The expression can be removed without affecting the lookaround.",
31+
column: 6,
32+
suggestions: [{ output: `/(?=b)/v` }],
33+
},
34+
],
35+
},
2536
{
2637
code: `/(?=(?:a|b|abc*))/`,
2738
errors: [

Diff for: tests/lib/rules/prefer-escape-replacement-dollar-char.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import rule from "../../../lib/rules/prefer-escape-replacement-dollar-char"
33

44
const tester = new RuleTester({
55
parserOptions: {
6-
ecmaVersion: 2020,
6+
ecmaVersion: "latest",
77
sourceType: "module",
88
},
99
})
@@ -34,6 +34,10 @@ tester.run("prefer-escape-replacement-dollar-char", rule as any, {
3434
},
3535
],
3636
},
37+
{
38+
code: `'€1,234'.replace(/€/v, '$'); // "$1,234"`,
39+
errors: 1,
40+
},
3741
{
3842
code: `'€1,234'.replaceAll(/€/, '$'); // "$1,234"`,
3943
errors: [

Diff for: tests/lib/rules/prefer-lookaround.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import rule from "../../../lib/rules/prefer-lookaround"
33

44
const tester = new RuleTester({
55
parserOptions: {
6-
ecmaVersion: 2020,
6+
ecmaVersion: "latest",
77
sourceType: "module",
88
},
99
})
@@ -544,6 +544,13 @@ tester.run("prefer-lookaround", rule as any, {
544544
},
545545
],
546546
},
547+
{
548+
code: String.raw`var str = 'Java'.replace(/(?:^|\b|[\q{}])(J)ava/gv, '$1Query')`,
549+
output: String.raw`var str = 'Java'.replace(/(?<=(?:^|\b|[\q{}])J)ava/gv, 'Query')`,
550+
errors: [
551+
"This capturing group can be replaced with a lookbehind assertion ('(?<=(?:^|\\b|[\\q{}])J)').",
552+
],
553+
},
547554
{
548555
code: `var str = 'JavaScriptCode'.replace(/(?<=Java)(Script)Code/g, '$1Linter')`,
549556
output: `var str = 'JavaScriptCode'.replace(/(?<=JavaScript)Code/g, 'Linter')`,

Diff for: tests/lib/rules/prefer-named-backreference.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import rule from "../../../lib/rules/prefer-named-backreference"
33

44
const tester = new RuleTester({
55
parserOptions: {
6-
ecmaVersion: 2020,
6+
ecmaVersion: "latest",
77
sourceType: "module",
88
},
99
})
@@ -16,5 +16,10 @@ tester.run("prefer-named-backreference", rule as any, {
1616
output: `/(?<foo>a)\\k<foo>/`,
1717
errors: [{ messageId: "unexpected" }],
1818
},
19+
{
20+
code: `/(?<foo>a)\\1/v`,
21+
output: `/(?<foo>a)\\k<foo>/v`,
22+
errors: [{ messageId: "unexpected" }],
23+
},
1924
],
2025
})

Diff for: tests/lib/rules/prefer-named-capture-group.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import rule from "../../../lib/rules/prefer-named-capture-group"
33

44
const tester = new RuleTester({
55
parserOptions: {
6-
ecmaVersion: 2020,
6+
ecmaVersion: "latest",
77
sourceType: "module",
88
},
99
})
@@ -22,5 +22,11 @@ tester.run("prefer-named-capture-group", rule as any, {
2222
"Capture group '(foo)' should be converted to a named or non-capturing group.",
2323
],
2424
},
25+
{
26+
code: String.raw`/(foo)/v`,
27+
errors: [
28+
"Capture group '(foo)' should be converted to a named or non-capturing group.",
29+
],
30+
},
2531
],
2632
})

Diff for: tests/lib/rules/prefer-named-replacement.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import rule from "../../../lib/rules/prefer-named-replacement"
33

44
const tester = new RuleTester({
55
parserOptions: {
6-
ecmaVersion: 2020,
6+
ecmaVersion: "latest",
77
sourceType: "module",
88
},
99
})
@@ -34,6 +34,11 @@ tester.run("prefer-named-replacement", rule as any, {
3434
},
3535
],
3636
},
37+
{
38+
code: `"str".replace(/a(?<foo>b)c/v, "_$1_")`,
39+
output: `"str".replace(/a(?<foo>b)c/v, "_$<foo>_")`,
40+
errors: ["Unexpected indexed reference in replacement string."],
41+
},
3742
{
3843
code: `"str".replaceAll(/a(?<foo>b)c/, "_$1_")`,
3944
output: `"str".replaceAll(/a(?<foo>b)c/, "_$<foo>_")`,

Diff for: tests/lib/rules/prefer-plus-quantifier.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import rule from "../../../lib/rules/prefer-plus-quantifier"
33

44
const tester = new RuleTester({
55
parserOptions: {
6-
ecmaVersion: 2020,
6+
ecmaVersion: "latest",
77
sourceType: "module",
88
},
99
})
@@ -44,6 +44,11 @@ tester.run("prefer-plus-quantifier", rule as any, {
4444
},
4545
],
4646
},
47+
{
48+
code: "/(a){1,}/v",
49+
output: "/(a)+/v",
50+
errors: ["Unexpected quantifier '{1,}'. Use '+' instead."],
51+
},
4752
{
4853
code: "/(a){1,}?/",
4954
output: "/(a)+?/",

0 commit comments

Comments
 (0)