use tak_cli::measure::{self, Plan};
use tak_cli::measure::valgrind_available;
fn subject() -> Vec<String> {
#[cfg(unix)]
{
vec!["/bin/echo".to_string(), "tak".to_string()]
}
#[cfg(windows)]
{
vec!["cmd".to_string(), "/C".to_string(), "echo tak".to_string()]
}
}
#[test]
fn instructions_are_reported_when_valgrind_exists() {
if !valgrind_available() {
eprintln!("skipping: valgrind not installed");
return;
}
let c = measure::instructions(&subject(), None)
.expect("cachegrind invocation failed")
.expect("valgrind present but no I refs parsed");
assert!(
c.min > 10_000,
"implausibly low instruction count: {}",
c.min
);
assert!(c.max >= c.min);
assert!(
c.runs >= 2,
"a single sample cannot detect a varying subject"
);
}
#[test]
fn instruction_counts_are_deterministic() {
if !valgrind_available() {
eprintln!("skipping: valgrind not installed");
return;
}
let cmd = subject();
let outer: Vec<_> = (0..2)
.map(|_| {
measure::instructions(&cmd, None)
.expect("cachegrind invocation failed")
.expect("no I refs parsed")
})
.collect();
let min = outer.iter().map(|c| c.min).min().unwrap();
let max = outer.iter().map(|c| c.max).max().unwrap();
let spread = (max - min) as f64 / min as f64 * 100.0;
assert!(
spread < 0.1,
"instruction counts varied by {spread:.4}% — the deterministic-gate \
premise does not hold on this platform"
);
assert!(outer.iter().all(|c| !c.is_suspect()));
}
#[test]
fn availability_and_failure_are_distinct() {
if valgrind_available() {
let bogus = vec!["/nonexistent/tak-not-a-real-binary".to_string()];
assert!(
measure::instructions(&bogus, None).is_err(),
"a failed measurement must not look like a missing valgrind"
);
} else {
assert!(measure::instructions(&subject(), None).unwrap().is_none());
}
}
#[test]
fn missing_valgrind_is_not_an_error() {
if valgrind_available() {
eprintln!("skipping: valgrind is installed, cannot test its absence");
return;
}
let got =
measure::instructions(&subject(), None).expect("must not error when valgrind is absent");
assert!(got.is_none());
}
#[test]
fn wall_clock_works_without_counters() {
let m = measure::wall(&Plan {
cmd: subject(),
warmup: 1,
runs: 3,
dir: None,
})
.expect("wall measurement failed");
assert_eq!(m["wall_n"], 3.0);
assert!(m["wall_min_ms"] <= m["wall_p50_ms"]);
assert!(m["wall_p50_ms"] <= m["wall_max_ms"]);
assert!(m["wall_min_ms"] > 0.0);
}