diff --git a/.gitignore b/.gitignore index 5a45e20..287a318 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ zig-cache zig-out *.elf -*.dol \ No newline at end of file +*.dol +!testdata/*.elf \ No newline at end of file diff --git a/build.zig b/build.zig index 3d224e4..212747a 100644 --- a/build.zig +++ b/build.zig @@ -23,4 +23,16 @@ pub fn build(b: *std.Build) void { const run_step = b.step("run", "Run the app"); run_step.dependOn(&run_cmd.step); + + // Testing + const elf_unit_tests = b.addTest(.{ + .root_source_file = b.path("src/elf.zig"), + .target = target, + .optimize = optimize, + }); + + const run_elf_unit_tests = b.addRunArtifact(elf_unit_tests); + + const test_step = b.step("test", "Run unit tests"); + test_step.dependOn(&run_elf_unit_tests.step); } diff --git a/src/elf.zig b/src/elf.zig index 1b2fede..e3c16d8 100644 --- a/src/elf.zig +++ b/src/elf.zig @@ -255,3 +255,22 @@ fn checkELFHeader(header: ELFHeader) !void { return ELFError.NoEntrypoint; } } + +test "readELF: parses known .elf" { + const input = try std.fs.cwd().openFile("testdata/example.elf", .{}); + defer input.close(); + + const map = try readELF(input); + try std.testing.expectEqual(0x80003100, map.entryPoint); + try std.testing.expectEqual(1, map.textCount); + try std.testing.expectEqual(1, map.dataCount); + try std.testing.expectEqual(0x80003100, map.text[0].address); + try std.testing.expectEqual(0x2DD0, map.text[0].size); + try std.testing.expectEqual(0x3100, map.text[0].offset); + try std.testing.expectEqual(0x80005ed0, map.data[0].address); + try std.testing.expectEqual(0xD0, map.data[0].size); + try std.testing.expectEqual(0x5ed0, map.data[0].offset); + try std.testing.expectEqual(true, map.hasBSS); + try std.testing.expectEqual(0x80005fa0, map.bssAddress); + try std.testing.expectEqual(0x160, map.bssSize); +} diff --git a/testdata/example.elf b/testdata/example.elf new file mode 100644 index 0000000..cb4caf5 Binary files /dev/null and b/testdata/example.elf differ