piske 0.1.2

The piske programming langauge for generative art
Documentation
extern crate piske;

use piske::parse::program;
use piske::visitor::{State, SymbolDefineVisitor, TypeComputationVisitor, EvaluateVisitor};
use piske::value::Value;

fn expect_prog(prog: &str, val: Value) {
    let ast = program(prog).unwrap();
    let mut state = State::default();
    SymbolDefineVisitor::visit(&ast, &mut state).unwrap();
    TypeComputationVisitor::visit(&ast, &mut state).unwrap();
    let evaluated = EvaluateVisitor::visit(&ast, &mut state);
    assert_eq!(evaluated, Ok(val));
}

#[test]
fn test_interval_integer() {
    let prog = r#"
let a = 0;
iterate over [0, 10) {
    a = a + 1;
}
a
    "#;

    expect_prog(prog, Value::Int(10));

    let prog = r#"
let a = 0;
iterate over [0, 10] {
    a = a + 1;
}
a
    "#;

    expect_prog(prog, Value::Int(11));


    let prog = r#"
let a = 0;
iterate i = [1, 11) {
    a = a + i;
}
a
    "#;

    expect_prog(prog, Value::Int(10 * 11 / 2));

    let prog = r#"
let a = 0;
iterate i = [1, 10] {
    a = a + i;
}
a
    "#;

    expect_prog(prog, Value::Int(10 * 11 / 2));

}

#[test]
fn test_break() {

    let prog = r#"
let a = 0;
let b = iterate i = [1, 10) {
    a = a + i;
    i
}
b
    "#;

    expect_prog(prog, Value::Int(9));

    let prog = r#"
let a = iterate i = [1, 100) {
    if i > 50 {
        break 101;
    }
    i
}
a
    "#;

    expect_prog(prog, Value::Int(101));

    let prog = r#"
let a = iterate i = [1, 50] {
    if i > 50 {
        break 101;
    }
    i
}
a
    "#;

    expect_prog(prog, Value::Int(50));

}