"""test_calc.py - Unit tests for calc module.""" import unittest import calc class TestCalcOperations(unittest.TestCase): """Test suite for basic arithmetic operations in calc module.""" # ------------------ ADD TESTS ------------------ def test_add_integers(self): """Test addition with standard integers.""" self.assertEqual(calc.add(2, 3), 5) self.assertEqual(calc.add(10, 5), 15) def test_add_negative_numbers(self): """Test addition with negative numbers.""" self.assertEqual(calc.add(-1, 1), 0) self.assertEqual(calc.add(-1, -1), -2) self.assertEqual(calc.add(-5, 10), 5) def test_add_zero(self): """Test addition with zero.""" self.assertEqual(calc.add(0, 0), 0) self.assertEqual(calc.add(0, 5), 5) self.assertEqual(calc.add(5, 0), 5) self.assertEqual(calc.add(-5, 0), -5) def test_add_floats(self): """Test addition with floating point numbers.""" self.assertEqual(calc.add(1.5, 2.5), 4.0) self.assertAlmostEqual(calc.add(0.1, 0.2), 0.3, places=7) self.assertEqual(calc.add(-1.5, 1.5), 0.0) def test_add_large_numbers(self): """Test addition with large numbers.""" self.assertEqual(calc.add(10**12, 10**12), 2 * 10**12) def test_add_invalid_types(self): """Test addition with invalid types raises TypeError.""" with self.assertRaises(TypeError): calc.add("a", 2) with self.assertRaises(TypeError): calc.add(2, "b") with self.assertRaises(TypeError): calc.add(None, 5) with self.assertRaises(TypeError): calc.add(True, 1) with self.assertRaises(TypeError): calc.add(1, False) # ------------------ SUBTRACT TESTS ------------------ def test_subtract_integers(self): """Test subtraction with standard integers.""" self.assertEqual(calc.subtract(10, 5), 5) self.assertEqual(calc.subtract(5, 10), -5) def test_subtract_negative_numbers(self): """Test subtraction with negative numbers.""" self.assertEqual(calc.subtract(-1, 1), -2) self.assertEqual(calc.subtract(-1, -1), 0) self.assertEqual(calc.subtract(5, -5), 10) def test_subtract_zero(self): """Test subtraction with zero.""" self.assertEqual(calc.subtract(0, 0), 0) self.assertEqual(calc.subtract(5, 0), 5) self.assertEqual(calc.subtract(0, 5), -5) def test_subtract_floats(self): """Test subtraction with floating point numbers.""" self.assertEqual(calc.subtract(5.5, 2.5), 3.0) self.assertAlmostEqual(calc.subtract(0.3, 0.1), 0.2, places=7) def test_subtract_invalid_types(self): """Test subtraction with invalid types raises TypeError.""" with self.assertRaises(TypeError): calc.subtract("5", 3) with self.assertRaises(TypeError): calc.subtract(5, [1]) with self.assertRaises(TypeError): calc.subtract(True, 3) # ------------------ MULTIPLY TESTS ------------------ def test_multiply_integers(self): """Test multiplication with standard integers.""" self.assertEqual(calc.multiply(10, 5), 50) self.assertEqual(calc.multiply(3, 7), 21) def test_multiply_negative_numbers(self): """Test multiplication with negative numbers.""" self.assertEqual(calc.multiply(-1, 1), -1) self.assertEqual(calc.multiply(-1, -1), 1) self.assertEqual(calc.multiply(-5, 6), -30) def test_multiply_zero(self): """Test multiplication with zero.""" self.assertEqual(calc.multiply(0, 0), 0) self.assertEqual(calc.multiply(100, 0), 0) self.assertEqual(calc.multiply(0, 100), 0) def test_multiply_floats(self): """Test multiplication with floating point numbers.""" self.assertEqual(calc.multiply(2.5, 4.0), 10.0) self.assertAlmostEqual(calc.multiply(0.5, 0.5), 0.25, places=7) def test_multiply_invalid_types(self): """Test multiplication with invalid types raises TypeError.""" with self.assertRaises(TypeError): calc.multiply("3", 4) with self.assertRaises(TypeError): calc.multiply(4, None) with self.assertRaises(TypeError): calc.multiply(False, 5) # ------------------ DIVIDE TESTS ------------------ def test_divide_integers(self): """Test division resulting in whole and fractional numbers.""" self.assertEqual(calc.divide(10, 5), 2.0) self.assertEqual(calc.divide(5, 2), 2.5) def test_divide_negative_numbers(self): """Test division with negative numbers.""" self.assertEqual(calc.divide(-1, 1), -1.0) self.assertEqual(calc.divide(-1, -1), 1.0) self.assertEqual(calc.divide(10, -2), -5.0) def test_divide_zero_numerator(self): """Test division when numerator is zero.""" self.assertEqual(calc.divide(0, 5), 0.0) self.assertEqual(calc.divide(0, -5), 0.0) def test_divide_floats(self): """Test division with floating point numbers.""" self.assertAlmostEqual(calc.divide(1, 3), 1 / 3, places=7) self.assertEqual(calc.divide(7.5, 2.5), 3.0) def test_divide_by_zero_raises_error(self): """Test that dividing by zero raises ZeroDivisionError.""" with self.assertRaises(ZeroDivisionError): calc.divide(10, 0) with self.assertRaises(ZeroDivisionError): calc.divide(0, 0) with self.assertRaises(ZeroDivisionError): calc.divide(10, 0.0) with self.assertRaises(ZeroDivisionError): calc.divide(-5.5, 0) def test_divide_invalid_types(self): """Test division with invalid types raises TypeError.""" with self.assertRaises(TypeError): calc.divide("10", 2) with self.assertRaises(TypeError): calc.divide(10, "2") with self.assertRaises(TypeError): calc.divide(10, None) with self.assertRaises(TypeError): calc.divide(True, 2) class TestCalculatorClass(unittest.TestCase): """Test suite verifying Calculator class interface.""" def test_calculator_static_methods(self): """Test static methods on Calculator class.""" self.assertEqual(calc.Calculator.add(3, 4), 7) self.assertEqual(calc.Calculator.subtract(10, 4), 6) self.assertEqual(calc.Calculator.multiply(3, 4), 12) self.assertEqual(calc.Calculator.divide(10, 2), 5.0) with self.assertRaises(ZeroDivisionError): calc.Calculator.divide(10, 0) def test_calculator_instance_methods(self): """Test instance methods on Calculator object.""" calculator = calc.Calculator() self.assertEqual(calculator.add(3, 4), 7) self.assertEqual(calculator.subtract(10, 4), 6) self.assertEqual(calculator.multiply(3, 4), 12) self.assertEqual(calculator.divide(10, 2), 5.0) with self.assertRaises(ZeroDivisionError): calculator.divide(5, 0) if __name__ == "__main__": unittest.main()