"""Original InternshipDeadlines one-dimensional fit exercise. Python 3.10+.
Run: python fit_check.py
All dimensions in millimeters. Excludes shape, finish, alignment and deformation;
not a physical design approval or safety certification.
"""
from decimal import Decimal, InvalidOperation
import json
import unittest

def number(value):
    try: result=Decimal(str(value))
    except (InvalidOperation,ValueError): raise ValueError('Invalid dimension') from None
    if not result.is_finite(): raise ValueError('Dimensions must be finite')
    return result

def check(opening, opening_tolerance, tab, tab_tolerance, required):
    opening,ot,tab,tt,required=map(number,(opening,opening_tolerance,tab,tab_tolerance,required))
    if ot < 0 or tt < 0 or required < 0: raise ValueError('Tolerance and required clearance must be nonnegative')
    if opening-ot <= 0 or tab-tt <= 0: raise ValueError('Minimum dimensions must be positive')
    nominal=opening-tab
    minimum=(opening-ot)-(tab+tt)
    maximum=(opening+ot)-(tab-tt)
    return {'nominal_mm':nominal,'minimum_mm':minimum,'maximum_mm':maximum,
            'required_mm':required,'passes':minimum >= required}

class FitTests(unittest.TestCase):
    def test_known_failure(self):
        r=check('20.0','0.2','19.5','0.1','0.3')
        self.assertEqual(r['nominal_mm'],Decimal('0.5'))
        self.assertEqual(r['minimum_mm'],Decimal('0.2'))
        self.assertEqual(r['maximum_mm'],Decimal('0.8'))
        self.assertFalse(r['passes'])
    def test_exact_boundary_passes(self):
        self.assertTrue(check('20','0.1','19.5','0.1','0.3')['passes'])
    def test_clear_pass(self):
        self.assertTrue(check('21','0.2','19.5','0.1','0.3')['passes'])
    def test_interference_fails(self):
        self.assertFalse(check('19','0.1','20','0.1','0')['passes'])
    def test_invalid_inputs(self):
        for args in [('20','-0.1','19','0.1','0'),('0.1','0.2','19','0.1','0'),('NaN','0','19','0','0')]:
            with self.assertRaises(ValueError): check(*args)

if __name__ == '__main__':
    print(json.dumps(check('20.0','0.2','19.5','0.1','0.3'),default=str,indent=2))
    result=unittest.TextTestRunner(verbosity=2).run(unittest.defaultTestLoader.loadTestsFromTestCase(FitTests))
    raise SystemExit(0 if result.wasSuccessful() else 1)
