fddl/tests/lexer_tests.rs
2024-09-14 23:01:16 -04:00

101 lines
2.7 KiB
Rust

use fiddle::lexer::Lexer;
use fiddle::lexer::token::Token;
#[test]
fn test_single_tokens() {
let source = String::from("()+-*/;");
let mut lexer = Lexer::new(source);
let tokens = lexer.scan_tokens();
assert_eq!(
tokens,
vec![
Token::LeftParen,
Token::RightParen,
Token::Plus,
Token::Minus,
Token::Star,
Token::Slash,
Token::Semicolon,
Token::EOF
]
);
}
#[test]
fn test_identifier_and_keywords() {
let source = String::from("let $varName := 123; ");
let mut lexer = Lexer::new(source);
let tokens = lexer.scan_tokens();
assert_eq!(
tokens,
vec![
Token::Let,
Token::Dollar,
Token::Identifier("varName".to_string()),
Token::ColonEqual,
Token::Number(123.0),
Token::Semicolon,
Token::EOF
]
);
}
#[test]
fn test_doc_comments() {
let source = String::from("##! Module documentation
module test {
### Function documentation
func example() {
# Regular comment
return 42;
}
}
");
let mut lexer = Lexer::new(source);
let tokens = lexer.scan_tokens();
println!("Tokens: {:?}", tokens);
assert_eq!(tokens[0], Token::DocComment("Module documentation".to_string()));
assert_eq!(tokens[1], Token::Module);
assert_eq!(tokens[2], Token::Identifier("test".to_string()));
assert_eq!(tokens[3], Token::LeftBrace);
assert_eq!(tokens[4], Token::DocComment("Function documentation".to_string()));
assert_eq!(tokens[5], Token::Func);
assert_eq!(tokens[6], Token::Identifier("example".to_string()));
assert_eq!(tokens[7], Token::LeftParen);
assert_eq!(tokens[8], Token::RightParen);
assert_eq!(tokens[9], Token::LeftBrace);
assert_eq!(tokens[10], Token::Return);
assert_eq!(tokens[11], Token::Number(42.0));
assert_eq!(tokens[12], Token::Semicolon);
assert_eq!(tokens[13], Token::RightBrace); // Closes function body
assert_eq!(tokens[14], Token::RightBrace); // Closes module
assert_eq!(tokens[15], Token::EOF);
}
#[test]
fn test_tilde_operator() {
let source = String::from("if (a ~= b) { ~c }");
let mut lexer = Lexer::new(source);
let tokens = lexer.scan_tokens();
assert_eq!(
tokens,
vec![
Token::If,
Token::LeftParen,
Token::Identifier("a".to_string()),
Token::TildeEqual,
Token::Identifier("b".to_string()),
Token::RightParen,
Token::LeftBrace,
Token::Tilde,
Token::Identifier("c".to_string()),
Token::RightBrace,
Token::EOF
]
);
}