Improve base guidance and qualify bounded aircraft route and hidden test lifecycle
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
"""Execute route result policy and audit opt-in finite/native fixture boundaries."""
|
||||
from policy_harness import ROOT, body, run
|
||||
P=ROOT/'addons/ai/Scripts/Game/ERR/ERR_NativeAircraftRouteProbe.c'
|
||||
source=P.read_text()
|
||||
rules='\n'.join(body(P,k) for k in ('static bool Terminal(', 'static bool TranslateProof(', 'static bool PhysicalFinish(', 'static bool CanDispose(')).replace('ERR_AircraftFlightState.','State::')
|
||||
run('''#include <cassert>
|
||||
namespace State {enum {COMPLETE=8,CANCELLED,FAILED,RELINQUISHED};}
|
||||
'''+rules+'''
|
||||
int main(){
|
||||
assert(Terminal(false,State::COMPLETE,0));assert(!Terminal(false,State::CANCELLED,0));assert(!Terminal(false,State::FAILED,0));
|
||||
assert(TranslateProof(true,true,20,19.5,.5));
|
||||
assert(!TranslateProof(true,true,20,1,.5));assert(!TranslateProof(true,false,20,20,0));assert(!TranslateProof(false,true,20,20,0));assert(!TranslateProof(true,true,20,20,.76f));
|
||||
assert(!TranslateProof(true,true,29,29,0));assert(!TranslateProof(true,true,9,9,0));
|
||||
assert(PhysicalFinish(true,true,true,.1f,1,1,1,101,101));
|
||||
assert(!PhysicalFinish(true,true,false,.1f,1,1,1,101,101));assert(!PhysicalFinish(true,true,true,0,1,1,1,101,101));assert(!PhysicalFinish(true,true,true,.1f,2,1,1,101,101));assert(!PhysicalFinish(false,true,true,.1f,1,1,1,101,101));
|
||||
assert(CanDispose(true,true,true,true,true));for(int i=0;i<5;i++)assert(!CanDispose(i!=0,i!=1,i!=2,i!=3,i!=4));
|
||||
}
|
||||
''')
|
||||
assert source.startswith('#ifdef WORKBENCH') and source.rstrip().endswith('#endif')
|
||||
assert 'outcome == "aircraft-route"' in body(P,'static bool Enabled(')
|
||||
assert 'outcome == "aircraft-control"' not in source
|
||||
assert source.count('ERR_Actors.Spawn(AIRCRAFT,')==1 and source.count('SpawnCharacterInCompartment(')==1
|
||||
assert source.count('physics.SetActive(ActiveState.ACTIVE)')==1
|
||||
for prohibited in ('SetWorldTransform(', 'SetOrigin(', 'SetVelocity(', '.StartEngine(', '.StopEngine(', 'm_Mode.Own('):assert prohibited not in source
|
||||
assert 'ERR_AircraftRouteEnvelope.Survey(candidate, destination)' in body(P,'protected bool FindPad(')
|
||||
tick=body(P,'int Tick(')
|
||||
assert 'ERR_AircraftRouteEnvelope.QualifyRoute(' in tick and 'm_Flight.StartRoute(' in tick
|
||||
assert tick.index('ERR_AircraftRouteEnvelope.QualifyRoute(')<tick.index('m_Flight.StartRoute(')
|
||||
assert 'm_Flight.Arrived() && vector.DistanceXZ(transform[3], m_Destination) <= 0.75' in tick
|
||||
assert 'm_Flight.ERR_NativeControlDeadline() != m_ControlDeadline' in tick
|
||||
assert tick.index('m_Flight.Tick();')<tick.index('if (!m_Flight.Finished())')
|
||||
stop=body(P,'void Stop(')
|
||||
assert stop.index('s_Current = null')<stop.index('m_Flight.Cancel(')<stop.index('m_Flight = null')<stop.index('ERR_Actors.DeleteSpawned(')
|
||||
assert 'ERR_NativeAircraftRouteRules.CanDispose(' in stop
|
||||
assert source.index('probe.PrepareActions(')<source.index('super.OnPrepareControls(owner, am, dt, player);')
|
||||
start=source.index('protected override event void OnPrepareControls()')
|
||||
assert source.index('super.OnPrepareControls();',start)<source.index('probe.PrepareHelicopter(this);',start)
|
||||
print('PASS: finite opt-in route fixture, original native input order, meaningful physical-arrival evidence and guarded cleanup; no native launch')
|
||||
|
||||
# Integration is separate from physical route proof. Exercise real early CLI
|
||||
# refusals against a deliberately absent prefix: no engine or audio can start.
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
runner=ROOT/'tools/headless_workbench.py'
|
||||
cases=[
|
||||
('core','1','420',[], 'requires Chat, one round, and at least 420 seconds'),
|
||||
('chat','2','420',[], 'requires Chat, one round, and at least 420 seconds'),
|
||||
('chat','1','419',[], 'requires Chat, one round, and at least 420 seconds'),
|
||||
('chat','1','420',['--flight-action-inputs'], 'flight-action-inputs requires the Core powered-flight fixture'),
|
||||
('chat','1','420',['--flight-autohover'], 'flight-autohover requires Core powered-flight with flight-action-inputs'),
|
||||
('chat','1','420',[], 'must be a disposable cloned prefix'),
|
||||
]
|
||||
for project,rounds,timeout,extra,message in cases:
|
||||
with tempfile.TemporaryDirectory(prefix='erri-route-parse-') as directory:
|
||||
temporary=Path(directory)
|
||||
result=subprocess.run([sys.executable,str(runner),'--compat',str(temporary/'missing-prefix'),'--profile',str(temporary/'missing-profile'),'--project',project,'--smoke','aircraft-route','--rounds',rounds,'--timeout',timeout,*extra],capture_output=True,text=True,timeout=10)
|
||||
assert result.returncode==2, (project,rounds,timeout,extra,result.stderr)
|
||||
assert message in result.stderr, (project,rounds,timeout,extra,result.stderr)
|
||||
assert list(temporary.iterdir())==[], 'Refused route invocation must not create profiles or prefix locks'
|
||||
|
||||
chat=ROOT/'addons/chat/Scripts/Game/ERR/ERR_NativeSmoke.c'
|
||||
text=chat.read_text()
|
||||
assert 'm_ERRTestAircraftRoute = outcome == "aircraft-route";' in text
|
||||
assert 'if (m_ERRTestAircraftControl || m_ERRTestAircraftRoute) m_ERRSmokeDeadline = GetWorld().GetWorldTime() + 330000;' in text
|
||||
assert 'OnStop().Insert(ERR_StopHQPatrol);' in text
|
||||
assert 'if (m_ERRAircraftRoute) m_ERRAircraftRoute.Stop();' in body(chat,'protected void ERR_StopHQPatrol(')
|
||||
assert 'ERR_StopHQPatrol();' in body(chat,'protected bool ERR_Check(')
|
||||
|
||||
def block(text,anchor):
|
||||
start=text.index(anchor)
|
||||
opening=text.index('{',start);depth=1;end=opening+1
|
||||
while depth:
|
||||
depth+=(text[end]=='{')-(text[end]=='}');end+=1
|
||||
return text[start:end]
|
||||
branch=block(body(chat,'protected void ERR_SmokeTick('),'if (m_ERRSmokeStep == 230)')
|
||||
assert 'int result = m_ERRAircraftRoute.Tick(now);' in branch
|
||||
assert 'if (result < 0) { ERR_Check(false, "native actual aircraft route fixture"); return; }' in branch
|
||||
assert 'if (result == 1) { m_ERRSmokeStep = 231; Transition(ERR_Phase.DEFEAT); }' in branch
|
||||
# Execute the unchanged actual branch to prove pending/failure cannot advance
|
||||
# to the fixture terminal and successful transition sees the completed step.
|
||||
run('''#include <cassert>
|
||||
#include <initializer_list>
|
||||
namespace ERR_Phase {enum {DEFEAT};}
|
||||
struct Probe {int result=0,ticks=0;int Tick(float){ticks++;return result;}};
|
||||
struct Fixture {int m_ERRSmokeStep=230,failures=0,transitions=0;Probe m_ERRAircraftRoute;
|
||||
void ERR_Check(bool,const char*){failures++;}
|
||||
void Transition(int phase){assert(phase==ERR_Phase::DEFEAT&&m_ERRSmokeStep==231);transitions++;}
|
||||
void Tick(float now){
|
||||
'''+branch.replace('ERR_Phase.','ERR_Phase::')+'''
|
||||
}
|
||||
};
|
||||
int main(){
|
||||
for(int result:{-1,0,1}){Fixture f;f.m_ERRAircraftRoute.result=result;f.Tick(1000);assert(f.m_ERRAircraftRoute.ticks==1);assert(f.failures==(result<0));assert(f.transitions==(result==1));assert(f.m_ERRSmokeStep==(result==1?231:230));}
|
||||
}
|
||||
''')
|
||||
terminal=block(body(chat,'protected void ERR_SmokePhase('),'if (m_ERRTestAircraftRoute)')
|
||||
assert 'current == ERR_Phase.DEFEAT && m_ERRSmokeStep == 231' in terminal
|
||||
assert terminal.index('ERR_StopHQPatrol();')<terminal.index('ERR SMOKE COMPLETE:')
|
||||
assert terminal.count('ERR SMOKE COMPLETE:')==1
|
||||
initial=block(body(chat,'protected void ERR_SmokeTick('),'if (m_ERRTestAircraftRoute)')
|
||||
assert initial.count('new ERR_NativeAircraftRouteProbe(this)')==1
|
||||
assert 'm_ERRSmokeStep = 230;' in initial and initial.rstrip().endswith('return;\n\t\t\t}')
|
||||
print('PASS: actual Chat route step result dispatch and scoped completion/cleanup wiring; six real early-parser refusal paths leave no prefix/profile output')
|
||||
|
||||
# The added two-second telemetry only observes, and cannot extend/control flight.
|
||||
diagnostic=body(P,'protected void Diagnostic(')
|
||||
assert diagnostic.index('now < m_NextLog')<diagnostic.index('m_NextLog = now + 2000')<diagnostic.index('ERR AIRCRAFT ROUTE MOTION:')
|
||||
for forbidden in ('SetActionValue(', 'SetVelocity(', 'SetWorldTransform(', '.Cancel(', '.Tick(', '.StartRoute(', '.SetAutohoverEnabled('):assert forbidden not in diagnostic
|
||||
for field in ('position=%2','velocity=%3','along=%4','cross=%5','targetError=%6','computedDemand=%7','projectedForward=%8','projectedAside=%9','stageRemaining=%5','overallRemaining=%6'):assert field in diagnostic
|
||||
assert body(P,'float ERR_NativeRouteStageDeadline(').strip()=='float ERR_NativeRouteStageDeadline() { return m_StageDeadline; }'
|
||||
Reference in New Issue
Block a user