diff --git a/MultiversalDiplomacy/Adjudicate/Decision/MovementDecisions.cs b/MultiversalDiplomacy/Adjudicate/Decision/MovementDecisions.cs index dc79957..ba85108 100644 --- a/MultiversalDiplomacy/Adjudicate/Decision/MovementDecisions.cs +++ b/MultiversalDiplomacy/Adjudicate/Decision/MovementDecisions.cs @@ -65,7 +65,9 @@ public class MovementDecisions // Find competing moves. List competing = orders .OfType() - .Where(other => other.Location.Province == move.Location.Province) + .Where(other + => other != move + && other.Location.Province == move.Location.Province) .ToList(); // Create the move-related decisions. diff --git a/MultiversalDiplomacyTests/MovementAdjudicatorTest.cs b/MultiversalDiplomacyTests/MovementAdjudicatorTest.cs index 11374e8..9e9d616 100644 --- a/MultiversalDiplomacyTests/MovementAdjudicatorTest.cs +++ b/MultiversalDiplomacyTests/MovementAdjudicatorTest.cs @@ -1,6 +1,6 @@ using MultiversalDiplomacy.Adjudicate; +using MultiversalDiplomacy.Adjudicate.Decision; using MultiversalDiplomacy.Model; -using MultiversalDiplomacy.Orders; using NUnit.Framework; @@ -72,4 +72,84 @@ public class MovementAdjudicatorTest Assert.That(order.Validation, Is.Valid, "Unexpected validation result"); Assert.That(order.Replacement, Is.Null, "Unexpected order replacement"); } + + [Test] + public void Adjudication_Hold() + { + TestCaseBuilder setup = new TestCaseBuilder(World.WithStandardMap().WithInitialSeason()); + setup["Germany"] + .Army("Mun").Holds().GetReference(out var order); + + setup.ValidateOrders(MovementPhaseAdjudicator.Instance); + setup.AdjudicateOrders(MovementPhaseAdjudicator.Instance); + + var adjMun = order.Adjudications; + Assert.That(adjMun.All(adj => adj.Resolved), Is.True); + Assert.That(adjMun.OfType().Count(), Is.EqualTo(1)); + + IsDislodged isDislodged = adjMun.OfType().Single(); + Assert.That(isDislodged.Order, Is.EqualTo(order.Order)); + Assert.That(isDislodged.Outcome, Is.False); + Assert.That(isDislodged.Incoming, Is.Empty); + } + + [Test] + public void Adjudication_Move() + { + TestCaseBuilder setup = new TestCaseBuilder(World.WithStandardMap().WithInitialSeason()); + setup["Germany"] + .Army("Mun").MovesTo("Tyr").GetReference(out var order); + + setup.ValidateOrders(MovementPhaseAdjudicator.Instance); + setup.AdjudicateOrders(MovementPhaseAdjudicator.Instance); + + var adjMun = order.Adjudications; + Assert.That(adjMun.All(adj => adj.Resolved), Is.True); + Assert.That(adjMun.OfType().Count(), Is.EqualTo(1)); + Assert.That(adjMun.OfType().Count(), Is.EqualTo(1)); + + IsDislodged dislodged = adjMun.OfType().Single(); + Assert.That(dislodged.Order, Is.EqualTo(order.Order)); + Assert.That(dislodged.Outcome, Is.False); + + DoesMove moves = adjMun.OfType().Single(); + Assert.That(moves.Order, Is.EqualTo(order.Order)); + Assert.That(moves.Outcome, Is.True); + Assert.That(moves.Competing, Is.Empty); + Assert.That(moves.OpposingMove, Is.Null); + } + + [Test] + public void Adjudication_Support() + { + TestCaseBuilder setup = new TestCaseBuilder(World.WithStandardMap().WithInitialSeason()); + setup["Germany"] + .Army("Mun").MovesTo("Tyr").GetReference(out var move) + .Army("Boh").Supports.Army("Mun").MoveTo("Tyr").GetReference(out var support); + + setup.ValidateOrders(MovementPhaseAdjudicator.Instance); + setup.AdjudicateOrders(MovementPhaseAdjudicator.Instance); + + var adjBoh = support.Adjudications; + Assert.That(adjBoh.All(adj => adj.Resolved), Is.True); + Assert.That(adjBoh.OfType().Count(), Is.EqualTo(1)); + Assert.That(adjBoh.OfType().Count(), Is.EqualTo(1)); + + IsDislodged dislodgeBoh = adjBoh.OfType().Single(); + Assert.That(dislodgeBoh.Order, Is.EqualTo(support.Order)); + Assert.That(dislodgeBoh.Outcome, Is.False); + + GivesSupport supportBoh = adjBoh.OfType().Single(); + Assert.That(supportBoh.Order, Is.EqualTo(support.Order)); + Assert.That(supportBoh.Outcome, Is.True); + + var adjMun = move.Adjudications; + Assert.That(adjMun.All(adj => adj.Resolved), Is.True); + Assert.That(adjMun.OfType().Count(), Is.EqualTo(1)); + + AttackStrength attackMun = adjMun.OfType().Single(); + Assert.That(attackMun.Order, Is.EqualTo(move.Order)); + Assert.That(attackMun.MinValue, Is.EqualTo(2)); + Assert.That(attackMun.MaxValue, Is.EqualTo(2)); + } } diff --git a/MultiversalDiplomacyTests/OrderReference.cs b/MultiversalDiplomacyTests/OrderReference.cs index 5dea7a3..ddcd4c6 100644 --- a/MultiversalDiplomacyTests/OrderReference.cs +++ b/MultiversalDiplomacyTests/OrderReference.cs @@ -75,6 +75,10 @@ public class OrderReference where OrderType : Order { IsDislodged dislodged => dislodged.Order == this.Order, DoesMove moves => moves.Order == this.Order, + GivesSupport supports => supports.Order == this.Order, + AttackStrength attack => attack.Order == this.Order, + DefendStrength defend => defend.Order == this.Order, + PreventStrength prevent => prevent.Order == this.Order, _ => false, }).ToList(); return adjudications;