use anyhow;
use clap;
use log::debug;
use crate::cmake;
use crate::preset;
use crate::runner;
use crate::utils;
#[derive(clap::ValueEnum, Clone, Debug, Default)]
pub enum TestType {
#[default]
All,
Unit,
Integration,
Regression,
}
#[derive(clap::Parser, Debug)]
pub struct TestArgs {
#[arg(long, default_value = "all")]
pub r#type: TestType,
#[arg(long)]
pub filter: Option<String>,
#[arg(long)]
pub stop_on_failure: bool,
#[arg(long)]
pub rerun_failed: bool,
#[arg(long, default_value_t = utils::num_cpus())]
pub parallel: u32,
#[arg(long)]
pub no_build: bool,
#[arg(short = 'D', value_name = "VAR=VALUE")]
pub defines: Vec<String>,
#[arg(short, long)]
pub reconfigure: bool,
#[arg(short, long)]
pub fresh: bool,
}
pub fn run(ctx: &runner::Context, args: TestArgs) -> anyhow::Result<()> {
preset::ensure_project_root(ctx)?;
debug!("Begin");
let preset = preset::resolve(ctx, None)?;
let bdir = cmake::binary_dir(&preset);
if args.reconfigure || args.fresh || bdir.is_none_or(|b| !b.exists()) {
cmake::reconf(ctx, &preset, args.fresh, &args.defines)?;
}
if !ctx.dry_run {
cmake::ensure_libra_feature_enabled(ctx, &preset, "LIBRA_TESTS")?;
}
if !args.no_build {
ctx.run(&mut cmake::base_build(&preset).args(["--target", "all-tests"]))?;
}
let mut cmd = cmake::base_test(&preset);
match args.r#type {
TestType::Unit => {
cmd.args(["-L", "unit"]);
}
TestType::Integration => {
cmd.args(["-L", "integration"]);
}
TestType::Regression => {
cmd.args(["-L", "regression"]);
}
TestType::All => {}
}
cmd.args(["--parallel", &args.parallel.to_string()]);
if let Some(filter) = &args.filter {
cmd.args(["--tests-regex", filter]);
}
if args.stop_on_failure {
cmd.arg("--stop-on-failure");
}
if args.rerun_failed {
cmd.arg("--rerun-failed");
}
ctx.run(&mut cmd)?;
Ok(())
}