• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // This file is part of ICU4X. For terms of use, please see the file
2 // called LICENSE at the top level of the ICU4X source tree
3 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4 
5 use crate::*;
6 use alloc::string::String;
7 use alloc::vec::Vec;
8 
9 pub(crate) struct TestWriter {
10     pub(crate) string: String,
11     pub(crate) parts: Vec<(usize, usize, Part)>,
12 }
13 
14 impl TestWriter {
finish(mut self) -> (String, Vec<(usize, usize, Part)>)15     pub(crate) fn finish(mut self) -> (String, Vec<(usize, usize, Part)>) {
16         // Sort by first open and last closed
17         self.parts
18             .sort_unstable_by_key(|(begin, end, _)| (*begin, end.wrapping_neg()));
19         (self.string, self.parts)
20     }
21 }
22 
23 impl fmt::Write for TestWriter {
write_str(&mut self, s: &str) -> fmt::Result24     fn write_str(&mut self, s: &str) -> fmt::Result {
25         self.string.write_str(s)
26     }
write_char(&mut self, c: char) -> fmt::Result27     fn write_char(&mut self, c: char) -> fmt::Result {
28         self.string.write_char(c)
29     }
30 }
31 
32 impl PartsWrite for TestWriter {
33     type SubPartsWrite = Self;
with_part( &mut self, part: Part, mut f: impl FnMut(&mut Self::SubPartsWrite) -> fmt::Result, ) -> fmt::Result34     fn with_part(
35         &mut self,
36         part: Part,
37         mut f: impl FnMut(&mut Self::SubPartsWrite) -> fmt::Result,
38     ) -> fmt::Result {
39         let start = self.string.len();
40         f(self)?;
41         let end = self.string.len();
42         if start < end {
43             self.parts.push((start, end, part));
44         }
45         Ok(())
46     }
47 }
48 
49 #[allow(clippy::type_complexity)]
writeable_to_parts_for_test<W: Writeable>( writeable: &W, ) -> (String, Vec<(usize, usize, Part)>)50 pub fn writeable_to_parts_for_test<W: Writeable>(
51     writeable: &W,
52 ) -> (String, Vec<(usize, usize, Part)>) {
53     let mut writer = TestWriter {
54         string: alloc::string::String::new(),
55         parts: Vec::new(),
56     };
57     #[allow(clippy::expect_used)] // for test code
58     writeable
59         .write_to_parts(&mut writer)
60         .expect("String writer infallible");
61     writer.finish()
62 }
63 
64 #[allow(clippy::type_complexity)]
try_writeable_to_parts_for_test<W: TryWriteable>( writeable: &W, ) -> (String, Vec<(usize, usize, Part)>, Option<W::Error>)65 pub fn try_writeable_to_parts_for_test<W: TryWriteable>(
66     writeable: &W,
67 ) -> (String, Vec<(usize, usize, Part)>, Option<W::Error>) {
68     let mut writer = TestWriter {
69         string: alloc::string::String::new(),
70         parts: Vec::new(),
71     };
72     #[allow(clippy::expect_used)] // for test code
73     let result = writeable
74         .try_write_to_parts(&mut writer)
75         .expect("String writer infallible");
76     let (actual_str, actual_parts) = writer.finish();
77     (actual_str, actual_parts, result.err())
78 }
79