malvin 0.2.4

Non-interactive research and coding agent
use crate::cli::Cli;
use clap::Parser;

#[test]
fn global_quiet_long_and_short_parse() {
    let long = Cli::try_parse_from(["malvin", "--quiet", "hello"]).expect("parse");
    assert!(long.shared.quiet);
    assert_eq!(long.request.as_deref(), Some("hello"));
    let short = Cli::try_parse_from(["malvin", "-q", "hello"]).expect("parse");
    assert!(short.shared.quiet);
}

#[test]
fn quiet_parses_on_router_wrappers() {
    for argv in [
        ["malvin", "-q", "-g"].as_slice(),
        ["malvin", "-q", "write", "topic"].as_slice(),
    ] {
        let cli = Cli::try_parse_from(argv).expect("parse");
        assert!(cli.shared.quiet, "argv={argv:?}");
    }
}

#[test]
fn gates_only_short_q_is_global_quiet() {
    let cli = Cli::try_parse_from(["malvin", "-g", "-q"]).expect("parse");
    assert!(cli.shared.quiet);
    assert!(cli.shared.gates);
    assert!(cli.request.is_none());
}

#[test]
fn removed_inverse_flags_are_rejected() {
    for flag in ["--no-color", "--no-tee", "--no-markdown"] {
        let err = Cli::try_parse_from(["malvin", flag, "--do", "x"]).expect_err("parse");
        let msg = err.to_string();
        assert!(
            msg.contains("unexpected argument") || msg.contains(flag),
            "flag={flag} msg={msg}"
        );
    }
}