#!/usr/bin/env python3
import copy,sys,unittest
from verify import load,verify_loaded
original=(load(*sys.argv[1:4]),load(*sys.argv[4:7]))
class Gates(unittest.TestCase):
    def test_positive(self):
        r=verify_loaded(*copy.deepcopy(original));self.assertEqual((5,2),(r['dual_engine_positive_methods'],r['limited_methods']));self.assertFalse(r['sql_fingerprint_classification_gate_closed'])
mutations={
    'decimal_number':lambda x:x[1]['green']['responses']['DISHES']['body']['data']['dishes'][0].update(weight=0),
    'recipe_decimal_number':lambda x:x[1]['green']['responses']['RECIPE_INFO']['body']['data'][0].update(weight=0),
    'tag_omitted':lambda x:x[1]['green']['responses']['DISHES']['body']['data']['recipes'][0].pop('tag'),
    'unknown_field':lambda x:x[1]['green']['responses']['DISHES']['body']['data']['dishes'][0].update(unexpected=1),
    'hardware_object':lambda x:x[1]['green']['responses']['HARDWARE']['body'].update(data={}),
    'check_empty_object':lambda x:x[1]['green']['responses']['CHECK_MENU']['body']['data'].update(rows={}),
    'original_boolean_message':lambda x:x[1]['green']['responses']['HARDWARE']['body'].update(message='true'),
    'wrong_message':lambda x:x[1]['green']['responses']['DISHES']['body'].update(message='wrong'),
    'missing_version_not_null':lambda x:x[1]['version']['responses']['VERSION_MISSING']['body'].update(data={}),
    'version_time26':lambda x:x[1]['version']['responses']['VERSION_READ']['body']['data'].update(create_time='2026-01-01 00:00:00.000000'),
    'version_field_type':lambda x:x[1]['version']['responses']['VERSION_READ']['body']['data'].update(is_renew='1'),
    'source_failed':lambda x:x[1]['green']['readback']['cases'][0].update({'pass':False}),
    'wrong_decimal_source_sha':lambda x:x[1]['green']['report']['source_sha256'].update({'application/p/logic/DateMenu.php':'0'*64}),
    'wrong_version_source_sha':lambda x:x[1]['version']['report']['source_sha256'].update({'application/p/logic/Equipment.php':'0'*64}),
    'natural_user_changed':lambda x:x[1]['cleanup'].update(natural_user_unchanged=False),
    'actor_funds_changed':lambda x:x[1]['cleanup'].update(owned_actor_funds_zero=False),
    'actor_type_changed':lambda x:x[1]['cleanup']['owned_actor_retained'].update(type=1),
    'actor_status_bool':lambda x:x[1]['cleanup']['owned_actor_retained'].update(status=False),
    'port_left_running':lambda x:x[1]['cleanup'].update(port_not_listening=False),
    'missing_case':lambda x:x[1]['green']['report']['cases'].pop(),
    'observed_write':lambda x:x[1]['green']['report']['events'][0].update(operation='insert'),
    'red_wrong_value':lambda x:x[1]['red']['responses']['DISHES']['body']['data']['dishes'][0].update(weight=99999),
}
for name,change in mutations.items():
    def test(self,change=change):
        x=copy.deepcopy(original);change(x)
        with self.assertRaises((AssertionError,KeyError,TypeError,ValueError)):verify_loaded(*x)
    setattr(Gates,'test_reject_'+name,test)
if __name__=='__main__':unittest.main(argv=[sys.argv[0]],verbosity=2)
