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::statement;
use piske::ast::ast::*;
use piske::value::Value;

mod test_utils;
use test_utils::*;

include!("macros.rs");

#[test]
fn test_expr_stmt() {
    assert_eq!(statement("2 + 3"), Ok(Node::new(Statement::Expression(add!(int!(2), int!(3))))));
    assert_eq!(statement("2 + 3;"), Ok(Node::new(Statement::Expression(add!(int!(2), int!(3))))));
    assert_eq!(statement("2 + 3 ;"), Ok(Node::new(Statement::Expression(add!(int!(2), int!(3))))));
    assert_eq!(statement("2 + 3 ; "), Ok(Node::new(Statement::Expression(add!(int!(2), int!(3))))));
    assert_eq!(statement("3;"), Ok(Node::new(Statement::Expression(int!(3)))));
    assert_eq!(statement("3 ;"), Ok(Node::new(Statement::Expression(int!(3)))));
    assert_eq!(statement("3 ; "), Ok(Node::new(Statement::Expression(int!(3)))));
    assert_eq!(statement("3"), Ok(Node::new(Statement::Expression(int!(3)))));
}

#[test]
fn test_decl_stmt() {
    assert_eq!(statement("let a = 4;"), Ok(Node::new(Statement::Declare(ident!(a), int!(4)))));
}

#[test]
fn test_assign_stmt() {
    assert_eq!(statement("a = 3"), Ok(Node::new(Statement::Assign(ident!(a), int!(3)))));
}

#[test]
fn test_print() {
    let (mut state, tempfile) = new_state_with_temp_output();
    let prog = r#"
print 5;
    "#;
    expect_prog_with_state(prog, Value::Empty, &mut state);
    test_output(&tempfile, "5\n");

    let (mut state, tempfile) = new_state_with_temp_output();
    let prog = r#"
let hello = "hello, world!";
print hello;
    "#;
    expect_prog_with_state(prog, Value::Empty, &mut state);
    test_output(&tempfile, "hello, world!\n");

    let (mut state, tempfile) = new_state_with_temp_output();
    let prog = r#"
let hello = "hello, world!";
print hello, " hello!";
    "#;
    expect_prog_with_state(prog, Value::Empty, &mut state);
    test_output(&tempfile, "hello, world! hello!\n");


    let (mut state, tempfile) = new_state_with_temp_output();
    let prog = r#"
print "hello, world!";
    "#;
    expect_prog_with_state(prog, Value::Empty, &mut state);
    test_output(&tempfile, "hello, world!\n");

}