namespace WarehouseWoes.Tests; public class WideWarehouseMapTests { [Test] [MethodDataSource(nameof(CalculateTotalBoxGpsCoordinatesTestCases))] public async Task CalculateTotalBoxGpsCoordinates_WhenCalledWithExampleInput_ItShouldReturnExpectedValue(CalculateTotalBoxGpsCoordinatesTestCase testCase) { var map = WideWarehouseMap.From(testCase.MapInput); var result = map.CalculateTotalBoxGpsCoordinates(); await Assert.That(result).IsEqualTo(testCase.ExpectedValue); } public static IEnumerable> CalculateTotalBoxGpsCoordinatesTestCases() { yield return () => new( [ "####################", "##[].......[].[][]##", "##[]...........[].##", "##[]........[][][]##", "##[]......[]....[]##", "##..##......[]....##", "##..[]............##", "##..@......[].[][]##", "##......[][]..[]..##", "####################", ], 9021 ); } public record CalculateTotalBoxGpsCoordinatesTestCase(string[] MapInput, int ExpectedValue); [Test] [MethodDataSource(nameof(MoveTestCases))] public async Task Move_WhenCalled_ItShouldMoveValuesToExpectedPositions(MoveTestCase testCase) { var expected = WideWarehouseMap.From(testCase.ExpectedMap); var directions = testCase.Directions.Select(Direction.From).ToList(); var result = WideWarehouseMap.From(testCase.MapInput).MoveRobot(directions); await Assert.That(result.Positions).IsEquivalentTo(expected.Positions); } public static IEnumerable> MoveTestCases() { yield return () => new( [ "##############", "##......##..##", "##..........##", "##....[][]@.##", "##....[]....##", "##..........##", "##############", ], "<", [ "##############", "##......##..##", "##..........##", "##...[][]@..##", "##....[]....##", "##..........##", "##############", ] ); yield return () => new( [ "##############", "##......##..##", "##..........##", "##...[][]@..##", "##....[]....##", "##..........##", "##############", ], "v", [ "##############", "##......##..##", "##..........##", "##...[][]...##", "##....[].@..##", "##..........##", "##############", ] ); yield return () => new( [ "##############", "##......##..##", "##..........##", "##...[][]...##", "##....[].@..##", "##..........##", "##############", ], "v", [ "##############", "##......##..##", "##..........##", "##...[][]...##", "##....[]....##", "##.......@..##", "##############", ] ); yield return () => new( [ "##############", "##......##..##", "##..........##", "##...[][]...##", "##....[]....##", "##.......@..##", "##############", ], "<", [ "##############", "##......##..##", "##..........##", "##...[][]...##", "##....[]....##", "##......@...##", "##############", ] ); yield return () => new( [ "##############", "##......##..##", "##..........##", "##...[][]...##", "##....[]....##", "##......@...##", "##############", ], "<", [ "##############", "##......##..##", "##..........##", "##...[][]...##", "##....[]....##", "##.....@....##", "##############", ] ); yield return () => new( [ "##############", "##......##..##", "##..........##", "##...[][]...##", "##....[]....##", "##.....@....##", "##############", ], "^", [ "##############", "##......##..##", "##...[][]...##", "##....[]....##", "##.....@....##", "##..........##", "##############", ] ); yield return () => new( [ "##############", "##......##..##", "##...[][]...##", "##....[]....##", "##.....@....##", "##..........##", "##############", ], "^", [ "##############", "##......##..##", "##...[][]...##", "##....[]....##", "##.....@....##", "##..........##", "##############", ] ); yield return () => new( [ "##############", "##......##..##", "##...[][]...##", "##....[]....##", "##.....@....##", "##..........##", "##############", ], "<", [ "##############", "##......##..##", "##...[][]...##", "##....[]....##", "##....@.....##", "##..........##", "##############", ] ); yield return () => new( [ "##############", "##......##..##", "##...[][]...##", "##....[]....##", "##....@.....##", "##..........##", "##############", ], "<", [ "##############", "##......##..##", "##...[][]...##", "##....[]....##", "##...@......##", "##..........##", "##############", ] ); yield return () => new( [ "##############", "##......##..##", "##...[][]...##", "##....[]....##", "##...@......##", "##..........##", "##############", ], "^", [ "##############", "##......##..##", "##...[][]...##", "##...@[]....##", "##..........##", "##..........##", "##############", ] ); yield return () => new( [ "##############", "##......##..##", "##...[][]...##", "##...@[]....##", "##..........##", "##..........##", "##############", ], "^", [ "##############", "##...[].##..##", "##...@.[]...##", "##....[]....##", "##..........##", "##..........##", "##############", ] ); } public record MoveTestCase(string[] MapInput, string Directions, string[] ExpectedMap); }