diff --git a/tests/testsuite/cargo_tree/dupe/mod.rs b/tests/testsuite/cargo_tree/dupe/mod.rs
new file mode 100644
index 000000000..fe0aa4271
--- /dev/null
+++ b/tests/testsuite/cargo_tree/dupe/mod.rs
@@ -0,0 +1,36 @@
+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("a", "1.0.0").dep("b", "1.0").publish();
+ Package::new("b", "1.0.0").dep("c", "1.0").publish();
+ Package::new("c", "1.0.0").publish();
+
+ let p = project()
+ .file(
+ "Cargo.toml",
+ r#"
+ [package]
+ name = "foo"
+ version = "0.1.0"
+
+ [dependencies]
+ a = "1.0"
+ b = "1.0"
+ "#,
+ )
+ .file("src/lib.rs", "")
+ .file("build.rs", "fn main() {}")
+ .build();
+
+ snapbox::cmd::Command::cargo_ui()
+ .arg("tree")
+ .current_dir(p.root())
+ .assert()
+ .success()
+ .stdout_eq(file!["stdout.term.svg"])
+ .stderr_eq(file!["stderr.term.svg"]);
+}
diff --git a/tests/testsuite/cargo_tree/dupe/stderr.term.svg b/tests/testsuite/cargo_tree/dupe/stderr.term.svg
new file mode 100644
index 000000000..3ce39fdd2
--- /dev/null
+++ b/tests/testsuite/cargo_tree/dupe/stderr.term.svg
@@ -0,0 +1,37 @@
+
diff --git a/tests/testsuite/cargo_tree/dupe/stdout.term.svg b/tests/testsuite/cargo_tree/dupe/stdout.term.svg
new file mode 100644
index 000000000..f6f0eed2c
--- /dev/null
+++ b/tests/testsuite/cargo_tree/dupe/stdout.term.svg
@@ -0,0 +1,33 @@
+
diff --git a/tests/testsuite/cargo_tree/edge_kind/mod.rs b/tests/testsuite/cargo_tree/edge_kind/mod.rs
new file mode 100644
index 000000000..6693e8bfb
--- /dev/null
+++ b/tests/testsuite/cargo_tree/edge_kind/mod.rs
@@ -0,0 +1,100 @@
+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"]);
+}
diff --git a/tests/testsuite/cargo_tree/edge_kind/stderr.term.svg b/tests/testsuite/cargo_tree/edge_kind/stderr.term.svg
new file mode 100644
index 000000000..7055876d1
--- /dev/null
+++ b/tests/testsuite/cargo_tree/edge_kind/stderr.term.svg
@@ -0,0 +1,67 @@
+
diff --git a/tests/testsuite/cargo_tree/edge_kind/stdout.term.svg b/tests/testsuite/cargo_tree/edge_kind/stdout.term.svg
new file mode 100644
index 000000000..bd9b16b07
--- /dev/null
+++ b/tests/testsuite/cargo_tree/edge_kind/stdout.term.svg
@@ -0,0 +1,107 @@
+
diff --git a/tests/testsuite/cargo_tree/mod.rs b/tests/testsuite/cargo_tree/mod.rs
index 56d6de9c5..2c2763c37 100644
--- a/tests/testsuite/cargo_tree/mod.rs
+++ b/tests/testsuite/cargo_tree/mod.rs
@@ -1,3 +1,5 @@
mod deps;
+mod dupe;
+mod edge_kind;
mod features;
mod help;