"""Original InternshipDeadlines ideal circuit exercise. Python 3.10+.
Run: python divider_check.py
Software-only; no hardware access. Ideal source/resistors, no component or
instrument nonidealities. Not installation guidance or a safety approval.
"""
import math
import json
import unittest

def finite(value,name):
    try: result=float(value)
    except (ValueError,TypeError): raise ValueError(name+' must be a finite number') from None
    if not math.isfinite(result): raise ValueError(name+' must be finite')
    return result

def divider(volts, upper, lower, load=None):
    volts=finite(volts,'voltage'); upper=finite(upper,'upper resistance'); lower=finite(lower,'lower resistance')
    if volts < 0 or upper <= 0 or lower <= 0:
        raise ValueError('Use nonnegative voltage and positive resistances')
    equivalent=lower
    if load is not None:
        load=finite(load,'load resistance')
        if load <= 0: raise ValueError('Load resistance must be positive, or None for no load')
        equivalent=1/(1/lower+1/load)
    output=volts*equivalent/(upper+equivalent)
    if not math.isfinite(output): raise ValueError('Inputs exceed the supported numerical range')
    return {'lower_equivalent_ohms':equivalent,'output_volts':output}

class DividerTests(unittest.TestCase):
    def test_unloaded(self):
        self.assertAlmostEqual(divider(5,1000,2000)['output_volts'],10/3)
    def test_loaded(self):
        self.assertEqual(divider(5,1000,2000,2000),{'lower_equivalent_ohms':1000.0,'output_volts':2.5})
    def test_zero_source(self):
        self.assertEqual(divider(0,1000,2000)['output_volts'],0)
    def test_large_load_approaches_unloaded(self):
        self.assertAlmostEqual(divider(5,1000,2000,1e12)['output_volts'],10/3,places=7)
    def test_invalid_resistance(self):
        for args in [(5,0,2000),(5,1000,-1),(5,1000,2000,0),(5,float('nan'),2000)]:
            with self.assertRaises(ValueError): divider(*args)

if __name__ == '__main__':
    print(json.dumps({'unloaded':divider(5,1000,2000),'loaded':divider(5,1000,2000,2000)},indent=2))
    result=unittest.TextTestRunner(verbosity=2).run(unittest.defaultTestLoader.loadTestsFromTestCase(DividerTests))
    raise SystemExit(0 if result.wasSuccessful() else 1)
