Skip to content
Snippets Groups Projects
test_cases.rs 4.5 KiB
Newer Older
Louis's avatar
Louis committed
use crate::lexer::ScriptTokenType;
use crate::pratt::parser::{Scanner, ScannerError, ScannerResult};
use test_case::test_case;

Louis's avatar
Louis committed
#[test_case("", Ok(ScriptTokenType::Eof) ; "expects eof")]
#[test_case("%", Ok(ScriptTokenType::Modulo) ; "Expects ScriptTokenType::Modulo")]
#[test_case("^", Ok(ScriptTokenType::Caret) ; "Expects ScriptTokenType::Caret")]
#[test_case("!", Ok(ScriptTokenType::Bang) ; "Expects ScriptTokenType::Bang")]
#[test_case("(", Ok(ScriptTokenType::LeftParen) ; "Expects ScriptTokenType::LeftParen")]
#[test_case(")", Ok(ScriptTokenType::RightParen) ; "Expects ScriptTokenType::RightParen")]
#[test_case("{", Ok(ScriptTokenType::LeftBrace) ; "Expects ScriptTokenType::LeftBrace")]
#[test_case("}", Ok(ScriptTokenType::RightBrace) ; "Expects ScriptTokenType::RightBrace")]
#[test_case(",", Ok(ScriptTokenType::Comma) ; "Expects ScriptTokenType::Comma")]
#[test_case(".", Ok(ScriptTokenType::Dot) ; "Expects ScriptTokenType::Dot")]
#[test_case("-", Ok(ScriptTokenType::Minus) ; "Expects ScriptTokenType::Minus")]
#[test_case("+", Ok(ScriptTokenType::Plus) ; "Expects ScriptTokenType::Plus")]
#[test_case(";", Ok(ScriptTokenType::Semicolon) ; "Expects ScriptTokenType::Semicolon")]
#[test_case("/", Ok(ScriptTokenType::Slash) ; "Expects ScriptTokenType::Slash")]
#[test_case("*", Ok(ScriptTokenType::Asterisk) ; "Expects ScriptTokenType::Asterisk")]
#[test_case("=", Ok(ScriptTokenType::Equal) ; "Expects ScriptTokenType::Equal")]
#[test_case("!=", Ok(ScriptTokenType::BangEqual) ; "Expects ScriptTokenType::BangEqual")]
#[test_case("==", Ok(ScriptTokenType::EqualEqual) ; "Expects ScriptTokenType::EqualEqual")]
#[test_case(">", Ok(ScriptTokenType::Greater) ; "Expects ScriptTokenType::Greater")]
#[test_case(">=", Ok(ScriptTokenType::GreaterEqual) ; "Expects ScriptTokenType::GreaterEqual")]
#[test_case("<", Ok(ScriptTokenType::Less) ; "Expects ScriptTokenType::Less")]
#[test_case("<=", Ok(ScriptTokenType::LessEqual) ; "Expects ScriptTokenType::LessEqual")]
#[test_case("\"Foo\"", Ok(ScriptTokenType::String(String::from("Foo"))) ; "Expects ScriptTokenType::String")]
#[test_case("123", Ok(ScriptTokenType::Integer(123)) ; "Expects ScriptTokenType::Integer")]
#[test_case("1_2_3", Ok(ScriptTokenType::Integer(123)) ; "Expects ScriptTokenType::Integer underscored")]
#[test_case("123.123", Ok(ScriptTokenType::Float(123.123)) ; "Expects ScriptTokenType::Float")]
#[test_case("12_3.1_23", Ok(ScriptTokenType::Float(123.123)) ; "Expects ScriptTokenType::Float underscored")]
#[test_case("struct", Ok(ScriptTokenType::Class) ; "Expects ScriptTokenType::Class")]
#[test_case("else", Ok(ScriptTokenType::Else) ; "Expects ScriptTokenType::Else")]
#[test_case("fn", Ok(ScriptTokenType::Function) ; "Expects ScriptTokenType::Function")]
#[test_case("for", Ok(ScriptTokenType::For) ; "Expects ScriptTokenType::For")]
#[test_case("if", Ok(ScriptTokenType::If) ; "Expects ScriptTokenType::If")]
#[test_case("null", Ok(ScriptTokenType::Null) ; "Expects ScriptTokenType::Null")]
#[test_case("print", Ok(ScriptTokenType::Print) ; "Expects ScriptTokenType::Print")]
#[test_case("return", Ok(ScriptTokenType::Return) ; "Expects ScriptTokenType::Return")]
#[test_case("super", Ok(ScriptTokenType::Super) ; "Expects ScriptTokenType::Super")]
#[test_case("this", Ok(ScriptTokenType::This) ; "Expects ScriptTokenType::This")]
#[test_case("let", Ok(ScriptTokenType::Let) ; "Expects ScriptTokenType::Let")]
#[test_case("while", Ok(ScriptTokenType::While) ; "Expects ScriptTokenType::While")]
#[test_case("export", Ok(ScriptTokenType::Export) ; "Expects ScriptTokenType::Export")]
#[test_case("import", Ok(ScriptTokenType::Import) ; "Expects ScriptTokenType::Import")]
#[test_case("as", Ok(ScriptTokenType::Alias) ; "Expects ScriptTokenType::Alias")]
#[test_case("from", Ok(ScriptTokenType::From) ; "Expects ScriptTokenType::From")]
#[test_case("typeof", Ok(ScriptTokenType::Typeof) ; "Expects ScriptTokenType::Typeof")]
#[test_case("finally", Ok(ScriptTokenType::Finally) ; "Expects ScriptTokenType::Finally")]
#[test_case("foo", Ok(ScriptTokenType::Identifier(String::from("foo"))) ; "Expects ScriptTokenType::Identifier foo")]
#[test_case("foo_bar", Ok(ScriptTokenType::Identifier(String::from("foo_bar"))) ; "Expects ScriptTokenType::Identifier foo_bar")]
#[test_case("fo2ob4r", Ok(ScriptTokenType::Identifier(String::from("fo2ob4r"))) ; "Expects ScriptTokenType::Identifier fo2ob4r")]
fn next_token(source: &'static str, expected: Result<ScriptTokenType, ScannerError>) {
	let mut scanner = Scanner::<'static>::new(source);
	let token = scanner.scan_token().map(|t| t.token);
	assert_eq!(token, expected);
Louis's avatar
Louis committed
}