From 15e46ad323943f9086d9558971cfc7760a92b9df Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Thu, 23 Aug 2018 21:39:23 +1200 Subject: [PATCH] Change RoutePattern to not throw when inline and arg default value are the same (#747) --- .../Patterns/RoutePatternFactory.cs | 4 +-- .../Patterns/RoutePatternFactoryTest.cs | 25 ++++++++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNetCore.Routing/Patterns/RoutePatternFactory.cs b/src/Microsoft.AspNetCore.Routing/Patterns/RoutePatternFactory.cs index f3309cf1b6..51b869c58c 100644 --- a/src/Microsoft.AspNetCore.Routing/Patterns/RoutePatternFactory.cs +++ b/src/Microsoft.AspNetCore.Routing/Patterns/RoutePatternFactory.cs @@ -343,7 +343,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns if (updatedDefaults.TryGetValue(parameter.Name, out var newDefault)) { - if (parameter.Default != null) + if (parameter.Default != null && !Equals(newDefault, parameter.Default)) { var message = Resources.FormatTemplateRoute_CannotHaveDefaultValueSpecifiedInlineAndExplicitly(parameter.Name); throw new InvalidOperationException(message); @@ -360,7 +360,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns if (parameter.Default != null) { - updatedDefaults.Add(parameter.Name, parameter.Default); + updatedDefaults[parameter.Name] = parameter.Default; } if (!updatedParameterPolicies.TryGetValue(parameter.Name, out var parameterConstraints) && diff --git a/test/Microsoft.AspNetCore.Routing.Tests/Patterns/RoutePatternFactoryTest.cs b/test/Microsoft.AspNetCore.Routing.Tests/Patterns/RoutePatternFactoryTest.cs index 562d081d10..50d22c6a22 100644 --- a/test/Microsoft.AspNetCore.Routing.Tests/Patterns/RoutePatternFactoryTest.cs +++ b/test/Microsoft.AspNetCore.Routing.Tests/Patterns/RoutePatternFactoryTest.cs @@ -66,7 +66,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns } [Fact] - public void Pattern_DuplicateDefaultValue_Throws() + public void Pattern_DifferentDuplicateDefaultValue_Throws() { // Arrange var template = "{a=13}/{b}/{c}"; @@ -90,6 +90,29 @@ namespace Microsoft.AspNetCore.Routing.Patterns ex.Message); } + [Fact] + public void Pattern_SameDuplicateDefaultValue() + { + // Arrange + var template = "{a=13}/{b}/{c}"; + var defaults = new { a = "13", }; + var constraints = new { }; + + var original = RoutePatternFactory.Parse(template); + + // Act + var actual = RoutePatternFactory.Pattern( + original.RawText, + defaults, + constraints, + original.PathSegments); + + // Assert + Assert.Collection( + actual.Defaults, + kvp => { Assert.Equal("a", kvp.Key); Assert.Equal("13", kvp.Value); }); + } + [Fact] public void Pattern_OptionalParameterDefaultValue_Throws() {