nar 0.0.8

Narc, a dependently-typed programming language with dependent pattern matching
Documentation
use crate::syntax::surf::{parse_expr_err_printed, parse_str_err_printed};

macro_rules! success {
    ($str:literal) => {
        parse_str_err_printed($str)
            .map(|ast| println!("{:?}", ast))
            .unwrap();
    };
}

macro_rules! success_expr {
    ($str:literal) => {
        parse_expr_err_printed($str)
            .map(|ast| println!("{:?}", ast))
            .unwrap();
    };
}

#[test]
fn definition_parse() {
    success!("");
    success!("definition test : Type;");
    success!("definition test : a b;");
    success!("definition test : a $ b c;");
}

#[test]
fn data_parse() {
    success!("data empty {};");
    success!("data unit { constructor tt; };");
    success!("data test tele {};");
    success!("data test tele { constructor tt tele; };");
    success!("data test (x : tele) { constructor tt (y : x); };");
}

#[test]
fn codata_parse() {
    success!("codata unit {};");
    success!("codata unit2 { projection tt : unit; };");
    success!("codata test tele {};");
    success!("codata test tele { projection tt : tele; };");
    success!("codata test (x : tele) { projection tt : (y : x) -> y; };");
}

#[test]
fn expr_parse() {
    success_expr!("Type");
    success_expr!("a b");
    success_expr!("a $ b c");
}

#[test]
fn clause_parse() {
    success!("");
    success!("clause test = Type;");
    success!("clause test .a = a;");
    success!("clause test a = a;");
    success!("clause test (a b) = b;");
    success!("clause test |_a b_| = b;");
    success!("clause test |_a b_| c = b;");
    success!("clause test |_a b_| (c d) = b;");
    success!("clause test |_a b_| .c = b;");
    success!("clause test |_a b_| .c (c d) = b;");
    success!("clause test .e |_a b_| .c (c d) = b;");
}