diff options
Diffstat (limited to 'crates/expect/src/lib.rs')
-rw-r--r-- | crates/expect/src/lib.rs | 49 |
1 files changed, 18 insertions, 31 deletions
diff --git a/crates/expect/src/lib.rs b/crates/expect/src/lib.rs index 408448eed..c54e99203 100644 --- a/crates/expect/src/lib.rs +++ b/crates/expect/src/lib.rs | |||
@@ -42,8 +42,8 @@ macro_rules! expect { | |||
42 | /// expect_file!["/crates/foo/test_data/bar.html"] | 42 | /// expect_file!["/crates/foo/test_data/bar.html"] |
43 | #[macro_export] | 43 | #[macro_export] |
44 | macro_rules! expect_file { | 44 | macro_rules! expect_file { |
45 | [$path:literal] => {$crate::ExpectFile { | 45 | [$path:expr] => {$crate::ExpectFile { |
46 | path: $crate::ExpectFilePath::Static($path) | 46 | path: std::path::PathBuf::from($path) |
47 | }}; | 47 | }}; |
48 | } | 48 | } |
49 | 49 | ||
@@ -55,13 +55,7 @@ pub struct Expect { | |||
55 | 55 | ||
56 | #[derive(Debug)] | 56 | #[derive(Debug)] |
57 | pub struct ExpectFile { | 57 | pub struct ExpectFile { |
58 | pub path: ExpectFilePath, | 58 | pub path: PathBuf, |
59 | } | ||
60 | |||
61 | #[derive(Debug)] | ||
62 | pub enum ExpectFilePath { | ||
63 | Static(&'static str), | ||
64 | Dynamic(PathBuf), | ||
65 | } | 59 | } |
66 | 60 | ||
67 | #[derive(Debug)] | 61 | #[derive(Debug)] |
@@ -120,9 +114,6 @@ impl Expect { | |||
120 | } | 114 | } |
121 | 115 | ||
122 | impl ExpectFile { | 116 | impl ExpectFile { |
123 | pub fn new(path: PathBuf) -> ExpectFile { | ||
124 | ExpectFile { path: ExpectFilePath::Dynamic(path) } | ||
125 | } | ||
126 | pub fn assert_eq(&self, actual: &str) { | 117 | pub fn assert_eq(&self, actual: &str) { |
127 | let expected = self.read(); | 118 | let expected = self.read(); |
128 | if actual == expected { | 119 | if actual == expected { |
@@ -136,14 +127,8 @@ impl ExpectFile { | |||
136 | fn write(&self, contents: &str) { | 127 | fn write(&self, contents: &str) { |
137 | fs::write(self.abs_path(), contents).unwrap() | 128 | fs::write(self.abs_path(), contents).unwrap() |
138 | } | 129 | } |
139 | fn path(&self) -> &Path { | ||
140 | match &self.path { | ||
141 | ExpectFilePath::Static(it) => it.as_ref(), | ||
142 | ExpectFilePath::Dynamic(it) => it.as_path(), | ||
143 | } | ||
144 | } | ||
145 | fn abs_path(&self) -> PathBuf { | 130 | fn abs_path(&self) -> PathBuf { |
146 | workspace_root().join(self.path()) | 131 | WORKSPACE_ROOT.join(&self.path) |
147 | } | 132 | } |
148 | } | 133 | } |
149 | 134 | ||
@@ -171,11 +156,11 @@ impl Runtime { | |||
171 | fn fail_file(expect: &ExpectFile, expected: &str, actual: &str) { | 156 | fn fail_file(expect: &ExpectFile, expected: &str, actual: &str) { |
172 | let mut rt = RT.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); | 157 | let mut rt = RT.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); |
173 | if update_expect() { | 158 | if update_expect() { |
174 | println!("\x1b[1m\x1b[92mupdating\x1b[0m: {}", expect.path().display()); | 159 | println!("\x1b[1m\x1b[92mupdating\x1b[0m: {}", expect.path.display()); |
175 | expect.write(actual); | 160 | expect.write(actual); |
176 | return; | 161 | return; |
177 | } | 162 | } |
178 | rt.panic(expect.path().display().to_string(), expected, actual); | 163 | rt.panic(expect.path.display().to_string(), expected, actual); |
179 | } | 164 | } |
180 | 165 | ||
181 | fn panic(&mut self, position: String, expected: &str, actual: &str) { | 166 | fn panic(&mut self, position: String, expected: &str, actual: &str) { |
@@ -219,7 +204,7 @@ struct FileRuntime { | |||
219 | 204 | ||
220 | impl FileRuntime { | 205 | impl FileRuntime { |
221 | fn new(expect: &Expect) -> FileRuntime { | 206 | fn new(expect: &Expect) -> FileRuntime { |
222 | let path = workspace_root().join(expect.position.file); | 207 | let path = WORKSPACE_ROOT.join(expect.position.file); |
223 | let original_text = fs::read_to_string(&path).unwrap(); | 208 | let original_text = fs::read_to_string(&path).unwrap(); |
224 | let patchwork = Patchwork::new(original_text.clone()); | 209 | let patchwork = Patchwork::new(original_text.clone()); |
225 | FileRuntime { path, original_text, patchwork } | 210 | FileRuntime { path, original_text, patchwork } |
@@ -307,15 +292,17 @@ fn format_patch(line_indent: usize, patch: &str) -> String { | |||
307 | buf | 292 | buf |
308 | } | 293 | } |
309 | 294 | ||
310 | fn workspace_root() -> PathBuf { | 295 | static WORKSPACE_ROOT: Lazy<PathBuf> = Lazy::new(|| { |
311 | Path::new( | 296 | let my_manifest = |
312 | &env::var("CARGO_MANIFEST_DIR").unwrap_or_else(|_| env!("CARGO_MANIFEST_DIR").to_owned()), | 297 | env::var("CARGO_MANIFEST_DIR").unwrap_or_else(|_| env!("CARGO_MANIFEST_DIR").to_owned()); |
313 | ) | 298 | // Heuristic, see https://github.com/rust-lang/cargo/issues/3946 |
314 | .ancestors() | 299 | Path::new(&my_manifest) |
315 | .nth(2) | 300 | .ancestors() |
316 | .unwrap() | 301 | .filter(|it| it.join("Cargo.toml").exists()) |
317 | .to_path_buf() | 302 | .last() |
318 | } | 303 | .unwrap() |
304 | .to_path_buf() | ||
305 | }); | ||
319 | 306 | ||
320 | #[cfg(test)] | 307 | #[cfg(test)] |
321 | mod tests { | 308 | mod tests { |