blob: b8e67ddb1d9a24204f8290b90bafc886082a815a [file] [log] [blame]
Michael Layzellbe1e24d2017-06-04 21:15:23 -04001#![cfg(all(feature = "extra-traits", feature = "full"))]
2
3extern crate syn;
4use syn::{Expr, ExprKind, ExprGroup, ExprBinary, Lit, LitKind, BinOp};
5
6extern crate synom;
7use synom::{tokens, Synom};
8
9extern crate proc_macro2;
10use proc_macro2::*;
11
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070012fn tt(k: TokenNode) -> TokenTree {
Michael Layzellbe1e24d2017-06-04 21:15:23 -040013 TokenTree {
14 span: Span::default(),
15 kind: k,
16 }
17}
18
19fn expr<T: Into<ExprKind>>(t: T) -> Expr {
20 t.into().into()
21}
22
23fn lit<T: Into<Literal>>(t: T) -> Expr {
24 expr(Lit {
25 value: LitKind::Other(t.into()),
26 span: syn::Span::default(),
27 })
28}
29
30#[test]
31fn test_grouping() {
32 let raw: TokenStream = vec![
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070033 tt(TokenNode::Literal(Literal::from(1))),
34 tt(TokenNode::Op('+', Spacing::Alone)),
35 tt(TokenNode::Group(Delimiter::None, vec![
36 tt(TokenNode::Literal(Literal::from(2))),
37 tt(TokenNode::Op('+', Spacing::Alone)),
38 tt(TokenNode::Literal(Literal::from(3))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040039 ].into_iter().collect())),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070040 tt(TokenNode::Op('*', Spacing::Alone)),
41 tt(TokenNode::Literal(Literal::from(4))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040042 ].into_iter().collect();
43
44 assert_eq!(raw.to_string(), "1i32 + 2i32 + 3i32 * 4i32");
45
46 assert_eq!(Expr::parse_all(raw).unwrap(), expr(ExprBinary {
47 left: Box::new(lit(1)),
48 op: BinOp::Add(tokens::Add::default()),
49 right: Box::new(expr(ExprBinary {
50 left: Box::new(expr(ExprGroup {
51 group_token: tokens::Group::default(),
52 expr: Box::new(expr(ExprBinary {
53 left: Box::new(lit(2)),
54 op: BinOp::Add(tokens::Add::default()),
55 right: Box::new(lit(3)),
56 })),
57 })),
58 op: BinOp::Mul(tokens::Star::default()),
59 right: Box::new(lit(4)),
60 })),
61 }));
62}
63
64#[test]
65fn test_invalid_grouping() {
66 let raw: TokenStream = vec![
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070067 tt(TokenNode::Literal(Literal::from(1))),
68 tt(TokenNode::Op('+', Spacing::Alone)),
69 tt(TokenNode::Group(Delimiter::None, vec![
70 tt(TokenNode::Literal(Literal::from(2))),
71 tt(TokenNode::Op('+', Spacing::Alone)),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040072 ].into_iter().collect())),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070073 tt(TokenNode::Literal(Literal::from(3))),
74 tt(TokenNode::Op('*', Spacing::Alone)),
75 tt(TokenNode::Literal(Literal::from(4))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040076 ].into_iter().collect();
77
78 assert_eq!(raw.to_string(), "1i32 + 2i32 + 3i32 * 4i32");
79
80 assert_eq!(Expr::parse_all(raw).unwrap(), expr(ExprBinary {
81 left: Box::new(expr(ExprBinary {
82 left: Box::new(lit(1)),
83 op: BinOp::Add(tokens::Add::default()),
84 right: Box::new(lit(2)),
85 })),
86 op: BinOp::Add(tokens::Add::default()),
87 right: Box::new(expr(ExprBinary {
88 left: Box::new(lit(3)),
89 op: BinOp::Mul(tokens::Star::default()),
90 right: Box::new(lit(4)),
91 })),
92 }));
93}