diff --git a/build.zig b/build.zig index f8aa236..08f6bf5 100644 --- a/build.zig +++ b/build.zig @@ -4,12 +4,26 @@ pub fn build(b: *Builder) void { const target = b.standardTargetOptions(.{}); const mode = b.standardReleaseOptions(); - const scanner = b.addExecutable("scanner", "scanner.zig"); - scanner.setTarget(target); - scanner.setBuildMode(mode); + { + const scanner = b.addExecutable("scanner", "scanner.zig"); + scanner.setTarget(target); + scanner.setBuildMode(mode); - scanner.linkLibC(); - scanner.linkSystemLibrary("expat"); + scanner.linkLibC(); + scanner.linkSystemLibrary("expat"); - scanner.install(); + scanner.install(); + } + + { + const scanner_test = b.addTest("scanner.zig"); + scanner_test.setTarget(target); + scanner_test.setBuildMode(mode); + + scanner_test.linkLibC(); + scanner_test.linkSystemLibrary("expat"); + + const test_step = b.step("test", "Run the tests"); + test_step.dependOn(&scanner_test.step); + } } diff --git a/scanner.zig b/scanner.zig index bcdb1af..767692a 100644 --- a/scanner.zig +++ b/scanner.zig @@ -204,3 +204,33 @@ fn characterData(user_data: ?*c_void, s: ?[*]const u8, len: i32) callconv(.C) vo const ctx = @intToPtr(*Context, @ptrToInt(user_data)); ctx.character_data.appendSlice(s.?[0..@intCast(usize, len)]) catch std.os.exit(1); } + +test "parsing" { + const testing = std.testing; + + const parser = c.XML_ParserCreate(null) orelse return error.ParserCreateFailed; + defer c.XML_ParserFree(parser); + + var ctx = Context{ + .protocol = undefined, + .interface = undefined, + .message = undefined, + .enumeration = undefined, + }; + defer ctx.deinit(); + + c.XML_SetUserData(parser, &ctx); + c.XML_SetElementHandler(parser, start, end); + c.XML_SetCharacterDataHandler(parser, characterData); + + const sample = + \\ + \\ + \\ + ; + + if (c.XML_Parse(parser, sample, sample.len, 1) == .XML_STATUS_ERROR) + return error.ParserError; + + testing.expectEqualSlices(u8, ctx.protocol.name, "sample"); +}