blob: 68c54e66ec1950182a93826a694961a4d3a50357 [file] [log] [blame]
use assert_cmd::prelude::*;
use std::process::Command;
// Timings are flaky, so tests would spuriously fail.
// Thus we replace all `/([0-9]+)ms/` with underscores
fn replace_ms(data: &[u8]) -> Vec<u8> {
let mut skip = false;
let mut seen_s = false;
let mut v: Vec<u8> = data
.iter()
.rev()
.filter_map(|&b| match (b, skip, seen_s) {
(b'0'..=b'9', true, _) => None,
(_, true, _) => {
skip = false;
Some(b)
}
(b's', _, _) => {
seen_s = true;
Some(b)
}
(b'm', _, true) => {
seen_s = false;
skip = true;
Some(b)
}
_ => Some(b),
})
.collect();
v.reverse();
v
}
fn main() {
for entry in glob::glob("examples/*.rs").expect("Failed to read glob pattern") {
let entry = entry.unwrap();
let mut cmd = Command::cargo_bin(entry.with_extension("").to_str().unwrap()).unwrap();
let output = cmd.unwrap();
let stderr = entry.with_extension("stderr");
let stdout = entry.with_extension("stdout");
if std::env::args().any(|arg| arg == "--bless") {
if output.stderr.is_empty() {
let _ = std::fs::remove_file(stderr);
} else {
std::fs::write(stderr, replace_ms(&output.stderr)).unwrap();
}
if output.stdout.is_empty() {
let _ = std::fs::remove_file(stdout);
} else {
std::fs::write(stdout, replace_ms(&output.stdout)).unwrap();
}
} else {
if output.stderr.is_empty() {
assert!(
!stderr.exists(),
"{} exists but there was no stderr output",
stderr.display()
);
} else {
assert!(
std::fs::read(&stderr).unwrap() == replace_ms(&output.stderr),
"{} is not the expected output, rerun the test with `cargo test -- -- --bless`",
stderr.display()
);
}
if output.stdout.is_empty() {
assert!(!stdout.exists());
} else {
assert!(
std::fs::read(&stdout).unwrap() == replace_ms(&output.stdout),
"{} is not the expected output, rerun the test with `cargo test -- -- --bless`",
stdout.display()
);
}
}
}
}