Beispiel #1
0
class CalcTests(unittest.TestCase):

    def setUp(self):
        """Create calculator class"""
        self.calc = Calculator()

    def tearDown(self):
        """Destroy calculator class"""
        del self.calc

    def testGetCommands(self):
        """Ensures command list is returned correctly"""
        expected = ("constants: display mathematical constants\n"
                    "exit: close calculator\n"
                    "help: show help\n"
                    "history: input history\n"
                    "prev: previous input\n"
                    "var: save variable\n"
                    "variables: display saved variables")
        commands = self.calc.get_commands()
        self.assertEqual(commands, expected)

    def testAddtoHistoryKey(self):
        """Ensures history is correctly added to"""
        line = "1+2"
        ans = "3"
        self.calc.add_to_history(line, ans)
        self.assertIn(line, self.calc._history)

    def testAddToHistoryValue(self):
        """Ensures answer is correctly added to history"""
        line= "1+2"
        ans = "3"
        self.calc.add_to_history(line, ans)
        self.assertEqual(ans, self.calc._history[line])

    def testGetHistoryNoHistory(self):
        """Ensures history is clear when no calculations have been input"""
        expected = ""
        history = self.calc.get_history()
        self.assertEqual(history, expected)

    def testGetHistoryWithHistory(self):
        """Ensures history returns correct values when calculations have been input"""
        expected = ("1+2 = None\n"
                    "2 * 2 = None")
        self.calc.add_to_history("1+2", "None")
        self.calc.add_to_history("2 * 2", "None")
        history = self.calc.get_history()
        self.assertEqual(history, expected)

    def testGetPrevious(self):
        """Ensures get_previous returns last calculation"""
        self.calc.add_to_history('1+2', '3')
        self.calc.add_to_history('2 * 2', '4')
        self.calc.add_to_history('10/5', '2')
        prev = self.calc.get_previous()
        self.assertEqual('10/5', prev)

    def testGetPreviousWithAnswer(self):
        """Ensures get_previous returns the answer to the last calculation when requested"""
        self.calc.add_to_history('1+2', '3')
        self.calc.add_to_history('2 * 2', '4')
        self.calc.add_to_history('10/5', '2')
        prev, ans = self.calc.get_previous(True)
        self.assertEqual('2', ans)

    def testSetAnswer(self):
        """Ensures previous answer constant gets set"""
        self.calc.set_answer('5')
        self.assertEqual(self.calc._constants['ans'], '5')

    def testSetVariable(self):
        """Ensures that variables can be set correctly"""
        expected = "five set to 5"
        actual = self.calc.set_variable('five', '5')
        self.assertEqual(actual, expected)

    def testSetVariableKeyInVariablesDict(self):
        """Ensures setting variable adds key to variables dict"""
        self.calc.set_variable('five', '5')
        self.assertIn('five', self.calc._variables)

    def testSetVariableValueInVariablesDict(self):
        """Ensures setting variable addes value to variables dict"""
        self.calc.set_variable('five', '5')
        self.assertEqual(self.calc._variables['five'], '5')

    def testSetVariableInvalidKey(self):
        """Ensures only a valid variable may be added (an identifier)"""
        expected = "Error: Variable must begin with a letter"
        actual = self.calc.set_variable('5', '5')
        self.assertEqual(actual, expected)

    def testSetVariableInvalidValue(self):
        """Ensures only a valid value may be added (a number, integer or decimal)"""
        expected = "Error: Value must be an integer or decimal"
        actual = self.calc.set_variable('five', 'X')
        self.assertEqual(actual, expected)

    def testSetVariableInvalidValueLong(self):
        """Ensures only a valid value may be added (integer or decimal)
        Tests for previous error of allowing very long strings
        """
        expected = "Error: Value must be an integer or decimal"
        actual = self.calc.set_variable('t', '9324u2389423723742384')
        self.assertEqual(actual, expected)

    def testSetVariableNoCommandOverride(self):
        """Ensures set_variable does not override commands"""
        self.calc.set_variable('help', '5')
        self.assertNotEqual(self.calc._commands['help'], '5')

    def testSetVariableNoConstantOverride(self):
        """Ensures set_variable does not override constants"""
        self.calc.set_variable('pi', '3.14')
        self.assertNotEqual(self.calc._constants['pi'], '3.14')

    def testGetVariablesNoVariables(self):
        """Ensures no variables are returned by get_variables if none have been added"""
        expected = ""
        variables = self.calc.get_variables()
        self.assertEqual(expected, variables)

    def testGetVariablesWithVariables(self):
        """Ensures all variables are returned by get_variables after variables have been added"""
        expected = ("five = 5\n"
                    "ten = 10")
        self.calc.set_variable('ten', '10')
        self.calc.set_variable('five', '5')
        variables = self.calc.get_variables()
        self.assertEqual(variables, expected)

    def testGetConstants(self):
        """Ensures all constants are returned by get_constants"""
        expected = ("ans = None\n"
                    "e = {0}\n"
                    "pi = {1}".format(math.e, math.pi))
        constants = self.calc.get_constants()
        self.assertEqual(constants, expected)

    def testCheckForVariablesDoesNotExist(self):
        """If input contains a variable or constant, it replaces it with its value
        Ensures that, if the variable doesn't exist, it fails
        """
        eval = "hello"
        expected = None
        actual = self.calc.check_for_variables(eval)
        self.assertEqual(actual, expected)

    def testCheckForVariablesValidVariable(self):
        """If input contains a variable, it should be replaced with its value
        Ensures that, if the variable exists, it is replaced
        """
        var = "x"
        self.calc.set_variable(var, '5')
        result = self.calc.check_for_variables(var)
        self.assertEqual(result, '5')

    def testCheckForVariableValidConstant(self):
        """Ensures that constants are replaced with their appropriate value"""
        eval = 'pi'
        result = self.calc.check_for_variables(eval)
        self.assertEqual(result, str(math.pi))

    def testCheckForVariableValidAnswer(self):
        """Ensures the previous answer constant is added"""
        self.calc.set_answer('5')
        result = self.calc.check_for_variables('ans')
        self.assertEqual(result, '5')

    def testCheckEqualParensEqual(self):
        """Ensures method returns true when input has equal number of left and right parentheses"""
        eval = '((2))'
        result = self.calc.check_equal_parens(eval)
        self.assertTrue(result)

    def testCheckEqualParensNotEqual(self):
        """Ensures method returns false when input has inequal number of left and right parentheses"""
        eval = '(((2))'
        result = self.calc.check_equal_parens(eval)
        self.assertFalse(result)

    def testCalculateReturnsCorrectAdd(self):
        """Ensures calculation is correct for addition"""
        eval = "2+2"
        expected = 4.0
        answer = self.calc.calculate(eval)
        self.assertEqual(answer, expected)

    def testCalculateReturnsCorrectSub(self):
        """Ensures calculation is correct for subtraction"""
        eval = '2-2'
        expected = 0.0
        answer = self.calc.calculate(eval)
        self.assertEqual(answer, expected)

    def testCalculateReturnsCorrectMult(self):
        """Ensures calculation is correct for multiplication"""
        eval = '2*2'
        expected = 4.0
        answer = self.calc.calculate(eval)
        self.assertEqual(answer, expected)

    def testCalculateReturnsCorrectDiv(self):
        """Ensures calculation is correct for division"""
        eval = '2/2'
        expected = 1.0
        answer = self.calc.calculate(eval)
        self.assertEqual(answer, expected)

    def testCalculateReturnsCorrectModulo(self):
        """Ensures calculation is correct for modulus"""
        eval = '10%2'
        expected = 0.0
        answer = self.calc.calculate(eval)
        self.assertEqual(answer, expected)

    def testCalculateReturnsCorrectPower(self):
        """Ensures calculation is correct for eponentiation"""
        eval = '2^2'
        expected = 4.0
        answer = self.calc.calculate(eval)
        self.assertEqual(answer, expected)

    def testCalculateReturnsCorrectComplex(self):
        """Ensures calculation is correct for a more complex calculation"""
        eval = '((10^2/2)*5)-300'
        expected = -50.0
        answer = self.calc.calculate(eval)
        self.assertEqual(answer, expected)

    def testCalculateReturnsCorrectConstant(self):
        """Ensures calculation is correct with constant"""
        eval = '2*pi'
        eval = self.calc.verify(eval)
        expected = 2*math.pi
        answer = self.calc.calculate(eval)
        self.assertEqual(answer, expected)

    def testCalculateReturnsCorrectVariable(self):
        """Ensures calculation is correct with variable"""
        self.calc.set_variable('five', '5')
        eval = 'five^2'
        eval = self.calc.verify(eval)
        expected = 25.0
        answer = self.calc.calculate(eval)
        self.assertEqual(answer, expected)

    def testCalculateReturnsCorrectVeryComplex(self):
        """Ensures calculation is correct with very complex calculation"""
        self.calc.set_variable('onehalf', '1/2')
        eval = '(1000-((20*onehalf)^2)/8) + onehalf*20-4*8'
        eval = self.calc.verify(eval)
        expected = 965.5
        answer = self.calc.calculate(eval)
        self.assertEqual(answer, expected)