test_calculator.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. """
  2. Test Suite for Calculator Module
  3. Tests all mathematical operations including the average function.
  4. """
  5. import unittest
  6. from calculator import add, subtract, multiply, divide, average
  7. class TestBasicOperations(unittest.TestCase):
  8. """Test basic arithmetic operations."""
  9. def test_add_positive_numbers(self):
  10. """Test addition of positive numbers."""
  11. self.assertEqual(add(2, 3), 5)
  12. self.assertEqual(add(10, 20), 30)
  13. def test_add_negative_numbers(self):
  14. """Test addition with negative numbers."""
  15. self.assertEqual(add(-5, -3), -8)
  16. self.assertEqual(add(-5, 3), -2)
  17. def test_add_zero(self):
  18. """Test addition with zero."""
  19. self.assertEqual(add(0, 5), 5)
  20. self.assertEqual(add(5, 0), 5)
  21. def test_subtract_positive_numbers(self):
  22. """Test subtraction of positive numbers."""
  23. self.assertEqual(subtract(10, 5), 5)
  24. self.assertEqual(subtract(20, 8), 12)
  25. def test_subtract_negative_numbers(self):
  26. """Test subtraction with negative numbers."""
  27. self.assertEqual(subtract(-5, -3), -2)
  28. self.assertEqual(subtract(5, -3), 8)
  29. def test_multiply_positive_numbers(self):
  30. """Test multiplication of positive numbers."""
  31. self.assertEqual(multiply(3, 4), 12)
  32. self.assertEqual(multiply(5, 6), 30)
  33. def test_multiply_by_zero(self):
  34. """Test multiplication by zero."""
  35. self.assertEqual(multiply(5, 0), 0)
  36. self.assertEqual(multiply(0, 5), 0)
  37. def test_multiply_negative_numbers(self):
  38. """Test multiplication with negative numbers."""
  39. self.assertEqual(multiply(-3, 4), -12)
  40. self.assertEqual(multiply(-3, -4), 12)
  41. def test_divide_positive_numbers(self):
  42. """Test division of positive numbers."""
  43. self.assertEqual(divide(10, 2), 5)
  44. self.assertEqual(divide(15, 3), 5)
  45. def test_divide_with_float_result(self):
  46. """Test division resulting in float."""
  47. self.assertAlmostEqual(divide(10, 3), 3.333333, places=5)
  48. self.assertEqual(divide(7, 2), 3.5)
  49. def test_divide_by_zero(self):
  50. """Test division by zero raises ValueError."""
  51. with self.assertRaises(ValueError) as context:
  52. divide(10, 0)
  53. self.assertEqual(str(context.exception), "Cannot divide by zero")
  54. class TestAverageFunction(unittest.TestCase):
  55. """Test the average calculation function."""
  56. def test_average_positive_numbers(self):
  57. """Test average of positive numbers."""
  58. self.assertEqual(average(1, 2, 3, 4, 5), 3.0)
  59. self.assertEqual(average(10, 20, 30), 20.0)
  60. def test_average_single_number(self):
  61. """Test average of a single number."""
  62. self.assertEqual(average(5), 5.0)
  63. self.assertEqual(average(42), 42.0)
  64. def test_average_negative_numbers(self):
  65. """Test average with negative numbers."""
  66. self.assertEqual(average(-5, -10, -15), -10.0)
  67. self.assertEqual(average(-2, 2), 0.0)
  68. def test_average_mixed_numbers(self):
  69. """Test average with mixed positive and negative numbers."""
  70. self.assertEqual(average(-10, 0, 10), 0.0)
  71. self.assertEqual(average(1, 2, 3, -6), 0.0)
  72. def test_average_float_numbers(self):
  73. """Test average with float numbers."""
  74. self.assertAlmostEqual(average(1.5, 2.5, 3.5), 2.5)
  75. self.assertAlmostEqual(average(0.1, 0.2, 0.3), 0.2, places=5)
  76. def test_average_empty_list(self):
  77. """Test average with no arguments raises ValueError."""
  78. with self.assertRaises(ValueError) as context:
  79. average()
  80. self.assertEqual(str(context.exception), "Cannot calculate average of empty list")
  81. def test_average_large_dataset(self):
  82. """Test average with a large number of values."""
  83. numbers = list(range(1, 101)) # 1 to 100
  84. self.assertEqual(average(*numbers), 50.5)
  85. class TestEdgeCases(unittest.TestCase):
  86. """Test edge cases and special scenarios."""
  87. def test_operations_with_floats(self):
  88. """Test operations with floating point numbers."""
  89. self.assertAlmostEqual(add(0.1, 0.2), 0.3, places=5)
  90. self.assertAlmostEqual(multiply(0.1, 0.2), 0.02, places=5)
  91. def test_operations_with_large_numbers(self):
  92. """Test operations with large numbers."""
  93. self.assertEqual(add(1000000, 2000000), 3000000)
  94. self.assertEqual(multiply(1000, 1000), 1000000)
  95. if __name__ == '__main__':
  96. # Run unittest tests
  97. unittest.main()