Skip to content

Commit f3968c3

Browse files
authored
refacvtor(harness): Prepare for multi-error tests (#110)
2 parents d1af5e7 + d5ea17c commit f3968c3

3 files changed

Lines changed: 36 additions & 34 deletions

File tree

crates/libtest2-harness/src/notify/pretty.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ impl<W: std::io::Write> super::Notifier for PrettyRunNotifier<W> {
5252
}
5353
}
5454
Event::CaseComplete(inner) => {
55-
let (s, style) = match inner.status {
55+
let status = self.summary.get_status(&inner.name);
56+
let (s, style) = match status {
5657
Some(RunStatus::Ignored) => ("ignored", IGNORED),
5758
Some(RunStatus::Failed) => ("FAILED", FAILED),
5859
None => ("ok", OK),

crates/libtest2-harness/src/notify/summary.rs

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,24 @@
1+
use super::event::CaseComplete;
12
use super::Event;
23
use super::RunStatus;
34
use super::FAILED;
45
use super::OK;
56

67
#[derive(Default, Clone, Debug)]
78
pub(crate) struct Summary {
8-
pub(crate) failures: std::collections::BTreeMap<String, Option<String>>,
9-
pub(crate) elapsed_s: Option<super::Elapsed>,
10-
11-
pub(crate) num_run: usize,
9+
num_run: usize,
1210
/// Number of tests and benchmarks that were filtered out (either by the
1311
/// filter-in pattern or by `--skip` arguments).
14-
pub(crate) num_filtered_out: usize,
12+
num_filtered_out: usize,
1513

16-
/// Number of passed tests.
17-
pub(crate) num_passed: usize,
18-
/// Number of failed tests and benchmarks.
19-
pub(crate) num_failed: usize,
20-
/// Number of ignored tests and benchmarks.
21-
pub(crate) num_ignored: usize,
14+
status: std::collections::HashMap<String, CaseComplete>,
15+
elapsed_s: Option<super::Elapsed>,
2216
}
2317

2418
impl Summary {
25-
pub(crate) fn has_failed(&self) -> bool {
26-
0 < self.num_failed
19+
pub(crate) fn get_status(&self, name: &str) -> Option<RunStatus> {
20+
let event = self.status.get(name)?;
21+
event.status
2722
}
2823

2924
pub(crate) fn write_start(&self, writer: &mut dyn std::io::Write) -> std::io::Result<()> {
@@ -35,24 +30,38 @@ impl Summary {
3530
}
3631

3732
pub(crate) fn write_complete(&self, writer: &mut dyn ::std::io::Write) -> std::io::Result<()> {
38-
let (summary, summary_style) = if self.has_failed() {
33+
let mut num_passed = 0;
34+
let mut num_failed = 0;
35+
let mut num_ignored = 0;
36+
let mut failures = std::collections::BTreeMap::new();
37+
for event in self.status.values() {
38+
match event.status {
39+
Some(RunStatus::Ignored) => num_ignored += 1,
40+
Some(RunStatus::Failed) => {
41+
num_failed += 1;
42+
failures.insert(&event.name, &event.message);
43+
}
44+
None => num_passed += 1,
45+
}
46+
}
47+
48+
let has_failed = 0 < num_failed;
49+
50+
let (summary, summary_style) = if has_failed {
3951
("FAILED", FAILED)
4052
} else {
4153
("ok", OK)
4254
};
43-
let num_passed = self.num_passed;
44-
let num_failed = self.num_failed;
45-
let num_ignored = self.num_ignored;
4655
let num_filtered_out = self.num_filtered_out;
4756
let elapsed_s = self.elapsed_s;
4857

49-
if self.has_failed() {
58+
if has_failed {
5059
writeln!(writer)?;
5160
writeln!(writer, "failures:")?;
5261
writeln!(writer)?;
5362

5463
// Print messages of all tests
55-
for (name, msg) in &self.failures {
64+
for (name, msg) in &failures {
5665
if let Some(msg) = msg {
5766
writeln!(writer, "---- {name} ----")?;
5867
writeln!(writer, "{msg}")?;
@@ -63,7 +72,7 @@ impl Summary {
6372
// Print summary list of failed tests
6473
writeln!(writer)?;
6574
writeln!(writer, "failures:")?;
66-
for name in self.failures.keys() {
75+
for name in failures.keys() {
6776
writeln!(writer, " {name}")?;
6877
}
6978
}
@@ -98,18 +107,9 @@ impl super::Notifier for Summary {
98107
Event::DiscoverComplete(_) => {}
99108
Event::RunStart(_) => {}
100109
Event::CaseStart(_) => {}
101-
Event::CaseComplete(inner) => match inner.status {
102-
Some(RunStatus::Ignored) => {
103-
self.num_ignored += 1;
104-
}
105-
Some(RunStatus::Failed) => {
106-
self.num_failed += 1;
107-
self.failures.insert(inner.name, inner.message);
108-
}
109-
None => {
110-
self.num_passed += 1;
111-
}
112-
},
110+
Event::CaseComplete(inner) => {
111+
self.status.insert(inner.name.clone(), inner);
112+
}
113113
Event::RunComplete(inner) => {
114114
self.elapsed_s = inner.elapsed_s;
115115
}

crates/libtest2-harness/src/notify/terse.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ impl<W: std::io::Write> super::Notifier for TerseRunNotifier<W> {
6969
}
7070
Event::CaseStart(_) => {}
7171
Event::CaseComplete(inner) => {
72-
let (c, style) = match inner.status {
72+
let status = self.summary.get_status(&inner.name);
73+
let (c, style) = match status {
7374
Some(RunStatus::Ignored) => ('i', IGNORED),
7475
Some(RunStatus::Failed) => ('F', FAILED),
7576
None => ('.', OK),

0 commit comments

Comments
 (0)