Pathfinder library in zig
const std = @import("std");
const PF = @import("pathfinder.zig");

fn manhattan(a: [2]usize, b: [2]usize) !usize {
    const absx = @abs(@as(isize, @intCast(a[0])) - @as(isize, @intCast(b[0])));
    const absy = @abs(@as(isize, @intCast(a[1])) - @as(isize, @intCast(b[1])));
    return @as(usize, @intCast(absx + absy));
}

test "Dijkstra usize" {
    var grid = PF.Grid.Grid(usize, 100, 100){};
    try grid.parseGridFromCSV("grid-test.txt", ",");
    var ret = try grid.dijkstra(std.testing.allocator, .{ 0, 0 }, .{ 99, 99 }, PF.Grid.D2.HV);
    try std.testing.expectEqual(@as(usize, 366), ret);

    // right and down
    ret = try grid.dijkstra(std.testing.allocator, .{ 0, 0 }, .{ 99, 99 }, [2][2]isize{ .{ 0, 1 }, .{ 1, 0 } });
    try std.testing.expectEqual(@as(usize, 366), ret);

    // down and left => no path
    const err = grid.dijkstra(std.testing.allocator, .{ 0, 0 }, .{ 99, 99 }, [2][2]isize{ .{ 1, 0 }, .{ 1, 0 } });
    try std.testing.expectError(error.PathNotFound, err);
}

test "Dijkstra isize" {
    var grid = PF.Grid.Grid(isize, 100, 100){};
    try grid.parseGridFromCSV("grid-test.txt", ",");
    const ret = try grid.dijkstra(std.testing.allocator, .{ 0, 0 }, .{ 99, 99 }, PF.Grid.D2.diagonal);
    try std.testing.expectEqual(@as(isize, 257), ret);
}

test "Dijkstra float" {
    var grid = PF.Grid.Grid(f64, 100, 100){};
    try grid.parseGridFromCSV("grid-test.txt", ",");
    const ret = try grid.dijkstra(std.testing.allocator, .{ 0, 0 }, .{ 99, 99 }, PF.Grid.D2.all);
    try std.testing.expectEqual(@as(f64, 181), ret);
}

test "A* usize" {
    var grid = PF.Grid.Grid(usize, 100, 100){};
    try grid.parseGridFromCSV("grid-test.txt", ",");
    const ret = try grid.astar(std.testing.allocator, .{ 0, 0 }, .{ 99, 99 }, PF.Grid.D2.all, manhattan);
    try std.testing.expectEqual(@as(usize, 181), ret);
}