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


class Mutations(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        base = Path(__file__).parent
        cls.b = json.loads((base / 'evidence-B.json').read_text())
        cls.c = json.loads((base / '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_missing_case(self): self.reject(lambda c: c['cases'].pop())
    def test_phone_not_numeric(self): self.reject(lambda c: c['original_proofs'][0]['values'].__setitem__('phone', 821))
    def test_wire_phone_leading_zero(self):
        def mutate(c): c['cases'][2]['body']['data']['list']['data'][0]['phone'] = '821'
        self.reject(mutate)
    def test_cascader_order(self):
        def mutate(c): c['cases'][2]['body']['data']['list']['data'][0]['cascader'].reverse()
        self.reject(mutate)
    def test_full_address(self):
        def mutate(c): c['cases'][2]['body']['data']['list']['data'][0]['full_address'] = 'different'
        self.reject(mutate)
    def test_region_name(self):
        def mutate(c): c['cases'][2]['body']['data']['list']['data'][0]['region']['province'] = 'different'
        self.reject(mutate)
    def test_cache_source(self): self.reject(lambda c: c['region_cache_proof'].__setitem__('full_original_projection_equal', False))
    def test_shared_cache(self): self.reject(lambda c: c['region_cache_proof'].__setitem__('shared_cache_accessed', True))
    def test_scope(self): self.reject(lambda c: c['write_audit'][0].__setitem__('owned_scope_verified', False))
    def test_region_write_forbidden(self): self.reject(lambda c: c['write_audit'][0].__setitem__('table', 'yoshop_region'))
    def test_cleanup(self): self.reject(lambda c: c['cleanup'].__setitem__('fresh_pdo_owned_rows', 1))
    def test_cache_left(self): self.reject(lambda c: c['cleanup'].__setitem__('private_cache_files', 1))
    def test_natural_sha(self): self.reject(lambda c: c['cleanup'].__setitem__('address_and_region_full_sha_unchanged', False))
    def test_wire_shape(self): self.reject(lambda c: c['cases'][0]['raw_json_shape'].__setitem__('object', []))


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