//! DO NOT EDIT
//!
//! Generated with `{{generated_with}}`
//! Scenarios from <{{generated_from}}>
//!
#![cfg(all(feature = "python", feature = "pypi", unix))]

use std::path::Path;
use std::process::Command;

use assert_cmd::assert::Assert;
use assert_cmd::prelude::*;

use uv_static::EnvVars;

use crate::common::{
    build_vendor_links_url, get_bin, packse_index_url, uv_snapshot, venv_to_interpreter,
    TestContext,
};

fn assert_command(venv: &Path, command: &str, temp_dir: &Path) -> Assert {
    Command::new(venv_to_interpreter(venv))
        .arg("-c")
        .arg(command)
        .current_dir(temp_dir)
        .assert()
}

fn assert_installed(venv: &Path, package: &'static str, version: &'static str, temp_dir: &Path) {
    assert_command(
        venv,
        format!("import {package} as package; print(package.__version__, end='')").as_str(),
        temp_dir,
    )
    .success()
    .stdout(version);
}

fn assert_not_installed(venv: &Path, package: &'static str, temp_dir: &Path) {
    assert_command(venv, format!("import {package}").as_str(), temp_dir).failure();
}

/// Create a `pip install` command with options shared across all scenarios.
fn command(context: &TestContext) -> Command {
    let mut command = Command::new(get_bin());
    command
        .arg("pip")
        .arg("install")
        .arg("--index-url")
        .arg(packse_index_url())
        .arg("--find-links")
        .arg(build_vendor_links_url());
    context.add_shared_args(&mut command, true);
    command.env_remove(EnvVars::UV_EXCLUDE_NEWER);
    command
}

{{#scenarios}}

/// {{description}}
///
/// ```text
/// {{name}}
{{#tree}}
/// {{.}}
{{/tree}}
/// ```
{{#python_patch}}
#[cfg(feature = "python-patch")]
{{/python_patch}}
#[test]
fn {{module_name}}() {
    let context = TestContext::new("{{environment.python}}");

    // In addition to the standard filters, swap out package names for shorter messages
    let mut filters = context.filters();
    filters.push((r"{{name}}-", "package-"));

    uv_snapshot!(filters, command(&context)
        {{#resolver_options.prereleases}}
        .arg("--prerelease=allow")
        {{/resolver_options.prereleases}}
        {{#resolver_options.no_build}}
        .arg("--only-binary")
        .arg("{{.}}")
        {{/resolver_options.no_build}}
        {{#resolver_options.no_binary}}
        .arg("--no-binary")
        .arg("{{.}}")
        {{/resolver_options.no_binary}}
        {{#root.requires}}
        .arg("{{requirement}}")
        {{/root.requires}}, @r###"<snapshot>
    "###);

    {{#expected.explanation}}
    // {{expected.explanation}}
    {{/expected.explanation}}
    {{#expected.satisfiable}}
    {{#expected.packages}}
    assert_installed(
        &context.venv,
        "{{module_name}}",
        "{{version}}",
        &context.temp_dir
    );
    {{/expected.packages}}
    {{/expected.satisfiable}}
    {{^expected.satisfiable}}
    {{#root.requires}}
    assert_not_installed(&context.venv, "{{module_name}}", &context.temp_dir);
    {{/root.requires}}
    {{/expected.satisfiable}}
}
{{/scenarios}}
