diff --git a/src/func/instances/tryfuture.rs b/src/func/instances/tryfuture.rs index 6b93311..89b1783 100644 --- a/src/func/instances/tryfuture.rs +++ b/src/func/instances/tryfuture.rs @@ -202,3 +202,58 @@ impl<'a> MonadFailAny<'a> for FutureFailAny { }) } } + +#[cfg(test)] +mod tryfuture_tests { + use std::sync::Arc; + + use crate::func::{applicative_select::Selected, tests::Eqr, ApplicativeSelect}; + + use super::{test_suite, tests, TryFutureInstance}; + + type T = TryFutureInstance; + + impl<'a> Eqr<'a> for T { + fn eqr( + name: &'a str, + left: Self::F, + right: Self::F, + ) -> tests::R { + tests::eqr( + name, + futures::executor::block_on(left), + futures::executor::block_on(right), + ) + } + } + + impl<'a> test_suite::FunctorTestSuite<'a> for T { + fn sample>>)>( + mut f: F, + ) { + f(Arc::new(|a| Box::pin(futures::future::ready(Ok(a))))); + f(Arc::new(|_| Box::pin(futures::future::ready(Err(0))))); + f(Arc::new(|_| Box::pin(futures::future::ready(Err(1))))); + f(Arc::new(|_| Box::pin(futures::future::ready(Err(2))))); + f(Arc::new(|_| Box::pin(futures::future::ready(Err(3))))); + } + } + + #[test] + fn monad_follows_laws() { + test_suite::monad_follows_laws::().unwrap(); + } + + #[test] + fn select_second() { + match futures::executor::block_on(T::select( + Box::pin(futures::future::pending::>()), + Box::pin(futures::future::ready(Ok(2))), + )) + .unwrap() + { + Selected::A(_, _) => panic!("first future ready"), + Selected::B(_, b) => assert_eq!(b, 2), + } + } +}