// This file is part of ICU4X. For terms of use, please see the file // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). use crate::*; use alloc::string::String; use alloc::vec::Vec; pub(crate) struct TestWriter { pub(crate) string: String, pub(crate) parts: Vec<(usize, usize, Part)>, } impl TestWriter { pub(crate) fn finish(mut self) -> (String, Vec<(usize, usize, Part)>) { // Sort by first open and last closed self.parts .sort_unstable_by_key(|(begin, end, _)| (*begin, end.wrapping_neg())); (self.string, self.parts) } } impl fmt::Write for TestWriter { fn write_str(&mut self, s: &str) -> fmt::Result { self.string.write_str(s) } fn write_char(&mut self, c: char) -> fmt::Result { self.string.write_char(c) } } impl PartsWrite for TestWriter { type SubPartsWrite = Self; fn with_part( &mut self, part: Part, mut f: impl FnMut(&mut Self::SubPartsWrite) -> fmt::Result, ) -> fmt::Result { let start = self.string.len(); f(self)?; let end = self.string.len(); if start < end { self.parts.push((start, end, part)); } Ok(()) } } #[allow(clippy::type_complexity)] pub fn writeable_to_parts_for_test( writeable: &W, ) -> (String, Vec<(usize, usize, Part)>) { let mut writer = TestWriter { string: alloc::string::String::new(), parts: Vec::new(), }; #[allow(clippy::expect_used)] // for test code writeable .write_to_parts(&mut writer) .expect("String writer infallible"); writer.finish() } #[allow(clippy::type_complexity)] pub fn try_writeable_to_parts_for_test( writeable: &W, ) -> (String, Vec<(usize, usize, Part)>, Option) { let mut writer = TestWriter { string: alloc::string::String::new(), parts: Vec::new(), }; #[allow(clippy::expect_used)] // for test code let result = writeable .try_write_to_parts(&mut writer) .expect("String writer infallible"); let (actual_str, actual_parts) = writer.finish(); (actual_str, actual_parts, result.err()) }