diff --git a/src/SDammann.WebApi.Versioning.Tests/Discovery/DefaultAttributeControllerVersionDetector.cs b/src/SDammann.WebApi.Versioning.Tests/Discovery/DefaultAttributeControllerVersionDetector.cs index 8ca2b5e..4c35871 100644 --- a/src/SDammann.WebApi.Versioning.Tests/Discovery/DefaultAttributeControllerVersionDetector.cs +++ b/src/SDammann.WebApi.Versioning.Tests/Discovery/DefaultAttributeControllerVersionDetector.cs @@ -5,6 +5,7 @@ using TestSupport.Version1; using TestSupport.Version1.Version; using Versioning.Discovery; + using SDammann.WebApi.Versioning.Tests.TestSupport; [TestClass] public class DefaultAttributeControllerVersionDetectorTests { @@ -35,5 +36,41 @@ public void NamespaceControllerVersionDetector_DetectsNoCatControllerVersion() // assert Assert.AreSame(UndefinedApiVersion.Instance, version, "Expected a no SemApiVersion instance to be detected"); } + + /// + /// Test to see if support for 2 number versions is implemented correctly (using an ApiVersion(x, x) attribute) + /// + [TestMethod] + public void AttributeControllerVersionDetector_Detects3_5VersionByAttribute() + { + // given + IControllerVersionDetector detector = new DefaultAttributeControllerVersionDetector(); + Type catControllerType = typeof(DogController); + + // when + SemVerApiVersion version = detector.GetVersion(catControllerType) as SemVerApiVersion; + + // assert + Assert.IsNotNull(version, "Expected a SemApiVersion instance to be detected"); + Assert.AreEqual(new Version(3, 5), version.Version, "Expected a version 3.5 to be detected"); + } + + /// + /// Test to see if support for 3 number versions is implemented correctly (using an ApiVersion(x, x, x) attribute) + /// + [TestMethod] + public void AttributeControllerVersionDetector_Detects3_5_2VersionByAttribute() + { + // given + IControllerVersionDetector detector = new DefaultAttributeControllerVersionDetector(); + Type catControllerType = typeof(HorseController); + + // when + SemVerApiVersion version = detector.GetVersion(catControllerType) as SemVerApiVersion; + + // assert + Assert.IsNotNull(version, "Expected a SemApiVersion instance to be detected"); + Assert.AreEqual(new Version(1, 5, 2), version.Version, "Expected a version 1.5.2 to be detected"); + } } } diff --git a/src/SDammann.WebApi.Versioning.Tests/SDammann.WebApi.Versioning.Tests.csproj b/src/SDammann.WebApi.Versioning.Tests/SDammann.WebApi.Versioning.Tests.csproj index ba81a2f..f0d9650 100644 --- a/src/SDammann.WebApi.Versioning.Tests/SDammann.WebApi.Versioning.Tests.csproj +++ b/src/SDammann.WebApi.Versioning.Tests/SDammann.WebApi.Versioning.Tests.csproj @@ -97,6 +97,8 @@ + + diff --git a/src/SDammann.WebApi.Versioning.Tests/TestSupport/DogController_v3_5.cs b/src/SDammann.WebApi.Versioning.Tests/TestSupport/DogController_v3_5.cs new file mode 100644 index 0000000..cdb1f25 --- /dev/null +++ b/src/SDammann.WebApi.Versioning.Tests/TestSupport/DogController_v3_5.cs @@ -0,0 +1,10 @@ +namespace SDammann.WebApi.Versioning.Tests.TestSupport +{ + using System.Web.Http; + using SDammann.WebApi.Versioning.Discovery; + + [ApiVersion(3, 5)] + internal class DogController : ApiController + { + } +} diff --git a/src/SDammann.WebApi.Versioning.Tests/TestSupport/HorseController_v1_5_2.cs b/src/SDammann.WebApi.Versioning.Tests/TestSupport/HorseController_v1_5_2.cs new file mode 100644 index 0000000..96a5be0 --- /dev/null +++ b/src/SDammann.WebApi.Versioning.Tests/TestSupport/HorseController_v1_5_2.cs @@ -0,0 +1,10 @@ +namespace SDammann.WebApi.Versioning.Tests.TestSupport +{ + using System.Web.Http; + using SDammann.WebApi.Versioning.Discovery; + + [ApiVersion(1, 5, 2)] + internal class HorseController : ApiController + { + } +} diff --git a/src/SDammann.WebApi.Versioning/Discovery/ApiVersionAttribute.cs b/src/SDammann.WebApi.Versioning/Discovery/ApiVersionAttribute.cs index 39bf88f..9ea7c8a 100644 --- a/src/SDammann.WebApi.Versioning/Discovery/ApiVersionAttribute.cs +++ b/src/SDammann.WebApi.Versioning/Discovery/ApiVersionAttribute.cs @@ -1,11 +1,13 @@ -namespace SDammann.WebApi.Versioning.Discovery { +namespace SDammann.WebApi.Versioning.Discovery +{ using System; /// /// This attribute can be used to decorate controllers to specify and API version /// [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)] - public sealed class ApiVersionAttribute : Attribute { + public sealed class ApiVersionAttribute : Attribute + { private readonly int _majorVersion; private readonly int _minorVersion; private readonly int _buildVersion = -1; @@ -14,7 +16,8 @@ public sealed class ApiVersionAttribute : Attribute { /// /// Initializes a new instance of the class. /// - public ApiVersionAttribute(int majorVersion, int minorVersion) { + public ApiVersionAttribute(int majorVersion, int minorVersion) + { this._majorVersion = majorVersion; this._minorVersion = minorVersion; } @@ -22,7 +25,8 @@ public ApiVersionAttribute(int majorVersion, int minorVersion) { /// /// Initializes a new instance of the class. /// - public ApiVersionAttribute(int majorVersion, int minorVersion, int buildVersion) { + public ApiVersionAttribute(int majorVersion, int minorVersion, int buildVersion) + { this._majorVersion = majorVersion; this._minorVersion = minorVersion; this._buildVersion = buildVersion; @@ -31,7 +35,8 @@ public ApiVersionAttribute(int majorVersion, int minorVersion, int buildVersion) /// /// Initializes a new instance of the class. /// - public ApiVersionAttribute(int majorVersion, int minorVersion, int buildVersion, int revisionVersion) { + public ApiVersionAttribute(int majorVersion, int minorVersion, int buildVersion, int revisionVersion) + { this._majorVersion = majorVersion; this._minorVersion = minorVersion; this._buildVersion = buildVersion; @@ -41,11 +46,18 @@ public ApiVersionAttribute(int majorVersion, int minorVersion, int buildVersion, /// /// Gets a instance based on the version information contained in this attribute /// - public Version Version { - get { + public Version Version + { + get + { + if (this._buildVersion == -1) + return new Version(this._majorVersion, this._minorVersion); + if (this._revisionVersion == -1) + return new Version(this._majorVersion, this._minorVersion, this._buildVersion); + return new Version(this._majorVersion, this._minorVersion, this._buildVersion, this._revisionVersion); } } - + } } \ No newline at end of file