Adding RegexInlineRouteConstraint

This commit is contained in:
harshgMSFT 2014-08-11 18:57:16 -07:00
parent b9baae4693
commit 70402c8f2c
7 changed files with 126 additions and 1 deletions

View File

@ -0,0 +1,20 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.AspNet.Routing.Constraints
{
/// <summary>
/// Represents a regex constraint which can be used as an inlineConstraint.
/// </summary>
public class RegexInlineRouteConstraint : RegexRouteConstraint
{
/// <summary>
/// Initializes a new instance of the <see cref="RegexInlineRouteConstraint" /> class.
/// </summary>
/// <param name="regexPattern">The regular expression pattern to match.</param>
public RegexInlineRouteConstraint([NotNull] string regexPattern)
: base(regexPattern)
{
}
}
}

View File

@ -16,5 +16,6 @@
<PropertyGroup>
<SchemaVersion>2.0</SchemaVersion>
</PropertyGroup>
<Compile Include="Constraints\RegexInlineRouteConstraint.cs" />
<Import Project="$(VSToolsPath)\AspNet\Microsoft.Web.AspNet.targets" Condition="'$(VSToolsPath)' != ''" />
</Project>

View File

@ -56,6 +56,7 @@ namespace Microsoft.AspNet.Routing
// Regex-based constraints
{ "alpha", typeof(AlphaRouteConstraint) },
{ "regex", typeof(RegexInlineRouteConstraint) },
};
}
}

View File

@ -0,0 +1,91 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#if NET45
using System.Globalization;
using System.Threading;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Routing.Constraints;
using Moq;
using Xunit;
namespace Microsoft.AspNet.Routing.Tests
{
public class RegexInlineRouteConstraintTests
{
[Theory]
[InlineData("abc", "abc", true)] // simple match
[InlineData("Abc", "abc", true)] // case insensitive match
[InlineData("Abc ", "abc", true)] // Extra space on input match (because we don't add ^({0})$
[InlineData("Abcd", "abc", true)] // Extra char
[InlineData("^Abcd", "abc", true)] // Extra special char
[InlineData("Abc", " abc", false)] // Missing char
public void RegexInlineConstraintBuildRegexVerbatimFromInput(string routeValue,
string constraintValue,
bool shouldMatch)
{
// Arrange
var constraint = new RegexInlineRouteConstraint(constraintValue);
var values = new RouteValueDictionary(new {controller = routeValue});
// Assert
Assert.Equal(shouldMatch, EasyMatch(constraint, "controller", values));
}
[Fact]
public void RegexInlineConstraint_FailsIfKeyIsNotFoundInRouteValues()
{
// Arrange
var constraint = new RegexInlineRouteConstraint("^abc$");
var values = new RouteValueDictionary(new { action = "abc" });
// Assert
Assert.False(EasyMatch(constraint, "controller", values));
}
[Fact]
public void RegexInlineConstraint_IsCultureInsensitive()
{
// Arrange
var constraint = new RegexInlineRouteConstraint("^([a-z]+)$");
var values = new RouteValueDictionary(new { controller = "\u0130" }); // Turkish upper-case dotted I
var currentThread = Thread.CurrentThread;
var backupCulture = currentThread.CurrentCulture;
bool matchInTurkish;
bool matchInUsEnglish;
// Act
try
{
currentThread.CurrentCulture = new CultureInfo("tr-TR"); // Turkish culture
matchInTurkish = EasyMatch(constraint, "controller", values);
currentThread.CurrentCulture = new CultureInfo("en-US");
matchInUsEnglish = EasyMatch(constraint, "controller", values);
}
finally
{
currentThread.CurrentCulture = backupCulture;
}
// Assert
Assert.False(matchInUsEnglish); // this just verifies the test
Assert.False(matchInTurkish);
}
private static bool EasyMatch(IRouteConstraint constraint,
string routeKey,
RouteValueDictionary values)
{
return constraint.Match(httpContext: new Mock<HttpContext>().Object,
route: new Mock<IRouter>().Object,
routeKey: routeKey,
values: values,
routeDirection: RouteDirection.IncomingRequest);
}
}
}
#endif

View File

@ -13,7 +13,7 @@ using Xunit;
namespace Microsoft.AspNet.Routing.Tests
{
public class RegexConstraintTests
public class RegexRouteConstraintTests
{
[Theory]
[InlineData("abc", "abc", true)] // simple match

View File

@ -42,6 +42,7 @@ namespace Microsoft.AspNet.Routing.Tests
" with the following number of parameters: 1.",
ex.Message);
}
[Fact]
public void ResolveConstraint_AlphaConstraint()
{
@ -52,6 +53,16 @@ namespace Microsoft.AspNet.Routing.Tests
Assert.IsType<AlphaRouteConstraint>(constraint);
}
[Fact]
public void ResolveConstraint_RegexInlineConstraint_WithAComma_PassesAsASingleArgument()
{
// Arrange & Act
var constraint = _constraintResolver.ResolveConstraint("regex(ab,1)");
// Assert
Assert.IsType<RegexInlineRouteConstraint>(constraint);
}
[Fact]
public void ResolveConstraint_BoolConstraint()
{

View File

@ -16,5 +16,6 @@
<PropertyGroup>
<SchemaVersion>2.0</SchemaVersion>
</PropertyGroup>
<Import Project="$(VSToolsPath)\AspNet\Microsoft.Web.AspNet.targets" Condition="'$(VSToolsPath)' != ''" />
</Project>