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 charToBinary to produce expected result" { const tests = .{ .{ '0', 0b0000 }, .{ '1', 0b0001 }, .{ '8', 0b1000 }, .{ '9', 0b1001 }, .{ 'A', 0b1010 }, .{ 'B', 0b1011 }, .{ 'E', 0b1110 }, .{ 'F', 0b1111 }, }; std.debug.print("\n", .{}); var ok = true; inline for (tests) |t| { std.debug.print("Expect: {}->{}..", .{ t[0], t[1] }); checkPrint((try app.charToBinary(t[0])) == t[1]); } try std.testing.expect(ok); } test "expect hexToBinaryArrayList to produce expected result" { const tests = .{ .{ "0123", @as(u16, 0b0000000100100011) }, .{ "ABCD", @as(u16, 0b1010101111001101) }, }; std.debug.print("\n", .{}); var ok = true; inline for (tests) |t| { var result = try app.hexToBinaryArrayList(std.testing.allocator, t[0][0..]); defer result.deinit(); std.debug.print("Expect: {s}->{}..", .{ t[0], t[1] }); var verified = true; for (result.items) |b, i| { if (b != (t[1] >> 15 - @intCast(u4, i)) & 0x1) { verified = false; ok = false; break; } } checkPrint(verified); } try std.testing.expect(ok); } test "expect readLiteralValue to produce expected result" { var input = std.ArrayList(u1).init(std.testing.allocator); defer input.deinit(); try input.appendSlice(&[_]u1{ 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, }); const expected: u32 = 2021; var version: u32 = 0; var result: u64 = 0; _ = try app.readLiteralValue(&input, &version, &result); try std.testing.expect(result == expected); } test "expect readOperatorPacket to produce expected result" { const tests = .{ .{ "38006F45291200", 0 }, .{ "EE00D40C823060", 0 }, }; std.debug.print("\n", .{}); var ok = true; inline for (tests) |t| { var input = try app.hexToBinaryArrayList(std.testing.allocator, t[0]); defer input.deinit(); var version: u32 = 0; var result: u64 = 0; std.debug.print("Expect: {s}->{}..", .{ t[0], t[1] }); _ = try app.readOperatorPacket(std.testing.allocator, &input, &version, &result); checkPrint(true); } try std.testing.expect(ok); } test "expect runPacketDecode to produce expected versions" { const tests = .{ .{ "8A004A801A8002F478", 16 }, .{ "620080001611562C8802118E34", 12 }, .{ "C0015000016115A2E0802F182340", 23 }, .{ "A0016C880162017C3686B18A3D4780", 31 }, }; std.debug.print("\n", .{}); var ok = true; inline for (tests) |t| { var input = try app.hexToBinaryArrayList(std.testing.allocator, t[0]); defer input.deinit(); std.debug.print("Expect: {s} -> v{}", .{ t[0], t[1] }); var version: u32 = 0; var result: u64 = 0; try app.runPacketDecode(std.testing.allocator, &input, &version, &result); checkPrint(version == t[1]); if (version != t[1]) { ok = false; } } try std.testing.expect(ok); } test "expect runPacketDecode to produce expected results" { const tests = .{ .{ "C200B40A82", 3 }, .{ "04005AC33890", 54 }, .{ "880086C3E88112", 7 }, .{ "CE00C43D881120", 9 }, .{ "D8005AC2A8F0", 1 }, .{ "F600BC2D8F", 0 }, .{ "9C005AC2F8F0", 0 }, .{ "9C0141080250320F1802104A08", 1 }, }; std.debug.print("\n", .{}); var ok = true; inline for (tests) |t| { var input = try app.hexToBinaryArrayList(std.testing.allocator, t[0]); defer input.deinit(); std.debug.print("Expect: {s} -> v{}", .{ t[0], t[1] }); var version: u32 = 0; var result: u64 = 0; try app.runPacketDecode(std.testing.allocator, &input, &version, &result); checkPrint(result == t[1]); if (result != t[1]) { ok = false; } } try std.testing.expect(ok); }