diff --git a/MinecraftClient.Tests/Pathing/Execution/Scenarios/SidewallParkourScenarioBuilder.cs b/MinecraftClient.Tests/Pathing/Execution/Scenarios/SidewallParkourScenarioBuilder.cs index 43fe1220..6c84335c 100644 --- a/MinecraftClient.Tests/Pathing/Execution/Scenarios/SidewallParkourScenarioBuilder.cs +++ b/MinecraftClient.Tests/Pathing/Execution/Scenarios/SidewallParkourScenarioBuilder.cs @@ -13,26 +13,40 @@ public static class SidewallParkourScenarioBuilder public static IEnumerable AcceptedCases() { - yield return ["sidewall-flat-gap2-wo0", 2, 0, 0]; - yield return ["sidewall-flat-gap3-wo1", 3, 0, 1]; yield return ["sidewall-ascend-gap2-dy+1-wo0", 2, 1, 0]; + yield return ["sidewall-ascend-gap3-dy+1-wo0", 3, 1, 0]; yield return ["sidewall-ascend-gap3-dy+1-wo1", 3, 1, 1]; - yield return ["sidewall-descend-gap2-dy-1-wo0", 2, -1, 0]; - yield return ["sidewall-descend-gap3-dy-1-wo1", 3, -1, 1]; yield return ["sidewall-descend-gap2-dy-2-wo0", 2, -2, 0]; + yield return ["sidewall-descend-gap3-dy-2-wo0", 3, -2, 0]; + yield return ["sidewall-descend-gap4-dy-2-wo0", 4, -2, 0]; + yield return ["sidewall-descend-gap5-dy-2-wo0", 5, -2, 0]; yield return ["sidewall-descend-gap3-dy-2-wo1", 3, -2, 1]; + yield return ["sidewall-descend-gap4-dy-2-wo1", 4, -2, 1]; + yield return ["sidewall-descend-gap5-dy-2-wo1", 5, -2, 1]; + yield return ["sidewall-descend-gap2-dy-1-wo0", 2, -1, 0]; + yield return ["sidewall-descend-gap3-dy-1-wo0", 3, -1, 0]; + yield return ["sidewall-descend-gap4-dy-1-wo0", 4, -1, 0]; + yield return ["sidewall-descend-gap5-dy-1-wo0", 5, -1, 0]; + yield return ["sidewall-descend-gap3-dy-1-wo1", 3, -1, 1]; + yield return ["sidewall-descend-gap4-dy-1-wo1", 4, -1, 1]; + yield return ["sidewall-descend-gap5-dy-1-wo1", 5, -1, 1]; + yield return ["sidewall-flat-gap2-wo0", 2, 0, 0]; + yield return ["sidewall-flat-gap3-wo0", 3, 0, 0]; + yield return ["sidewall-flat-gap4-wo0", 4, 0, 0]; + yield return ["sidewall-flat-gap3-wo1", 3, 0, 1]; + yield return ["sidewall-flat-gap4-wo1", 4, 0, 1]; } public static IEnumerable RejectedCases() { - yield return ["sidewall-flat-gap5-wo0", 5, 0, 0]; - yield return ["sidewall-flat-gap5-wo1", 5, 0, 1]; yield return ["sidewall-ascend-gap4-dy+1-wo0", 4, 1, 0]; yield return ["sidewall-ascend-gap4-dy+1-wo1", 4, 1, 1]; - yield return ["sidewall-descend-gap6-dy-1-wo0", 6, -1, 0]; - yield return ["sidewall-descend-gap6-dy-1-wo1", 6, -1, 1]; yield return ["sidewall-descend-gap6-dy-2-wo0", 6, -2, 0]; yield return ["sidewall-descend-gap6-dy-2-wo1", 6, -2, 1]; + yield return ["sidewall-descend-gap6-dy-1-wo0", 6, -1, 0]; + yield return ["sidewall-descend-gap6-dy-1-wo1", 6, -1, 1]; + yield return ["sidewall-flat-gap5-wo0", 5, 0, 0]; + yield return ["sidewall-flat-gap5-wo1", 5, 0, 1]; } internal static PathingExecutionScenario Create(string scenarioId, int gap, int deltaY, int wallOffset, int maxExecutionTicks = 700) diff --git a/MinecraftClient.Tests/Pathing/Execution/SidewallParkourScenarioBuilderTests.cs b/MinecraftClient.Tests/Pathing/Execution/SidewallParkourScenarioBuilderTests.cs index 13b985e1..96780d43 100644 --- a/MinecraftClient.Tests/Pathing/Execution/SidewallParkourScenarioBuilderTests.cs +++ b/MinecraftClient.Tests/Pathing/Execution/SidewallParkourScenarioBuilderTests.cs @@ -5,6 +5,62 @@ namespace MinecraftClient.Tests.Pathing.Execution; public sealed class SidewallParkourScenarioBuilderTests { + [Fact] + public void AcceptedCases_MatchLiveSidewallMatrix() + { + string[] caseIds = SidewallParkourScenarioBuilder.AcceptedCases() + .Select(static c => Assert.IsType(c[0])) + .ToArray(); + + Assert.Equal( + [ + "sidewall-ascend-gap2-dy+1-wo0", + "sidewall-ascend-gap3-dy+1-wo0", + "sidewall-ascend-gap3-dy+1-wo1", + "sidewall-descend-gap2-dy-2-wo0", + "sidewall-descend-gap3-dy-2-wo0", + "sidewall-descend-gap4-dy-2-wo0", + "sidewall-descend-gap5-dy-2-wo0", + "sidewall-descend-gap3-dy-2-wo1", + "sidewall-descend-gap4-dy-2-wo1", + "sidewall-descend-gap5-dy-2-wo1", + "sidewall-descend-gap2-dy-1-wo0", + "sidewall-descend-gap3-dy-1-wo0", + "sidewall-descend-gap4-dy-1-wo0", + "sidewall-descend-gap5-dy-1-wo0", + "sidewall-descend-gap3-dy-1-wo1", + "sidewall-descend-gap4-dy-1-wo1", + "sidewall-descend-gap5-dy-1-wo1", + "sidewall-flat-gap2-wo0", + "sidewall-flat-gap3-wo0", + "sidewall-flat-gap4-wo0", + "sidewall-flat-gap3-wo1", + "sidewall-flat-gap4-wo1", + ], + caseIds); + } + + [Fact] + public void RejectedCases_MatchLiveSidewallMatrix() + { + string[] caseIds = SidewallParkourScenarioBuilder.RejectedCases() + .Select(static c => Assert.IsType(c[0])) + .ToArray(); + + Assert.Equal( + [ + "sidewall-ascend-gap4-dy+1-wo0", + "sidewall-ascend-gap4-dy+1-wo1", + "sidewall-descend-gap6-dy-2-wo0", + "sidewall-descend-gap6-dy-2-wo1", + "sidewall-descend-gap6-dy-1-wo0", + "sidewall-descend-gap6-dy-1-wo1", + "sidewall-flat-gap5-wo0", + "sidewall-flat-gap5-wo1", + ], + caseIds); + } + [Fact] public void BuildWorld_FlatGap2Wo0_MatchesLiveRouteGeometry() { @@ -16,6 +72,9 @@ public sealed class SidewallParkourScenarioBuilderTests Assert.Equal(Material.Stone, world.GetBlock(new Location(99, 78, 100)).Type); Assert.Equal(Material.Stone, world.GetBlock(new Location(99, 79, 102)).Type); Assert.Equal(Material.Air, world.GetBlock(new Location(100, 79, 101)).Type); + Assert.Equal(Material.Stone, world.GetBlock(new Location(98, 78, 102)).Type); + Assert.Equal(Material.Stone, world.GetBlock(new Location(97, 79, 106)).Type); + Assert.Equal(Material.Air, world.GetBlock(new Location(98, 79, 103)).Type); } [Fact] @@ -44,4 +103,36 @@ public sealed class SidewallParkourScenarioBuilderTests Assert.Equal(106, scenario.Goal.Z); Assert.Equal(0f, scenario.StartYaw); } + + [Fact] + public void Create_AscendGap3Wo1_ComputesGoalForLaterRaisedEndpoint() + { + PathingExecutionScenario scenario = SidewallParkourScenarioBuilder.Create( + "sidewall-ascend-gap3-dy+1-wo1", + gap: 3, + deltaY: 1, + wallOffset: 1); + + Assert.Equal(new Location(100.5, 80, 100.5), scenario.Start); + Assert.Equal(97, scenario.Goal.X); + Assert.Equal(83, scenario.Goal.Y); + Assert.Equal(109, scenario.Goal.Z); + Assert.Equal(0f, scenario.StartYaw); + } + + [Fact] + public void Create_DescendGap5Wo1_ComputesGoalForLowerEndpoint() + { + PathingExecutionScenario scenario = SidewallParkourScenarioBuilder.Create( + "sidewall-descend-gap5-dy-2-wo1", + gap: 5, + deltaY: -2, + wallOffset: 1); + + Assert.Equal(new Location(100.5, 80, 100.5), scenario.Start); + Assert.Equal(97, scenario.Goal.X); + Assert.Equal(74, scenario.Goal.Y); + Assert.Equal(115, scenario.Goal.Z); + Assert.Equal(0f, scenario.StartYaw); + } }