import copy,json,unittest
import compare
class InfosComparatorGuards(unittest.TestCase):
    @classmethod
    def setUpClass(cls):cls.e=json.loads((compare.ROOT/'infos-evidence-C.json').read_text())
    def rejected(self,f):
        e=copy.deepcopy(self.e);f(e)
        with self.assertRaises(AssertionError):compare.verify(e)
    def test_real(self):self.assertEqual(compare.verify(copy.deepcopy(self.e)),(10,40,1))
    def test_number_type(self):self.assertFalse(compare.eq(1,1.0))
    def test_bool(self):self.assertFalse(compare.eq(True,1))
    def test_container(self):self.assertFalse(compare.eq([],{}))
    def test_order(self):self.assertFalse(compare.eq([1,2],[2,1]))
    def test_missing_case(self):self.rejected(lambda e:e['cases'].pop())
    def test_dml(self):self.rejected(lambda e:e.update(business_DML=1))
    def test_original_drift(self):self.rejected(lambda e:e.update(original_rows_unchanged=False))
    def test_scope(self):self.rejected(lambda e:e['sql_audit'][0].update(tenant_scope_verified=False))
    def test_model_source(self):self.rejected(lambda e:e['final_boundary']['reflection'][compare.MODEL].update(sha256='changed'))
    def test_service_source(self):self.rejected(lambda e:e['final_boundary']['reflection'][compare.SERVICE].update(sha256='changed'))
    def test_current_equal(self):self.rejected(lambda e:e['cases'][-1].update(complete_original_equal=False))
    def test_actual_scalar_hash(self):self.rejected(lambda e:e['cases'][-1]['actual_contract']['members']['is_loading'].update(value_sha256='changed'))
    def test_actual_array_order(self):self.rejected(lambda e:e['cases'][-1]['actual_contract']['members']['list']['items'].reverse())
    def test_native_exit(self):self.rejected(lambda e:e['cases'][-1].update(native_exit=1))
    def test_old_failure_hidden(self):self.rejected(lambda e:e['cases'][0].update(difference=[]))
    def test_missing_dependency(self):self.rejected(lambda e:e['dependency_C_seven'].pop())
    def test_dependency_wrong_container(self):self.rejected(lambda e:e['dependency_C_seven'][0]['actual_contract'].update(type='array'))
    def test_token_cleanup(self):self.rejected(lambda e:e.update(tokens_cache_reclaimed=False))
if __name__=='__main__':unittest.main()
