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 3617b956e80..244512e2780 100644 --- a/library/std/src/io/mod.rs +++ b/library/std/src/io/mod.rs @@ -2405,6 +2405,9 @@ fn read_to_end(&mut self, buf: &mut Vec) -> Result { 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 @@ fn read_until(&mut self, byte: u8, buf: &mut Vec) -> Result { 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 f4a886d889a..4a205f30d44 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";