# HG changeset patch # User IBBoard # Date 1332621282 0 # Node ID c40cb2048fc3530bda804182822393cbdb7b2945 # Parent 0fa634c6391b1e857af3337e06b6eaaec64af6de Re #394: * Fix UnitRequiresNUnitsForMUnitsRequirementTests unit test so it actually does test the other value * Add tests to "requires at least N" requirement and factory to test alternatives (Rollcall's "-1,X|Y" notation) diff -r 0fa634c6391b -r c40cb2048fc3 API/Factories/Requirement/UnitRequiresAtLeastNUnitsRequirementFactoryTest.cs --- a/API/Factories/Requirement/UnitRequiresAtLeastNUnitsRequirementFactoryTest.cs Sat Mar 24 19:32:47 2012 +0000 +++ b/API/Factories/Requirement/UnitRequiresAtLeastNUnitsRequirementFactoryTest.cs Sat Mar 24 20:34:42 2012 +0000 @@ -17,8 +17,10 @@ private static Race race; private static string typeID1 = "unit1"; private static string typeID2 = "unit2"; + private static string typeID3 = "unit3"; private static UnitType unitType1; private static UnitType unitType2; + private static UnitType unitType3; private static MockRaceFactory raceFactory = new MockRaceFactory(); [TestFixtureSetUp()] @@ -29,6 +31,8 @@ race.AddUnitType(unitType1); unitType2 = new UnitType(typeID2, "Unit 2", race); race.AddUnitType(unitType2); + unitType3 = new UnitType(typeID3, "Unit 3", race); + race.AddUnitType(unitType3); } [Test()] @@ -118,12 +122,181 @@ } [Test()] - [ExpectedException(typeof(InvalidRequirementException), ExpectedMessage="Invalid amount 'a' for unit type 'unit1' for 'Requires at least N units' requirement")] + [ExpectedException(typeof(InvalidRequirementException), ExpectedMessage="Invalid amount 'a' for unit types 'unit1' for 'Requires at least N units' requirement")] public void TestExceptionsForInvalidNumber() { UnitRequiresAtLeastNUnitsRequirementFactory factory = new UnitRequiresAtLeastNUnitsRequirementFactory(); UnitType unitType = new UnitType("testUnit", "Test Unit", race); - factory.CreateRequirement(unitType, typeID1+":a", raceFactory); + factory.CreateRequirement(unitType, typeID1 + ":a", raceFactory); + } + + [Test()] + public void TestCreatesCorrectTripleAdditiveRequirement() + { + UnitRequiresAtLeastNUnitsRequirementFactory factory = new UnitRequiresAtLeastNUnitsRequirementFactory(); + UnitType unitType = new UnitType("testUnit", "Test Unit", race); + UnitRequiresAtLeastNUnitsRequirement expectedReq = new UnitRequiresAtLeastNUnitsRequirement(unitType); + expectedReq.AddUnitTypeRequirement(unitType1, unitType2, unitType3); + IRequirement req = factory.CreateRequirement(unitType, typeID1 + ";" + typeID2 + ";" + typeID3, raceFactory); + Assert.That(req, Is.EqualTo(expectedReq)); + } + + [Test()] + public void TestCreatesCorrectAdditiveRequirementForTwoIDs() + { + UnitRequiresAtLeastNUnitsRequirementFactory factory = new UnitRequiresAtLeastNUnitsRequirementFactory(); + UnitType unitType = new UnitType("testUnit", "Test Unit", race); + UnitRequiresAtLeastNUnitsRequirement expectedReq = new UnitRequiresAtLeastNUnitsRequirement(unitType); + expectedReq.AddUnitTypeRequirement(unitType1, unitType2); + expectedReq.AddUnitTypeRequirement(unitType2); + IRequirement req = factory.CreateRequirement(unitType, typeID1 + ";" + typeID2 + "|" + typeID2, raceFactory); + Assert.That(req, Is.EqualTo(expectedReq)); + } + + [Test()] + public void TestCreatesCorrectAdditiveRequirementWithNumber() + { + UnitRequiresAtLeastNUnitsRequirementFactory factory = new UnitRequiresAtLeastNUnitsRequirementFactory(); + UnitType unitType = new UnitType("testUnit", "Test Unit", race); + UnitRequiresAtLeastNUnitsRequirement expectedReq = new UnitRequiresAtLeastNUnitsRequirement(unitType); + expectedReq.AddUnitTypeRequirement(2, unitType1, unitType2); + IRequirement req = factory.CreateRequirement(unitType, typeID1 + ";" + typeID2 + ":2", raceFactory); + Assert.That(req, Is.EqualTo(expectedReq)); + } + + [Test()] + public void TestCreatesCorrectAdditiveRequirementForTwoIDsWithTwoNumbers() + { + UnitRequiresAtLeastNUnitsRequirementFactory factory = new UnitRequiresAtLeastNUnitsRequirementFactory(); + UnitType unitType = new UnitType("testUnit", "Test Unit", race); + UnitRequiresAtLeastNUnitsRequirement expectedReq = new UnitRequiresAtLeastNUnitsRequirement(unitType); + expectedReq.AddUnitTypeRequirement(2, unitType1, unitType2); + expectedReq.AddUnitTypeRequirement(3, unitType2, unitType1); + IRequirement req = factory.CreateRequirement(unitType, typeID1 + ";" + typeID2 + ":2|" + typeID2 + ";" + typeID1 + ":3", raceFactory); + Assert.That(req, Is.EqualTo(expectedReq)); + } + + [Test()] + public void TestCreatesCorrectAdditiveRequirementForTwoIDsWithOneNumber() + { + UnitRequiresAtLeastNUnitsRequirementFactory factory = new UnitRequiresAtLeastNUnitsRequirementFactory(); + UnitType unitType = new UnitType("testUnit", "Test Unit", race); + UnitRequiresAtLeastNUnitsRequirement expectedReq = new UnitRequiresAtLeastNUnitsRequirement(unitType); + expectedReq.AddUnitTypeRequirement(2, unitType1, unitType2); + expectedReq.AddUnitTypeRequirement(unitType2, unitType1); + IRequirement req = factory.CreateRequirement(unitType, typeID1 + ";" + typeID2 + ":2|" + typeID2 + ";" + typeID1, raceFactory); + Assert.That(req, Is.EqualTo(expectedReq)); + } + + [Test()] + public void TestCreatesCorrectAdditiveRequirementForTwoIDsWithOtherNumber() + { + UnitRequiresAtLeastNUnitsRequirementFactory factory = new UnitRequiresAtLeastNUnitsRequirementFactory(); + UnitType unitType = new UnitType("testUnit", "Test Unit", race); + UnitRequiresAtLeastNUnitsRequirement expectedReq = new UnitRequiresAtLeastNUnitsRequirement(unitType); + expectedReq.AddUnitTypeRequirement(unitType1, unitType2); + expectedReq.AddUnitTypeRequirement(3, unitType2, unitType1); + IRequirement req = factory.CreateRequirement(unitType, typeID1 + ";" + typeID2 + "|" + typeID2 + ";" + typeID1 + ":3", raceFactory); + Assert.That(req, Is.EqualTo(expectedReq)); + } + + [Test()] + public void TestCreatesCorrectRequirementForOneIDAndOneAdditive() + { + UnitRequiresAtLeastNUnitsRequirementFactory factory = new UnitRequiresAtLeastNUnitsRequirementFactory(); + UnitType unitType = new UnitType("testUnit", "Test Unit", race); + UnitRequiresAtLeastNUnitsRequirement expectedReq = new UnitRequiresAtLeastNUnitsRequirement(unitType); + expectedReq.AddUnitTypeRequirement(unitType1, unitType2); + expectedReq.AddUnitTypeRequirement(unitType2); + IRequirement req = factory.CreateRequirement(unitType, typeID1 + ";" + typeID2 + "|" + typeID2, raceFactory); + Assert.That(req, Is.EqualTo(expectedReq)); + } + + [Test()] + public void TestCreatesCorrectRequirementForOneIDAndOneAdditiveInOtherOrder() + { + UnitRequiresAtLeastNUnitsRequirementFactory factory = new UnitRequiresAtLeastNUnitsRequirementFactory(); + UnitType unitType = new UnitType("testUnit", "Test Unit", race); + UnitRequiresAtLeastNUnitsRequirement expectedReq = new UnitRequiresAtLeastNUnitsRequirement(unitType); + expectedReq.AddUnitTypeRequirement(unitType2); + expectedReq.AddUnitTypeRequirement(unitType1, unitType2); + IRequirement req = factory.CreateRequirement(unitType, typeID2 + "|" + typeID1 + ";" + typeID2, raceFactory); + Assert.That(req, Is.EqualTo(expectedReq)); + } + + [Test()] + public void TestCreatesCorrectRequirementForOneIDWithNumberAndOneAdditive() + { + UnitRequiresAtLeastNUnitsRequirementFactory factory = new UnitRequiresAtLeastNUnitsRequirementFactory(); + UnitType unitType = new UnitType("testUnit", "Test Unit", race); + UnitRequiresAtLeastNUnitsRequirement expectedReq = new UnitRequiresAtLeastNUnitsRequirement(unitType); + expectedReq.AddUnitTypeRequirement(unitType1, unitType2); + expectedReq.AddUnitTypeRequirement(unitType2, 3); + IRequirement req = factory.CreateRequirement(unitType, typeID1 + ";" + typeID2 + "|" + typeID2 + ":3", raceFactory); + Assert.That(req, Is.EqualTo(expectedReq)); + } + + [Test()] + public void TestCreatesCorrectRequirementForOneIDWithNumberAndOneAdditiveInOtherOrder() + { + UnitRequiresAtLeastNUnitsRequirementFactory factory = new UnitRequiresAtLeastNUnitsRequirementFactory(); + UnitType unitType = new UnitType("testUnit", "Test Unit", race); + UnitRequiresAtLeastNUnitsRequirement expectedReq = new UnitRequiresAtLeastNUnitsRequirement(unitType); + expectedReq.AddUnitTypeRequirement(unitType2, 3); + expectedReq.AddUnitTypeRequirement(unitType1, unitType2); + IRequirement req = factory.CreateRequirement(unitType, typeID2 + ":3|" + typeID1 + ";" + typeID2, raceFactory); + Assert.That(req, Is.EqualTo(expectedReq)); + } + + [Test()] + public void TestCreatesCorrectRequirementForOneIDAndOneAdditiveWithNumber() + { + UnitRequiresAtLeastNUnitsRequirementFactory factory = new UnitRequiresAtLeastNUnitsRequirementFactory(); + UnitType unitType = new UnitType("testUnit", "Test Unit", race); + UnitRequiresAtLeastNUnitsRequirement expectedReq = new UnitRequiresAtLeastNUnitsRequirement(unitType); + expectedReq.AddUnitTypeRequirement(3, unitType1, unitType2); + expectedReq.AddUnitTypeRequirement(unitType2); + IRequirement req = factory.CreateRequirement(unitType, typeID1 + ";" + typeID2 + ":3|" + typeID2, raceFactory); + Assert.That(req, Is.EqualTo(expectedReq)); + } + + [Test()] + public void TestCreatesCorrectRequirementForOneIDAndOneAdditiveWithNumberInOtherOrder() + { + UnitRequiresAtLeastNUnitsRequirementFactory factory = new UnitRequiresAtLeastNUnitsRequirementFactory(); + UnitType unitType = new UnitType("testUnit", "Test Unit", race); + UnitRequiresAtLeastNUnitsRequirement expectedReq = new UnitRequiresAtLeastNUnitsRequirement(unitType); + expectedReq.AddUnitTypeRequirement(unitType2); + expectedReq.AddUnitTypeRequirement(3, unitType1, unitType2); + IRequirement req = factory.CreateRequirement(unitType, typeID2 + "|" + typeID1 + ";" + typeID2 + ":3", raceFactory); + Assert.That(req, Is.EqualTo(expectedReq)); + } + + [Test()] + [ExpectedException(typeof(InvalidRequirementException), ExpectedMessage="Invalid unit type 'fibble' for 'Requires at least N units' requirement")] + public void TestExceptionsForAdditiveRequirementWithInvalidID() + { + UnitRequiresAtLeastNUnitsRequirementFactory factory = new UnitRequiresAtLeastNUnitsRequirementFactory(); + UnitType unitType = new UnitType("testUnit", "Test Unit", race); + factory.CreateRequirement(unitType, "fibble;" + typeID1, raceFactory); + } + + [Test()] + [ExpectedException(typeof(InvalidRequirementException), ExpectedMessage="Invalid unit type 'fibble' for 'Requires at least N units' requirement")] + public void TestExceptionsForAdditiveRequirementWithOtherInvalidID() + { + UnitRequiresAtLeastNUnitsRequirementFactory factory = new UnitRequiresAtLeastNUnitsRequirementFactory(); + UnitType unitType = new UnitType("testUnit", "Test Unit", race); + factory.CreateRequirement(unitType, typeID1 + ";fibble", raceFactory); + } + + [Test()] + [ExpectedException(typeof(InvalidRequirementException), ExpectedMessage="Invalid amount 'a' for unit types 'unit1;unit2' for 'Requires at least N units' requirement")] + public void TestExceptionsForAdditiveRequirementWithInvalidNumber() + { + UnitRequiresAtLeastNUnitsRequirementFactory factory = new UnitRequiresAtLeastNUnitsRequirementFactory(); + UnitType unitType = new UnitType("testUnit", "Test Unit", race); + factory.CreateRequirement(unitType, typeID1 + ";" + typeID2 + ":a", raceFactory); } } } diff -r 0fa634c6391b -r c40cb2048fc3 API/Objects/Requirement/UnitRequiresAtLeastNUnitsRequirementTest.cs --- a/API/Objects/Requirement/UnitRequiresAtLeastNUnitsRequirementTest.cs Sat Mar 24 19:32:47 2012 +0000 +++ b/API/Objects/Requirement/UnitRequiresAtLeastNUnitsRequirementTest.cs Sat Mar 24 20:34:42 2012 +0000 @@ -33,6 +33,7 @@ [Test()] public void TestAddingUnitTypeWithNoUnitsAndTwoUnitTypesRequired() { + //Rollcall's "-1,X,-1,Y" requirement - unlimited once you have one of both Army army = new Army(mockRace, "Test", 1000); UnitRequiresAtLeastNUnitsRequirement req = new UnitRequiresAtLeastNUnitsRequirement(unitType1); req.AddUnitTypeRequirement(unitType2); @@ -43,6 +44,7 @@ [Test()] public void TestAddingUnitTypeWithOneUnitAndTwoUnitTypesRequired() { + //Rollcall's "-1,X,-1,Y" requirement - unlimited once you have one of both Army army = new Army(mockRace, "Test", 1000); AddUnitOfTypeToArmy(unitType2, army); UnitRequiresAtLeastNUnitsRequirement req = new UnitRequiresAtLeastNUnitsRequirement(unitType1); @@ -54,6 +56,7 @@ [Test()] public void TestAddingUnitTypeWithOtherOneUnitAndTwoUnitTypesRequired() { + //Rollcall's "-1,X,-1,Y" requirement - unlimited once you have one of both Army army = new Army(mockRace, "Test", 1000); AddUnitOfTypeToArmy(unitType3, army); UnitRequiresAtLeastNUnitsRequirement req = new UnitRequiresAtLeastNUnitsRequirement(unitType1); @@ -65,6 +68,7 @@ [Test()] public void TestAddingUnitTypeWithBothUnitsAndTwoUnitTypesRequired() { + //Rollcall's "-1,X,-1,Y" requirement - unlimited once you have one of both Army army = new Army(mockRace, "Test", 1000); AddUnitOfTypeToArmy(unitType2, army); AddUnitOfTypeToArmy(unitType3, army); @@ -136,6 +140,56 @@ Assert_That__PassesAdding(req, unitType1, army); } + [Test] + public void TestAddingRequirementWithOR() + { + //Rollcall's "-1,X|Y" requirement - unlimited for one of either + Army army = new Army(mockRace, "Test", 1000); + UnitRequiresAtLeastNUnitsRequirement req = new UnitRequiresAtLeastNUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(unitType2, unitType3); + Assert_That__FailsAdding(req, unitType1, army, "Army must contain: 1 × " + unitType2.Name + " or " + unitType3.Name + " (would have 0)."); + AddUnitOfTypeToArmy(unitType2, army); + Assert_That__PassesAdding(req, unitType1, army); + } + + [Test] + public void TestAddingRequirementWithORWithOtherUnit() + { + //Rollcall's "-1,X|Y" requirement - unlimited for one of either + Army army = new Army(mockRace, "Test", 1000); + UnitRequiresAtLeastNUnitsRequirement req = new UnitRequiresAtLeastNUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(unitType2, unitType3); + Assert_That__FailsAdding(req, unitType1, army, "Army must contain: 1 × " + unitType2.Name + " or " + unitType3.Name + " (would have 0)."); + AddUnitOfTypeToArmy(unitType3, army); + Assert_That__PassesAdding(req, unitType1, army); + } + + [Test] + public void TestAddingRequirementWithORWithLimit() + { + Army army = new Army(mockRace, "Test", 1000); + UnitRequiresAtLeastNUnitsRequirement req = new UnitRequiresAtLeastNUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(2, unitType2, unitType3); + Assert_That__FailsAdding(req, unitType1, army, "Army must contain: 2 × " + unitType2.Name + " or " + unitType3.Name + " (would have 0)."); + AddUnitOfTypeToArmy(unitType2, army); + Assert_That__FailsAdding(req, unitType1, army, "Army must contain: 2 × " + unitType2.Name + " or " + unitType3.Name + " (would have 1)."); + AddUnitOfTypeToArmy(unitType2, army); + Assert_That__PassesAdding(req, unitType1, army); + } + + [Test] + public void TestAddingRequirementWithORWithLimitWithOtherUnit() + { + Army army = new Army(mockRace, "Test", 1000); + UnitRequiresAtLeastNUnitsRequirement req = new UnitRequiresAtLeastNUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(2, unitType2, unitType3); + Assert_That__FailsAdding(req, unitType1, army, "Army must contain: 2 × " + unitType2.Name + " or " + unitType3.Name + " (would have 0)."); + AddUnitOfTypeToArmy(unitType3, army); + Assert_That__FailsAdding(req, unitType1, army, "Army must contain: 2 × " + unitType2.Name + " or " + unitType3.Name + " (would have 1)."); + AddUnitOfTypeToArmy(unitType3, army); + Assert_That__PassesAdding(req, unitType1, army); + } + [Test()] public void TestValidatingWithNoUnitsAndOneUnitTypeRequired() { @@ -264,6 +318,60 @@ Assert_That__ValidationPasses(req, army); } + [Test] + public void TestRequirementWithOR() + { + //Rollcall's "-1,X|Y" requirement - unlimited for one of either + Army army = new Army(mockRace, "Test", 1000); + UnitRequiresAtLeastNUnitsRequirement req = new UnitRequiresAtLeastNUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(unitType2, unitType3); + AddUnitOfTypeToArmy(unitType1, army); + Assert_That__ValidationFails(req, army, "Army must contain: 1 × " + unitType2.Name + " or " + unitType3.Name + " (have 0)."); + AddUnitOfTypeToArmy(unitType2, army); + Assert_That__ValidationPasses(req, army); + } + + [Test] + public void TestRequirementWithORWithOtherUnit() + { + //Rollcall's "-1,X|Y" requirement - unlimited for one of either + Army army = new Army(mockRace, "Test", 1000); + UnitRequiresAtLeastNUnitsRequirement req = new UnitRequiresAtLeastNUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(unitType2, unitType3); + AddUnitOfTypeToArmy(unitType1, army); + Assert_That__ValidationFails(req, army, "Army must contain: 1 × " + unitType2.Name + " or " + unitType3.Name + " (have 0)."); + AddUnitOfTypeToArmy(unitType3, army); + Assert_That__ValidationPasses(req, army); + } + + [Test] + public void TestRequirementWithORWithLimit() + { + Army army = new Army(mockRace, "Test", 1000); + UnitRequiresAtLeastNUnitsRequirement req = new UnitRequiresAtLeastNUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(2, unitType2, unitType3); + AddUnitOfTypeToArmy(unitType1, army); + Assert_That__ValidationFails(req, army, "Army must contain: 2 × " + unitType2.Name + " or " + unitType3.Name + " (have 0)."); + AddUnitOfTypeToArmy(unitType2, army); + Assert_That__ValidationFails(req, army, "Army must contain: 2 × " + unitType2.Name + " or " + unitType3.Name + " (have 1)."); + AddUnitOfTypeToArmy(unitType2, army); + Assert_That__ValidationPasses(req, army); + } + + [Test] + public void TestRequirementWithORWithLimitWithOtherUnit() + { + Army army = new Army(mockRace, "Test", 1000); + UnitRequiresAtLeastNUnitsRequirement req = new UnitRequiresAtLeastNUnitsRequirement(unitType1); + req.AddUnitTypeRequirement(2, unitType2, unitType3); + AddUnitOfTypeToArmy(unitType1, army); + Assert_That__ValidationFails(req, army, "Army must contain: 2 × " + unitType2.Name + " or " + unitType3.Name + " (have 0)."); + AddUnitOfTypeToArmy(unitType3, army); + Assert_That__ValidationFails(req, army, "Army must contain: 2 × " + unitType2.Name + " or " + unitType3.Name + " (have 1)."); + AddUnitOfTypeToArmy(unitType3, army); + Assert_That__ValidationPasses(req, army); + } + protected override UnitRequiresAtLeastNUnitsRequirement CreateRequirement(UnitType requirementOn) { return new UnitRequiresAtLeastNUnitsRequirement(requirementOn); diff -r 0fa634c6391b -r c40cb2048fc3 API/Objects/Requirement/UnitRequiresNUnitsForMUnitsRequirementTests.cs --- a/API/Objects/Requirement/UnitRequiresNUnitsForMUnitsRequirementTests.cs Sat Mar 24 19:32:47 2012 +0000 +++ b/API/Objects/Requirement/UnitRequiresNUnitsForMUnitsRequirementTests.cs Sat Mar 24 20:34:42 2012 +0000 @@ -168,7 +168,7 @@ UnitRequiresNUnitsForMUnitsRequirement req = new UnitRequiresNUnitsForMUnitsRequirement(unitType1); req.AddUnitTypeRequirement(unitType2, unitType3); Assert_That__FailsAdding(req, unitType1, army, "Army must contain: 1 × " + unitType2.Name + " or " + unitType3.Name + " for every 1 × " + unitType1.Name + " (would have 0 for 1)."); - AddUnitOfTypeToArmy(unitType2, army); + AddUnitOfTypeToArmy(unitType3, army); Assert_That__PassesAdding(req, unitType1, army); } @@ -403,7 +403,7 @@ req.AddUnitTypeRequirement(unitType2, unitType3); AddUnitOfTypeToArmy(unitType1, army); Assert_That__ValidationFails(req, army, "Army must contain: 1 × " + unitType2.Name + " or " + unitType3.Name + " for every 1 × " + unitType1.Name + " (have 0 for 1)."); - AddUnitOfTypeToArmy(unitType2, army); + AddUnitOfTypeToArmy(unitType3, army); Assert_That__ValidationPasses(req, army); }