diff --git a/MultiversalDiplomacyTests/SerializationTest.cs b/MultiversalDiplomacyTests/SerializationTest.cs new file mode 100644 index 0000000..3d64156 --- /dev/null +++ b/MultiversalDiplomacyTests/SerializationTest.cs @@ -0,0 +1,71 @@ +using System.Text.Json; + +using MultiversalDiplomacy.Adjudicate; +using MultiversalDiplomacy.Model; + +using NUnit.Framework; + +namespace MultiversalDiplomacyTests; + +public class SerializationTest +{ + [Test] + public void SerializeRoundTrip_MDATC_3_A_2() + { + // Set up MDATC 3.A.2 + TestCaseBuilder setup = new(World.WithStandardMap(), MovementPhaseAdjudicator.Instance); + setup[("a", 0)] + .GetReference(out Season s0) + ["Germany"] + .Army("Mun").MovesTo("Tyr").GetReference(out var mun0) + ["Austria"] + .Army("Tyr").Holds().GetReference(out var tyr0); + + setup.ValidateOrders(); + Assert.That(mun0, Is.Valid); + Assert.That(tyr0, Is.Valid); + setup.AdjudicateOrders(); + Assert.That(mun0, Is.Repelled); + Assert.That(tyr0, Is.NotDislodged); + setup.UpdateWorld(); + + // Serialize the world + JsonSerializerOptions options = new() { + WriteIndented = true, + }; + JsonElement serialized = JsonSerializer.SerializeToDocument(setup.World, options).RootElement; + + // Deserialize the world + World reserialized = JsonSerializer.Deserialize(serialized) + ?? throw new AssertionException("Failed to reserialize world"); + + // Resume the test case + setup = new(reserialized, MovementPhaseAdjudicator.Instance); + setup[("a", 1)] + ["Germany"] + .Army("Mun").Supports.Army("Mun", season: reserialized.GetSeason("a0")).MoveTo("Tyr").GetReference(out var mun1) + ["Austria"] + .Army("Tyr").Holds(); + + setup.ValidateOrders(); + Assert.That(mun1, Is.Valid); + setup.AdjudicateOrders(); + Assert.That(mun1, Is.NotCut); + Assert.That(mun0, Is.Victorious); + Assert.That(tyr0, Is.Dislodged); + + // Confirm that an alternate future is created. + World world = setup.UpdateWorld(); + Season fork = world.GetSeason("b1"); + Unit tyr1 = world.GetUnitAt("Tyr", fork.Coord); + Assert.That( + tyr1.Past, + Is.EqualTo(mun0.Order.Unit), + "Expected A Mun a0 to advance to Tyr b1"); + Assert.That( + world.RetreatingUnits.Count, + Is.EqualTo(1), + "Expected A Tyr a0 to be in retreat"); + Assert.That(world.RetreatingUnits.First().Unit, Is.EqualTo(tyr0.Order.Unit)); + } +}