from copy import deepcopy
import unittest
from settings_migrate import migrate_document, migrate_spec

class MigrationTests(unittest.TestCase):
    def test_only_new_angles_added_and_idempotent(self):
        old=dict(fall=dict(engine='r2',enabled=False,person_score=.4,joint_score=.3,r2={'schema_version':1},roi=[[0,0],[1,0],[1,1]]),
                 fight=dict(engine='r5',r5=dict(schema_version=1,min_samples=4)),tracking={'frame_rate':30},
                 event_cooldowns={'FALL':12.,'FIGHT':10.},uri='fixture',autostart=False)
        before=deepcopy(old);new=migrate_spec(old)
        self.assertEqual(old,before);self.assertEqual(migrate_spec(new),new)
        self.assertEqual(new['fall']['r2'],dict(schema_version=1,r1_torso_min_deg=50.,r1_leg_min_deg=50.,d1_knee_min_deg=140.))
        restored=deepcopy(new);restored['fall']['r2']=old['fall']['r2'];self.assertEqual(restored,old)
        new['fall']['r2']['r1_torso_min_deg']=55.;self.assertEqual(migrate_spec(new),new)
    def test_other_engines_and_empty_base_preserved(self):
        for old in ({},{'fall':{'engine':'legacy'}},{'fall':{'enabled':False}}):self.assertEqual(migrate_spec(old),old)
        self.assertEqual(migrate_document({'streams':[]},'base'),{'streams':[]})
    def test_invalid_future_value_not_silently_repaired(self):
        old={'fall':{'engine':'r2','r2':{'schema_version':1,'r1_leg_min_deg':40}}}
        with self.assertRaises(ValueError):migrate_spec(old)

if __name__=='__main__':unittest.main()
