# HG changeset patch # User IBBoard # Date 1333203881 -3600 # Node ID 12ac487af0baeb8944681f82afc8a328523fd902 # Parent c40cb2048fc3530bda804182822393cbdb7b2945 Re #395: Requirements can incorrectly allow based on common divisor * Add tests to check for using common divisor (e.g. allowing 1 per 2 when we said allow 2 per 4) diff -r c40cb2048fc3 -r 12ac487af0ba API/Objects/Requirement/UnitRequiresNUnitsForMUnitsRequirementTests.cs --- a/API/Objects/Requirement/UnitRequiresNUnitsForMUnitsRequirementTests.cs Sat Mar 24 20:34:42 2012 +0000 +++ b/API/Objects/Requirement/UnitRequiresNUnitsForMUnitsRequirementTests.cs Sat Mar 31 15:24:41 2012 +0100 @@ -478,6 +478,90 @@ Assert_That__ValidationFails(req, army, "Army must contain: 1 × " + unitType3.Name + " for every 2 × " + unitType1.Name + " (have 2 for 5)."); } + [Test] + public void TestBug395RequirementShouldNotFindCommonDivisorAdding() + { + Army army = new Army(mockRace, "Test", 1000); + UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(4, 2, unitType2); + AddUnitsOfTypeToArmy(3, unitType2, army); + Assert_That__FailsAdding(req, unitType1, army, "Army must contain: 4 × " + unitType2.Name + " for every 2 × " + unitType1.Name + " (would have 3 for 1)."); + AddUnitOfTypeToArmy(unitType2, army); + Assert_That__PassesAdding(req, unitType1, army); + AddUnitOfTypeToArmy(unitType1, army); + Assert_That__PassesAdding(req, unitType1, army); + AddUnitOfTypeToArmy(unitType1, army); + Assert_That__FailsAdding(req, unitType1, army, "Army must contain: 4 × " + unitType2.Name + " for every 2 × " + unitType1.Name + " (would have 4 for 3)."); + AddUnitOfTypeToArmy(unitType2, army); + Assert_That__FailsAdding(req, unitType1, army, "Army must contain: 4 × " + unitType2.Name + " for every 2 × " + unitType1.Name + " (would have 5 for 3)."); + AddUnitsOfTypeToArmy(3, unitType2, army); + Assert_That__PassesAdding(req, unitType1, army); + } + + [Test] + public void TestBug395RequirementShouldNotFindCommonDivisorValidating() + { + Army army = new Army(mockRace, "Test", 1000); + UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(4, 2, unitType2); + AddUnitsOfTypeToArmy(3, unitType2, army); + AddUnitOfTypeToArmy(unitType1, army); + Assert_That__ValidationFails(req, army, "Army must contain: 4 × " + unitType2.Name + " for every 2 × " + unitType1.Name + " (have 3 for 1)."); + AddUnitOfTypeToArmy(unitType2, army); + Assert_That__ValidationPasses(req, army); + AddUnitOfTypeToArmy(unitType1, army); + Assert_That__ValidationPasses(req, army); + AddUnitOfTypeToArmy(unitType1, army); + Assert_That__ValidationFails(req, army, "Army must contain: 4 × " + unitType2.Name + " for every 2 × " + unitType1.Name + " (have 4 for 3)."); + AddUnitOfTypeToArmy(unitType2, army); + Assert_That__ValidationFails(req, army, "Army must contain: 4 × " + unitType2.Name + " for every 2 × " + unitType1.Name + " (have 5 for 3)."); + AddUnitsOfTypeToArmy(3, unitType2, army); + Assert_That__ValidationPasses(req, army); + } + + [Test] + public void TestBug395RequirementShouldNotFindCommonDivisorAddingMultiUnits() + { + Army army = new Army(mockRace, "Test", 1000); + UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(4, 2, unitType2, unitType3); + AddUnitOfTypeToArmy(unitType3, army); + AddUnitsOfTypeToArmy(2, unitType2, army); + Assert_That__FailsAdding(req, unitType1, army, "Army must contain: 4 × " + unitType2.Name + " or " + unitType3.Name + " for every 2 × " + unitType1.Name + " (would have 3 for 1)."); + AddUnitOfTypeToArmy(unitType2, army); + Assert_That__PassesAdding(req, unitType1, army); + AddUnitOfTypeToArmy(unitType1, army); + Assert_That__PassesAdding(req, unitType1, army); + AddUnitOfTypeToArmy(unitType1, army); + Assert_That__FailsAdding(req, unitType1, army, "Army must contain: 4 × " + unitType2.Name + " or " + unitType3.Name + " for every 2 × " + unitType1.Name + " (would have 4 for 3)."); + AddUnitOfTypeToArmy(unitType2, army); + Assert_That__FailsAdding(req, unitType1, army, "Army must contain: 4 × " + unitType2.Name + " or " + unitType3.Name + " for every 2 × " + unitType1.Name + " (would have 5 for 3)."); + AddUnitsOfTypeToArmy(3, unitType2, army); + Assert_That__PassesAdding(req, unitType1, army); + } + + [Test] + public void TestBug395RequirementShouldNotFindCommonDivisorValidatingMultiUnits() + { + Army army = new Army(mockRace, "Test", 1000); + UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(4, 2, unitType2, unitType3); + AddUnitOfTypeToArmy(unitType3, army); + AddUnitsOfTypeToArmy(2, unitType2, army); + AddUnitOfTypeToArmy(unitType1, army); + Assert_That__ValidationFails(req, army, "Army must contain: 4 × " + unitType2.Name + " or " + unitType3.Name + " for every 2 × " + unitType1.Name + " (have 3 for 1)."); + AddUnitOfTypeToArmy(unitType2, army); + Assert_That__ValidationPasses(req, army); + AddUnitOfTypeToArmy(unitType1, army); + Assert_That__ValidationPasses(req, army); + AddUnitOfTypeToArmy(unitType1, army); + Assert_That__ValidationFails(req, army, "Army must contain: 4 × " + unitType2.Name + " or " + unitType3.Name + " for every 2 × " + unitType1.Name + " (have 4 for 3)."); + AddUnitOfTypeToArmy(unitType2, army); + Assert_That__ValidationFails(req, army, "Army must contain: 4 × " + unitType2.Name + " or " + unitType3.Name + " for every 2 × " + unitType1.Name + " (have 5 for 3)."); + AddUnitsOfTypeToArmy(3, unitType2, army); + Assert_That__ValidationPasses(req, army); + } + protected override UnitRequiresNUnitsForMUnitsRequirement CreateRequirement(UnitType requirementOn) { return new UnitRequiresNUnitsForMUnitsRequirement(requirementOn);