rill-lang 0.6.0-M2

rill-lang — a Faust-style functional streaming DSL compiled to rill Algorithm<T>
Documentation
use rill_lang::ast::Expr;
use rill_lang::lexer;
use rill_lang::parser;

fn parse_str(src: &str) -> Result<rill_lang::ast::Program, rill_lang::CompileError> {
    let tokens = lexer::tokenize(src).unwrap();
    parser::parse(&tokens, src.as_bytes())
}

#[test]
fn parses_main_with_where() {
    let prg = parse_str("main = myFilter : _ where { myFilter = _ : sin 440.0; }").unwrap();
    let main = prg.main_def().unwrap();
    assert_eq!(main.where_defs().len(), 1);
}

#[test]
fn parses_main_with_where_layout() {
    let prg =
        parse_str("main = myFilter : _ where\n    myFilter = _ : sin 440.0;\n    gain = _ * 0.5\n")
            .unwrap();
    let main = prg.main_def().unwrap();
    assert_eq!(main.where_defs().len(), 2);
    assert_eq!(main.where_defs()[0].name(), "myFilter");
    assert_eq!(main.where_defs()[1].name(), "gain");
}

#[test]
fn parses_main_simple() {
    let prg = parse_str("main = _ : _").unwrap();
    let main = prg.main_def().unwrap();
    assert!(matches!(main.body(), Expr::Bin { .. }));
}

#[test]
fn empty_program_is_rejected() {
    assert!(parse_str("").is_err());
}

#[test]
fn parses_top_level_multi_def() {
    let prg = parse_str("sq x = x * x; main = sq 0.5").unwrap();
    assert_eq!(prg.defs.len(), 2);
}

#[test]
fn parses_let_expression() {
    let prg = parse_str("main = let g = _ * 0.5 in g").unwrap();
    let main = prg.main_def().unwrap();
    assert!(matches!(main.body(), Expr::Let { .. }));
}