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

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

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

use common::{venv_to_interpreter, INSTA_FILTERS};

use crate::common::{get_bin, uv_snapshot, TestContext};

mod common;


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("{{index_url}}")
        .arg("--find-links")
        .arg("{{vendor_links}}")
        .arg("--cache-dir")
        .arg(context.cache_dir.path())
        .env("VIRTUAL_ENV", context.venv.as_os_str())
        .env("UV_NO_WRAP", "1")
        .current_dir(&context.temp_dir);

    if cfg!(all(windows, debug_assertions)) {
        // TODO(konstin): Reduce stack usage in debug mode enough that the tests pass with the
        // default windows stack of 1MB
        command.env("UV_STACK_SIZE", (8 * 1024 * 1024).to_string());
    }

    command
}

{{#scenarios}}

{{#description_lines}}
/// {{.}}
{{/description_lines}}
///
/// ```text
/// {{name}}
{{#tree}}
/// {{.}}
{{/tree}}
/// ```
#[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 = INSTA_FILTERS.to_vec();
    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_lines}}
    // {{.}}
    {{/expected.explanation_lines}}
    {{#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}}
