diff options
Diffstat (limited to 'crates/tools/src/lib.rs')
-rw-r--r-- | crates/tools/src/lib.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/crates/tools/src/lib.rs b/crates/tools/src/lib.rs new file mode 100644 index 000000000..97a56a31f --- /dev/null +++ b/crates/tools/src/lib.rs | |||
@@ -0,0 +1,43 @@ | |||
1 | extern crate itertools; | ||
2 | |||
3 | use itertools::Itertools; | ||
4 | |||
5 | #[derive(Debug)] | ||
6 | pub struct Test { | ||
7 | pub name: String, | ||
8 | pub text: String, | ||
9 | } | ||
10 | |||
11 | pub fn collect_tests(s: &str) -> Vec<(usize, Test)> { | ||
12 | let mut res = vec![]; | ||
13 | let prefix = "// "; | ||
14 | let comment_blocks = s | ||
15 | .lines() | ||
16 | .map(str::trim_left) | ||
17 | .enumerate() | ||
18 | .group_by(|(_idx, line)| line.starts_with(prefix)); | ||
19 | |||
20 | 'outer: for (is_comment, block) in comment_blocks.into_iter() { | ||
21 | if !is_comment { | ||
22 | continue; | ||
23 | } | ||
24 | let mut block = block.map(|(idx, line)| (idx, &line[prefix.len()..])); | ||
25 | |||
26 | let (start_line, name) = loop { | ||
27 | match block.next() { | ||
28 | Some((idx, line)) if line.starts_with("test ") => { | ||
29 | break (idx, line["test ".len()..].to_string()) | ||
30 | } | ||
31 | Some(_) => (), | ||
32 | None => continue 'outer, | ||
33 | } | ||
34 | }; | ||
35 | let text: String = itertools::join( | ||
36 | block.map(|(_, line)| line).chain(::std::iter::once("")), | ||
37 | "\n", | ||
38 | ); | ||
39 | assert!(!text.trim().is_empty() && text.ends_with("\n")); | ||
40 | res.push((start_line, Test { name, text })) | ||
41 | } | ||
42 | res | ||
43 | } | ||