From 55653ff0f38e7342a863a9e01189f3a5899ba598 Mon Sep 17 00:00:00 2001 From: Garrit Franke Date: Fri, 4 Dec 2020 10:36:37 +0100 Subject: [PATCH] Add parser tests --- src/parser/mod.rs | 5 +++- src/parser/tests.rs | 56 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/parser/tests.rs diff --git a/src/parser/mod.rs b/src/parser/mod.rs index a16f8fa..7456b62 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -6,6 +6,9 @@ use std::vec::IntoIter; mod node_type; +#[cfg(test)] +mod tests; + pub struct Parser { tokens: Peekable>, peeked: Vec, @@ -108,7 +111,7 @@ impl Parser { let globals = Vec::new(); while self.has_more() { - functions.push(self.parse_function().expect("Failed to parse function")) + functions.push(self.parse_function()?) } Ok(Program { diff --git a/src/parser/tests.rs b/src/parser/tests.rs new file mode 100644 index 0000000..508a2c1 --- /dev/null +++ b/src/parser/tests.rs @@ -0,0 +1,56 @@ +use crate::lexer::*; +use crate::parser::*; + +#[test] +fn test_parse_empty_function() { + let tokens = tokenize("fn main() {}"); + let tree = parse(tokens); + assert!(tree.is_ok()) +} + +#[test] +fn test_parse_function_with_return() { + let raw = " + fn main() { + return 1; + } + "; + let tokens = tokenize(raw); + let tree = parse(tokens); + assert!(tree.is_ok()) +} + +#[test] +fn test_parse_missing_semicolon() { + let raw = " + fn main() { + return 1 + } + "; + let tokens = tokenize(raw); + let tree = parse(tokens); + assert!(tree.is_err()) +} + +#[test] +fn test_parse_no_function_context() { + let raw = " + let x = 1; + "; + let tokens = tokenize(raw); + let tree = parse(tokens); + assert!(tree.is_err()) +} + +#[test] +fn test_parse_variable_declaration() { + let raw = " + fn main() { + let x = 1; + return x; + } + "; + let tokens = tokenize(raw); + let tree = parse(tokens); + assert!(tree.is_ok()) +}