algorithmify 0.1.1

Create specifications for algorithms defined using Rust code
Documentation
use algorithmify::{Expression, Interpreter};
use algorithmify_macros::define_function_builder;

#[test]
fn addition_test() {
    #[define_function_builder]
    fn addition() -> i32 {
        let mut a = 1;
        a = a + 2;
        a
    }

    let expression = Interpreter::execute_function(addition__function_builder()).unwrap();

    assert_eq!(addition(), 3);
    assert_eq!(expression, 3.into());
}

#[test]
fn substraction_test() {
    #[define_function_builder]
    fn substraction() -> i32 {
        let mut a = 6;
        a = a - 2;
        a
    }

    let expression = Interpreter::execute_function(substraction__function_builder()).unwrap();

    assert_eq!(substraction(), 4);
    assert_eq!(expression, 4.into());
}

#[test]
fn multiplication_test() {
    #[define_function_builder]
    fn multiplication() -> i32 {
        let mut a = 3;
        a = a * 2;
        a
    }

    let expression = Interpreter::execute_function(multiplication__function_builder()).unwrap();

    assert_eq!(multiplication(), 6);
    assert_eq!(expression, 6.into());
}

#[test]
fn division_test() {
    #[define_function_builder]
    fn division() -> i32 {
        let mut a = 6;
        a = a / 2;
        a
    }

    let expression = Interpreter::execute_function(division__function_builder()).unwrap();

    assert_eq!(division(), 3);
    assert_eq!(expression, 3.into());
}

#[test]
fn parametherized_expression_test() {
    #[define_function_builder]
    fn parametherized_expression() -> i32 {
        let mut a = 6;
        a = 3 + ((a / 2) * 2) + 3;
        a
    }

    let expression =
        Interpreter::execute_function(parametherized_expression__function_builder()).unwrap();

    assert_eq!(parametherized_expression(), 12);
    assert_eq!(expression, 12.into());
}

#[test]
fn operator_precedence_test() {
    #[define_function_builder]
    fn operator_precedence() -> i32 {
        let mut a = 6;
        a = 3 + a / 2 * 2 + 3;
        a
    }

    let expression =
        Interpreter::execute_function(operator_precedence__function_builder()).unwrap();

    assert_eq!(operator_precedence(), 12);
    assert_eq!(expression, 12.into());
}

#[test]
fn boolean_logic_test() {
    #[define_function_builder]
    fn boolean_logic_true() -> bool {
        let a = 6;
        let eq = a == 6;
        let ne = a != 5;
        let cmp = 23 > 6 && 11 < 23 && 5 <= 6 && 5 >= 3;

        (eq && ne && cmp) || false
    }

    let expression = Interpreter::execute_function(boolean_logic_true__function_builder()).unwrap();

    assert_eq!(boolean_logic_true(), true);
    assert_eq!(expression, Expression::Bool(true));

    #[define_function_builder]
    fn boolean_logic_false() -> bool {
        let a = 6;
        let eq = a == 6;
        let ne = a != 6;
        let cmp = 23 > 6 && 11 < 23 && 5 <= 6 && 5 >= 3;

        (eq && ne && cmp) || false
    }

    let expression =
        Interpreter::execute_function(boolean_logic_false__function_builder()).unwrap();

    assert_eq!(boolean_logic_false(), false);
    assert_eq!(expression, Expression::Bool(false));
}