|
8 | 8 | //! cargo test --test all foo.wit |
9 | 9 |
|
10 | 10 | use anyhow::{bail, Context, Result}; |
| 11 | +use libtest_mimic::{Arguments, Trial}; |
11 | 12 | use pretty_assertions::StrComparison; |
12 | | -use rayon::prelude::*; |
13 | 13 | use std::env; |
14 | 14 | use std::ffi::OsStr; |
15 | 15 | use std::fs; |
16 | 16 | use std::io; |
17 | 17 | use std::path::{Path, PathBuf}; |
18 | 18 | use std::str; |
19 | | -use std::sync::atomic::{AtomicUsize, Ordering::SeqCst}; |
20 | 19 | use wit_parser::*; |
21 | 20 |
|
22 | 21 | fn main() { |
23 | 22 | env_logger::init(); |
24 | 23 | let tests = find_tests(); |
25 | | - let filter = std::env::args().nth(1); |
26 | 24 |
|
27 | | - let tests = tests |
28 | | - .par_iter() |
29 | | - .filter_map(|test| { |
30 | | - if let Some(filter) = &filter { |
31 | | - if let Some(s) = test.to_str() { |
32 | | - if !s.contains(filter) { |
33 | | - return None; |
34 | | - } |
35 | | - } |
36 | | - } |
37 | | - Some(test) |
38 | | - }) |
39 | | - .collect::<Vec<_>>(); |
40 | | - |
41 | | - println!("running {} test files\n", tests.len()); |
42 | | - |
43 | | - let ntests = AtomicUsize::new(0); |
44 | | - let errors = tests |
45 | | - .par_iter() |
46 | | - .filter_map(|test| { |
47 | | - Runner { ntests: &ntests } |
48 | | - .run(test) |
| 25 | + let mut trials = Vec::new(); |
| 26 | + for test in tests { |
| 27 | + let trial = Trial::test(format!("{test:?}"), move || { |
| 28 | + Runner {} |
| 29 | + .run(&test) |
49 | 30 | .context(format!("test {:?} failed", test)) |
50 | | - .err() |
51 | | - }) |
52 | | - .collect::<Vec<_>>(); |
53 | | - |
54 | | - if !errors.is_empty() { |
55 | | - for msg in errors.iter() { |
56 | | - eprintln!("{:?}", msg); |
57 | | - } |
58 | | - |
59 | | - panic!("{} tests failed", errors.len()) |
| 31 | + .map_err(|e| format!("{e:?}").into()) |
| 32 | + }); |
| 33 | + trials.push(trial); |
60 | 34 | } |
61 | 35 |
|
62 | | - println!( |
63 | | - "test result: ok. {} directives passed\n", |
64 | | - ntests.load(SeqCst) |
65 | | - ); |
| 36 | + let mut args = Arguments::from_args(); |
| 37 | + if cfg!(target_family = "wasm") && !cfg!(target_feature = "atomics") { |
| 38 | + args.test_threads = Some(1); |
| 39 | + } |
| 40 | + libtest_mimic::run(&args, trials).exit(); |
66 | 41 | } |
67 | 42 |
|
68 | 43 | /// Recursively finds all tests in a whitelisted set of directories which we |
@@ -95,11 +70,9 @@ fn find_tests() -> Vec<PathBuf> { |
95 | 70 | } |
96 | 71 | } |
97 | 72 |
|
98 | | -struct Runner<'a> { |
99 | | - ntests: &'a AtomicUsize, |
100 | | -} |
| 73 | +struct Runner {} |
101 | 74 |
|
102 | | -impl Runner<'_> { |
| 75 | +impl Runner { |
103 | 76 | fn run(&mut self, test: &Path) -> Result<()> { |
104 | 77 | let mut resolve = Resolve::new(); |
105 | 78 | let result = resolve.push_path(test); |
@@ -164,13 +137,8 @@ impl Runner<'_> { |
164 | 137 | ); |
165 | 138 | } |
166 | 139 | } |
167 | | - self.bump_ntests(); |
168 | 140 | Ok(()) |
169 | 141 | } |
170 | | - |
171 | | - fn bump_ntests(&self) { |
172 | | - self.ntests.fetch_add(1, SeqCst); |
173 | | - } |
174 | 142 | } |
175 | 143 |
|
176 | 144 | fn normalize(s: &str, extension: &str) -> String { |
|
0 commit comments