Skip to content

Commit f9051e3

Browse files
committed
refactor: Catch more panics for better test reporting
1 parent b1cd2e3 commit f9051e3

File tree

5 files changed

+58
-16
lines changed

5 files changed

+58
-16
lines changed

check/tests/pass.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,3 +1135,16 @@ match writer with
11351135
"#,
11361136
"test.List String"
11371137
}
1138+
1139+
test_check! {
1140+
issue_863,
1141+
r#"
1142+
#[infix(right, 0)]
1143+
let (<|) f x : (a -> b) -> a -> b = f x
1144+
1145+
let g f x = x
1146+
let f a =
1147+
g a <| f a
1148+
{ f }
1149+
"#
1150+
}

src/import.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -595,11 +595,15 @@ where
595595
Box::pin(async move {
596596
Ok(From::from(move || {
597597
async move {
598-
let mut db = salsa::OwnedDb::<dyn Compilation>::from(&mut db);
599-
db.import(modulename)
600-
.await
601-
.map_err(|err| MacroError::message(err.to_string()))
602-
.map(move |id| pos::spanned(span, Expr::Ident(id)))
598+
let result = {
599+
let mut db = salsa::OwnedDb::<dyn Compilation>::from(&mut db);
600+
db.import(modulename)
601+
.await
602+
.map_err(|err| MacroError::message(err.to_string()))
603+
.map(move |id| pos::spanned(span, Expr::Ident(id)))
604+
};
605+
drop(db);
606+
result
603607
}
604608
.boxed()
605609
}))

tests/inline.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use support::*;
33

44
mod support;
55

6-
use gluon::{self, query::Compilation, vm::core::tests::check_expr_eq, ThreadExt};
6+
use gluon::{self, query::{Compilation, AsyncCompilation}, vm::core::tests::check_expr_eq, ThreadExt};
77

88
#[tokio::test]
99
async fn inline_cross_module() {
@@ -24,6 +24,7 @@ async fn inline_cross_module() {
2424
.unwrap_or_else(|err| panic!("{}", err));
2525

2626
let mut db = thread.get_database();
27+
let mut db = salsa::OwnedDb::<dyn Compilation>::from(&mut db);
2728
let core_expr = db
2829
.core_expr("test".into(), None)
2930
.await
@@ -69,6 +70,7 @@ num.(+) 3
6970
.unwrap_or_else(|err| panic!("{}", err));
7071

7172
let mut db = thread.get_database();
73+
let mut db = salsa::OwnedDb::<dyn Compilation>::from(&mut db);
7274
let core_expr = db
7375
.core_expr("test".into(), None)
7476
.await
@@ -98,6 +100,7 @@ async fn inline_across_two_modules() {
98100
.unwrap_or_else(|err| panic!("{}", err));
99101

100102
let mut db = thread.get_database();
103+
let mut db = salsa::OwnedDb::<dyn Compilation>::from(&mut db);
101104
let core_expr = db
102105
.core_expr("test".into(), None)
103106
.await
@@ -127,6 +130,7 @@ async fn prune_prelude() {
127130
.unwrap_or_else(|err| panic!("{}", err));
128131

129132
let mut db = thread.get_database();
133+
let mut db = salsa::OwnedDb::<dyn Compilation>::from(&mut db);
130134
let core_expr = db
131135
.core_expr("test".into(), None)
132136
.await
@@ -161,6 +165,7 @@ async fn prune_factorial() {
161165
.unwrap_or_else(|err| panic!("{}", err));
162166

163167
let mut db = thread.get_database();
168+
let mut db = salsa::OwnedDb::<dyn Compilation>::from(&mut db);
164169
let core_expr = db
165170
.core_expr("test".into(), None)
166171
.await
@@ -198,6 +203,7 @@ mod.(+) (no_inline 1) 2
198203
.unwrap_or_else(|err| panic!("{}", err));
199204

200205
let mut db = thread.get_database();
206+
let mut db = salsa::OwnedDb::<dyn Compilation>::from(&mut db);
201207
let core_expr = db
202208
.core_expr("test".into(), None)
203209
.await
@@ -236,6 +242,7 @@ match A with
236242
.unwrap_or_else(|err| panic!("{}", err));
237243

238244
let mut db = thread.get_database();
245+
let mut db = salsa::OwnedDb::<dyn Compilation>::from(&mut db);
239246
let core_expr = db
240247
.core_expr("test".into(), None)
241248
.await
@@ -267,6 +274,7 @@ m.(<)
267274
.unwrap_or_else(|err| panic!("{}", err));
268275

269276
let mut db = thread.get_database();
277+
let mut db = salsa::OwnedDb::<dyn Compilation>::from(&mut db);
270278
let core_expr = db
271279
.core_expr("test".into(), None)
272280
.await
@@ -300,6 +308,7 @@ f (Some 1)
300308
.unwrap_or_else(|err| panic!("{}", err));
301309

302310
let mut db = thread.get_database();
311+
let mut db = salsa::OwnedDb::<dyn Compilation>::from(&mut db);
303312
let core_expr = db
304313
.core_expr("test".into(), None)
305314
.await

tests/main.rs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,27 @@ impl TestCase {
182182
}
183183
}
184184

185+
async fn catch_unwind_test(
186+
name: String,
187+
f: impl Future<Output = tensile::Test<Error>>,
188+
) -> tensile::Test<Error> {
189+
std::panic::AssertUnwindSafe(f)
190+
.catch_unwind()
191+
.await
192+
.unwrap_or_else(|err| {
193+
let err = Error::from(
194+
err.downcast::<String>()
195+
.map(|s| *s)
196+
.or_else(|e| e.downcast::<&str>().map(|s| String::from(&s[..])))
197+
.unwrap_or_else(|_| "Unknown panic".to_string()),
198+
);
199+
tensile::test(name, Err(err))
200+
})
201+
}
202+
185203
async fn make_test<'t>(vm: &'t Thread, name: &str, filename: &Path) -> Result<TestCase, Error> {
186204
let text = fs::read_to_string(filename).await?;
187-
let (De(test), _) = vm.run_expr_async(&name, &text).await?;
205+
let (De(test), _) = std::panic::AssertUnwindSafe(vm.run_expr_async(&name, &text)).await?;
188206
Ok(test)
189207
}
190208

@@ -306,7 +324,7 @@ async fn run_doc_tests<'t>(
306324
.into_iter()
307325
.map(move |(test_name, test_source)| {
308326
let mut convert_test_fn = convert_test_fn.clone();
309-
async move {
327+
catch_unwind_test(test_name.clone(), async move {
310328
let vm = vm.new_thread().unwrap();
311329

312330
match vm
@@ -320,7 +338,7 @@ async fn run_doc_tests<'t>(
320338
tensile::test(test_name, || Err(err.0.into()))
321339
}
322340
}
323-
}
341+
})
324342
})
325343
.collect::<stream::FuturesOrdered<_>>()
326344
.collect()
@@ -366,15 +384,15 @@ async fn main_(options: &Opt) -> Result<(), Error> {
366384
let vm = vm.new_thread().unwrap();
367385

368386
let name2 = name.clone();
369-
pool.spawn_with_handle(async move {
387+
pool.spawn_with_handle(catch_unwind_test(name.clone(), async move {
370388
match make_test(&vm, &name, &filename).await {
371389
Ok(test) => test.into_tensile_test(),
372390
Err(err) => {
373391
let err = ::std::panic::AssertUnwindSafe(err);
374392
tensile::test(name2, || Err(err.0))
375393
}
376394
}
377-
})
395+
}))
378396
.expect("Could not spawn test future")
379397
})
380398
.collect::<stream::FuturesOrdered<_>>()
@@ -404,15 +422,15 @@ async fn main_(options: &Opt) -> Result<(), Error> {
404422
.filter_map(&filter_fn)
405423
.map(|(filename, name)| {
406424
let vm = vm.new_thread().unwrap();
407-
pool.spawn_with_handle(async move {
425+
pool.spawn_with_handle(catch_unwind_test(name.clone(), async move {
408426
match run_doc_tests(&vm, &name, &filename).await {
409427
Ok(tests) => tensile::group(name.clone(), tests),
410428
Err(err) => {
411429
let err = ::std::panic::AssertUnwindSafe(err);
412430
tensile::test(name.clone(), || Err(err.0))
413431
}
414432
}
415-
})
433+
}))
416434
.expect("Could not spawn test future")
417435
})
418436
.collect::<stream::FuturesOrdered<_>>()

vm/src/core/mod.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1544,9 +1544,7 @@ fn get_return_type(
15441544
.remove_forall()
15451545
.as_function()
15461546
.map(|t| Cow::Borrowed(t.1))
1547-
.unwrap_or_else(|| {
1548-
panic!("Unexpected type {} is not a function", function_type);
1549-
});
1547+
.ok_or_else(|| format!("Unexpected type {} is not a function", function_type))?;
15501548

15511549
get_return_type(env, &ret, arg_count - 1)
15521550
}

0 commit comments

Comments
 (0)