use cargo_test_support::file;
use cargo_test_support::prelude::*;
use cargo_test_support::project;
use cargo_test_support::registry::Package;

#[cargo_test]
fn case() {
    Package::new("normal_a", "1.0.0")
        .dep("normal_b", "1.0")
        .publish();
    Package::new("normal_b", "1.0.0")
        .dep("normal_c", "1.0")
        .build_dep("normal_b_build_a", "1.0.0")
        .dev_dep("normal_b_dev_a", "1.0.0")
        .publish();
    Package::new("normal_c", "1.0.0").publish();
    Package::new("normal_b_build_a", "1.0.0")
        .dep("normal_b_build_a_normal_a", "1.0.0")
        .publish();
    Package::new("normal_b_build_a_normal_a", "1.0.0").publish();
    Package::new("normal_b_dev_a", "1.0.0")
        .dep("normal_b_dev_a_normal_a", "1.0.0")
        .publish();
    Package::new("normal_b_dev_a_normal_a", "1.0.0").publish();
    Package::new("normal_d", "1.0.0").publish();

    Package::new("build_a", "1.0.0")
        .dep("build_b", "1.0")
        .publish();
    Package::new("build_b", "1.0.0")
        .dep("build_c", "1.0")
        .build_dep("build_b_build_a", "1.0.0")
        .dev_dep("build_b_dev_a", "1.0.0")
        .publish();
    Package::new("build_c", "1.0.0").publish();
    Package::new("build_b_build_a", "1.0.0")
        .dep("build_b_build_a_normal_a", "1.0.0")
        .publish();
    Package::new("build_b_build_a_normal_a", "1.0.0").publish();
    Package::new("build_b_dev_a", "1.0.0")
        .dep("build_b_dev_a_normal_a", "1.0.0")
        .publish();
    Package::new("build_b_dev_a_normal_a", "1.0.0").publish();
    Package::new("build_d", "1.0.0").publish();

    Package::new("dev_a", "1.0.0").dep("dev_b", "1.0").publish();
    Package::new("dev_b", "1.0.0")
        .dep("dev_c", "1.0")
        .build_dep("dev_b_build_a", "1.0.0")
        .dev_dep("dev_b_dev_a", "1.0.0")
        .publish();
    Package::new("dev_c", "1.0.0").publish();
    Package::new("dev_b_build_a", "1.0.0")
        .dep("dev_b_build_a_normal_a", "1.0.0")
        .publish();
    Package::new("dev_b_build_a_normal_a", "1.0.0").publish();
    Package::new("dev_b_dev_a", "1.0.0")
        .dep("dev_b_dev_a_normal_a", "1.0.0")
        .publish();
    Package::new("dev_b_dev_a_normal_a", "1.0.0").publish();
    Package::new("dev_d", "1.0.0").publish();

    let p = project()
        .file(
            "Cargo.toml",
            r#"
            [package]
            name = "foo"
            version = "0.1.0"

            [features]
            default = ["foo"]
            foo = ["dep:normal_a"]

            [dependencies]
            normal_a = { version = "1.0", optional = true }
            normal_d = "1.0"

            [build-dependencies]
            build_a = "1.0"
            build_d = "1.0"

            [dev-dependencies]
            dev_a = "1.0"
            dev_d = "1.0"
            "#,
        )
        .file("src/lib.rs", "")
        .file("build.rs", "fn main() {}")
        .build();

    snapbox::cmd::Command::cargo_ui()
        .arg("tree")
        .arg("--edges=features")
        .current_dir(p.root())
        .assert()
        .success()
        .stdout_eq(file!["stdout.term.svg"])
        .stderr_eq(file!["stderr.term.svg"]);
}
