test: add long route timing contracts

This commit is contained in:
BruceChen 2026-04-13 17:20:46 +00:00
parent eb9d6ce356
commit b42a24e77a
5 changed files with 2083 additions and 93 deletions

View file

@ -44,4 +44,26 @@ public sealed class PathTimingContractTests
PathingContractAssert.TimingMatches(budget, result);
}
[Theory]
[InlineData("same-move-straight-traverse-chain")]
[InlineData("same-move-diagonal-chain")]
[InlineData("same-move-ascend-staircase")]
[InlineData("same-move-descend-staircase")]
[InlineData("same-move-aligned-parkour-chain")]
[InlineData("mixed-traverse-turn-parkour-turn-traverse")]
[InlineData("mixed-diagonal-ascend-traverse-descend")]
[InlineData("mixed-traverse-ascend-parkour-descend")]
[InlineData("turn-density-alternating-traverse-diagonal-chain")]
[InlineData("speed-carry-repeated-traverse-ascend")]
[InlineData("speed-carry-repeated-traverse-descend")]
[InlineData("speed-carry-repeated-traverse-parkour")]
public void LongRoute_ExecutionStaysWithinBudget(string scenarioId)
{
PathingExecutionScenario scenario = PathingExecutionScenarioCatalog.Get(scenarioId);
PathingTimingBudget budget = PathingContractStore.LoadFromRepositoryRoot().GetTiming(scenarioId);
PathingScenarioResult result = PathingScenarioRunner.RunAccepted(scenario);
PathingContractAssert.TimingMatches(budget, result);
}
}

View file

@ -39,4 +39,27 @@ public sealed class PathingContractBootstrapTests
if (planResult.Status == PathStatus.Success)
_output.WriteLine(PathingContractBootstrapWriter.WriteTimingFragment(scenarioId, PathingScenarioRunner.RunAccepted(scenario)));
}
[Theory]
[InlineData("same-move-straight-traverse-chain")]
[InlineData("same-move-diagonal-chain")]
[InlineData("same-move-ascend-staircase")]
[InlineData("same-move-descend-staircase")]
[InlineData("same-move-aligned-parkour-chain")]
[InlineData("mixed-traverse-turn-parkour-turn-traverse")]
[InlineData("mixed-diagonal-ascend-traverse-descend")]
[InlineData("mixed-traverse-ascend-parkour-descend")]
[InlineData("turn-density-alternating-traverse-diagonal-chain")]
[InlineData("speed-carry-repeated-traverse-ascend")]
[InlineData("speed-carry-repeated-traverse-descend")]
[InlineData("speed-carry-repeated-traverse-parkour")]
public void PrintLongRouteContractFragments(string scenarioId)
{
PathingExecutionScenario scenario = PathingExecutionScenarioCatalog.Get(scenarioId);
PathResult planResult = PathingScenarioRunner.PlanOnly(scenario);
_output.WriteLine(PathingContractBootstrapWriter.WritePlannerFragment(scenarioId, planResult));
if (planResult.Status == PathStatus.Success)
_output.WriteLine(PathingContractBootstrapWriter.WriteTimingFragment(scenarioId, PathingScenarioRunner.RunAccepted(scenario)));
}
}

View file

@ -88,6 +88,96 @@ internal static class PathingExecutionScenarioCatalog
StartYaw = 315f,
MaxExecutionTicks = 420
},
"same-move-straight-traverse-chain" => new PathingExecutionScenario
{
Id = scenarioId,
BuildWorld = BuildSameMoveStraightTraverseChain,
Start = new Location(300.5, 80, 300.5),
Goal = new GoalBlock(312, 80, 300),
StartYaw = 270f,
MaxExecutionTicks = 420
},
"same-move-diagonal-chain" => new PathingExecutionScenario
{
Id = scenarioId,
BuildWorld = BuildSameMoveDiagonalChain,
Start = new Location(320.5, 80, 320.5),
Goal = new GoalBlock(327, 80, 327),
StartYaw = 315f,
MaxExecutionTicks = 420
},
"same-move-aligned-parkour-chain" => new PathingExecutionScenario
{
Id = scenarioId,
BuildWorld = BuildSameMoveAlignedParkourChain,
Start = new Location(380.5, 80, 380.5),
Goal = new GoalBlock(388, 80, 380),
StartYaw = 270f,
MaxExecutionTicks = 420
},
"mixed-traverse-turn-parkour-turn-traverse" => new PathingExecutionScenario
{
Id = scenarioId,
BuildWorld = BuildMixedTraverseTurnParkourTurnTraverse,
Start = new Location(400.5, 80, 400.5),
Goal = new GoalBlock(408, 80, 404),
StartYaw = 270f,
MaxExecutionTicks = 420
},
"mixed-diagonal-ascend-traverse-descend" => new PathingExecutionScenario
{
Id = scenarioId,
BuildWorld = BuildMixedDiagonalAscendTraverseDescend,
Start = new Location(420.5, 80, 420.5),
Goal = new GoalBlock(428, 80, 422),
StartYaw = 315f,
MaxExecutionTicks = 420
},
"mixed-traverse-ascend-parkour-descend" => new PathingExecutionScenario
{
Id = scenarioId,
BuildWorld = BuildMixedTraverseAscendParkourDescend,
Start = new Location(440.5, 80, 440.5),
Goal = new GoalBlock(448, 80, 440),
StartYaw = 270f,
MaxExecutionTicks = 420
},
"turn-density-alternating-traverse-diagonal-chain" => new PathingExecutionScenario
{
Id = scenarioId,
BuildWorld = BuildTurnDensityAlternatingTraverseDiagonalChain,
Start = new Location(460.5, 80, 460.5),
Goal = new GoalBlock(466, 80, 466),
StartYaw = 270f,
MaxExecutionTicks = 420
},
"speed-carry-repeated-traverse-ascend" => new PathingExecutionScenario
{
Id = scenarioId,
BuildWorld = BuildSpeedCarryRepeatedTraverseAscend,
Start = new Location(480.5, 80, 480.5),
Goal = new GoalBlock(488, 84, 480),
StartYaw = 270f,
MaxExecutionTicks = 420
},
"speed-carry-repeated-traverse-descend" => new PathingExecutionScenario
{
Id = scenarioId,
BuildWorld = BuildSpeedCarryRepeatedTraverseDescend,
Start = new Location(500.5, 83, 500.5),
Goal = new GoalBlock(507, 80, 500),
StartYaw = 270f,
MaxExecutionTicks = 420
},
"speed-carry-repeated-traverse-parkour" => new PathingExecutionScenario
{
Id = scenarioId,
BuildWorld = BuildSpeedCarryRepeatedTraverseParkour,
Start = new Location(520.5, 80, 520.5),
Goal = new GoalBlock(529, 80, 520),
StartYaw = 270f,
MaxExecutionTicks = 420
},
_ => throw new ArgumentOutOfRangeException(nameof(scenarioId), scenarioId, null)
};
@ -199,4 +289,151 @@ internal static class PathingExecutionScenarioCatalog
FlatWorldTestBuilder.SetSolid(world, 684, 79, 624);
return world;
}
private static World BuildSameMoveStraightTraverseChain()
{
World world = FlatWorldTestBuilder.CreateStoneFloor(min: 298, max: 314);
FlatWorldTestBuilder.ClearBox(world, 298, 79, 298, 314, 90, 302);
FlatWorldTestBuilder.FillSolid(world, 300, 79, 300, 312, 79, 300);
return world;
}
private static World BuildSameMoveDiagonalChain()
{
World world = FlatWorldTestBuilder.CreateStoneFloor(min: 318, max: 330);
FlatWorldTestBuilder.ClearBox(world, 318, 79, 318, 330, 90, 330);
FlatWorldTestBuilder.SetSolid(world, 320, 79, 320);
FlatWorldTestBuilder.SetSolid(world, 321, 79, 321);
FlatWorldTestBuilder.SetSolid(world, 322, 79, 322);
FlatWorldTestBuilder.SetSolid(world, 323, 79, 323);
FlatWorldTestBuilder.SetSolid(world, 324, 79, 324);
FlatWorldTestBuilder.SetSolid(world, 325, 79, 325);
FlatWorldTestBuilder.SetSolid(world, 326, 79, 326);
FlatWorldTestBuilder.SetSolid(world, 327, 79, 327);
return world;
}
private static World BuildSameMoveAlignedParkourChain()
{
World world = FlatWorldTestBuilder.CreateStoneFloor(min: 378, max: 390);
FlatWorldTestBuilder.ClearBox(world, 378, 79, 378, 390, 90, 382);
FlatWorldTestBuilder.SetSolid(world, 380, 79, 380);
FlatWorldTestBuilder.SetSolid(world, 382, 79, 380);
FlatWorldTestBuilder.SetSolid(world, 384, 79, 380);
FlatWorldTestBuilder.SetSolid(world, 386, 79, 380);
FlatWorldTestBuilder.SetSolid(world, 388, 79, 380);
return world;
}
private static World BuildMixedTraverseTurnParkourTurnTraverse()
{
World world = FlatWorldTestBuilder.CreateStoneFloor(min: 398, max: 410);
FlatWorldTestBuilder.ClearBox(world, 398, 79, 398, 410, 90, 406);
FlatWorldTestBuilder.SetSolid(world, 400, 79, 400);
FlatWorldTestBuilder.SetSolid(world, 401, 79, 400);
FlatWorldTestBuilder.SetSolid(world, 402, 79, 400);
FlatWorldTestBuilder.SetSolid(world, 402, 79, 401);
FlatWorldTestBuilder.SetSolid(world, 402, 79, 402);
FlatWorldTestBuilder.SetSolid(world, 404, 79, 402);
FlatWorldTestBuilder.SetSolid(world, 405, 79, 402);
FlatWorldTestBuilder.SetSolid(world, 406, 79, 402);
FlatWorldTestBuilder.SetSolid(world, 406, 79, 403);
FlatWorldTestBuilder.SetSolid(world, 406, 79, 404);
FlatWorldTestBuilder.SetSolid(world, 407, 79, 404);
FlatWorldTestBuilder.SetSolid(world, 408, 79, 404);
return world;
}
private static World BuildMixedDiagonalAscendTraverseDescend()
{
World world = FlatWorldTestBuilder.CreateStoneFloor(min: 418, max: 430);
FlatWorldTestBuilder.ClearBox(world, 418, 79, 418, 430, 92, 424);
FlatWorldTestBuilder.SetSolid(world, 420, 79, 420);
FlatWorldTestBuilder.SetSolid(world, 421, 79, 421);
FlatWorldTestBuilder.SetSolid(world, 422, 79, 422);
FlatWorldTestBuilder.SetSolid(world, 423, 80, 422);
FlatWorldTestBuilder.SetSolid(world, 424, 81, 422);
FlatWorldTestBuilder.SetSolid(world, 425, 81, 422);
FlatWorldTestBuilder.SetSolid(world, 426, 81, 422);
FlatWorldTestBuilder.SetSolid(world, 427, 80, 422);
FlatWorldTestBuilder.SetSolid(world, 428, 79, 422);
return world;
}
private static World BuildMixedTraverseAscendParkourDescend()
{
World world = FlatWorldTestBuilder.CreateStoneFloor(min: 438, max: 450);
FlatWorldTestBuilder.ClearBox(world, 438, 79, 438, 450, 92, 442);
FlatWorldTestBuilder.SetSolid(world, 440, 79, 440);
FlatWorldTestBuilder.SetSolid(world, 441, 79, 440);
FlatWorldTestBuilder.SetSolid(world, 442, 80, 440);
FlatWorldTestBuilder.SetSolid(world, 443, 81, 440);
FlatWorldTestBuilder.SetSolid(world, 444, 81, 440);
FlatWorldTestBuilder.SetSolid(world, 446, 81, 440);
FlatWorldTestBuilder.SetSolid(world, 447, 80, 440);
FlatWorldTestBuilder.SetSolid(world, 448, 79, 440);
return world;
}
private static World BuildTurnDensityAlternatingTraverseDiagonalChain()
{
World world = FlatWorldTestBuilder.CreateStoneFloor(min: 458, max: 468);
FlatWorldTestBuilder.ClearBox(world, 458, 79, 458, 468, 90, 468);
FlatWorldTestBuilder.SetSolid(world, 460, 79, 460);
FlatWorldTestBuilder.SetSolid(world, 461, 79, 460);
FlatWorldTestBuilder.SetSolid(world, 461, 79, 461);
FlatWorldTestBuilder.SetSolid(world, 462, 79, 462);
FlatWorldTestBuilder.SetSolid(world, 463, 79, 462);
FlatWorldTestBuilder.SetSolid(world, 463, 79, 463);
FlatWorldTestBuilder.SetSolid(world, 464, 79, 464);
FlatWorldTestBuilder.SetSolid(world, 465, 79, 464);
FlatWorldTestBuilder.SetSolid(world, 465, 79, 465);
FlatWorldTestBuilder.SetSolid(world, 466, 79, 466);
return world;
}
private static World BuildSpeedCarryRepeatedTraverseAscend()
{
World world = FlatWorldTestBuilder.CreateStoneFloor(min: 478, max: 490);
FlatWorldTestBuilder.ClearBox(world, 478, 79, 478, 490, 94, 482);
FlatWorldTestBuilder.SetSolid(world, 480, 79, 480);
FlatWorldTestBuilder.SetSolid(world, 481, 79, 480);
FlatWorldTestBuilder.SetSolid(world, 482, 80, 480);
FlatWorldTestBuilder.SetSolid(world, 483, 80, 480);
FlatWorldTestBuilder.SetSolid(world, 484, 81, 480);
FlatWorldTestBuilder.SetSolid(world, 485, 81, 480);
FlatWorldTestBuilder.SetSolid(world, 486, 82, 480);
FlatWorldTestBuilder.SetSolid(world, 487, 82, 480);
FlatWorldTestBuilder.SetSolid(world, 488, 83, 480);
return world;
}
private static World BuildSpeedCarryRepeatedTraverseDescend()
{
World world = FlatWorldTestBuilder.CreateStoneFloor(min: 498, max: 510);
FlatWorldTestBuilder.ClearBox(world, 498, 79, 498, 510, 94, 502);
FlatWorldTestBuilder.SetSolid(world, 500, 82, 500);
FlatWorldTestBuilder.SetSolid(world, 501, 82, 500);
FlatWorldTestBuilder.SetSolid(world, 502, 81, 500);
FlatWorldTestBuilder.SetSolid(world, 503, 81, 500);
FlatWorldTestBuilder.SetSolid(world, 504, 80, 500);
FlatWorldTestBuilder.SetSolid(world, 505, 80, 500);
FlatWorldTestBuilder.SetSolid(world, 506, 79, 500);
FlatWorldTestBuilder.SetSolid(world, 507, 79, 500);
return world;
}
private static World BuildSpeedCarryRepeatedTraverseParkour()
{
World world = FlatWorldTestBuilder.CreateStoneFloor(min: 518, max: 532);
FlatWorldTestBuilder.ClearBox(world, 518, 79, 518, 532, 90, 522);
FlatWorldTestBuilder.SetSolid(world, 520, 79, 520);
FlatWorldTestBuilder.SetSolid(world, 521, 79, 520);
FlatWorldTestBuilder.SetSolid(world, 523, 79, 520);
FlatWorldTestBuilder.SetSolid(world, 524, 79, 520);
FlatWorldTestBuilder.SetSolid(world, 526, 79, 520);
FlatWorldTestBuilder.SetSolid(world, 527, 79, 520);
FlatWorldTestBuilder.SetSolid(world, 529, 79, 520);
return world;
}
}

View file

@ -4,12 +4,36 @@
"expectedTotalTicks": 0,
"maxTotalTicks": 0,
"segments": [
{ "moveType": "Diagonal", "expectedTicks": 0, "maxTicks": 0 },
{ "moveType": "Diagonal", "expectedTicks": 0, "maxTicks": 0 },
{ "moveType": "Traverse", "expectedTicks": 0, "maxTicks": 0 },
{ "moveType": "Ascend", "expectedTicks": 0, "maxTicks": 0 },
{ "moveType": "Ascend", "expectedTicks": 0, "maxTicks": 0 },
{ "moveType": "Ascend", "expectedTicks": 0, "maxTicks": 0 }
{
"moveType": "Diagonal",
"expectedTicks": 0,
"maxTicks": 0
},
{
"moveType": "Diagonal",
"expectedTicks": 0,
"maxTicks": 0
},
{
"moveType": "Traverse",
"expectedTicks": 0,
"maxTicks": 0
},
{
"moveType": "Ascend",
"expectedTicks": 0,
"maxTicks": 0
},
{
"moveType": "Ascend",
"expectedTicks": 0,
"maxTicks": 0
},
{
"moveType": "Ascend",
"expectedTicks": 0,
"maxTicks": 0
}
]
},
{
@ -17,11 +41,31 @@
"expectedTotalTicks": 56,
"maxTotalTicks": 68,
"segments": [
{ "moveType": "Ascend", "expectedTicks": 11, "maxTicks": 14 },
{ "moveType": "Ascend", "expectedTicks": 11, "maxTicks": 14 },
{ "moveType": "Ascend", "expectedTicks": 11, "maxTicks": 14 },
{ "moveType": "Ascend", "expectedTicks": 11, "maxTicks": 14 },
{ "moveType": "Ascend", "expectedTicks": 12, "maxTicks": 15 }
{
"moveType": "Ascend",
"expectedTicks": 11,
"maxTicks": 14
},
{
"moveType": "Ascend",
"expectedTicks": 11,
"maxTicks": 14
},
{
"moveType": "Ascend",
"expectedTicks": 11,
"maxTicks": 14
},
{
"moveType": "Ascend",
"expectedTicks": 11,
"maxTicks": 14
},
{
"moveType": "Ascend",
"expectedTicks": 12,
"maxTicks": 15
}
]
},
{
@ -29,9 +73,21 @@
"expectedTotalTicks": 61,
"maxTotalTicks": 74,
"segments": [
{ "moveType": "Descend", "expectedTicks": 24, "maxTicks": 29 },
{ "moveType": "Descend", "expectedTicks": 25, "maxTicks": 30 },
{ "moveType": "Descend", "expectedTicks": 12, "maxTicks": 15 }
{
"moveType": "Descend",
"expectedTicks": 24,
"maxTicks": 29
},
{
"moveType": "Descend",
"expectedTicks": 25,
"maxTicks": 30
},
{
"moveType": "Descend",
"expectedTicks": 12,
"maxTicks": 15
}
]
},
{
@ -45,10 +101,26 @@
"expectedTotalTicks": 0,
"maxTotalTicks": 2,
"segments": [
{ "moveType": "Parkour", "expectedTicks": 61, "maxTicks": 74 },
{ "moveType": "Parkour", "expectedTicks": 61, "maxTicks": 74 },
{ "moveType": "Parkour", "expectedTicks": 61, "maxTicks": 74 },
{ "moveType": "Parkour", "expectedTicks": 27, "maxTicks": 33 }
{
"moveType": "Parkour",
"expectedTicks": 61,
"maxTicks": 74
},
{
"moveType": "Parkour",
"expectedTicks": 61,
"maxTicks": 74
},
{
"moveType": "Parkour",
"expectedTicks": 61,
"maxTicks": 74
},
{
"moveType": "Parkour",
"expectedTicks": 27,
"maxTicks": 33
}
]
},
{
@ -56,9 +128,21 @@
"expectedTotalTicks": 20,
"maxTotalTicks": 24,
"segments": [
{ "moveType": "Parkour", "expectedTicks": 61, "maxTicks": 74 },
{ "moveType": "Parkour", "expectedTicks": 61, "maxTicks": 74 },
{ "moveType": "Parkour", "expectedTicks": 20, "maxTicks": 24 }
{
"moveType": "Parkour",
"expectedTicks": 61,
"maxTicks": 74
},
{
"moveType": "Parkour",
"expectedTicks": 61,
"maxTicks": 74
},
{
"moveType": "Parkour",
"expectedTicks": 20,
"maxTicks": 24
}
]
},
{
@ -66,9 +150,21 @@
"expectedTotalTicks": 0,
"maxTotalTicks": 2,
"segments": [
{ "moveType": "Parkour", "expectedTicks": 27, "maxTicks": 33 },
{ "moveType": "Parkour", "expectedTicks": 27, "maxTicks": 33 },
{ "moveType": "Parkour", "expectedTicks": 27, "maxTicks": 33 }
{
"moveType": "Parkour",
"expectedTicks": 27,
"maxTicks": 33
},
{
"moveType": "Parkour",
"expectedTicks": 27,
"maxTicks": 33
},
{
"moveType": "Parkour",
"expectedTicks": 27,
"maxTicks": 33
}
]
},
{
@ -76,10 +172,26 @@
"expectedTotalTicks": 33,
"maxTotalTicks": 40,
"segments": [
{ "moveType": "Parkour", "expectedTicks": 13, "maxTicks": 16 },
{ "moveType": "Descend", "expectedTicks": 201, "maxTicks": 242 },
{ "moveType": "Parkour", "expectedTicks": 19, "maxTicks": 23 },
{ "moveType": "Descend", "expectedTicks": 14, "maxTicks": 17 }
{
"moveType": "Parkour",
"expectedTicks": 13,
"maxTicks": 16
},
{
"moveType": "Descend",
"expectedTicks": 201,
"maxTicks": 242
},
{
"moveType": "Parkour",
"expectedTicks": 19,
"maxTicks": 23
},
{
"moveType": "Descend",
"expectedTicks": 14,
"maxTicks": 17
}
]
},
{
@ -87,9 +199,426 @@
"expectedTotalTicks": 31,
"maxTotalTicks": 38,
"segments": [
{ "moveType": "Ascend", "expectedTicks": 81, "maxTicks": 98 },
{ "moveType": "Parkour", "expectedTicks": 16, "maxTicks": 20 },
{ "moveType": "Descend", "expectedTicks": 15, "maxTicks": 18 }
{
"moveType": "Ascend",
"expectedTicks": 81,
"maxTicks": 98
},
{
"moveType": "Parkour",
"expectedTicks": 16,
"maxTicks": 20
},
{
"moveType": "Descend",
"expectedTicks": 15,
"maxTicks": 18
}
]
},
{
"scenarioId": "turn-density-alternating-traverse-diagonal-chain",
"expectedTotalTicks": 47,
"maxTotalTicks": 57,
"segments": [
{
"moveType": "Diagonal",
"expectedTicks": 8,
"maxTicks": 10
},
{
"moveType": "Diagonal",
"expectedTicks": 8,
"maxTicks": 10
},
{
"moveType": "Diagonal",
"expectedTicks": 8,
"maxTicks": 10
},
{
"moveType": "Diagonal",
"expectedTicks": 7,
"maxTicks": 9
},
{
"moveType": "Diagonal",
"expectedTicks": 8,
"maxTicks": 10
},
{
"moveType": "Diagonal",
"expectedTicks": 8,
"maxTicks": 10
}
]
},
{
"scenarioId": "mixed-traverse-ascend-parkour-descend",
"expectedTotalTicks": 40,
"maxTotalTicks": 48,
"segments": [
{
"moveType": "Traverse",
"expectedTicks": 6,
"maxTicks": 8
},
{
"moveType": "Ascend",
"expectedTicks": 11,
"maxTicks": 14
},
{
"moveType": "Ascend",
"expectedTicks": 11,
"maxTicks": 14
},
{
"moveType": "Traverse",
"expectedTicks": 81,
"maxTicks": 98
},
{
"moveType": "Parkour",
"expectedTicks": 18,
"maxTicks": 22
},
{
"moveType": "Descend",
"expectedTicks": 22,
"maxTicks": 27
}
]
},
{
"scenarioId": "same-move-aligned-parkour-chain",
"expectedTotalTicks": 0,
"maxTotalTicks": 2,
"segments": [
{
"moveType": "Parkour",
"expectedTicks": 61,
"maxTicks": 74
},
{
"moveType": "Parkour",
"expectedTicks": 61,
"maxTicks": 74
},
{
"moveType": "Parkour",
"expectedTicks": 61,
"maxTicks": 74
},
{
"moveType": "Parkour",
"expectedTicks": 27,
"maxTicks": 33
}
]
},
{
"scenarioId": "mixed-diagonal-ascend-traverse-descend",
"expectedTotalTicks": 96,
"maxTotalTicks": 116,
"segments": [
{
"moveType": "Diagonal",
"expectedTicks": 8,
"maxTicks": 10
},
{
"moveType": "Diagonal",
"expectedTicks": 8,
"maxTicks": 10
},
{
"moveType": "Ascend",
"expectedTicks": 32,
"maxTicks": 39
},
{
"moveType": "Ascend",
"expectedTicks": 11,
"maxTicks": 14
},
{
"moveType": "Traverse",
"expectedTicks": 6,
"maxTicks": 8
},
{
"moveType": "Traverse",
"expectedTicks": 5,
"maxTicks": 7
},
{
"moveType": "Descend",
"expectedTicks": 26,
"maxTicks": 32
}
]
},
{
"scenarioId": "speed-carry-repeated-traverse-ascend",
"expectedTotalTicks": 66,
"maxTotalTicks": 80,
"segments": [
{
"moveType": "Traverse",
"expectedTicks": 6,
"maxTicks": 8
},
{
"moveType": "Ascend",
"expectedTicks": 11,
"maxTicks": 14
},
{
"moveType": "Traverse",
"expectedTicks": 5,
"maxTicks": 7
},
{
"moveType": "Ascend",
"expectedTicks": 11,
"maxTicks": 14
},
{
"moveType": "Traverse",
"expectedTicks": 5,
"maxTicks": 7
},
{
"moveType": "Ascend",
"expectedTicks": 11,
"maxTicks": 14
},
{
"moveType": "Traverse",
"expectedTicks": 5,
"maxTicks": 7
},
{
"moveType": "Ascend",
"expectedTicks": 12,
"maxTicks": 15
}
]
},
{
"scenarioId": "speed-carry-repeated-traverse-descend",
"expectedTotalTicks": 41,
"maxTotalTicks": 50,
"segments": [
{
"moveType": "Traverse",
"expectedTicks": 81,
"maxTicks": 98
},
{
"moveType": "Parkour",
"expectedTicks": 22,
"maxTicks": 27
},
{
"moveType": "Traverse",
"expectedTicks": 6,
"maxTicks": 8
},
{
"moveType": "Descend",
"expectedTicks": 13,
"maxTicks": 16
}
]
},
{
"scenarioId": "speed-carry-repeated-traverse-parkour",
"expectedTotalTicks": 0,
"maxTotalTicks": 2,
"segments": [
{
"moveType": "Traverse",
"expectedTicks": 81,
"maxTicks": 98
},
{
"moveType": "Parkour",
"expectedTicks": 18,
"maxTicks": 22
},
{
"moveType": "Traverse",
"expectedTicks": 81,
"maxTicks": 98
},
{
"moveType": "Parkour",
"expectedTicks": 15,
"maxTicks": 18
},
{
"moveType": "Traverse",
"expectedTicks": 81,
"maxTicks": 98
},
{
"moveType": "Parkour",
"expectedTicks": 29,
"maxTicks": 35
}
]
},
{
"scenarioId": "same-move-diagonal-chain",
"expectedTotalTicks": 55,
"maxTotalTicks": 66,
"segments": [
{
"moveType": "Diagonal",
"expectedTicks": 8,
"maxTicks": 10
},
{
"moveType": "Diagonal",
"expectedTicks": 8,
"maxTicks": 10
},
{
"moveType": "Diagonal",
"expectedTicks": 7,
"maxTicks": 9
},
{
"moveType": "Diagonal",
"expectedTicks": 8,
"maxTicks": 10
},
{
"moveType": "Diagonal",
"expectedTicks": 8,
"maxTicks": 10
},
{
"moveType": "Diagonal",
"expectedTicks": 7,
"maxTicks": 9
},
{
"moveType": "Diagonal",
"expectedTicks": 9,
"maxTicks": 11
}
]
},
{
"scenarioId": "same-move-straight-traverse-chain",
"expectedTotalTicks": 70,
"maxTotalTicks": 84,
"segments": [
{
"moveType": "Traverse",
"expectedTicks": 6,
"maxTicks": 8
},
{
"moveType": "Traverse",
"expectedTicks": 6,
"maxTicks": 8
},
{
"moveType": "Traverse",
"expectedTicks": 6,
"maxTicks": 8
},
{
"moveType": "Traverse",
"expectedTicks": 5,
"maxTicks": 7
},
{
"moveType": "Traverse",
"expectedTicks": 6,
"maxTicks": 8
},
{
"moveType": "Traverse",
"expectedTicks": 6,
"maxTicks": 8
},
{
"moveType": "Traverse",
"expectedTicks": 5,
"maxTicks": 7
},
{
"moveType": "Traverse",
"expectedTicks": 6,
"maxTicks": 8
},
{
"moveType": "Traverse",
"expectedTicks": 5,
"maxTicks": 7
},
{
"moveType": "Traverse",
"expectedTicks": 6,
"maxTicks": 8
},
{
"moveType": "Traverse",
"expectedTicks": 6,
"maxTicks": 8
},
{
"moveType": "Traverse",
"expectedTicks": 7,
"maxTicks": 9
}
]
},
{
"scenarioId": "mixed-traverse-turn-parkour-turn-traverse",
"expectedTotalTicks": 46,
"maxTotalTicks": 56,
"segments": [
{
"moveType": "Traverse",
"expectedTicks": 8,
"maxTicks": 10
},
{
"moveType": "Diagonal",
"expectedTicks": 81,
"maxTicks": 98
},
{
"moveType": "Parkour",
"expectedTicks": 14,
"maxTicks": 17
},
{
"moveType": "Traverse",
"expectedTicks": 7,
"maxTicks": 9
},
{
"moveType": "Diagonal",
"expectedTicks": 8,
"maxTicks": 10
},
{
"moveType": "Diagonal",
"expectedTicks": 9,
"maxTicks": 11
},
{
"moveType": "Traverse",
"expectedTicks": 8,
"maxTicks": 10
}
]
}
]