Files
rtk-ai--rtk/src/cmds/php/paratest_cmd.rs
T
2026-07-13 12:01:57 +08:00

109 lines
3.5 KiB
Rust

//! ParaTest runner filter.
use super::test_output::filter_test_runner_output;
use super::utils::php_tool_command;
use crate::core::runner;
use anyhow::Result;
pub fn run(args: &[String], verbose: u8) -> Result<i32> {
let mut cmd = php_tool_command("paratest");
let has_no_progress = args.iter().any(|a| a == "--no-progress");
if !has_no_progress {
cmd.arg("--no-progress");
}
for arg in args {
cmd.arg(arg);
}
if verbose > 0 {
eprintln!("Running: paratest {}", args.join(" "));
}
runner::run_filtered(
cmd,
"paratest",
&args.join(" "),
filter_test_runner_output,
runner::RunOptions::default(),
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_paratest_strips_banner_seed_and_progress() {
// ParaTest prints its own banner and a "Random Seed:" line on top of
// PHPUnit-style dot progress; only the result summary should survive.
let output = "ParaTest v7.3.0 upon PHPUnit 10.5.0 by Sebastian Bergmann and contributors.\n\
Random Seed: 1234567890\n\
.......... 10 / 10 (100%)\n\n\
OK (10 tests, 25 assertions)\n";
let filtered = filter_test_runner_output(output);
assert!(!filtered.contains("ParaTest v7.3.0"), "got: {}", filtered);
assert!(!filtered.contains("Random Seed:"), "got: {}", filtered);
assert!(!filtered.contains("10 / 10 (100%)"), "got: {}", filtered);
assert!(
filtered.contains("OK (10 tests, 25 assertions)"),
"got: {}",
filtered
);
}
#[test]
fn test_paratest_keeps_failures() {
let output = "ParaTest v7.3.0 upon PHPUnit 10.5.0\n\
..F.\n\
There was 1 failure:\n\
1) App\\Tests\\UserTest::testEmail\n\
Failed asserting that false is true.\n";
let filtered = filter_test_runner_output(output);
assert!(!filtered.contains("ParaTest v7.3.0"), "got: {}", filtered);
assert!(
filtered.contains("App\\Tests\\UserTest::testEmail"),
"got: {}",
filtered
);
assert!(
filtered.contains("Failed asserting that false is true."),
"got: {}",
filtered
);
}
#[test]
fn test_paratest_token_savings() {
use crate::core::utils::count_tokens;
// A realistic passing run: banner + config + many parallel-worker
// progress lines, collapsing to a one-line summary.
let mut output = String::from(
"ParaTest v7.3.0 upon PHPUnit 10.5.0 by Sebastian Bergmann and contributors.\n\
Runtime: PHP 8.3.10\n\
Configuration: /var/www/html/phpunit.xml\n\
Random Seed: 1234567890\n\n",
);
for i in 1..=40 {
output.push_str(&format!(
".......................................... {} / 40 ({}%)\n",
i,
i * 100 / 40
));
}
output.push_str("\nOK (400 tests, 1200 assertions)\n");
let filtered = filter_test_runner_output(&output);
let savings =
100.0 - (count_tokens(&filtered) as f64 / count_tokens(&output) as f64 * 100.0);
assert!(
savings >= 60.0,
"expected ≥60% savings, got {:.1}%\n{}",
savings,
filtered
);
}
}