lamcal 0.4.0

A lambda calculus parser and interpreter
Documentation
use super::*;

mod bitand_stop {

    use super::*;

    #[test]
    fn no_and_no_returns_no() {
        assert_eq!(Stop::No & Stop::No, Stop::No);
    }

    #[test]
    fn yes_and_no_returns_no() {
        assert_eq!(Stop::Yes & Stop::No, Stop::No);
    }

    #[test]
    fn no_and_yes_returns_no() {
        assert_eq!(Stop::No & Stop::Yes, Stop::No);
    }

    #[test]
    fn yes_and_yes_returns_yes() {
        assert_eq!(Stop::Yes & Stop::Yes, Stop::Yes);
    }
}

mod bitor_stop {

    use super::*;

    #[test]
    fn no_and_no_returns_no() {
        assert_eq!(Stop::No | Stop::No, Stop::No);
    }

    #[test]
    fn yes_and_no_returns_yes() {
        assert_eq!(Stop::Yes | Stop::No, Stop::Yes);
    }

    #[test]
    fn no_and_yes_returns_yes() {
        assert_eq!(Stop::No | Stop::Yes, Stop::Yes);
    }

    #[test]
    fn yes_and_yes_returns_yes() {
        assert_eq!(Stop::Yes | Stop::Yes, Stop::Yes);
    }
}

mod limit {

    use super::*;

    use term::any_term;

    proptest! {

        #[test]
        fn calling_inspect_any_times_below_the_limit_returns_dont_stop(
            number in (1..=::std::u32::MAX),
            term in any_term(),
        ) {
            let mut limit = Limit { limit: number, count: number - 1 };

            let stop = limit.inspect(&term);

            prop_assert_eq!(stop, Stop::No);
        }

        #[test]
        fn calling_inspect_when_the_limit_is_reached_it_returns_stop(
            number in (0..=::std::u32::MAX),
            term in any_term(),
        ) {
            let mut limit = Limit { limit: number, count: number };

            let stop = limit.inspect(&term);

            prop_assert_eq!(stop, Stop::Yes);
        }
    }
}

mod trace {

    use super::*;

    use reduction::{Enumerate, NormalOrder};
    use term::{any_term, app, lam, var};

    proptest! {

        #[test]
        fn calling_inspect_with_any_term_always_returns_dont_stop(
            term in any_term(),
        ) {
            let mut trace = Trace::new(|_to_trace| ());

            let stop = trace.inspect(&term);

            prop_assert_eq!(stop, Stop::No);
        }
    }

    #[test]
    fn reduction_of_expression_1() {
        let mut term = app(
            lam("x", app(lam("y", app(var("x"), var("y"))), var("z"))),
            var("a"),
        );

        term.reduce_inspected::<NormalOrder<Enumerate>, _>(&mut Trace::new(|to_reduce| {
            println!("reducing: {}", to_reduce)
        }));
    }
}

mod collect {

    use super::*;

    use term::any_term;

    proptest! {

        #[test]
        fn calling_inspect_with_any_term_always_returns_dont_stop(
            term in any_term(),
        ) {
            let mut collect = Collect::default();

            let stop = collect.inspect(&term);

            prop_assert_eq!(stop, Stop::No);
        }
    }
}