예제 #1
0
 def test_nested_expression(self):
     lexer = Lexer()
     tokens = lexer.analyze('(+ 1 (+ 1 (+ 1 1)))')
     node = build_tree(tokens)
     assert 4 == node.eval()
예제 #2
0
 def test_simple_expression(self):
     lexer = Lexer()
     tokens = lexer.analyze('(+ 1 1)')
     node = build_tree(tokens)
     assert 2 == node.eval()
예제 #3
0
 def test_empty_expression(self):
     lexer = Lexer()
     tokens = lexer.analyze('()')
     node = build_tree(tokens)
     assert node.eval() is None
예제 #4
0
def eval(expr):
    lexer = Lexer()
    node = build_tree(lexer.analyze(expr))
    return node.eval()
예제 #5
0
 def setup_method(self, method):
     self.lexer = Lexer()
예제 #6
0
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))")