Skip to content

Commit 8357f4c

Browse files
committed
Display the result of a check in tabular form
1 parent cc23474 commit 8357f4c

File tree

2 files changed

+89
-39
lines changed

2 files changed

+89
-39
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ enumset = "1.1.3"
1717
libyaml = "0.2.0"
1818
log = "0.4.21"
1919
env_logger = "0.11.3"
20+
tabled = "0.17.0"
2021

2122
[features]
2223
default = ["backwards_compatibility"]

src/main.rs

Lines changed: 88 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ mod test;
2020
mod translator;
2121
mod yaml;
2222

23+
use tabled::{
24+
settings::{object::Rows, Border, Style},
25+
Table, Tabled,
26+
};
2327
use yaml::YAMLParser;
2428

2529
#[derive(Debug, Subcommand)]
@@ -46,9 +50,6 @@ enum Commands {
4650
/// Only show a summary of the test results
4751
#[arg(short, long)]
4852
summary: bool,
49-
/// Instead of printing all the failures only list the YAML files where a test failed
50-
#[arg(short, long)]
51-
list: bool,
5253
/// YAML document(s) that specify the tests
5354
#[arg(required = true)]
5455
yaml_files: Vec<PathBuf>,
@@ -139,47 +140,98 @@ fn parse_line(line: String) {
139140
}
140141
}
141142

142-
fn percentage(n: usize, total: usize) -> String {
143-
let n = n as f32;
144-
let total = total as f32;
145-
let result = (n * 100.0) / total;
146-
format!("{:.1}%", result)
143+
#[derive(Tabled, Default)]
144+
#[tabled(rename_all = "PascalCase")]
145+
struct YAMLTestResult {
146+
#[tabled(rename = "YAML File")]
147+
yaml_file: String,
148+
tests: usize,
149+
#[tabled(display_with("Self::display_successes", self))]
150+
successes: usize,
151+
#[tabled(display_with("Self::display_failures", self))]
152+
failures: usize,
153+
#[tabled(
154+
rename = "Expected\nFailures",
155+
display_with("Self::display_expected", self)
156+
)]
157+
expected_failures: usize,
158+
#[tabled(
159+
rename = "Unexpected\nSuccesses",
160+
display_with("Self::display_unexpected", self)
161+
)]
162+
unexpected_successes: usize,
163+
}
164+
165+
fn percent(n: usize, total: usize) -> f64 {
166+
(n as f64 * 100.0) / total as f64
147167
}
148168

149-
fn print_check_row(label: &str, occurences: usize, total: usize) {
150-
println!(
151-
"{} {} [{}]",
152-
occurences,
153-
label,
154-
percentage(occurences, total)
155-
);
169+
impl YAMLTestResult {
170+
fn display_successes(&self) -> String {
171+
format!("{:.1}%", percent(self.successes, self.tests))
172+
}
173+
fn display_failures(&self) -> String {
174+
format!("{:.1}%", percent(self.failures, self.tests))
175+
}
176+
fn display_expected(&self) -> String {
177+
format!("{:.1}%", percent(self.expected_failures, self.tests))
178+
}
179+
fn display_unexpected(&self) -> String {
180+
format!("{:.1}%", percent(self.unexpected_successes, self.tests))
181+
}
182+
fn update(
183+
&mut self,
184+
tests: usize,
185+
successes: usize,
186+
failures: usize,
187+
expected_failures: usize,
188+
unexpected_successes: usize,
189+
) {
190+
self.tests += tests;
191+
self.successes += successes;
192+
self.failures += failures;
193+
self.expected_failures += expected_failures;
194+
self.unexpected_successes += unexpected_successes;
195+
}
156196
}
157197

158-
fn check_yaml(paths: Vec<PathBuf>, summary: bool, list: bool) {
159-
let mut total = 0;
160-
let mut successes = 0;
161-
let mut failures = 0;
162-
let mut expected_failures = 0;
163-
let mut unexpected_successes = 0;
198+
fn check_yaml(paths: Vec<PathBuf>, summary: bool) {
199+
let mut total = YAMLTestResult::default();
200+
let mut yaml_results: Vec<YAMLTestResult> = Vec::new();
164201
for path in paths {
165202
match File::open(&path) {
166203
Ok(file) => match YAMLParser::new(file) {
167204
Ok(mut parser) => match parser.yaml() {
168205
Ok(test_results) => {
169-
total += test_results.len();
170-
successes += test_results.iter().filter(|r| r.is_success()).count();
171-
failures += test_results.iter().filter(|r| r.is_failure()).count();
172-
expected_failures += test_results
206+
let tests = test_results.len();
207+
let successes = test_results.iter().filter(|r| r.is_success()).count();
208+
let failures = test_results.iter().filter(|r| r.is_failure()).count();
209+
let expected_failures = test_results
173210
.iter()
174211
.filter(|r| r.is_expected_failure())
175212
.count();
176-
unexpected_successes += test_results
213+
let unexpected_successes = test_results
177214
.iter()
178215
.filter(|r| r.is_unexpected_success())
179216
.count();
180-
if list && (test_results.iter().filter(|r| !r.is_success()).count() > 0) {
181-
println!("Failures in {:?}", path);
182-
} else if !summary {
217+
total.update(
218+
tests,
219+
successes,
220+
failures,
221+
expected_failures,
222+
unexpected_successes,
223+
);
224+
yaml_results.push(YAMLTestResult {
225+
yaml_file: path
226+
.file_name()
227+
.map_or("".to_string(), |f| f.to_string_lossy().into_owned()),
228+
tests,
229+
successes,
230+
failures,
231+
expected_failures,
232+
unexpected_successes,
233+
});
234+
if !summary {
183235
for res in test_results.iter().filter(|r| !r.is_success()) {
184236
println!("{:?}", res);
185237
}
@@ -199,14 +251,12 @@ fn check_yaml(paths: Vec<PathBuf>, summary: bool, list: bool) {
199251
}
200252
}
201253
if summary {
202-
println!(
203-
"================================================================================"
204-
);
205-
println!("{} tests run:", total);
206-
print_check_row("successes", successes, total);
207-
print_check_row("failures", failures, total);
208-
print_check_row("expected failures", expected_failures, total);
209-
print_check_row("unexpected successes", unexpected_successes, total);
254+
total.yaml_file = "Total".to_string();
255+
yaml_results.push(total);
256+
let mut table = Table::new(yaml_results);
257+
// add a special separator above the Total row
258+
table.modify(Rows::last(), Border::inherit(Style::ascii()).top('='));
259+
println!("{}", table);
210260
}
211261
}
212262

@@ -244,8 +294,7 @@ fn main() {
244294
Commands::Check {
245295
yaml_files,
246296
summary,
247-
list,
248-
} => check_yaml(yaml_files, summary, list),
297+
} => check_yaml(yaml_files, summary),
249298
Commands::Query { query } => match metadata::index() {
250299
Ok(index) => {
251300
let query = query

0 commit comments

Comments
 (0)