algorithmify 0.1.1

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

#[test]
pub fn test_for_loop() {
    #[define_function_builder]
    fn for_loop() -> usize {
        let mut acc = 10;

        for i in 1..10 {
            acc = acc + i;
        }

        acc
    }

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

    assert_eq!(for_loop(), 55);
    assert_eq!(expression, 55i64.into());
}

#[test]
pub fn test_for_loop_variable_bounds() {
    #[define_function_builder]
    fn for_loop() -> usize {
        let mut acc = 10;
        let start = 1;
        let end = 10;

        for i in start..end {
            acc = acc + i;
        }

        acc
    }

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

    assert_eq!(for_loop(), 55);
    assert_eq!(expression, 55i64.into());
}

#[test]
pub fn test_for_loop_variable_reassignment() {
    #[allow(unused_assignments)]
    #[define_function_builder]
    fn for_loop() -> usize {
        let i = 1;

        for mut i in 1..10 {
            i = i * 2;
        }

        i
    }

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

    assert_eq!(for_loop(), 1);
    assert_eq!(expression, 1.into());
}

#[test]
pub fn test_while_loop() {
    #[define_function_builder]
    fn while_loop() -> usize {
        let mut acc = 1;

        while acc < 10 {
            acc = acc + 1;
        }

        acc
    }

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

    assert_eq!(while_loop(), 10);
    assert_eq!(expression, 10.into());
}