use crate::common::util::*;

#[test]
fn test_env_help() {
    assert!(new_ucmd!()
        .arg("--help")
        .succeeds()
        .no_stderr()
        .stdout
        .contains("OPTIONS:"));
}

#[test]
fn test_env_version() {
    assert!(new_ucmd!()
        .arg("--version")
        .succeeds()
        .no_stderr()
        .stdout
        .contains(util_name!()));
}

#[test]
fn test_echo() {
    // assert!(new_ucmd!().arg("printf").arg("FOO-bar").succeeds().no_stderr().stdout.contains("FOO-bar"));
    let mut cmd = new_ucmd!();
    cmd.arg("echo").arg("FOO-bar");
    println!("cmd={:?}", cmd);

    let result = cmd.run();
    println!("success={:?}", result.success);
    println!("stdout={:?}", result.stdout);
    println!("stderr={:?}", result.stderr);
    assert!(result.success);

    let out = result.stdout.trim_end();

    assert_eq!(out, "FOO-bar");
}

#[test]
fn test_file_option() {
    let out = new_ucmd!().arg("-f").arg("vars.conf.txt").run().stdout;

    assert_eq!(
        out.lines()
            .filter(|&line| line == "FOO=bar" || line == "BAR=bamf this")
            .count(),
        2
    );
}

#[test]
fn test_combined_file_set() {
    let out = new_ucmd!()
        .arg("-f")
        .arg("vars.conf.txt")
        .arg("FOO=bar.alt")
        .run()
        .stdout;

    assert_eq!(out.lines().filter(|&line| line == "FOO=bar.alt").count(), 1);
}

#[test]
fn test_combined_file_set_unset() {
    let out = new_ucmd!()
        .arg("-u")
        .arg("BAR")
        .arg("-f")
        .arg("vars.conf.txt")
        .arg("FOO=bar.alt")
        .run()
        .stdout;

    assert_eq!(
        out.lines()
            .filter(|&line| line == "FOO=bar.alt" || line.starts_with("BAR="))
            .count(),
        1
    );
}

#[test]
fn test_single_name_value_pair() {
    let out = new_ucmd!().arg("FOO=bar").run().stdout;

    assert!(out.lines().any(|line| line == "FOO=bar"));
}

#[test]
fn test_multiple_name_value_pairs() {
    let out = new_ucmd!().arg("FOO=bar").arg("ABC=xyz").run().stdout;

    assert_eq!(
        out.lines()
            .filter(|&line| line == "FOO=bar" || line == "ABC=xyz")
            .count(),
        2
    );
}

#[test]
fn test_ignore_environment() {
    let scene = TestScenario::new(util_name!());

    let out = scene.ucmd().arg("-i").run().stdout;

    assert_eq!(out, "");

    let out = scene.ucmd().arg("-").run().stdout;

    assert_eq!(out, "");
}

#[test]
fn test_null_delimiter() {
    let out = new_ucmd!()
        .arg("-i")
        .arg("--null")
        .arg("FOO=bar")
        .arg("ABC=xyz")
        .run()
        .stdout;

    let mut vars: Vec<_> = out.split('\0').collect();
    assert_eq!(vars.len(), 3);
    vars.sort();
    assert_eq!(vars[0], "");
    assert_eq!(vars[1], "ABC=xyz");
    assert_eq!(vars[2], "FOO=bar");
}

#[test]
fn test_unset_variable() {
    // This test depends on the HOME variable being pre-defined by the
    // default shell
    let out = TestScenario::new(util_name!())
        .ucmd_keepenv()
        .arg("-u")
        .arg("HOME")
        .run()
        .stdout;

    assert_eq!(out.lines().any(|line| line.starts_with("HOME=")), false);
}

#[test]
fn test_fail_null_with_program() {
    let out = new_ucmd!().arg("--null").arg("cd").fails().stderr;
    assert!(out.contains("cannot specify --null (-0) with command"));
}