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 )]