piske 0.1.2

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

use sindra::{Node, Identifier};

use piske::parse::{block, program};
use piske::ast::ast::*;

include!("macros.rs");

#[test]
fn test_block() {
    assert_eq!(block("4; 5"), Ok(Node::new(Block(vec![expr_stmt!(int!(4)), expr_stmt!(int!(5))]))));
    assert_eq!(block("4; 5;"), Ok(Node::new(Block(vec![expr_stmt!(int!(4)),
        expr_stmt!(int!(5))]))));
    assert_eq!(block("4 5;"), Ok(Node::new(Block(vec![expr_stmt!(int!(4)), expr_stmt!(int!(5))]))));
    assert_eq!(block("4 5"), Ok(Node::new(Block(vec![expr_stmt!(int!(4)), expr_stmt!(int!(5))]))));

    assert_eq!(block("4 + 5; let a = 4; 5"), Ok(Node::new(Block(vec![
        expr_stmt!(add!(int!(4), int!(5))),
        decl_stmt!(ident!(a), int!(4)),
        expr_stmt!(int!(5))
    ]))));

    assert_eq!(block("let a = 5; a = 4; a"), Ok(Node::new(Block(vec![
        decl_stmt!(ident!(a), int!(5)),
        assign_stmt!(ident!(a), int!(4)),
        expr_stmt!(ident_expr!(ident!(a)))
    ]))));
}

#[test]
fn test_program() {
    assert_eq!(program("let a = 5; a = 4; a"), Ok(Node::new(Program(Node::new(Block(vec![
        decl_stmt!(ident!(a), int!(5)),
        assign_stmt!(ident!(a), int!(4)),
        expr_stmt!(ident_expr!(ident!(a)))
    ]))))));
}

#[test]
fn test_multiline() {
    let prog = r#"
let a = 5;
a = 4;
a
    "#;
    assert_eq!(program(prog), Ok(Node::new(Program(Node::new(Block(vec![
        decl_stmt!(ident!(a), int!(5)),
        assign_stmt!(ident!(a), int!(4)),
        expr_stmt!(ident_expr!(ident!(a)))
    ]))))));
}