-
Notifications
You must be signed in to change notification settings - Fork 0
/
calctest.py
115 lines (104 loc) · 4.12 KB
/
calctest.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import unittest
import calc
from collections import deque
class TokenizeValidInput(unittest.TestCase):
valid_expr = (
("", []),
("()", ["(", ")"]),
("(())", ["(", "(", ")", ")"]),
("()()", ["(", ")", "(", ")"]),
("1", ["1"]),
("5.84", ["5.84"]),
("-1", ["_", "1"]), # unary negation is represented as _
("--2", ["_", "_", "2"]),
("log 14", ["log", "14"]),
("log(3)", ["log", "(", "3", ")"]),
("log(-1)", ["log", "(", "_", "1", ")"]),
("log -4", ["log", "_", "4"]),
("(2)", ["(", "2", ")"]),
("1 + 2", ["1", "+", "2"]),
("1/0", ["1", "/", "0"]),
("2.3+1", ["2.3", "+", "1"]),
("4.5 + 1 * 4.9", ["4.5", "+", "1", "*", "4.9"]),
("(23 + 5) * 5", ["(", "23", "+", "5", ")", "*", "5"]),
("12*(56+4)", ["12", "*", "(", "56", "+", "4", ")"]),
("log3+1", ["log", "3", "+", "1"]),
("log(4.1 + 2)", ["log", "(", "4.1", "+", "2", ")"]),
("log(1 + 7) + 4", ["log", "(", "1", "+", "7", ")", "+", "4"]))
def test_valid_expr(self):
for expr, tokens in self.valid_expr:
result = calc.tokenize(expr)
self.assertEqual(tokens, result)
class TokenizeBadInput(unittest.TestCase):
invalid_expr = (
"1 1", # consecutive numbers without operator in the middle
"1.2.3", # consecutive numbers without operator in the middle
"1.2 + 3.2.4", # consecutive numbers without operator in middle
"1.2.", # extra dot
"+", # binary operator missing both operands
"3 * ", # binary operator missing right operand
" + 2", # binary operator missing left operand
"1 + log", # unary operator missing operand
"1 & 2", # invalid operator
"(", # unbalanced parentheses
")", # unbalanced parentheses
"())", # unbalanced parentheses
"(1 + 2 * 3", # unbalanced parentheses
"1 + 2) * 3") # unbalanced parentheses
def test_invalid_expr(self):
for expr in self.invalid_expr:
self.assertRaises(calc.InvalidExpressionError, calc.tokenize, expr)
class ToPostFix(unittest.TestCase):
exprmap = (
(["1"], deque(["1"])),
(["_", "1"], deque(["1", "_"])),
(["_", "_", "2"], deque(["2", "_", "_"])),
(["log", "2"], deque(["2", "log"])),
(["log", "_", "3"], deque(["3", "_", "log"])),
(["log", "(", "_", "5", ")"], deque(["5", "_", "log"])),
(["log", "(", "1", "+", "2", ")"], deque(["1", "2", "+", "log"])),
(["log", "_", "1", "+", "2"], deque(["1", "_", "log", "2", "+"])),
(["1", "/", "2"], deque(["1", "2", "/"])),
(["2", "*", "3", "-", "1"], deque(["2", "3", "*", "1", "-"])),
(["1", "+", "2", "*", "3"], deque(["1", "2", "3", "*", "+"])),
(["2", "*", "3", "/", "4"], deque(["2", "3", "*", "4", "/"])),
(["(", "2", "*", "3", ")"], deque(["2", "3", "*"])),
(["log", "(", "2", "*", "3", "+", "7", ")"], deque(["2", "3", "*", "7",
"+", "log"])))
def test_postfix(self):
for infix, postfix in self.exprmap:
result = calc.topostfix(infix)
self.assertEqual(postfix, result)
class Eval(unittest.TestCase):
exprtoval = (
(deque(["1"]), 1),
(deque(["2", "_"]), -2),
(deque(["3", "2", "*"]), 6),
(deque(["4", ".5", "*"]), 2),
(deque(["1", "0.5", "/"]), 2),
(deque(["2", "1", "log", "+"]), 2))
def test_eval(self):
for postfix, val in self.exprtoval:
result = calc.eval(postfix)
self.assertEqual(val, result)
class Calc(unittest.TestCase):
exprtoval = (
("2", 2),
("-7", -7),
("log1", 0),
("1 + 2", 3),
("4.3 * 3.2", 13.76),
("7 / 2", 3.5),
("log1 + 3", 3),
("5*log1", 0),
("-log1", 0),
("2 + 4 - 1 * 7", -1),
("3.5 * 4 / 2", 7),
("(1+2)/6", 0.5),
("15/(-4 + 7)", 5))
def test_calc(self):
for expr, val in self.exprtoval:
result = calc.calc(expr)
self.assertEqual(val, result)
if __name__ == "__main__":
unittest.main()