#!/usr/bin/env python3
import copy
import sys
import unittest
from verify_next6 import load,verify

class EvidenceTests(unittest.TestCase):
    def test_baseline(self):
        self.assertEqual(verify(B,C)['status'],'pass')

def mutation(name,fn):
    def test(self):
        b,c=copy.deepcopy(B),copy.deepcopy(C)
        fn(b,c)
        with self.assertRaises((AssertionError,KeyError,TypeError)):
            verify(b,c)
    setattr(EvidenceTests,'test_reject_'+name,test)

for name,fn in {
 'source_pass_false':lambda b,c:c['green-report']['cases'][0].__setitem__('source_pass',False),
 'source_window_drift':lambda b,c:c['green-report']['cases'][0].__setitem__('source_window_unchanged',False),
 'body_wire_changed':lambda b,c:c['green-responses']['EQUIPMENT_READ'].__setitem__('raw_wire','{}'),
 'code_bool':lambda b,c:c['green-report']['cases'][0].__setitem__('code',False),
 'method_get':lambda b,c:c['green-report']['cases'][0].__setitem__('method','GET'),
 'source_timestamp_changed':lambda b,c:c['green-source']['EQUIPMENT_READ']['after']['source_sets']['equipment'][0].__setitem__('create_time','wrong'),
 'extra_source_field':lambda b,c:c['green-source']['EQUIPMENT_READ']['after']['source_sets']['equipment'][0].__setitem__('new_reference',1),
 'http500':lambda b,c:c['green-report']['cases'][0].__setitem__('http_status',500),
 'actor_changed':lambda b,c:c['green-report'].__setitem__('actor_unchanged',False),
 'wrong_source_sha':lambda b,c:c['green-report']['source_sha256'].__setitem__('application/p/logic/Equipment.php','0'*64),
 'fixture_write':lambda b,c:c['green-report'].__setitem__('new_fixture_dml',1),
 'http_write':lambda b,c:c['green-report'].__setitem__('http_dml',1),
 'ddl':lambda b,c:c['green-report'].__setitem__('ddl',1),
 'natural_empty_as_positive':lambda b,c:c['green-report']['cases'][0].__setitem__('positive',False),
 'dining_hide_unspecified':lambda b,c:c['dining-green-source']['STAFF_DINING_ALL']['group_oracle'].__setitem__('representative_selection_unresolved',False),
 'dining_known_field_changed':lambda b,c:c['dining-green-source']['STAFF_DINING_ALL']['before']['body']['data']['rows'][0].__setitem__('sex','1'),
 'overflow_red_hidden':lambda b,c:c['boundary-version-overflow'].__setitem__('http_status',200),
 'overflow_input_changed':lambda b,c:c['boundary-version-overflow'].__setitem__('type',98),
 'old_red_overwritten':lambda b,c:c['report']['cases'][0].__setitem__('source_pass',True),
 'port_remaining':lambda b,c:c['cleanup'].__setitem__('port_listening',True),
 'worker_remaining':lambda b,c:c['cleanup'].__setitem__('worker_state_exists',True),
 'cache_remaining':lambda b,c:c['cleanup'].__setitem__('private_cache_files_remaining',1),
 'token_remaining':lambda b,c:c['cleanup'].__setitem__('token_artifacts_remaining',1),
 'owned_meal_updated':lambda b,c:c['cleanup'].__setitem__('fixture_meal_type',1),
 'owned_final_drift':lambda b,c:c['h7-native-after']['own_rows']['staff'].__setitem__('name','changed'),
 'native_fewer_requests':lambda b,c:c['h7-native-verification'].__setitem__('actual_native_requests',3),
 'native_add_method':lambda b,c:c['h7-native-verification'].__setitem__('new_http_methods',2),
 'native_cli_failure':lambda b,c:c['h7-native-verification']['reports']['h7-native-raw'].__setitem__('failures',1),
 'native_tail_object':lambda b,c:c['h7-native-verification']['cases'][0]['json_body']['data'][0]['dishes'].__setitem__(1,{}),
 'native_unowned_image_pk':lambda b,c:c['h7-native-verification']['cases'][0]['json_body']['data'][0].__setitem__('id',123456),
 'native_weight_numeric':lambda b,c:c['h7-native-verification']['cases'][0]['json_body']['data'][0]['dishes'][0].__setitem__('weight',12.34),
}.items():
    mutation(name,fn)

if __name__=='__main__':
    if len(sys.argv)!=3:
        raise SystemExit('usage: test_verify_next6.py B-private-runtime C-private-runtime')
    B,C=load(sys.argv[1]),load(sys.argv[2])
    unittest.main(argv=[sys.argv[0]])
