#!/usr/bin/env python3
import copy,json,unittest
from pathlib import Path
from compare import compare


class Mutations(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 reject(self,mutate):
        c=copy.deepcopy(self.c);mutate(c)
        with self.assertRaises(AssertionError):compare(self.b,c)
    def test_green(self):compare(self.b,self.c)
    def test_return_id_original_string(self):self.reject(lambda c:c['cases'][0]['body']['data'].__setitem__('id',1))
    def test_detail_decimal_string(self):self.reject(lambda c:c['cases'][1]['body']['data']['detail'].__setitem__('weight',61.25))
    def test_detail_date_only(self):self.reject(lambda c:c['cases'][1]['body']['data']['detail'].__setitem__('set_date','2030-03-02'))
    def test_BMI_original_semantics(self):self.reject(lambda c:c['cases'][1]['body']['data']['detail'].__setitem__('bmi','20.89'))
    def test_duplicate_distinct_id(self):self.reject(lambda c:c['cases'][2]['body']['data'].__setitem__('id','1'))
    def test_recommend_independent_value(self):self.reject(lambda c:c['jobs'][0]['full_independent_recommend_values'].__setitem__('ree','0.00'))
    def test_history_increment(self):self.reject(lambda c:c['jobs'][1].__setitem__('history_rows',1))
    def test_old_history_preserved(self):self.reject(lambda c:c['jobs'][1].__setitem__('prior_history_unchanged',False))
    def test_final_staff_zero(self):self.reject(lambda c:c['jobs'][-1]['full_independent_recommend_values'].__setitem__('weight','61.25'))
    def test_retained_not_fake_zero(self):self.reject(lambda c:c['retention']['fresh_pdo_counts'].__setitem__('staff_weight',0))
    def test_natural_exact_exclusion(self):self.reject(lambda c:c['retention'].__setitem__('exact_owned_pk_exclusions_only',False))
    def test_scope(self):self.reject(lambda c:c['write_audit'][0].__setitem__('owned_scope_verified',False))
    def test_refusal_not_success(self):self.reject(lambda c:c['cases'][14]['body'].__setitem__('status',200))
    def test_recovery_not_arbitrary_ignore(self):
        self.reject(lambda c:c['original_proofs'][5].__setitem__('all_input_values_verified',False))
    def test_raw_shape(self):self.reject(lambda c:c['cases'][0]['raw_json_shape'].__setitem__('object',[]))
    def test_all_failure_not_positive(self):self.reject(lambda c:c['boundary_findings'][0].__setitem__('business_status',200))


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