From f6bb8d163bfb83cbcefa593a34e55fc9d9d4bcbc Mon Sep 17 00:00:00 2001 From: Myk Date: Fri, 3 Nov 2017 17:53:31 +1100 Subject: [PATCH] Add replaced_by to Schema --- CKAN.schema | 19 + Spec.md | 13 +- Tests/Core/KSP.cs | 8 +- Tests/Core/Registry/Registry.cs | 378 +++--- Tests/Core/Registry/RegistryLive.cs | 94 +- Tests/Core/Versioning/KspVersionRangeTests.cs | 1204 ++++++++--------- Tests/GUI/GUIMod.cs | 92 +- .../GeneratedByTransformerTests.cs | 58 +- Tests/app.config | 20 +- assets/README.md | 12 +- nuget.config | 20 +- 11 files changed, 970 insertions(+), 948 deletions(-) diff --git a/CKAN.schema b/CKAN.schema index e1eca9b401..ef933da017 100644 --- a/CKAN.schema +++ b/CKAN.schema @@ -144,6 +144,25 @@ "items" : { "type" : "string" }, "uniqueItems" : true }, + "replaced_by" : { + "description" : "Optional pointer to mod that should be selected instead and treated as an update to this mod", + "type" : "object", + "properties" : { + "name" : { + "description" : "Identifier of the mod", + "$ref" : "#/definitions/identifier" + }, + "version" : { + "description" : "Optional version", + "$ref" : "#/definitions/version" + }, + "min_version" : { + "description" : "Optional minimum version", + "$ref" : "#/definitions/version" + } + }, + "required" : [ "name" ] + }, "resources" : { "description" : "Additional resources", "type" : "object", diff --git a/Spec.md b/Spec.md index 1af10e6840..0801bd737d 100644 --- a/Spec.md +++ b/Spec.md @@ -481,11 +481,14 @@ A list of mods which *conflict* with this mod. The current mod ##### replaced-by -(**v1.22**) This is a way to mark a specific mod identifier as being -obsoleted and tell the client what it has been *replaced by*. It contains a -list of mods that should be selected for installation if this mod is -selected for updating, while this mod is uninstalled. If this mod identifier -is brought back to life, an epoch change should be applied. +(**v1.24**) This is a way to mark a specific mod identifier as being +obsoleted and tell the client what it has been *replaced by*. It contains a +single mod that should be selected for installation if this mod is +selected for updating, while this mod is uninstalled. If this mod identifier +is brought back to life, an epoch change should be applied. A *replaced_by* +relationship should be added to the final release of the mod being replaced. +The listed mod should include a "provides" relationship either to this mod, +or one of this mod's listed "provides". #### resources diff --git a/Tests/Core/KSP.cs b/Tests/Core/KSP.cs index 3dee9ef35f..87e7e74b11 100644 --- a/Tests/Core/KSP.cs +++ b/Tests/Core/KSP.cs @@ -25,13 +25,13 @@ public void Setup() public void TearDown() { if (ksp != null) - { - // Manually dispose of RegistryManager - // For some reason the KSP instance doesn't do this itself causing test failures because the registry + { + // Manually dispose of RegistryManager + // For some reason the KSP instance doesn't do this itself causing test failures because the registry // lock file is still in use. So just dispose of it ourselves. CKAN.RegistryManager.Instance(ksp).Dispose(); ksp.Dispose(); - } + } Directory.Delete(ksp_dir, true); } diff --git a/Tests/Core/Registry/Registry.cs b/Tests/Core/Registry/Registry.cs index ab67197392..9c58e91f6c 100644 --- a/Tests/Core/Registry/Registry.cs +++ b/Tests/Core/Registry/Registry.cs @@ -1,189 +1,189 @@ -using System.Transactions; -using CKAN; -using CKAN.Versioning; -using NUnit.Framework; -using Tests.Data; - -namespace Tests.Core.Registry -{ - [TestFixture] - public class Registry - { - private static readonly CkanModule module = TestData.kOS_014_module(); - private static readonly string identifier = module.identifier; - private static readonly KspVersionCriteria v0_24_2 = new KspVersionCriteria(KspVersion.Parse("0.24.2")); - private static readonly KspVersionCriteria v0_25_0 = new KspVersionCriteria (KspVersion.Parse("0.25.0")); - - private CKAN.Registry registry; - - [SetUp] - public void Setup() - { - // Provide an empty registry before each test. - registry = CKAN.Registry.Empty(); - Assert.IsNotNull(registry); - } - - [Test] - public void Empty() - { - CKAN.Registry registry = CKAN.Registry.Empty(); - Assert.IsInstanceOf(registry); - - } - - [Test] - public void AddAvailable() - { - // We shouldn't have kOS in our registry. - Assert.IsFalse(registry.available_modules.ContainsKey(module.identifier)); - - // Register - registry.AddAvailable(module); - - // Make sure it's now there. - Assert.IsTrue(registry.available_modules.ContainsKey(module.identifier)); - } - - [Test] - public void RemoveAvailableByName() - { - // Add our module and test it's there. - registry.AddAvailable(module); - Assert.IsNotNull(registry.LatestAvailable(identifier, v0_24_2)); - - // Remove it, and make sure it's gone. - registry.RemoveAvailable(identifier, module.version); - - Assert.IsNull(registry.LatestAvailable(identifier, v0_24_2)); - } - - [Test] - public void RemoveAvailableByModule() - { - // Add our module and test it's there. - registry.AddAvailable(module); - Assert.IsNotNull(registry.LatestAvailable(identifier, v0_24_2)); - - // Remove it, and make sure it's gone. - registry.RemoveAvailable(module); - - Assert.IsNull(registry.LatestAvailable(identifier, v0_24_2)); - } - - [Test] - public void LatestAvailable() - { - - registry.AddAvailable(module); - - // Make sure it's there for 0.24.2 - Assert.AreEqual(module.ToString(), registry.LatestAvailable(identifier, v0_24_2).ToString()); - - // But not for 0.25.0 - Assert.IsNull(registry.LatestAvailable(identifier, v0_25_0)); - - // And that we fail if we ask for something we don't know. - Assert.Throws(delegate - { - registry.LatestAvailable("ToTheMun", v0_24_2); - }); - } - - [Test] - public void TxEmbeddedCommit() - { - // Our registry should work when we initialise it inside our Tx and commit. - - CKAN.Registry reg; - - using (var scope = new TransactionScope()) - { - reg = CKAN.Registry.Empty(); - reg.AddAvailable(module); - Assert.AreEqual(identifier, reg.LatestAvailable(identifier, null).identifier); - scope.Complete(); - } - Assert.AreEqual(identifier, reg.LatestAvailable(identifier, null).identifier); - } - - [Test] - public void TxCommit() - { - // Our registry should work fine on committed transactions. - - using (var scope = new TransactionScope()) - { - registry.AddAvailable(module); - Assert.AreEqual(module.identifier, registry.LatestAvailable(identifier, null).identifier); - - scope.Complete(); - } - Assert.AreEqual(module.identifier, registry.LatestAvailable(identifier, null).identifier); - } - - [Test] - public void TxRollback() - { - // Our registry should roll-back any changes it made during a transaction. - - using (var scope = new TransactionScope()) - { - registry.AddAvailable(module); - Assert.AreEqual(module.identifier, registry.LatestAvailable(identifier,null).identifier); - - scope.Dispose(); // Rollback, our module should no longer be available. - } - - Assert.Throws(delegate - { - registry.LatestAvailable(identifier,null); - }); - } - - [Test] - public void TxNested() - { - // Our registry doesn't understand how to do nested transactions, - // make sure it throws on these. - - using (var scope = new TransactionScope()) - { - registry.AddAvailable(module); - - using (var scope2 = new TransactionScope(TransactionScopeOption.RequiresNew)) - { - Assert.Throws(delegate - { - registry.AddAvailable(TestData.DogeCoinFlag_101_module()); - }); - scope2.Complete(); - } - scope.Complete(); - } - } - - [Test] - public void TxAmbient() - { - // Our registry should be fine with ambient transactions, which join together. - // Note the absence of TransactionScopeOption.RequiresNew - - using (var scope = new TransactionScope()) - { - registry.AddAvailable(module); - - using (var scope2 = new TransactionScope()) - { - Assert.DoesNotThrow(delegate - { - registry.AddAvailable(TestData.DogeCoinFlag_101_module()); - }); - scope2.Complete(); - } - scope.Complete(); - } - } - } -} - +using System.Transactions; +using CKAN; +using CKAN.Versioning; +using NUnit.Framework; +using Tests.Data; + +namespace Tests.Core.Registry +{ + [TestFixture] + public class Registry + { + private static readonly CkanModule module = TestData.kOS_014_module(); + private static readonly string identifier = module.identifier; + private static readonly KspVersionCriteria v0_24_2 = new KspVersionCriteria(KspVersion.Parse("0.24.2")); + private static readonly KspVersionCriteria v0_25_0 = new KspVersionCriteria (KspVersion.Parse("0.25.0")); + + private CKAN.Registry registry; + + [SetUp] + public void Setup() + { + // Provide an empty registry before each test. + registry = CKAN.Registry.Empty(); + Assert.IsNotNull(registry); + } + + [Test] + public void Empty() + { + CKAN.Registry registry = CKAN.Registry.Empty(); + Assert.IsInstanceOf(registry); + + } + + [Test] + public void AddAvailable() + { + // We shouldn't have kOS in our registry. + Assert.IsFalse(registry.available_modules.ContainsKey(module.identifier)); + + // Register + registry.AddAvailable(module); + + // Make sure it's now there. + Assert.IsTrue(registry.available_modules.ContainsKey(module.identifier)); + } + + [Test] + public void RemoveAvailableByName() + { + // Add our module and test it's there. + registry.AddAvailable(module); + Assert.IsNotNull(registry.LatestAvailable(identifier, v0_24_2)); + + // Remove it, and make sure it's gone. + registry.RemoveAvailable(identifier, module.version); + + Assert.IsNull(registry.LatestAvailable(identifier, v0_24_2)); + } + + [Test] + public void RemoveAvailableByModule() + { + // Add our module and test it's there. + registry.AddAvailable(module); + Assert.IsNotNull(registry.LatestAvailable(identifier, v0_24_2)); + + // Remove it, and make sure it's gone. + registry.RemoveAvailable(module); + + Assert.IsNull(registry.LatestAvailable(identifier, v0_24_2)); + } + + [Test] + public void LatestAvailable() + { + + registry.AddAvailable(module); + + // Make sure it's there for 0.24.2 + Assert.AreEqual(module.ToString(), registry.LatestAvailable(identifier, v0_24_2).ToString()); + + // But not for 0.25.0 + Assert.IsNull(registry.LatestAvailable(identifier, v0_25_0)); + + // And that we fail if we ask for something we don't know. + Assert.Throws(delegate + { + registry.LatestAvailable("ToTheMun", v0_24_2); + }); + } + + [Test] + public void TxEmbeddedCommit() + { + // Our registry should work when we initialise it inside our Tx and commit. + + CKAN.Registry reg; + + using (var scope = new TransactionScope()) + { + reg = CKAN.Registry.Empty(); + reg.AddAvailable(module); + Assert.AreEqual(identifier, reg.LatestAvailable(identifier, null).identifier); + scope.Complete(); + } + Assert.AreEqual(identifier, reg.LatestAvailable(identifier, null).identifier); + } + + [Test] + public void TxCommit() + { + // Our registry should work fine on committed transactions. + + using (var scope = new TransactionScope()) + { + registry.AddAvailable(module); + Assert.AreEqual(module.identifier, registry.LatestAvailable(identifier, null).identifier); + + scope.Complete(); + } + Assert.AreEqual(module.identifier, registry.LatestAvailable(identifier, null).identifier); + } + + [Test] + public void TxRollback() + { + // Our registry should roll-back any changes it made during a transaction. + + using (var scope = new TransactionScope()) + { + registry.AddAvailable(module); + Assert.AreEqual(module.identifier, registry.LatestAvailable(identifier,null).identifier); + + scope.Dispose(); // Rollback, our module should no longer be available. + } + + Assert.Throws(delegate + { + registry.LatestAvailable(identifier,null); + }); + } + + [Test] + public void TxNested() + { + // Our registry doesn't understand how to do nested transactions, + // make sure it throws on these. + + using (var scope = new TransactionScope()) + { + registry.AddAvailable(module); + + using (var scope2 = new TransactionScope(TransactionScopeOption.RequiresNew)) + { + Assert.Throws(delegate + { + registry.AddAvailable(TestData.DogeCoinFlag_101_module()); + }); + scope2.Complete(); + } + scope.Complete(); + } + } + + [Test] + public void TxAmbient() + { + // Our registry should be fine with ambient transactions, which join together. + // Note the absence of TransactionScopeOption.RequiresNew + + using (var scope = new TransactionScope()) + { + registry.AddAvailable(module); + + using (var scope2 = new TransactionScope()) + { + Assert.DoesNotThrow(delegate + { + registry.AddAvailable(TestData.DogeCoinFlag_101_module()); + }); + scope2.Complete(); + } + scope.Complete(); + } + } + } +} + diff --git a/Tests/Core/Registry/RegistryLive.cs b/Tests/Core/Registry/RegistryLive.cs index 683573a272..be32bcc4fe 100644 --- a/Tests/Core/Registry/RegistryLive.cs +++ b/Tests/Core/Registry/RegistryLive.cs @@ -1,47 +1,47 @@ -using CKAN; -using CKAN.Versioning; -using NUnit.Framework; -using Tests.Data; - -namespace Tests.Core.Registry -{ - /// - /// These are tests on a live registry extracted from one of the developers' - /// systems. - /// - - [TestFixture] - public class RegistryLive - { - private static string test_registry = TestData.TestRegistry(); - private DisposableKSP temp_ksp; - private CKAN.IRegistryQuerier registry; - - [SetUp] - public void Setup() - { - // Make a fake KSP install - temp_ksp = new DisposableKSP(null, test_registry); - - // Easy short-cut - registry = CKAN.RegistryManager.Instance(temp_ksp.KSP).registry; - } - - [TearDown] - public void TearDown() - { - temp_ksp.Dispose(); - } - - [Test] - public void LatestAvailable() - { - CkanModule module = - registry.LatestAvailable("AGExt", new KspVersionCriteria (temp_ksp.KSP.Version())); - - Assert.AreEqual("AGExt", module.identifier); - Assert.AreEqual("1.24a", module.version.ToString()); - } - } -} - +using CKAN; +using CKAN.Versioning; +using NUnit.Framework; +using Tests.Data; + +namespace Tests.Core.Registry +{ + /// + /// These are tests on a live registry extracted from one of the developers' + /// systems. + /// + + [TestFixture] + public class RegistryLive + { + private static string test_registry = TestData.TestRegistry(); + private DisposableKSP temp_ksp; + private CKAN.IRegistryQuerier registry; + + [SetUp] + public void Setup() + { + // Make a fake KSP install + temp_ksp = new DisposableKSP(null, test_registry); + + // Easy short-cut + registry = CKAN.RegistryManager.Instance(temp_ksp.KSP).registry; + } + + [TearDown] + public void TearDown() + { + temp_ksp.Dispose(); + } + + [Test] + public void LatestAvailable() + { + CkanModule module = + registry.LatestAvailable("AGExt", new KspVersionCriteria (temp_ksp.KSP.Version())); + + Assert.AreEqual("AGExt", module.identifier); + Assert.AreEqual("1.24a", module.version.ToString()); + } + } +} + diff --git a/Tests/Core/Versioning/KspVersionRangeTests.cs b/Tests/Core/Versioning/KspVersionRangeTests.cs index 0b54e14367..980971f586 100644 --- a/Tests/Core/Versioning/KspVersionRangeTests.cs +++ b/Tests/Core/Versioning/KspVersionRangeTests.cs @@ -1,602 +1,602 @@ -using CKAN.Versioning; -using NUnit.Framework; - -#pragma warning disable 414 - -namespace Tests.Core.Versioning -{ - public sealed class KspVersionRangeTests - { - private static readonly object[] EqualityCases = - { - new object[] - { - new KspVersionRange(new KspVersionBound(), new KspVersionBound()), - new KspVersionRange(new KspVersionBound(), new KspVersionBound()), - true - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 2, 3, 4), false), - new KspVersionBound(new KspVersion(1, 2, 3, 4), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 2, 3, 4), false), - new KspVersionBound(new KspVersion(1, 2, 3, 4), false) - ), - true - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 2, 3, 4), false), - new KspVersionBound(new KspVersion(5, 6, 7, 8), true) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 2, 3, 4), false), - new KspVersionBound(new KspVersion(5, 6, 7, 8), true) - ), - true - } - }; - - private static readonly object[] ToStringCases = - { - new object[] - { - new KspVersionRange(new KspVersionBound(), new KspVersionBound()), - "[,]" - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 2, 3, 4), false), - new KspVersionBound()), - "(1.2.3.4,]" - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 2, 3, 4), false), - new KspVersionBound(new KspVersion(5, 6, 7, 8), false)), - "(1.2.3.4,5.6.7.8)" - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 2, 3, 4), true), - new KspVersionBound(new KspVersion(5, 6, 7, 8), true)), - "[1.2.3.4,5.6.7.8]" - } - }; - - private static readonly object[] IntersectWithCases = - { - new object[] - { - new KspVersionRange(new KspVersionBound(), new KspVersionBound()), - new KspVersionRange(new KspVersionBound(), new KspVersionBound()), - new KspVersionRange(new KspVersionBound(), new KspVersionBound()), - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 2, 3, 4), true), - new KspVersionBound(new KspVersion(1, 2, 3, 4), true) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 2, 3, 4), true), - new KspVersionBound(new KspVersion(1, 2, 3, 4), true) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 2, 3, 4), true), - new KspVersionBound(new KspVersion(1, 2, 3, 4), true) - ), - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 2, 3, 4), false), - new KspVersionBound(new KspVersion(1, 2, 3, 4), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 2, 3, 4), false), - new KspVersionBound(new KspVersion(1, 2, 3, 4), false) - ), - null - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 2, 3, 4), false), - new KspVersionBound(new KspVersion(1, 2, 3, 4), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 2, 3, 4), true), - new KspVersionBound(new KspVersion(1, 2, 3, 4), true) - ), - null - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), true), - new KspVersionBound(new KspVersion(1, 1, 0, 0), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 0), true), - new KspVersionBound(new KspVersion(1, 0, 5, 0), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 0), true), - new KspVersionBound(new KspVersion(1, 0, 5, 0), false) - ), - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 1, 0, 0), true), - new KspVersionBound(new KspVersion(1, 2, 0, 0), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 0), true), - new KspVersionBound(new KspVersion(1, 0, 5, 0), false) - ), - null - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 1234), true), - new KspVersionBound(new KspVersion(1, 0, 4, 1234), true) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 1234), true), - new KspVersionBound(new KspVersion(1, 0, 4, 1234), true) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 1234), true), - new KspVersionBound(new KspVersion(1, 0, 4, 1234), true) - ), - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 1235), true), - new KspVersionBound(new KspVersion(1, 0, 4, 1235), true) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 1234), true), - new KspVersionBound(new KspVersion(1, 0, 4, 1234), true) - ), - null - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 0), true), - new KspVersionBound(new KspVersion(1, 0, 5, 0), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 1234), true), - new KspVersionBound(new KspVersion(1, 0, 4, 1234), true) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 1234), true), - new KspVersionBound(new KspVersion(1, 0, 4, 1234), true) - ), - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 1234), true), - new KspVersionBound(new KspVersion(1, 0, 4, 1234), true) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 0), true), - new KspVersionBound(new KspVersion(1, 0, 5, 0), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 1234), true), - new KspVersionBound(new KspVersion(1, 0, 4, 1234), true) - ), - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 0), true), - new KspVersionBound(new KspVersion(1, 0, 4, 0), true) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 0), true), - new KspVersionBound(new KspVersion(1, 0, 5, 0), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 0), true), - new KspVersionBound(new KspVersion(1, 0, 4, 0), true) - ), - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), true), - new KspVersionBound(new KspVersion(1, 1, 0, 0), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), true), - new KspVersionBound(new KspVersion(1, 1, 0, 0), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), true), - new KspVersionBound(new KspVersion(1, 1, 0, 0), false) - ), - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 1, 0, 0), true), - new KspVersionBound(new KspVersion(1, 2, 0, 0), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 1, 0, 0), true), - new KspVersionBound(new KspVersion(1, 2, 0, 0), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 1, 0, 0), true), - new KspVersionBound(new KspVersion(1, 2, 0, 0), false) - ), - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 1, 0, 0), true), - new KspVersionBound(new KspVersion(1, 2, 0, 0), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), true), - new KspVersionBound(new KspVersion(1, 1, 0, 0), false) - ), - null - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), true), - new KspVersionBound(new KspVersion(1, 1, 0, 0), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 1, 0, 0), true), - new KspVersionBound(new KspVersion(1, 2, 0, 0), false) - ), - null - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 0), true), - new KspVersionBound() - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 0), true), - new KspVersionBound(new KspVersion(1, 0, 5, 0), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 0), true), - new KspVersionBound(new KspVersion(1, 0, 5, 0), false) - ) - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(), - new KspVersionBound(new KspVersion(1, 0, 4, 0), true) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 0), true), - new KspVersionBound(new KspVersion(1, 0, 5, 0), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 4, 0), true), - new KspVersionBound(new KspVersion(1, 0, 4, 0), true) - ) - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(), - new KspVersionBound(new KspVersion(1, 0, 4, 0), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 3, 0), true), - new KspVersionBound(new KspVersion(1, 0, 4, 0), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 3, 0), true), - new KspVersionBound(new KspVersion(1, 0, 4, 0), false) - ) - } - }; - - private static readonly object[] IsSupersetOfCases = - { - new object[] - { - new KspVersionRange(new KspVersionBound(), new KspVersionBound()), - new KspVersionRange(new KspVersionBound(), new KspVersionBound()), - true - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), true), - new KspVersionBound(new KspVersion(2, 0, 0, 0), true) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), true), - new KspVersionBound(new KspVersion(2, 0, 0, 0), true) - ), - true - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), true), - new KspVersionBound(new KspVersion(2, 0, 0, 0), true) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), false), - new KspVersionBound(new KspVersion(2, 0, 0, 0), false) - ), - true - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), false), - new KspVersionBound(new KspVersion(2, 0, 0, 0), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), false), - new KspVersionBound(new KspVersion(2, 0, 0, 0), false) - ), - true - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), false), - new KspVersionBound(new KspVersion(2, 0, 0, 0), false) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), true), - new KspVersionBound(new KspVersion(2, 0, 0, 0), true) - ), - false - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), true), - new KspVersionBound(new KspVersion(3, 0, 0, 0), true) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(2, 0, 0, 0), false), - new KspVersionBound(new KspVersion(4, 0, 0, 0), false) - ), - false - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(), - new KspVersionBound(new KspVersion(3, 0, 0, 0), true) - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), true), - new KspVersionBound(new KspVersion(2, 0, 0, 0), true) - ), - true - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), true), - new KspVersionBound() - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), true), - new KspVersionBound(new KspVersion(2, 0, 0, 0), true) - ), - true - }, - new object[] - { - new KspVersionRange( - new KspVersionBound(), - new KspVersionBound() - ), - new KspVersionRange( - new KspVersionBound(new KspVersion(1, 0, 0, 0), true), - new KspVersionBound(new KspVersion(2, 0, 0, 0), true) - ), - true - }, - }; - - [Test] - public void CtorWorksCorrectly() - { - // Arrange - var lower = new KspVersionBound(new KspVersion(1, 2, 3, 4), false); - var upper = new KspVersionBound(new KspVersion(5, 6, 7, 8), true); - - // Act - var result = new KspVersionRange(lower, upper); - - // Assert - Assert.That(result.Lower, Is.EqualTo(lower)); - Assert.That(result.Upper, Is.EqualTo(upper)); - } - - [Test] - public void CtorThrowsOnNullLowerParameter() - { - // Act - // ReSharper disable once ObjectCreationAsStatement - TestDelegate act = - () => new KspVersionRange(null, new KspVersionBound(new KspVersion(1, 2, 3, 4), false)); - - // Assert - Assert.That(act, Throws.Exception); - } - - [Test] - public void CtorThrowsOnNullUpperParameter() - { - // Act - // ReSharper disable once ObjectCreationAsStatement - TestDelegate act = - () => new KspVersionRange(new KspVersionBound(new KspVersion(1, 2, 3, 4), false), null); - - // Assert - Assert.That(act, Throws.Exception); - } - - [TestCaseSource("ToStringCases")] - public void ToStringWorksCorrectly(KspVersionRange vr, string expected) - { - // Act - var result = vr.ToString(); - - // Assert - Assert.That(result, Is.EqualTo(expected)); - } - - [TestCaseSource("IntersectWithCases")] - public void IntersectWithWorksCorrectly(KspVersionRange left, KspVersionRange right, KspVersionRange expected) - { - // Act - var result = left.IntersectWith(right); - - // Assert - Assert.That(result, Is.EqualTo(expected)); - } - - [TestCaseSource("IsSupersetOfCases")] - public void IsSupersetOfWorksCorrectly(KspVersionRange left, KspVersionRange right, bool expected) - { - // Act - var result = left.IsSupersetOf(right); - - // Assert - Assert.That(result, Is.EqualTo(expected)); - } - - [Test] - public void IsSupersetOfThrowsOnNullParameter() - { - // Arrange - var sut = new KspVersionRange(new KspVersionBound(), new KspVersionBound()); - - // Act - TestDelegate act = () => sut.IsSupersetOf(null); - - // Assert - Assert.That(act, Throws.Exception); - } - - [TestCaseSource("EqualityCases")] - public void EqualityWorksCorrectly(KspVersionRange vr1, KspVersionRange vr2, bool areEqual) - { - // Act - var genericEquals = vr1.Equals(vr2); - var nonGenericEquals = vr1.Equals((object)vr2); - var equalsOperator = vr1 == vr2; - var notEqualsOperator = vr1 != vr2; - var reverseEqualsOperator = vr2 == vr1; - var reverseNotEqualsOperator = vr2 != vr1; - - // Assert - Assert.AreEqual(areEqual, genericEquals); - Assert.AreEqual(areEqual, nonGenericEquals); - Assert.AreEqual(areEqual, equalsOperator); - Assert.AreNotEqual(areEqual, notEqualsOperator); - Assert.AreEqual(areEqual, reverseEqualsOperator); - Assert.AreNotEqual(areEqual, reverseNotEqualsOperator); - } - - [Test] - public void NullEqualityWorksCorrectly() - { - // Arrange - var sut = new KspVersionRange(new KspVersionBound(), new KspVersionBound()); - - // Act - // ReSharper disable ConditionIsAlwaysTrueOrFalse - var genericEquals = sut.Equals(null); - var nonGenericEquals = sut.Equals((object)null); - var equalsOperatorNullLeft = null == sut; - var equalsOperatorNullRight = sut == null; - var notEqualsOperatorNullLeft = null != sut; - var notEqualsOperatorNullRight = sut != null; - // ReSharper restore ConditionIsAlwaysTrueOrFalse - - // ASsert - Assert.IsFalse(genericEquals); - Assert.IsFalse(nonGenericEquals); - Assert.IsFalse(equalsOperatorNullLeft); - Assert.IsFalse(equalsOperatorNullRight); - Assert.IsTrue(notEqualsOperatorNullLeft); - Assert.IsTrue(notEqualsOperatorNullRight); - } - - [Test] - public void ReferenceEqualityWorksCorrectly() - { - // Arrange - var sut = new KspVersionRange(new KspVersionBound(), new KspVersionBound()); - - // Act - var genericEquals = sut.Equals(sut); - var nonGenericEquals = sut.Equals((object)sut); - - // Assert - Assert.IsTrue(genericEquals); - Assert.IsTrue(nonGenericEquals); - } - - [Test] - public void GetHashCodeDoesNotThrow( - [Random(0, int.MaxValue, 1)]int lowerMajor, - [Random(0, int.MaxValue, 1)]int lowerMinor, - [Random(0, int.MaxValue, 1)]int lowerPatch, - [Random(0, int.MaxValue, 1)]int lowerBuilder, - [Values(false, true)]bool lowerInclusive, - [Random(0, int.MaxValue, 1)]int upperMajor, - [Random(0, int.MaxValue, 1)]int upperMinor, - [Random(0, int.MaxValue, 1)]int upperPatch, - [Random(0, int.MaxValue, 1)]int upperBuilder, - [Values(false, true)]bool upperInclusive - ) - { - // Arrange - var lower = new KspVersionBound( - new KspVersion(lowerMajor, lowerMinor, lowerPatch, lowerBuilder), - lowerInclusive - ); - - var upper = new KspVersionBound( - new KspVersion(upperMajor, upperMinor, upperPatch, upperBuilder), - upperInclusive - ); - - // Act - // ReSharper disable once ReturnValueOfPureMethodIsNotUsed - TestDelegate act = () => new KspVersionRange(lower, upper).GetHashCode(); - - // Assert - Assert.That(act, Throws.Nothing); - } - } -} +using CKAN.Versioning; +using NUnit.Framework; + +#pragma warning disable 414 + +namespace Tests.Core.Versioning +{ + public sealed class KspVersionRangeTests + { + private static readonly object[] EqualityCases = + { + new object[] + { + new KspVersionRange(new KspVersionBound(), new KspVersionBound()), + new KspVersionRange(new KspVersionBound(), new KspVersionBound()), + true + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 2, 3, 4), false), + new KspVersionBound(new KspVersion(1, 2, 3, 4), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 2, 3, 4), false), + new KspVersionBound(new KspVersion(1, 2, 3, 4), false) + ), + true + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 2, 3, 4), false), + new KspVersionBound(new KspVersion(5, 6, 7, 8), true) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 2, 3, 4), false), + new KspVersionBound(new KspVersion(5, 6, 7, 8), true) + ), + true + } + }; + + private static readonly object[] ToStringCases = + { + new object[] + { + new KspVersionRange(new KspVersionBound(), new KspVersionBound()), + "[,]" + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 2, 3, 4), false), + new KspVersionBound()), + "(1.2.3.4,]" + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 2, 3, 4), false), + new KspVersionBound(new KspVersion(5, 6, 7, 8), false)), + "(1.2.3.4,5.6.7.8)" + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 2, 3, 4), true), + new KspVersionBound(new KspVersion(5, 6, 7, 8), true)), + "[1.2.3.4,5.6.7.8]" + } + }; + + private static readonly object[] IntersectWithCases = + { + new object[] + { + new KspVersionRange(new KspVersionBound(), new KspVersionBound()), + new KspVersionRange(new KspVersionBound(), new KspVersionBound()), + new KspVersionRange(new KspVersionBound(), new KspVersionBound()), + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 2, 3, 4), true), + new KspVersionBound(new KspVersion(1, 2, 3, 4), true) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 2, 3, 4), true), + new KspVersionBound(new KspVersion(1, 2, 3, 4), true) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 2, 3, 4), true), + new KspVersionBound(new KspVersion(1, 2, 3, 4), true) + ), + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 2, 3, 4), false), + new KspVersionBound(new KspVersion(1, 2, 3, 4), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 2, 3, 4), false), + new KspVersionBound(new KspVersion(1, 2, 3, 4), false) + ), + null + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 2, 3, 4), false), + new KspVersionBound(new KspVersion(1, 2, 3, 4), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 2, 3, 4), true), + new KspVersionBound(new KspVersion(1, 2, 3, 4), true) + ), + null + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), true), + new KspVersionBound(new KspVersion(1, 1, 0, 0), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 0), true), + new KspVersionBound(new KspVersion(1, 0, 5, 0), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 0), true), + new KspVersionBound(new KspVersion(1, 0, 5, 0), false) + ), + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 1, 0, 0), true), + new KspVersionBound(new KspVersion(1, 2, 0, 0), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 0), true), + new KspVersionBound(new KspVersion(1, 0, 5, 0), false) + ), + null + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 1234), true), + new KspVersionBound(new KspVersion(1, 0, 4, 1234), true) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 1234), true), + new KspVersionBound(new KspVersion(1, 0, 4, 1234), true) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 1234), true), + new KspVersionBound(new KspVersion(1, 0, 4, 1234), true) + ), + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 1235), true), + new KspVersionBound(new KspVersion(1, 0, 4, 1235), true) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 1234), true), + new KspVersionBound(new KspVersion(1, 0, 4, 1234), true) + ), + null + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 0), true), + new KspVersionBound(new KspVersion(1, 0, 5, 0), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 1234), true), + new KspVersionBound(new KspVersion(1, 0, 4, 1234), true) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 1234), true), + new KspVersionBound(new KspVersion(1, 0, 4, 1234), true) + ), + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 1234), true), + new KspVersionBound(new KspVersion(1, 0, 4, 1234), true) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 0), true), + new KspVersionBound(new KspVersion(1, 0, 5, 0), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 1234), true), + new KspVersionBound(new KspVersion(1, 0, 4, 1234), true) + ), + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 0), true), + new KspVersionBound(new KspVersion(1, 0, 4, 0), true) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 0), true), + new KspVersionBound(new KspVersion(1, 0, 5, 0), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 0), true), + new KspVersionBound(new KspVersion(1, 0, 4, 0), true) + ), + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), true), + new KspVersionBound(new KspVersion(1, 1, 0, 0), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), true), + new KspVersionBound(new KspVersion(1, 1, 0, 0), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), true), + new KspVersionBound(new KspVersion(1, 1, 0, 0), false) + ), + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 1, 0, 0), true), + new KspVersionBound(new KspVersion(1, 2, 0, 0), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 1, 0, 0), true), + new KspVersionBound(new KspVersion(1, 2, 0, 0), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 1, 0, 0), true), + new KspVersionBound(new KspVersion(1, 2, 0, 0), false) + ), + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 1, 0, 0), true), + new KspVersionBound(new KspVersion(1, 2, 0, 0), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), true), + new KspVersionBound(new KspVersion(1, 1, 0, 0), false) + ), + null + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), true), + new KspVersionBound(new KspVersion(1, 1, 0, 0), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 1, 0, 0), true), + new KspVersionBound(new KspVersion(1, 2, 0, 0), false) + ), + null + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 0), true), + new KspVersionBound() + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 0), true), + new KspVersionBound(new KspVersion(1, 0, 5, 0), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 0), true), + new KspVersionBound(new KspVersion(1, 0, 5, 0), false) + ) + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(), + new KspVersionBound(new KspVersion(1, 0, 4, 0), true) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 0), true), + new KspVersionBound(new KspVersion(1, 0, 5, 0), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 4, 0), true), + new KspVersionBound(new KspVersion(1, 0, 4, 0), true) + ) + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(), + new KspVersionBound(new KspVersion(1, 0, 4, 0), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 3, 0), true), + new KspVersionBound(new KspVersion(1, 0, 4, 0), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 3, 0), true), + new KspVersionBound(new KspVersion(1, 0, 4, 0), false) + ) + } + }; + + private static readonly object[] IsSupersetOfCases = + { + new object[] + { + new KspVersionRange(new KspVersionBound(), new KspVersionBound()), + new KspVersionRange(new KspVersionBound(), new KspVersionBound()), + true + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), true), + new KspVersionBound(new KspVersion(2, 0, 0, 0), true) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), true), + new KspVersionBound(new KspVersion(2, 0, 0, 0), true) + ), + true + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), true), + new KspVersionBound(new KspVersion(2, 0, 0, 0), true) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), false), + new KspVersionBound(new KspVersion(2, 0, 0, 0), false) + ), + true + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), false), + new KspVersionBound(new KspVersion(2, 0, 0, 0), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), false), + new KspVersionBound(new KspVersion(2, 0, 0, 0), false) + ), + true + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), false), + new KspVersionBound(new KspVersion(2, 0, 0, 0), false) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), true), + new KspVersionBound(new KspVersion(2, 0, 0, 0), true) + ), + false + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), true), + new KspVersionBound(new KspVersion(3, 0, 0, 0), true) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(2, 0, 0, 0), false), + new KspVersionBound(new KspVersion(4, 0, 0, 0), false) + ), + false + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(), + new KspVersionBound(new KspVersion(3, 0, 0, 0), true) + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), true), + new KspVersionBound(new KspVersion(2, 0, 0, 0), true) + ), + true + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), true), + new KspVersionBound() + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), true), + new KspVersionBound(new KspVersion(2, 0, 0, 0), true) + ), + true + }, + new object[] + { + new KspVersionRange( + new KspVersionBound(), + new KspVersionBound() + ), + new KspVersionRange( + new KspVersionBound(new KspVersion(1, 0, 0, 0), true), + new KspVersionBound(new KspVersion(2, 0, 0, 0), true) + ), + true + }, + }; + + [Test] + public void CtorWorksCorrectly() + { + // Arrange + var lower = new KspVersionBound(new KspVersion(1, 2, 3, 4), false); + var upper = new KspVersionBound(new KspVersion(5, 6, 7, 8), true); + + // Act + var result = new KspVersionRange(lower, upper); + + // Assert + Assert.That(result.Lower, Is.EqualTo(lower)); + Assert.That(result.Upper, Is.EqualTo(upper)); + } + + [Test] + public void CtorThrowsOnNullLowerParameter() + { + // Act + // ReSharper disable once ObjectCreationAsStatement + TestDelegate act = + () => new KspVersionRange(null, new KspVersionBound(new KspVersion(1, 2, 3, 4), false)); + + // Assert + Assert.That(act, Throws.Exception); + } + + [Test] + public void CtorThrowsOnNullUpperParameter() + { + // Act + // ReSharper disable once ObjectCreationAsStatement + TestDelegate act = + () => new KspVersionRange(new KspVersionBound(new KspVersion(1, 2, 3, 4), false), null); + + // Assert + Assert.That(act, Throws.Exception); + } + + [TestCaseSource("ToStringCases")] + public void ToStringWorksCorrectly(KspVersionRange vr, string expected) + { + // Act + var result = vr.ToString(); + + // Assert + Assert.That(result, Is.EqualTo(expected)); + } + + [TestCaseSource("IntersectWithCases")] + public void IntersectWithWorksCorrectly(KspVersionRange left, KspVersionRange right, KspVersionRange expected) + { + // Act + var result = left.IntersectWith(right); + + // Assert + Assert.That(result, Is.EqualTo(expected)); + } + + [TestCaseSource("IsSupersetOfCases")] + public void IsSupersetOfWorksCorrectly(KspVersionRange left, KspVersionRange right, bool expected) + { + // Act + var result = left.IsSupersetOf(right); + + // Assert + Assert.That(result, Is.EqualTo(expected)); + } + + [Test] + public void IsSupersetOfThrowsOnNullParameter() + { + // Arrange + var sut = new KspVersionRange(new KspVersionBound(), new KspVersionBound()); + + // Act + TestDelegate act = () => sut.IsSupersetOf(null); + + // Assert + Assert.That(act, Throws.Exception); + } + + [TestCaseSource("EqualityCases")] + public void EqualityWorksCorrectly(KspVersionRange vr1, KspVersionRange vr2, bool areEqual) + { + // Act + var genericEquals = vr1.Equals(vr2); + var nonGenericEquals = vr1.Equals((object)vr2); + var equalsOperator = vr1 == vr2; + var notEqualsOperator = vr1 != vr2; + var reverseEqualsOperator = vr2 == vr1; + var reverseNotEqualsOperator = vr2 != vr1; + + // Assert + Assert.AreEqual(areEqual, genericEquals); + Assert.AreEqual(areEqual, nonGenericEquals); + Assert.AreEqual(areEqual, equalsOperator); + Assert.AreNotEqual(areEqual, notEqualsOperator); + Assert.AreEqual(areEqual, reverseEqualsOperator); + Assert.AreNotEqual(areEqual, reverseNotEqualsOperator); + } + + [Test] + public void NullEqualityWorksCorrectly() + { + // Arrange + var sut = new KspVersionRange(new KspVersionBound(), new KspVersionBound()); + + // Act + // ReSharper disable ConditionIsAlwaysTrueOrFalse + var genericEquals = sut.Equals(null); + var nonGenericEquals = sut.Equals((object)null); + var equalsOperatorNullLeft = null == sut; + var equalsOperatorNullRight = sut == null; + var notEqualsOperatorNullLeft = null != sut; + var notEqualsOperatorNullRight = sut != null; + // ReSharper restore ConditionIsAlwaysTrueOrFalse + + // ASsert + Assert.IsFalse(genericEquals); + Assert.IsFalse(nonGenericEquals); + Assert.IsFalse(equalsOperatorNullLeft); + Assert.IsFalse(equalsOperatorNullRight); + Assert.IsTrue(notEqualsOperatorNullLeft); + Assert.IsTrue(notEqualsOperatorNullRight); + } + + [Test] + public void ReferenceEqualityWorksCorrectly() + { + // Arrange + var sut = new KspVersionRange(new KspVersionBound(), new KspVersionBound()); + + // Act + var genericEquals = sut.Equals(sut); + var nonGenericEquals = sut.Equals((object)sut); + + // Assert + Assert.IsTrue(genericEquals); + Assert.IsTrue(nonGenericEquals); + } + + [Test] + public void GetHashCodeDoesNotThrow( + [Random(0, int.MaxValue, 1)]int lowerMajor, + [Random(0, int.MaxValue, 1)]int lowerMinor, + [Random(0, int.MaxValue, 1)]int lowerPatch, + [Random(0, int.MaxValue, 1)]int lowerBuilder, + [Values(false, true)]bool lowerInclusive, + [Random(0, int.MaxValue, 1)]int upperMajor, + [Random(0, int.MaxValue, 1)]int upperMinor, + [Random(0, int.MaxValue, 1)]int upperPatch, + [Random(0, int.MaxValue, 1)]int upperBuilder, + [Values(false, true)]bool upperInclusive + ) + { + // Arrange + var lower = new KspVersionBound( + new KspVersion(lowerMajor, lowerMinor, lowerPatch, lowerBuilder), + lowerInclusive + ); + + var upper = new KspVersionBound( + new KspVersion(upperMajor, upperMinor, upperPatch, upperBuilder), + upperInclusive + ); + + // Act + // ReSharper disable once ReturnValueOfPureMethodIsNotUsed + TestDelegate act = () => new KspVersionRange(lower, upper).GetHashCode(); + + // Assert + Assert.That(act, Throws.Nothing); + } + } +} diff --git a/Tests/GUI/GUIMod.cs b/Tests/GUI/GUIMod.cs index 16aaa9f207..0ae892e40e 100644 --- a/Tests/GUI/GUIMod.cs +++ b/Tests/GUI/GUIMod.cs @@ -1,46 +1,46 @@ -using System; -using System.Linq; -using CKAN; -using NUnit.Framework; -using Tests.Core; -using Tests.Data; -using Version = CKAN.Version; - -namespace Tests.GUI -{ - [TestFixture] - public class GUIModTests - { - //TODO Work out what mocking framework the project uses and write some more tests. - [Test] - public void NewGuiModsAreNotSelectedForUpgrade() - { - using (var tidy = new DisposableKSP()) - { - KSPManager manager = new KSPManager(new NullUser(), new FakeWin32Registry(tidy.KSP)){CurrentInstance = tidy.KSP}; - var registry = Registry.Empty(); - var ckan_mod = TestData.kOS_014_module(); - registry.AddAvailable(ckan_mod); - var mod = new GUIMod(ckan_mod, registry, manager.CurrentInstance.VersionCriteria()); - Assert.False(mod.IsUpgradeChecked); - } - } - [Test] - public void HasUpdateReturnsTrueWhenUpdateAvailible() - { - using (var tidy = new DisposableKSP()) - { - var generatror = new RandomModuleGenerator(new Random(0451)); - var old_version = generatror.GeneratorRandomModule(version: new Version("0.24"), ksp_version: tidy.KSP.Version()); - var new_version = generatror.GeneratorRandomModule(version: new Version("0.25"), ksp_version: tidy.KSP.Version(), - identifier:old_version.identifier); - var registry = Registry.Empty(); - registry.RegisterModule(old_version, Enumerable.Empty(), null); - registry.AddAvailable(new_version); - - var mod = new GUIMod(old_version, registry, tidy.KSP.VersionCriteria()); - Assert.True(mod.HasUpdate); - } - } - } -} +using System; +using System.Linq; +using CKAN; +using NUnit.Framework; +using Tests.Core; +using Tests.Data; +using Version = CKAN.Version; + +namespace Tests.GUI +{ + [TestFixture] + public class GUIModTests + { + //TODO Work out what mocking framework the project uses and write some more tests. + [Test] + public void NewGuiModsAreNotSelectedForUpgrade() + { + using (var tidy = new DisposableKSP()) + { + KSPManager manager = new KSPManager(new NullUser(), new FakeWin32Registry(tidy.KSP)){CurrentInstance = tidy.KSP}; + var registry = Registry.Empty(); + var ckan_mod = TestData.kOS_014_module(); + registry.AddAvailable(ckan_mod); + var mod = new GUIMod(ckan_mod, registry, manager.CurrentInstance.VersionCriteria()); + Assert.False(mod.IsUpgradeChecked); + } + } + [Test] + public void HasUpdateReturnsTrueWhenUpdateAvailible() + { + using (var tidy = new DisposableKSP()) + { + var generatror = new RandomModuleGenerator(new Random(0451)); + var old_version = generatror.GeneratorRandomModule(version: new Version("0.24"), ksp_version: tidy.KSP.Version()); + var new_version = generatror.GeneratorRandomModule(version: new Version("0.25"), ksp_version: tidy.KSP.Version(), + identifier:old_version.identifier); + var registry = Registry.Empty(); + registry.RegisterModule(old_version, Enumerable.Empty(), null); + registry.AddAvailable(new_version); + + var mod = new GUIMod(old_version, registry, tidy.KSP.VersionCriteria()); + Assert.True(mod.HasUpdate); + } + } + } +} diff --git a/Tests/NetKAN/Transformers/GeneratedByTransformerTests.cs b/Tests/NetKAN/Transformers/GeneratedByTransformerTests.cs index 770c5a4585..ee97012b26 100644 --- a/Tests/NetKAN/Transformers/GeneratedByTransformerTests.cs +++ b/Tests/NetKAN/Transformers/GeneratedByTransformerTests.cs @@ -1,29 +1,29 @@ -using CKAN.NetKAN.Model; -using CKAN.NetKAN.Transformers; -using Newtonsoft.Json.Linq; -using NUnit.Framework; - -namespace Tests.NetKAN.Transformers -{ - [TestFixture] - public sealed class GeneratedByTransformerTests - { - [Test] - public void AddsGeneratedByProperty() - { - // Arrange - var sut = new GeneratedByTransformer(); - var json = new JObject(); - json["spec_version"] = 1; - - // Act - var result = sut.Transform(new Metadata(json)); - var transformedJson = result.Json(); - - // Assert - Assert.That((string)transformedJson["x_generated_by"], Does.Contain("netkan"), - "GeneratedByTransformer should add an x_generated_by property containing the string 'netkan'" - ); - } - } -} +using CKAN.NetKAN.Model; +using CKAN.NetKAN.Transformers; +using Newtonsoft.Json.Linq; +using NUnit.Framework; + +namespace Tests.NetKAN.Transformers +{ + [TestFixture] + public sealed class GeneratedByTransformerTests + { + [Test] + public void AddsGeneratedByProperty() + { + // Arrange + var sut = new GeneratedByTransformer(); + var json = new JObject(); + json["spec_version"] = 1; + + // Act + var result = sut.Transform(new Metadata(json)); + var transformedJson = result.Json(); + + // Assert + Assert.That((string)transformedJson["x_generated_by"], Does.Contain("netkan"), + "GeneratedByTransformer should add an x_generated_by property containing the string 'netkan'" + ); + } + } +} diff --git a/Tests/app.config b/Tests/app.config index 4ca2290bf3..8ed398dcb3 100644 --- a/Tests/app.config +++ b/Tests/app.config @@ -1,11 +1,11 @@ - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/assets/README.md b/assets/README.md index 89ba5885ee..f2d37d19c5 100644 --- a/assets/README.md +++ b/assets/README.md @@ -1,6 +1,6 @@ -The CKAN logo is MIT licensed by Felger. -KSP 'rocket' branding used with permission from Squad. - -To build the icon file: - - icotool -c -o ckan.ico ckan-*.png +The CKAN logo is MIT licensed by Felger. +KSP 'rocket' branding used with permission from Squad. + +To build the icon file: + + icotool -c -o ckan.ico ckan-*.png diff --git a/nuget.config b/nuget.config index 9602e3bb1d..363b16ae15 100644 --- a/nuget.config +++ b/nuget.config @@ -1,10 +1,10 @@ - - - - - - - - - - + + + + + + + + + +