adpkg

A package containing Python mo...
Log | Files | Refs | README | LICENSE

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)
© notamitgamer • Site Built: 2026-07-21 13:58:23 UTC • git-mirror commit: 1037f62 [view raw info]
Originally created with stagit • modified by notamitgamer
Forked from github.com/notamitgamer/git-mirror