summaryrefslogtreecommitdiff
path: root/vendor/writeable/src/testing.rs
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-07-10 13:11:11 -0600
committermo khan <mo@mokhan.ca>2025-07-10 13:11:11 -0600
commit01959b16a21b22b5df5f16569c2a8e8f92beecef (patch)
tree32afa5d747c5466345c59ec52161a7cba3d6d755 /vendor/writeable/src/testing.rs
parentff30574117a996df332e23d1fb6f65259b316b5b (diff)
chore: vendor dependencies
Diffstat (limited to 'vendor/writeable/src/testing.rs')
-rw-r--r--vendor/writeable/src/testing.rs78
1 files changed, 78 insertions, 0 deletions
diff --git a/vendor/writeable/src/testing.rs b/vendor/writeable/src/testing.rs
new file mode 100644
index 00000000..078ea9e2
--- /dev/null
+++ b/vendor/writeable/src/testing.rs
@@ -0,0 +1,78 @@
+// 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<W: Writeable>(
+ 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<W: TryWriteable>(
+ writeable: &W,
+) -> (String, Vec<(usize, usize, Part)>, Option<W::Error>) {
+ 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())
+}