Add tests

master
Araozu 2024-05-04 18:22:36 -05:00
parent 527b1b4af6
commit 231187d1f1
1 changed files with 36 additions and 8 deletions

View File

@ -60,26 +60,23 @@ pub fn try_parse<'a>(tokens: &'a Vec<Token>, pos: usize) -> ParsingResult<Bindin
return Err(ParsingError::Err(SyntaxError { return Err(ParsingError::Err(SyntaxError {
error_start: token.position, error_start: token.position,
error_end: token.get_end_position(), error_end: token.get_end_position(),
reason: "??".into(), reason: "There should be an identifier after a binding".into(),
})); }));
} }
Err(ParsingError::Err(error)) => {
return Err(ParsingError::Err(error));
}
_ => { _ => {
// The parser didn't find an Identifier after VAL/VAR or the Datatype // The parser didn't find an Identifier after VAL/VAR or the Datatype
match (binding_token, datatype) { match (binding_token, datatype) {
(Some(binding_token), _) => { (Some(binding_token), None) => {
return Err(ParsingError::Err(SyntaxError { return Err(ParsingError::Err(SyntaxError {
reason: format!( reason: format!(
"There should be an identifier after a `{}` token", "There should be an identifier after a `{}` token",
if is_var { "val" } else { "var" } if is_var { "var" } else { "val" }
), ),
error_start: binding_token.position, error_start: binding_token.position,
error_end: binding_token.get_end_position(), error_end: binding_token.get_end_position(),
})); }));
} }
(None, Some(datatype_token)) => { (_, Some(datatype_token)) => {
return Err(ParsingError::Err(SyntaxError { return Err(ParsingError::Err(SyntaxError {
reason: "There should be an identifier after the datatype".into(), reason: "There should be an identifier after the datatype".into(),
error_start: datatype_token.position, error_start: datatype_token.position,
@ -87,7 +84,7 @@ pub fn try_parse<'a>(tokens: &'a Vec<Token>, pos: usize) -> ParsingResult<Bindin
})); }));
} }
_ => { _ => {
panic!("Illegal parser state: binding_token and datatype are both None") unreachable!("Illegal parser state: binding_token and datatype are both None")
} }
}; };
} }
@ -267,6 +264,7 @@ mod tests {
Err(ParsingError::Err(error)) => { Err(ParsingError::Err(error)) => {
assert_eq!(4, error.error_start); assert_eq!(4, error.error_start);
assert_eq!(11, error.error_end); assert_eq!(11, error.error_end);
assert_eq!("There should be an identifier after a binding", error.reason);
} }
_ => panic!("Error expected"), _ => panic!("Error expected"),
} }
@ -285,4 +283,34 @@ mod tests {
_ => panic!("Error expected"), _ => panic!("Error expected"),
} }
} }
#[test]
fn should_return_error_when_identifier_is_empty() {
let tokens = get_tokens(&String::from("val String ")).unwrap();
let binding = try_parse(&tokens, 0);
match binding {
Err(ParsingError::Err(error)) => {
assert_eq!(4, error.error_start);
assert_eq!(10, error.error_end);
assert_eq!("There should be an identifier after the datatype", error.reason);
}
_ => panic!("Error expected"),
}
}
#[test]
fn should_return_error_when_identifier_is_empty_2() {
let tokens = get_tokens(&String::from("val ")).unwrap();
let binding = try_parse(&tokens, 0);
match binding {
Err(ParsingError::Err(error)) => {
assert_eq!(0, error.error_start);
assert_eq!(3, error.error_end);
assert_eq!("There should be an identifier after a `val` token", error.reason);
}
_ => panic!("Error expected"),
}
}
} }