| // Copyright 2023 The Pigweed Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| // use this file except in compliance with the License. You may obtain a copy of |
| // the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| // License for the specific language governing permissions and limitations under |
| // the License. |
| |
| use std::path::{Path, PathBuf}; |
| |
| use tempfile::{Builder, TempDir}; |
| |
| use crate::{util::copy_directory, Project, Result}; |
| |
| /// `TestProject` copies a project to a temporary directory for tests |
| /// which need to write to the project directory. |
| /// |
| /// The temporary directory is deleted when the `TestProject` is dropped. |
| pub(crate) struct TestProject { |
| pub project: Project, |
| |
| // `TempDir` will be deleted when the `TestProject` is dropped. |
| project_root: TempDir, |
| } |
| |
| impl TestProject { |
| /// Creates a new `TestProject` from the project at `path` |
| /// |
| /// # Errors |
| /// Returns an error if they project can not be copied. |
| pub fn new(path: impl AsRef<Path>) -> Result<Self> { |
| let test_project_root = Builder::new().prefix("qg-test-project").tempdir()?; |
| |
| copy_directory(path, &test_project_root)?; |
| |
| Ok(Self { |
| project: Project::load(&test_project_root)?, |
| project_root: test_project_root, |
| }) |
| } |
| |
| /// Returns a `PathBuf` to the file at the relative path `path` within |
| /// the `TestProject` temporary copy. |
| #[allow(unused)] |
| pub fn relative_path(&self, path: impl AsRef<Path>) -> PathBuf { |
| self.project_root.path().join(path) |
| } |
| } |
| |
| #[cfg(test)] |
| mod tests { |
| use super::*; |
| |
| #[test] |
| fn test_project() { |
| let test_project = TestProject::new("./src/test_projects/simple").unwrap(); |
| assert_eq!(test_project.project.name(), "test-qg-project"); |
| } |
| } |