#!/usr/bin/env python3 """Run real guest-input regression tests via an exported public VCC Plus grant. Usage: python3 tests/playtest.py PRIVATE_GRANT --evidence /tmp/quiz-evidence Requires C Assistant's Use Project Makefile and Allow Disposable Playtests. """ import argparse,json,os,runpy,sys,time,uuid from pathlib import Path ROOT=Path(__file__).resolve().parents[1] sys.path.insert(0,str(ROOT/'tools')) from vcc_mcp import VCC p=argparse.ArgumentParser(description=__doc__) p.add_argument('grant',type=Path);p.add_argument('--evidence',required=True,type=Path) a=p.parse_args();out=a.evidence.resolve() if out.is_relative_to(ROOT):p.error('Keep evidence outside the watched checkout until the run completes.') out.mkdir(parents=True,exist_ok=True) os.environ.update(VCC_GRANT=str(a.grant.resolve()),CAPITAL_TEST_EVIDENCE=str(out),CAPITAL_TEST_STATE=str(out/'session.json')) v=VCC(a.grant) c=v.call('get_capabilities');assert c.get('owned_playtests'),c b=v.call('build_project',dict(project_id=c['project_id'],revision=c['revision'],action='disk',configuration='Test',request_id=str(uuid.uuid4()))) assert 'build_id' in b,b for _ in range(150): receipt=v.call('get_build',dict(build_id=b['build_id'])) if receipt.get('status')!='building':break time.sleep(.2) assert receipt.get('status')=='succeeded',receipt (out/'build-receipt.json').write_text(json.dumps(receipt,indent=2)) r=v.call('start_playtest',dict(project_id=c['project_id'],revision=c['revision'],artifact_id=receipt['artifact_id'],request_id=str(uuid.uuid4()))) assert 'run_id' in r,r state=dict(cap=c,build=b,artifact=receipt,run=r) (out/'session.json').write_text(json.dumps(state)) v.call('playtest_input',dict(run_id=r['run_id'],request_id=str(uuid.uuid4()),steps=[dict(keys=[],fields=600)])) v.close() support=runpy.run_path(str(Path(__file__).with_name('playtest_support.py'))) support['capture'](r['run_id'],'title');support['v'].close() runpy.run_path(str(Path(__file__).with_name('playtest_mc.py')),run_name='__main__') runpy.run_path(str(Path(__file__).with_name('playtest_typed.py')),run_name='__main__') state=json.loads((out/'session.json').read_text());v=VCC(a.grant) for r in (state['run'],state['typed_run']): result=v.call('stop_playtest',dict(run_id=r['run_id'],request_id=str(uuid.uuid4()))) (out/('retained-'+r['run_id']+'.json')).write_text(json.dumps(result,indent=2)) v.close();print('PASS: complete multiple-choice and typed regression suite. Evidence:',out)