# HG changeset patch # User IBBoard # Date 1330187780 0 # Node ID 649759343da5537cbdb3c1fad88e2b33d66d562a # Parent fc9a90d29ae067a7ce74675bcf02675f6fb5deaf Re #379: Fix validation of requirements to check for unit * Tidy up tests to reduce replication and fix copy-and-paste inconsistencies diff -r fc9a90d29ae0 -r 649759343da5 API/Objects/Requirement/UnitRequiresNUnitsForMUnitsRequirementTests.cs --- a/API/Objects/Requirement/UnitRequiresNUnitsForMUnitsRequirementTests.cs Wed Feb 22 21:00:01 2012 +0000 +++ b/API/Objects/Requirement/UnitRequiresNUnitsForMUnitsRequirementTests.cs Sat Feb 25 16:36:20 2012 +0000 @@ -29,43 +29,64 @@ } [Test()] - public void TestAddingUnitWithNoUnitsAndOneUnitTypeRequiredIsAllowed() + public void TestAddingUnitWithNoUnitsAndOneUnitTypeRequiredFails() { Army army = new Army(mockRace, "Test", 1000); Unit unit = CreateUnitOfType(unitType1, army); UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); req.AddUnitTypeRequirement(unitType2); - Assert.That(req.AllowsAdding(unit, army), Is.EqualTo(Validation.Passed)); + Assert_That__FailsAdding(req, unit, army, "Army must contain: 1 × " + unitType2.Name + " for every 1 × " + unitType1.Name + " (would have 0 for 1)."); } [Test()] - public void TestAddingUnitWithOneUnitAndOneUnitTypeRequiredIsNotAllowed() + public void TestAddingUnitTypeWithNoUnitsAndOneUnitTypeRequiredFails() + { + Army army = new Army(mockRace, "Test", 1000); + UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(unitType2); + Assert_That__FailsAdding(req, unitType1, army, "Army must contain: 1 × " + unitType2.Name + " for every 1 × " + unitType1.Name + " (would have 0 for 1)."); + } + + [Test()] + public void TestAddingUnitWithOneUnitAndOneUnitTypeRequiredPasses() { Army army = new Army(mockRace, "Test", 1000); AddUnitOfTypeToArmy(unitType2, army); Unit unit = CreateUnitOfType(unitType1, army); UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); req.AddUnitTypeRequirement(unitType2); - Assert.That(req.AllowsAdding(unit, army), Is.EqualTo(Validation.Failed)); + Assert_That__PassesAdding(req, unit, army); } [Test()] - public void TestAddingUnitTypeWithNoUnitsAndOneUnitTypeRequiredIsAllowed() - { - Army army = new Army(mockRace, "Test", 1000); - UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); - req.AddUnitTypeRequirement(unitType2); - Assert.That(req.AllowsAdding(unitType1, army), Is.EqualTo(Validation.Passed)); - } - - [Test()] - public void TestAddingUnitTypeWithOneUnitAndOneUnitTypeRequiredIsNotAllowed() + public void TestAddingUnitTypeWithOneUnitAndOneUnitTypeRequiredPasses() { Army army = new Army(mockRace, "Test", 1000); AddUnitOfTypeToArmy(unitType2, army); UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); req.AddUnitTypeRequirement(unitType2); - Assert.That(req.AllowsAdding(unitType1, army), Is.EqualTo(Validation.Failed)); + Assert_That__PassesAdding(req, unitType1, army); + } + + [Test()] + public void TestAddingUnitWithOneUnitAndOneUnitTypeRequiredPassesWhenAddingRequiredUnit() + { + Army army = new Army(mockRace, "Test", 1000); + AddUnitOfTypeToArmy(unitType1, army); + Unit unit = CreateUnitOfType(unitType2, army); + UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(unitType2); + Assert_That__PassesAdding(req, unit, army); + } + + [Test()] + public void TestAddingUnitTypeWithOneUnitAndOneUnitTypeRequiredPassesWhenAddingRequiredUnitType() + { + Army army = new Army(mockRace, "Test", 1000); + AddUnitOfTypeToArmy(unitType1, army); + UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(unitType2); + Assert_That__PassesAdding(req, unitType2, army); } [Test()] @@ -75,64 +96,85 @@ AddUnitOfTypeToArmy(unitType2, army); UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); req.AddUnitTypeRequirement(unitType2, 1); - Assert.That(req.AllowsAdding(unitType1, army), Is.EqualTo(Validation.Passed)); + Assert_That__PassesAdding(req, unitType1, army); } [Test()] public void TestAddingUnitTypeSetsLimitForFailure() { Army army = new Army(mockRace, "Test", 1000); - AddUnitOfTypeToArmy(unitType2, army); + AddUnitOfTypeToArmy(unitType1, army); AddUnitOfTypeToArmy(unitType2, army); UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); req.AddUnitTypeRequirement(unitType2, 1); - Assert.That(req.AllowsAdding(unitType1, army), Is.EqualTo(Validation.Failed)); + Assert_That__FailsAdding(req, unitType1, army, "Army must contain: 1 × " + unitType2.Name + " for every 1 × " + unitType1.Name + " (would have 1 for 2)."); } [Test()] - public void TestAddingUnitTriggersFailure() + public void TestAddingUnitTriggersPass() { Army army = new Army(mockRace, "Test", 1000); - AddUnitOfTypeToArmy(unitType1, army); UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); req.AddUnitTypeRequirement(unitType2, 1); - Assert.That(req.AllowsAdding(unitType1, army), Is.EqualTo(Validation.Failed)); + Assert_That__FailsAdding(req, unitType1, army, "Army must contain: 1 × " + unitType2.Name + " for every 1 × " + unitType1.Name + " (would have 0 for 1)."); AddUnitOfTypeToArmy(unitType2, army); - Assert.That(req.AllowsAdding(unitType1, army), Is.EqualTo(Validation.Passed)); + Assert_That__PassesAdding(req, unitType1, army); } [Test()] public void TestAddingUnitTypeDefaultsToOne() { Army army = new Army(mockRace, "Test", 1000); - AddUnitOfTypeToArmy(unitType1, army); UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); req.AddUnitTypeRequirement(unitType2); - Assert.That(req.AllowsAdding(unitType1, army), Is.EqualTo(Validation.Failed)); + Assert_That__FailsAdding(req, unitType1, army, "Army must contain: 1 × " + unitType2.Name + " for every 1 × " + unitType1.Name + " (would have 0 for 1)."); AddUnitOfTypeToArmy(unitType2, army); - Assert.That(req.AllowsAdding(unitType1, army), Is.EqualTo(Validation.Passed)); + Assert_That__PassesAdding(req, unitType1, army); } [Test] - public void TestRequirementNotApplicableWhenLimitedUnitNotIncluded() + public void TestRequirementNotApplicableWhenCheckingAddForNonLimitedUnits() + { + Army army = new Army(mockRace, "Test", 1000); + UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(unitType2); + Assert_That__AddingNotApplicable(req, unitType3, army); + Assert_That__AddingNotApplicable(req, CreateUnitOfType(unitType3, army), army); + Assert_That__AddingNotApplicable(req, unitType2, army); + Assert_That__AddingNotApplicable(req, CreateUnitOfType(unitType2, army), army); + } + + [Test] + public void TestRequirementNotApplicableAfterAddingLimitedUnit() { Army army = new Army(mockRace, "Test", 1000); UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); req.AddUnitTypeRequirement(unitType2); - Assert.That(req.AllowsAdding(unitType3, army), Is.EqualTo(Validation.NotApplicable)); - Assert.That(req.AllowsAdding(unitType2, army), Is.EqualTo(Validation.NotApplicable)); + Assert_That__AddingNotApplicable(req, unitType3, army); + AddUnitOfTypeToArmy(unitType1, army); + Assert_That__AddingNotApplicable(req, unitType3, army); } [Test] - public void TestRequirementBecomesInvalidWhenProhibitedUnitsChange() + public void TestRequirementNotApplicableBecomesPassAfterAddingLimitedUnit() { Army army = new Army(mockRace, "Test", 1000); - AddUnitOfTypeToArmy(unitType1, army); UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); req.AddUnitTypeRequirement(unitType2); - Assert.That(req.ValidatesArmy(army), Is.EqualTo(Validation.Passed)); - AddUnitOfTypeToArmy(unitType2, army); - Assert.That(req.ValidatesArmy(army), Is.EqualTo(Validation.Failed)); + Assert_That__AddingNotApplicable(req, unitType2, army); + AddUnitOfTypeToArmy(unitType1, army); + Assert_That__PassesAdding(req, unitType2, army); + } + + [Test] + public void TestRequirementNotApplicableBecomesFailAfterAddingLimitedUnit() + { + Army army = new Army(mockRace, "Test", 1000); + UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(unitType2, 2, 1); + Assert_That__AddingNotApplicable(req, unitType2, army); + AddUnitOfTypeToArmy(unitType1, army); + Assert_That__FailsAdding(req, unitType2, army, "Army must contain: 2 × " + unitType2.Name + " for every 1 × " + unitType1.Name + " (would have 1 for 1)."); } [Test()] @@ -142,11 +184,60 @@ AddUnitOfTypeToArmy(unitType1, army); UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); req.AddUnitTypeRequirement(unitType2); - Assert.That(req.AllowsAdding(unitType2, army), Is.EqualTo(Validation.Passed)); + Assert_That__PassesAdding(req, unitType2, army); + AddUnitOfTypeToArmy(unitType1, army); + Assert_That__FailsAdding(req, unitType2, army, "Army must contain: 1 × " + unitType2.Name + " for every 1 × " + unitType1.Name + " (would have 1 for 2)."); + } + + [Test] + public void TestRequirementFailsWhenLimitedUnitsChange() + { + Army army = new Army(mockRace, "Test", 1000); + AddUnitOfTypeToArmy(unitType1, army); + AddUnitOfTypeToArmy(unitType2, army); + UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(unitType2); + Assert_That__PassesAdding(req, unitType2, army); + AddUnitOfTypeToArmy(unitType1, army); + Assert.That(req.ValidatesArmy(army), Is.EqualTo(Validation.Failed)); } [Test] - public void TestValidationMessageIsBlankForPass() + public void TestValidationNotApplicableWithNoLimitedUnit() + { + Army army = new Army(mockRace, "Test", 1000); + UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(unitType2); + Assert.That(req.ValidatesArmy(army), Is.EqualTo(Validation.NotApplicable)); + AddUnitOfTypeToArmy(unitType3, army); + Assert.That(req.ValidatesArmy(army), Is.EqualTo(Validation.NotApplicable)); + AddUnitOfTypeToArmy(unitType2, army); + Assert.That(req.ValidatesArmy(army), Is.EqualTo(Validation.NotApplicable)); + } + + [Test()] + public void TestValidationWithNoUnitsAndOneUnitTypeRequiredFails() + { + Army army = new Army(mockRace, "Test", 1000); + UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(unitType2); + AddUnitOfTypeToArmy(unitType1, army); + Assert.That(req.ValidatesArmy(army), Is.EqualTo(Validation.Failed)); + } + + [Test()] + public void TestValidationWithOneUnitAndOneUnitTypeRequiredPasses() + { + Army army = new Army(mockRace, "Test", 1000); + AddUnitOfTypeToArmy(unitType1, army); + AddUnitOfTypeToArmy(unitType2, army); + UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(unitType2); + Assert.That(req.ValidatesArmy(army), Is.EqualTo(Validation.Passed)); + } + + [Test] + public void TestValidationMessageIsBlankForNotApplicable() { Army army = new Army(mockRace, "Test", 1000); UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); @@ -155,14 +246,13 @@ } [Test] - public void TestValidationMessageIsCorrectForFailWithOneUnitProhibited() + public void TestValidationMessageIsCorrectForFailWithOneUnitRequired() { Army army = new Army(mockRace, "Test", 1000); AddUnitOfTypeToArmy(unitType1, army); - AddUnitOfTypeToArmy(unitType2, army); UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); req.AddUnitTypeRequirement(unitType2); - Assert.That(req.GetValidationMessage(army), Is.EqualTo("Army must contain: 0 × " + unitType2.Name + " for every " + unitType1.Name + " (have 1).")); + Assert.That(req.GetValidationMessage(army), Is.EqualTo("Army must contain: 1 × " + unitType2.Name + " for every 1 × " + unitType1.Name + " (have 0 for 1).")); } [Test] @@ -170,16 +260,16 @@ { Army army = new Army(mockRace, "Test", 1000); AddUnitOfTypeToArmy(unitType1, army); - AddUnitOfTypeToArmy(unitType2, army); - AddUnitOfTypeToArmy(unitType2, army); + AddUnitOfTypeToArmy(unitType1, army); + AddUnitOfTypeToArmy(unitType1, army); AddUnitOfTypeToArmy(unitType2, army); UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); req.AddUnitTypeRequirement(unitType2, 2); - Assert.That(req.GetValidationMessage(army), Is.EqualTo("Army must contain: 2 × " + unitType2.Name + " for every " + unitType1.Name + " (have 3).")); + Assert.That(req.GetValidationMessage(army), Is.EqualTo("Army must contain: 1 × " + unitType2.Name + " for every 2 × " + unitType1.Name + " (have 1 for 3).")); } [Test] - public void TestValidationMessageIsCorrectForFailWithTwoUnitsProhibited() + public void TestValidationMessageIsCorrectForFailWithTwoUnitsRequiredAndOneOfOneUnit() { Army army = new Army(mockRace, "Test", 1000); AddUnitOfTypeToArmy(unitType1, army); @@ -191,7 +281,7 @@ } [Test] - public void TestValidationMessageIsCorrectForFailWithTwoUnitsProhibitedAndOtherUnitInArmy() + public void TestValidationMessageIsCorrectForFailWithTwoUnitsRequiredAndOneOfOtherUnitInArmy() { Army army = new Army(mockRace, "Test", 1000); AddUnitOfTypeToArmy(unitType1, army); @@ -203,35 +293,14 @@ } [Test] - public void TestValidationMessageIsCorrectForFailWithTwoUnitsProhibitedAndBothUnitsInArmy() + public void TestValidationMessageIsCorrectForFailWithTwoRequiredUnitsAndNeitherInArmy() { Army army = new Army(mockRace, "Test", 1000); AddUnitOfTypeToArmy(unitType1, army); - AddUnitOfTypeToArmy(unitType2, army); - AddUnitOfTypeToArmy(unitType3, army); - UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); - req.AddUnitTypeRequirement(unitType2); - req.AddUnitTypeRequirement(unitType3); - Assert.That(req.GetValidationMessage(army), Is.EqualTo("Army must contain: 0 × " + unitType2.Name + " for every " + unitType1.Name + " (have 1); 0 × " + unitType3.Name + " for every " + unitType1.Name + " (have 1).")); - } - - [Test] - public void TestAllowsAddMessageIsBlankForPass() - { - Army army = new Army(mockRace, "Test", 1000); - AddUnitOfTypeToArmy(unitType1, army); - UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); - Assert.That(req.GetAllowsAddingMessage(unitType2, army), Is.Empty); - } - - [Test] - public void TestAllowsAddMessageIsCorrectForFailWithOneUnitProhibited() - { - Army army = new Army(mockRace, "Test", 1000); - AddUnitOfTypeToArmy(unitType1, army); UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); req.AddUnitTypeRequirement(unitType2); - Assert.That(req.GetAllowsAddingMessage(unitType2, army), Is.EqualTo("Army must contain: 0 × " + unitType2.Name + " for every " + unitType1.Name + " (would have 1).")); + req.AddUnitTypeRequirement(unitType3); + Assert.That(req.GetValidationMessage(army), Is.EqualTo("Army must contain: 1 × " + unitType2.Name + " for every 1 × " + unitType1.Name + " (have 0 for 1); 1 × " + unitType3.Name + " for every 1 × " + unitType1.Name + " (have 0 for 1).")); } [Test] @@ -239,15 +308,15 @@ { Army army = new Army(mockRace, "Test", 1000); AddUnitOfTypeToArmy(unitType1, army); - AddUnitOfTypeToArmy(unitType2, army); + AddUnitOfTypeToArmy(unitType1, army); AddUnitOfTypeToArmy(unitType2, army); UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); req.AddUnitTypeRequirement(unitType2, 2); - Assert.That(req.GetAllowsAddingMessage(unitType2, army), Is.EqualTo("Army must contain: 2 × " + unitType2.Name + " for every " + unitType1.Name + " (would have 3).")); + Assert.That(req.GetAllowsAddingMessage(unitType1, army), Is.EqualTo("Army must contain: 1 × " + unitType2.Name + " for every 2 × " + unitType1.Name + " (would have 1 for 3).")); } [Test] - public void TestAllowsAddMessageIsCorrectForFailWithTwoUnitsProhibited() + public void TestAllowsAddMessageIsCorrectForFailWithTwoUnitsRequired() { Army army = new Army(mockRace, "Test", 1000); AddUnitOfTypeToArmy(unitType1, army); @@ -258,27 +327,61 @@ } [Test] - public void TestAllowsAddMessageIsCorrectForFailWithTwoUnitsProhibitedAndOneUnitInArmy() + public void TestAllowsAddMessageIsCorrectForFailWithTwoUnitsRequiredAndOneUnitInArmy() { Army army = new Army(mockRace, "Test", 1000); - AddUnitOfTypeToArmy(unitType1, army); AddUnitOfTypeToArmy(unitType2, army); UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); req.AddUnitTypeRequirement(unitType2); req.AddUnitTypeRequirement(unitType3); - Assert.That(req.GetAllowsAddingMessage(unitType3, army), Is.EqualTo("Army must contain: 0 × " + unitType2.Name + " for every " + unitType1.Name + " (would have 1); 0 × " + unitType3.Name + " for every " + unitType1.Name + " (would have 1).")); + Assert.That(req.GetAllowsAddingMessage(unitType1, army), Is.EqualTo("Army must contain: 1 × " + unitType3.Name + " for every 1 × " + unitType1.Name + " (would have 0 for 1).")); } [Test] - public void TestAllowsAddMessageIsCorrectForFailWithTwoUnitsProhibitedAndOtherUnitInArmy() + public void TestAllowsAddMessageIsCorrectForFailWithTwoUnitsRequiredAndOtherUnitInArmy() { Army army = new Army(mockRace, "Test", 1000); - AddUnitOfTypeToArmy(unitType1, army); AddUnitOfTypeToArmy(unitType3, army); UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); req.AddUnitTypeRequirement(unitType2); req.AddUnitTypeRequirement(unitType3); - Assert.That(req.GetAllowsAddingMessage(unitType2, army), Is.EqualTo("Army must contain: 0 × " + unitType2.Name + " for every " + unitType1.Name + " (would have 1); 0 × " + unitType3.Name + " for every " + unitType1.Name + " (would have 1).")); + Assert.That(req.GetAllowsAddingMessage(unitType1, army), Is.EqualTo("Army must contain: 1 × " + unitType2.Name + " for every 1 × " + unitType1.Name + " (would have 0 for 1).")); + } + + private static void Assert_That__PassesAdding(UnitRequiresNUnitsForMUnitsRequirement req, UnitType unitType, Army army) + { + Assert.That(req.AllowsAdding(unitType, army), Is.EqualTo(Validation.Passed)); + Assert.That(req.GetAllowsAddingMessage(unitType, army), Is.Empty); + } + + private static void Assert_That__PassesAdding(UnitRequiresNUnitsForMUnitsRequirement req, Unit unit, Army army) + { + Assert.That(req.AllowsAdding(unit, army), Is.EqualTo(Validation.Passed)); + Assert.That(req.GetAllowsAddingMessage(unit, army), Is.Empty); + } + + private static void Assert_That__AddingNotApplicable(UnitRequiresNUnitsForMUnitsRequirement req, UnitType unitType, Army army) + { + Assert.That(req.AllowsAdding(unitType, army), Is.EqualTo(Validation.NotApplicable)); + Assert.That(req.GetAllowsAddingMessage(unitType, army), Is.Empty); + } + + private static void Assert_That__AddingNotApplicable(UnitRequiresNUnitsForMUnitsRequirement req, Unit unit, Army army) + { + Assert.That(req.AllowsAdding(unit, army), Is.EqualTo(Validation.NotApplicable)); + Assert.That(req.GetAllowsAddingMessage(unit, army), Is.Empty); + } + + private static void Assert_That__FailsAdding(UnitRequiresNUnitsForMUnitsRequirement req, UnitType unitType, Army army, string message) + { + Assert.That(req.AllowsAdding(unitType, army), Is.EqualTo(Validation.Failed)); + Assert.That(req.GetAllowsAddingMessage(unitType, army), Is.EqualTo(message)); + } + + private static void Assert_That__FailsAdding(UnitRequiresNUnitsForMUnitsRequirement req, Unit unit, Army army, string message) + { + Assert.That(req.AllowsAdding(unit, army), Is.EqualTo(Validation.Failed)); + Assert.That(req.GetAllowsAddingMessage(unit, army), Is.EqualTo(message)); } private static void AddUnitOfTypeToArmy(UnitType unitType, Army army)