blob: f41f9ce4a8bfd3088abdc0e04391b4bbe36e0104 [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 Crichton605643b2017-07-05 18:35:14 -070033 tt(TokenNode::Literal(Literal::i32(1))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070034 tt(TokenNode::Op('+', Spacing::Alone)),
35 tt(TokenNode::Group(Delimiter::None, vec![
Alex Crichton605643b2017-07-05 18:35:14 -070036 tt(TokenNode::Literal(Literal::i32(2))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070037 tt(TokenNode::Op('+', Spacing::Alone)),
Alex Crichton605643b2017-07-05 18:35:14 -070038 tt(TokenNode::Literal(Literal::i32(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)),
Alex Crichton605643b2017-07-05 18:35:14 -070041 tt(TokenNode::Literal(Literal::i32(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 {
Alex Crichton605643b2017-07-05 18:35:14 -070047 left: Box::new(lit(Literal::i32(1))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040048 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 {
Alex Crichton605643b2017-07-05 18:35:14 -070053 left: Box::new(lit(Literal::i32(2))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040054 op: BinOp::Add(tokens::Add::default()),
Alex Crichton605643b2017-07-05 18:35:14 -070055 right: Box::new(lit(Literal::i32(3))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040056 })),
57 })),
58 op: BinOp::Mul(tokens::Star::default()),
Alex Crichton605643b2017-07-05 18:35:14 -070059 right: Box::new(lit(Literal::i32(4))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040060 })),
61 }));
62}
63
64#[test]
65fn test_invalid_grouping() {
66 let raw: TokenStream = vec![
Alex Crichton605643b2017-07-05 18:35:14 -070067 tt(TokenNode::Literal(Literal::i32(1))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070068 tt(TokenNode::Op('+', Spacing::Alone)),
69 tt(TokenNode::Group(Delimiter::None, vec![
Alex Crichton605643b2017-07-05 18:35:14 -070070 tt(TokenNode::Literal(Literal::i32(2))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070071 tt(TokenNode::Op('+', Spacing::Alone)),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040072 ].into_iter().collect())),
Alex Crichton605643b2017-07-05 18:35:14 -070073 tt(TokenNode::Literal(Literal::i32(3))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070074 tt(TokenNode::Op('*', Spacing::Alone)),
Alex Crichton605643b2017-07-05 18:35:14 -070075 tt(TokenNode::Literal(Literal::i32(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 {
Alex Crichton605643b2017-07-05 18:35:14 -070082 left: Box::new(lit(Literal::i32(1))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040083 op: BinOp::Add(tokens::Add::default()),
Alex Crichton605643b2017-07-05 18:35:14 -070084 right: Box::new(lit(Literal::i32(2))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040085 })),
86 op: BinOp::Add(tokens::Add::default()),
87 right: Box::new(expr(ExprBinary {
Alex Crichton605643b2017-07-05 18:35:14 -070088 left: Box::new(lit(Literal::i32(3))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040089 op: BinOp::Mul(tokens::Star::default()),
Alex Crichton605643b2017-07-05 18:35:14 -070090 right: Box::new(lit(Literal::i32(4))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040091 })),
92 }));
93}