use crate::Arg;
use crate::Command;

#[test]
fn propagate_version() {
    let mut cmd = Command::new("test")
        .propagate_version(true)
        .version("1.1")
        .subcommand(Command::new("sub1"));
    cmd._propagate();
    assert_eq!(
        cmd.get_subcommands().next().unwrap().get_version(),
        Some("1.1")
    );
}

#[test]
fn global_setting() {
    let mut cmd = Command::new("test")
        .disable_version_flag(true)
        .subcommand(Command::new("subcmd"));
    cmd._propagate();
    assert!(cmd
        .get_subcommands()
        .find(|s| s.get_name() == "subcmd")
        .unwrap()
        .is_disable_version_flag_set());
}

// This test will *fail to compile* if Command is not Send + Sync
#[test]
fn app_send_sync() {
    fn foo<T: Send + Sync>(_: T) {}
    foo(Command::new("test"))
}

#[test]
fn issue_2090() {
    let mut cmd = Command::new("cmd")
        .disable_version_flag(true)
        .subcommand(Command::new("sub"));
    cmd._build_self(false);

    assert!(cmd
        .get_subcommands()
        .next()
        .unwrap()
        .is_disable_version_flag_set());
}

// This test will *fail to compile* if Arg is not Send + Sync
#[test]
fn arg_send_sync() {
    fn foo<T: Send + Sync>(_: T) {}
    foo(Arg::new("test"))
}
