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_if() {
    let prog = r#"
let a = 5;
if true {
    a = 10;
}
a
    "#;

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

#[test]
fn test_cond() {
    expect_prog(r#"let a = 5; a == 5"#, Value::Boolean(true));
    expect_prog(r#"let a = 5.0; a == 5.0"#, Value::Boolean(true));
    expect_prog(r#"let a = 5.001; a >= 5"#, Value::Boolean(true));
    expect_prog(r#"let a = 5.001; a <= 5"#, Value::Boolean(false));
}

#[test]
fn test_if_cond() {
    let prog = r#"
let a = 5;
if a < 10 {
    a = 10;
}
if a > 10 {
    a = 15;
}
a
    "#;

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

#[test]
fn test_ifelse() {
    let prog = r#"
let a = 10;
if a < 10 {
    a = 5
} else {
    a = 100
}
a
    "#;

    expect_prog(prog, Value::Int(100));
}

#[test]
fn test_if_expr() {
    let prog = r#"
let a = 5.0;
let b = if a < 5.1 {
    100
} else {
    10
}
b
    "#;
    expect_prog(prog, Value::Int(100));
}