diff --git a/src/Microsoft.AspNet.Routing.Abstractions/VirtualPathData.cs b/src/Microsoft.AspNet.Routing.Abstractions/VirtualPathData.cs index 4b056b40..27fa15b6 100644 --- a/src/Microsoft.AspNet.Routing.Abstractions/VirtualPathData.cs +++ b/src/Microsoft.AspNet.Routing.Abstractions/VirtualPathData.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Routing { @@ -13,6 +12,7 @@ namespace Microsoft.AspNet.Routing public class VirtualPathData { private RouteValueDictionary _dataTokens; + private string _virtualPath; /// /// Initializes a new instance of the class. @@ -34,20 +34,6 @@ public VirtualPathData( IRouter router, string virtualPath, RouteValueDictionary dataTokens) - : this(router, CreatePathString(virtualPath), dataTokens) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The object that is used to generate the URL. - /// The generated URL. - /// The collection of custom values. - public VirtualPathData( - IRouter router, - PathString virtualPath, - RouteValueDictionary dataTokens) { if (router == null) { @@ -83,26 +69,31 @@ public RouteValueDictionary DataTokens /// /// Gets or sets the URL that was generated from the . /// - public PathString VirtualPath { get; set; } + public string VirtualPath + { + get + { + return _virtualPath; + } + set + { + _virtualPath = NormalizePath(value); + } + } - private static PathString CreatePathString(string path) + private static string NormalizePath(string path) { - if (!string.IsNullOrEmpty(path)) + if (string.IsNullOrEmpty(path)) { - PathString pathString; - if (path.Length > 0 && !path.StartsWith("/", StringComparison.Ordinal)) - { - pathString = new PathString("/" + path); - } - else - { - pathString = new PathString(path); - } + return string.Empty; + } - return pathString; + if (!path.StartsWith("/", StringComparison.Ordinal)) + { + return "/" + path; } - return PathString.Empty; + return path; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Routing/Internal/UriBuildingContext.cs b/src/Microsoft.AspNet.Routing/Internal/UriBuildingContext.cs index 04e27864..5318915c 100644 --- a/src/Microsoft.AspNet.Routing/Internal/UriBuildingContext.cs +++ b/src/Microsoft.AspNet.Routing/Internal/UriBuildingContext.cs @@ -188,6 +188,12 @@ public void Clear() public override string ToString() { // We can ignore any currently buffered segments - they are are guaranteed to be 'defaults'. + if (_uri.Length > 0 && _uri[0] != '/') + { + // Normalize generated paths so that they always contain a leading slash. + _uri.Insert(0, '/'); + } + return _uri.ToString(); } diff --git a/src/Microsoft.AspNet.Routing/RouteCollection.cs b/src/Microsoft.AspNet.Routing/RouteCollection.cs index f32df734..b2b07612 100644 --- a/src/Microsoft.AspNet.Routing/RouteCollection.cs +++ b/src/Microsoft.AspNet.Routing/RouteCollection.cs @@ -137,7 +137,7 @@ private VirtualPathData NormalizeVirtualPath(VirtualPathData pathData) return pathData; } - var url = pathData.VirtualPath.Value; + var url = pathData.VirtualPath; if (!string.IsNullOrEmpty(url) && (_options.LowercaseUrls || _options.AppendTrailingSlash)) { diff --git a/test/Microsoft.AspNet.Mvc.Routing.Abstractions.Tests/VirtualPathDataTests.cs b/test/Microsoft.AspNet.Mvc.Routing.Abstractions.Tests/VirtualPathDataTests.cs index 46f37267..f1c0f1a4 100644 --- a/test/Microsoft.AspNet.Mvc.Routing.Abstractions.Tests/VirtualPathDataTests.cs +++ b/test/Microsoft.AspNet.Mvc.Routing.Abstractions.Tests/VirtualPathDataTests.cs @@ -13,8 +13,8 @@ public class VirtualPathDataTests public void Constructor_CreatesEmptyDataTokensIfNull() { // Arrange - var router = new Mock().Object; - var path = new PathString("/virtual path"); + var router = Mock.Of(); + var path = "/virtual path"; // Act var pathData = new VirtualPathData(router, path, null); @@ -30,8 +30,8 @@ public void Constructor_CreatesEmptyDataTokensIfNull() public void Constructor_CopiesDataTokens() { // Arrange - var router = new Mock().Object; - var path = new PathString("/virtual path"); + var router = Mock.Of(); + var path = "/virtual path"; var dataTokens = new RouteValueDictionary(); dataTokens["TestKey"] = "TestValue"; @@ -51,14 +51,14 @@ public void Constructor_CopiesDataTokens() public void VirtualPath_ReturnsEmptyStringIfNull() { // Arrange - var router = new Mock().Object; + var router = Mock.Of(); // Act var pathData = new VirtualPathData(router, virtualPath: null); // Assert Assert.Same(router, pathData.Router); - Assert.Equal(new PathString(string.Empty), pathData.VirtualPath); + Assert.Empty(pathData.VirtualPath); Assert.NotNull(pathData.DataTokens); Assert.Empty(pathData.DataTokens); } diff --git a/test/Microsoft.AspNet.Routing.Extensions.Tests/RequestDelegateRouteBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Routing.Extensions.Tests/RequestDelegateRouteBuilderExtensionsTest.cs index de8622ff..fb36b52d 100644 --- a/test/Microsoft.AspNet.Routing.Extensions.Tests/RequestDelegateRouteBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Routing.Extensions.Tests/RequestDelegateRouteBuilderExtensionsTest.cs @@ -52,7 +52,7 @@ public async Task Map_MatchesRequest( var services = CreateServices(); var context = CreateRouteContext(services); - context.HttpContext.Request.Path = new PathString("/api/5"); + context.HttpContext.Request.Path = "/api/5"; requestSetup?.Invoke(context.HttpContext); var builder = CreateRouteBuilder(services); @@ -110,7 +110,7 @@ public async Task Map_DoesNotMatchRequest( var services = CreateServices(); var context = CreateRouteContext(services); - context.HttpContext.Request.Path = new PathString("/api/5"); + context.HttpContext.Request.Path = "/api/5"; requestSetup?.Invoke(context.HttpContext); var builder = CreateRouteBuilder(services); diff --git a/test/Microsoft.AspNet.Routing.Tests/Internal/PathTokenizerTest.cs b/test/Microsoft.AspNet.Routing.Tests/Internal/PathTokenizerTest.cs index ff738256..45718330 100644 --- a/test/Microsoft.AspNet.Routing.Tests/Internal/PathTokenizerTest.cs +++ b/test/Microsoft.AspNet.Routing.Tests/Internal/PathTokenizerTest.cs @@ -80,7 +80,7 @@ public static TheoryData TokenizationData public void PathTokenizer_Count(string path, StringSegment[] expectedSegments) { // Arrange - var tokenizer = new PathTokenizer(new PathString(path)); + var tokenizer = new PathTokenizer(path); // Act var count = tokenizer.Count; @@ -94,7 +94,7 @@ public void PathTokenizer_Count(string path, StringSegment[] expectedSegments) public void PathTokenizer_Indexer(string path, StringSegment[] expectedSegments) { // Arrange - var tokenizer = new PathTokenizer(new PathString(path)); + var tokenizer = new PathTokenizer(path); // Act & Assert for (var i = 0; i < expectedSegments.Length; i++) @@ -108,7 +108,7 @@ public void PathTokenizer_Indexer(string path, StringSegment[] expectedSegments) public void PathTokenizer_Enumerator(string path, StringSegment[] expectedSegments) { // Arrange - var tokenizer = new PathTokenizer(new PathString(path)); + var tokenizer = new PathTokenizer(path); // Act & Assert Assert.Equal(expectedSegments, tokenizer); diff --git a/test/Microsoft.AspNet.Routing.Tests/RouteCollectionTest.cs b/test/Microsoft.AspNet.Routing.Tests/RouteCollectionTest.cs index bae0176a..fa8e90b5 100644 --- a/test/Microsoft.AspNet.Routing.Tests/RouteCollectionTest.cs +++ b/test/Microsoft.AspNet.Routing.Tests/RouteCollectionTest.cs @@ -56,7 +56,7 @@ public void GetVirtualPath_CanLowerCaseUrls_And_AppendTrailingSlash_BasedOnOptio var pathData = routeCollection.GetVirtualPath(virtualPathContext); // Assert - Assert.Equal(new PathString(expectedUrl), pathData.VirtualPath); + Assert.Equal(expectedUrl, pathData.VirtualPath); Assert.Same(target.Object, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -84,7 +84,7 @@ public void GetVirtualPath_DoesntLowerCaseUrls_Invariant( var pathData = routeCollection.GetVirtualPath(virtualPathContext); // Assert - Assert.Equal(new PathString(lowercaseUrl), pathData.VirtualPath); + Assert.Equal(lowercaseUrl, pathData.VirtualPath); Assert.Same(target.Object, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -94,7 +94,7 @@ public void GetVirtualPath_DoesntLowerCaseUrls_Invariant( public void GetVirtualPath_ReturnsDataTokens(RouteValueDictionary dataTokens, string routerName) { // Arrange - var virtualPath = new PathString("/TestVirtualPath"); + var virtualPath = "/TestVirtualPath"; var pathContextValues = new RouteValueDictionary { { "controller", virtualPath } }; @@ -217,7 +217,7 @@ public void NamedRouteTests_GetNamedRoute_ReturnsValue(bool lowercaseUrls, strin var pathData = routeCollection.GetVirtualPath(virtualPathContext); // Assert - Assert.Equal(new PathString(expectedUrl), pathData.VirtualPath); + Assert.Equal(expectedUrl, pathData.VirtualPath); var namedRouter = Assert.IsAssignableFrom(pathData.Router); Assert.Equal(virtualPathContext.RouteName, namedRouter.Name); Assert.Empty(pathData.DataTokens); @@ -251,7 +251,7 @@ public void NamedRouteTests_GetNamedRoute_AmbiguousRoutesInCollection_DoesNotThr var pathData = routeCollection.GetVirtualPath(virtualPathContext); // Assert - Assert.Equal(new PathString("/route1"), pathData.VirtualPath); + Assert.Equal("/route1", pathData.VirtualPath); var namedRouter = Assert.IsAssignableFrom(pathData.Router); Assert.Equal("Route1", namedRouter.Name); Assert.Empty(pathData.DataTokens); @@ -359,7 +359,7 @@ public void GetVirtualPath_Success( var pathData = routeCollection.GetVirtualPath(context); // Assert - Assert.Equal(new PathString(expectedUrl), pathData.VirtualPath); + Assert.Equal(expectedUrl, pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -583,7 +583,7 @@ private static RouteContext CreateRouteContext( } var request = new Mock(MockBehavior.Strict); - request.SetupGet(r => r.Path).Returns(new PathString(requestPath)); + request.SetupGet(r => r.Path).Returns(requestPath); var optionsAccessor = new Mock>(MockBehavior.Strict); optionsAccessor.SetupGet(o => o.Value).Returns(options); diff --git a/test/Microsoft.AspNet.Routing.Tests/RouteTest.cs b/test/Microsoft.AspNet.Routing.Tests/RouteTest.cs index c9c22cab..09e020f9 100644 --- a/test/Microsoft.AspNet.Routing.Tests/RouteTest.cs +++ b/test/Microsoft.AspNet.Routing.Tests/RouteTest.cs @@ -374,8 +374,6 @@ public async Task RouteAsync_InlineConstraint_OptionalParameter_ConstraintFails( Assert.Null(context.Handler); } - #region Route Matching - // PathString in HttpAbstractions guarantees a leading slash - so no value in testing other cases. [Fact] public async Task Match_Success_LeadingSlash() @@ -587,7 +585,7 @@ private static RouteContext CreateRouteContext(string requestPath, ILoggerFactor } var request = new Mock(MockBehavior.Strict); - request.SetupGet(r => r.Path).Returns(new PathString(requestPath)); + request.SetupGet(r => r.Path).Returns(requestPath); var context = new Mock(MockBehavior.Strict); context.Setup(m => m.RequestServices.GetService(typeof(ILoggerFactory))) @@ -596,9 +594,6 @@ private static RouteContext CreateRouteContext(string requestPath, ILoggerFactor return new RouteContext(context.Object); } - #endregion - - #region Route Binding [Fact] public void GetVirtualPath_Success() @@ -611,7 +606,7 @@ public void GetVirtualPath_Success() var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home"), pathData.VirtualPath); + Assert.Equal("/Home", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -630,6 +625,24 @@ public void GetVirtualPath_Fail() Assert.Null(path); } + [Fact] + public void GetVirtualPath_EncodesValues() + { + // Arrange + var route = CreateRoute("{controller}/{action}"); + var context = CreateVirtualPathContext( + new { name = "name with %special #characters" }, + new { controller = "Home", action = "Index" }); + + // Act + var pathData = route.GetVirtualPath(context); + + // Assert + Assert.Equal("/Home/Index?name=name%20with%20%25special%20%23characters", pathData.VirtualPath); + Assert.Same(route, pathData.Router); + Assert.Empty(pathData.DataTokens); + } + [Fact] public void GetVirtualPath_ForListOfStrings() { @@ -643,7 +656,7 @@ public void GetVirtualPath_ForListOfStrings() var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home/Index?color=red&color=green&color=blue"), pathData.VirtualPath); + Assert.Equal("/Home/Index?color=red&color=green&color=blue", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -661,7 +674,7 @@ public void GetVirtualPath_ForListOfInts() var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home/Index?items=10&items=20&items=30"), pathData.VirtualPath); + Assert.Equal("/Home/Index?items=10&items=20&items=30", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -679,7 +692,7 @@ public void GetVirtualPath_ForList_Empty() var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home/Index"), pathData.VirtualPath); + Assert.Equal("/Home/Index", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -697,7 +710,7 @@ public void GetVirtualPath_ForList_StringWorkaround() var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home/Index?page=1&color=red&color=green&color=blue&message=textfortest"), pathData.VirtualPath); + Assert.Equal("/Home/Index?page=1&color=red&color=green&color=blue&message=textfortest", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -708,7 +721,7 @@ public void GetVirtualPath_ReturnsDataTokens_WhenTargetReturnsVirtualPathData( RouteValueDictionary dataTokens) { // Arrange - var path = new PathString("/TestPath"); + var path = "/TestPath"; var target = new Mock(MockBehavior.Strict); target @@ -752,7 +765,7 @@ public void GetVirtualPath_ReturnsDataTokens_WhenTargetReturnsNullVirtualPathDat RouteValueDictionary dataTokens) { // Arrange - var path = new PathString("/TestPath"); + var path = "/TestPath"; var target = new Mock(MockBehavior.Strict); target @@ -796,7 +809,7 @@ public void GetVirtualPath_ValuesRejectedByHandler_StillGeneratesPath() var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home"), pathData.VirtualPath); + Assert.Equal("/Home", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -812,7 +825,7 @@ public void GetVirtualPath_Success_AmbientValues() var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home/Index"), pathData.VirtualPath); + Assert.Equal("/Home/Index", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -853,7 +866,7 @@ public void RouteGenerationAcceptsConstraints() // Assert Assert.NotNull(pathData); - Assert.Equal(new PathString("/hello/1234"), pathData.VirtualPath); + Assert.Equal("/hello/1234", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -894,7 +907,7 @@ public void RouteWithCatchAllAcceptsConstraints() // Assert Assert.NotNull(pathData); - Assert.Equal(new PathString("/hello/1234"), pathData.VirtualPath); + Assert.Equal("/hello/1234", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -928,7 +941,7 @@ public void GetVirtualPathWithNonParameterConstraintReturnsUrlWithoutQueryString // Assert Assert.NotNull(pathData); - Assert.Equal(new PathString("/hello/1234"), pathData.VirtualPath); + Assert.Equal("/hello/1234", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); @@ -959,7 +972,7 @@ public void GetVirtualPath_ConstraintsSeeAmbientValues() var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/slug/Home/Store"), pathData.VirtualPath); + Assert.Equal("/slug/Home/Store", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); @@ -990,7 +1003,7 @@ public void GetVirtualPath_ConstraintsDontSeeDefaults_WhenTheyArentParameters() var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/slug/Home/Store"), pathData.VirtualPath); + Assert.Equal("/slug/Home/Store", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); @@ -1020,7 +1033,7 @@ public void GetVirtualPath_ConstraintsSeesDefault_WhenThereItsAParamter() var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/slug/Shopping"), pathData.VirtualPath); + Assert.Equal("/slug/Shopping", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); @@ -1051,7 +1064,7 @@ public void GetVirtualPath_ConstraintsSeeDefaults_IfTheyAreSpecifiedOrAmbient() var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/slug/Home/Store"), pathData.VirtualPath); + Assert.Equal("/slug/Home/Store", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); @@ -1070,7 +1083,7 @@ public void GetVirtualPath_InlineConstraints_Success() var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home/Index/4"), pathData.VirtualPath); + Assert.Equal("/Home/Index/4", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1102,7 +1115,7 @@ public void GetVirtualPath_InlineConstraints_OptionalParameter_ValuePresent() var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home/Index/98"), pathData.VirtualPath); + Assert.Equal("/Home/Index/98", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1119,7 +1132,7 @@ public void GetVirtualPath_InlineConstraints_OptionalParameter_ValueNotPresent() var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home/Index"), pathData.VirtualPath); + Assert.Equal("/Home/Index", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1151,7 +1164,7 @@ public void GetVirtualPath_InlineConstraints_CompositeInlineConstraint() var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home/Index/14"), pathData.VirtualPath); + Assert.Equal("/Home/Index/14", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1174,7 +1187,7 @@ public void GetVirtualPath_InlineConstraints_CompositeConstraint_FromConstructor var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home/Index/products"), pathData.VirtualPath); + Assert.Equal("/Home/Index/products", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1196,7 +1209,7 @@ public void GetVirtualPath_OptionalParameter_ParameterPresentInValues() var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home/Index/products.xml"), pathData.VirtualPath); + Assert.Equal("/Home/Index/products.xml", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1218,7 +1231,7 @@ public void GetVirtualPath_OptionalParameter_ParameterNotPresentInValues() var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home/Index/products"), pathData.VirtualPath); + Assert.Equal("/Home/Index/products", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1240,7 +1253,7 @@ public void GetVirtualPath_OptionalParameter_ParameterPresentInValuesAndDefaults var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home/Index/products.xml"), pathData.VirtualPath); + Assert.Equal("/Home/Index/products.xml", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1262,7 +1275,7 @@ public void GetVirtualPath_OptionalParameter_ParameterNotPresentInValues_Present var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home/Index/products"), pathData.VirtualPath); + Assert.Equal("/Home/Index/products", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1284,7 +1297,7 @@ public void GetVirtualPath_OptionalParameter_ParameterNotPresentInTemplate_Prese var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home/Index/products?format=json"), pathData.VirtualPath); + Assert.Equal("/Home/Index/products?format=json", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1306,7 +1319,7 @@ public void GetVirtualPath_OptionalParameter_FollowedByDotAfterSlash_ParameterPr var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home/Index/.products"), pathData.VirtualPath); + Assert.Equal("/Home/Index/.products", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1328,7 +1341,7 @@ public void GetVirtualPath_OptionalParameter_FollowedByDotAfterSlash_ParameterNo var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home/Index/"), pathData.VirtualPath); + Assert.Equal("/Home/Index/", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1350,7 +1363,7 @@ public void GetVirtualPath_OptionalParameter_InSimpleSegment() var pathData = route.GetVirtualPath(context); // Assert - Assert.Equal(new PathString("/Home/Index"), pathData.VirtualPath); + Assert.Equal("/Home/Index", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1386,10 +1399,6 @@ private static VirtualPathContext CreateVirtualPathContext(string routeName) return new VirtualPathContext(null, null, null, routeName); } - #endregion - - #region Route Registration - public static IEnumerable DataTokens { get @@ -1554,8 +1563,6 @@ public void RegisteringRouteWithRouteName_WithNullDefaultsAndConstraints_AddsThe Assert.Equal("RouteName", name); } - #endregion - // DataTokens test data for TemplateRoute.GetVirtualPath public static IEnumerable DataTokensTestData { diff --git a/test/Microsoft.AspNet.Routing.Tests/Template/TemplateBinderTests.cs b/test/Microsoft.AspNet.Routing.Tests/Template/TemplateBinderTests.cs index fe064a43..7e102f0b 100644 --- a/test/Microsoft.AspNet.Routing.Tests/Template/TemplateBinderTests.cs +++ b/test/Microsoft.AspNet.Routing.Tests/Template/TemplateBinderTests.cs @@ -31,7 +31,7 @@ public class TemplateBinderTests "Test/{val1}/{val2}", new RouteValueDictionary(new {val1 = "", val2 = ""}), new RouteValueDictionary(new {val1 = "a"}), - "UrlEncode[[Test]]/UrlEncode[[a]]" + "/UrlEncode[[Test]]/UrlEncode[[a]]" }, { "Test/{val1}/{val2}/{val3}", @@ -43,67 +43,67 @@ public class TemplateBinderTests "Test/{val1}/{val2}", new RouteValueDictionary(new {val1 = "", val2 = ""}), new RouteValueDictionary(new {val1 = "a", val2 = "b"}), - "UrlEncode[[Test]]/UrlEncode[[a]]/UrlEncode[[b]]" + "/UrlEncode[[Test]]/UrlEncode[[a]]/UrlEncode[[b]]" }, { "Test/{val1}/{val2}/{val3}", new RouteValueDictionary(new {val1 = "", val2 = "", val3 = ""}), new RouteValueDictionary(new {val1 = "a", val2 = "b", val3 = "c"}), - "UrlEncode[[Test]]/UrlEncode[[a]]/UrlEncode[[b]]/UrlEncode[[c]]" + "/UrlEncode[[Test]]/UrlEncode[[a]]/UrlEncode[[b]]/UrlEncode[[c]]" }, { "Test/{val1}/{val2}/{val3}", new RouteValueDictionary(new {val1 = "", val2 = "", val3 = ""}), new RouteValueDictionary(new {val1 = "a", val2 = "b"}), - "UrlEncode[[Test]]/UrlEncode[[a]]/UrlEncode[[b]]" + "/UrlEncode[[Test]]/UrlEncode[[a]]/UrlEncode[[b]]" }, { "Test/{val1}/{val2}/{val3}", new RouteValueDictionary(new {val1 = "", val2 = "", val3 = ""}), new RouteValueDictionary(new {val1 = "a"}), - "UrlEncode[[Test]]/UrlEncode[[a]]" + "/UrlEncode[[Test]]/UrlEncode[[a]]" }, { "Test/{val1}", new RouteValueDictionary(new {val1 = "42", val2 = "", val3 = ""}), new RouteValueDictionary(), - "UrlEncode[[Test]]" + "/UrlEncode[[Test]]" }, { "Test/{val1}/{val2}/{val3}", new RouteValueDictionary(new {val1 = "42", val2 = (string)null, val3 = (string)null}), new RouteValueDictionary(), - "UrlEncode[[Test]]" + "/UrlEncode[[Test]]" }, { "Test/{val1}/{val2}/{val3}/{val4}", new RouteValueDictionary(new {val1 = "21", val2 = "", val3 = "", val4 = ""}), new RouteValueDictionary(new {val1 = "42", val2 = "11", val3 = "", val4 = ""}), - "UrlEncode[[Test]]/UrlEncode[[42]]/UrlEncode[[11]]" + "/UrlEncode[[Test]]/UrlEncode[[42]]/UrlEncode[[11]]" }, { "Test/{val1}/{val2}/{val3}", new RouteValueDictionary(new {val1 = "21", val2 = "", val3 = ""}), new RouteValueDictionary(new {val1 = "42"}), - "UrlEncode[[Test]]/UrlEncode[[42]]" + "/UrlEncode[[Test]]/UrlEncode[[42]]" }, { "Test/{val1}/{val2}/{val3}/{val4}", new RouteValueDictionary(new {val1 = "21", val2 = "", val3 = "", val4 = ""}), new RouteValueDictionary(new {val1 = "42", val2 = "11"}), - "UrlEncode[[Test]]/UrlEncode[[42]]/UrlEncode[[11]]" + "/UrlEncode[[Test]]/UrlEncode[[42]]/UrlEncode[[11]]" }, { "Test/{val1}/{val2}/{val3}", new RouteValueDictionary(new {val1 = "21", val2 = (string)null, val3 = (string)null}), new RouteValueDictionary(new {val1 = "42"}), - "UrlEncode[[Test]]/UrlEncode[[42]]" + "/UrlEncode[[Test]]/UrlEncode[[42]]" }, { "Test/{val1}/{val2}/{val3}/{val4}", new RouteValueDictionary(new {val1 = "21", val2 = (string)null, val3 = (string)null, val4 = (string)null}), new RouteValueDictionary(new {val1 = "42", val2 = "11"}), - "UrlEncode[[Test]]/UrlEncode[[42]]/UrlEncode[[11]]" + "/UrlEncode[[Test]]/UrlEncode[[42]]/UrlEncode[[11]]" }, }; @@ -157,7 +157,7 @@ public void GetVirtualPathWithMultiSegmentParamsOnBothEndsMatches() null, new RouteValueDictionary(new { lang = "en", region = "US" }), new RouteValueDictionary(new { lang = "xx", region = "yy" }), - "UrlEncode[[language]]/UrlEncode[[xx]]UrlEncode[[-]]UrlEncode[[yy]]"); + "/UrlEncode[[language]]/UrlEncode[[xx]]UrlEncode[[-]]UrlEncode[[yy]]"); } [Fact] @@ -168,7 +168,7 @@ public void GetVirtualPathWithMultiSegmentParamsOnLeftEndMatches() null, new RouteValueDictionary(new { lang = "en", region = "US" }), new RouteValueDictionary(new { lang = "xx", region = "yy" }), - "UrlEncode[[language]]/UrlEncode[[xx]]UrlEncode[[-]]UrlEncode[[yy]]UrlEncode[[a]]"); + "/UrlEncode[[language]]/UrlEncode[[xx]]UrlEncode[[-]]UrlEncode[[yy]]UrlEncode[[a]]"); } [Fact] @@ -179,7 +179,7 @@ public void GetVirtualPathWithMultiSegmentParamsOnRightEndMatches() null, new RouteValueDictionary(new { lang = "en", region = "US" }), new RouteValueDictionary(new { lang = "xx", region = "yy" }), - "UrlEncode[[language]]/UrlEncode[[a]]UrlEncode[[xx]]UrlEncode[[-]]UrlEncode[[yy]]"); + "/UrlEncode[[language]]/UrlEncode[[a]]UrlEncode[[xx]]UrlEncode[[-]]UrlEncode[[yy]]"); } public static TheoryData OptionalParamValues => @@ -193,42 +193,42 @@ public void GetVirtualPathWithMultiSegmentParamsOnRightEndMatches() new RouteValueDictionary(new {val1 = "someval1", val2 = "someval2"}), new RouteValueDictionary(new {val3 = "someval3"}), new RouteValueDictionary(new {val3 = "someval3"}), - "UrlEncode[[Test]]/UrlEncode[[someval1]]/UrlEncode[[someval2]]UrlEncode[[.]]UrlEncode[[someval3]]" + "/UrlEncode[[Test]]/UrlEncode[[someval1]]/UrlEncode[[someval2]]UrlEncode[[.]]UrlEncode[[someval3]]" }, { "Test/{val1}/{val2}.{val3?}", new RouteValueDictionary(new {val1 = "someval1", val2 = "someval2"}), new RouteValueDictionary(new {val3 = "someval3a"}), new RouteValueDictionary(new {val3 = "someval3v"}), - "UrlEncode[[Test]]/UrlEncode[[someval1]]/UrlEncode[[someval2]]UrlEncode[[.]]UrlEncode[[someval3v]]" + "/UrlEncode[[Test]]/UrlEncode[[someval1]]/UrlEncode[[someval2]]UrlEncode[[.]]UrlEncode[[someval3v]]" }, { "Test/{val1}/{val2}.{val3?}", new RouteValueDictionary(new {val1 = "someval1", val2 = "someval2"}), new RouteValueDictionary(new {val3 = "someval3a"}), new RouteValueDictionary(), - "UrlEncode[[Test]]/UrlEncode[[someval1]]/UrlEncode[[someval2]]UrlEncode[[.]]UrlEncode[[someval3a]]" + "/UrlEncode[[Test]]/UrlEncode[[someval1]]/UrlEncode[[someval2]]UrlEncode[[.]]UrlEncode[[someval3a]]" }, { "Test/{val1}/{val2}.{val3?}", new RouteValueDictionary(new {val1 = "someval1", val2 = "someval2"}), new RouteValueDictionary(), new RouteValueDictionary(new {val3 = "someval3v"}), - "UrlEncode[[Test]]/UrlEncode[[someval1]]/UrlEncode[[someval2]]UrlEncode[[.]]UrlEncode[[someval3v]]" + "/UrlEncode[[Test]]/UrlEncode[[someval1]]/UrlEncode[[someval2]]UrlEncode[[.]]UrlEncode[[someval3v]]" }, { "Test/{val1}/{val2}.{val3?}", new RouteValueDictionary(new {val1 = "someval1", val2 = "someval2"}), new RouteValueDictionary(), new RouteValueDictionary(), - "UrlEncode[[Test]]/UrlEncode[[someval1]]/UrlEncode[[someval2]]" + "/UrlEncode[[Test]]/UrlEncode[[someval1]]/UrlEncode[[someval2]]" }, { "Test/{val1}.{val2}.{val3}.{val4?}", new RouteValueDictionary(new {val1 = "someval1", val2 = "someval2" }), new RouteValueDictionary(), new RouteValueDictionary(new {val4 = "someval4", val3 = "someval3" }), - "UrlEncode[[Test]]/UrlEncode[[someval1]]UrlEncode[[.]]UrlEncode[[someval2]]UrlEncode[[.]]" + "/UrlEncode[[Test]]/UrlEncode[[someval1]]UrlEncode[[.]]UrlEncode[[someval2]]UrlEncode[[.]]" + "UrlEncode[[someval3]]UrlEncode[[.]]UrlEncode[[someval4]]" }, { @@ -236,7 +236,7 @@ public void GetVirtualPathWithMultiSegmentParamsOnRightEndMatches() new RouteValueDictionary(new {val1 = "someval1", val2 = "someval2" }), new RouteValueDictionary(), new RouteValueDictionary(new {val3 = "someval3" }), - "UrlEncode[[Test]]/UrlEncode[[someval1]]UrlEncode[[.]]UrlEncode[[someval2]]UrlEncode[[.]]" + "/UrlEncode[[Test]]/UrlEncode[[someval1]]UrlEncode[[.]]UrlEncode[[someval2]]UrlEncode[[.]]" + "UrlEncode[[someval3]]" }, { @@ -244,14 +244,15 @@ public void GetVirtualPathWithMultiSegmentParamsOnRightEndMatches() new RouteValueDictionary(new { }), new RouteValueDictionary(), new RouteValueDictionary(new {val2 = "someval2" }), - "UrlEncode[[Test]]/UrlEncode[[.]]UrlEncode[[someval2]]" + "/UrlEncode[[Test]]/UrlEncode[[.]]UrlEncode[[someval2]]" }, { "Test/{val1}.{val2}", new RouteValueDictionary(new {val1 = "someval1", val2 = "someval2" }), new RouteValueDictionary(), new RouteValueDictionary(new {val3 = "someval3" }), - "UrlEncode[[Test]]/UrlEncode[[someval1]]UrlEncode[[.]]UrlEncode[[someval2]]?UrlEncode[[val3]]=UrlEncode[[someval3]]" + "/UrlEncode[[Test]]/UrlEncode[[someval1]]UrlEncode[[.]]UrlEncode[[someval2]]?" + + "UrlEncode[[val3]]=UrlEncode[[someval3]]" }, }; @@ -306,7 +307,7 @@ public void GetVirtualPathWithMultiSegmentParamsOnNeitherEndMatches() null, new RouteValueDictionary(new { lang = "en", region = "US" }), new RouteValueDictionary(new { lang = "xx", region = "yy" }), - "UrlEncode[[language]]/UrlEncode[[a]]UrlEncode[[xx]]UrlEncode[[-]]UrlEncode[[yy]]UrlEncode[[a]]"); + "/UrlEncode[[language]]/UrlEncode[[a]]UrlEncode[[xx]]UrlEncode[[-]]UrlEncode[[yy]]UrlEncode[[a]]"); } [Fact] @@ -339,7 +340,7 @@ public void GetVirtualPathWithSimpleMultiSegmentParamsOnBothEndsMatches() null, new RouteValueDictionary(new { lang = "en" }), new RouteValueDictionary(new { lang = "xx" }), - "UrlEncode[[language]]/UrlEncode[[xx]]"); + "/UrlEncode[[language]]/UrlEncode[[xx]]"); } [Fact] @@ -350,7 +351,7 @@ public void GetVirtualPathWithSimpleMultiSegmentParamsOnLeftEndMatches() null, new RouteValueDictionary(new { lang = "en" }), new RouteValueDictionary(new { lang = "xx" }), - "UrlEncode[[language]]/UrlEncode[[xx]]UrlEncode[[-]]"); + "/UrlEncode[[language]]/UrlEncode[[xx]]UrlEncode[[-]]"); } [Fact] @@ -361,7 +362,7 @@ public void GetVirtualPathWithSimpleMultiSegmentParamsOnRightEndMatches() null, new RouteValueDictionary(new { lang = "en" }), new RouteValueDictionary(new { lang = "xx" }), - "UrlEncode[[language]]/UrlEncode[[a]]UrlEncode[[xx]]"); + "/UrlEncode[[language]]/UrlEncode[[a]]UrlEncode[[xx]]"); } [Fact] @@ -372,7 +373,7 @@ public void GetVirtualPathWithSimpleMultiSegmentParamsOnNeitherEndMatches() null, new RouteValueDictionary(new { lang = "en" }), new RouteValueDictionary(new { lang = "xx" }), - "UrlEncode[[language]]/UrlEncode[[a]]UrlEncode[[xx]]UrlEncode[[a]]"); + "/UrlEncode[[language]]/UrlEncode[[a]]UrlEncode[[xx]]UrlEncode[[a]]"); } [Fact] @@ -383,7 +384,7 @@ public void GetVirtualPathWithMultiSegmentStandardMvcRouteMatches() new RouteValueDictionary(new { action = "Index", id = (string)null }), new RouteValueDictionary(new { controller = "home", action = "list", id = (string)null }), new RouteValueDictionary(new { controller = "products" }), - "UrlEncode[[products]]UrlEncode[[.mvc]]"); + "/UrlEncode[[products]]UrlEncode[[.mvc]]"); } [Fact] @@ -394,7 +395,7 @@ public void GetVirtualPathWithMultiSegmentParamsOnBothEndsWithDefaultValuesMatch new RouteValueDictionary(new { lang = "xx", region = "yy" }), new RouteValueDictionary(new { lang = "en", region = "US" }), new RouteValueDictionary(new { lang = "zz" }), - "UrlEncode[[language]]/UrlEncode[[zz]]UrlEncode[[-]]UrlEncode[[yy]]"); + "/UrlEncode[[language]]/UrlEncode[[zz]]UrlEncode[[-]]UrlEncode[[yy]]"); } [Fact] @@ -406,7 +407,7 @@ public void GetUrlWithDefaultValue() new RouteValueDictionary(new { id = "defaultid" }), new RouteValueDictionary(new { controller = "home", action = "oldaction" }), new RouteValueDictionary(new { action = "newaction" }), - "UrlEncode[[home]]/UrlEncode[[newaction]]"); + "/UrlEncode[[home]]/UrlEncode[[newaction]]"); } [Fact] @@ -439,7 +440,7 @@ public void GetVirtualPathWithRequiredValueReturnsPath() null, new RouteValueDictionary(new { }), new RouteValueDictionary(new { controller = "home" }), - "UrlEncode[[foo]]/UrlEncode[[home]]"); + "/UrlEncode[[foo]]/UrlEncode[[home]]"); } [Fact] @@ -451,7 +452,7 @@ public void GetUrlWithNullDefaultValue() new RouteValueDictionary(new { id = (string)null }), new RouteValueDictionary(new { controller = "home", action = "oldaction", id = (string)null }), new RouteValueDictionary(new { action = "newaction" }), - "UrlEncode[[home]]/UrlEncode[[newaction]]"); + "/UrlEncode[[home]]/UrlEncode[[newaction]]"); } [Fact] @@ -462,7 +463,7 @@ public void GetVirtualPathCanFillInSeparatedParametersWithDefaultValues() new RouteValueDictionary(new { language = "en", locale = "US" }), new RouteValueDictionary(), new RouteValueDictionary(new { controller = "Orders" }), - "UrlEncode[[Orders]]/UrlEncode[[en]]UrlEncode[[-]]UrlEncode[[US]]"); + "/UrlEncode[[Orders]]/UrlEncode[[en]]UrlEncode[[-]]UrlEncode[[US]]"); } [Fact] @@ -473,7 +474,7 @@ public void GetVirtualPathWithUnusedNullValueShouldGenerateUrlAndIgnoreNullValue new RouteValueDictionary(new { action = "Index", id = "" }), new RouteValueDictionary(new { controller = "Home", action = "Index", id = "" }), new RouteValueDictionary(new { controller = "Home", action = "TestAction", id = "1", format = (string)null }), - "UrlEncode[[Home]]UrlEncode[[.mvc]]/UrlEncode[[TestAction]]/UrlEncode[[1]]"); + "/UrlEncode[[Home]]UrlEncode[[.mvc]]/UrlEncode[[TestAction]]/UrlEncode[[1]]"); } [Fact] @@ -506,7 +507,7 @@ public void GetUrlWithEmptyOptionalValuesReturnsShortUrl() new { p2 = "d2", p3 = "d3" }, new { p1 = "v1", }, new { p2 = "", p3 = "" }, - "UrlEncode[[v1]]"); + "/UrlEncode[[v1]]"); } [Fact] @@ -517,7 +518,7 @@ public void GetUrlShouldIgnoreValuesAfterChangedParameter() new { action = "Index", id = (string)null }, new { controller = "orig", action = "init", id = "123" }, new { action = "new", }, - "UrlEncode[[orig]]/UrlEncode[[new]]"); + "/UrlEncode[[orig]]/UrlEncode[[new]]"); } [Fact] @@ -528,7 +529,7 @@ public void GetUrlWithNullForMiddleParameterIgnoresRemainingParameters() new { year = 1995, occasion = "Christmas", action = "Play", SafeParam = "SafeParamValue" }, new { controller = "UrlRouting", action = "Play", category = "Photos", year = "2008", occasion = "Easter", SafeParam = "SafeParamValue" }, new { year = (string)null, occasion = "Hola" }, - "UrlEncode[[UrlGeneration1]]/UrlEncode[[UrlRouting]]UrlEncode[[.mvc]]/UrlEncode[[Play]]/" + "/UrlEncode[[UrlGeneration1]]/UrlEncode[[UrlRouting]]UrlEncode[[.mvc]]/UrlEncode[[Play]]/" + "UrlEncode[[Photos]]/UrlEncode[[1995]]/UrlEncode[[Hola]]"); } @@ -552,7 +553,7 @@ public void GetUrlWithEmptyStringForMiddleParameterIgnoresRemainingParameters() new RouteValueDictionary(new { year = 1995, occasion = "Christmas", action = "Play", SafeParam = "SafeParamValue" }), ambientValues, values, - "UrlEncode[[UrlGeneration1]]/UrlEncode[[UrlRouting]]UrlEncode[[.mvc]]/" + "/UrlEncode[[UrlGeneration1]]/UrlEncode[[UrlRouting]]UrlEncode[[.mvc]]/" + "UrlEncode[[Play]]/UrlEncode[[Photos]]/UrlEncode[[1995]]/UrlEncode[[Hola]]"); } @@ -575,7 +576,7 @@ public void GetUrlWithEmptyStringForMiddleParameterShouldUseDefaultValue() new RouteValueDictionary(new { action = "Default" }), ambientValues, values, - "UrlEncode[[subtest]]UrlEncode[[.mvc]]/UrlEncode[[Default]]/UrlEncode[[b]]"); + "/UrlEncode[[subtest]]UrlEncode[[.mvc]]/UrlEncode[[Default]]/UrlEncode[[b]]"); } [Fact] @@ -593,7 +594,7 @@ public void GetUrlVerifyEncoding() new RouteValueDictionary(new { controller = "Home" }), new RouteValueDictionary(new { controller = "home", action = "Index", id = (string)null }), values, - "%23;%3F%3A@%26%3D%2B$,.mvc/showcategory/123?so%3Frt=de%3Fsc&maxPrice=100", + "/%23;%3F%3A@%26%3D%2B$,.mvc/showcategory/123?so%3Frt=de%3Fsc&maxPrice=100", UrlEncoder.Default); } @@ -608,7 +609,7 @@ public void GetUrlGeneratesQueryStringForNewValuesAndEscapesQueryString() new RouteValueDictionary(new { controller = "Home" }), new RouteValueDictionary(new { controller = "home", action = "Index", id = (string)null }), values, - "UrlEncode[[products]]UrlEncode[[.mvc]]/UrlEncode[[showcategory]]/UrlEncode[[123]]" + + "/UrlEncode[[products]]UrlEncode[[.mvc]]/UrlEncode[[showcategory]]/UrlEncode[[123]]" + "?UrlEncode[[so?rt]]=UrlEncode[[de?sc]]&UrlEncode[[maxPrice]]=UrlEncode[[100]]"); } @@ -629,7 +630,7 @@ public void GetUrlGeneratesQueryStringForNewValuesButIgnoresNewValuesThatMatchDe maxPrice = 100, custom = "customValue" }), - "UrlEncode[[products]]UrlEncode[[.mvc]]/UrlEncode[[showcategory]]/UrlEncode[[123]]" + + "/UrlEncode[[products]]UrlEncode[[.mvc]]/UrlEncode[[showcategory]]/UrlEncode[[123]]" + "?UrlEncode[[sort]]=UrlEncode[[desc]]&UrlEncode[[maxPrice]]=UrlEncode[[100]]"); } @@ -641,7 +642,7 @@ public void GetVirtualPathEncodesParametersAndLiterals() null, new RouteValueDictionary(new { controller = "ho%me", action = "li st" }), new RouteValueDictionary(), - "bl%25og/ho%25me/he%20llo/li%20st", + "/bl%25og/ho%25me/he%20llo/li%20st", UrlEncoder.Default); } @@ -665,7 +666,7 @@ public void GetUrlWithCatchAllWithValue() new RouteValueDictionary(new { id = "defaultid" }), new RouteValueDictionary(new { p1 = "v1" }), new RouteValueDictionary(new { p2 = "v2a/v2b" }), - "UrlEncode[[v1]]/UrlEncode[[v2a/v2b]]"); + "/UrlEncode[[v1]]/UrlEncode[[v2a/v2b]]"); } [Fact] @@ -676,7 +677,7 @@ public void GetUrlWithCatchAllWithEmptyValue() new RouteValueDictionary(new { id = "defaultid" }), new RouteValueDictionary(new { p1 = "v1" }), new RouteValueDictionary(new { p2 = "" }), - "UrlEncode[[v1]]"); + "/UrlEncode[[v1]]"); } [Fact] @@ -687,7 +688,7 @@ public void GetUrlWithCatchAllWithNullValue() new RouteValueDictionary(new { id = "defaultid" }), new RouteValueDictionary(new { p1 = "v1" }), new RouteValueDictionary(new { p2 = (string)null }), - "UrlEncode[[v1]]"); + "/UrlEncode[[v1]]"); } #if ROUTE_COLLECTION diff --git a/test/Microsoft.AspNet.Routing.Tests/Template/TemplateMatcherTests.cs b/test/Microsoft.AspNet.Routing.Tests/Template/TemplateMatcherTests.cs index 8431d46b..faece3e6 100644 --- a/test/Microsoft.AspNet.Routing.Tests/Template/TemplateMatcherTests.cs +++ b/test/Microsoft.AspNet.Routing.Tests/Template/TemplateMatcherTests.cs @@ -924,7 +924,7 @@ private static void RunTest( defaults ?? new Dictionary()); // Act - var match = matcher.Match(new PathString(path)); + var match = matcher.Match(path); // Assert if (expected == null) diff --git a/test/Microsoft.AspNet.Routing.Tests/Tree/TreeRouterTest.cs b/test/Microsoft.AspNet.Routing.Tests/Tree/TreeRouterTest.cs index 2ef51020..f43def26 100644 --- a/test/Microsoft.AspNet.Routing.Tests/Tree/TreeRouterTest.cs +++ b/test/Microsoft.AspNet.Routing.Tests/Tree/TreeRouterTest.cs @@ -381,7 +381,7 @@ public void TreeRouter_GenerateLink(string firstTemplate, string secondTemplate, // Assert Assert.NotNull(result); - Assert.Equal(new PathString(expectedPath), result.VirtualPath); + Assert.Equal(expectedPath, result.VirtualPath); Assert.Same(route, result.Router); Assert.Empty(result.DataTokens); } @@ -404,7 +404,7 @@ public void TreeRouter_GenerateLink_LongerTemplateWithDefaultIsMoreSpecific() // Assert Assert.NotNull(result); // The Binder binds to /template - Assert.Equal(new PathString($"/template"), result.VirtualPath); + Assert.Equal("/template", result.VirtualPath); Assert.Same(route, result.Router); Assert.Empty(result.DataTokens); } @@ -436,7 +436,7 @@ public void TreeRouter_GenerateLink_OrderingAgnostic( // Assert Assert.NotNull(result); - Assert.Equal(new PathString(expectedPath), result.VirtualPath); + Assert.Equal(expectedPath, result.VirtualPath); Assert.Same(route, result.Router); Assert.Empty(result.DataTokens); } @@ -468,7 +468,7 @@ public void TreeRouter_GenerateLink_UseAvailableVariables( // Assert Assert.NotNull(result); - Assert.Equal(new PathString(expectedPath), result.VirtualPath); + Assert.Equal(expectedPath, result.VirtualPath); Assert.Same(route, result.Router); Assert.Empty(result.DataTokens); } @@ -505,7 +505,7 @@ public void TreeRouter_GenerateLink_RespectsPrecedence(string firstTemplate, str // Assert Assert.NotNull(result); - Assert.Equal(new PathString("/template/5"), result.VirtualPath); + Assert.Equal("/template/5", result.VirtualPath); Assert.Same(route, result.Router); Assert.Empty(result.DataTokens); } @@ -555,7 +555,7 @@ public void TreeRouter_GenerateLink_OptionalInlineParameter( else { Assert.NotNull(result); - Assert.Equal(new PathString(expectedPath), result.VirtualPath); + Assert.Equal(expectedPath, result.VirtualPath); Assert.Same(route, result.Router); Assert.Empty(result.DataTokens); } @@ -594,7 +594,7 @@ public void TreeRouter_GenerateLink_RespectsOrderOverPrecedence(string firstTemp // Assert Assert.NotNull(result); - Assert.Equal(new PathString("/template/5"), result.VirtualPath); + Assert.Equal("/template/5", result.VirtualPath); Assert.Same(route, result.Router); Assert.Empty(result.DataTokens); } @@ -626,7 +626,7 @@ public void TreeRouter_GenerateLink_RespectsOrder(string firstTemplate, string s // Assert Assert.NotNull(result); - Assert.Equal(new PathString("/template/5"), result.VirtualPath); + Assert.Equal("/template/5", result.VirtualPath); Assert.Same(route, result.Router); Assert.Empty(result.DataTokens); } @@ -658,7 +658,7 @@ public void TreeRouter_GenerateLink_EnsuresStableOrder(string firstTemplate, str // Assert Assert.NotNull(result); - Assert.Equal(new PathString("/first/5"), result.VirtualPath); + Assert.Equal("/first/5", result.VirtualPath); Assert.Same(route, result.Router); Assert.Empty(result.DataTokens); } @@ -761,8 +761,8 @@ public void TreeRouter_GeneratesLink_ForMultipleNamedEntriesWithTheSameTemplate( IEnumerable namedEntries) { // Arrange - var expectedLink = new PathString( - namedEntries.First().Template.Parameters.Any() ? "/template/5" : "/template"); + var expectedLink = + namedEntries.First().Template.Parameters.Any() ? "/template/5" : "/template"; var matchingEntries = Enumerable.Empty(); @@ -804,7 +804,7 @@ public void TreeRouter_GenerateLink_WithName() // Assert Assert.NotNull(result); - Assert.Equal(new PathString("/named"), result.VirtualPath); + Assert.Equal("/named", result.VirtualPath); Assert.Same(route, result.Router); Assert.Empty(result.DataTokens); } @@ -903,7 +903,7 @@ public void TreeRouter_GeneratesLink_IfValuesMatchNamedEntry(string template, st // Assert Assert.NotNull(result); - Assert.Equal(new PathString("/template/5"), result.VirtualPath); + Assert.Equal("/template/5", result.VirtualPath); Assert.Same(route, result.Router); Assert.Empty(result.DataTokens); } @@ -922,7 +922,7 @@ public void TreeRouter_GenerateLink_NoRequiredValues() // Assert Assert.NotNull(pathData); - Assert.Equal(new PathString("/api/Store"), pathData.VirtualPath); + Assert.Equal("/api/Store", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -941,7 +941,7 @@ public void TreeRouter_GenerateLink_Match() // Assert Assert.NotNull(pathData); - Assert.Equal(new PathString("/api/Store"), pathData.VirtualPath); + Assert.Equal("/api/Store", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -976,7 +976,7 @@ public void TreeRouter_GenerateLink_Match_WithAmbientValues() // Assert Assert.NotNull(pathData); - Assert.Equal(new PathString("/api/Store"), pathData.VirtualPath); + Assert.Equal("/api/Store", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -995,7 +995,7 @@ public void TreeRouter_GenerateLink_Match_WithParameters() // Assert Assert.NotNull(pathData); - Assert.Equal(new PathString("/api/Store/Index"), pathData.VirtualPath); + Assert.Equal("/api/Store/Index", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1020,7 +1020,7 @@ public void TreeRouter_GenerateLink_Match_WithMoreParameters() // Assert Assert.NotNull(pathData); - Assert.Equal(new PathString("/api/AwesomeCo/dosomething/Store/Index"), pathData.VirtualPath); + Assert.Equal("/api/AwesomeCo/dosomething/Store/Index", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1039,7 +1039,7 @@ public void TreeRouter_GenerateLink_Match_WithDefault() // Assert Assert.NotNull(pathData); - Assert.Equal(new PathString("/api/Store"), pathData.VirtualPath); + Assert.Equal("/api/Store", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1060,7 +1060,7 @@ public void TreeRouter_GenerateLink_Match_WithConstraint() // Assert Assert.NotNull(pathData); - Assert.Equal(new PathString("/api/Store/Index/5"), pathData.VirtualPath); + Assert.Equal("/api/Store/Index/5", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1096,7 +1096,7 @@ public void TreeRouter_GenerateLink_Match_WithMixedAmbientValues() // Assert Assert.NotNull(pathData); - Assert.Equal(new PathString("/api/Store"), pathData.VirtualPath); + Assert.Equal("/api/Store", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1115,7 +1115,7 @@ public void TreeRouter_GenerateLink_Match_WithQueryString() // Assert Assert.NotNull(pathData); - Assert.Equal(new PathString("/api/Store?id=5"), pathData.VirtualPath); + Assert.Equal("/api/Store?id=5", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1136,7 +1136,7 @@ public void TreeRouter_GenerateLink_RejectedByFirstRoute() // Assert Assert.NotNull(pathData); - Assert.Equal(new PathString("/api2/Blog"), pathData.VirtualPath); + Assert.Equal("/api2/Blog", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1162,7 +1162,7 @@ public void TreeRouter_GenerateLink_ToArea() // Assert Assert.NotNull(pathData); - Assert.Equal(new PathString("/Help/Store"), pathData.VirtualPath); + Assert.Equal("/Help/Store", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1188,7 +1188,7 @@ public void TreeRouter_GenerateLink_ToArea_PredecedenceReversed() // Assert Assert.NotNull(pathData); - Assert.Equal(new PathString("/Help/Store"), pathData.VirtualPath); + Assert.Equal("/Help/Store", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1216,7 +1216,7 @@ public void TreeRouter_GenerateLink_ToArea_WithAmbientValues() // Assert Assert.NotNull(pathData); - Assert.Equal(new PathString("/Help/Store"), pathData.VirtualPath); + Assert.Equal("/Help/Store", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1244,7 +1244,7 @@ public void TreeRouter_GenerateLink_OutOfArea_IgnoresAmbientValue() // Assert Assert.NotNull(pathData); - Assert.Equal(new PathString("/Store"), pathData.VirtualPath); + Assert.Equal("/Store", pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1337,7 +1337,7 @@ public void TreeRouter_GenerateLink_Match_WithOptionalParameters( // Assert Assert.NotNull(pathData); - Assert.Equal(new PathString(expected), pathData.VirtualPath); + Assert.Equal(expected, pathData.VirtualPath); Assert.Same(route, pathData.Router); Assert.Empty(pathData.DataTokens); } @@ -1523,7 +1523,7 @@ public async Task TreeRouter_CreatesNewRouteData_ResetsWhenThrows() private static RouteContext CreateRouteContext(string requestPath) { var request = new Mock(MockBehavior.Strict); - request.SetupGet(r => r.Path).Returns(new PathString(requestPath)); + request.SetupGet(r => r.Path).Returns(requestPath); var context = new Mock(MockBehavior.Strict); context.Setup(m => m.RequestServices.GetService(typeof(ILoggerFactory)))