|
1 | 1 | use std::{ |
2 | | - fs::File, |
3 | | - io::{self, Read}, |
| 2 | + io, |
4 | 3 | path::{Path, PathBuf}, |
5 | 4 | }; |
6 | 5 |
|
7 | 6 | use { |
| 7 | + anyhow::anyhow, |
8 | 8 | collect_mac::collect, |
9 | 9 | futures::{join, prelude::*, stream, task::SpawnExt}, |
10 | 10 | serde_derive::Deserialize, |
11 | 11 | structopt::StructOpt, |
12 | 12 | thiserror::Error, |
| 13 | + tokio::fs, |
13 | 14 | }; |
14 | 15 |
|
15 | 16 | use gluon::{ |
@@ -182,22 +183,36 @@ impl TestCase { |
182 | 183 | } |
183 | 184 |
|
184 | 185 | async fn make_test<'t>(vm: &'t Thread, name: &str, filename: &Path) -> Result<TestCase, Error> { |
185 | | - let mut file = File::open(&filename)?; |
186 | | - let mut text = String::new(); |
187 | | - file.read_to_string(&mut text)?; |
| 186 | + let text = fs::read_to_string(filename).await?; |
188 | 187 | let (De(test), _) = vm.run_expr_async(&name, &text).await?; |
189 | 188 | Ok(test) |
190 | 189 | } |
191 | 190 |
|
192 | | -async fn run_file<'t>( |
193 | | - vm: &'t Thread, |
194 | | - name: &str, |
195 | | - filename: &Path, |
196 | | -) -> Result<(OpaqueValue<RootedThread, Hole>, ArcType), Error> { |
197 | | - let mut file = File::open(&filename)?; |
198 | | - let mut text = String::new(); |
199 | | - file.read_to_string(&mut text)?; |
200 | | - Ok(vm.run_expr_async(&name, &text).await?) |
| 191 | +async fn run_fail_test<'t>(vm: &'t Thread, name: &str, filename: &Path) -> Result<(), Error> { |
| 192 | + let source = fs::read_to_string(&filename).await?; |
| 193 | + let error_pattern = { |
| 194 | + let pat = "// ERROR"; |
| 195 | + assert!( |
| 196 | + source.starts_with(pat), |
| 197 | + "Failure tests must have an error pattern to match against" |
| 198 | + ); |
| 199 | + &source.lines().next().unwrap()[pat.len()..].trim() |
| 200 | + }; |
| 201 | + match vm.load_script_async(&name, &source).await { |
| 202 | + Ok(err) => Err(anyhow!( |
| 203 | + "Expected test '{}' to fail\n{:?}", |
| 204 | + filename.to_str().unwrap(), |
| 205 | + err |
| 206 | + ) |
| 207 | + .into()), |
| 208 | + Err(ref err) if !err.to_string().contains(error_pattern) => Err(anyhow!( |
| 209 | + "Error does not match the error pattern.\nExpected:\n\t`{}`\nActual:\n\t`{}`", |
| 210 | + error_pattern, |
| 211 | + err |
| 212 | + ) |
| 213 | + .into()), |
| 214 | + Err(_) => Ok(()), |
| 215 | + } |
201 | 216 | } |
202 | 217 |
|
203 | 218 | fn gather_doc_tests(expr: &SpannedExpr<Symbol>) -> Vec<(String, String)> { |
@@ -279,9 +294,7 @@ async fn run_doc_tests<'t>( |
279 | 294 | name: &str, |
280 | 295 | filename: &Path, |
281 | 296 | ) -> Result<Vec<tensile::Test<Error>>, Error> { |
282 | | - let mut file = File::open(&filename)?; |
283 | | - let mut text = String::new(); |
284 | | - file.read_to_string(&mut text)?; |
| 297 | + let text = fs::read_to_string(filename).await?; |
285 | 298 |
|
286 | 299 | let (expr, _, _) = vm.extract_metadata(&name, &text).await?; |
287 | 300 |
|
@@ -386,15 +399,7 @@ async fn main_(options: &Opt) -> Result<(), Error> { |
386 | 399 | tensile::test( |
387 | 400 | name.clone(), |
388 | 401 | tensile::Future(std::panic::AssertUnwindSafe(async move { |
389 | | - match run_file(&vm, &name, &filename).await { |
390 | | - Ok(err) => Err(format!( |
391 | | - "Expected test '{}' to fail\n{:?}", |
392 | | - filename.to_str().unwrap(), |
393 | | - err.0, |
394 | | - ) |
395 | | - .into()), |
396 | | - Err(_) => Ok(()), |
397 | | - } |
| 402 | + run_fail_test(&vm, &name, &filename).await |
398 | 403 | })), |
399 | 404 | ) |
400 | 405 | }) |
|
0 commit comments