using GeometryTD.Definition; using GeometryTD.Procedure; using NUnit.Framework; namespace GeometryTD.Tests.EditMode { public sealed class ProcedureMainServicesTests { [Test] public void TryAdvanceRun_Returns_AdvancedToNextNode_For_Normal_Completion() { RunState runState = CreateTwoNodeRun(); ProcedureMainRunAdvanceResult result = ProcedureMainRunFlowService.TryAdvanceRun( runState, RunNodeCompletionStatus.Completed, new BackpackInventoryData { Gold = 88 }); Assert.That(result, Is.EqualTo(ProcedureMainRunAdvanceResult.AdvancedToNextNode)); Assert.That(runState.IsCompleted, Is.False); Assert.That(runState.Nodes[0].Status, Is.EqualTo(RunNodeStatus.Completed)); Assert.That(runState.CurrentNodeIndex, Is.EqualTo(1)); Assert.That(runState.CurrentNode.Status, Is.EqualTo(RunNodeStatus.Available)); Assert.That(runState.RunInventorySnapshot.Gold, Is.EqualTo(88)); } [Test] public void TryAdvanceRun_Returns_NodeException_For_Exception_Fallback() { RunState runState = CreateTwoNodeRun(); ProcedureMainRunAdvanceResult result = ProcedureMainRunFlowService.TryAdvanceRun( runState, RunNodeCompletionStatus.Exception, new BackpackInventoryData { Gold = 5 }); Assert.That(result, Is.EqualTo(ProcedureMainRunAdvanceResult.NodeException)); Assert.That(runState.IsCompleted, Is.False); Assert.That(runState.CurrentNodeIndex, Is.EqualTo(0)); Assert.That(runState.CurrentNode.Status, Is.EqualTo(RunNodeStatus.Exception)); Assert.That(runState.Nodes[1].Status, Is.EqualTo(RunNodeStatus.Locked)); Assert.That(runState.RunInventorySnapshot.Gold, Is.EqualTo(5)); } [Test] public void TryAdvanceRun_Returns_RunCompleted_When_Last_Node_Finishes() { RunState runState = RunStateFactory.Create( LevelThemeType.Plain, new BackpackInventoryData { Gold = 30 }, new[] { new RunNodeSeed { NodeId = 901, NodeType = RunNodeType.BossCombat, LinkedLevelId = 4 } }); ProcedureMainRunAdvanceResult result = ProcedureMainRunFlowService.TryAdvanceRun( runState, RunNodeCompletionStatus.Completed, new BackpackInventoryData { Gold = 123 }); Assert.That(result, Is.EqualTo(ProcedureMainRunAdvanceResult.RunCompleted)); Assert.That(runState.IsCompleted, Is.True); Assert.That(runState.CurrentNodeIndex, Is.EqualTo(1)); Assert.That(runState.CompletedNodeCount, Is.EqualTo(1)); Assert.That(runState.RunInventorySnapshot.Gold, Is.EqualTo(123)); } [Test] public void TryAdvanceRun_Returns_NoChange_When_Run_Cannot_Advance() { ProcedureMainRunAdvanceResult nullRunResult = ProcedureMainRunFlowService.TryAdvanceRun( null, RunNodeCompletionStatus.Completed, new BackpackInventoryData { Gold = 1 }); Assert.That(nullRunResult, Is.EqualTo(ProcedureMainRunAdvanceResult.NoChange)); RunState completedRun = RunStateFactory.Create( LevelThemeType.Plain, new BackpackInventoryData { Gold = 10 }, new RunNodeSeed[0]); ProcedureMainRunAdvanceResult completedRunResult = ProcedureMainRunFlowService.TryAdvanceRun( completedRun, RunNodeCompletionStatus.Completed, new BackpackInventoryData { Gold = 20 }); Assert.That(completedRunResult, Is.EqualTo(ProcedureMainRunAdvanceResult.NoChange)); Assert.That(completedRun.RunInventorySnapshot.Gold, Is.EqualTo(10)); } [Test] public void TryEnterCompletedPendingFinish_Shows_Dialog_Only_Once() { ProcedureMainRunCompletionResult firstResult = ProcedureMainRunCompletionService.TryEnterCompletedPendingFinish(false); ProcedureMainRunCompletionResult secondResult = ProcedureMainRunCompletionService.TryEnterCompletedPendingFinish(true); Assert.That(firstResult, Is.EqualTo(ProcedureMainRunCompletionResult.ShowCompletionDialog)); Assert.That(secondResult, Is.EqualTo(ProcedureMainRunCompletionResult.NoChange)); } [Test] public void TryConfirmReturnToMenu_Returns_Menu_Only_In_Completed_Pending_Finish() { ProcedureMainRunCompletionResult validResult = ProcedureMainRunCompletionService.TryConfirmReturnToMenu( ProcedureMainFlowPhase.RunCompletedPendingFinish, false); ProcedureMainRunCompletionResult hubResult = ProcedureMainRunCompletionService.TryConfirmReturnToMenu( ProcedureMainFlowPhase.Hub, false); ProcedureMainRunCompletionResult pendingResult = ProcedureMainRunCompletionService.TryConfirmReturnToMenu( ProcedureMainFlowPhase.RunCompletedPendingFinish, true); Assert.That(validResult, Is.EqualTo(ProcedureMainRunCompletionResult.ReturnToMenu)); Assert.That(hubResult, Is.EqualTo(ProcedureMainRunCompletionResult.NoChange)); Assert.That(pendingResult, Is.EqualTo(ProcedureMainRunCompletionResult.NoChange)); } private static RunState CreateTwoNodeRun() { return RunStateFactory.Create( LevelThemeType.Plain, new BackpackInventoryData { Gold = 50 }, new[] { new RunNodeSeed { NodeId = 101, NodeType = RunNodeType.Combat, LinkedLevelId = 1 }, new RunNodeSeed { NodeId = 102, NodeType = RunNodeType.Event } }); } } }