@@ -7,6 +7,90 @@ extern crate regexpp_rs;
7
7
8
8
use regexpp_rs:: { EcmaRegexValidator , EcmaVersion } ;
9
9
10
+ #[ test]
11
+ fn basic_invalid ( ) {
12
+ // source: https://github.com/mysticatea/regexpp/blob/master/test/fixtures/parser/literal/basic-invalid.json
13
+ let mut validator = EcmaRegexValidator :: new ( EcmaVersion :: ES5 ) ;
14
+ assert_ne ! ( validator. validate_pattern( "(" , false ) , Ok ( ( ) ) ) ;
15
+ assert_ne ! ( validator. validate_pattern( "(?" , false ) , Ok ( ( ) ) ) ;
16
+ assert_ne ! ( validator. validate_pattern( "(?=" , false ) , Ok ( ( ) ) ) ;
17
+ assert_ne ! ( validator. validate_pattern( "(?=foo" , false ) , Ok ( ( ) ) ) ;
18
+ assert_ne ! ( validator. validate_pattern( "(?!" , false ) , Ok ( ( ) ) ) ;
19
+ assert_ne ! ( validator. validate_pattern( "(?!foo" , false ) , Ok ( ( ) ) ) ;
20
+ assert_ne ! ( validator. validate_pattern( "a{2,1}" , false ) , Ok ( ( ) ) ) ;
21
+ assert_ne ! ( validator. validate_pattern( "(a{2,1}" , false ) , Ok ( ( ) ) ) ;
22
+ assert_ne ! ( validator. validate_pattern( "a{2,1}?" , false ) , Ok ( ( ) ) ) ;
23
+ assert_ne ! ( validator. validate_pattern( "(*)" , false ) , Ok ( ( ) ) ) ;
24
+ assert_ne ! ( validator. validate_pattern( "+" , false ) , Ok ( ( ) ) ) ;
25
+ assert_ne ! ( validator. validate_pattern( "?" , false ) , Ok ( ( ) ) ) ;
26
+ assert_ne ! ( validator. validate_pattern( ")" , false ) , Ok ( ( ) ) ) ;
27
+ assert_ne ! ( validator. validate_pattern( "[" , false ) , Ok ( ( ) ) ) ;
28
+ assert_ne ! ( validator. validate_pattern( "^*" , false ) , Ok ( ( ) ) ) ;
29
+ assert_ne ! ( validator. validate_pattern( "$*" , false ) , Ok ( ( ) ) ) ;
30
+ assert_ne ! ( validator. validate_pattern( "${1,2}" , false ) , Ok ( ( ) ) ) ;
31
+ assert_ne ! ( validator. validate_pattern( "${2,1}" , false ) , Ok ( ( ) ) ) ;
32
+ assert_ne ! ( validator. validate_pattern( "\\ 2(a)(" , false ) , Ok ( ( ) ) ) ;
33
+ assert_ne ! ( validator. validate_pattern( "(?a" , false ) , Ok ( ( ) ) ) ;
34
+ assert_ne ! ( validator. validate_pattern( "(?a)" , false ) , Ok ( ( ) ) ) ;
35
+ assert_ne ! ( validator. validate_pattern( "(?:" , false ) , Ok ( ( ) ) ) ;
36
+ assert_ne ! ( validator. validate_pattern( "(?:a" , false ) , Ok ( ( ) ) ) ;
37
+ assert_ne ! ( validator. validate_pattern( "(:a" , false ) , Ok ( ( ) ) ) ;
38
+ assert_ne ! ( validator. validate_pattern( "[b-a]" , false ) , Ok ( ( ) ) ) ;
39
+ assert_ne ! ( validator. validate_pattern( "[a-b--+]" , false ) , Ok ( ( ) ) ) ;
40
+ assert_ne ! ( validator. validate_pattern( "[\\ u0001-\\ u0000]" , false ) , Ok ( ( ) ) ) ;
41
+ assert_ne ! ( validator. validate_pattern( "[\\ u{1}-\\ u{2}]" , false ) , Ok ( ( ) ) ) ;
42
+ assert_ne ! ( validator. validate_pattern( "[\\ u{2}-\\ u{1}]" , false ) , Ok ( ( ) ) ) ;
43
+ assert_ne ! ( validator. validate_pattern( "[\\ z-\\ a]" , false ) , Ok ( ( ) ) ) ;
44
+ assert_ne ! ( validator. validate_pattern( "[0-9--+]" , false ) , Ok ( ( ) ) ) ;
45
+ assert_ne ! ( validator. validate_pattern( "[\\ c-a]" , false ) , Ok ( ( ) ) ) ;
46
+ assert_ne ! ( validator. validate_pattern( "[🌷-🌸]" , false ) , Ok ( ( ) ) ) ;
47
+ assert_ne ! ( validator. validate_pattern( "[🌸-🌷]" , false ) , Ok ( ( ) ) ) ;
48
+ assert_ne ! ( validator. validate_pattern( "[\\ uD834\\ uDF06-\\ uD834\\ uDF08a-z]" , false ) , Ok ( ( ) ) ) ;
49
+ }
50
+
51
+ #[ test]
52
+ fn basic_invalid_2015 ( ) {
53
+ // source: https://github.com/mysticatea/regexpp/blob/master/test/fixtures/parser/literal/basic-invalid-2015.json
54
+ let mut validator = EcmaRegexValidator :: new ( EcmaVersion :: ES2015 ) ;
55
+ assert_ne ! ( validator. validate_pattern( "(" , false ) , Ok ( ( ) ) ) ;
56
+ assert_ne ! ( validator. validate_pattern( "(?" , false ) , Ok ( ( ) ) ) ;
57
+ assert_ne ! ( validator. validate_pattern( "(?=" , false ) , Ok ( ( ) ) ) ;
58
+ assert_ne ! ( validator. validate_pattern( "(?=foo" , false ) , Ok ( ( ) ) ) ;
59
+ assert_ne ! ( validator. validate_pattern( "(?!" , false ) , Ok ( ( ) ) ) ;
60
+ assert_ne ! ( validator. validate_pattern( "(?!foo" , false ) , Ok ( ( ) ) ) ;
61
+ assert_ne ! ( validator. validate_pattern( "a{2,1}" , false ) , Ok ( ( ) ) ) ;
62
+ assert_ne ! ( validator. validate_pattern( "(a{2,1}" , false ) , Ok ( ( ) ) ) ;
63
+ assert_ne ! ( validator. validate_pattern( "a{2,1}?" , false ) , Ok ( ( ) ) ) ;
64
+ assert_ne ! ( validator. validate_pattern( "(*)" , false ) , Ok ( ( ) ) ) ;
65
+ assert_ne ! ( validator. validate_pattern( "+" , false ) , Ok ( ( ) ) ) ;
66
+ assert_ne ! ( validator. validate_pattern( "?" , false ) , Ok ( ( ) ) ) ;
67
+ assert_ne ! ( validator. validate_pattern( ")" , false ) , Ok ( ( ) ) ) ;
68
+ assert_ne ! ( validator. validate_pattern( "[" , false ) , Ok ( ( ) ) ) ;
69
+ assert_ne ! ( validator. validate_pattern( "^*" , false ) , Ok ( ( ) ) ) ;
70
+ assert_ne ! ( validator. validate_pattern( "$*" , false ) , Ok ( ( ) ) ) ;
71
+ assert_ne ! ( validator. validate_pattern( "${1,2}" , false ) , Ok ( ( ) ) ) ;
72
+ assert_ne ! ( validator. validate_pattern( "${2,1}" , false ) , Ok ( ( ) ) ) ;
73
+ assert_ne ! ( validator. validate_pattern( "\\ 2(a)(" , false ) , Ok ( ( ) ) ) ;
74
+ assert_ne ! ( validator. validate_pattern( "(?a" , false ) , Ok ( ( ) ) ) ;
75
+ assert_ne ! ( validator. validate_pattern( "(?a)" , false ) , Ok ( ( ) ) ) ;
76
+ assert_ne ! ( validator. validate_pattern( "(?:" , false ) , Ok ( ( ) ) ) ;
77
+ assert_ne ! ( validator. validate_pattern( "(?:a" , false ) , Ok ( ( ) ) ) ;
78
+ assert_ne ! ( validator. validate_pattern( "(:a" , false ) , Ok ( ( ) ) ) ;
79
+ assert_ne ! ( validator. validate_pattern( "[b-a]" , false ) , Ok ( ( ) ) ) ;
80
+ assert_ne ! ( validator. validate_pattern( "[a-b--+]" , false ) , Ok ( ( ) ) ) ;
81
+ assert_ne ! ( validator. validate_pattern( "[\\ u0001-\\ u0000]" , false ) , Ok ( ( ) ) ) ;
82
+ assert_ne ! ( validator. validate_pattern( "[\\ u{1}-\\ u{2}]" , false ) , Ok ( ( ) ) ) ;
83
+ assert_ne ! ( validator. validate_pattern( "[\\ u{2}-\\ u{1}]" , false ) , Ok ( ( ) ) ) ;
84
+ assert_ne ! ( validator. validate_pattern( "[\\ z-\\ a]" , false ) , Ok ( ( ) ) ) ;
85
+ assert_ne ! ( validator. validate_pattern( "[0-9--+]" , false ) , Ok ( ( ) ) ) ;
86
+ assert_ne ! ( validator. validate_pattern( "[\\ c-a]" , false ) , Ok ( ( ) ) ) ;
87
+ assert_ne ! ( validator. validate_pattern( "[🌷-🌸]" , false ) , Ok ( ( ) ) ) ;
88
+ assert_ne ! ( validator. validate_pattern( "[\\ u0000-🌸-\\ u0000]" , false ) , Ok ( ( ) ) ) ;
89
+ assert_ne ! ( validator. validate_pattern( "[\\ u0000-\\ ud83c\\ udf38-\\ u0000]" , false ) , Ok ( ( ) ) ) ;
90
+ assert_ne ! ( validator. validate_pattern( "[🌸-🌷]" , false ) , Ok ( ( ) ) ) ;
91
+ assert_ne ! ( validator. validate_pattern( "[\\ uD834\\ uDF06-\\ uD834\\ uDF08a-z]" , false ) , Ok ( ( ) ) ) ;
92
+ }
93
+
10
94
#[ test]
11
95
fn basic_invalid_2015_unicode ( ) {
12
96
// source: https://github.com/mysticatea/regexpp/blob/master/test/fixtures/parser/literal/basic-invalid-2015-u.json
@@ -124,6 +208,18 @@ fn basic_invalid_2015_unicode() {
124
208
assert_ne ! ( validator. validate_pattern( "[\\ d][\\ 12-\\ 14]{1,}[^\\ d]" , true ) , Ok ( ( ) ) ) ;
125
209
}
126
210
211
+ #[ test]
212
+ fn lookbehind_assertion_invalid_2017 ( ) {
213
+ // source: https://github.com/mysticatea/regexpp/blob/master/test/fixtures/parser/literal/lookbehind-assertion-invalid-2017.json
214
+ let mut validator = EcmaRegexValidator :: new ( EcmaVersion :: ES2017 ) ;
215
+ assert_ne ! ( validator. validate_pattern( "(?<a)" , false ) , Ok ( ( ) ) ) ;
216
+ assert_ne ! ( validator. validate_pattern( "(?<a)" , true ) , Ok ( ( ) ) ) ;
217
+ assert_ne ! ( validator. validate_pattern( "(?<=a)" , false ) , Ok ( ( ) ) ) ;
218
+ assert_ne ! ( validator. validate_pattern( "(?<=a)" , true ) , Ok ( ( ) ) ) ;
219
+ assert_ne ! ( validator. validate_pattern( "(?<!a)" , false ) , Ok ( ( ) ) ) ;
220
+ assert_ne ! ( validator. validate_pattern( "(?<!a)" , true ) , Ok ( ( ) ) ) ;
221
+ }
222
+
127
223
#[ test]
128
224
fn lookbehind_assertion_invalid_2018 ( ) {
129
225
// source: https://github.com/mysticatea/regexpp/blob/master/test/fixtures/parser/literal/lookbehind-assertion-invalid-2018.json
@@ -148,6 +244,20 @@ fn lookbehind_assertion_invalid_2018() {
148
244
assert_ne ! ( validator. validate_pattern( "(?<!a){1}" , true ) , Ok ( ( ) ) ) ;
149
245
}
150
246
247
+ #[ test]
248
+ fn named_capturing_group_invalid_2017 ( ) {
249
+ // source: https://github.com/mysticatea/regexpp/blob/master/test/fixtures/parser/literal/named-capturing-group-invalid-2017.json
250
+ let mut validator = EcmaRegexValidator :: new ( EcmaVersion :: ES2017 ) ;
251
+ assert_ne ! ( validator. validate_pattern( "\\ k" , true ) , Ok ( ( ) ) ) ;
252
+ assert_ne ! ( validator. validate_pattern( "\\ k<a>" , true ) , Ok ( ( ) ) ) ;
253
+ assert_ne ! ( validator. validate_pattern( "(?<a>a)\\ k<" , false ) , Ok ( ( ) ) ) ;
254
+ assert_ne ! ( validator. validate_pattern( "(?<a>a)\\ k<" , true ) , Ok ( ( ) ) ) ;
255
+ assert_ne ! ( validator. validate_pattern( "(?<a>a)\\ k<a" , false ) , Ok ( ( ) ) ) ;
256
+ assert_ne ! ( validator. validate_pattern( "(?<a>a)\\ k<a" , true ) , Ok ( ( ) ) ) ;
257
+ assert_ne ! ( validator. validate_pattern( "(?<a>a)\\ k<a>" , false ) , Ok ( ( ) ) ) ;
258
+ assert_ne ! ( validator. validate_pattern( "(?<a>a)\\ k<a>" , true ) , Ok ( ( ) ) ) ;
259
+ }
260
+
151
261
#[ test]
152
262
fn named_capturing_group_invalid_2018 ( ) {
153
263
// source: https://github.com/mysticatea/regexpp/blob/master/test/fixtures/parser/literal/named-capturing-group-invalid-2018.json
@@ -175,3 +285,41 @@ fn named_capturing_group_invalid_2018() {
175
285
assert_ne ! ( validator. validate_pattern( "(?<\\ u0061\\ u0062\\ u0063>a)\\ k<abd>" , true ) , Ok ( ( ) ) ) ;
176
286
assert_ne ! ( validator. validate_pattern( "(?<11>a)\\ k<11>" , true ) , Ok ( ( ) ) ) ;
177
287
}
288
+
289
+ #[ test]
290
+ fn unicode_group_names_invalid_2020 ( ) {
291
+ // source: https://github.com/mysticatea/regexpp/blob/master/test/fixtures/parser/literal/unicode-group-names-invalid.json
292
+ let mut validator = EcmaRegexValidator :: new ( EcmaVersion :: ES2020 ) ;
293
+ assert_ne ! ( validator. validate_pattern( "(?<\\ ud83d\\ ude80>.)" , false ) , Ok ( ( ) ) ) ;
294
+ assert_ne ! ( validator. validate_pattern( "(?<\\ ud83d\\ ude80>.)" , true ) , Ok ( ( ) ) ) ;
295
+ assert_ne ! ( validator. validate_pattern( "(?<\\ u{1f680}>.)" , false ) , Ok ( ( ) ) ) ;
296
+ assert_ne ! ( validator. validate_pattern( "(?<\\ u{1f680}>.)" , true ) , Ok ( ( ) ) ) ;
297
+ assert_ne ! ( validator. validate_pattern( "(?<🚀>.)" , false ) , Ok ( ( ) ) ) ;
298
+ assert_ne ! ( validator. validate_pattern( "(?<🚀>.)" , true ) , Ok ( ( ) ) ) ;
299
+ }
300
+
301
+ #[ test]
302
+ fn unicode_property_escape_invalid_2017 ( ) {
303
+ // source: https://github.com/mysticatea/regexpp/blob/master/test/fixtures/parser/literal/unicode-property-escape-invalid-2017.json
304
+ let mut validator = EcmaRegexValidator :: new ( EcmaVersion :: ES2017 ) ;
305
+ assert_ne ! ( validator. validate_pattern( "\\ p" , true ) , Ok ( ( ) ) ) ;
306
+ assert_ne ! ( validator. validate_pattern( "\\ p{" , true ) , Ok ( ( ) ) ) ;
307
+ assert_ne ! ( validator. validate_pattern( "\\ p{ASCII" , true ) , Ok ( ( ) ) ) ;
308
+ assert_ne ! ( validator. validate_pattern( "\\ p{ASCII}" , true ) , Ok ( ( ) ) ) ;
309
+ }
310
+
311
+ #[ test]
312
+ fn unicode_property_escape_invalid_2018 ( ) {
313
+ // source: https://github.com/mysticatea/regexpp/blob/master/test/fixtures/parser/literal/unicode-property-escape-invalid-2018.json
314
+ let mut validator = EcmaRegexValidator :: new ( EcmaVersion :: ES2018 ) ;
315
+ assert_ne ! ( validator. validate_pattern( "\\ p" , true ) , Ok ( ( ) ) ) ;
316
+ assert_ne ! ( validator. validate_pattern( "\\ p{" , true ) , Ok ( ( ) ) ) ;
317
+ assert_ne ! ( validator. validate_pattern( "\\ p{ASCII" , true ) , Ok ( ( ) ) ) ;
318
+ assert_ne ! ( validator. validate_pattern( "\\ p{General_Category}" , true ) , Ok ( ( ) ) ) ;
319
+ assert_ne ! ( validator. validate_pattern( "\\ p{General_Category=}" , true ) , Ok ( ( ) ) ) ;
320
+ assert_ne ! ( validator. validate_pattern( "\\ p{General_Category" , true ) , Ok ( ( ) ) ) ;
321
+ assert_ne ! ( validator. validate_pattern( "\\ p{General_Category=" , true ) , Ok ( ( ) ) ) ;
322
+ assert_ne ! ( validator. validate_pattern( "\\ p{General_Category=Letter" , true ) , Ok ( ( ) ) ) ;
323
+ assert_ne ! ( validator. validate_pattern( "\\ p{General_Category=Hiragana}" , true ) , Ok ( ( ) ) ) ;
324
+ assert_ne ! ( validator. validate_pattern( "[\\ p{Script=Hiragana}-\\ p{Script=Katakana}]" , true ) , Ok ( ( ) ) ) ;
325
+ }
0 commit comments