@@ -55,6 +55,8 @@ mod tests {
55
55
assert_eq ! ( validator. validate_pattern( "[abc]de|fg" , true ) , Ok ( ( ) ) ) ;
56
56
assert_eq ! ( validator. validate_pattern( "^.$" , false ) , Ok ( ( ) ) ) ;
57
57
assert_eq ! ( validator. validate_pattern( "^.$" , true ) , Ok ( ( ) ) ) ;
58
+ assert_eq ! ( validator. validate_pattern( "foo\\ [bar" , false ) , Ok ( ( ) ) ) ;
59
+ assert_eq ! ( validator. validate_pattern( "foo\\ [bar" , true ) , Ok ( ( ) ) ) ;
58
60
59
61
assert_ne ! ( validator. validate_pattern( "^[z-a]$" , false ) , Ok ( ( ) ) ) ;
60
62
assert_ne ! ( validator. validate_pattern( "0{2,1}" , false ) , Ok ( ( ) ) ) ;
@@ -107,4 +109,44 @@ mod tests {
107
109
assert_ne ! ( validator. validate_pattern( "{1," , true ) , Ok ( ( ) ) ) ;
108
110
assert_ne ! ( validator. validate_pattern( "{1,2" , true ) , Ok ( ( ) ) ) ;
109
111
}
112
+
113
+ #[ test]
114
+ fn unicode_single_bracket ( ) {
115
+ let mut validator = EcmaRegexValidator :: new ( EcmaVersion :: ES2018 ) ;
116
+ assert_ne ! ( validator. validate_pattern( "(" , true ) , Ok ( ( ) ) ) ;
117
+ assert_ne ! ( validator. validate_pattern( ")" , true ) , Ok ( ( ) ) ) ;
118
+ assert_ne ! ( validator. validate_pattern( "[" , true ) , Ok ( ( ) ) ) ;
119
+ assert_ne ! ( validator. validate_pattern( "]" , true ) , Ok ( ( ) ) ) ;
120
+ assert_ne ! ( validator. validate_pattern( "{" , true ) , Ok ( ( ) ) ) ;
121
+ assert_ne ! ( validator. validate_pattern( "}" , true ) , Ok ( ( ) ) ) ;
122
+ }
123
+
124
+ #[ test]
125
+ fn unicode_escapes ( ) {
126
+ let mut validator = EcmaRegexValidator :: new ( EcmaVersion :: ES2018 ) ;
127
+ assert_eq ! ( validator. validate_pattern( "\\ u{10ffff}" , true ) , Ok ( ( ) ) ) ;
128
+ assert_ne ! ( validator. validate_pattern( "\\ u{110000}" , true ) , Ok ( ( ) ) ) ;
129
+ assert_eq ! ( validator. validate_pattern( "\\ u{110000}" , false ) , Ok ( ( ) ) ) ;
130
+ assert_eq ! ( validator. validate_pattern( "foo\\ ud803\\ ude6dbar" , true ) , Ok ( ( ) ) ) ;
131
+ assert_eq ! ( validator. validate_pattern( "(\u{12345} |\u{23456} ).\\ 1" , true ) , Ok ( ( ) ) ) ;
132
+ assert_eq ! ( validator. validate_pattern( "\u{12345} {3}" , true ) , Ok ( ( ) ) ) ;
133
+
134
+ // unicode escapes in character classes
135
+ assert_eq ! ( validator. validate_pattern( "[\\ u0062-\\ u0066]oo" , false ) , Ok ( ( ) ) ) ;
136
+ assert_eq ! ( validator. validate_pattern( "[\\ u0062-\\ u0066]oo" , true ) , Ok ( ( ) ) ) ;
137
+ assert_eq ! ( validator. validate_pattern( "[\\ u{0062}-\\ u{0066}]oo" , true ) , Ok ( ( ) ) ) ;
138
+ assert_eq ! ( validator. validate_pattern( "[\\ u{62}-\\ u{00000066}]oo" , true ) , Ok ( ( ) ) ) ;
139
+
140
+ // invalid escapes
141
+ assert_eq ! ( validator. validate_pattern( "first\\ u\\ x\\ z\\ 8\\ 9second" , false ) , Ok ( ( ) ) ) ;
142
+ assert_eq ! ( validator. validate_pattern( "[\\ u\\ x\\ z\\ 8\\ 9]" , false ) , Ok ( ( ) ) ) ;
143
+ assert_ne ! ( validator. validate_pattern( "/\\ u/u" , true ) , Ok ( ( ) ) ) ;
144
+ assert_ne ! ( validator. validate_pattern( "/\\ u12/u" , true ) , Ok ( ( ) ) ) ;
145
+ assert_ne ! ( validator. validate_pattern( "/\\ ufoo/u" , true ) , Ok ( ( ) ) ) ;
146
+ assert_ne ! ( validator. validate_pattern( "/\\ x/u" , true ) , Ok ( ( ) ) ) ;
147
+ assert_ne ! ( validator. validate_pattern( "/\\ xfoo/u" , true ) , Ok ( ( ) ) ) ;
148
+ assert_ne ! ( validator. validate_pattern( "/\\ z/u" , true ) , Ok ( ( ) ) ) ;
149
+ assert_ne ! ( validator. validate_pattern( "/\\ 8/u" , true ) , Ok ( ( ) ) ) ;
150
+ assert_ne ! ( validator. validate_pattern( "/\\ 9/u" , true ) , Ok ( ( ) ) ) ;
151
+ }
110
152
}
0 commit comments