From bb7719d6d050d7bf957f0df7a78e6c74b1c9615b Mon Sep 17 00:00:00 2001 From: Andreas Grois Date: Sat, 18 Mar 2023 22:05:20 +0100 Subject: First few integration tests: trivial types --- tests/with_lifetimes.rs | 60 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 tests/with_lifetimes.rs (limited to 'tests/with_lifetimes.rs') diff --git a/tests/with_lifetimes.rs b/tests/with_lifetimes.rs new file mode 100644 index 0000000..2e87878 --- /dev/null +++ b/tests/with_lifetimes.rs @@ -0,0 +1,60 @@ +//! Test for the case that the Functor the Free Monad is based on has lifetime parameters that do not depend on the +//! lifetime of the mapping function in the Functor implementation. + +use higher_free_macro::free; +use higher::{Functor, Bind, Apply}; + +#[derive(Functor, Clone)] +struct WithLifetimes<'a,'b, A>{ + s1 : &'a str, + s2 : &'b str, + next : A +} + +free!(FreeWithLifetimes<'a,'b,A>, WithLifetimes<'a,'b,FreeWithLifetimes<'a,'b,A>>); + +fn lifetime_helper<'a,'b>(s1 : &'a str, s2 : &'b str) -> FreeWithLifetimes<'a, 'b, u32>{ + let fv = FreeWithLifetimes::lift_f(WithLifetimes{ s1, s2, next: 15}); + fv.fmap(|x| x+1) +} + +#[test] +fn test_with_lifetimes(){ + let s1 = "First"; + let s2 = "Second"; + let fv = lifetime_helper(s1, s2); + let s3 = "Third"; + let s4 = "Fourth"; + let fv = fv.bind(|x| FreeWithLifetimes::lift_f(WithLifetimes{ s1: s3, s2: s4, next : x+2})); + let s5 = "Fifth"; + let s6 = "Sixth"; + let fa = FreeWithLifetimes::lift_f(WithLifetimes{s1: s5, s2: s6, next : (|x| x+3).into()}); + let fv = fv.apply(fa); + match fv { + FreeWithLifetimes::Free(v) => { + assert_eq!(v.s1, s5); + assert_eq!(v.s2, s6); + match v.next { + FreeWithLifetimes::Free(v) => { + assert_eq!(v.s1, s1); + assert_eq!(v.s2, s2); + match v.next { + FreeWithLifetimes::Free(v) => { + assert_eq!(v.s1, s3); + assert_eq!(v.s2, s4); + match v.next { + FreeWithLifetimes::Free(_) => unreachable!(), + FreeWithLifetimes::Pure(a) => { + assert_eq!(a, 21); + }, + } + }, + FreeWithLifetimes::Pure(_) => unreachable!(), + } + }, + FreeWithLifetimes::Pure(_) => unreachable!(), + } + }, + FreeWithLifetimes::Pure(_) => unreachable!() + } +} \ No newline at end of file -- cgit v1.2.3