authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-16 23:02:39-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-17 09:26:31-07:00
log86699acbb951ceed3ecdd3bd93a00ceb02028361
tree772b69fba09b04071a840ddfdedcdd3ed0da249b
parentb7d7446fbbfc35f291ffb641470233a7a9e18b9b

std.Io.Reader: update OneByteReader usage to std.testing.Reader


2 files changed, 11 insertions(+), 29 deletions(-)

lib/std/Io/Reader.zig+5-25
...@@ -1702,33 +1702,13 @@ fn failingDiscard(r: *Reader, limit: Limit) Error!usize {...@@ -1702,33 +1702,13 @@ fn failingDiscard(r: *Reader, limit: Limit) Error!usize {
1702}1702}
17031703
1704test "readAlloc when the backing reader provides one byte at a time" {1704test "readAlloc when the backing reader provides one byte at a time" {
1705 const OneByteReader = struct {
1706 str: []const u8,
1707 i: usize,
1708 reader: Reader,
1709
1710 fn stream(r: *Reader, w: *Writer, limit: Limit) StreamError!usize {
1711 assert(@intFromEnum(limit) >= 1);
1712 const self: *@This() = @fieldParentPtr("reader", r);
1713 if (self.str.len - self.i == 0) return error.EndOfStream;
1714 try w.writeByte(self.str[self.i]);
1715 self.i += 1;
1716 return 1;
1717 }
1718 };
1719 const str = "This is a test";1705 const str = "This is a test";
1720 var tiny_buffer: [1]u8 = undefined;1706 var tiny_buffer: [1]u8 = undefined;
1721 var one_byte_stream: OneByteReader = .{1707 var one_byte_stream: testing.Reader = .init(&tiny_buffer, &.{
1722 .str = str,1708 .{ .buffer = str },
1723 .i = 0,1709 });
1724 .reader = .{1710 one_byte_stream.artificial_limit = .limited(1);
1725 .buffer = &tiny_buffer,1711 const res = try one_byte_stream.interface.allocRemaining(std.testing.allocator, .unlimited);
1726 .vtable = &.{ .stream = OneByteReader.stream },
1727 .seek = 0,
1728 .end = 0,
1729 },
1730 };
1731 const res = try one_byte_stream.reader.allocRemaining(std.testing.allocator, .unlimited);
1732 defer std.testing.allocator.free(res);1712 defer std.testing.allocator.free(res);
1733 try std.testing.expectEqualStrings(str, res);1713 try std.testing.expectEqualStrings(str, res);
1734}1714}
lib/std/testing.zig+6-4
...@@ -1207,12 +1207,14 @@ pub inline fn fuzz(...@@ -1207,12 +1207,14 @@ pub inline fn fuzz(
1207 return @import("root").fuzz(context, testOne, options);1207 return @import("root").fuzz(context, testOne, options);
1208}1208}
12091209
1210/// A `std.io.Reader` that writes a predetermined list of buffers during `stream`.1210/// A `std.Io.Reader` that writes a predetermined list of buffers during `stream`.
1211pub const Reader = struct {1211pub const Reader = struct {
1212 calls: []const Call,1212 calls: []const Call,
1213 interface: std.io.Reader,1213 interface: std.Io.Reader,
1214 next_call_index: usize,1214 next_call_index: usize,
1215 next_offset: usize,1215 next_offset: usize,
1216 /// Further reduces how many bytes are written in each `stream` call.
1217 artificial_limit: std.Io.Limit = .unlimited,
12161218
1217 pub const Call = struct {1219 pub const Call = struct {
1218 buffer: []const u8,1220 buffer: []const u8,
...@@ -1232,11 +1234,11 @@ pub const Reader = struct {...@@ -1232,11 +1234,11 @@ pub const Reader = struct {
1232 };1234 };
1233 }1235 }
12341236
1235 fn stream(io_r: *std.io.Reader, w: *std.io.Writer, limit: std.io.Limit) std.io.Reader.StreamError!usize {1237 fn stream(io_r: *std.Io.Reader, w: *std.Io.Writer, limit: std.Io.Limit) std.Io.Reader.StreamError!usize {
1236 const r: *Reader = @alignCast(@fieldParentPtr("interface", io_r));1238 const r: *Reader = @alignCast(@fieldParentPtr("interface", io_r));
1237 if (r.calls.len - r.next_call_index == 0) return error.EndOfStream;1239 if (r.calls.len - r.next_call_index == 0) return error.EndOfStream;
1238 const call = r.calls[r.next_call_index];1240 const call = r.calls[r.next_call_index];
1239 const buffer = limit.sliceConst(call.buffer[r.next_offset..]);1241 const buffer = r.artificial_limit.sliceConst(limit.sliceConst(call.buffer[r.next_offset..]));
1240 const n = try w.write(buffer);1242 const n = try w.write(buffer);
1241 r.next_offset += n;1243 r.next_offset += n;
1242 if (call.buffer.len - r.next_offset == 0) {1244 if (call.buffer.len - r.next_offset == 0) {