summaryrefslogtreecommitdiff
path: root/src/parse/tests.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse/tests.rs')
-rw-r--r--src/parse/tests.rs38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/parse/tests.rs b/src/parse/tests.rs
index b9a3d301..9460db6b 100644
--- a/src/parse/tests.rs
+++ b/src/parse/tests.rs
@@ -202,6 +202,21 @@ macro_rules! Block {
};
}
+macro_rules! Let {
+ (@$pat:expr $(=> $expr:expr)?) => {{
+ #[allow(unused)]
+ let mut expr = None;
+ $(expr = Some(Box::new(into!($expr)));)?
+ Expr::Let(ExprLet {
+ pat: into!($pat).map(|s: &str| Ident(s.into())),
+ expr
+ })
+ }};
+ ($($tts:tt)*) => {
+ Node::Expr(Let!(@$($tts)*))
+ };
+}
+
#[test]
fn test_parse_comments() {
// In markup.
@@ -651,3 +666,26 @@ fn test_parse_values() {
nodes: [],
errors: [S(1..3, "expected expression, found invalid token")]);
}
+
+#[test]
+fn test_parse_let_bindings() {
+ // Basic let.
+ t!("#let x;" Let!("x"));
+ t!("#let _y=1;" Let!("_y" => Int(1)));
+
+ // Followed by text.
+ t!("#let x = 1\n+\n2;\nHi there"
+ Let!("x" => Binary(Int(1), Add, Int(2))),
+ Space, Text("Hi"), Space, Text("there"));
+
+ // Missing semicolon.
+ t!("#let x = a\nHi"
+ nodes: [Let!("x" => Id("a"))],
+ errors: [S(11..13, "unexpected identifier"),
+ S(13..13, "expected semicolon")]);
+
+ // Missing identifier.
+ t!("#let 1;"
+ nodes: [],
+ errors: [S(5..6, "expected identifier, found integer")])
+}