authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-25 18:47:33-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-26 21:00:58-07:00
log8523cbef0e0145a1f4de84f49044b8c9a8657108
tree7758461ad457121a94bc7e240855edf3afdd4630
parent58e60697e2930f4311ae9e744ae1c2877e0b69ed

std.compress.lzma: tests passing


2 files changed, 22 insertions(+), 4 deletions(-)

lib/std/compress/lzma.zig+12-1
...@@ -696,6 +696,7 @@ pub const Decompress = struct {...@@ -696,6 +696,7 @@ pub const Decompress = struct {
696 .vtable = &.{696 .vtable = &.{
697 .readVec = readVec,697 .readVec = readVec,
698 .stream = stream,698 .stream = stream,
699 .discard = discard,
699 },700 },
700 .seek = 0,701 .seek = 0,
701 .end = 0,702 .end = 0,
...@@ -746,12 +747,22 @@ pub const Decompress = struct {...@@ -746,12 +747,22 @@ pub const Decompress = struct {
746 return readIndirect(r);747 return readIndirect(r);
747 }748 }
748749
750 fn discard(r: *Reader, limit: std.Io.Limit) Reader.Error!usize {
751 const d: *Decompress = @alignCast(@fieldParentPtr("reader", r));
752 _ = d;
753 _ = limit;
754 @panic("TODO");
755 }
756
749 fn readIndirect(r: *Reader) Reader.Error!usize {757 fn readIndirect(r: *Reader) Reader.Error!usize {
750 const d: *Decompress = @alignCast(@fieldParentPtr("reader", r));758 const d: *Decompress = @alignCast(@fieldParentPtr("reader", r));
751 const gpa = d.gpa;759 const gpa = d.gpa;
752 var allocating = Writer.Allocating.initOwnedSlice(gpa, r.buffer);760 var allocating = Writer.Allocating.initOwnedSlice(gpa, r.buffer);
753 allocating.writer.end = r.end;761 allocating.writer.end = r.end;
754 defer r.end = allocating.writer.end;762 defer {
763 r.buffer = allocating.writer.buffer;
764 r.end = allocating.writer.end;
765 }
755 if (d.decode.state == math.maxInt(usize)) return error.EndOfStream;766 if (d.decode.state == math.maxInt(usize)) return error.EndOfStream;
756 d.decode.process(d.input, &allocating, &d.buffer, &d.range_decoder) catch |err| switch (err) {767 d.decode.process(d.input, &allocating, &d.buffer, &d.range_decoder) catch |err| switch (err) {
757 error.WriteFailed => {768 error.WriteFailed => {
lib/std/compress/lzma/test.zig+10-3
...@@ -18,7 +18,14 @@ fn testDecompressEqual(expected: []const u8, compressed: []const u8) !void {...@@ -18,7 +18,14 @@ fn testDecompressEqual(expected: []const u8, compressed: []const u8) !void {
18}18}
1919
20fn testDecompressError(expected: anyerror, compressed: []const u8) !void {20fn testDecompressError(expected: anyerror, compressed: []const u8) !void {
21 return std.testing.expectError(expected, testDecompress(compressed));21 const gpa = std.testing.allocator;
22 var stream: std.Io.Reader = .fixed(compressed);
23
24 var decompressor = try lzma.Decompress.initOptions(&stream, gpa, &.{}, .{}, std.math.maxInt(u32));
25 defer decompressor.deinit();
26
27 try std.testing.expectError(error.ReadFailed, decompressor.reader.allocRemaining(gpa, .unlimited));
28 try std.testing.expectEqual(expected, decompressor.err orelse return error.TestFailed);
22}29}
2330
24test "decompress empty world" {31test "decompress empty world" {
...@@ -76,14 +83,14 @@ test "known size with end of payload marker" {...@@ -76,14 +83,14 @@ test "known size with end of payload marker" {
7683
77test "too big uncompressed size in header" {84test "too big uncompressed size in header" {
78 try testDecompressError(85 try testDecompressError(
79 error.CorruptInput,86 error.DecompressedSizeMismatch,
80 @embedFile("testdata/bad-too_big_size-with_eopm.lzma"),87 @embedFile("testdata/bad-too_big_size-with_eopm.lzma"),
81 );88 );
82}89}
8390
84test "too small uncompressed size in header" {91test "too small uncompressed size in header" {
85 try testDecompressError(92 try testDecompressError(
86 error.CorruptInput,93 error.DecompressedSizeMismatch,
87 @embedFile("testdata/bad-too_small_size-without_eopm-3.lzma"),94 @embedFile("testdata/bad-too_small_size-without_eopm-3.lzma"),
88 );95 );
89}96}