import json,copy,unittest
from pathlib import Path
from compare import compare
class ExactContractMutations(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 sort_type(c):c['cases'][3]['body']['data']['list']['data'][0]['sort']='0'
        def code_zero(c):c['cases'][3]['body']['data']['list']['data'][0]['kuaidi100_code']='lost-leading-zero'
        def order(c):c['cases'][3]['body']['data']['list']['data'].reverse()
        def empty(c):c['cases'][3]['body']['data']['list']['data']=[]
        def key(c):c['cases'][3]['body']['data']['list']['data'][0].pop('store_id')
        def shape(c):c['cases'][6]['body']['data']['list']={}
        def counter(c):c['cases'][3]['body']['data']['list']['total']=2
        def proof(c):c['cases'][3]['complete_original_projection_equal']=False
        def scope(c):c['write_audit'][0]['owned_scope_verified']=False
        def retained(c):c['retention']['fresh_exact_owned_rows']['store']=2
        def timestamp(c):c['independent_final_original']['original_integer_epoch_windows_verified']=False
        def warning(c):c['events'][0]['fingerprint_lexical_warning']=True
        def source(c):c['loaded_boundary']['store_model_sha']='wrong'
        def error_positive(c):c['cases'][10]['body']['status']=200
        def delete_claim(c):c['independent_final_original']['business_physical_delete_performed']=True
        for f in (sort_type,code_zero,order,empty,key,shape,counter,proof,scope,retained,timestamp,warning,source,error_positive,delete_claim):
            c=copy.deepcopy(self.c);f(c)
            with self.subTest(mutation=f.__name__),self.assertRaises(AssertionError):compare(self.b,c)
if __name__=='__main__':unittest.main()
