75 lines
2.4 KiB
Python
75 lines
2.4 KiB
Python
import unittest
|
|
from calculator.lexer import Lexer
|
|
from calculator.tokens import Token, TokenType
|
|
|
|
|
|
class TestLexer(unittest.TestCase):
|
|
def test_empty(self):
|
|
tokens = list(Lexer("").generate_tokens())
|
|
self.assertEqual(tokens, [])
|
|
|
|
def test_whitespace(self):
|
|
tokens = list(Lexer("\t\n \t\t\n\n\r\r").generate_tokens())
|
|
self.assertEqual(tokens, [])
|
|
|
|
def test_numbers(self):
|
|
tokens = list(Lexer("123 123.456 123. .456 .").generate_tokens())
|
|
self.assertEqual(
|
|
tokens,
|
|
[
|
|
Token(TokenType.NUMBER, 123),
|
|
Token(TokenType.NUMBER, 123.456),
|
|
Token(TokenType.NUMBER, 123.0),
|
|
Token(TokenType.NUMBER, 0.456),
|
|
Token(TokenType.NUMBER, 0.0),
|
|
],
|
|
)
|
|
|
|
def test_operators(self):
|
|
tokens = list(Lexer("+-*/^%").generate_tokens())
|
|
self.assertEqual(
|
|
tokens,
|
|
[
|
|
Token(TokenType.PLUS),
|
|
Token(TokenType.MINUS),
|
|
Token(TokenType.MULTIPLY),
|
|
Token(TokenType.DIVIDE),
|
|
Token(TokenType.POWER),
|
|
Token(TokenType.MODULO),
|
|
],
|
|
)
|
|
|
|
def test_parens(self):
|
|
tokens = list(Lexer("()").generate_tokens())
|
|
self.assertEqual(
|
|
tokens, [Token(TokenType.LPAREN), Token(TokenType.RPAREN)]
|
|
)
|
|
|
|
def test_all(self):
|
|
tokens = list(
|
|
Lexer("(10 ^ 2 + (21 / 7 + 7) - 5 * 2) % 100").generate_tokens()
|
|
)
|
|
self.assertEqual(
|
|
tokens,
|
|
[
|
|
Token(TokenType.LPAREN),
|
|
Token(TokenType.NUMBER, 10),
|
|
Token(TokenType.POWER),
|
|
Token(TokenType.NUMBER, 2),
|
|
Token(TokenType.PLUS),
|
|
Token(TokenType.LPAREN),
|
|
Token(TokenType.NUMBER, 21),
|
|
Token(TokenType.DIVIDE),
|
|
Token(TokenType.NUMBER, 7),
|
|
Token(TokenType.PLUS),
|
|
Token(TokenType.NUMBER, 7),
|
|
Token(TokenType.RPAREN),
|
|
Token(TokenType.MINUS),
|
|
Token(TokenType.NUMBER, 5),
|
|
Token(TokenType.MULTIPLY),
|
|
Token(TokenType.NUMBER, 2),
|
|
Token(TokenType.RPAREN),
|
|
Token(TokenType.MODULO),
|
|
Token(TokenType.NUMBER, 100),
|
|
],
|
|
)
|