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 /"))