diff API/Objects/Requirement/UnitRequiresAtLeastNUnitsRequirementTest.cs @ 221:c40cb2048fc3

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)
author IBBoard <dev@ibboard.co.uk>
date Sat, 24 Mar 2012 20:34:42 +0000
parents 9bf34e88da89
children
line wrap: on
line diff
--- 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);