Add a test for grouping expressions with None-delimited sequences
diff --git a/tests/test_grouping.rs b/tests/test_grouping.rs
new file mode 100644
index 0000000..59ed454
--- /dev/null
+++ b/tests/test_grouping.rs
@@ -0,0 +1,93 @@
+#![cfg(all(feature = "extra-traits", feature = "full"))]
+
+extern crate syn;
+use syn::{Expr, ExprKind, ExprGroup, ExprBinary, Lit, LitKind, BinOp};
+
+extern crate synom;
+use synom::{tokens, Synom};
+
+extern crate proc_macro2;
+use proc_macro2::*;
+
+fn tt(k: TokenKind) -> TokenTree {
+ TokenTree {
+ span: Span::default(),
+ kind: k,
+ }
+}
+
+fn expr<T: Into<ExprKind>>(t: T) -> Expr {
+ t.into().into()
+}
+
+fn lit<T: Into<Literal>>(t: T) -> Expr {
+ expr(Lit {
+ value: LitKind::Other(t.into()),
+ span: syn::Span::default(),
+ })
+}
+
+#[test]
+fn test_grouping() {
+ let raw: TokenStream = vec![
+ tt(TokenKind::Literal(Literal::from(1))),
+ tt(TokenKind::Op('+', OpKind::Alone)),
+ tt(TokenKind::Sequence(Delimiter::None, vec![
+ tt(TokenKind::Literal(Literal::from(2))),
+ tt(TokenKind::Op('+', OpKind::Alone)),
+ tt(TokenKind::Literal(Literal::from(3))),
+ ].into_iter().collect())),
+ tt(TokenKind::Op('*', OpKind::Alone)),
+ tt(TokenKind::Literal(Literal::from(4))),
+ ].into_iter().collect();
+
+ assert_eq!(raw.to_string(), "1i32 + 2i32 + 3i32 * 4i32");
+
+ assert_eq!(Expr::parse_all(raw).unwrap(), expr(ExprBinary {
+ left: Box::new(lit(1)),
+ op: BinOp::Add(tokens::Add::default()),
+ right: Box::new(expr(ExprBinary {
+ left: Box::new(expr(ExprGroup {
+ group_token: tokens::Group::default(),
+ expr: Box::new(expr(ExprBinary {
+ left: Box::new(lit(2)),
+ op: BinOp::Add(tokens::Add::default()),
+ right: Box::new(lit(3)),
+ })),
+ })),
+ op: BinOp::Mul(tokens::Star::default()),
+ right: Box::new(lit(4)),
+ })),
+ }));
+}
+
+#[test]
+fn test_invalid_grouping() {
+ let raw: TokenStream = vec![
+ tt(TokenKind::Literal(Literal::from(1))),
+ tt(TokenKind::Op('+', OpKind::Alone)),
+ tt(TokenKind::Sequence(Delimiter::None, vec![
+ tt(TokenKind::Literal(Literal::from(2))),
+ tt(TokenKind::Op('+', OpKind::Alone)),
+ ].into_iter().collect())),
+ tt(TokenKind::Literal(Literal::from(3))),
+ tt(TokenKind::Op('*', OpKind::Alone)),
+ tt(TokenKind::Literal(Literal::from(4))),
+ ].into_iter().collect();
+
+ assert_eq!(raw.to_string(), "1i32 + 2i32 + 3i32 * 4i32");
+
+ assert_eq!(Expr::parse_all(raw).unwrap(), expr(ExprBinary {
+ left: Box::new(expr(ExprBinary {
+ left: Box::new(lit(1)),
+ op: BinOp::Add(tokens::Add::default()),
+ right: Box::new(lit(2)),
+ })),
+ op: BinOp::Add(tokens::Add::default()),
+ right: Box::new(expr(ExprBinary {
+ left: Box::new(lit(3)),
+ op: BinOp::Mul(tokens::Star::default()),
+ right: Box::new(lit(4)),
+ })),
+ }));
+}