using NUnit.Framework; using ProjectM.Simulation; namespace ProjectM.Tests { /// /// Pins : a TERMINAL save (Victory/Loss latched) /// Continues as a fresh campaign — outcome / goal meter / core reset to 0 (the spawn restore guards re-map /// 0 to InProgress / empty / baked-full) — while the permanent channel (meta tiers, run counters, ledger, /// structures) survives untouched. In-progress saves and null are no-ops. /// public class TerminalCampaignRollTests { [Test] public void TerminalSave_RollsForward_KeepingBaseAndMeta() { var data = new SaveData { RunOutcome = 1, // Victory latched GoalCharge = 4, GoalTarget = 4, CoreCurrent = 37, RunsCompleted = 4, MaxDepthReached = 7, MetaUpgrades = new[] { new MetaUpgradeSave { ClassId = 0, UpgradeId = 1, Tier = 2 } }, Ledger = new[] { new LedgerRow { ItemId = ResourceId.Ore, Count = 123 } }, }; SaveService.RollTerminalCampaignForward(data); Assert.AreEqual(0, data.RunOutcome, "outcome latch reset"); Assert.AreEqual(0, data.GoalCharge, "goal meter reset"); Assert.AreEqual(0, data.CoreCurrent, "core resets to 0 -> restore guard re-maps to baked-full"); Assert.AreEqual(4, data.RunsCompleted, "permanent counters survive"); Assert.AreEqual(7, data.MaxDepthReached, "permanent counters survive"); Assert.AreEqual(2, data.MetaUpgrades[0].Tier, "meta tiers survive"); Assert.AreEqual(123, data.Ledger[0].Count, "the ledger survives"); } [Test] public void InProgressSave_AndNull_AreNoOps() { var data = new SaveData { RunOutcome = 0, GoalCharge = 2, CoreCurrent = 50 }; SaveService.RollTerminalCampaignForward(data); Assert.AreEqual(2, data.GoalCharge); Assert.AreEqual(50, data.CoreCurrent); Assert.DoesNotThrow(() => SaveService.RollTerminalCampaignForward(null)); } } }