const std = @import("std");

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

test "expect task 1 to result in 26 instances" {
    var input = [_]app.Display{
        .{
            .definitions = &.{
                "be", "cfbegad", "cbdgef", "fgaecd", "cgeb", "fdcge", "agebfd", "fecdb", "fabcd", "edb",
            },
            .digits = &.{
                "fdgacbe", "cefdb", "cefbgd", "gcbe",
            },
        },
        .{
            .definitions = &.{
                "edbfga", "begcd", "cbg", "gc", "gcadebf", "fbgde", "acbgfd", "abcde", "gfcbed", "gfec",
            },
            .digits = &.{
                "fcgedb", "cgb", "dgebacf", "gc",
            },
        },
        .{
            .definitions = &.{
                "fgaebd", "cg", "bdaec", "gdafb", "agbcfd", "gdcbef", "bgcad", "gfac", "gcb", "cdgabef",
            },
            .digits = &.{
                "cg", "cg", "fdcagb", "cbg",
            },
        },
        .{
            .definitions = &.{
                "fbegcd", "cbd", "adcefb", "dageb", "afcb", "bc", "aefdc", "ecdab", "fgdeca", "fcdbega",
            },
            .digits = &.{
                "efabcd", "cedba", "gadfec", "cb",
            },
        },
        .{
            .definitions = &.{
                "aecbfdg", "fbg", "gf", "bafeg", "dbefa", "fcge", "gcbea", "fcaegb", "dgceab", "fcbdga",
            },
            .digits = &.{
                "gecf", "egdcabf", "bgf", "bfgea",
            },
        },
        .{
            .definitions = &.{
                "fgeab", "ca", "afcebg", "bdacfeg", "cfaedg", "gcfdb", "baec", "bfadeg", "bafgc", "acf",
            },
            .digits = &.{
                "gebdcfa", "ecba", "ca", "fadegcb",
            },
        },
        .{
            .definitions = &.{
                "dbcfg", "fgd", "bdegcaf", "fgec", "aegbdf", "ecdfab", "fbedc", "dacgb", "gdcebf", "gf",
            },
            .digits = &.{
                "cefg", "dcbef", "fcge", "gbcadfe",
            },
        },
        .{
            .definitions = &.{
                "bdfegc", "cbegaf", "gecbf", "dfcage", "bdacg", "ed", "bedf", "ced", "adcbefg", "gebcd",
            },
            .digits = &.{
                "ed", "bcgafe", "cdgba", "cbgef",
            },
        },
        .{
            .definitions = &.{
                "egadfb", "cdbfeg", "cegd", "fecab", "cgb", "gbdefca", "cg", "fgcdab", "egfdb", "bfceg",
            },
            .digits = &.{
                "gbdfcae", "bgc", "cg", "cgb",
            },
        },
        .{
            .definitions = &.{
                "gcafb", "gcf", "dcaebfg", "ecagb", "gf", "abcdeg", "gaef", "cafbge", "fdbac", "fegbdc",
            },
            .digits = &.{
                "fgae", "cfgab", "fg", "bagce",
            },
        },
    };
    const expected: u32 = 26;

    std.testing.log_level = .debug;

    try std.testing.expect(app.task1(&input) == expected);
}

test "expect task 2 to result in 5353" {
    var input = [_]app.Display{
        .{
            .definitions = &.{
                "acedgfb", "cdfbe", "gcdfa", "fbcad", "dab", "cefabd", "cdfgeb", "eafb", "cagedb", "ab",
            },
            .digits = &.{
                "cdfeb", "fcadb", "cdfeb", "cdbaf",
            },
        },
    };
    const expected: u32 = 5353;

    std.testing.log_level = .debug;

    var result = try app.task2(std.testing.allocator, &input);
    try std.testing.expect(result[0] == expected);
    std.testing.allocator.free(result);
}

test "expect task 2 to result in correct solutions" {
    var input = [_]app.Display{
        .{
            .definitions = &.{
                "be", "cfbegad", "cbdgef", "fgaecd", "cgeb", "fdcge", "agebfd", "fecdb", "fabcd", "edb",
            },
            .digits = &.{
                "fdgacbe", "cefdb", "cefbgd", "gcbe",
            },
        },
        .{
            .definitions = &.{
                "edbfga", "begcd", "cbg", "gc", "gcadebf", "fbgde", "acbgfd", "abcde", "gfcbed", "gfec",
            },
            .digits = &.{
                "fcgedb", "cgb", "dgebacf", "gc",
            },
        },
        .{
            .definitions = &.{
                "fgaebd", "cg", "bdaec", "gdafb", "agbcfd", "gdcbef", "bgcad", "gfac", "gcb", "cdgabef",
            },
            .digits = &.{
                "cg", "cg", "fdcagb", "cbg",
            },
        },
        .{
            .definitions = &.{
                "fbegcd", "cbd", "adcefb", "dageb", "afcb", "bc", "aefdc", "ecdab", "fgdeca", "fcdbega",
            },
            .digits = &.{
                "efabcd", "cedba", "gadfec", "cb",
            },
        },
        .{
            .definitions = &.{
                "aecbfdg", "fbg", "gf", "bafeg", "dbefa", "fcge", "gcbea", "fcaegb", "dgceab", "fcbdga",
            },
            .digits = &.{
                "gecf", "egdcabf", "bgf", "bfgea",
            },
        },
        .{
            .definitions = &.{
                "fgeab", "ca", "afcebg", "bdacfeg", "cfaedg", "gcfdb", "baec", "bfadeg", "bafgc", "acf",
            },
            .digits = &.{
                "gebdcfa", "ecba", "ca", "fadegcb",
            },
        },
        .{
            .definitions = &.{
                "dbcfg", "fgd", "bdegcaf", "fgec", "aegbdf", "ecdfab", "fbedc", "dacgb", "gdcebf", "gf",
            },
            .digits = &.{
                "cefg", "dcbef", "fcge", "gbcadfe",
            },
        },
        .{
            .definitions = &.{
                "bdfegc", "cbegaf", "gecbf", "dfcage", "bdacg", "ed", "bedf", "ced", "adcbefg", "gebcd",
            },
            .digits = &.{
                "ed", "bcgafe", "cdgba", "cbgef",
            },
        },
        .{
            .definitions = &.{
                "egadfb", "cdbfeg", "cegd", "fecab", "cgb", "gbdefca", "cg", "fgcdab", "egfdb", "bfceg",
            },
            .digits = &.{
                "gbdfcae", "bgc", "cg", "cgb",
            },
        },
        .{
            .definitions = &.{
                "gcafb", "gcf", "dcaebfg", "ecagb", "gf", "abcdeg", "gaef", "cafbge", "fdbac", "fegbdc",
            },
            .digits = &.{
                "fgae", "cfgab", "fg", "bagce",
            },
        },
    };
    const expected = [_]u32{
        8394,
        9781,
        1197,
        9361,
        4873,
        8418,
        4548,
        1625,
        8717,
        4315,
    };

    std.testing.log_level = .debug;

    var result = try app.task2(std.testing.allocator, &input);
    for (expected) |_, i| {
        try std.testing.expect(result[i] == expected[i]);
    }
    std.testing.allocator.free(result);
}

test "expect task 2 to sum to 61229" {
    var input = [_]app.Display{
        .{
            .definitions = &.{
                "be", "cfbegad", "cbdgef", "fgaecd", "cgeb", "fdcge", "agebfd", "fecdb", "fabcd", "edb",
            },
            .digits = &.{
                "fdgacbe", "cefdb", "cefbgd", "gcbe",
            },
        },
        .{
            .definitions = &.{
                "edbfga", "begcd", "cbg", "gc", "gcadebf", "fbgde", "acbgfd", "abcde", "gfcbed", "gfec",
            },
            .digits = &.{
                "fcgedb", "cgb", "dgebacf", "gc",
            },
        },
        .{
            .definitions = &.{
                "fgaebd", "cg", "bdaec", "gdafb", "agbcfd", "gdcbef", "bgcad", "gfac", "gcb", "cdgabef",
            },
            .digits = &.{
                "cg", "cg", "fdcagb", "cbg",
            },
        },
        .{
            .definitions = &.{
                "fbegcd", "cbd", "adcefb", "dageb", "afcb", "bc", "aefdc", "ecdab", "fgdeca", "fcdbega",
            },
            .digits = &.{
                "efabcd", "cedba", "gadfec", "cb",
            },
        },
        .{
            .definitions = &.{
                "aecbfdg", "fbg", "gf", "bafeg", "dbefa", "fcge", "gcbea", "fcaegb", "dgceab", "fcbdga",
            },
            .digits = &.{
                "gecf", "egdcabf", "bgf", "bfgea",
            },
        },
        .{
            .definitions = &.{
                "fgeab", "ca", "afcebg", "bdacfeg", "cfaedg", "gcfdb", "baec", "bfadeg", "bafgc", "acf",
            },
            .digits = &.{
                "gebdcfa", "ecba", "ca", "fadegcb",
            },
        },
        .{
            .definitions = &.{
                "dbcfg", "fgd", "bdegcaf", "fgec", "aegbdf", "ecdfab", "fbedc", "dacgb", "gdcebf", "gf",
            },
            .digits = &.{
                "cefg", "dcbef", "fcge", "gbcadfe",
            },
        },
        .{
            .definitions = &.{
                "bdfegc", "cbegaf", "gecbf", "dfcage", "bdacg", "ed", "bedf", "ced", "adcbefg", "gebcd",
            },
            .digits = &.{
                "ed", "bcgafe", "cdgba", "cbgef",
            },
        },
        .{
            .definitions = &.{
                "egadfb", "cdbfeg", "cegd", "fecab", "cgb", "gbdefca", "cg", "fgcdab", "egfdb", "bfceg",
            },
            .digits = &.{
                "gbdfcae", "bgc", "cg", "cgb",
            },
        },
        .{
            .definitions = &.{
                "gcafb", "gcf", "dcaebfg", "ecagb", "gf", "abcdeg", "gaef", "cafbge", "fdbac", "fegbdc",
            },
            .digits = &.{
                "fgae", "cfgab", "fg", "bagce",
            },
        },
    };
    const expected: u32 = 61229;

    std.testing.log_level = .debug;

    var count: u32 = 0;
    var result = try app.task2(std.testing.allocator, &input);
    for (result) |r| {
        count += r;
    }
    std.testing.allocator.free(result);

    try std.testing.expect(count == expected);
}