import json,copy,unittest
from pathlib import Path
from compare import compare
class MutationTests(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        p=Path(__file__).parent;cls.b=json.loads((p/'evidence-B.json').read_text());cls.c=json.loads((p/'evidence-C.json').read_text())
    def test_real(self):compare(self.b,self.c)
    def test_mutations(self):
        def fee_type(x):x['cases'][1]['body']['data']['detail']['rule'][0]['first_fee']=0
        def double_value(x):x['cases'][8]['body']['data']['detail']['rule'][0]['first']=0.26
        def ratio_not_money(x):x['cases'][8]['body']['data']['detail']['rule'][0]['first_fee']='1.00'
        def json_shape(x):x['cases'][1]['body']['data']['detail']['rule'][0]['region']={}
        def nested_json(x):x['cases'][1]['body']['data']['detail']['rule'][0]['region_text'][0]['name']='wrong'
        def order(x):x['cases'][1]['body']['data']['detail']['rule'].reverse()
        def key(x):x['cases'][1]['body']['data']['detail'].pop('store_id')
        def empty(x):x['cases'][2]['body']['data']['list']['data']=[]
        def parent_id(x):x['cases'][1]['body']['data']['detail']['rule'][0]['delivery_id']=99
        def wrong_delete(x):x['soft_delete']['child_raw_unchanged']=False
        def old_rule(x):x['rule_replacement']['old_rules_physical_remaining']=2
        def retained(x):x['retention']['fresh_counts']['delivery_rule']=2
        def deferred_fk(x):x['independent_final_original']['child_parent_FK_independently_verified_after_commit']=False
        def scope(x):x['write_audit'][0]['owned_scope_verified']=False
        def warning(x):x['events'][0]['fingerprint_lexical_warning']=True
        def source(x):x['loaded_boundary']['terminal_model_sha']='wrong'
        for f in (fee_type,double_value,ratio_not_money,json_shape,nested_json,order,key,empty,parent_id,wrong_delete,old_rule,retained,deferred_fk,scope,warning,source):
            x=copy.deepcopy(self.c);f(x)
            with self.subTest(mutation=f.__name__),self.assertRaises(AssertionError):compare(self.b,x)
if __name__=='__main__':unittest.main()
