use pgrx::pg_sys::panic::CaughtError;
use pgrx::prelude::*;
use proptest::strategy::Strategy;
use proptest::test_runner::{TestCaseError, TestCaseResult, TestError, TestRunner};
use std::panic::AssertUnwindSafe;
#[derive(Default)]
pub struct PgTestRunner(TestRunner);
impl PgTestRunner {
pub fn run<S: Strategy>(
&mut self,
strategy: &S,
test: impl Fn(S::Value) -> TestCaseResult,
) -> Result<(), TestError<<S as Strategy>::Value>> {
self.0.run(strategy, |value| {
PgTryBuilder::new(AssertUnwindSafe(|| test(value)))
.catch_others(|err| match err {
CaughtError::PostgresError(err)
| CaughtError::ErrorReport(err)
| CaughtError::RustPanic { ereport: err, .. } => {
Err(TestCaseError::Fail(err.message().to_owned().into()))
}
})
.execute()
})
}
}