const std = @import("std");
const builtin = @import("builtin");

const app = @import("./main.zig");

inline fn checkPrint(ok: bool) void {
    if (ok) {
        std.debug.print(" ✅\n", .{});
    } else {
        std.debug.print(" ❌\n", .{});
    }
}

test "setup" {
    if (builtin.os.tag == .windows) {
        // NOTE: Make windows use UTF-8 for output.
        _ = std.os.windows.kernel32.SetConsoleOutputCP(65001);
    }
}

test "expect task 1 to result in 45" {
    const tests = .{
        .{
            \\target area: x=20..30, y=-10..-5
            \\
            ,
            45,
        },
    };

    std.debug.print("\n", .{});
    var ok = true;
    inline for (tests) |t| {
        var stream = std.io.fixedBufferStream(t[0]);
        var input = try app.readInput(std.testing.allocator, stream.reader());

        const result = app.task1(input);
        std.debug.print("Expect: {}, got {}", .{ t[1], result });
        checkPrint(result == t[1]);
        if (result != t[1]) {
            ok = false;
        }
    }
    try std.testing.expect(ok);
}

test "expect task 2 to result in 112" {
    const tests = .{
        .{
            \\target area: x=20..30, y=-10..-5
            \\
            ,
            112,
        },
    };

    std.debug.print("\n", .{});
    var ok = true;
    inline for (tests) |t| {
        var stream = std.io.fixedBufferStream(t[0]);
        var input = try app.readInput(std.testing.allocator, stream.reader());

        const result = app.task2(input);
        std.debug.print("Expect: {}, got {}", .{ t[1], result });
        checkPrint(result == t[1]);
        if (result != t[1]) {
            ok = false;
        }
    }
    try std.testing.expect(ok);
}