#!/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('habit_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-habit-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)
ratio = copy.deepcopy(c)
ratio['cases'][0]['body']['data']['detail'][0]['ratio'] = 1.2
expect(verdict(b, ratio), False)
order = copy.deepcopy(c)
order['cases'][9]['body']['data']['detail']['info'].reverse()
expect(verdict(b, order), False)
lost_queue = copy.deepcopy(c)
lost_queue['queue_captures'].pop()
expect(verdict(b, lost_queue), False)
wrong_owner = copy.deepcopy(c)
wrong_owner['queue_captures'][0]['store_id'] = 2147000422
expect(verdict(b, wrong_owner), False)
leak = copy.deepcopy(c)
leak['cleanup']['fresh_pdo_owned_rows']['staff'] = 1
expect(verdict(b, leak), False)
ignored_boundary = copy.deepcopy(c)
ignored_boundary['boundary_findings'][0]['strict_scalar_type_error'] = False
expect(verdict(b, ignored_boundary), False)
empty_object = copy.deepcopy(c)
empty_object['cases'][1]['raw_json_shape']['object']['data'] = {'object': {}}
expect(verdict(b, empty_object), False)
print(json.dumps({'status': 'PASS', 'assertions': checks}))
