]> git.proxmox.com Git - cargo.git/commitdiff
feat(test-support): Share `Project::from_template` with all cargo tests
authorEd Page <eopage@gmail.com>
Mon, 18 Apr 2022 22:08:43 +0000 (17:08 -0500)
committerEd Page <eopage@gmail.com>
Thu, 28 Apr 2022 01:53:25 +0000 (20:53 -0500)
This was written for `cargo_add.rs`, based on `snapbox`.  This allows
creating a test from a known reproduction case or easily debugging on an
existing test case.

crates/cargo-test-support/src/lib.rs
tests/testsuite/cargo_add.rs

index 1ac21abcdaa5020144490b676440bfca89dedea5..f767d17ba802d3981d96cde93425f8abea7004b3 100644 (file)
@@ -156,10 +156,16 @@ impl SymlinkBuilder {
     }
 }
 
+/// A cargo project to run tests against.
+///
+/// See [`ProjectBuilder`] or [`Project::from_template`] to get started.
 pub struct Project {
     root: PathBuf,
 }
 
+/// Create a project to run tests against
+///
+/// The project can be constructed programmatically or from the filesystem with [`Project::from_template`]
 #[must_use]
 pub struct ProjectBuilder {
     root: Project,
@@ -284,6 +290,14 @@ impl ProjectBuilder {
 }
 
 impl Project {
+    /// Copy the test project from a fixed state
+    pub fn from_template(template_path: impl AsRef<std::path::Path>) -> Self {
+        let root = paths::root();
+        let project_root = root.join("case");
+        snapbox::path::copy_template(template_path.as_ref(), &project_root).unwrap();
+        Self { root: project_root }
+    }
+
     /// Root of the project, ex: `/path/to/cargo/target/cit/t0/foo`
     pub fn root(&self) -> PathBuf {
         self.root.clone()
index 5e876eb9dba09a4307a7c36b300ade68960be00f..26d8e584c509cec8f3f062a0e1919d5e7a1c1004 100644 (file)
@@ -1,5 +1,6 @@
 use cargo_test_support::cargo_exe;
 use cargo_test_support::compare::assert;
+use cargo_test_support::Project;
 
 pub fn cargo_command() -> snapbox::cmd::Command {
     let mut cmd = snapbox::cmd::Command::new(cargo_exe()).with_assert(assert());
@@ -59,13 +60,6 @@ impl CommandExt for snapbox::cmd::Command {
     }
 }
 
-pub fn project_from_template(template_path: impl AsRef<std::path::Path>) -> std::path::PathBuf {
-    let root = cargo_test_support::paths::root();
-    let project_root = root.join("case");
-    snapbox::path::copy_template(template_path.as_ref(), &project_root).unwrap();
-    project_root
-}
-
 fn init_registry() {
     cargo_test_support::registry::init();
     add_registry_packages(false);
@@ -152,7 +146,8 @@ fn add_registry_packages(alt: bool) {
 #[cargo_test]
 fn add_basic() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/add_basic.in");
+    let project = Project::from_template("tests/snapshots/add/add_basic.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -170,7 +165,8 @@ fn add_basic() {
 #[cargo_test]
 fn add_multiple() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/add_multiple.in");
+    let project = Project::from_template("tests/snapshots/add/add_multiple.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -188,7 +184,8 @@ fn add_multiple() {
 #[cargo_test]
 fn quiet() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/quiet.in");
+    let project = Project::from_template("tests/snapshots/add/quiet.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -206,7 +203,8 @@ fn quiet() {
 #[cargo_test]
 fn add_normalized_name_external() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/add_normalized_name_external.in");
+    let project = Project::from_template("tests/snapshots/add/add_normalized_name_external.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -227,7 +225,8 @@ fn add_normalized_name_external() {
 #[cargo_test]
 fn infer_prerelease() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/infer_prerelease.in");
+    let project = Project::from_template("tests/snapshots/add/infer_prerelease.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -245,7 +244,8 @@ fn infer_prerelease() {
 #[cargo_test]
 fn build() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/build.in");
+    let project = Project::from_template("tests/snapshots/add/build.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -263,8 +263,8 @@ fn build() {
 #[cargo_test]
 fn build_prefer_existing_version() {
     init_alt_registry();
-    let project_root =
-        project_from_template("tests/snapshots/add/build_prefer_existing_version.in");
+    let project = Project::from_template("tests/snapshots/add/build_prefer_existing_version.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -285,7 +285,8 @@ fn build_prefer_existing_version() {
 #[cargo_test]
 fn default_features() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/default_features.in");
+    let project = Project::from_template("tests/snapshots/add/default_features.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -303,7 +304,8 @@ fn default_features() {
 #[cargo_test]
 fn require_weak() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/require_weak.in");
+    let project = Project::from_template("tests/snapshots/add/require_weak.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -321,7 +323,8 @@ fn require_weak() {
 #[cargo_test]
 fn detect_workspace_inherit() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/detect_workspace_inherit.in");
+    let project = Project::from_template("tests/snapshots/add/detect_workspace_inherit.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -343,8 +346,9 @@ fn detect_workspace_inherit() {
 #[cargo_test]
 fn detect_workspace_inherit_features() {
     init_registry();
-    let project_root =
-        project_from_template("tests/snapshots/add/detect_workspace_inherit_features.in");
+    let project =
+        Project::from_template("tests/snapshots/add/detect_workspace_inherit_features.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -366,8 +370,9 @@ fn detect_workspace_inherit_features() {
 #[cargo_test]
 fn detect_workspace_inherit_optional() {
     init_registry();
-    let project_root =
-        project_from_template("tests/snapshots/add/detect_workspace_inherit_optional.in");
+    let project =
+        Project::from_template("tests/snapshots/add/detect_workspace_inherit_optional.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -389,7 +394,8 @@ fn detect_workspace_inherit_optional() {
 #[cargo_test]
 fn dev() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/dev.in");
+    let project = Project::from_template("tests/snapshots/add/dev.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -407,7 +413,8 @@ fn dev() {
 #[cargo_test]
 fn dev_build_conflict() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/dev_build_conflict.in");
+    let project = Project::from_template("tests/snapshots/add/dev_build_conflict.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -425,7 +432,8 @@ fn dev_build_conflict() {
 #[cargo_test]
 fn dev_prefer_existing_version() {
     init_alt_registry();
-    let project_root = project_from_template("tests/snapshots/add/dev_prefer_existing_version.in");
+    let project = Project::from_template("tests/snapshots/add/dev_prefer_existing_version.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -446,7 +454,8 @@ fn dev_prefer_existing_version() {
 #[cargo_test]
 fn dry_run() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/dry_run.in");
+    let project = Project::from_template("tests/snapshots/add/dry_run.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -464,7 +473,8 @@ fn dry_run() {
 #[cargo_test]
 fn features() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/features.in");
+    let project = Project::from_template("tests/snapshots/add/features.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -482,7 +492,8 @@ fn features() {
 #[cargo_test]
 fn features_empty() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/features_empty.in");
+    let project = Project::from_template("tests/snapshots/add/features_empty.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -500,8 +511,8 @@ fn features_empty() {
 #[cargo_test]
 fn features_multiple_occurrences() {
     init_registry();
-    let project_root =
-        project_from_template("tests/snapshots/add/features_multiple_occurrences.in");
+    let project = Project::from_template("tests/snapshots/add/features_multiple_occurrences.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -522,7 +533,8 @@ fn features_multiple_occurrences() {
 #[cargo_test]
 fn features_preserve() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/features_preserve.in");
+    let project = Project::from_template("tests/snapshots/add/features_preserve.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -540,7 +552,8 @@ fn features_preserve() {
 #[cargo_test]
 fn features_spaced_values() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/features_spaced_values.in");
+    let project = Project::from_template("tests/snapshots/add/features_spaced_values.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -561,7 +574,8 @@ fn features_spaced_values() {
 #[cargo_test]
 fn features_unknown() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/features_unknown.in");
+    let project = Project::from_template("tests/snapshots/add/features_unknown.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -579,7 +593,8 @@ fn features_unknown() {
 #[cargo_test]
 fn git() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/git.in");
+    let project = Project::from_template("tests/snapshots/add/git.in");
+    let project_root = project.root();
     let cwd = &project_root;
     let git_dep = cargo_test_support::git::new("git-package", |project| {
         project
@@ -606,7 +621,8 @@ fn git() {
 #[cargo_test]
 fn git_inferred_name() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/git_inferred_name.in");
+    let project = Project::from_template("tests/snapshots/add/git_inferred_name.in");
+    let project_root = project.root();
     let cwd = &project_root;
     let git_dep = cargo_test_support::git::new("git-package", |project| {
         project
@@ -633,7 +649,8 @@ fn git_inferred_name() {
 #[cargo_test]
 fn git_inferred_name_multiple() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/git_inferred_name_multiple.in");
+    let project = Project::from_template("tests/snapshots/add/git_inferred_name_multiple.in");
+    let project_root = project.root();
     let cwd = &project_root;
     let git_dep = cargo_test_support::git::new("git-package", |project| {
         project
@@ -668,7 +685,8 @@ fn git_inferred_name_multiple() {
 #[cargo_test]
 fn git_normalized_name() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/git_normalized_name.in");
+    let project = Project::from_template("tests/snapshots/add/git_normalized_name.in");
+    let project_root = project.root();
     let cwd = &project_root;
     let git_dep = cargo_test_support::git::new("git-package", |project| {
         project
@@ -695,7 +713,8 @@ fn git_normalized_name() {
 #[cargo_test]
 fn invalid_git_name() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/invalid_git_name.in");
+    let project = Project::from_template("tests/snapshots/add/invalid_git_name.in");
+    let project_root = project.root();
     let cwd = &project_root;
     let git_dep = cargo_test_support::git::new("git-package", |project| {
         project
@@ -722,7 +741,8 @@ fn invalid_git_name() {
 #[cargo_test]
 fn git_branch() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/git_branch.in");
+    let project = Project::from_template("tests/snapshots/add/git_branch.in");
+    let project_root = project.root();
     let cwd = &project_root;
     let (git_dep, git_repo) = cargo_test_support::git::new_repo("git-package", |project| {
         project
@@ -752,7 +772,8 @@ fn git_branch() {
 #[cargo_test]
 fn git_conflicts_namever() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/git_conflicts_namever.in");
+    let project = Project::from_template("tests/snapshots/add/git_conflicts_namever.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -777,7 +798,8 @@ fn git_conflicts_namever() {
 #[cargo_test]
 fn git_registry() {
     init_alt_registry();
-    let project_root = project_from_template("tests/snapshots/add/git_registry.in");
+    let project = Project::from_template("tests/snapshots/add/git_registry.in");
+    let project_root = project.root();
     let cwd = &project_root;
     let git_dep = cargo_test_support::git::new("versioned-package", |project| {
         project
@@ -810,7 +832,8 @@ fn git_registry() {
 #[cargo_test]
 fn git_dev() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/git_dev.in");
+    let project = Project::from_template("tests/snapshots/add/git_dev.in");
+    let project_root = project.root();
     let cwd = &project_root;
     let git_dep = cargo_test_support::git::new("git-package", |project| {
         project
@@ -837,7 +860,8 @@ fn git_dev() {
 #[cargo_test]
 fn git_rev() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/git_rev.in");
+    let project = Project::from_template("tests/snapshots/add/git_rev.in");
+    let project_root = project.root();
     let cwd = &project_root;
     let (git_dep, git_repo) = cargo_test_support::git::new_repo("git-package", |project| {
         project
@@ -866,7 +890,8 @@ fn git_rev() {
 #[cargo_test]
 fn git_tag() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/git_tag.in");
+    let project = Project::from_template("tests/snapshots/add/git_tag.in");
+    let project_root = project.root();
     let cwd = &project_root;
     let (git_dep, git_repo) = cargo_test_support::git::new_repo("git-package", |project| {
         project
@@ -895,7 +920,8 @@ fn git_tag() {
 #[cargo_test]
 fn path() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/path.in");
+    let project = Project::from_template("tests/snapshots/add/path.in");
+    let project_root = project.root();
     let cwd = project_root.join("primary");
 
     cargo_command()
@@ -917,7 +943,8 @@ fn path() {
 #[cargo_test]
 fn path_inferred_name() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/path_inferred_name.in");
+    let project = Project::from_template("tests/snapshots/add/path_inferred_name.in");
+    let project_root = project.root();
     let cwd = project_root.join("primary");
 
     cargo_command()
@@ -939,8 +966,9 @@ fn path_inferred_name() {
 #[cargo_test]
 fn path_inferred_name_conflicts_full_feature() {
     init_registry();
-    let project_root =
-        project_from_template("tests/snapshots/add/path_inferred_name_conflicts_full_feature.in");
+    let project =
+        Project::from_template("tests/snapshots/add/path_inferred_name_conflicts_full_feature.in");
+    let project_root = project.root();
     let cwd = project_root.join("primary");
 
     cargo_command()
@@ -963,7 +991,8 @@ fn path_inferred_name_conflicts_full_feature() {
 #[cargo_test]
 fn path_normalized_name() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/path_normalized_name.in");
+    let project = Project::from_template("tests/snapshots/add/path_normalized_name.in");
+    let project_root = project.root();
     let cwd = project_root.join("primary");
 
     cargo_command()
@@ -988,7 +1017,8 @@ fn path_normalized_name() {
 #[cargo_test]
 fn invalid_path_name() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/invalid_path_name.in");
+    let project = Project::from_template("tests/snapshots/add/invalid_path_name.in");
+    let project_root = project.root();
     let cwd = project_root.join("primary");
 
     cargo_command()
@@ -1006,7 +1036,8 @@ fn invalid_path_name() {
 #[cargo_test]
 fn path_dev() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/path_dev.in");
+    let project = Project::from_template("tests/snapshots/add/path_dev.in");
+    let project_root = project.root();
     let cwd = project_root.join("primary");
 
     cargo_command()
@@ -1029,7 +1060,8 @@ fn path_dev() {
 #[cargo_test]
 fn invalid_arg() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/invalid_arg.in");
+    let project = Project::from_template("tests/snapshots/add/invalid_arg.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1047,7 +1079,8 @@ fn invalid_arg() {
 #[cargo_test]
 fn invalid_git_external() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/invalid_git_external.in");
+    let project = Project::from_template("tests/snapshots/add/invalid_git_external.in");
+    let project_root = project.root();
     let cwd = &project_root;
     let git_url = url::Url::from_directory_path(cwd.join("does-not-exist"))
         .unwrap()
@@ -1070,8 +1103,8 @@ fn invalid_git_external() {
 
 #[cargo_test]
 fn invalid_key_inherit_dependency() {
-    let project_root =
-        project_from_template("tests/snapshots/add/invalid_key_inherit_dependency.in");
+    let project = Project::from_template("tests/snapshots/add/invalid_key_inherit_dependency.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1092,8 +1125,9 @@ fn invalid_key_inherit_dependency() {
 
 #[cargo_test]
 fn invalid_key_rename_inherit_dependency() {
-    let project_root =
-        project_from_template("tests/snapshots/add/invalid_key_rename_inherit_dependency.in");
+    let project =
+        Project::from_template("tests/snapshots/add/invalid_key_rename_inherit_dependency.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1114,8 +1148,9 @@ fn invalid_key_rename_inherit_dependency() {
 
 #[cargo_test]
 fn invalid_key_overwrite_inherit_dependency() {
-    let project_root =
-        project_from_template("tests/snapshots/add/invalid_key_overwrite_inherit_dependency.in");
+    let project =
+        Project::from_template("tests/snapshots/add/invalid_key_overwrite_inherit_dependency.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1137,7 +1172,8 @@ fn invalid_key_overwrite_inherit_dependency() {
 #[cargo_test]
 fn invalid_path() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/invalid_path.in");
+    let project = Project::from_template("tests/snapshots/add/invalid_path.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1159,7 +1195,8 @@ fn invalid_path() {
 #[cargo_test]
 fn invalid_path_self() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/invalid_path_self.in");
+    let project = Project::from_template("tests/snapshots/add/invalid_path_self.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1177,7 +1214,8 @@ fn invalid_path_self() {
 #[cargo_test]
 fn invalid_manifest() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/invalid_manifest.in");
+    let project = Project::from_template("tests/snapshots/add/invalid_manifest.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1195,7 +1233,8 @@ fn invalid_manifest() {
 #[cargo_test]
 fn invalid_name_external() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/invalid_name_external.in");
+    let project = Project::from_template("tests/snapshots/add/invalid_name_external.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1216,7 +1255,8 @@ fn invalid_name_external() {
 #[cargo_test]
 fn invalid_target_empty() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/invalid_target_empty.in");
+    let project = Project::from_template("tests/snapshots/add/invalid_target_empty.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1237,7 +1277,8 @@ fn invalid_target_empty() {
 #[cargo_test]
 fn invalid_vers() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/invalid_vers.in");
+    let project = Project::from_template("tests/snapshots/add/invalid_vers.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1255,7 +1296,8 @@ fn invalid_vers() {
 #[cargo_test]
 fn list_features() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/list_features.in");
+    let project = Project::from_template("tests/snapshots/add/list_features.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1273,7 +1315,8 @@ fn list_features() {
 #[cargo_test]
 fn list_features_path() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/list_features_path.in");
+    let project = Project::from_template("tests/snapshots/add/list_features_path.in");
+    let project_root = project.root();
     let cwd = project_root.join("primary");
 
     cargo_command()
@@ -1291,8 +1334,8 @@ fn list_features_path() {
 #[cargo_test]
 fn list_features_path_no_default() {
     init_registry();
-    let project_root =
-        project_from_template("tests/snapshots/add/list_features_path_no_default.in");
+    let project = Project::from_template("tests/snapshots/add/list_features_path_no_default.in");
+    let project_root = project.root();
     let cwd = project_root.join("primary");
 
     cargo_command()
@@ -1318,7 +1361,8 @@ fn list_features_path_no_default() {
 #[cargo_test]
 fn manifest_path_package() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/manifest_path_package.in");
+    let project = Project::from_template("tests/snapshots/add/manifest_path_package.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1344,7 +1388,8 @@ fn manifest_path_package() {
 
 #[cargo_test]
 fn merge_activated_features() {
-    let project_root = project_from_template("tests/snapshots/add/merge_activated_features.in");
+    let project = Project::from_template("tests/snapshots/add/merge_activated_features.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1366,8 +1411,8 @@ fn merge_activated_features() {
 #[cargo_test]
 fn multiple_conflicts_with_features() {
     init_registry();
-    let project_root =
-        project_from_template("tests/snapshots/add/multiple_conflicts_with_features.in");
+    let project = Project::from_template("tests/snapshots/add/multiple_conflicts_with_features.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1388,7 +1433,8 @@ fn multiple_conflicts_with_features() {
 #[cargo_test]
 fn git_multiple_names() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/git_multiple_names.in");
+    let project = Project::from_template("tests/snapshots/add/git_multiple_names.in");
+    let project_root = project.root();
     let cwd = &project_root;
     let git_dep = cargo_test_support::git::new("git-package", |project| {
         project
@@ -1420,8 +1466,8 @@ fn git_multiple_names() {
 #[cargo_test]
 fn multiple_conflicts_with_rename() {
     init_registry();
-    let project_root =
-        project_from_template("tests/snapshots/add/multiple_conflicts_with_rename.in");
+    let project = Project::from_template("tests/snapshots/add/multiple_conflicts_with_rename.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1442,7 +1488,8 @@ fn multiple_conflicts_with_rename() {
 #[cargo_test]
 fn namever() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/namever.in");
+    let project = Project::from_template("tests/snapshots/add/namever.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1460,7 +1507,8 @@ fn namever() {
 #[cargo_test]
 fn no_args() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/no_args.in");
+    let project = Project::from_template("tests/snapshots/add/no_args.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1477,7 +1525,8 @@ fn no_args() {
 #[cargo_test]
 fn no_default_features() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/no_default_features.in");
+    let project = Project::from_template("tests/snapshots/add/no_default_features.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1495,7 +1544,8 @@ fn no_default_features() {
 #[cargo_test]
 fn no_optional() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/no_optional.in");
+    let project = Project::from_template("tests/snapshots/add/no_optional.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1513,7 +1563,8 @@ fn no_optional() {
 #[cargo_test]
 fn optional() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/optional.in");
+    let project = Project::from_template("tests/snapshots/add/optional.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1531,7 +1582,8 @@ fn optional() {
 #[cargo_test]
 fn overwrite_default_features() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/overwrite_default_features.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_default_features.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1552,9 +1604,10 @@ fn overwrite_default_features() {
 #[cargo_test]
 fn overwrite_default_features_with_no_default_features() {
     init_registry();
-    let project_root = project_from_template(
+    let project = Project::from_template(
         "tests/snapshots/add/overwrite_default_features_with_no_default_features.in",
     );
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1579,7 +1632,8 @@ fn overwrite_default_features_with_no_default_features() {
 #[cargo_test]
 fn overwrite_features() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/overwrite_features.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_features.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1597,7 +1651,8 @@ fn overwrite_features() {
 #[cargo_test]
 fn overwrite_git_with_path() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/overwrite_git_with_path.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_git_with_path.in");
+    let project_root = project.root();
     let cwd = project_root.join("primary");
 
     cargo_command()
@@ -1622,7 +1677,8 @@ fn overwrite_git_with_path() {
 #[cargo_test]
 fn overwrite_inline_features() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/overwrite_inline_features.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_inline_features.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1648,8 +1704,8 @@ fn overwrite_inline_features() {
 
 #[cargo_test]
 fn overwrite_inherit_features_noop() {
-    let project_root =
-        project_from_template("tests/snapshots/add/overwrite_inherit_features_noop.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_inherit_features_noop.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1671,7 +1727,8 @@ fn overwrite_inherit_features_noop() {
 #[cargo_test]
 fn overwrite_inherit_noop() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/overwrite_inherit_noop.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_inherit_noop.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1693,8 +1750,8 @@ fn overwrite_inherit_noop() {
 #[cargo_test]
 fn overwrite_inherit_optional_noop() {
     init_registry();
-    let project_root =
-        project_from_template("tests/snapshots/add/overwrite_inherit_optional_noop.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_inherit_optional_noop.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1716,7 +1773,8 @@ fn overwrite_inherit_optional_noop() {
 #[cargo_test]
 fn overwrite_name_dev_noop() {
     init_alt_registry();
-    let project_root = project_from_template("tests/snapshots/add/overwrite_name_dev_noop.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_name_dev_noop.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1737,7 +1795,8 @@ fn overwrite_name_dev_noop() {
 #[cargo_test]
 fn overwrite_name_noop() {
     init_alt_registry();
-    let project_root = project_from_template("tests/snapshots/add/overwrite_name_noop.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_name_noop.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1755,8 +1814,8 @@ fn overwrite_name_noop() {
 #[cargo_test]
 fn overwrite_no_default_features() {
     init_registry();
-    let project_root =
-        project_from_template("tests/snapshots/add/overwrite_no_default_features.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_no_default_features.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1777,9 +1836,10 @@ fn overwrite_no_default_features() {
 #[cargo_test]
 fn overwrite_no_default_features_with_default_features() {
     init_registry();
-    let project_root = project_from_template(
+    let project = Project::from_template(
         "tests/snapshots/add/overwrite_no_default_features_with_default_features.in",
     );
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1804,7 +1864,8 @@ fn overwrite_no_default_features_with_default_features() {
 #[cargo_test]
 fn overwrite_no_optional() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/overwrite_no_optional.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_no_optional.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1825,8 +1886,9 @@ fn overwrite_no_optional() {
 #[cargo_test]
 fn overwrite_no_optional_with_optional() {
     init_registry();
-    let project_root =
-        project_from_template("tests/snapshots/add/overwrite_no_optional_with_optional.in");
+    let project =
+        Project::from_template("tests/snapshots/add/overwrite_no_optional_with_optional.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1847,7 +1909,8 @@ fn overwrite_no_optional_with_optional() {
 #[cargo_test]
 fn overwrite_optional() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/overwrite_optional.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_optional.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1865,8 +1928,9 @@ fn overwrite_optional() {
 #[cargo_test]
 fn overwrite_optional_with_no_optional() {
     init_registry();
-    let project_root =
-        project_from_template("tests/snapshots/add/overwrite_optional_with_no_optional.in");
+    let project =
+        Project::from_template("tests/snapshots/add/overwrite_optional_with_no_optional.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1887,7 +1951,8 @@ fn overwrite_optional_with_no_optional() {
 #[cargo_test]
 fn overwrite_path_noop() {
     init_alt_registry();
-    let project_root = project_from_template("tests/snapshots/add/overwrite_path_noop.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_path_noop.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1905,7 +1970,8 @@ fn overwrite_path_noop() {
 #[cargo_test]
 fn overwrite_path_with_version() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/overwrite_path_with_version.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_path_with_version.in");
+    let project_root = project.root();
     let cwd = project_root.join("primary");
 
     cargo_command()
@@ -1926,8 +1992,8 @@ fn overwrite_path_with_version() {
 #[cargo_test]
 fn overwrite_rename_with_no_rename() {
     init_registry();
-    let project_root =
-        project_from_template("tests/snapshots/add/overwrite_rename_with_no_rename.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_rename_with_no_rename.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1948,7 +2014,8 @@ fn overwrite_rename_with_no_rename() {
 #[cargo_test]
 fn overwrite_rename_with_rename() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/overwrite_rename_with_rename.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_rename_with_rename.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1969,7 +2036,8 @@ fn overwrite_rename_with_rename() {
 #[cargo_test]
 fn change_rename_target() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/change_rename_target.in");
+    let project = Project::from_template("tests/snapshots/add/change_rename_target.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -1990,8 +2058,9 @@ fn change_rename_target() {
 #[cargo_test]
 fn overwrite_rename_with_rename_noop() {
     init_registry();
-    let project_root =
-        project_from_template("tests/snapshots/add/overwrite_rename_with_rename_noop.in");
+    let project =
+        Project::from_template("tests/snapshots/add/overwrite_rename_with_rename_noop.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -2012,7 +2081,8 @@ fn overwrite_rename_with_rename_noop() {
 #[cargo_test]
 fn overwrite_version_with_git() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/overwrite_version_with_git.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_version_with_git.in");
+    let project_root = project.root();
     let cwd = &project_root;
     let git_dep = cargo_test_support::git::new("versioned-package", |project| {
         project
@@ -2042,7 +2112,8 @@ fn overwrite_version_with_git() {
 #[cargo_test]
 fn overwrite_version_with_path() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/overwrite_version_with_path.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_version_with_path.in");
+    let project_root = project.root();
     let cwd = project_root.join("primary");
 
     cargo_command()
@@ -2067,7 +2138,8 @@ fn overwrite_version_with_path() {
 #[cargo_test]
 fn overwrite_with_rename() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/overwrite_with_rename.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_with_rename.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -2088,7 +2160,8 @@ fn overwrite_with_rename() {
 #[cargo_test]
 fn overwrite_workspace_dep() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/overwrite_workspace_dep.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_workspace_dep.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -2110,8 +2183,8 @@ fn overwrite_workspace_dep() {
 #[cargo_test]
 fn overwrite_workspace_dep_features() {
     init_registry();
-    let project_root =
-        project_from_template("tests/snapshots/add/overwrite_workspace_dep_features.in");
+    let project = Project::from_template("tests/snapshots/add/overwrite_workspace_dep_features.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -2133,7 +2206,8 @@ fn overwrite_workspace_dep_features() {
 #[cargo_test]
 fn preserve_sorted() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/preserve_sorted.in");
+    let project = Project::from_template("tests/snapshots/add/preserve_sorted.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -2151,7 +2225,8 @@ fn preserve_sorted() {
 #[cargo_test]
 fn preserve_unsorted() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/preserve_unsorted.in");
+    let project = Project::from_template("tests/snapshots/add/preserve_unsorted.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -2169,7 +2244,8 @@ fn preserve_unsorted() {
 #[cargo_test]
 fn registry() {
     init_alt_registry();
-    let project_root = project_from_template("tests/snapshots/add/registry.in");
+    let project = Project::from_template("tests/snapshots/add/registry.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -2187,7 +2263,8 @@ fn registry() {
 #[cargo_test]
 fn rename() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/rename.in");
+    let project = Project::from_template("tests/snapshots/add/rename.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -2205,7 +2282,8 @@ fn rename() {
 #[cargo_test]
 fn target() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/target.in");
+    let project = Project::from_template("tests/snapshots/add/target.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -2228,7 +2306,8 @@ fn target() {
 #[cargo_test]
 fn target_cfg() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/target_cfg.in");
+    let project = Project::from_template("tests/snapshots/add/target_cfg.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -2245,7 +2324,8 @@ fn target_cfg() {
 
 #[cargo_test]
 fn unknown_inherited_feature() {
-    let project_root = project_from_template("tests/snapshots/add/unknown_inherited_feature.in");
+    let project = Project::from_template("tests/snapshots/add/unknown_inherited_feature.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -2267,7 +2347,8 @@ fn unknown_inherited_feature() {
 #[cargo_test]
 fn vers() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/vers.in");
+    let project = Project::from_template("tests/snapshots/add/vers.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -2285,7 +2366,8 @@ fn vers() {
 #[cargo_test]
 fn workspace_path() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/workspace_path.in");
+    let project = Project::from_template("tests/snapshots/add/workspace_path.in");
+    let project_root = project.root();
     let cwd = project_root.join("primary");
 
     cargo_command()
@@ -2307,7 +2389,8 @@ fn workspace_path() {
 #[cargo_test]
 fn workspace_path_dev() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/workspace_path_dev.in");
+    let project = Project::from_template("tests/snapshots/add/workspace_path_dev.in");
+    let project_root = project.root();
     let cwd = project_root.join("primary");
 
     cargo_command()
@@ -2330,7 +2413,8 @@ fn workspace_path_dev() {
 #[cargo_test]
 fn workspace_name() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/workspace_name.in");
+    let project = Project::from_template("tests/snapshots/add/workspace_name.in");
+    let project_root = project.root();
     let cwd = project_root.join("primary");
 
     cargo_command()
@@ -2348,7 +2432,8 @@ fn workspace_name() {
 #[cargo_test]
 fn deprecated_default_features() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/deprecated_default_features.in");
+    let project = Project::from_template("tests/snapshots/add/deprecated_default_features.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()
@@ -2369,7 +2454,8 @@ fn deprecated_default_features() {
 #[cargo_test]
 fn deprecated_section() {
     init_registry();
-    let project_root = project_from_template("tests/snapshots/add/deprecated_section.in");
+    let project = Project::from_template("tests/snapshots/add/deprecated_section.in");
+    let project_root = project.root();
     let cwd = &project_root;
 
     cargo_command()