#!/usr/bin/env python3
import contextlib
import copy
import importlib.util
import io
import json
from pathlib import Path
import sys
import tempfile
here = Path(__file__).resolve().parent
spec = importlib.util.spec_from_file_location('dict_compare', here / 'compare.py')
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
b = json.loads((here / 'evidence-B.json').read_text())
c = json.loads((here / 'evidence-C.json').read_text())
def verdict(left, right):
    with tempfile.TemporaryDirectory(prefix='cdx-dict-compare-') as folder:
        bp, cp = Path(folder) / 'b.json', Path(folder) / 'c.json'
        bp.write_text(json.dumps(left, ensure_ascii=False)); cp.write_text(json.dumps(right, ensure_ascii=False))
        old = sys.argv; sys.argv = ['compare.py', str(bp), str(cp)]
        try:
            with contextlib.redirect_stdout(io.StringIO()):
                return module.main() == 0
        except (AssertionError, KeyError, TypeError):
            return False
        finally:
            sys.argv = old
checks = 0
def expect(value, wanted):
    global checks
    checks += 1
    assert value is wanted, 'mutation assertion ' + str(checks)
expect(verdict(b, c), True)
empty_b, empty_c = copy.deepcopy(b), copy.deepcopy(c)
empty_b['cases'] = empty_c['cases'] = []; empty_b['case_count'] = empty_c['case_count'] = 0
expect(verdict(empty_b, empty_c), False)
changed = copy.deepcopy(c)
changed['cases'][0]['complete_wire_sha_without_trace'] = changed['cases'][1]['complete_wire_sha_without_trace'] = '0' * 64
expect(verdict(b, changed), False)
no_source = copy.deepcopy(c); no_source['cases'][0]['source_rows'] = 0
expect(verdict(b, no_source), False)
http = copy.deepcopy(c); http['cases'][0]['http_status'] = 500
expect(verdict(b, http), False)
kind = copy.deepcopy(c); kind['cases'][0]['raw_json_shape']['object']['data']['object']['list'] = {'object': {}}
expect(verdict(b, kind), False)
write = copy.deepcopy(c); write['cleanup']['framework_dml_observed'] = 1
expect(verdict(b, write), False)
leak = copy.deepcopy(c); leak['cleanup']['token_absent'] = False
expect(verdict(b, leak), False)
typed = copy.deepcopy(c); typed['cases'][0]['raw_json_shape']['object']['data']['object']['list']['array'][0]['object']['id'] = 'string'
expect(verdict(b, typed), False)
print(json.dumps({'status': 'PASS', 'assertions': checks}))
