import copy,json,unittest
import compare
class ComparatorGuards(unittest.TestCase):
    @classmethod
    def setUpClass(cls):cls.e=json.loads((compare.ROOT/'evidence-C.json').read_text())
    def test_real(self):self.assertEqual(compare.verify(copy.deepcopy(self.e))['requests'],16)
    def rejected(self,fn):
        e=copy.deepcopy(self.e);fn(e)
        with self.assertRaises(AssertionError):compare.verify(e)
    def test_type(self):self.assertFalse(compare.equal(1,1.0))
    def test_bool(self):self.assertFalse(compare.equal(True,1))
    def test_container(self):self.assertFalse(compare.equal([],{}))
    def test_order(self):self.assertFalse(compare.equal([1,2],[2,1]))
    def test_null(self):self.assertFalse(compare.equal(None,''))
    def test_member_order(self):self.assertTrue(compare.equal({'a':1,'b':2},{'b':2,'a':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_source_drift(self):self.rejected(lambda e:e['boundary']['candidate_v2']['reflection'][compare.SERVICE].update(sha256='wrong'))
    def test_scope(self):self.rejected(lambda e:e['sql_audit'][0].update(tenant_scope_verified=False))
    def test_original_drift(self):self.rejected(lambda e:e.update(original_rows_unchanged=False))
    def test_candidate_failure(self):self.rejected(lambda e:e['cases'][-1].update(complete_original_equal=False))
    def test_hash_changed(self):self.rejected(lambda e:e['cases'][-1]['actual_contract'].update(type='array'))
    def test_native_exit(self):self.rejected(lambda e:e['cases'][-1].update(native_exit=1))
    def test_tokens(self):self.rejected(lambda e:e.update(tokens_cache_reclaimed=False))
    def test_hide_original_failures(self):self.rejected(lambda e:e.update(original_type_difference_paths=0))
    def test_actual_value_hash(self):self.rejected(lambda e:e['cases'][-1]['actual_contract']['members']['is_loading'].update(value_sha256='changed'))
    def test_actual_empty_array_type(self):self.rejected(lambda e:e['cases'][-1]['actual_contract']['members']['cz'].update(type='object'))
    def test_actual_array_order(self):self.rejected(lambda e:e['cases'][8]['actual_contract']['members']['dishes_category']['items'].reverse())
if __name__=='__main__':unittest.main()
