js-regex 0.1.0

Rust validator for ECMAScript regex literals based on regexpp.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
// Ported from: https://github.com/mysticatea/regexpp/blob/master/test/fixtures/visitor/full.json
//
// Copyright (C) 2020 Quentin M. Kniep <hello@quentinkniep.com>
// Distributed under terms of the MIT license.

extern crate js_regex;

use js_regex::{EcmaRegexValidator, EcmaVersion};

#[test]
fn basic_valid() {
    let mut validator = EcmaRegexValidator::new(EcmaVersion::ES2018);
    assert_eq!(validator.validate_pattern("foo", false), Ok(()));
    assert_eq!(validator.validate_pattern("foo|bar", false), Ok(()));
    assert_eq!(validator.validate_pattern("||||", false), Ok(()));
    assert_eq!(validator.validate_pattern("^|$|\\b|\\B", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?=)", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?=foo)", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?!)", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?!foo)", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?=a)*", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?=a)+", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?=a)?", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?=a){", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?=a){}", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?=a){a}", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?=a){1}", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?=a){1,}", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?=a){1,2}", false), Ok(()));
    assert_eq!(validator.validate_pattern("a*", false), Ok(()));
    assert_eq!(validator.validate_pattern("a+", false), Ok(()));
    assert_eq!(validator.validate_pattern("a?", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{}", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{a}", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{1}", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{1", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{1,}", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{1,", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{1,2}", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{1,2", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{2,1", false), Ok(()));
    assert_eq!(validator.validate_pattern("a*?", false), Ok(()));
    assert_eq!(validator.validate_pattern("a+?", false), Ok(()));
    assert_eq!(validator.validate_pattern("a??", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{?", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{}?", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{a}?", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{1}?", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{1?", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{1,}?", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{1,?", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{1,2}?", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{1,2?", false), Ok(()));
    assert_eq!(validator.validate_pattern("a{2,1?", false), Ok(()));
    assert_eq!(validator.validate_pattern("👍🚀❇️", false), Ok(()));
    assert_eq!(validator.validate_pattern("^", false), Ok(()));
    assert_eq!(validator.validate_pattern("$", false), Ok(()));
    assert_eq!(validator.validate_pattern(".", false), Ok(()));
    assert_eq!(validator.validate_pattern("]", false), Ok(()));
    assert_eq!(validator.validate_pattern("{", false), Ok(()));
    assert_eq!(validator.validate_pattern("}", false), Ok(()));
    assert_eq!(validator.validate_pattern("|", false), Ok(()));
    assert_eq!(validator.validate_pattern("${1,2", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\1", false), Ok(()));
    assert_eq!(validator.validate_pattern("(a)\\1", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\1(a)", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?:a)\\1", false), Ok(()));
    assert_eq!(validator.validate_pattern("(a)\\2", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?:a)\\2", false), Ok(()));
    assert_eq!(validator.validate_pattern("(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)\\10", false), Ok(()));
    assert_eq!(validator.validate_pattern("(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)\\11", false), Ok(()));
    assert_eq!(validator.validate_pattern("(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)\\11", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?:a)", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\d", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\D", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\s", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\S", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\w", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\W", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\f", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\n", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\r", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\t", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\v", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\cA", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\cz", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\c1", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\c", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\0", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\u", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\u1", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\u12", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\u123", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\u1234", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\u12345", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\u{", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\u{z", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\u{a}", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\u{20", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\u{20}", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\u{10FFFF}", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\u{110000}", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\u{00000001}", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\377", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\400", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\^", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\$", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\.", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\+", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\?", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\(", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\)", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\[", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\]", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\{", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\}", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\|", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\/", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\a", false), Ok(()));
    assert_eq!(validator.validate_pattern("[]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[^-a-b-]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[-]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[a]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[--]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[-a]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[-a-]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[a-]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[a-b]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[-a-b-]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[---]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[a-b--/]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\b-\\n]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[b\\-a]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\d]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\D]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\s]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\S]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\w]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\W]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\f]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\n]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\r]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\t]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\v]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\cA]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\cz]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\c1]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\c]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\0]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\x]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\xz]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\x1]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\x12]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\x123]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u1]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u12]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u123]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u1234]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u12345]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u{]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u{z]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u{a}]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u{20]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u{20}]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u{10FFFF}]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u{110000}]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u{00000001}]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\77]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\377]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\400]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\^]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\$]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\.]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\+]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\?]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\(]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\)]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\[]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\]]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\{]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\}]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\|]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\/]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\a]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\d-\\uFFFF]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\D-\\uFFFF]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\s-\\uFFFF]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\S-\\uFFFF]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\w-\\uFFFF]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\W-\\uFFFF]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u0000-\\d]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u0000-\\D]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u0000-\\s]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u0000-\\S]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u0000-\\w]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u0000-\\W]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u0000-\\u0001]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u{2-\\u{1}]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\a-\\z]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[0-9--/]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\c0-]", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\c_]", false), Ok(()));
    assert_eq!(validator.validate_pattern("^[0-9]*$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^[0-9]+$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^[a-zA-Z]*$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^[a-zA-Z]+$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^[0-9a-zA-Z]*$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^[a-zA-Z0-9!-/:-@\\[-`{-~]*$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^([a-zA-Z0-9]{8,})$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^([a-zA-Z0-9]{6,8})$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^([0-9]{0,8})$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^[0-9]{8}$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^https?:\\/\\/", false), Ok(()));
    assert_eq!(validator.validate_pattern("^\\d{3}-\\d{4}$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^\\d{1,3}(.\\d{1,3}){3}$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^([1-9][0-9]*|0)(\\.[0-9]+)?$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^-?([1-9][0-9]*|0)(\\.[0-9]+)?$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^[ぁ-んー]*$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^[ァ-ンヴー]*$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^[ァ-ン゙゚\\-]*$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^[^\\x20-\\x7e]*$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^((4\\d{3})|(5[1-5]\\d{2})|(6011))([- ])?\\d{4}([- ])?\\d{4}([- ])?\\d{4}|3[4,7]\\d{13}$", false), Ok(()));
    assert_eq!(validator.validate_pattern("^\\s*|\\s*$", false), Ok(()));
    assert_eq!(validator.validate_pattern("[\\d][\\12-\\14]{1,}[^\\d]", false), Ok(()));
    assert_eq!(validator.validate_pattern("([a ]\\b)*\\b", false), Ok(()));
    assert_eq!(validator.validate_pattern("foo", true), Ok(()));
    assert_eq!(validator.validate_pattern("foo|bar", true), Ok(()));
    assert_eq!(validator.validate_pattern("||||", true), Ok(()));
    assert_eq!(validator.validate_pattern("^|$|\\b|\\B", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?=)", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?=foo)", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?!)", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?!foo)", true), Ok(()));
    assert_eq!(validator.validate_pattern("a*", true), Ok(()));
    assert_eq!(validator.validate_pattern("a+", true), Ok(()));
    assert_eq!(validator.validate_pattern("a?", true), Ok(()));
    assert_eq!(validator.validate_pattern("a{1}", true), Ok(()));
    assert_eq!(validator.validate_pattern("a{1,}", true), Ok(()));
    assert_eq!(validator.validate_pattern("a{1,2}", true), Ok(()));
    assert_eq!(validator.validate_pattern("a*?", true), Ok(()));
    assert_eq!(validator.validate_pattern("a+?", true), Ok(()));
    assert_eq!(validator.validate_pattern("a??", true), Ok(()));
    assert_eq!(validator.validate_pattern("a{1}?", true), Ok(()));
    assert_eq!(validator.validate_pattern("a{1,}?", true), Ok(()));
    assert_eq!(validator.validate_pattern("a{1,2}?", true), Ok(()));
    assert_eq!(validator.validate_pattern("👍🚀❇️", true), Ok(()));
    assert_eq!(validator.validate_pattern("^", true), Ok(()));
    assert_eq!(validator.validate_pattern("$", true), Ok(()));
    assert_eq!(validator.validate_pattern(".", true), Ok(()));
    assert_eq!(validator.validate_pattern("|", true), Ok(()));
    assert_eq!(validator.validate_pattern("(a)\\1", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\1(a)", true), Ok(()));
    assert_eq!(validator.validate_pattern("(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)\\10", true), Ok(()));
    assert_eq!(validator.validate_pattern("(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)\\11", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?:a)", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\d", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\D", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\s", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\S", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\w", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\W", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\f", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\n", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\r", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\t", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\v", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\cA", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\cz", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\0", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\u1234", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\u12345", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\u{a}", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\u{20}", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\u{10FFFF}", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\u{00000001}", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\^", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\$", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\.", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\+", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\?", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\(", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\)", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\[", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\]", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\{", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\}", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\|", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\/", true), Ok(()));
    assert_eq!(validator.validate_pattern("[]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[^-a-b-]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[-]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[a]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[--]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[-a]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[-a-]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[a-]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[a-b]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[-a-b-]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[---]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[a-b--/]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\b-\\n]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[b\\-a]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\d]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\D]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\s]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\S]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\w]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\W]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\f]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\n]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\r]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\t]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\v]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\cA]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\cz]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\0]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\x12]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\x123]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u1234]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u12345]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u{a}]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u{20}]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u{10FFFF}]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u{00000001}]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\^]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\$]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\.]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\+]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\?]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\(]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\)]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\[]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\]]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\{]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\}]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\|]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\/]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u0000-\\u0001]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u{1}-\\u{2}]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[0-9--/]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[🌷-🌸]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u0000-🌸-\\u0000]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u0000-\\u{1f338}-\\u0000]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\u0000-\\ud83c\\udf38-\\u0000]", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\uD834\\uDF06-\\uD834\\uDF08a-z]", true), Ok(()));
    assert_eq!(validator.validate_pattern("^[0-9]*$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^[0-9]+$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^[a-zA-Z]*$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^[a-zA-Z]+$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^[0-9a-zA-Z]*$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^[a-zA-Z0-9!-/:-@\\[-`{-~]*$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^([a-zA-Z0-9]{8,})$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^([a-zA-Z0-9]{6,8})$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^([0-9]{0,8})$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^[0-9]{8}$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^https?:\\/\\/", true), Ok(()));
    assert_eq!(validator.validate_pattern("^\\d{3}-\\d{4}$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^\\d{1,3}(.\\d{1,3}){3}$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^([1-9][0-9]*|0)(\\.[0-9]+)?$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^-?([1-9][0-9]*|0)(\\.[0-9]+)?$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^[ぁ-んー]*$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^[ァ-ンヴー]*$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^[ァ-ン゙゚\\-]*$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^[^\\x20-\\x7e]*$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^((4\\d{3})|(5[1-5]\\d{2})|(6011))([- ])?\\d{4}([- ])?\\d{4}([- ])?\\d{4}|3[4,7]\\d{13}$", true), Ok(()));
    assert_eq!(validator.validate_pattern("^\\s*|\\s*$", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<=a)", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?<=a)", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<!a)", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?<!a)", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<=(?<a>\\w){3})f", true), Ok(()));
    assert_eq!(validator.validate_pattern("((?<=\\w{3}))f", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<a>(?<=\\w{3}))f", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<!(?<a>\\d){3})f", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<!(?<a>\\D){3})f|f", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<a>(?<!\\D{3}))f|f", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<=(?<a>\\w){3})f", false), Ok(()));
    assert_eq!(validator.validate_pattern("((?<=\\w{3}))f", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?<a>(?<=\\w{3}))f", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?<!(?<a>\\d){3})f", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?<a>(?<!\\D{3}))f|f", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?<=(?<fst>.)|(?<snd>.))", true), Ok(()));
    assert_eq!(validator.validate_pattern("(a)", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?<a>)", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\k", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\k<a>", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?<a>a)\\k<a>", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?<a>a)\\k<a>", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<a>a)\\1", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?<a>a)\\1", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<a>a)\\2", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?<a>a)(?<b>a)", false), Ok(()));
    assert_eq!(validator.validate_pattern("(?<a>a)(?<b>a)", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\k<a>(?<a>a)", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\k<a>(?<a>a)", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\1(?<a>a)", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\1(?<a>a)", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<$abc>a)\\k<$abc>", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<あ>a)\\k<あ>", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<𠮷>a)\\k<\\u{20bb7}>", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<\\uD842\\uDFB7>a)\\k<\\u{20bb7}>", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<\\u{20bb7}>a)\\k<\\uD842\\uDFB7>", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<abc>a)\\k<\\u0061\\u0062\\u0063>", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<\\u0061\\u0062\\u0063>a)\\k<abc>", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<\\u0061\\u0062\\u0063>a)\\k<\\u{61}\\u{62}\\u{63}>", true), Ok(()));
    assert_eq!(validator.validate_pattern("(?<a1>a)\\k<a1>", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\p", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\p{", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\p{ASCII", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\p{ASCII}", false), Ok(()));
    assert_eq!(validator.validate_pattern("\\p{ASCII}", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\p{Emoji}", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\p{General_Category=Letter}", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\p{Script=Hiragana}", true), Ok(()));
    assert_eq!(validator.validate_pattern("[\\p{Script=Hiragana}\\-\\p{Script=Katakana}]", true), Ok(()));
    assert_eq!(validator.validate_pattern("\\P{Letter}", true), Ok(()));
}