1
/* psx-basic.c: Test POSIX basic regular expressions. */
9
/* Intervals can only match up to RE_DUP_MAX occurences of anything. */
10
char dup_max_plus_one[6];
11
sprintf (dup_max_plus_one, "%d", RE_DUP_MAX + 1);
13
printf ("\nStarting POSIX basic tests.\n");
16
re_set_syntax (RE_SYNTAX_POSIX_MINIMAL_BASIC);
18
test_posix_generic ();
20
printf ("\nContinuing POSIX basic tests.\n");
22
/* Grouping tests that are not the same. */
24
test_should_match = false;
25
invalid_pattern (REG_EPAREN, PARENS_TO_OPS ("a)"));
27
test_should_match = true;
28
/* Special characters. */
30
test_match ("\\(*\\)", "*");
31
test_match ("\\(^*\\)", "*");
32
test_match ("**", "***");
33
test_match ("***", "****");
35
MATCH_SELF ("{"); /* of extended... */
36
MATCH_SELF ("()"); /* also non-Posix. */
40
MATCH_SELF ("a|"); /* No alternations, */
41
MATCH_SELF ("|a"); /* so OK if empty. */
43
test_match ("\\(|a\\)", "|a");
44
test_match ("\\(a|\\)", "a|");
45
test_match ("a\\+", "a+");
46
test_match ("a\\?", "a?");
47
test_match ("a\\|b", "a|b");
48
test_match ("^*", "*");
49
test_match ("^+", "+");
50
test_match ("^?", "?");
51
test_match ("^{", "{");
52
/* Valid subexpressions
53
(empty) in basic only. */
54
test_match ("\\(\\)", "");
56
test_match ("a\\(\\)", "a");
57
test_match ("\\(\\)b", "b");
58
test_match ("a\\(\\)b", "ab");
59
TEST_REGISTERS ("a\\(\\)b", "ab", 0, 2, 1, 1, -1, -1);
61
test_match ("\\(\\)*", "");
62
test_match ("\\(\\(\\)\\)*", "");
63
/* Valid back references. */
65
/* N.B.: back references to subexpressions that include a * are
66
undefined in the spec. The tests are in here to see if we handle
67
the situation consistently, but if it fails any of them, it doesn't
70
test_match ("\\(\\)\\1", "");
71
TEST_REGISTERS ("\\(\\)\\1", "", 0, 0, 0, 0, -1, -1);
73
test_match ("\\(\\(\\)\\)\\(\\)\\2", "");
75
test_match ("\\(a\\)\\1", "aa");
76
TEST_REGISTERS ("\\(a\\)\\1", "aa", 0, 2, 0, 1, -1, -1);
77
TEST_REGISTERS ("\\(a\\)\\1", "xaax", 1, 3, 1, 2, -1, -1);
79
test_match ("\\(\\(a\\)\\)\\1", "aa");
80
test_match ("\\(a\\)\\(b\\)\\2\\1", "abba");
82
test_match ("\\(a\\)*\\1", "aa");
83
TEST_REGISTERS ("\\(a\\)*\\1", "aa", 0, 2, 0, 1, -1, -1);
84
TEST_REGISTERS ("\\(a\\)*\\1", "xaax", 0, 0, -1, -1, -1, -1);
86
test_match ("\\(\\(a\\)\\2b\\)*", "aab");
87
TEST_REGISTERS ("\\(\\(a\\)\\2b\\)*", "aab", 0, 3, 0, 3, 0, 1);
88
TEST_REGISTERS ("\\(\\(a\\)\\2b\\)*", "xaabx", 0, 0, -1, -1, -1, -1);
90
test_match ("\\(a*\\)*\\1", "");
91
test_match ("\\(a*\\)*\\1", "aa");
92
TEST_REGISTERS ("\\(a*\\)*\\1", "aa", 0, 2, 0, 1, -1, -1);
93
TEST_REGISTERS ("\\(a*\\)*\\1", "xaax", 0, 0, 0, 0, -1, -1);
95
test_match ("\\(a*\\)*\\1", "");
96
test_match ("\\(a*\\)*\\1", "aa");
97
test_match ("\\(\\(a*\\)*\\)*\\1", "aa");
98
test_match ("\\(ab*\\)*\\1", "abab");
99
TEST_REGISTERS ("\\(ab*\\)*\\1", "abab", 0, 4, 0, 2, -1, -1);
100
TEST_REGISTERS ("\\(ab*\\)*\\1", "xababx", 0, 0, -1, -1, -1, -1);
102
test_match ("\\(a*\\)ab\\1", "aaba");
103
TEST_REGISTERS ("\\(a*\\)ab\\1", "aaba", 0, 4, 0, 1, -1, -1);
104
TEST_REGISTERS ("\\(a*\\)ab\\1", "xaabax", 1, 5, 1, 2, -1, -1);
106
test_match ("\\(a*\\)*ab\\1", "aaba");
107
TEST_REGISTERS ("\\(a*\\)*ab\\1", "aaba", 0, 4, 0, 1, -1, -1);
108
TEST_REGISTERS ("\\(a*\\)*ab\\1", "xaabax", 1, 5, 1, 2, -1, -1);
110
test_match ("\\(\\(a*\\)b\\)*\\2", "abb");
111
TEST_REGISTERS ("\\(\\(a*\\)b\\)*\\2", "abb", 0, 3, 2, 3, 2, 2);
112
TEST_REGISTERS ("\\(\\(a*\\)b\\)*\\2", "xabbx", 0, 0, -1, -1, -1, -1);
114
/* Different from above. */
115
test_match ("\\(\\(a*\\)b*\\)*\\2", "aa");
116
TEST_REGISTERS ("\\(\\(a*\\)b*\\)*\\2", "aa", 0, 2, 0, 1, 0, 1);
117
TEST_REGISTERS ("\\(\\(a*\\)b*\\)*\\2", "xaax", 0, 0, 0, 0, 0, 0);
119
test_match ("\\(\\(a*\\)b*\\)*\\2", "aba");
120
TEST_REGISTERS ("\\(\\(a*\\)b*\\)*\\2", "aba", 0, 3, 0, 2, 0, 1);
121
TEST_REGISTERS ("\\(\\(a*\\)b*\\)*\\2", "xabax", 0, 0, 0, 0, 0, 0);
123
test_match ("\\(\\(a*\\)b\\)*\\2", "aababa");
124
TEST_REGISTERS ("\\(\\(a*\\)b\\)*\\2", "aababa", 0, 6, 3, 5, 3, 4);
125
TEST_REGISTERS ("\\(\\(a*\\)b\\)*\\2", "xaababax", 0, 0, -1, -1, -1, -1);
127
test_match ("\\(\\(a*\\)b*\\)*\\2", "aabaa");
128
TEST_REGISTERS ("\\(\\(a*\\)b*\\)*\\2", "aabaa", 0, 5, 0, 3, 0, 2);
129
TEST_REGISTERS ("\\(\\(a*\\)b*\\)*\\2", "xaabaax", 0, 0, 0, 0, 0, 0);
131
test_match ("\\(\\(a*\\)b*\\)*\\2", "aabbaa");
132
TEST_REGISTERS ("\\(\\(a*\\)b*\\)*\\2", "aabbaa", 0, 6, 0, 4, 0, 2);
133
TEST_REGISTERS ("\\(\\(a*\\)b*\\)*\\2", "xaabbaax", 0, 0, 0, 0, 0, 0);
135
test_match ("\\(\\(a*\\)b*\\)*\\2", "abaabaa");
136
TEST_REGISTERS ("\\(\\(a*\\)b*\\)*\\2", "abaabaa", 0, 7, 2, 5, 2, 4);
137
TEST_REGISTERS ("\\(\\(a*\\)b*\\)*\\2", "xaababaax", 0, 0, 0, 0, 0, 0);
139
test_match ("\\(\\(a*\\)b*\\)*a\\2", "aabaaa");
140
TEST_REGISTERS ("\\(\\(a*\\)b*a\\)*\\2", "aabaaa", 0, 6, 0, 3, 0, 2);
141
TEST_REGISTERS ("\\(\\(a*\\)b*a\\)*\\2", "xaabaax", 0, 0, -1, -1, -1, -1);
143
test_match ("\\(\\(a*\\)b*\\)*\\2a", "aabaaa");
144
TEST_REGISTERS ("\\(\\(a*\\)b*\\)*\\2a", "aabaaa", 0, 6, 0, 3, 0, 2);
145
TEST_REGISTERS ("\\(\\(a*\\)b*\\)*\\2a", "xaabaaax", 1, 7, 1, 4, 1, 3);
147
test_match ("\\(\\(a*\\)b\\)*\\2\\1", "abaabaaaab");
148
TEST_REGISTERS ("\\(\\(a*\\)b\\)*\\2\\1", "abaabaaaab", 0, 10, 2, 5, 2, 4);
149
/* We are matching the empty string here. */
150
TEST_REGISTERS ("\\(\\(a*\\)b\\)*\\2\\1", "xabaabaaaabx", 0, 0, -1, -1, -1, -1);
152
test_match ("\\(a*b\\)\\1", "abab");
153
test_match ("\\(a\\)\\1\\1", "aaa");
154
test_match ("\\(a\\(c\\)d\\)\\1\\2", "acdacdc");
156
test_match ("\\(a\\)\\1*", "aaa");
157
TEST_REGISTERS ("\\(a\\)\\1*", "aaa", 0, 3, 0, 1, -1, -1);
158
TEST_REGISTERS ("\\(a\\)\\1*", "xaaax", 1, 4, 1, 2, -1, -1);
160
test_match ("\\(a\\)\\{1,3\\}b\\1", "aba");
161
TEST_REGISTERS ("\\(a\\)\\{1,3\\}b\\1", "aba", 0, 3, 0, 1, -1, -1);
162
TEST_REGISTERS ("\\(a\\)\\{1,3\\}b\\1", "xabax", 1, 4, 1, 2, -1, -1);
164
test_match ("\\(\\(a\\)\\2\\)*", "aaaa"); /* rms? */
165
TEST_REGISTERS ("\\(\\(a*b\\)\\2\\)*", "bbabab", 0, 6, 2, 6, 2, 4); /* rms? */
167
test_match ("\\(\\(a\\)\\1\\)*", "a1a1");
169
test_match ("\\(\\(a\\)\\2\\)\\1", "aaaa");
171
test_match ("\\(\\(a*\\)\\2\\)\\1", "aaaa");
172
TEST_REGISTERS ("\\(\\(a*\\)\\2\\)\\1", "aaaa", 0, 4, 0, 2, 0, 1);
173
TEST_REGISTERS ("\\(\\(a*\\)\\2\\)\\1", "xaaaax", 0, 0, 0, 0, 0, 0);
175
test_match ("\\{1\\}", "{1}");
176
test_match ("^\\{1\\}", "{1}");
178
test_match ("\\(a\\)\\1\\{1,2\\}", "aaa");
179
TEST_REGISTERS ("\\(a\\)\\1\\{1,2\\}", "aaa", 0, 3, 0, 1, -1, -1);
180
TEST_REGISTERS ("\\(a\\)\\1\\{1,2\\}", "xaaax", 1, 4, 1, 2, -1, -1);
183
/* Per POSIX D11.1 p. 109, leftmost longest match. */
185
test_match (PARENS_TO_OPS ("(.*).*\\1"), "abcabc");
188
/* Per POSIX D11.1, p. 125, leftmost longest match. */
190
test_match (PARENS_TO_OPS ("(ac*)c*d[ac]*\\1"), "acdacaaa");
191
TEST_REGISTERS (PARENS_TO_OPS ("(ac*)c*d[ac]*\\1"), "acdacaaa",
194
/* Anchors become ordinary, sometimes. */
198
test_fastmap ("$a^", "$", 0, 0);
199
test_match ("$^*", "$^^");
200
test_match ("\\($^\\)", "$^");
201
test_match ("$*", "$$");
202
/* xx -- known bug, solution pending test_match ("^^$", "^"); */
203
test_match ("$\\{0,\\}", "$$");
204
TEST_SEARCH ("^$*", "$$", 0, 2);
205
TEST_SEARCH ("^$\\{0,\\}", "$$", 0, 2);
207
MATCH_SELF ("$HOME");
208
MATCH_SELF ("$1.35");
211
/* Basic regular expressions, continued; these don't match their strings. */
212
test_should_match = false;
214
invalid_pattern (REG_EESCAPE, "\\(a\\");
215
/* Invalid back references. */
216
test_match ("\\(a\\)\\1", "ab");
217
test_match ("\\(a\\)\\1\\1", "aab");
218
test_match ("\\(a\\)\\(b\\)\\2\\1", "abab");
219
test_match ("\\(a\\(c\\)d\\)\\1\\2", "acdc");
220
test_match ("\\(a*b\\)\\1", "abaab");
221
test_match ("\\(a\\)\\1*", "aaaaaaaaaab");
222
test_match ("\\(\\(a\\)\\1\\)*", "aaa");
223
invalid_pattern (REG_ESUBREG, "\\1");
224
invalid_pattern (REG_ESUBREG, "\\(a\\)\\2");
225
test_match ("\\(\\(a\\)\\2\\)*", "abaa");
226
test_match ("\\(\\(a\\)\\1\\)*", "a");
227
test_match ("\\(\\(a\\)\\2\\)\\1", "abaa");
228
test_match ("\\(\\(a*\\)\\2\\)\\1", "abaa");
229
/* Invalid intervals. */
230
invalid_pattern (REG_EBRACE, "a\\{");
232
invalid_pattern (REG_BADBR, "a\\{-1");
233
invalid_pattern (REG_BADBR, concat ("a\\{", (char *)dup_max_plus_one));
234
invalid_pattern (REG_BADBR, concat (concat ("a\\{", (char *)dup_max_plus_one), ","));
235
invalid_pattern (REG_BADBR, "a\\{1,0");
237
invalid_pattern (REG_EBRACE, "a\\{1");
238
invalid_pattern (REG_EBRACE, "a\\{0,");
239
invalid_pattern (REG_EBRACE, "a\\{0,1");
240
invalid_pattern (REG_EBRACE, "a\\{0,1}");
242
printf ("\nFinished POSIX basic tests.\n");
251
trim-versions-without-asking: nil