libninja_macro 0.1.0

Macros for inline code
Documentation
use pretty_assertions::assert_eq;

use libninja_macro::function;
use mir::{Function, Visibility};

#[test]
fn test_function() {
    let s: Function<String> = function!(async main() {});
    assert_eq!(s.name.0, "main");
    assert_eq!(s.is_async, true);
    assert_eq!(s.vis, Visibility::Private);
}

#[test]
fn test_function_args() {
    let s: Function<String> = function!(print_repeated(s: str, n: int) {});
    assert_eq!(s.name.0, "print_repeated");
    assert_eq!(s.is_async, false);
    assert_eq!(s.vis, Visibility::Private);
    assert_eq!(s.args.len(), 2);
    assert_eq!(s.args[0].ident().unwrap(), "s");
    assert_eq!(s.args[0].ty().unwrap(), "str");
    assert_eq!(s.args[1].ident().unwrap(), "n");
    assert_eq!(s.args[1].ty().unwrap(), "int");
    assert_eq!(s.ret, "".to_string());
}

#[test]
fn test_function_return() {
    let s: Function<String> = function!(add(a: int, b: int) -> int {});
    assert_eq!(s.name.0, "add");
    assert_eq!(s.is_async, false);
    assert_eq!(s.vis, Visibility::Private);
    assert_eq!(s.args.len(), 2);
    assert_eq!(s.ret, "int".to_string());
}

#[test]
fn test_interpolation_in_arg_position() {
    let z = "int";
    let s: Function<String> = function!(add(a: int, b: #z) -> int {});
    assert_eq!(s.name.0, "add");
    assert_eq!(s.is_async, false);
    assert_eq!(s.vis, Visibility::Private);
    assert_eq!(s.args.len(), 2);
    assert_eq!(s.args[1].ty().unwrap(), "int");
    assert_eq!(s.ret, "int".to_string());
}

#[test]
fn test_interpolation_in_ret_position() {
    let z = "int";
    let s: Function<String> = function!(add(a: int, b: int) -> #z {});
    assert_eq!(s.ret, "int");
}

#[test]
fn test_interpolation_in_name_position() {
    let z = "main";
    let s: Function<String> = function!(#z(a: int, b: int) {});
    assert_eq!(s.name.0, z);
}

#[test]
fn test_function_stringified_body() {
    let s: Function<String> = function!(debug_add(a: int, b: int) -> int {
        print(a);
        print(b);
        a + b;
    });
    assert_eq!(s.name.0, "debug_add");
    assert_eq!(
        s.body,
        "\
print(a)
print(b)
a + b\
"
        .to_string()
    );
}

#[test]
fn test_use_body_variable() {
    let s: Function<String> = function!(debug_add(a: int, b: int) -> int {
        print(a);
        print(b);
        a + b;
    });
    assert_eq!(s.name.0, "debug_add");
    assert_eq!(
        s.body,
        "\
print(a)
print(b)
a + b\
"
        .to_string()
    );
}