Something went wrong. Try again.
Native control, inspection, UI automation and evidence capture for a running Witcher 3 process.
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869import jsonfrom pathlib import Pathimport subprocessimport tempfileimport unittest
from witcher_devkit.debug_journal import Journalfrom witcher_devkit.debug_export import export, verify_exportfrom witcher_devkit.debug_conditions import evaluate, validate
class ShadowTests(unittest.TestCase): def test_export_preserves_gaps_failures_and_open_windows(self): with tempfile.TemporaryDirectory() as tmp: folder=Path(tmp); j=Journal(folder/'source') j.append('owner',{'session_id':'s','process':{'pid':1},'build':'b','host_clock_id':'test'}) j.append('intent',{'operation_id':'w','kind':'record-start','status':'accepted','session_id':'s'}) j.append('result',{'operation_id':'w','kind':'record-start','status':'completed','session_id':'s','result':{'window_id':'w'}}) j.append('intent',{'operation_id':'a','kind':'step','status':'accepted','session_id':'s'}) event={'sequence':8,'kind':'contact','generation':1,'time':12.5,'tick':9} native={'session':'s','generation':1,'engine_time':12.5,'data':{'latest':8,'events':[event]}} j.append('native_reply',native); j.append('native_reply',native) j.append('result',{'operation_id':'a','kind':'step','status':'uncertain','session_id':'s','result':{'events':{'generation':1,'gaps':[{'first':1,'last':7}]}}}) j.manifest(); output=folder/'export'; export(j.folder/'manifest.json',output) self.assertTrue(verify_export(output/'manifest.json')['ok']) rows=[json.loads(x) for x in (output/'shadow.jsonl').read_text().splitlines()] self.assertEqual(len([x for x in rows if x['kind']=='contact']),1) self.assertEqual(len([x for x in rows if x['kind']=='stream_gap']),1) self.assertFalse(any(x['kind']=='window_end' for x in rows)) self.assertEqual(json.loads((output/'session.json').read_text())['end_status'],'open') event=next(x for x in rows if x['kind']=='contact') self.assertEqual(event['clock']['engine_seconds']['value'],12.5) reader=Path(__file__).resolve().parents[1]/'readers/shadow-rust/target/debug/witcher-debug-shadow-reader' if reader.exists(): p=subprocess.run([str(reader),str(output/'shadow.jsonl')],capture_output=True,text=True) self.assertEqual(p.returncode,0,p.stderr) self.assertEqual(json.loads(p.stdout)['stream_gaps'],1) # Unknown record kinds are rejected, never silently skipped. rows[0]['kind']='invented' (folder/'invalid.jsonl').write_text(json.dumps(rows[0])+'\n') p=subprocess.run([str(reader),str(folder/'invalid.jsonl')],capture_output=True,text=True) self.assertEqual(p.returncode,1) (output/'shadow.jsonl').write_text('tampered') with self.assertRaisesRegex(ValueError,'digest'): verify_export(output/'manifest.json')
class ConditionTests(unittest.TestCase): def setUp(self): self.world={'generation':3,'data':{'world':{'input_allowed':False,'player':{'hp':200,'alive':True,'position':[0,0,0]}}}} def test_absent_actor_not_dead_and_missing_getter_not_false(self): c={'kind':'actor_dead','generation':3,'actor_id':2} with self.assertRaisesRegex(ValueError,'actor_unavailable'): evaluate(c,self.world,[],lambda *a:{'data':None}) c={'kind':'actor_attacking','generation':3,'actor_id':2,'value':False} call=lambda *a:{'data':{'actors':[{'actor':{'id':2},'combat_storage':{'available':False}}]}} with self.assertRaisesRegex(ValueError,'unsupported_condition'): evaluate(c,self.world,[],call) def test_typed_identity_and_observed_distance(self): c={'kind':'distance_below','generation':3,'actor_id':2,'value':6} self.assertTrue(evaluate(c,self.world,[],lambda *a:{'data':{'position':[3,4,0]}})) c['generation']=4 with self.assertRaisesRegex(ValueError,'generation_changed'): evaluate(c,self.world,[],lambda *a:None) with self.assertRaises(ValueError): validate({'kind':'input_ready','value':1}) with self.assertRaises(ValueError): validate({'kind':'player_health_below','value':float('nan')}) def test_native_attacking_and_input_ready(self): c={'kind':'actor_attacking','generation':3,'actor_id':2,'value':True} self.assertTrue(evaluate(c,self.world,[],lambda *a:{'data':{'actors':[{'actor':{'id':2},'combat_storage':{'available':True,'attacking':True}}]}})) self.assertTrue(evaluate({'kind':'input_ready','value':False},self.world,[],None))
if __name__=='__main__': unittest.main()