use crate::lexer::ScriptTokenType; use crate::pratt::parser::{Scanner, ScannerError, ScannerResult}; use test_case::test_case; #[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); }