From c416992e11dc37d3f8ec7d27e605526bb6b04cd2 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Mon, 25 Aug 2025 01:50:55 -0700 Subject: [PATCH] add tests from yaml-test-suite --- build.zig | 4 + licenses.txt | 13 ++ test.zig | 370 ++++++++++++++++++++++++++++++++++++++++++++++++++- yaml.zig | 60 +++++---- zigmod.yml | 5 + 5 files changed, 426 insertions(+), 26 deletions(-) diff --git a/build.zig b/build.zig index 629f32099d91efb146e1f88465f3060f00f2f4cc..886757098a08997338526600f3d375e0df2d9d28 100644 --- a/build.zig +++ b/build.zig @@ -15,6 +15,10 @@ pub fn build(b: *std.Build) void { tests.use_llvm = !disable_llvm; tests.use_lld = !disable_llvm; + const build_options = b.addOptions(); + build_options.addOption([:0]const u8, "yamltestsuite_root", deps.dirs._hi7zwl8ps6jd); + tests.root_module.addImport("build_options", build_options.createModule()); + const test_step = b.step("test", "Run all library tests"); const tests_run = b.addRunArtifact(tests); tests_run.has_side_effects = true; diff --git a/licenses.txt b/licenses.txt index 6edb1aa39ea830d6bc4bfecad3e793a0ce495c1e..238700e2a9fee3cdb4254176dbdb2868fffaedc9 100644 --- a/licenses.txt +++ b/licenses.txt @@ -1,6 +1,19 @@ MIT: = https://spdx.org/licenses/MIT - This +- git https://github.com/nektro/zig-errno - git https://github.com/nektro/zig-expect - git https://github.com/nektro/zig-extras +- git https://github.com/nektro/zig-libc +- git https://github.com/nektro/zig-sys-libc +- git https://github.com/nektro/zig-time - git https://github.com/yaml/libyaml +- git https://github.com/yaml/yaml-test-suite + +MPL-2.0: += https://spdx.org/licenses/MPL-2.0 +- git https://github.com/nektro/zig-nfs +- git https://github.com/nektro/zig-nio + +Unspecified: +- system_lib c diff --git a/test.zig b/test.zig index 70819b5616793be6465ad6036ff380663ef5cce3..adbe9046033ce502cad9a5849aefaf4d986e5904 100644 --- a/test.zig +++ b/test.zig @@ -1,12 +1,376 @@ const std = @import("std"); const yaml = @import("yaml"); const expect = @import("expect").expect; - -const file = @embedFile("./zigmod.yml"); +const nfs = @import("nfs"); +const build_options = @import("build_options"); +const yamltestsuite_root = build_options.yamltestsuite_root; test { - const doc = try yaml.parse(std.testing.allocator, file); + const doc = try yaml.parse(std.testing.allocator, @embedFile("./zigmod.yml")); defer doc.deinit(std.testing.allocator); try expect(doc.mapping.get_string("id").?).toEqualString("g982zq6e8wsvnmduerpbf8787hu85brugmngn8wf"); } + +fn parseTest(comptime basename: [:0]const u8) !void { + const alloc = std.testing.allocator; + const file = try nfs.cwd().openFile(yamltestsuite_root ++ "/src/" ++ basename, .{}); + defer file.close(); + const input = try file.readToEndAlloc(alloc, 1024 * 1024, null); + defer alloc.free(input); + const doc = try yaml.parse(alloc, input); + defer doc.deinit(alloc); +} + +// zig fmt: off +test { try parseTest("229Q.yaml"); } +test { try parseTest("236B.yaml"); } +test { try parseTest("26DV.yaml"); } +test { try parseTest("27NA.yaml"); } +// test { try parseTest("2AUY.yaml"); } +test { try parseTest("2CMS.yaml"); } +test { try parseTest("2EBW.yaml"); } +test { try parseTest("2G84.yaml"); } +test { try parseTest("2JQS.yaml"); } +test { try parseTest("2LFX.yaml"); } +test { try parseTest("2SXE.yaml"); } +test { try parseTest("2XXW.yaml"); } +test { try parseTest("33X3.yaml"); } +test { try parseTest("35KP.yaml"); } +test { try parseTest("36F6.yaml"); } +test { try parseTest("3ALJ.yaml"); } +test { try parseTest("3GZX.yaml"); } +test { try parseTest("3HFZ.yaml"); } +test { try parseTest("3MYT.yaml"); } +test { try parseTest("3R3P.yaml"); } +test { try parseTest("3RLN.yaml"); } +test { try parseTest("3UYS.yaml"); } +test { try parseTest("4ABK.yaml"); } +test { try parseTest("4CQQ.yaml"); } +test { try parseTest("4EJS.yaml"); } +test { try parseTest("4FJ6.yaml"); } +test { try parseTest("4GC6.yaml"); } +test { try parseTest("4H7K.yaml"); } +test { try parseTest("4HVU.yaml"); } +test { try parseTest("4JVG.yaml"); } +test { try parseTest("4MUZ.yaml"); } +test { try parseTest("4Q9F.yaml"); } +test { try parseTest("4QFQ.yaml"); } +// test { try parseTest("4RWC.yaml"); } +test { try parseTest("4UYU.yaml"); } +test { try parseTest("4V8U.yaml"); } +test { try parseTest("4WA9.yaml"); } +test { try parseTest("4ZYM.yaml"); } +test { try parseTest("52DL.yaml"); } +test { try parseTest("54T7.yaml"); } +test { try parseTest("55WF.yaml"); } +test { try parseTest("565N.yaml"); } +test { try parseTest("57H4.yaml"); } +test { try parseTest("58MP.yaml"); } +test { try parseTest("5BVJ.yaml"); } +test { try parseTest("5C5M.yaml"); } +test { try parseTest("5GBF.yaml"); } +test { try parseTest("5KJE.yaml"); } +test { try parseTest("5LLU.yaml"); } +test { try parseTest("5MUD.yaml"); } +test { try parseTest("5NYZ.yaml"); } +test { try parseTest("5T43.yaml"); } +test { try parseTest("5TRB.yaml"); } +test { try parseTest("5TYM.yaml"); } +test { try parseTest("5U3A.yaml"); } +test { try parseTest("5WE3.yaml"); } +test { try parseTest("62EZ.yaml"); } +test { try parseTest("652Z.yaml"); } +test { try parseTest("65WH.yaml"); } +test { try parseTest("6BCT.yaml"); } +test { try parseTest("6BFJ.yaml"); } +test { try parseTest("6CA3.yaml"); } +test { try parseTest("6CK3.yaml"); } +test { try parseTest("6FWR.yaml"); } +test { try parseTest("6H3V.yaml"); } +// test { try parseTest("6HB6.yaml"); } +test { try parseTest("6JQW.yaml"); } +test { try parseTest("6JTT.yaml"); } +test { try parseTest("6JWB.yaml"); } +test { try parseTest("6KGN.yaml"); } +test { try parseTest("6LVF.yaml"); } +test { try parseTest("6M2F.yaml"); } +test { try parseTest("6PBE.yaml"); } +test { try parseTest("6S55.yaml"); } +test { try parseTest("6SLA.yaml"); } +test { try parseTest("6VJK.yaml"); } +test { try parseTest("6WLZ.yaml"); } +test { try parseTest("6WPF.yaml"); } +test { try parseTest("6XDY.yaml"); } +test { try parseTest("6ZKB.yaml"); } +test { try parseTest("735Y.yaml"); } +test { try parseTest("74H7.yaml"); } +test { try parseTest("753E.yaml"); } +test { try parseTest("7A4E.yaml"); } +test { try parseTest("7BMT.yaml"); } +test { try parseTest("7BUB.yaml"); } +test { try parseTest("7FWL.yaml"); } +test { try parseTest("7LBH.yaml"); } +test { try parseTest("7MNF.yaml"); } +test { try parseTest("7T8X.yaml"); } +test { try parseTest("7TMG.yaml"); } +test { try parseTest("7W2P.yaml"); } +test { try parseTest("7Z25.yaml"); } +test { try parseTest("7ZZ5.yaml"); } +test { try parseTest("82AN.yaml"); } +test { try parseTest("87E4.yaml"); } +test { try parseTest("8CWC.yaml"); } +// test { try parseTest("8G76.yaml"); } +test { try parseTest("8KB6.yaml"); } +test { try parseTest("8MK2.yaml"); } +test { try parseTest("8QBE.yaml"); } +test { try parseTest("8UDB.yaml"); } +test { try parseTest("8XDJ.yaml"); } +test { try parseTest("8XYN.yaml"); } +// test { try parseTest("93JH.yaml"); } +test { try parseTest("93WF.yaml"); } +test { try parseTest("96L6.yaml"); } +test { try parseTest("96NN.yaml"); } +test { try parseTest("98YD.yaml"); } +test { try parseTest("9BXH.yaml"); } +test { try parseTest("9C9N.yaml"); } +test { try parseTest("9CWY.yaml"); } +test { try parseTest("9DXL.yaml"); } +test { try parseTest("9FMG.yaml"); } +test { try parseTest("9HCY.yaml"); } +test { try parseTest("9J7A.yaml"); } +test { try parseTest("9JBA.yaml"); } +test { try parseTest("9KAX.yaml"); } +test { try parseTest("9KBC.yaml"); } +test { try parseTest("9MAG.yaml"); } +test { try parseTest("9MMA.yaml"); } +test { try parseTest("9MMW.yaml"); } +test { try parseTest("9MQT.yaml"); } +test { try parseTest("9SA2.yaml"); } +test { try parseTest("9SHH.yaml"); } +test { try parseTest("9TFX.yaml"); } +test { try parseTest("9U5K.yaml"); } +test { try parseTest("9WXW.yaml"); } +test { try parseTest("9YRD.yaml"); } +test { try parseTest("A2M4.yaml"); } +test { try parseTest("A6F9.yaml"); } +test { try parseTest("A984.yaml"); } +test { try parseTest("AB8U.yaml"); } +test { try parseTest("AVM7.yaml"); } +test { try parseTest("AZ63.yaml"); } +test { try parseTest("AZW3.yaml"); } +test { try parseTest("B3HG.yaml"); } +test { try parseTest("B63P.yaml"); } +test { try parseTest("BD7L.yaml"); } +test { try parseTest("BEC7.yaml"); } +test { try parseTest("BF9H.yaml"); } +test { try parseTest("BS4K.yaml"); } +test { try parseTest("BU8L.yaml"); } +test { try parseTest("C2DT.yaml"); } +test { try parseTest("C2SP.yaml"); } +test { try parseTest("C4HZ.yaml"); } +test { try parseTest("CC74.yaml"); } +test { try parseTest("CFD4.yaml"); } +test { try parseTest("CML9.yaml"); } +test { try parseTest("CN3R.yaml"); } +test { try parseTest("CPZ3.yaml"); } +test { try parseTest("CQ3W.yaml"); } +test { try parseTest("CT4Q.yaml"); } +test { try parseTest("CTN5.yaml"); } +test { try parseTest("CUP7.yaml"); } +test { try parseTest("CVW2.yaml"); } +test { try parseTest("CXX2.yaml"); } +test { try parseTest("D49Q.yaml"); } +test { try parseTest("D83L.yaml"); } +test { try parseTest("D88J.yaml"); } +test { try parseTest("D9TU.yaml"); } +test { try parseTest("DBG4.yaml"); } +test { try parseTest("DC7X.yaml"); } +test { try parseTest("DE56.yaml"); } +test { try parseTest("DFF7.yaml"); } +test { try parseTest("DHP8.yaml"); } +test { try parseTest("DK3J.yaml"); } +test { try parseTest("DK4H.yaml"); } +// test { try parseTest("DK95.yaml"); } +test { try parseTest("DMG6.yaml"); } +test { try parseTest("DWX9.yaml"); } +test { try parseTest("E76Z.yaml"); } +test { try parseTest("EB22.yaml"); } +test { try parseTest("EHF6.yaml"); } +test { try parseTest("EW3V.yaml"); } +test { try parseTest("EX5H.yaml"); } +test { try parseTest("EXG3.yaml"); } +// test { try parseTest("F2C7.yaml"); } +test { try parseTest("F3CP.yaml"); } +test { try parseTest("F6MC.yaml"); } +// test { try parseTest("F8F9.yaml"); } +test { try parseTest("FBC9.yaml"); } +test { try parseTest("FH7J.yaml"); } +test { try parseTest("FP8R.yaml"); } +test { try parseTest("FQ7F.yaml"); } +test { try parseTest("FRK4.yaml"); } +test { try parseTest("FTA2.yaml"); } +test { try parseTest("FUP4.yaml"); } +test { try parseTest("G4RS.yaml"); } +test { try parseTest("G5U8.yaml"); } +test { try parseTest("G7JE.yaml"); } +test { try parseTest("G992.yaml"); } +test { try parseTest("G9HC.yaml"); } +test { try parseTest("GDY7.yaml"); } +test { try parseTest("GH63.yaml"); } +test { try parseTest("GT5M.yaml"); } +test { try parseTest("H2RW.yaml"); } +test { try parseTest("H3Z8.yaml"); } +test { try parseTest("H7J7.yaml"); } +test { try parseTest("H7TQ.yaml"); } +test { try parseTest("HM87.yaml"); } +test { try parseTest("HMK4.yaml"); } +test { try parseTest("HMQ5.yaml"); } +test { try parseTest("HRE5.yaml"); } +test { try parseTest("HS5T.yaml"); } +test { try parseTest("HU3P.yaml"); } +test { try parseTest("HWV9.yaml"); } +test { try parseTest("J3BT.yaml"); } +test { try parseTest("J5UC.yaml"); } +test { try parseTest("J7PZ.yaml"); } +test { try parseTest("J7VC.yaml"); } +test { try parseTest("J9HZ.yaml"); } +test { try parseTest("JEF9.yaml"); } +test { try parseTest("JHB9.yaml"); } +test { try parseTest("JKF3.yaml"); } +test { try parseTest("JQ4R.yaml"); } +test { try parseTest("JR7V.yaml"); } +test { try parseTest("JS2J.yaml"); } +test { try parseTest("JTV5.yaml"); } +test { try parseTest("JY7Z.yaml"); } +test { try parseTest("K3WX.yaml"); } +test { try parseTest("K4SU.yaml"); } +test { try parseTest("K527.yaml"); } +test { try parseTest("K54U.yaml"); } +test { try parseTest("K858.yaml"); } +test { try parseTest("KH5V.yaml"); } +test { try parseTest("KK5P.yaml"); } +test { try parseTest("KMK3.yaml"); } +test { try parseTest("KS4U.yaml"); } +test { try parseTest("KSS4.yaml"); } +test { try parseTest("L24T.yaml"); } +test { try parseTest("L383.yaml"); } +test { try parseTest("L94M.yaml"); } +test { try parseTest("L9U5.yaml"); } +test { try parseTest("LE5A.yaml"); } +test { try parseTest("LHL4.yaml"); } +test { try parseTest("LP6E.yaml"); } +test { try parseTest("LQZ7.yaml"); } +test { try parseTest("LX3P.yaml"); } +test { try parseTest("M29M.yaml"); } +test { try parseTest("M2N8.yaml"); } +test { try parseTest("M5C3.yaml"); } +test { try parseTest("M5DY.yaml"); } +test { try parseTest("M6YH.yaml"); } +test { try parseTest("M7A3.yaml"); } +test { try parseTest("M7NX.yaml"); } +test { try parseTest("M9B4.yaml"); } +test { try parseTest("MJS9.yaml"); } +test { try parseTest("MUS6.yaml"); } +test { try parseTest("MXS3.yaml"); } +test { try parseTest("MYW6.yaml"); } +test { try parseTest("MZX3.yaml"); } +test { try parseTest("N4JP.yaml"); } +test { try parseTest("N782.yaml"); } +test { try parseTest("NAT4.yaml"); } +test { try parseTest("NB6Z.yaml"); } +test { try parseTest("NHX8.yaml"); } +test { try parseTest("NJ66.yaml"); } +test { try parseTest("NKF9.yaml"); } +test { try parseTest("NP9H.yaml"); } +test { try parseTest("P2AD.yaml"); } +test { try parseTest("P2EQ.yaml"); } +test { try parseTest("P76L.yaml"); } +test { try parseTest("P94K.yaml"); } +test { try parseTest("PBJ2.yaml"); } +test { try parseTest("PRH3.yaml"); } +test { try parseTest("PUW8.yaml"); } +test { try parseTest("PW8X.yaml"); } +test { try parseTest("Q4CL.yaml"); } +test { try parseTest("Q5MG.yaml"); } +test { try parseTest("Q88A.yaml"); } +test { try parseTest("Q8AD.yaml"); } +test { try parseTest("Q9WF.yaml"); } +test { try parseTest("QB6E.yaml"); } +test { try parseTest("QF4Y.yaml"); } +test { try parseTest("QLJ7.yaml"); } +test { try parseTest("QT73.yaml"); } +test { try parseTest("R4YG.yaml"); } +test { try parseTest("R52L.yaml"); } +test { try parseTest("RHX7.yaml"); } +test { try parseTest("RLU9.yaml"); } +test { try parseTest("RR7F.yaml"); } +test { try parseTest("RTP8.yaml"); } +test { try parseTest("RXY3.yaml"); } +test { try parseTest("RZP5.yaml"); } +test { try parseTest("RZT7.yaml"); } +test { try parseTest("S3PD.yaml"); } +test { try parseTest("S4GJ.yaml"); } +test { try parseTest("S4JQ.yaml"); } +test { try parseTest("S4T7.yaml"); } +test { try parseTest("S7BG.yaml"); } +test { try parseTest("S98Z.yaml"); } +test { try parseTest("S9E8.yaml"); } +test { try parseTest("SBG9.yaml"); } +test { try parseTest("SF5V.yaml"); } +test { try parseTest("SKE5.yaml"); } +test { try parseTest("SM9W.yaml"); } +test { try parseTest("SR86.yaml"); } +test { try parseTest("SSW6.yaml"); } +test { try parseTest("SU5Z.yaml"); } +test { try parseTest("SU74.yaml"); } +test { try parseTest("SY6V.yaml"); } +test { try parseTest("SYW4.yaml"); } +test { try parseTest("T26H.yaml"); } +test { try parseTest("T4YY.yaml"); } +test { try parseTest("T5N4.yaml"); } +test { try parseTest("T833.yaml"); } +test { try parseTest("TD5N.yaml"); } +test { try parseTest("TE2A.yaml"); } +test { try parseTest("TL85.yaml"); } +test { try parseTest("TS54.yaml"); } +test { try parseTest("U3C3.yaml"); } +test { try parseTest("U3XV.yaml"); } +test { try parseTest("U44R.yaml"); } +test { try parseTest("U99R.yaml"); } +test { try parseTest("U9NS.yaml"); } +test { try parseTest("UDM2.yaml"); } +test { try parseTest("UDR7.yaml"); } +test { try parseTest("UGM3.yaml"); } +test { try parseTest("UKK6.yaml"); } +test { try parseTest("UT92.yaml"); } +test { try parseTest("UV7Q.yaml"); } +test { try parseTest("V55R.yaml"); } +test { try parseTest("V9D5.yaml"); } +test { try parseTest("VJP3.yaml"); } +test { try parseTest("W42U.yaml"); } +test { try parseTest("W4TN.yaml"); } +test { try parseTest("W5VH.yaml"); } +test { try parseTest("W9L4.yaml"); } +test { try parseTest("WZ62.yaml"); } +test { try parseTest("X38W.yaml"); } +test { try parseTest("X4QW.yaml"); } +test { try parseTest("X8DW.yaml"); } +test { try parseTest("XLQ9.yaml"); } +test { try parseTest("XV9V.yaml"); } +test { try parseTest("XW4D.yaml"); } +test { try parseTest("Y2GN.yaml"); } +test { try parseTest("Y79Y.yaml"); } +test { try parseTest("YD5X.yaml"); } +test { try parseTest("YJV2.yaml"); } +test { try parseTest("Z67P.yaml"); } +test { try parseTest("Z9M4.yaml"); } +test { try parseTest("ZCZ6.yaml"); } +test { try parseTest("ZF4X.yaml"); } +test { try parseTest("ZH7C.yaml"); } +test { try parseTest("ZK9H.yaml"); } +test { try parseTest("ZL4Z.yaml"); } +test { try parseTest("ZVH3.yaml"); } +test { try parseTest("ZWK4.yaml"); } +test { try parseTest("ZXT5.yaml"); } +// test { try parseTest("ZYU8.yaml"); } diff --git a/yaml.zig b/yaml.zig index 08f1f29ba588921c681e5fe6f249bf87074e137c..2c5b339651db544b584a2b6402987898d92b690d 100644 --- a/yaml.zig +++ b/yaml.zig @@ -18,11 +18,18 @@ pub const Stream = struct { } }; -pub const Document = struct { +pub const Document = union(enum) { mapping: Mapping, + sequence: Sequence, pub fn deinit(self: *const Document, alloc: std.mem.Allocator) void { - self.mapping.deinit(alloc); + switch (self.*) { + .mapping => |m| m.deinit(alloc), + .sequence => |s| { + for (s) |*item| item.deinit(alloc); + alloc.free(s); + }, + } } }; @@ -43,9 +50,7 @@ pub const Item = union(enum) { for (s) |*item| item.deinit(alloc); alloc.free(s); }, - .string => |s| { - _ = s; - }, + .string => |s| alloc.free(s), .stream => |s| s.deinit(alloc), } } @@ -87,7 +92,7 @@ pub const Key = struct { value: Value, pub fn deinit(self: *const Key, alloc: std.mem.Allocator) void { - // alloc.free(self.key); + alloc.free(self.key); self.value.deinit(alloc); } }; @@ -99,10 +104,7 @@ pub const Value = union(enum) { pub fn deinit(self: *const Value, alloc: std.mem.Allocator) void { switch (self.*) { - .string => |s| { - _ = s; - // alloc.free(s); - }, + .string => |s| alloc.free(s), .mapping => |*m| { m.deinit(alloc); }, @@ -297,17 +299,28 @@ fn parse_stream(p: *Parser) Error!Stream { } fn parse_document(p: *Parser) Error!Document { - var tok = try p.next(); - if (tok.type != c.YAML_MAPPING_START_EVENT) { - return error.YamlUnexpectedToken; + const tok = try p.next(); + switch (tok.type) { + c.YAML_MAPPING_START_EVENT => { + const item = try parse_item(p, tok); + const tok2 = try p.next(); + if (tok2.type != c.YAML_DOCUMENT_END_EVENT) { + return error.YamlUnexpectedToken; + } + return Document{ .mapping = item.mapping }; + }, + c.YAML_SEQUENCE_START_EVENT => { + const item = try parse_item(p, tok); + const tok2 = try p.next(); + if (tok2.type != c.YAML_DOCUMENT_END_EVENT) { + return error.YamlUnexpectedToken; + } + return Document{ .sequence = item.sequence }; + }, + else => { + return error.YamlUnexpectedToken; + }, } - const item = try parse_item(p, tok); - - tok = try p.next(); - if (tok.type != c.YAML_DOCUMENT_END_EVENT) { - return error.YamlUnexpectedToken; - } - return Document{ .mapping = item.mapping }; } fn parse_mapping(p: *Parser) Error!Mapping { @@ -374,9 +387,10 @@ fn get_event_string(event: Token, p: *const Parser) !string { } } const s = lines[sm.line][sm.column..em.column]; - if (s.len < 2) return s; - if (s[0] == '"' and s[s.len - 1] == '"') return std.mem.trim(u8, s, "\""); - return s; + if (s.len < 2) return try p.alloc.dupe(u8, s); + if (s[0] == '"' and s[s.len - 1] == '"') return try p.alloc.dupe(u8, std.mem.trim(u8, s, "\"")); + if (s[0] == '\'' and s[s.len - 1] == '\'') return try p.alloc.dupe(u8, std.mem.trim(u8, s, "'")); + return try p.alloc.dupe(u8, s); } // diff --git a/zigmod.yml b/zigmod.yml index 99f39ec77cf268d2d064dfe895b83f096f9bbd45..6db7bf254eef69e464b9c45874cc4034c3e4cdde 100644 --- a/zigmod.yml +++ b/zigmod.yml @@ -29,3 +29,8 @@ dependencies: root_dependencies: - src: git https://github.com/nektro/zig-expect + - src: git https://github.com/nektro/zig-nfs + - src: git https://github.com/yaml/yaml-test-suite commit-ccfa74e56afb53da960847ff6e6976c0a0825709 + id: hi7zwl8ps6jdi4noam1ilxj1mp792qxf87u5tjlo4fz5p4ks + license: MIT + keep: true -- 2.54.0