libslide 0.0.1

Library for slide, a static expression optimizer.
Documentation
#![allow(unused_macros)]
macro_rules! __parse {
    ($parser:ident, $inout:expr) => {
        let inout: Vec<&str> = $inout.split(" => ").collect();
        let pin = inout[0];
        let pout = if inout.len() > 1 {
            inout[1].to_owned()
        } else {
            pin.to_owned()
        };
        let tokens = scan(pin).tokens;
        let (parsed, _) = $parser(tokens);
        assert_eq!(parsed.to_string(), pout);
    };
}

macro_rules! common_parser_tests {
    ($($name:ident: $inout:expr)*) => {
    $(
        #[test]
        fn $name() {
            use crate::scanner::{scan};
            use crate::parser::{parse_expression, parse_expression_pattern};

            __parse!(parse_expression, $inout);
            __parse!(parse_expression_pattern, $inout);
        }
    )*
    }
}

macro_rules! parser_tests {
    ($parser:ident $($name:ident: $program:expr)*) => {
    $(
        #[test]
        fn $name() {
            use crate::scanner::{scan};
            use crate::parser::{$parser};

            __parse!($parser, $program);
        }
    )*
    }
}

macro_rules! parser_error_tests {
    ($parser:ident $($name:ident: $program:expr => $error:expr)*) => {
    $(
        #[test]
        fn $name() {
            use crate::scanner::{scan};
            use crate::parser::{$parser};

            let tokens = scan($program).tokens;
            let (_, errors) = $parser(tokens);
            assert_eq!(errors.join("\n"), $error);
        }
    )*
    }
}