diff --git a/src/Common/ApiVersion.cs b/src/Common/ApiVersion.cs index 868db1bb..c92528f8 100644 --- a/src/Common/ApiVersion.cs +++ b/src/Common/ApiVersion.cs @@ -139,6 +139,8 @@ private static void RequireValidStatus( string status ) /// The minor version number or null. public int? MinorVersion { get; } + private int ImpliedMinorVersion => MinorVersion ?? 0; + /// /// Gets the optional version status. /// @@ -325,8 +327,14 @@ private void AppendMajorAndMinorVersion( StringBuilder text, IFormatProvider for } text.Append( MajorVersion.Value.ToString( formatProvider ) ); + + if ( MinorVersion == null ) + { + return; + } + text.Append( '.' ); - text.Append( ( MinorVersion ?? 0 ).ToString( formatProvider ) ); + text.Append( MinorVersion.Value.ToString( formatProvider ) ); } else if ( MinorVersion != null ) { @@ -470,7 +478,7 @@ public bool Equals( ApiVersion other ) return Nullable.Equals( GroupVersion, other.GroupVersion ) && Nullable.Equals( MajorVersion, other.MajorVersion ) && - Nullable.Equals( MinorVersion, other.MinorVersion ) && + ImpliedMinorVersion.Equals( other.ImpliedMinorVersion ) && string.Equals( Status, other.Status, StringComparison.OrdinalIgnoreCase ); } @@ -498,7 +506,7 @@ public virtual int CompareTo( ApiVersion other ) if ( result == 0 ) { - result = Nullable.Compare( MinorVersion, other.MinorVersion ); + result = ImpliedMinorVersion.CompareTo( other.ImpliedMinorVersion ); if ( result == 0 ) { diff --git a/src/Microsoft.AspNet.OData.Versioning/Web.OData/Routing/VersionedODataPathRouteConstraint.cs b/src/Microsoft.AspNet.OData.Versioning/Web.OData/Routing/VersionedODataPathRouteConstraint.cs index b9670197..2c1d4cba 100644 --- a/src/Microsoft.AspNet.OData.Versioning/Web.OData/Routing/VersionedODataPathRouteConstraint.cs +++ b/src/Microsoft.AspNet.OData.Versioning/Web.OData/Routing/VersionedODataPathRouteConstraint.cs @@ -69,7 +69,6 @@ private static ApiVersion GetApiVersionFromRoutePrefix( HttpRequestMessage reque continue; } - requestedVersion = AddMinorVersionIfNeeded( requestedVersion ); request.SetRequestedApiVersion( requestedVersion ); return requestedVersion; } @@ -86,45 +85,6 @@ private static bool TryExtractApiVersionFromSegment( string segment, out ApiVers return TryParse( text, out apiVersion ); } - private static ApiVersion AddMinorVersionIfNeeded( ApiVersion requestedVersion ) - { - Contract.Requires( requestedVersion != null ); - Contract.Ensures( Contract.Result() != null ); - - if ( requestedVersion.MinorVersion != null ) - { - return requestedVersion; - } - - if ( requestedVersion.MajorVersion == null ) - { - return requestedVersion; - } - - var major = requestedVersion.MajorVersion.Value; - - if ( requestedVersion.GroupVersion == null ) - { - if ( requestedVersion.Status == null ) - { - return new ApiVersion( major, 0 ); - } - else - { - return new ApiVersion( major, 0, requestedVersion.Status ); - } - } - - var group = requestedVersion.GroupVersion.Value; - - if ( requestedVersion.Status == null ) - { - return new ApiVersion( group, major, 0 ); - } - - return new ApiVersion( group, major, 0, requestedVersion.Status ); - } - /// /// Gets the API version matched by the current OData path route constraint. /// diff --git a/src/Microsoft.AspNet.WebApi.Versioning/Routing/ApiVersionRouteConstraint.cs b/src/Microsoft.AspNet.WebApi.Versioning/Routing/ApiVersionRouteConstraint.cs index 02cb56de..99126208 100644 --- a/src/Microsoft.AspNet.WebApi.Versioning/Routing/ApiVersionRouteConstraint.cs +++ b/src/Microsoft.AspNet.WebApi.Versioning/Routing/ApiVersionRouteConstraint.cs @@ -39,27 +39,8 @@ public bool Match( HttpRequestMessage request, IHttpRoute route, string paramete return false; } - requestedVersion = DefaultMinorVersionToZeroWhenOnlyMajorVersionIsSpecified( requestedVersion ); request.SetRequestedApiVersion( requestedVersion ); return true; } - - private static ApiVersion DefaultMinorVersionToZeroWhenOnlyMajorVersionIsSpecified( ApiVersion requestedVersion ) - { - Contract.Requires( requestedVersion != null ); - Contract.Ensures( Contract.Result() != null ); - - if ( requestedVersion.MajorVersion == null ) - { - return requestedVersion; - } - - if ( requestedVersion.MinorVersion == null ) - { - return new ApiVersion( requestedVersion.GroupVersion, requestedVersion.MajorVersion, new int?( 0 ), requestedVersion.Status ); - } - - return requestedVersion; - } } } diff --git a/src/Microsoft.AspNetCore.Mvc.Versioning/Routing/ApiVersionRouteConstraint.cs b/src/Microsoft.AspNetCore.Mvc.Versioning/Routing/ApiVersionRouteConstraint.cs index 5a0effee..f2e60671 100644 --- a/src/Microsoft.AspNetCore.Mvc.Versioning/Routing/ApiVersionRouteConstraint.cs +++ b/src/Microsoft.AspNetCore.Mvc.Versioning/Routing/ApiVersionRouteConstraint.cs @@ -37,27 +37,8 @@ public bool Match( HttpContext httpContext, IRouter route, string routeKey, Rout return false; } - requestedVersion = DefaultMinorVersionToZeroWhenOnlyMajorVersionIsSpecified( requestedVersion ); httpContext.SetRequestedApiVersion( requestedVersion ); return true; } - - private static ApiVersion DefaultMinorVersionToZeroWhenOnlyMajorVersionIsSpecified( ApiVersion requestedVersion ) - { - Contract.Requires( requestedVersion != null ); - Contract.Ensures( Contract.Result() != null ); - - if ( requestedVersion.MajorVersion == null ) - { - return requestedVersion; - } - - if ( requestedVersion.MinorVersion == null ) - { - return new ApiVersion( requestedVersion.GroupVersion, requestedVersion.MajorVersion, new int?( 0 ), requestedVersion.Status ); - } - - return requestedVersion; - } } } diff --git a/test/Microsoft.AspNet.WebApi.Versioning.Tests/ApiVersionTest.cs b/test/Microsoft.AspNet.WebApi.Versioning.Tests/ApiVersionTest.cs index d554780f..60ac69f4 100644 --- a/test/Microsoft.AspNet.WebApi.Versioning.Tests/ApiVersionTest.cs +++ b/test/Microsoft.AspNet.WebApi.Versioning.Tests/ApiVersionTest.cs @@ -191,14 +191,18 @@ public void is_valid_status_should_return_false_for_invalid_status( string statu [Theory] [InlineData( "2013-08-06", "2013-08-06", null, null, null )] [InlineData( "2013-08-06-Alpha", "2013-08-06", null, null, "Alpha" )] + [InlineData( "1", null, 1, null, null )] [InlineData( "1.1", null, 1, 1, null )] + [InlineData( "1-Alpha", null, 1, null, "Alpha" )] [InlineData( "1.1-Alpha", null, 1, 1, "Alpha" )] + [InlineData( "2013-08-06.1", "2013-08-06", 1, null, null )] [InlineData( "2013-08-06.1.1", "2013-08-06", 1, 1, null )] + [InlineData( "2013-08-06.1-Alpha", "2013-08-06", 1, null, "Alpha" )] [InlineData( "2013-08-06.1.1-Alpha", "2013-08-06", 1, 1, "Alpha" )] public void parse_should_return_expected_result( string text, string groupVersionValue, int? majorVersion, int? minorVersion, string status ) { // arrange - var groupVersion = groupVersionValue == null ? null : new DateTime?( DateTime.Parse( groupVersionValue ) ); + var groupVersion = groupVersionValue == null ? null : new DateTime?( Parse( groupVersionValue ) ); // act var apiVersion = ApiVersion.Parse( text ); @@ -233,9 +237,13 @@ public void parse_should_throw_format_exception_for_invalid_text( string text, s [Theory] [InlineData( "2013-08-06", "2013-08-06", null, null, null )] [InlineData( "2013-08-06-Alpha", "2013-08-06", null, null, "Alpha" )] + [InlineData( "1", null, 1, null, null )] [InlineData( "1.1", null, 1, 1, null )] + [InlineData( "1-Alpha", null, 1, null, "Alpha" )] [InlineData( "1.1-Alpha", null, 1, 1, "Alpha" )] + [InlineData( "2013-08-06.1", "2013-08-06", 1, null, null )] [InlineData( "2013-08-06.1.1", "2013-08-06", 1, 1, null )] + [InlineData( "2013-08-06.1-Alpha", "2013-08-06", 1, null, "Alpha" )] [InlineData( "2013-08-06.1.1-Alpha", "2013-08-06", 1, 1, "Alpha" )] public void try_parse_should_return_expected_api_version( string text, string groupVersionValue, int? majorVersion, int? minorVersion, string status ) { @@ -278,9 +286,12 @@ public void try_parse_should_return_false_when_text_is_invalid( string text ) [Theory] [InlineData( "2013-08-06" )] [InlineData( "2013-08-06-Alpha" )] + [InlineData( "1" )] [InlineData( "1.1" )] [InlineData( "1.1-Alpha" )] + [InlineData( "2013-08-06.1" )] [InlineData( "2013-08-06.1.1" )] + [InlineData( "2013-08-06.1-Alpha" )] [InlineData( "2013-08-06.1.1-Alpha" )] public void to_string_should_return_expected_string( string text ) { @@ -362,9 +373,13 @@ public void to_string_with_format_provider_should_throw_format_exception_when_fo [Theory] [InlineData( "2013-08-06" )] [InlineData( "2013-08-06-Alpha" )] + [InlineData( "1" )] [InlineData( "1.1" )] + [InlineData( "1-Alpha" )] [InlineData( "1.1-Alpha" )] + [InlineData( "2013-08-06.1" )] [InlineData( "2013-08-06.1.1" )] + [InlineData( "2013-08-06.1-Alpha" )] [InlineData( "2013-08-06.1.1-Alpha" )] public void equals_should_return_true_when_api_versions_are_equal( string text ) { @@ -382,9 +397,13 @@ public void equals_should_return_true_when_api_versions_are_equal( string text ) [Theory] [InlineData( "2013-08-06" )] [InlineData( "2013-08-06-Alpha" )] + [InlineData( "1" )] [InlineData( "1.1" )] + [InlineData( "1-Alpha" )] [InlineData( "1.1-Alpha" )] + [InlineData( "2013-08-06.1" )] [InlineData( "2013-08-06.1.1" )] + [InlineData( "2013-08-06.1-Alpha" )] [InlineData( "2013-08-06.1.1-Alpha" )] public void equals_override_should_return_true_when_api_versions_are_equal( string text ) { @@ -402,9 +421,13 @@ public void equals_override_should_return_true_when_api_versions_are_equal( stri [Theory] [InlineData( "2013-08-06" )] [InlineData( "2013-08-06-Alpha" )] + [InlineData( "1" )] [InlineData( "1.1" )] + [InlineData( "1-Alpha" )] [InlineData( "1.1-Alpha" )] + [InlineData( "2013-08-06.1" )] [InlineData( "2013-08-06.1.1" )] + [InlineData( "2013-08-06.1-Alpha" )] [InlineData( "2013-08-06.1.1-Alpha" )] public void X3DX3D_should_return_true_when_api_versions_are_equal( string text ) { @@ -448,7 +471,7 @@ public void equals_override_should_return_false_when_api_versions_are_not_equal( } [Fact] - public void X21X3D_should_return_true_when_api_versions_are_not_equal() + public void ne_should_return_true_when_api_versions_are_not_equal() { // arrange var v1 = new ApiVersion( Today ); @@ -468,12 +491,17 @@ public void X21X3D_should_return_true_when_api_versions_are_not_equal() [InlineData( "2013-08-06-Alpha", "2013-08-06-Alpha", 0 )] [InlineData( "2013-08-06-Beta", "2013-08-06-Alpha", 1 )] [InlineData( "2013-08-06-Alpha", "2013-08-06-Beta", -1 )] + [InlineData( "1", "1", 0 )] + [InlineData( "1", "1.0", 0 )] [InlineData( "1.1", "1.1", 0 )] [InlineData( "2.0", "1.1", 1 )] [InlineData( "1.1", "2.0", -1 )] + [InlineData( "1-Alpha", "1-Alpha", 0 )] + [InlineData( "1-Alpha", "1.0-Alpha", 0 )] [InlineData( "1.1-Alpha", "1.1-Alpha", 0 )] [InlineData( "1.1-Beta", "1.1-Alpha", 1 )] [InlineData( "1.1-Alpha", "1.1-Beta", -1 )] + [InlineData( "2013-08-06.1", "2013-08-06.1.0", 0 )] [InlineData( "2013-08-06.1.1", "2013-08-06.1.1", 0 )] [InlineData( "2013-08-06.2", "2013-08-06.1.1", 1 )] [InlineData( "2013-08-06.1", "2013-08-06.1.1", -1 )] @@ -502,15 +530,23 @@ public void api_version_comparisons_should_return_expected_result( string versio [InlineData( "2013-08-06-Alpha", "2013-08-06-Alpha", false )] [InlineData( "2013-08-06-Beta", "2013-08-06-Alpha", false )] [InlineData( "2013-08-06-Alpha", "2013-08-06-Beta", true )] + [InlineData( "1", "1", false )] + [InlineData( "1", "1.0", false )] [InlineData( "1.1", "1.1", false )] [InlineData( "2.0", "1.1", false )] [InlineData( "1.1", "2.0", true )] + [InlineData( "1-Alpha", "1-Alpha", false )] + [InlineData( "1-Alpha", "1.0-Alpha", false )] [InlineData( "1.1-Alpha", "1.1-Alpha", false )] [InlineData( "1.1-Beta", "1.1-Alpha", false )] [InlineData( "1.1-Alpha", "1.1-Beta", true )] + [InlineData( "2013-08-06.1", "2013-08-06.1", false )] + [InlineData( "2013-08-06.1", "2013-08-06.1.0", false )] [InlineData( "2013-08-06.1.1", "2013-08-06.1.1", false )] [InlineData( "2013-08-06.2", "2013-08-06.1.1", false )] [InlineData( "2013-08-06.1", "2013-08-06.1.1", true )] + [InlineData( "2013-08-06.1-Alpha", "2013-08-06.1-Alpha", false )] + [InlineData( "2013-08-06.1-Alpha", "2013-08-06.1.0-Alpha", false )] [InlineData( "2013-08-06.1.1-Alpha", "2013-08-06.1.1-Alpha", false )] [InlineData( "2013-08-06.1.1-Beta", "2013-08-06.1.1-Alpha", false )] [InlineData( "2013-08-06.1.1-Alpha", "2013-08-06.1.1-Beta", true )] @@ -538,15 +574,23 @@ public void api_version_1_lt_api_version_2_should_return_expected_result( string [InlineData( "2013-08-06-Alpha", "2013-08-06-Alpha", true )] [InlineData( "2013-08-06-Beta", "2013-08-06-Alpha", false )] [InlineData( "2013-08-06-Alpha", "2013-08-06-Beta", true )] + [InlineData( "1", "1", true )] + [InlineData( "1", "1.0", true )] [InlineData( "1.1", "1.1", true )] [InlineData( "2.0", "1.1", false )] [InlineData( "1.1", "2.0", true )] + [InlineData( "1-Alpha", "1-Alpha", true )] + [InlineData( "1-Alpha", "1.0-Alpha", true )] [InlineData( "1.1-Alpha", "1.1-Alpha", true )] [InlineData( "1.1-Beta", "1.1-Alpha", false )] [InlineData( "1.1-Alpha", "1.1-Beta", true )] + [InlineData( "2013-08-06.1", "2013-08-06.1", true )] + [InlineData( "2013-08-06.1", "2013-08-06.1.0", true )] [InlineData( "2013-08-06.1.1", "2013-08-06.1.1", true )] [InlineData( "2013-08-06.2", "2013-08-06.1.1", false )] [InlineData( "2013-08-06.1", "2013-08-06.1.1", true )] + [InlineData( "2013-08-06.1-Alpha", "2013-08-06.1-Alpha", true )] + [InlineData( "2013-08-06.1-Alpha", "2013-08-06.1.0-Alpha", true )] [InlineData( "2013-08-06.1.1-Alpha", "2013-08-06.1.1-Alpha", true )] [InlineData( "2013-08-06.1.1-Beta", "2013-08-06.1.1-Alpha", false )] [InlineData( "2013-08-06.1.1-Alpha", "2013-08-06.1.1-Beta", true )] @@ -574,15 +618,23 @@ public void api_version_1_le_api_version_2_should_return_expected_result( string [InlineData( "2013-08-06-Alpha", "2013-08-06-Alpha", false )] [InlineData( "2013-08-06-Beta", "2013-08-06-Alpha", true )] [InlineData( "2013-08-06-Alpha", "2013-08-06-Beta", false )] + [InlineData( "1", "1", false )] + [InlineData( "1", "1.0", false )] [InlineData( "1.1", "1.1", false )] [InlineData( "2.0", "1.1", true )] [InlineData( "1.1", "2.0", false )] + [InlineData( "1-Alpha", "1-Alpha", false )] + [InlineData( "1-Alpha", "1.0-Alpha", false )] [InlineData( "1.1-Alpha", "1.1-Alpha", false )] [InlineData( "1.1-Beta", "1.1-Alpha", true )] [InlineData( "1.1-Alpha", "1.1-Beta", false )] + [InlineData( "2013-08-06.1", "2013-08-06.1", false )] + [InlineData( "2013-08-06.1", "2013-08-06.1.0", false )] [InlineData( "2013-08-06.1.1", "2013-08-06.1.1", false )] [InlineData( "2013-08-06.2", "2013-08-06.1.1", true )] [InlineData( "2013-08-06.1", "2013-08-06.1.1", false )] + [InlineData( "2013-08-06.1-Alpha", "2013-08-06.1-Alpha", false )] + [InlineData( "2013-08-06.1-Alpha", "2013-08-06.1.0-Alpha", false )] [InlineData( "2013-08-06.1.1-Alpha", "2013-08-06.1.1-Alpha", false )] [InlineData( "2013-08-06.1.1-Beta", "2013-08-06.1.1-Alpha", true )] [InlineData( "2013-08-06.1.1-Alpha", "2013-08-06.1.1-Beta", false )] @@ -610,15 +662,23 @@ public void api_version_1_gt_api_version_2_should_return_expected_result( string [InlineData( "2013-08-06-Alpha", "2013-08-06-Alpha", true )] [InlineData( "2013-08-06-Beta", "2013-08-06-Alpha", true )] [InlineData( "2013-08-06-Alpha", "2013-08-06-Beta", false )] + [InlineData( "1", "1", true )] + [InlineData( "1", "1.0", true )] [InlineData( "1.1", "1.1", true )] [InlineData( "2.0", "1.1", true )] [InlineData( "1.1", "2.0", false )] + [InlineData( "1-Alpha", "1-Alpha", true )] + [InlineData( "1-Alpha", "1.0-Alpha", true )] [InlineData( "1.1-Alpha", "1.1-Alpha", true )] [InlineData( "1.1-Beta", "1.1-Alpha", true )] [InlineData( "1.1-Alpha", "1.1-Beta", false )] + [InlineData( "2013-08-06.1", "2013-08-06.1", true )] + [InlineData( "2013-08-06.1", "2013-08-06.1.0", true )] [InlineData( "2013-08-06.1.1", "2013-08-06.1.1", true )] [InlineData( "2013-08-06.2", "2013-08-06.1.1", true )] [InlineData( "2013-08-06.1", "2013-08-06.1.1", false )] + [InlineData( "2013-08-06.1-Alpha", "2013-08-06.1-Alpha", true )] + [InlineData( "2013-08-06.1-Alpha", "2013-08-06.1.0-Alpha", true )] [InlineData( "2013-08-06.1.1-Alpha", "2013-08-06.1.1-Alpha", true )] [InlineData( "2013-08-06.1.1-Beta", "2013-08-06.1.1-Alpha", true )] [InlineData( "2013-08-06.1.1-Alpha", "2013-08-06.1.1-Beta", false )]