cgp-tests 0.5.0-beta

Context-generic programming meta crate
Documentation
use cgp::extra::handler::PipeHandlers;
use cgp::extra::monad::monadic::err::{BindErr, ErrMonadic};
use cgp::extra::monad::monadic::ident::IdentMonadic;
use cgp::extra::monad::providers::PipeMonadic;
use cgp::prelude::*;

#[cgp_computer]
pub fn increment(value: u8) -> Result<u8, &'static str> {
    value.checked_add(1).ok_or("overflow")
}

#[test]
fn test_increment() {
    let context = ();
    let code = PhantomData::<()>;

    assert_eq!(Increment::compute(&context, code, 1), Ok(2));
    assert_eq!(Increment::compute(&context, code, 255), Err("overflow"));

    assert_eq!(
        PipeHandlers::<Product![Increment, BindErr<IdentMonadic, Increment>]>::compute(
            &context, code, 1,
        ),
        Ok(3),
    );

    assert_eq!(
        PipeHandlers::<Product![Increment, BindErr<IdentMonadic, Increment>]>::compute(
            &context, code, 254,
        ),
        Err("overflow"),
    );

    assert_eq!(
        PipeMonadic::<ErrMonadic, Product![Increment]>::compute(&context, code, 1),
        Ok(2),
    );

    assert_eq!(
        PipeMonadic::<ErrMonadic, Product![Increment]>::compute(&context, code, 255),
        Err("overflow"),
    );

    assert_eq!(
        PipeMonadic::<ErrMonadic, Product![Increment, Increment, Increment]>::compute(
            &context, code, 253
        ),
        Err("overflow"),
    );
}