blob: 59ed454f8fa56ace005f8a3cb24780e72fc2fe1a [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
12fn tt(k: TokenKind) -> TokenTree {
13 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![
33 tt(TokenKind::Literal(Literal::from(1))),
34 tt(TokenKind::Op('+', OpKind::Alone)),
35 tt(TokenKind::Sequence(Delimiter::None, vec![
36 tt(TokenKind::Literal(Literal::from(2))),
37 tt(TokenKind::Op('+', OpKind::Alone)),
38 tt(TokenKind::Literal(Literal::from(3))),
39 ].into_iter().collect())),
40 tt(TokenKind::Op('*', OpKind::Alone)),
41 tt(TokenKind::Literal(Literal::from(4))),
42 ].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![
67 tt(TokenKind::Literal(Literal::from(1))),
68 tt(TokenKind::Op('+', OpKind::Alone)),
69 tt(TokenKind::Sequence(Delimiter::None, vec![
70 tt(TokenKind::Literal(Literal::from(2))),
71 tt(TokenKind::Op('+', OpKind::Alone)),
72 ].into_iter().collect())),
73 tt(TokenKind::Literal(Literal::from(3))),
74 tt(TokenKind::Op('*', OpKind::Alone)),
75 tt(TokenKind::Literal(Literal::from(4))),
76 ].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}