From e4ffd1ab5599d9e423d80314edc56696406c4fd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vili=20Sinerv=C3=A4?= Date: Tue, 28 Jan 2025 18:28:48 +0200 Subject: [PATCH] Add more tests. Handle garbage input --- src/compiler/parser.rs | 49 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/src/compiler/parser.rs b/src/compiler/parser.rs index e3bfb71..877416b 100644 --- a/src/compiler/parser.rs +++ b/src/compiler/parser.rs @@ -6,7 +6,16 @@ use crate::compiler::{ pub fn parse<'source>(tokens: &[Token<'source>]) -> Expression<'source> { let mut pos = 0; - parse_expression(&mut pos, tokens) + let result = parse_expression(&mut pos, tokens); + + if pos != tokens.len() { + panic!( + "Parsing naturally stopped after {}, despite there being more tokens!", + tokens[pos] + ); + } + + result } fn peek<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Token<'source> { @@ -327,4 +336,42 @@ mod tests { new_int("3"), ]); } + + #[test] + #[should_panic] + fn test_empty() { + parse(&vec![]); + } + + #[test] + #[should_panic] + fn test_invalid_start() { + parse(&vec![new_int("1"), new_int("2"), new_id("+"), new_int("3")]); + } + + #[test] + #[should_panic] + fn test_invalid_middle() { + parse(&vec![ + new_int("1"), + new_id("+"), + new_int("2"), + new_int("2"), + new_id("+"), + new_int("3"), + ]); + } + + #[test] + #[should_panic] + fn test_invalid_end() { + parse(&vec![ + new_int("1"), + new_id("+"), + new_int("2"), + new_int("2"), + new_id("+"), + new_int("3"), + ]); + } }