calculator: use commonly defined operations
This commit is contained in:
parent
f103adddac
commit
2490e1a5bd
|
@ -1,2 +1,3 @@
|
||||||
|
import calculator.core # isort:skip
|
||||||
import calculator.ast
|
import calculator.ast
|
||||||
import calculator.eval
|
import calculator.eval
|
||||||
|
|
1
calculator/calculator/core/__init__.py
Normal file
1
calculator/calculator/core/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
import calculator.core.operations
|
35
calculator/calculator/core/operations.py
Normal file
35
calculator/calculator/core/operations.py
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
def plus(x: int, y: int) -> int:
|
||||||
|
return x + y
|
||||||
|
|
||||||
|
|
||||||
|
def minus(x: int, y: int) -> int:
|
||||||
|
return x - y
|
||||||
|
|
||||||
|
|
||||||
|
def times(x: int, y: int) -> int:
|
||||||
|
return x * y
|
||||||
|
|
||||||
|
|
||||||
|
def int_div(x: int, y: int) -> int:
|
||||||
|
return x // y
|
||||||
|
|
||||||
|
|
||||||
|
def pow(x: int, y: int) -> int:
|
||||||
|
return x ** y
|
||||||
|
|
||||||
|
|
||||||
|
def identity(x: int) -> int:
|
||||||
|
return x
|
||||||
|
|
||||||
|
|
||||||
|
def negate(x: int) -> int:
|
||||||
|
return -x
|
||||||
|
|
||||||
|
|
||||||
|
STR_TO_BIN = {
|
||||||
|
"+": plus,
|
||||||
|
"-": minus,
|
||||||
|
"*": times,
|
||||||
|
"/": int_div,
|
||||||
|
"^": pow,
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
import pytest
|
import pytest
|
||||||
from calculator.ast import BinOp, Constant, UnaryOp
|
from calculator.ast import BinOp, Constant, UnaryOp
|
||||||
|
from calculator.core import operations
|
||||||
|
|
||||||
from .evaluator import Evaluator
|
from .evaluator import Evaluator
|
||||||
|
|
||||||
|
@ -15,20 +16,35 @@ def test_evaluate_constant(vis):
|
||||||
|
|
||||||
|
|
||||||
def test_evaluate_unaryop_identity(vis):
|
def test_evaluate_unaryop_identity(vis):
|
||||||
op = UnaryOp(lambda x: x, Constant(42))
|
op = UnaryOp(operations.identity, Constant(42))
|
||||||
assert vis.visit_and_get_value(op) == 42
|
assert vis.visit_and_get_value(op) == 42
|
||||||
|
|
||||||
|
|
||||||
def test_evaluate_unaryop_negate(vis):
|
def test_evaluate_unaryop_negate(vis):
|
||||||
op = UnaryOp(lambda x: -x, Constant(-42))
|
op = UnaryOp(operations.negate, Constant(-42))
|
||||||
assert vis.visit_and_get_value(op) == 42
|
assert vis.visit_and_get_value(op) == 42
|
||||||
|
|
||||||
|
|
||||||
def test_evaluate_binop_plus(vis):
|
def test_evaluate_binop_plus(vis):
|
||||||
op = BinOp(lambda x, y: x + y, Constant(12), Constant(27))
|
op = BinOp(operations.plus, Constant(12), Constant(27))
|
||||||
assert vis.visit_and_get_value(op) == 39
|
assert vis.visit_and_get_value(op) == 39
|
||||||
|
|
||||||
|
|
||||||
def test_evaluate_binop_minus(vis):
|
def test_evaluate_binop_minus(vis):
|
||||||
op = BinOp(lambda x, y: x - y, Constant(42), Constant(51))
|
op = BinOp(operations.minus, Constant(42), Constant(51))
|
||||||
assert vis.visit_and_get_value(op) == -9
|
assert vis.visit_and_get_value(op) == -9
|
||||||
|
|
||||||
|
|
||||||
|
def test_evaluate_binop_times(vis):
|
||||||
|
op = BinOp(operations.times, Constant(6), Constant(9))
|
||||||
|
assert vis.visit_and_get_value(op) == 54
|
||||||
|
|
||||||
|
|
||||||
|
def test_evaluate_binop_int_div(vis):
|
||||||
|
op = BinOp(operations.int_div, Constant(5), Constant(2))
|
||||||
|
assert vis.visit_and_get_value(op) == 2
|
||||||
|
|
||||||
|
|
||||||
|
def test_evaluate_binop_pow(vis):
|
||||||
|
op = BinOp(operations.pow, Constant(3), Constant(4))
|
||||||
|
assert vis.visit_and_get_value(op) == 81
|
||||||
|
|
Loading…
Reference in a new issue