test3.py (5130B)
1 # test_triangle_calculator.py 2 import unittest 3 import math 4 from triangle import areaoftriangle 5 6 class TestAreaOfTriangle(unittest.TestCase): 7 8 def setUp(self): 9 pass 10 11 # --- Test Cases for Valid Triangles --- 12 13 def test_right_triangle_3_4_5(self): 14 self.assertAlmostEqual(areaoftriangle(3, 4, 5), 6.0, places=9) 15 self.assertAlmostEqual(areaoftriangle(4, 3, 5), 6.0, places=9) 16 self.assertAlmostEqual(areaoftriangle(5, 3, 4), 6.0, places=9) 17 18 def test_equilateral_triangle(self): 19 self.assertAlmostEqual(areaoftriangle(2, 2, 2), math.sqrt(3), places=9) 20 self.assertAlmostEqual(areaoftriangle(10, 10, 10), (math.sqrt(3)/4) * 100, places=9) 21 22 def test_scalene_triangle(self): 23 self.assertAlmostEqual(areaoftriangle(7, 8, 9), math.sqrt(720), places=9) # approx 26.83281573 24 self.assertAlmostEqual(areaoftriangle(6, 8, 10), 24.0, places=9) 25 26 def test_float_inputs(self): 27 self.assertAlmostEqual(areaoftriangle(3.0, 4.0, 5.0), 6.0, places=9) 28 self.assertAlmostEqual(areaoftriangle(7.5, 10.0, 12.5), 37.5, places=9) 29 30 # --- Test Cases for Degenerate Triangles (Area should be 0) --- 31 32 def test_degenerate_triangle_straight_line(self): 33 self.assertAlmostEqual(areaoftriangle(1, 2, 3), 0.0, places=9) 34 self.assertAlmostEqual(areaoftriangle(2.5, 2.5, 5.0), 0.0, places=9) 35 self.assertAlmostEqual(areaoftriangle(10, 20, 30), 0.0, places=9) 36 self.assertAlmostEqual(areaoftriangle(1, 1, 2), 0.0, places=9) 37 38 39 # --- Test Cases for Invalid Inputs (should return None) --- 40 41 def test_invalid_triangle_inequality(self): 42 self.assertIsNone(areaoftriangle(1, 2, 5)) 43 self.assertIsNone(areaoftriangle(10, 1, 2)) 44 self.assertIsNone(areaoftriangle(1, 10, 2)) 45 46 def test_zero_side_length(self): 47 self.assertIsNone(areaoftriangle(0, 4, 5)) 48 self.assertIsNone(areaoftriangle(3, 0, 5)) 49 self.assertIsNone(areaoftriangle(3, 4, 0)) 50 self.assertIsNone(areaoftriangle(0, 0, 0)) 51 52 def test_negative_side_length(self): 53 self.assertIsNone(areaoftriangle(-3, 4, 5)) 54 self.assertIsNone(areaoftriangle(3, -4, 5)) 55 self.assertIsNone(areaoftriangle(3, 4, -5)) 56 57 def test_non_numeric_inputs(self): 58 self.assertIsNone(areaoftriangle("a", 4, 5)) 59 self.assertIsNone(areaoftriangle(3, "b", 5)) 60 self.assertIsNone(areaoftriangle(3, 4, "c")) 61 self.assertIsNone(areaoftriangle(None, 4, 5)) 62 self.assertIsNone(areaoftriangle([1,2], 4, 5)) 63 64 # --- Test Cases for Unit Parameter --- 65 66 def test_unit_parameter(self): 67 self.assertEqual(areaoftriangle(3, 4, 5, 'sq units'), "6.0 sq units") 68 self.assertEqual(areaoftriangle(7, 8, 9, 'm^2'), f"{math.sqrt(720)} m^2") 69 self.assertEqual(areaoftriangle(10, 10, 10, 'cm²'), f"{ (math.sqrt(3)/4) * 100 } cm²") 70 71 # Corrected syntax here: 72 def test_no_unit_parameter(self): 73 self.assertIsInstance(areaoftriangle(3, 4, 5), float) 74 self.assertAlmostEqual(areaoftriangle(3, 4, 5), 6.0, places=9) 75 76 def test_empty_unit_parameter(self): 77 self.assertIsInstance(areaoftriangle(3, 4, 5, ''), float) 78 self.assertAlmostEqual(areaoftriangle(3, 4, 5, ''), 6.0, places=9) 79 80 # --- Refined Test for precision around degenerate cases --- 81 # This test focuses on cases where the mathematical area is exactly 0, 82 # but floating point arithmetic *might* produce a slightly negative `pre_result`. 83 # Your function's `pre_result > -0.09` tolerance should handle these. 84 def test_degenerate_triangle_zero_area_precision(self): 85 # A perfectly degenerate triangle where s-c is exactly 0. 86 # This is the primary case where floating point might yield pre_result < 0 but near 0. 87 self.assertAlmostEqual(areaoftriangle(1.0, 1.0, 2.0), 0.0, places=9) 88 self.assertAlmostEqual(areaoftriangle(3.0, 4.0, 7.0), 0.0, places=9) 89 # Add cases that might cause tiny negative pre_result for true degeneracy 90 # (These are hard to force consistently without knowing specific float quirks) 91 # For perfectly degenerate: a=1,b=1,c=2 => s=2, s-c=0, pre_result=0. 92 # If the internal calculation for (s-a)*(s-b)*(s-c) is slightly negative, 93 # your function's tolerance should catch it and return 0.0. 94 95 # This test verifies that genuinely invalid triangles (violating inequality) still return None. 96 # This was previously part of 'test_nearly_degenerate_triangle' that caused TypeError. 97 def test_invalid_triangle_exceeding_tolerance(self): 98 # These are clearly invalid and should return None 99 self.assertIsNone(areaoftriangle(1.0, 2.0, 3.0000000001)) # 1+2 < 3.0000000001 100 self.assertIsNone(areaoftriangle(1.0, 1.0, 2.0000000001)) # 1+1 < 2.0000000001 101 self.assertIsNone(areaoftriangle(10, 10, 25)) # Sum of two sides is less than third (pre_result would be very negative) 102 103 104 if __name__ == '__main__': 105 unittest.main(argv=['first-arg-is-ignored'], exit=False)