| ... | ... | @@ -299,19 +299,18 @@ test "io.BufferedTee io.BufferedReader Block" { |
| 299 | 299 | } |
| 300 | 300 | |
| 301 | 301 | test "io.BufferedTee with zero lookahead" { |
| 302 | | // output is has same bytes as reader |
| 302 | // output has same bytes as consumer |
| 303 | 303 | const data = [_]u8{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } ** 12; |
| 304 | 304 | var in = io.fixedBufferStream(&data); |
| 305 | 305 | var out = std.ArrayList(u8).init(testing.allocator); |
| 306 | 306 | defer out.deinit(); |
| 307 | 307 | |
| 308 | | var lbr = bufferedTee(8, 0, in.reader(), out.writer()); |
| 308 | var bt = bufferedTee(8, 0, in.reader(), out.writer()); |
| 309 | 309 | |
| 310 | 310 | var buf: [16]u8 = undefined; |
| 311 | | |
| 312 | 311 | var read_len: usize = 0; |
| 313 | 312 | for (0..buf.len) |i| { |
| 314 | | const n = try lbr.read(buf[0..i]); |
| 313 | const n = try bt.read(buf[0..i]); |
| 315 | 314 | try testing.expectEqual(i, n); |
| 316 | 315 | read_len += i; |
| 317 | 316 | try testing.expectEqual(read_len, out.items.len); |
| ... | ... | @@ -319,72 +318,71 @@ test "io.BufferedTee with zero lookahead" { |
| 319 | 318 | } |
| 320 | 319 | |
| 321 | 320 | test "io.BufferedTee with lookahead" { |
| 322 | | // output is lookahead bytes behind reader |
| 321 | // output is lookahead bytes behind consumer |
| 323 | 322 | inline for (1..8) |lookahead| { |
| 324 | 323 | const data = [_]u8{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } ** 12; |
| 325 | 324 | var in = io.fixedBufferStream(&data); |
| 326 | 325 | var out = std.ArrayList(u8).init(testing.allocator); |
| 327 | 326 | defer out.deinit(); |
| 328 | 327 | |
| 329 | | var lbr = bufferedTee(8, lookahead, in.reader(), out.writer()); |
| 328 | var bt = bufferedTee(8, lookahead, in.reader(), out.writer()); |
| 330 | 329 | var buf: [16]u8 = undefined; |
| 331 | 330 | |
| 332 | 331 | var read_len: usize = 0; |
| 333 | 332 | for (1..buf.len) |i| { |
| 334 | | const n = try lbr.read(buf[0..i]); |
| 333 | const n = try bt.read(buf[0..i]); |
| 335 | 334 | try testing.expectEqual(i, n); |
| 336 | 335 | read_len += i; |
| 337 | 336 | const out_len = if (read_len < lookahead) 0 else read_len - lookahead; |
| 338 | 337 | try testing.expectEqual(out_len, out.items.len); |
| 339 | | // std.debug.print("{d} {d} {d}\n", .{ lookahead, read_len, out_len }); |
| 340 | 338 | } |
| 341 | 339 | try testing.expectEqual(read_len, out.items.len + lookahead); |
| 342 | | try lbr.flush(); |
| 340 | try bt.flush(); |
| 343 | 341 | try testing.expectEqual(read_len, out.items.len); |
| 344 | 342 | } |
| 345 | 343 | } |
| 346 | 344 | |
| 347 | 345 | test "io.BufferedTee internal state" { |
| 348 | | const data = [_]u8{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } ** 10; |
| 346 | const data = [_]u8{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } ** 2; |
| 349 | 347 | var in = io.fixedBufferStream(&data); |
| 350 | 348 | var out = std.ArrayList(u8).init(testing.allocator); |
| 351 | 349 | defer out.deinit(); |
| 352 | 350 | |
| 353 | | var lbr = bufferedTee(8, 4, in.reader(), out.writer()); |
| 351 | var bt = bufferedTee(8, 4, in.reader(), out.writer()); |
| 354 | 352 | |
| 355 | 353 | var buf: [16]u8 = undefined; |
| 356 | | var n = try lbr.read(buf[0..3]); |
| 354 | var n = try bt.read(buf[0..3]); |
| 357 | 355 | try testing.expectEqual(3, n); |
| 358 | 356 | try testing.expectEqualSlices(u8, data[0..3], buf[0..n]); |
| 359 | | try testing.expectEqual(8, lbr.tail); |
| 360 | | try testing.expectEqual(3, lbr.rp); |
| 357 | try testing.expectEqual(8, bt.tail); |
| 358 | try testing.expectEqual(3, bt.rp); |
| 361 | 359 | try testing.expectEqual(0, out.items.len); |
| 362 | 360 | |
| 363 | | n = try lbr.read(buf[0..6]); |
| 361 | n = try bt.read(buf[0..6]); |
| 364 | 362 | try testing.expectEqual(6, n); |
| 365 | 363 | try testing.expectEqualSlices(u8, data[3..9], buf[0..n]); |
| 366 | | try testing.expectEqual(8, lbr.tail); |
| 367 | | try testing.expectEqual(5, lbr.rp); |
| 368 | | try testing.expectEqualSlices(u8, data[4..12], &lbr.buf); |
| 364 | try testing.expectEqual(8, bt.tail); |
| 365 | try testing.expectEqual(5, bt.rp); |
| 366 | try testing.expectEqualSlices(u8, data[4..12], &bt.buf); |
| 369 | 367 | try testing.expectEqual(5, out.items.len); |
| 370 | 368 | |
| 371 | | n = try lbr.read(buf[0..9]); |
| 369 | n = try bt.read(buf[0..9]); |
| 372 | 370 | try testing.expectEqual(9, n); |
| 373 | 371 | try testing.expectEqualSlices(u8, data[9..18], buf[0..n]); |
| 374 | | try testing.expectEqual(8, lbr.tail); |
| 375 | | try testing.expectEqual(6, lbr.rp); |
| 376 | | try testing.expectEqualSlices(u8, data[12..20], &lbr.buf); |
| 372 | try testing.expectEqual(8, bt.tail); |
| 373 | try testing.expectEqual(6, bt.rp); |
| 374 | try testing.expectEqualSlices(u8, data[12..20], &bt.buf); |
| 377 | 375 | try testing.expectEqual(14, out.items.len); |
| 378 | 376 | |
| 379 | | try lbr.flush(); |
| 377 | try bt.flush(); |
| 380 | 378 | try testing.expectEqual(18, out.items.len); |
| 381 | 379 | |
| 382 | | lbr.putBack(4); |
| 383 | | n = try lbr.read(buf[0..4]); |
| 380 | bt.putBack(4); |
| 381 | n = try bt.read(buf[0..4]); |
| 384 | 382 | try testing.expectEqual(4, n); |
| 385 | 383 | try testing.expectEqualSlices(u8, data[14..18], buf[0..n]); |
| 386 | 384 | |
| 387 | 385 | try testing.expectEqual(18, out.items.len); |
| 388 | | try lbr.flush(); |
| 386 | try bt.flush(); |
| 389 | 387 | try testing.expectEqual(18, out.items.len); |
| 390 | 388 | } |