def test_nested_expression(self): lexer = Lexer() tokens = lexer.analyze('(+ 1 (+ 1 (+ 1 1)))') node = build_tree(tokens) assert 4 == node.eval()
def test_simple_expression(self): lexer = Lexer() tokens = lexer.analyze('(+ 1 1)') node = build_tree(tokens) assert 2 == node.eval()
def test_empty_expression(self): lexer = Lexer() tokens = lexer.analyze('()') node = build_tree(tokens) assert node.eval() is None
def eval(expr): lexer = Lexer() node = build_tree(lexer.analyze(expr)) return node.eval()
def setup_method(self, method): self.lexer = Lexer()
class TestLexer: def setup_method(self, method): self.lexer = Lexer() def test_analyze_empty(self): assert [] == self.lexer.analyze("") def test_analyze_empty_parentheses(self): tokens = [(TokenName.l_par, "("), (TokenName.r_par, ")")] assert tokens == self.lexer.analyze("()") def test_analyze_single_number(self): tokens = [ (TokenName.l_par, "("), (TokenName.operator, add), (TokenName.number, 1), (TokenName.number, 2), (TokenName.r_par, ")"), ] assert tokens == self.lexer.analyze("(+ 1 2)") def test_analyze_negative_numbers(self): tokens = [(TokenName.operator, sub), (TokenName.number, -2), (TokenName.number, -3)] assert tokens == self.lexer.analyze("(- -2 -3)")[1:4] def test_analyze_positive_numbers(self): tokens = [(TokenName.operator, add), (TokenName.number, +2), (TokenName.number, +3)] assert tokens == self.lexer.analyze("(+ +2 +3)")[1:4] def test_analyze_long_number(self): tokens = [ (TokenName.l_par, "("), (TokenName.operator, add), (TokenName.number, 1234), (TokenName.number, 3), (TokenName.r_par, ")"), ] assert tokens == self.lexer.analyze("(+ 1234 3)") def test_analyze_invalid_syntax_invalid_dot_notation(self): with pytest.raises(SyntaxError) as e: self.lexer.analyze("(+ 12.0. 2)") assert 'Invalid token "."' in str(e.value) def test_analyze_dot_notation(self): tokens = [ (TokenName.l_par, "("), (TokenName.operator, add), (TokenName.number, 10.23), (TokenName.number, 20), (TokenName.r_par, ")"), ] assert tokens == self.lexer.analyze("(+ 10.23 20)") def test_add_operation(self): tokens = self.lexer.analyze("(+ 0 1)") assert tokens[1] == (TokenName.operator, add) def test_subtract_operation(self): tokens = self.lexer.analyze("(- 1 2)") assert tokens[1] == (TokenName.operator, sub) def test_multiply_operation(self): tokens = self.lexer.analyze("(* 10 20)") assert tokens[1] == (TokenName.operator, mul) def test_divide_operation(self): tokens = self.lexer.analyze("(/ 10 20)") assert tokens[1] == (TokenName.operator, truediv) def test_pow_operation(self): tokens = self.lexer.analyze("(^ 10 2)") assert tokens[1] == (TokenName.operator, pow) def test_modulus_operation(self): tokens = self.lexer.analyze("(% 2 3)") assert tokens[1] == (TokenName.operator, mod) def test_nested(self): tokens = [ (TokenName.l_par, "("), (TokenName.operator, add), (TokenName.number, 1), (TokenName.l_par, "("), (TokenName.operator, add), (TokenName.number, 2), (TokenName.number, 3), (TokenName.r_par, ")"), (TokenName.r_par, ")"), ] assert tokens == self.lexer.analyze("(+ 1 (+ 2 3))")