Add typed field-flight prototype and preserve native qualification failures

This commit is contained in:
2026-09-19 21:01:20 +02:00
parent 83ea247e62
commit 61e165ef5b
91 changed files with 40570 additions and 85 deletions
+45 -3
View File
@@ -631,13 +631,14 @@ class ApproachTests(unittest.TestCase):
'baseline_samples':[20,21],'response_sample':22,'return_sample':23,
'motions':[{'dx':24,'dy':0,'monotonic':10.1,'after_sample':21,'after_real_ms':3310},
{'dx':-24,'dy':0,'monotonic':10.3,'after_sample':22,'after_real_ms':3420}]}
report={'look_proof':look,'events':[]};keyboard=FakeKeyboard(observer);notifications=[];motions=[]
report={'look_proof':look,'events':[],'coarse_approach_requested':True};keyboard=FakeKeyboard(observer);notifications=[];motions=[]
mouse=SimpleNamespace(approach_move=lambda *a,**k:motions.append((a,k)))
def module(guard,k,m,observe,geometry,calibration,r,**kwargs):
self.assertEqual(calibration['ready_monotonic'],10)
self.assertEqual(calibration['ready_real_ms'],3091)
self.assertEqual(calibration['observer_start_real_ms'],1000)
self.assertEqual(kwargs['key_state_busy'],proof.KeyStateBusy)
self.assertEqual(kwargs['profile'],'coarse')
self.assertEqual(observe()[-1]['geometry'],geometry)
self.assertEqual(geometry['nonce'],NONCE)
with self.assertRaises(proof.Refused):k.send('F',True)
@@ -999,7 +1000,7 @@ class SelectionIntegration(unittest.TestCase):
def test_actual_main_wires_selection_only_to_observer_and_sequence(self):
with tempfile.TemporaryDirectory() as folder:
root=Path(folder);args=SimpleNamespace(nonce='N',prefix=root/'pfx',profile=root/'profile',game_executable=root/'game',host_display=':0',report=root/'report.json',console=root/'console.log',command=[],enable_private_look_proof=True,enable_private_approach_proof=True,enable_private_alignment_proof=True,enable_private_selection_proof=True)
root=Path(folder);args=SimpleNamespace(nonce='N',prefix=root/'pfx',profile=root/'profile',game_executable=root/'game',host_display=':0',report=root/'report.json',console=root/'console.log',command=[],enable_private_look_proof=True,enable_private_approach_proof=True,enable_private_alignment_proof=True,enable_private_selection_proof=True,enable_private_coarse_approach_proof=True)
owner={'window':1,'pid':2,'server_pid':2,'process':{'pid':2}}
query=SimpleNamespace(windows=lambda:[{}],focus=lambda:(1,0),close=lambda:None)
observer=SimpleNamespace(identity=(1,2),start_offset=0,offset=0,raw=[],events=[],look_records=[],gate_records=[],close=lambda:None)
@@ -1021,7 +1022,8 @@ class SelectionIntegration(unittest.TestCase):
with patch.object(proof,'arguments',return_value=args),patch.object(proof,'wrapper_command',return_value=[]),patch.object(proof,'console_path'),patch.object(proof.display,'validate_paths'),patch.object(proof.display,'binding',return_value={'display':':2'}),patch.object(proof.display,'X11',return_value=query),patch.object(proof.display,'owned_window',return_value=owner),patch.object(proof.display,'input_target',return_value={'verified':True}),patch.object(proof,'Observer',autospec=True,return_value=observer) as ob,patch.object(proof,'Guard',autospec=True),patch.object(proof,'Keyboard',autospec=True),patch.object(proof,'RelativeMouse',autospec=True) as mouse,patch.object(proof,'sequence',side_effect=sequence),patch.object(proof.signal,'signal'):
self.assertEqual(proof.main([]),0)
self.assertTrue(ob.call_args.kwargs['enable_selection']);self.assertNotIn('selection',mouse.call_args.kwargs)
archived=json.loads(args.report.read_text());self.assertTrue(archived['selection_requested']);self.assertEqual(archived['wheel_events'],[])
self.assertTrue(mouse.call_args.kwargs['enable_coarse_approach']);self.assertNotIn('coarse_approach',ob.call_args.kwargs)
archived=json.loads(args.report.read_text());self.assertTrue(archived['coarse_approach_requested']);self.assertTrue(archived['selection_requested']);self.assertEqual(archived['wheel_events'],[])
def test_one_native_wheel_pair_and_mask_roundtrip_no_retries(self):
r=WheelRig();w=r.wheel();notices=[]
@@ -1173,4 +1175,44 @@ class SelectionIntegration(unittest.TestCase):
self.assertEqual(proof.supervise([]),1);self.assertEqual(child.terminated,1)
self.assertEqual(failed.call_args.kwargs['button'],5);self.assertIsNone(failed.call_args.args[1]);stop.assert_called_once()
class CoarseApproachTests(unittest.TestCase):
def test_opt_in_requires_approach_and_default_is_unchanged(self):
argv=['--enable-private-keyboard-proof','--prefix','/tmp/pfx','--game-executable','/tmp/game','--profile','/tmp/profile','--report','/tmp/report','--host-display',':0','--nonce','N']
self.assertFalse(proof.arguments(argv).enable_private_coarse_approach_proof)
with self.assertRaises(SystemExit),patch('sys.stderr'):proof.arguments(argv+['--enable-private-coarse-approach-proof'])
args=proof.arguments(argv+['--enable-private-coarse-approach-proof','--enable-private-approach-proof','--enable-private-look-proof'])
self.assertTrue(args.enable_private_coarse_approach_proof)
with self.assertRaisesRegex(proof.Refused,'Coarse approach'):
proof.sequence(FakeGuard(),FakeKeyboard(FakeObserver()),FakeObserver(),{},coarse_approach=True)
with self.assertRaisesRegex(proof.Refused,'Coarse approach'):
proof.sequence(FakeGuard(),FakeKeyboard(FakeObserver()),FakeObserver(),{'coarse_approach_requested':True},approach=True)
def test_coarse_mouse_preserves_actual_private_pointer_focus_and_deadline_checks(self):
class Fn:
def __init__(self,fn):self.fn=fn
def __call__(self,*a):return self.fn(*a)
events=[];xt=SimpleNamespace(XTestFakeRelativeMotionEvent=Fn(lambda *a:events.append(a) or 1))
query=SimpleNamespace(d=1,x=SimpleNamespace(XQueryPointer=Fn(lambda *a:1),XFlush=lambda d:None),server_pid=lambda child:9)
keyboard=SimpleNamespace(xt=xt,require_idle=lambda:None);clock=Clock()
target={'geometry':{'root':1},'focused_clipped_bounds':(0,0,1000,720)}
checks=[];guard=SimpleNamespace(check=lambda:checks.append(True) or target)
mouse=proof.RelativeMouse(query,keyboard,{'window':100,'pid':9},enable_approach=True,enable_coarse_approach=True)
mouse.pointer=lambda:{'root':1,'child':0,'root_x':500,'root_y':300,'mask':0}
for dx in (384,-384):mouse.approach_move(dx,0,guard,deadline=35,clock=clock)
self.assertEqual(len(events),2);self.assertEqual(len(checks),4)
for dx,dy in ((385,0),(300,1),(True,0)):
with self.assertRaises(proof.Refused):mouse.approach_move(dx,dy,guard,deadline=35,clock=clock)
mouse.enable_coarse_approach=False
with self.assertRaises(proof.Refused):mouse.approach_move(300,0,guard,deadline=35,clock=clock)
mouse.enable_coarse_approach=True
mouse.pointer=lambda:{'root':1,'child':0,'root_x':900,'root_y':300,'mask':0}
with self.assertRaisesRegex(proof.Refused,'clipped'):mouse.approach_move(300,0,guard,deadline=35,clock=clock)
mouse.pointer=lambda:{'root':1,'child':77,'root_x':500,'root_y':300,'mask':0};query.server_pid=lambda child:10
with self.assertRaisesRegex(proof.Refused,'foreign'):mouse.approach_move(300,0,guard,deadline=35,clock=clock)
mouse.pointer=lambda:{'root':1,'child':0,'root_x':500,'root_y':300,'mask':0}
def late():clock.now=35;return target
with self.assertRaisesRegex(proof.Refused,'deadline'):mouse.approach_move(300,0,SimpleNamespace(check=late),deadline=35,clock=clock)
self.assertEqual(len(events),2)
with self.assertRaisesRegex(proof.Refused,'capability'):proof.RelativeMouse(query,keyboard,{'window':100,'pid':9},enable_coarse_approach=True)
if __name__ == '__main__': unittest.main()