Skip to content

Commit

Permalink
Unit test for collect_vars
Browse files Browse the repository at this point in the history
cc #4
  • Loading branch information
nrc committed Jan 4, 2019
1 parent 9b29ac7 commit 545c143
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 3 deletions.
6 changes: 3 additions & 3 deletions macros/src/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ crate enum RepeatKind {
ZeroOrOne,
}

#[derive(Copy, Clone, Debug)]
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
crate enum Type {
Item,
Block,
Expand All @@ -64,13 +64,13 @@ crate enum Type {
Literal,
}

#[derive(Debug, Clone)]
#[derive(Debug, Clone, Eq, PartialEq)]
crate struct MetaVar {
crate name: Ident,
crate ty: MetaVarType,
}

#[derive(Debug, Clone)]
#[derive(Debug, Clone, Eq, PartialEq)]
crate enum MetaVarType {
Vec(Box<MetaVarType>),
Option(Box<MetaVarType>),
Expand Down
59 changes: 59 additions & 0 deletions macros/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,62 @@ fn collect_vars(rule: &ast::SubRule, vars: &mut Vec<ast::MetaVar>) {
}
}
}

#[cfg(test)]
mod test {
use super::*;
use crate::ast::*;
use syn::Ident;
use proc_macro2::Span;

#[test]
fn test_collect_vars() {
fn run_test(rule: ast::SubRule, expected: Vec<MetaVar>) {
let mut result = vec![];
collect_vars(&rule, &mut result);
assert_eq!(result, expected);
}

// ``
let ast = ast::SubRule {
matchers: vec![],
};
run_test(ast, vec![]);

// `$foo:vis`
let ast = ast::SubRule {
matchers: vec![Fragment::Var(Ident::new("foo", Span::call_site()), Type::Vis)],
};
run_test(ast, vec![MetaVar {
name: Ident::new("foo", Span::call_site()),
ty: MetaVarType::T(Type::Vis),
}]);

// `foo`
let ast = ast::SubRule {
matchers: vec![Fragment::Ident(Ident::new("foo", Span::call_site()))],
};
run_test(ast, vec![]);

// `foo $bar:Tt $($foo:expr)*`
let ast = ast::SubRule {
matchers: vec![
Fragment::Ident(Ident::new("foo", Span::call_site())),
Fragment::Var(Ident::new("bar", Span::call_site()), Type::Tt),
Fragment::Repeat(SubRule {
matchers: vec![Fragment::Var(Ident::new("foo", Span::call_site()), Type::Expr)],
}, RepeatKind::OneOrMore),
],
};
run_test(ast, vec![
MetaVar {
name: Ident::new("bar", Span::call_site()),
ty: MetaVarType::T(Type::Tt),
},
MetaVar {
name: Ident::new("foo", Span::call_site()),
ty: MetaVarType::Vec(Box::new(MetaVarType::T(Type::Expr))),
},
]);
}
}

0 comments on commit 545c143

Please sign in to comment.