Skip to content

Commit 73bd1c5

Browse files
committed
Adds starts-i, ends-i, and starts-chars aliases for consistency.
1 parent c41bc3c commit 73bd1c5

File tree

2 files changed

+67
-47
lines changed

2 files changed

+67
-47
lines changed

src/Imazen.Routing/Matching/StringCondition.cs

+3
Original file line numberDiff line numberDiff line change
@@ -600,7 +600,10 @@ internal static string NormalizeAliases(string name)
600600
"eq" => "equals",
601601
"" => "equals",
602602
"starts" => "starts-with",
603+
"starts-chars" => "starts-with-chars",
604+
"starts-i" => "starts-with-i",
603605
"ends" => "ends-with",
606+
"ends-i" => "ends-with-i",
604607
"includes" => "contains",
605608
"includes-i" => "contains-i",
606609
"image-extension-supported" => "image-ext-supported",

tests/ImazenShared.Tests/Routing/Matching/MatchExpressionTests.cs

+64-47
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public void TestAll(bool s, string expr, params string[] inputs)
6262
}
6363
}
6464
[Theory]
65-
[InlineData("/{name:ends-with(y)}", "/cody", "name=cody")]
65+
[InlineData("/{name:ends(y)}", "/cody", "name=cody")]
6666
// ints
6767
[InlineData("{:int}", "123", "int=123")]
6868
[InlineData("{:int}", "-123", "int=-123")]
@@ -109,44 +109,44 @@ public void TestCaptures(string expr, string input, string? expectedCaptures)
109109

110110
}
111111
[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)]
115115
[InlineData("{name:prefix(foo):suffix(bar)}", true)]
116116
[InlineData("prefix(foo){name}suffix(bar)", true)]
117117
[InlineData("{name:len(5):alpha()}", true)]
118118
[InlineData("{name:alpha():length(5,10)}", true)]
119119
[InlineData("{name:len(5)}", true)]
120120
[InlineData("{name:equals(foo):equals(bar)}", false)]
121121
[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)]
125125
[InlineData("{?}", true)]
126126
[InlineData("{*}", true)]
127127
[InlineData("{:?}", true)]
128128
[InlineData("{name:?}", true)]
129129
[InlineData("{name:int32}", true)]
130130
[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)]
135135
[InlineData("{name:prefix(foo):?}", true)]
136136
[InlineData("{name:suffix(bar)}", true)]
137137
[InlineData("{name:suffix(bar):?}", true)]
138-
[InlineData("{name:ends-with(bar):?}", true)]
138+
[InlineData("{name:ends(bar):?}", true)]
139139
[InlineData("{name:contains(foo)}", true)]
140140
[InlineData("{name:contains(foo):?}", true)]
141141
[InlineData("{name:contains-i(foo)}", true)]
142142
[InlineData("{name:contains-i(foo):?}", true)]
143143
[InlineData("{name:equals(foo):?}", true)]
144144
[InlineData("{name:equals-i(foo)}", true)]
145145
[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)]
150150
[InlineData("{name:len(5,10)}", true)]
151151
[InlineData("{name:len(5,10):?}", true)]
152152
[InlineData("{name:length(,5)}", true)]
@@ -173,14 +173,14 @@ public void TestCaptures(string expr, string input, string? expectedCaptures)
173173
[InlineData("{name:equals(foo|bar|baz):?}", true)]
174174
[InlineData("{name:equals-i(foo|bar|baz)}", true)]
175175
[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)]
184184
[InlineData("{name:contains(foo|bar|baz)}", true)]
185185
[InlineData("{name:contains(foo|bar|baz):?}", true)]
186186
[InlineData("{name:contains-i(foo|bar|baz)}", true)]
@@ -191,36 +191,53 @@ public void TestCaptures(string expr, string input, string? expectedCaptures)
191191
[InlineData("{name:image-ext-supported:?}", true)]
192192
[InlineData("{name:allowed-chars([a-zA-Z0-9_\\-])}", true)]
193193
[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)]
217217
// Ensure that they won't parse if we use any aliases or conditions as names
218218
[InlineData("{int}", false)]
219219
[InlineData("{uint}", false)]
220220
[InlineData("{alpha}", false)]
221221
[InlineData("{alphanumeric}", false)]
222222
[InlineData("{hex}", false)]
223223
[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)]
224241
public void TestMatchExpressionParsing(string expression, bool shouldParse)
225242
{
226243
var context = MatchingContext.DefaultCaseInsensitive;

0 commit comments

Comments
 (0)