Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import unittest
- '''
- I want to develop a simple RPN-calculator (RPN = Reverse polish notation).
- It shouldn't be interactive or anything, it should just take a string as
- input and compute it.
- For example>
- 1 2 +
- .. should compute to 3.
- It should only work with integers and basic arithmetics: +, -, * and /.
- '''
- def is_number(str):
- try: int(str)
- except: return False
- return True
- def rpn(expr):
- parts = expr.split()
- stack = []
- def plus(l, r): return l + r
- def minus(l, r): return l - r
- def times(l, r): return l * r
- def through(l, r): return l / r
- words = {"+":plus, "-":minus, "*":times, "/":through}
- for part in parts:
- if is_number(part):
- stack.append(int(part))
- else:
- right_number = stack.pop()
- left_number = stack.pop()
- op = words[part]
- stack.append(op(left_number, right_number))
- if len(stack)<>1:
- raise Exception()
- return stack[0]
- class TestCase(unittest.TestCase):
- def test_no_op_returns_number(self):
- self.assertEqual(1, rpn("1"))
- def test_no_op_returns_number2(self):
- self.assertEqual(2, rpn("2"))
- def test_putting_up_two_numbers_is_an_error(self):
- self.assertRaises(Exception, rpn, "2 3")
- def test_plus(self):
- self.assertEqual(5, rpn("2 3 +"))
- def test_plus2(self):
- self.assertEqual(6, rpn("2 4 +"))
- def test_two_pluses(self):
- self.assertEqual(9, rpn("2 4 + 3 +"))
- def test_minus(self):
- self.assertEqual(-2, rpn("2 4 -"))
- def test_minus2(self):
- self.assertEqual(0, rpn("2 2 -"))
- def test_plus_minus(self):
- self.assertEqual(3, rpn("2 2 + 1 -"))
- def test_tab_accepted(self):
- self.assertEqual(3, rpn("2\t2 + 1 -"))
- def test_double_space_accepted(self):
- self.assertEqual(3, rpn("2 2 + 1 -"))
- def test_times(self):
- self.assertEqual(10, rpn("2 5 *"))
- def test_through(self):
- self.assertEqual(6, rpn("12 2 /"))
- def test_through_rounds_down(self):
- self.assertEqual(6, rpn("13 2 /"))
- def test_through_rounds_down2(self):
- self.assertEqual(-7, rpn("-13 2 /"))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement