blob: d0104622ab660ccab0fd85264f30a57514d4b93b [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;
David Tolnayc7a5d3d2017-06-04 12:11:05 -07007use synom::tokens;
Michael Layzellbe1e24d2017-06-04 21:15:23 -04008
9extern crate proc_macro2;
10use proc_macro2::*;
11
David Tolnayc7a5d3d2017-06-04 12:11:05 -070012mod common;
13
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070014fn tt(k: TokenNode) -> TokenTree {
Michael Layzellbe1e24d2017-06-04 21:15:23 -040015 TokenTree {
16 span: Span::default(),
17 kind: k,
18 }
19}
20
21fn expr<T: Into<ExprKind>>(t: T) -> Expr {
22 t.into().into()
23}
24
25fn lit<T: Into<Literal>>(t: T) -> Expr {
26 expr(Lit {
27 value: LitKind::Other(t.into()),
28 span: syn::Span::default(),
29 })
30}
31
32#[test]
33fn test_grouping() {
34 let raw: TokenStream = vec![
Alex Crichton605643b2017-07-05 18:35:14 -070035 tt(TokenNode::Literal(Literal::i32(1))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070036 tt(TokenNode::Op('+', Spacing::Alone)),
37 tt(TokenNode::Group(Delimiter::None, vec![
Alex Crichton605643b2017-07-05 18:35:14 -070038 tt(TokenNode::Literal(Literal::i32(2))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070039 tt(TokenNode::Op('+', Spacing::Alone)),
Alex Crichton605643b2017-07-05 18:35:14 -070040 tt(TokenNode::Literal(Literal::i32(3))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040041 ].into_iter().collect())),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070042 tt(TokenNode::Op('*', Spacing::Alone)),
Alex Crichton605643b2017-07-05 18:35:14 -070043 tt(TokenNode::Literal(Literal::i32(4))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040044 ].into_iter().collect();
45
46 assert_eq!(raw.to_string(), "1i32 + 2i32 + 3i32 * 4i32");
47
David Tolnayc7a5d3d2017-06-04 12:11:05 -070048 assert_eq!(common::parse::syn::<Expr>(raw), expr(ExprBinary {
Alex Crichton605643b2017-07-05 18:35:14 -070049 left: Box::new(lit(Literal::i32(1))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040050 op: BinOp::Add(tokens::Add::default()),
51 right: Box::new(expr(ExprBinary {
52 left: Box::new(expr(ExprGroup {
53 group_token: tokens::Group::default(),
54 expr: Box::new(expr(ExprBinary {
Alex Crichton605643b2017-07-05 18:35:14 -070055 left: Box::new(lit(Literal::i32(2))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040056 op: BinOp::Add(tokens::Add::default()),
Alex Crichton605643b2017-07-05 18:35:14 -070057 right: Box::new(lit(Literal::i32(3))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040058 })),
59 })),
60 op: BinOp::Mul(tokens::Star::default()),
Alex Crichton605643b2017-07-05 18:35:14 -070061 right: Box::new(lit(Literal::i32(4))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040062 })),
63 }));
64}
65
66#[test]
67fn test_invalid_grouping() {
68 let raw: TokenStream = vec![
Alex Crichton605643b2017-07-05 18:35:14 -070069 tt(TokenNode::Literal(Literal::i32(1))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070070 tt(TokenNode::Op('+', Spacing::Alone)),
71 tt(TokenNode::Group(Delimiter::None, vec![
Alex Crichton605643b2017-07-05 18:35:14 -070072 tt(TokenNode::Literal(Literal::i32(2))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070073 tt(TokenNode::Op('+', Spacing::Alone)),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040074 ].into_iter().collect())),
Alex Crichton605643b2017-07-05 18:35:14 -070075 tt(TokenNode::Literal(Literal::i32(3))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070076 tt(TokenNode::Op('*', Spacing::Alone)),
Alex Crichton605643b2017-07-05 18:35:14 -070077 tt(TokenNode::Literal(Literal::i32(4))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040078 ].into_iter().collect();
79
80 assert_eq!(raw.to_string(), "1i32 + 2i32 + 3i32 * 4i32");
81
David Tolnayc7a5d3d2017-06-04 12:11:05 -070082 assert_eq!(common::parse::syn::<Expr>(raw.into()), expr(ExprBinary {
Michael Layzellbe1e24d2017-06-04 21:15:23 -040083 left: Box::new(expr(ExprBinary {
Alex Crichton605643b2017-07-05 18:35:14 -070084 left: Box::new(lit(Literal::i32(1))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040085 op: BinOp::Add(tokens::Add::default()),
Alex Crichton605643b2017-07-05 18:35:14 -070086 right: Box::new(lit(Literal::i32(2))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040087 })),
88 op: BinOp::Add(tokens::Add::default()),
89 right: Box::new(expr(ExprBinary {
Alex Crichton605643b2017-07-05 18:35:14 -070090 left: Box::new(lit(Literal::i32(3))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040091 op: BinOp::Mul(tokens::Star::default()),
Alex Crichton605643b2017-07-05 18:35:14 -070092 right: Box::new(lit(Literal::i32(4))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040093 })),
94 }));
95}