From ebc59703292fd216d7ec1e027e0f3b78387a8ddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20du=20Garreau?= Date: Mon, 12 Jun 2023 18:17:48 +0200 Subject: [PATCH] Add tests and comments about `read_to_string` and `read_line` specializations --- library/std/src/io/mod.rs | 6 ++++++ library/std/src/io/tests.rs | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/library/std/src/io/mod.rs b/library/std/src/io/mod.rs index 3617b956e806..244512e2780c 100644 --- a/library/std/src/io/mod.rs +++ b/library/std/src/io/mod.rs @@ -2405,6 +2405,9 @@ impl Read for Chain { Ok(read) } + // We don't override `read_to_string` here because an UTF-8 sequence could + // be split between the two parts of the chain + fn read_buf(&mut self, mut buf: BorrowedCursor<'_>) -> Result<()> { if buf.capacity() == 0 { return Ok(()); @@ -2454,6 +2457,9 @@ impl BufRead for Chain { read += self.second.read_until(byte, buf)?; Ok(read) } + + // We don't override `read_line` here because an UTF-8 sequence could be + // split between the two parts of the chain } impl SizeHint for Chain { diff --git a/library/std/src/io/tests.rs b/library/std/src/io/tests.rs index f4a886d889a9..4a205f30d44b 100644 --- a/library/std/src/io/tests.rs +++ b/library/std/src/io/tests.rs @@ -231,6 +231,17 @@ fn chain_bufread() { cmp_bufread(chain1, chain2, &testdata[..]); } +#[test] +fn chain_splitted_char() { + let chain = b"\xc3".chain(b"\xa9".as_slice()); + assert_eq!(crate::io::read_to_string(chain).unwrap(), "é"); + + let mut chain = b"\xc3".chain(b"\xa9\n".as_slice()); + let mut buf = String::new(); + assert_eq!(chain.read_line(&mut buf).unwrap(), 3); + assert_eq!(buf, "é\n"); +} + #[test] fn bufreader_size_hint() { let testdata = b"ABCDEFGHIJKL";