@@ -62,7 +62,7 @@ public void TestAll(bool s, string expr, params string[] inputs)
62
62
}
63
63
}
64
64
[ Theory ]
65
- [ InlineData ( "/{name:ends-with (y)}" , "/cody" , "name=cody" ) ]
65
+ [ InlineData ( "/{name:ends(y)}" , "/cody" , "name=cody" ) ]
66
66
// ints
67
67
[ InlineData ( "{:int}" , "123" , "int=123" ) ]
68
68
[ InlineData ( "{:int}" , "-123" , "int=-123" ) ]
@@ -109,44 +109,44 @@ public void TestCaptures(string expr, string input, string? expectedCaptures)
109
109
110
110
}
111
111
[ Theory ]
112
- [ InlineData ( "{name:starts-with (foo):ends-with (bar)?}" , false ) ]
113
- [ InlineData ( "{name:starts-with (foo):ends-with (bar)}" , true ) ]
114
- [ InlineData ( "{name:starts-with (foo):?}" , true ) ]
112
+ [ InlineData ( "{name:starts(foo):ends(bar)?}" , false ) ]
113
+ [ InlineData ( "{name:starts(foo):ends(bar)}" , true ) ]
114
+ [ InlineData ( "{name:starts(foo):?}" , true ) ]
115
115
[ InlineData ( "{name:prefix(foo):suffix(bar)}" , true ) ]
116
116
[ InlineData ( "prefix(foo){name}suffix(bar)" , true ) ]
117
117
[ InlineData ( "{name:len(5):alpha()}" , true ) ]
118
118
[ InlineData ( "{name:alpha():length(5,10)}" , true ) ]
119
119
[ InlineData ( "{name:len(5)}" , true ) ]
120
120
[ InlineData ( "{name:equals(foo):equals(bar)}" , false ) ]
121
121
[ InlineData ( "{name:equals(foo|bar)}" , true ) ]
122
- [ InlineData ( "{name:starts-with (foo)}suffix(bar)" , true ) ] //suffix(bar) will be seen as a literal
123
- [ InlineData ( "{name:starts-with (foo)}/suffix(bar)" , true ) ]
124
- [ InlineData ( "{name:starts-with (foo)}:ends-with (baz)suffix(bar)" , true ) ]
122
+ [ InlineData ( "{name:starts(foo)}suffix(bar)" , true ) ] //suffix(bar) will be seen as a literal
123
+ [ InlineData ( "{name:starts(foo)}/suffix(bar)" , true ) ]
124
+ [ InlineData ( "{name:starts(foo)}:ends(baz)suffix(bar)" , true ) ]
125
125
[ InlineData ( "{?}" , true ) ]
126
126
[ InlineData ( "{*}" , true ) ]
127
127
[ InlineData ( "{:?}" , true ) ]
128
128
[ InlineData ( "{name:?}" , true ) ]
129
129
[ InlineData ( "{name:int32}" , true ) ]
130
130
[ InlineData ( "{name:int32()}" , true ) ]
131
- [ InlineData ( "{name:starts-with (foo}:ends-with (bar)}" , false ) ]
132
- [ InlineData ( "{name:starts-with (foo):ends-with (bar)}{:alpha()}" , true ) ]
133
- [ InlineData ( "{name:starts-with (foo):ends-with (bar)}/{:alpha()}" , true ) ]
134
- [ InlineData ( "{name:starts-with (foo)}{:ends-with (bar):alpha()}" , false ) ]
131
+ [ InlineData ( "{name:starts(foo}:ends(bar)}" , false ) ]
132
+ [ InlineData ( "{name:starts(foo):ends(bar)}{:alpha()}" , true ) ]
133
+ [ InlineData ( "{name:starts(foo):ends(bar)}/{:alpha()}" , true ) ]
134
+ [ InlineData ( "{name:starts(foo)}{:ends(bar):alpha()}" , false ) ]
135
135
[ InlineData ( "{name:prefix(foo):?}" , true ) ]
136
136
[ InlineData ( "{name:suffix(bar)}" , true ) ]
137
137
[ InlineData ( "{name:suffix(bar):?}" , true ) ]
138
- [ InlineData ( "{name:ends-with (bar):?}" , true ) ]
138
+ [ InlineData ( "{name:ends(bar):?}" , true ) ]
139
139
[ InlineData ( "{name:contains(foo)}" , true ) ]
140
140
[ InlineData ( "{name:contains(foo):?}" , true ) ]
141
141
[ InlineData ( "{name:contains-i(foo)}" , true ) ]
142
142
[ InlineData ( "{name:contains-i(foo):?}" , true ) ]
143
143
[ InlineData ( "{name:equals(foo):?}" , true ) ]
144
144
[ InlineData ( "{name:equals-i(foo)}" , true ) ]
145
145
[ InlineData ( "{name:equals-i(foo):?}" , true ) ]
146
- [ InlineData ( "{name:starts-with- i(foo)}" , true ) ]
147
- [ InlineData ( "{name:starts-with- i(foo):?}" , true ) ]
148
- [ InlineData ( "{name:ends-with- i(bar)}" , true ) ]
149
- [ InlineData ( "{name:ends-with- i(bar):?}" , true ) ]
146
+ [ InlineData ( "{name:starts-i(foo)}" , true ) ]
147
+ [ InlineData ( "{name:starts-i(foo):?}" , true ) ]
148
+ [ InlineData ( "{name:ends-i(bar)}" , true ) ]
149
+ [ InlineData ( "{name:ends-i(bar):?}" , true ) ]
150
150
[ InlineData ( "{name:len(5,10)}" , true ) ]
151
151
[ InlineData ( "{name:len(5,10):?}" , true ) ]
152
152
[ InlineData ( "{name:length(,5)}" , true ) ]
@@ -173,14 +173,14 @@ public void TestCaptures(string expr, string input, string? expectedCaptures)
173
173
[ InlineData ( "{name:equals(foo|bar|baz):?}" , true ) ]
174
174
[ InlineData ( "{name:equals-i(foo|bar|baz)}" , true ) ]
175
175
[ InlineData ( "{name:equals-i(foo|bar|baz):?}" , true ) ]
176
- [ InlineData ( "{name:starts-with (foo|bar|baz)}" , true ) ]
177
- [ InlineData ( "{name:starts-with (foo|bar|baz):?}" , true ) ]
178
- [ InlineData ( "{name:starts-with- i(foo|bar|baz)}" , true ) ]
179
- [ InlineData ( "{name:starts-with- i(foo|bar|baz):?}" , true ) ]
180
- [ InlineData ( "{name:ends-with (foo|bar|baz)}" , true ) ]
181
- [ InlineData ( "{name:ends-with (foo|bar|baz):?}" , true ) ]
182
- [ InlineData ( "{name:ends-with- i(foo|bar|baz)}" , true ) ]
183
- [ InlineData ( "{name:ends-with- i(foo|bar|baz):?}" , true ) ]
176
+ [ InlineData ( "{name:starts(foo|bar|baz)}" , true ) ]
177
+ [ InlineData ( "{name:starts(foo|bar|baz):?}" , true ) ]
178
+ [ InlineData ( "{name:starts-i(foo|bar|baz)}" , true ) ]
179
+ [ InlineData ( "{name:starts-i(foo|bar|baz):?}" , true ) ]
180
+ [ InlineData ( "{name:ends(foo|bar|baz)}" , true ) ]
181
+ [ InlineData ( "{name:ends(foo|bar|baz):?}" , true ) ]
182
+ [ InlineData ( "{name:ends-i(foo|bar|baz)}" , true ) ]
183
+ [ InlineData ( "{name:ends-i(foo|bar|baz):?}" , true ) ]
184
184
[ InlineData ( "{name:contains(foo|bar|baz)}" , true ) ]
185
185
[ InlineData ( "{name:contains(foo|bar|baz):?}" , true ) ]
186
186
[ InlineData ( "{name:contains-i(foo|bar|baz)}" , true ) ]
@@ -191,36 +191,53 @@ public void TestCaptures(string expr, string input, string? expectedCaptures)
191
191
[ InlineData ( "{name:image-ext-supported:?}" , true ) ]
192
192
[ InlineData ( "{name:allowed-chars([a-zA-Z0-9_\\ -])}" , true ) ]
193
193
[ InlineData ( "{name:allowed-chars([a-zA-Z0-9_\\ -]):?}" , true ) ]
194
- [ InlineData ( "{name:starts-with- chars(3,[a-zA-Z])}" , true ) ]
195
- [ InlineData ( "{name:starts-with- chars(3,[a-zA-Z]):?}" , true ) ]
196
- [ InlineData ( "{name:ends-with ([$%^])}" , true ) ]
197
- [ InlineData ( "{name:ends-with ([$%^]):?}" , true ) ]
198
- [ InlineData ( "{name:ends-with- i([$%^])}" , true ) ]
199
- [ InlineData ( "{name:ends-with- i([$%^]):?}" , true ) ]
200
- [ InlineData ( "{name:starts-with ([0-9])}" , true ) ]
201
- [ InlineData ( "{name:starts-with ([0-9]):?}" , true ) ]
202
- [ InlineData ( "{name:starts-with- i([0-9])}" , true ) ]
203
- [ InlineData ( "{name:starts-with- i([0-9]):?}" , true ) ]
204
- [ InlineData ( "{name:starts-with ([aeiouAEIOU])}" , true ) ]
205
- [ InlineData ( "{name:starts-with ([aeiouAEIOU]):?}" , true ) ]
206
- [ InlineData ( "{name:starts-with- i([aeiouAEIOU])}" , true ) ]
207
- [ InlineData ( "{name:starts-with- i([aeiouAEIOU]):?}" , true ) ]
208
- [ InlineData ( "{name:ends-with ([!@#$%^&*])}" , true ) ]
209
- [ InlineData ( "{name:ends-with ([!@#$%^&*]):?}" , true ) ]
210
- [ InlineData ( "{name:ends-with- i([!@#$%^&*])}" , true ) ]
211
- [ InlineData ( "{name:ends-with- i([!@#$%^&*]):?}" , true ) ]
212
- [ InlineData ( "{name:ends-with ([aeiouAEIOU])}" , true ) ]
213
- [ InlineData ( "{name:ends-with ([aeiouAEIOU]):?}" , true ) ]
214
- [ InlineData ( "{name:ends-with- i([aeiouAEIOU])}" , true ) ]
215
- [ InlineData ( "{name:ends-with- i([aeiouAEIOU]):?}" , true ) ]
216
- [ InlineData ( "{name:ends-with- i([aeiouAEIOU]|[a-z]):?}" , false ) ]
194
+ [ InlineData ( "{name:starts-chars(3,[a-zA-Z])}" , true ) ]
195
+ [ InlineData ( "{name:starts-chars(3,[a-zA-Z]):?}" , true ) ]
196
+ [ InlineData ( "{name:ends([$%^])}" , true ) ]
197
+ [ InlineData ( "{name:ends([$%^]):?}" , true ) ]
198
+ [ InlineData ( "{name:ends-i([$%^])}" , true ) ]
199
+ [ InlineData ( "{name:ends-i([$%^]):?}" , true ) ]
200
+ [ InlineData ( "{name:starts([0-9])}" , true ) ]
201
+ [ InlineData ( "{name:starts([0-9]):?}" , true ) ]
202
+ [ InlineData ( "{name:starts-i([0-9])}" , true ) ]
203
+ [ InlineData ( "{name:starts-i([0-9]):?}" , true ) ]
204
+ [ InlineData ( "{name:starts([aeiouAEIOU])}" , true ) ]
205
+ [ InlineData ( "{name:starts([aeiouAEIOU]):?}" , true ) ]
206
+ [ InlineData ( "{name:starts-i([aeiouAEIOU])}" , true ) ]
207
+ [ InlineData ( "{name:starts-i([aeiouAEIOU]):?}" , true ) ]
208
+ [ InlineData ( "{name:ends([!@#$%^&*])}" , true ) ]
209
+ [ InlineData ( "{name:ends([!@#$%^&*]):?}" , true ) ]
210
+ [ InlineData ( "{name:ends-i([!@#$%^&*])}" , true ) ]
211
+ [ InlineData ( "{name:ends-i([!@#$%^&*]):?}" , true ) ]
212
+ [ InlineData ( "{name:ends([aeiouAEIOU])}" , true ) ]
213
+ [ InlineData ( "{name:ends([aeiouAEIOU]):?}" , true ) ]
214
+ [ InlineData ( "{name:ends-i([aeiouAEIOU])}" , true ) ]
215
+ [ InlineData ( "{name:ends-i([aeiouAEIOU]):?}" , true ) ]
216
+ [ InlineData ( "{name:ends-i([aeiouAEIOU]|[a-z]):?}" , false ) ]
217
217
// Ensure that they won't parse if we use any aliases or conditions as names
218
218
[ InlineData ( "{int}" , false ) ]
219
219
[ InlineData ( "{uint}" , false ) ]
220
220
[ InlineData ( "{alpha}" , false ) ]
221
221
[ InlineData ( "{alphanumeric}" , false ) ]
222
222
[ InlineData ( "{hex}" , false ) ]
223
223
[ InlineData ( "{guid}" , false ) ]
224
+ [ InlineData ( "{:guid}" , true ) ]
225
+ [ InlineData ( "{:int}" , true ) ]
226
+ [ InlineData ( "{:u32}" , true ) ]
227
+ [ InlineData ( "{:u64}" , true ) ]
228
+ [ InlineData ( "{:int32}" , true ) ]
229
+ [ InlineData ( "{:int64}" , true ) ]
230
+ [ InlineData ( "{:alpha}" , true ) ]
231
+ [ InlineData ( "{:alpha-lower}" , true ) ]
232
+ [ InlineData ( "{:alpha-upper}" , true ) ]
233
+ [ InlineData ( "{:alphanumeric}" , true ) ]
234
+ [ InlineData ( "{:i32}" , true ) ]
235
+ [ InlineData ( "{:i64}" , true ) ]
236
+ [ InlineData ( "{:(literal)}" , true ) ]
237
+ [ InlineData ( "{:starts-with-i(hi)}" , true ) ]
238
+ [ InlineData ( "{:starts-with(hi)}" , true ) ]
239
+ [ InlineData ( "{:ends-with-i(hi)}" , true ) ]
240
+ [ InlineData ( "{:ends-with(hi)}" , true ) ]
224
241
public void TestMatchExpressionParsing ( string expression , bool shouldParse )
225
242
{
226
243
var context = MatchingContext . DefaultCaseInsensitive ;
0 commit comments