using InkBlot.ParseHierarchy; using Shouldly; namespace InkBlot.Tests; public class MultiDivertTest : TestBase { private static IStoryNode[] MyParseText(string text, bool stripSpaces) { var (story, diagnostics) = ParseText(stripSpaces ? text.Replace(" ", "").Replace("\t", "") : text); diagnostics.ShouldBe([]); var storyNodes = story.StoryNodes.ToArray(); return storyNodes; } [Theory] [InlineData(true)] [InlineData(false)] public void TestThreadDivert(bool stripSpaces) { var storyNodes = MyParseText("<- threadName", stripSpaces); storyNodes.ShouldBe([new MultiDivert(new ThreadDivert(new Identifier(["threadName"])))]); } [Theory] [InlineData(true)] [InlineData(false)] public void TestSimpleDivert(bool stripSpaces) { var storyNodes = MyParseText("-> divertName", stripSpaces); storyNodes.ShouldBe([ new MultiDivert(new TunnelsAndDivertsList([], new TunnelListEndingDivert(new Identifier(["divertName"])))) ]); } [Theory] [InlineData(true)] [InlineData(false)] public void TestDefaultChoice(bool stripSpaces) { var storyNodes = MyParseText("->", stripSpaces); storyNodes.ShouldBe([ new MultiDivert(new TunnelsAndDivertsList([], new TunnelListEndingDivert(null))) ]); } [Theory] [InlineData(true)] [InlineData(false)] public void TestReturnFromTunnel(bool stripSpaces) { var storyNodes = MyParseText("->->", stripSpaces); storyNodes.ShouldBe([ new MultiDivert(new TunnelsAndDivertsList([], new TunnelListEndingReturnFromTunnel(null))) ]); } [Theory] [InlineData(true)] [InlineData(false)] public void TestDivertFromTunnel(bool stripSpaces) { var storyNodes = MyParseText("->-> divertName", stripSpaces); storyNodes.ShouldBe([ new MultiDivert(new TunnelsAndDivertsList([], new TunnelListEndingReturnFromTunnel(new Identifier(["divertName"])))) ]); } [Theory] [InlineData(true)] [InlineData(false)] public void TestTunnel(bool stripSpaces) { var storyNodes = MyParseText("-> tunnelName ->", stripSpaces); storyNodes.ShouldBe([ new MultiDivert(new TunnelsAndDivertsList([new Identifier(["tunnelName"])], new TunnelListEndingDivert(null))) ]); } [Theory] [InlineData(true)] [InlineData(false)] public void TestTunnelWithDivert(bool stripSpaces) { var storyNodes = MyParseText("-> tunnelName -> divertName", stripSpaces); storyNodes.ShouldBe([ new MultiDivert(new TunnelsAndDivertsList([new Identifier(["tunnelName"])], new TunnelListEndingDivert(new Identifier(["divertName"])))) ]); } [Theory] [InlineData(true)] [InlineData(false)] public void TestMultiTunnel(bool stripSpaces) { var storyNodes = MyParseText("-> tunnelName1 -> tunnelName2 ->", stripSpaces); storyNodes.ShouldBe([ new MultiDivert(new TunnelsAndDivertsList( [new Identifier(["tunnelName1"]), new Identifier(["tunnelName2"])], new TunnelListEndingDivert(null))) ]); } [Theory] [InlineData(true)] [InlineData(false)] public void TestMultiTunnelWithReturn(bool stripSpaces) { var storyNodes = MyParseText("-> tunnelName1 -> tunnelName2 ->->", stripSpaces); storyNodes.ShouldBe([ new MultiDivert(new TunnelsAndDivertsList( [new Identifier(["tunnelName1"]), new Identifier(["tunnelName2"])], new TunnelListEndingReturnFromTunnel(null))) ]); } [Theory] [InlineData(true)] [InlineData(false)] public void TestMultiTunnelWithReturnAndReplacement(bool stripSpaces) { var storyNodes = MyParseText("-> tunnelName1 -> tunnelName2 ->-> replacementDivert", stripSpaces); storyNodes.ShouldBe([ new MultiDivert(new TunnelsAndDivertsList( [new Identifier(["tunnelName1"]), new Identifier(["tunnelName2"])], new TunnelListEndingReturnFromTunnel(new Identifier(["replacementDivert"])))) ]); } }