diff --git a/MultiversalDiplomacy/Adjudicate/AdjudicatorHelpers.cs b/MultiversalDiplomacy/Adjudicate/AdjudicatorHelpers.cs index 9e73438..c70716b 100644 --- a/MultiversalDiplomacy/Adjudicate/AdjudicatorHelpers.cs +++ b/MultiversalDiplomacy/Adjudicate/AdjudicatorHelpers.cs @@ -89,7 +89,7 @@ internal static class AdjudicatorHelpers _ => true, }, ValidationReason.InvalidUnitForPower, - ref orders, + ref validOrders, ref invalidOrders); } } diff --git a/MultiversalDiplomacyTests/DATC_A.cs b/MultiversalDiplomacyTests/DATC_A.cs new file mode 100644 index 0000000..b7809b6 --- /dev/null +++ b/MultiversalDiplomacyTests/DATC_A.cs @@ -0,0 +1,187 @@ +using MultiversalDiplomacy.Adjudicate; +using MultiversalDiplomacy.Model; +using MultiversalDiplomacy.Orders; + +using NUnit.Framework; + +namespace MultiversalDiplomacyTests; + +public class DATC_A +{ + private World StandardEmpty { get; } = World.WithStandardMap().WithInitialSeason(); + + [Test] + public void DATC_6_A_1_MoveToAnAreaThatIsNotANeighbor() + { + TestCaseBuilder setup = new TestCaseBuilder(StandardEmpty); + setup["England"] + .Fleet("North Sea").MovesTo("Picardy").GetReference(out var order); + + setup.ValidateOrders(new MovementPhaseAdjudicator()); + + Assert.That(order.Validation, Is.Invalid(ValidationReason.UnreachableDestination)); + } + + [Test] + public void DATC_6_A_2_MoveArmyToSea() + { + TestCaseBuilder setup = new TestCaseBuilder(StandardEmpty); + + Assert.That( + () => + { + setup["England"] + .Army("Liverpool").MovesTo("Irish Sea"); + }, + Throws.TypeOf()); + } + + [Test] + public void DATC_6_A_3_MoveFleetToLand() + { + TestCaseBuilder setup = new TestCaseBuilder(StandardEmpty); + + Assert.That( + () => + { + setup["Germany"] + .Fleet("Kiel").MovesTo("Munich"); + }, + Throws.TypeOf()); + } + + [Test] + public void DATC_6_A_4_MoveToOwnSector() + { + TestCaseBuilder setup = new TestCaseBuilder(StandardEmpty); + setup["Germany"] + .Fleet("Kiel").MovesTo("Kiel").GetReference(out var order); + + setup.ValidateOrders(new MovementPhaseAdjudicator()); + + Assert.That(order.Validation, Is.Invalid(ValidationReason.DestinationMatchesOrigin)); + } + + [Test] + public void DATC_6_A_5_MoveToOwnSectorWithConvoy() + { + TestCaseBuilder setup = new TestCaseBuilder(StandardEmpty); + setup + ["England"] + .Fleet("North Sea").Convoys.Army("Yorkshire").To("Yorkshire").GetReference(out var orderNth) + .Army("Yorkshire").MovesTo("Yorkshire").GetReference(out var orderYor) + .Army("Liverpool").Supports.Army("Yorkshire").MoveTo("Yorkshire") + ["Germany"] + .Fleet("London").MovesTo("Yorkshire") + .Army("Wales").Supports.Fleet("London").MoveTo("Yorkshire"); + + setup.ValidateOrders(new MovementPhaseAdjudicator()); + + Assert.That(orderNth.Validation, Is.Invalid(ValidationReason.DestinationMatchesOrigin)); + Assert.That(orderYor.Validation, Is.Invalid(ValidationReason.DestinationMatchesOrigin)); + + // TODO assert dislodge + } + + [Test] + public void DATC_6_A_6_OrderingAUnitOfAnotherCountry() + { + TestCaseBuilder setup = new TestCaseBuilder(StandardEmpty); + setup + ["Germany"] + .Fleet("London", powerName: "England").MovesTo("North Sea").GetReference(out var order); + + setup.ValidateOrders(new MovementPhaseAdjudicator()); + + Assert.That(order.Validation, Is.Invalid(ValidationReason.InvalidUnitForPower)); + } + + [Test] + public void DATC_6_A_7_OnlyArmiesCanBeConvoyed() + { + TestCaseBuilder setup = new TestCaseBuilder(StandardEmpty); + setup + ["England"] + .Fleet("London").MovesTo("Belgium") + .Fleet("North Sea").Convoys.Army("London").To("Belgium").GetReference(out var order); + + setup.ValidateOrders(new MovementPhaseAdjudicator()); + + Assert.That(order.Validation, Is.Invalid(ValidationReason.InvalidOrderTypeForUnit)); + } + + [Test] + public void DATC_6_A_8_SupportToHoldYourselfIsNotPossible() + { + TestCaseBuilder setup = new TestCaseBuilder(StandardEmpty); + setup + ["Italy"] + .Army("Venice").MovesTo("Trieste") + .Army("Tyrolia").Supports.Army("Venice").MoveTo("Trieste") + ["Austria"] + .Fleet("Trieste").Supports.Fleet("Trieste").Hold().GetReference(out var order); + + setup.ValidateOrders(new MovementPhaseAdjudicator()); + + Assert.That(order.Validation, Is.Invalid(ValidationReason.NoSelfSupport)); + + // TODO assert dislodge + } + + [Test] + public void DATC_6_A_9_FleetsMustFollowCoastIfNotOnSea() + { + TestCaseBuilder setup = new TestCaseBuilder(StandardEmpty); + setup + ["Italy"] + .Fleet("Rome").MovesTo("Venice").GetReference(out var order); + + setup.ValidateOrders(new MovementPhaseAdjudicator()); + + Assert.That(order.Validation, Is.Invalid(ValidationReason.UnreachableDestination)); + } + + [Test] + public void DATC_6_A_10_SupportOnUnreachableDestinationNotPossible() + { + TestCaseBuilder setup = new TestCaseBuilder(StandardEmpty); + setup + ["Austria"] + .Army("Venice").Holds() + ["Italy"] + .Army("Apulia").MovesTo("Venice") + .Fleet("Rome").Supports.Army("Apulia").MoveTo("Venice").GetReference(out var order); + + setup.ValidateOrders(new MovementPhaseAdjudicator()); + + Assert.That(order.Validation, Is.Invalid(ValidationReason.UnreachableSupport)); + + // TODO assert dislodge + } + + [Test] + [Ignore("TODO")] + public void DATC_6_A_11_SimpleBounce() + { + TestCaseBuilder setup = new TestCaseBuilder(StandardEmpty); + setup + ["Austria"] + .Army("Vienna").MovesTo("Tyrolia") + ["Italy"] + .Army("Venice").MovesTo("Tyrolia"); + } + + [Test] + [Ignore("TODO")] + public void DATC_6_A_12_BounceOfThreeUnits() + { + TestCaseBuilder setup = new TestCaseBuilder(StandardEmpty); + setup + ["Austria"] + .Army("Vienna").MovesTo("Tyrolia") + ["Germany"] + .Army("Munich").MovesTo("Tyrolia") + ["Italy"] + .Army("Venice").MovesTo("Tyrolia"); + } +} \ No newline at end of file diff --git a/MultiversalDiplomacyTests/TestCaseBuilder.cs b/MultiversalDiplomacyTests/TestCaseBuilder.cs index cb8579e..6767f7d 100644 --- a/MultiversalDiplomacyTests/TestCaseBuilder.cs +++ b/MultiversalDiplomacyTests/TestCaseBuilder.cs @@ -24,12 +24,12 @@ public class TestCaseBuilder /// /// Define an order for an army in a province. /// - public IUnitContext Army(string provinceName); + public IUnitContext Army(string provinceName, string? powerName = null); /// /// Define an order for a fleet in a province, optionally on a specific coast. /// - public IUnitContext Fleet(string provinceName, string? coast = null); + public IUnitContext Fleet(string provinceName, string? coast = null, string? powerName = null); } /// @@ -143,12 +143,12 @@ public class TestCaseBuilder /// /// Define an order for a new army in a province. /// - public IUnitContext Army(string provinceName); + public IUnitContext Army(string provinceName, string? powerName = null); /// /// Define an order for a new fleet in a province, optionally on a specific coast. /// - public IUnitContext Fleet(string provinceName, string? coast = null); + public IUnitContext Fleet(string provinceName, string? coast = null, string? powerName = null); /// /// Save a reference to the order just defined. @@ -206,7 +206,7 @@ public class TestCaseBuilder foreach (Unit unit in this.World.Units) { if (unit.Power == power - && unit.Location == location + && unit.Location.Province == location.Province && unit.Season == season) { return unit; @@ -239,19 +239,25 @@ public class TestCaseBuilder public IPowerContext this[string powerName] => this.Builder[powerName]; - public IUnitContext Army(string provinceName) + public IUnitContext Army(string provinceName, string? powerName = null) { + Power power = powerName == null + ? this.Power + : this.Builder.World.GetPower(powerName); Location location = this.Builder.World.GetLand(provinceName); Unit unit = this.Builder.GetOrBuildUnit( - this.Power, location, this.Builder.Season, UnitType.Army); + power, location, this.Builder.Season, UnitType.Army); return new UnitContext(this, unit); } - public IUnitContext Fleet(string provinceName, string? coast = null) + public IUnitContext Fleet(string provinceName, string? coast = null, string? powerName = null) { + Power power = powerName == null + ? this.Power + : this.Builder.World.GetPower(powerName); Location location = this.Builder.World.GetWater(provinceName, coast); Unit unit = this.Builder.GetOrBuildUnit( - this.Power, location, this.Builder.Season, UnitType.Fleet); + power, location, this.Builder.Season, UnitType.Fleet); return new UnitContext(this, unit); } } @@ -474,10 +480,11 @@ public class TestCaseBuilder public IPowerContext this[string powerName] => this.PowerContext[powerName]; - public IUnitContext Army(string provinceName) => this.PowerContext.Army(provinceName); + public IUnitContext Army(string provinceName, string? powerName = null) + => this.PowerContext.Army(provinceName, powerName); - public IUnitContext Fleet(string provinceName, string? coast = null) - => this.PowerContext.Fleet(provinceName); + public IUnitContext Fleet(string provinceName, string? coast = null, string? powerName = null) + => this.PowerContext.Fleet(provinceName, coast, powerName); public IOrderDefinedContext GetReference(out OrderReference order) {