use assert_cmd::cargo::cargo_bin_cmd;
use git_version::git_version;

const WASMER_VERSION: &str = env!("CARGO_PKG_VERSION");

#[test]
fn short_version_string() {
    let version_number = format!("wasmer {WASMER_VERSION}");

    cargo_bin_cmd!("wasmer")
        .arg("--version")
        .assert()
        .success()
        .stdout(predicates::str::contains(&version_number));

    cargo_bin_cmd!("wasmer")
        .arg("-V")
        .assert()
        .success()
        .stdout(predicates::str::contains(&version_number));
}

#[test]
fn long_version_string() {
    let long_version_number = format!("wasmer {}", env!("CARGO_PKG_VERSION"),);
    let mut git_version = git_version!(
        args = [
            "--abbrev=40",
            "--always",
            "--dirty=-modified",
            "--exclude=*"
        ],
        fallback = "",
    )
    .to_string();
    if !git_version.is_empty() {
        git_version = format!("commit-hash: {git_version}");
    }
    let build_date = format!("commit-date: {}", env!("WASMER_BUILD_DATE"));
    let expected_features_line = "features: wasix".to_string();

    cargo_bin_cmd!("wasmer")
        .arg("--version")
        .arg("--verbose")
        .assert()
        .success()
        .stdout(predicates::str::contains(&long_version_number))
        .stdout(predicates::str::contains(&git_version))
        .stdout(predicates::str::contains(&build_date))
        .stdout(predicates::str::contains(&expected_features_line))
        .stdout(predicates::str::contains("binary:"));

    cargo_bin_cmd!("wasmer")
        .arg("-Vv")
        .assert()
        .success()
        .stdout(predicates::str::contains(&long_version_number))
        .stdout(predicates::str::contains(&git_version))
        .stdout(predicates::str::contains(&build_date))
        .stdout(predicates::str::contains(&expected_features_line))
        .stdout(predicates::str::contains("binary:"));
}

#[test]
fn help_text_contains_version() {
    let version_number = format!("wasmer {WASMER_VERSION}");

    cargo_bin_cmd!("wasmer")
        .arg("-h")
        .assert()
        .success()
        .stdout(predicates::str::contains(&version_number));

    cargo_bin_cmd!("wasmer")
        .arg("--help")
        .assert()
        .success()
        .stdout(predicates::str::contains(&version_number));
}