Skip to content

Commit 02cd0cc

Browse files
refactor: improve tests (#37)
1 parent d94acbf commit 02cd0cc

13 files changed

+180
-172
lines changed

jest-setup.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
import './test-utils/to-have-pattern';
22
import './test-utils/to-match-groups';
3+
import './test-utils/to-match-string';

src/__tests__/examples.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@ test('example: IPv4 address validator', () => {
3636
expect(regex).toMatchGroups('255.255.255.255', ['255.255.255.255', '255', '255', '255', '255']);
3737
expect(regex).toMatchGroups('123.45.67.89', ['123.45.67.89', '123', '45', '67', '89']);
3838

39-
expect(regex.test('0.0.0.')).toBe(false);
40-
expect(regex.test('0.0.0.0.')).toBe(false);
41-
expect(regex.test('0.-1.0.0')).toBe(false);
42-
expect(regex.test('0.1000.0.0')).toBe(false);
43-
expect(regex.test('0.0.300.0')).toBe(false);
44-
expect(regex.test('255.255.255.256')).toBe(false);
39+
expect(regex).not.toMatchString('0.0.0.');
40+
expect(regex).not.toMatchString('0.0.0.0.');
41+
expect(regex).not.toMatchString('0.-1.0.0');
42+
expect(regex).not.toMatchString('0.1000.0.0');
43+
expect(regex).not.toMatchString('0.0.300.0');
44+
expect(regex).not.toMatchString('255.255.255.256');
4545

46-
expect(regex.source).toEqual(
47-
'^(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])$'
46+
expect(regex).toHavePattern(
47+
/^(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$/
4848
);
4949
});

src/components/__tests__/anchors.test.tsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ import { endOfString, startOfString } from '../anchors';
22
import { oneOrMore } from '../quantifiers';
33

44
test('`startOfString` basic cases', () => {
5-
expect([startOfString]).toHavePattern('^');
6-
expect([startOfString, 'a', 'b']).toHavePattern('^ab');
5+
expect(startOfString).toHavePattern(/^/);
6+
expect([startOfString, 'a', 'b']).toHavePattern(/^ab/);
77
});
88

99
test('`startOfString` regex tests', () => {
1010
expect([startOfString, oneOrMore('a')]).toMatchGroups('a aa aaa', ['a']);
1111
});
1212

1313
test('`endOfString` basic cases', () => {
14-
expect([endOfString]).toHavePattern('$');
15-
expect(['a', 'b', endOfString]).toHavePattern('ab$');
14+
expect(endOfString).toHavePattern(/$/);
15+
expect(['a', 'b', endOfString]).toHavePattern(/ab$/);
1616
});
1717

1818
test('`endOfString` regex tests', () => {

src/components/__tests__/capture.test.tsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import { capture } from '../capture';
22
import { oneOrMore } from '../quantifiers';
33

44
test('`capture` base cases', () => {
5-
expect(capture('a')).toHavePattern('(a)');
6-
expect(capture('abc')).toHavePattern('(abc)');
7-
expect(capture(oneOrMore('abc'))).toHavePattern('((?:abc)+)');
8-
expect(oneOrMore(capture('abc'))).toHavePattern('(abc)+');
5+
expect(capture('a')).toHavePattern(/(a)/);
6+
expect(capture('abc')).toHavePattern(/(abc)/);
7+
expect(capture(oneOrMore('abc'))).toHavePattern(/((?:abc)+)/);
8+
expect(oneOrMore(capture('abc'))).toHavePattern(/(abc)+/);
99
});
1010

1111
test('`capture` captures group', () => {

src/components/__tests__/character-class.test.ts

+34-34
Original file line numberDiff line numberDiff line change
@@ -12,37 +12,37 @@ import {
1212
import { buildRegex } from '../../builders';
1313

1414
test('`any` character class', () => {
15-
expect(any).toHavePattern('.');
16-
expect(['x', any]).toHavePattern('x.');
17-
expect(['x', any, 'x']).toHavePattern('x.x');
15+
expect(any).toHavePattern(/./);
16+
expect(['x', any]).toHavePattern(/x./);
17+
expect(['x', any, 'x']).toHavePattern(/x.x/);
1818
});
1919

2020
test('`digit` character class', () => {
21-
expect(digit).toHavePattern('\\d');
22-
expect(['x', digit]).toHavePattern('x\\d');
23-
expect(['x', digit, 'x']).toHavePattern('x\\dx');
21+
expect(digit).toHavePattern(/\d/);
22+
expect(['x', digit]).toHavePattern(/x\d/);
23+
expect(['x', digit, 'x']).toHavePattern(/x\dx/);
2424
});
2525

2626
test('`word` character class', () => {
27-
expect(word).toHavePattern('\\w');
28-
expect(['x', word]).toHavePattern('x\\w');
29-
expect(['x', word, 'x']).toHavePattern('x\\wx');
27+
expect(word).toHavePattern(/\w/);
28+
expect(['x', word]).toHavePattern(/x\w/);
29+
expect(['x', word, 'x']).toHavePattern(/x\wx/);
3030
});
3131

3232
test('`whitespace` character class', () => {
33-
expect(whitespace).toHavePattern('\\s');
34-
expect(['x', whitespace]).toHavePattern('x\\s');
35-
expect(['x', whitespace, 'x']).toHavePattern('x\\sx');
33+
expect(whitespace).toHavePattern(/\s/);
34+
expect(['x', whitespace]).toHavePattern(/x\s/);
35+
expect(['x', whitespace, 'x']).toHavePattern(/x\sx/);
3636
});
3737

3838
test('`characterClass` base cases', () => {
39-
expect(characterClass(characterRange('a', 'z'))).toHavePattern('[a-z]');
39+
expect(characterClass(characterRange('a', 'z'))).toHavePattern(/[a-z]/);
4040
expect(characterClass(characterRange('a', 'z'), characterRange('A', 'Z'))).toHavePattern(
41-
'[a-zA-Z]'
41+
/[a-zA-Z]/
4242
);
43-
expect(characterClass(characterRange('a', 'z'), anyOf('05'))).toHavePattern('[a-z05]');
43+
expect(characterClass(characterRange('a', 'z'), anyOf('05'))).toHavePattern(/[a-z05]/);
4444
expect(characterClass(characterRange('a', 'z'), whitespace, anyOf('05'))).toHavePattern(
45-
'[a-z\\s05]'
45+
/[a-z\s05]/
4646
);
4747
});
4848

@@ -53,9 +53,9 @@ test('`characterClass` throws on inverted arguments', () => {
5353
});
5454

5555
test('`characterRange` base cases', () => {
56-
expect(characterRange('a', 'z')).toHavePattern('[a-z]');
57-
expect(['x', characterRange('0', '9')]).toHavePattern('x[0-9]');
58-
expect([characterRange('A', 'F'), 'x']).toHavePattern('[A-F]x');
56+
expect(characterRange('a', 'z')).toHavePattern(/[a-z]/);
57+
expect(['x', characterRange('0', '9')]).toHavePattern(/x[0-9]/);
58+
expect([characterRange('A', 'F'), 'x']).toHavePattern(/[A-F]x/);
5959
});
6060

6161
test('`characterRange` throws on incorrect arguments', () => {
@@ -71,25 +71,25 @@ test('`characterRange` throws on incorrect arguments', () => {
7171
});
7272

7373
test('`anyOf` base cases', () => {
74-
expect(anyOf('a')).toHavePattern('a');
75-
expect(['x', anyOf('a'), 'x']).toHavePattern('xax');
76-
expect(anyOf('ab')).toHavePattern('[ab]');
77-
expect(['x', anyOf('ab')]).toHavePattern('x[ab]');
78-
expect(['x', anyOf('ab'), 'x']).toHavePattern('x[ab]x');
74+
expect(anyOf('a')).toHavePattern(/a/);
75+
expect(['x', anyOf('a'), 'x']).toHavePattern(/xax/);
76+
expect(anyOf('ab')).toHavePattern(/[ab]/);
77+
expect(['x', anyOf('ab')]).toHavePattern(/x[ab]/);
78+
expect(['x', anyOf('ab'), 'x']).toHavePattern(/x[ab]x/);
7979
});
8080

8181
test('`anyOf` with quantifiers', () => {
82-
expect(['x', oneOrMore(anyOf('abc')), 'x']).toHavePattern('x[abc]+x');
83-
expect(['x', optionally(anyOf('abc')), 'x']).toHavePattern('x[abc]?x');
84-
expect(['x', zeroOrMore(anyOf('abc')), 'x']).toHavePattern('x[abc]*x');
82+
expect(['x', oneOrMore(anyOf('abc')), 'x']).toHavePattern(/x[abc]+x/);
83+
expect(['x', optionally(anyOf('abc')), 'x']).toHavePattern(/x[abc]?x/);
84+
expect(['x', zeroOrMore(anyOf('abc')), 'x']).toHavePattern(/x[abc]*x/);
8585
});
8686

8787
test('`anyOf` escapes special characters', () => {
88-
expect(anyOf('abc-+.]\\')).toHavePattern('[abc+.\\]\\\\-]');
88+
expect(anyOf('abc-+.]\\')).toHavePattern(/[abc+.\]\\-]/);
8989
});
9090

9191
test('`anyOf` moves hyphen to the last position', () => {
92-
expect(anyOf('a-bc')).toHavePattern('[abc-]');
92+
expect(anyOf('a-bc')).toHavePattern(/[abc-]/);
9393
});
9494

9595
test('`anyOf` throws on empty text', () => {
@@ -99,17 +99,17 @@ test('`anyOf` throws on empty text', () => {
9999
});
100100

101101
test('`inverted` character class', () => {
102-
expect(inverted(anyOf('a'))).toHavePattern('[^a]');
103-
expect(inverted(anyOf('abc'))).toHavePattern('[^abc]');
102+
expect(inverted(anyOf('a'))).toHavePattern(/[^a]/);
103+
expect(inverted(anyOf('abc'))).toHavePattern(/[^abc]/);
104104
});
105105

106106
test('`inverted` character class double inversion', () => {
107-
expect(inverted(inverted(anyOf('a')))).toHavePattern('a');
108-
expect(inverted(inverted(anyOf('abc')))).toHavePattern('[abc]');
107+
expect(inverted(inverted(anyOf('a')))).toHavePattern(/a/);
108+
expect(inverted(inverted(anyOf('abc')))).toHavePattern(/[abc]/);
109109
});
110110

111111
test('`inverted` character class execution', () => {
112-
expect(inverted(anyOf('a'))).toMatchGroups('aa', []);
112+
expect(inverted(anyOf('a'))).not.toMatchString('aa');
113113
expect(inverted(anyOf('a'))).toMatchGroups('aba', ['b']);
114114
});
115115

src/components/__tests__/choice-of.test.ts

+16-16
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,34 @@ import { repeat } from '../repeat';
33
import { choiceOf } from '../choice-of';
44

55
test('`choiceOf` using basic strings', () => {
6-
expect(choiceOf('a')).toHavePattern('a');
7-
expect(choiceOf('a', 'b')).toHavePattern('a|b');
8-
expect(choiceOf('a', 'b', 'c')).toHavePattern('a|b|c');
9-
expect(choiceOf('aaa', 'bbb')).toHavePattern('aaa|bbb');
6+
expect(choiceOf('a')).toHavePattern(/a/);
7+
expect(choiceOf('a', 'b')).toHavePattern(/a|b/);
8+
expect(choiceOf('a', 'b', 'c')).toHavePattern(/a|b|c/);
9+
expect(choiceOf('aaa', 'bbb')).toHavePattern(/aaa|bbb/);
1010
});
1111

1212
test('`choiceOf` used in sequence', () => {
13-
expect(['x', choiceOf('a'), 'x']).toHavePattern('xax');
14-
expect([choiceOf('a', 'b'), 'x']).toHavePattern('(?:a|b)x');
15-
expect(['x', choiceOf('a', 'b')]).toHavePattern('x(?:a|b)');
13+
expect(['x', choiceOf('a'), 'x']).toHavePattern(/xax/);
14+
expect([choiceOf('a', 'b'), 'x']).toHavePattern(/(?:a|b)x/);
15+
expect(['x', choiceOf('a', 'b')]).toHavePattern(/x(?:a|b)/);
1616

17-
expect(choiceOf('a', 'b', 'c')).toHavePattern('a|b|c');
18-
expect(['x', choiceOf('a', 'b', 'c')]).toHavePattern('x(?:a|b|c)');
19-
expect([choiceOf('a', 'b', 'c'), 'x']).toHavePattern('(?:a|b|c)x');
17+
expect(choiceOf('a', 'b', 'c')).toHavePattern(/a|b|c/);
18+
expect(['x', choiceOf('a', 'b', 'c')]).toHavePattern(/x(?:a|b|c)/);
19+
expect([choiceOf('a', 'b', 'c'), 'x']).toHavePattern(/(?:a|b|c)x/);
2020

21-
expect(choiceOf('aaa', 'bbb')).toHavePattern('aaa|bbb');
21+
expect(choiceOf('aaa', 'bbb')).toHavePattern(/aaa|bbb/);
2222
});
2323

2424
test('`choiceOf` with sequence options', () => {
25-
expect([choiceOf(['a', 'b'])]).toHavePattern('ab');
26-
expect([choiceOf(['a', 'b'], ['c', 'd'])]).toHavePattern('ab|cd');
27-
expect([choiceOf(['a', zeroOrMore('b')], [oneOrMore('c'), 'd'])]).toHavePattern('ab*|c+d');
25+
expect([choiceOf(['a', 'b'])]).toHavePattern(/ab/);
26+
expect([choiceOf(['a', 'b'], ['c', 'd'])]).toHavePattern(/ab|cd/);
27+
expect([choiceOf(['a', zeroOrMore('b')], [oneOrMore('c'), 'd'])]).toHavePattern(/ab*|c+d/);
2828
});
2929

3030
test('`choiceOf` using nested regex', () => {
31-
expect(choiceOf(oneOrMore('a'), zeroOrMore('b'))).toHavePattern('a+|b*');
31+
expect(choiceOf(oneOrMore('a'), zeroOrMore('b'))).toHavePattern(/a+|b*/);
3232
expect(choiceOf(repeat({ min: 1, max: 3 }, 'a'), repeat({ count: 5 }, 'bx'))).toHavePattern(
33-
'a{1,3}|(?:bx){5}'
33+
/a{1,3}|(?:bx){5}/
3434
);
3535
});
3636

+15-22
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,39 @@
1-
import { buildRegex } from '../../builders';
21
import { digit } from '../character-class';
32
import { oneOrMore, optionally, zeroOrMore } from '../quantifiers';
43

54
test('`oneOrMore` quantifier', () => {
6-
expect(oneOrMore('a')).toHavePattern('a+');
7-
expect(oneOrMore('ab')).toHavePattern('(?:ab)+');
5+
expect(oneOrMore('a')).toHavePattern(/a+/);
6+
expect(oneOrMore('ab')).toHavePattern(/(?:ab)+/);
87
});
98

109
test('`optionally` quantifier', () => {
11-
expect(optionally('a')).toHavePattern('a?');
12-
expect(optionally('ab')).toHavePattern('(?:ab)?');
10+
expect(optionally('a')).toHavePattern(/a?/);
11+
expect(optionally('ab')).toHavePattern(/(?:ab)?/);
1312
});
1413

1514
test('`zeroOrMore` quantifier', () => {
16-
expect(zeroOrMore('a')).toHavePattern('a*');
17-
expect(zeroOrMore('ab')).toHavePattern('(?:ab)*');
15+
expect(zeroOrMore('a')).toHavePattern(/a*/);
16+
expect(zeroOrMore('ab')).toHavePattern(/(?:ab)*/);
1817
});
1918

2019
test('`oneOrMore` does not generate capture when grouping', () => {
21-
const regex = buildRegex(oneOrMore('aa'));
22-
const groups = [...'aa'.match(regex)!];
23-
expect(groups).toEqual(['aa']);
20+
expect(oneOrMore('aa')).toMatchGroups('aa', ['aa']);
2421
});
2522

2623
test('`optionally` does not generate capture when grouping', () => {
27-
const regex = buildRegex(optionally('aa'));
28-
const groups = [...'aa'.match(regex)!];
29-
expect(groups).toEqual(['aa']);
24+
expect(optionally('aa')).toMatchGroups('aa', ['aa']);
3025
});
3126

3227
test('`zeroOrMore` does not generate capture when grouping', () => {
33-
const regex = buildRegex(zeroOrMore('aa'));
34-
const groups = [...'aa'.match(regex)!];
35-
expect(groups).toEqual(['aa']);
28+
expect(zeroOrMore('aa')).toMatchGroups('aa', ['aa']);
3629
});
3730

3831
test('base quantifiers optimize grouping for atoms', () => {
39-
expect(oneOrMore(digit)).toHavePattern('\\d+');
40-
expect(optionally(digit)).toHavePattern('\\d?');
41-
expect(zeroOrMore(digit)).toHavePattern('\\d*');
32+
expect(oneOrMore(digit)).toHavePattern(/\d+/);
33+
expect(optionally(digit)).toHavePattern(/\d?/);
34+
expect(zeroOrMore(digit)).toHavePattern(/\d*/);
4235

43-
expect(oneOrMore('a')).toHavePattern('a+');
44-
expect(optionally('a')).toHavePattern('a?');
45-
expect(zeroOrMore('a')).toHavePattern('a*');
36+
expect(oneOrMore('a')).toHavePattern(/a+/);
37+
expect(optionally('a')).toHavePattern(/a?/);
38+
expect(zeroOrMore('a')).toHavePattern(/a*/);
4639
});

src/components/__tests__/repeat.test.tsx

+8-8
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,18 @@ import { oneOrMore, zeroOrMore } from '../quantifiers';
33
import { repeat } from '../repeat';
44

55
test('`repeat` quantifier', () => {
6-
expect(['a', repeat({ min: 1, max: 5 }, 'b')]).toHavePattern('ab{1,5}');
7-
expect(['a', repeat({ min: 1 }, 'b')]).toHavePattern('ab{1,}');
8-
expect(['a', repeat({ count: 1 }, 'b')]).toHavePattern('ab{1}');
6+
expect(['a', repeat({ min: 1, max: 5 }, 'b')]).toHavePattern(/ab{1,5}/);
7+
expect(['a', repeat({ min: 1 }, 'b')]).toHavePattern(/ab{1,}/);
8+
expect(['a', repeat({ count: 1 }, 'b')]).toHavePattern(/ab{1}/);
99

10-
expect(['a', repeat({ count: 1 }, ['a', zeroOrMore('b')])]).toHavePattern('a(?:ab*){1}');
11-
expect(repeat({ count: 5 }, ['text', ' ', oneOrMore('d')])).toHavePattern('(?:text d+){5}');
10+
expect(['a', repeat({ count: 1 }, ['a', zeroOrMore('b')])]).toHavePattern(/a(?:ab*){1}/);
11+
expect(repeat({ count: 5 }, ['text', ' ', oneOrMore('d')])).toHavePattern(/(?:text d+){5}/);
1212
});
1313

1414
test('`repeat` optimizes grouping for atoms', () => {
15-
expect(repeat({ count: 2 }, digit)).toHavePattern('\\d{2}');
16-
expect(repeat({ min: 2 }, digit)).toHavePattern('\\d{2,}');
17-
expect(repeat({ min: 1, max: 5 }, digit)).toHavePattern('\\d{1,5}');
15+
expect(repeat({ count: 2 }, digit)).toHavePattern(/\d{2}/);
16+
expect(repeat({ min: 2 }, digit)).toHavePattern(/\d{2,}/);
17+
expect(repeat({ min: 1, max: 5 }, digit)).toHavePattern(/\d{1,5}/);
1818
});
1919

2020
test('`repeat` throws on no children', () => {

0 commit comments

Comments
 (0)