diff --git a/src/main.rs b/src/main.rs index 7a868c0..d3e77f0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,9 @@ use std::process; mod scanner; mod tokens; +#[cfg(test)] +mod tests; + /// main /// no arguments: run interactively /// 1 argument: run the script file specified diff --git a/src/tests.rs b/src/tests.rs new file mode 100644 index 0000000..b8d8b47 --- /dev/null +++ b/src/tests.rs @@ -0,0 +1,39 @@ +#[cfg(test)] +use crate::scanner::scan_tokens; +use crate::tokens::TokenType::*; + +#[test] +fn test_scan_empty_source() { + let tokens = scan_tokens("").unwrap(); + assert_eq!(tokens.len(), 1); + + let token = tokens.get(0).unwrap(); + assert_eq!(token.token_type, EOF); + assert_eq!(token.line, 1); +} + +#[test] +fn test_scan_single_char_tokens() { + let tokens = scan_tokens(">").unwrap(); + assert_eq!(tokens.len(), 2); + + let token = tokens.get(0).unwrap(); + assert_eq!(token.token_type, GREATER); + assert_eq!(token.lexeme, ">"); + + let token = tokens.get(1).unwrap(); + assert_eq!(token.token_type, EOF); +} + +#[test] +fn test_scan_double_char_tokens() { + let tokens = scan_tokens(">=").unwrap(); + assert_eq!(tokens.len(), 2); + + let token = tokens.get(0).unwrap(); + assert_eq!(token.token_type, GREATEREQUAL); + assert_eq!(token.lexeme, ">="); + + let token = tokens.get(1).unwrap(); + assert_eq!(token.token_type, EOF); +} diff --git a/src/tokens.rs b/src/tokens.rs index 1fe45ea..42bdc3a 100644 --- a/src/tokens.rs +++ b/src/tokens.rs @@ -31,7 +31,7 @@ impl fmt::Debug for Token<'_> { } } -#[derive(Debug, Clone, Copy)] +#[derive(Eq, PartialEq, Debug, Clone, Copy)] pub enum TokenType { // Single-character tokens. LEFTPAREN, // (