"""Exercise actual radio tuning, defender and continuity policy bodies. Native fixture covers service events and physical character state separately. """ from policy_harness import ROOT, body, run source=ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_RadioDefenceService.c' functions='\n'.join(body(source, signature) for signature in ( 'static float DefenceRadius(', 'static float TuneRadius(', 'static bool CanTune(', 'static bool Defender(', 'static float SinceAfterSample(', )).replace('ERR_Phase.', 'ERR_Phase::') functions+='\n'+body(ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_MissionRules.c','static bool DefenceComplete(') run('''#include #include namespace ERR_Phase {enum {PREPARING,PRISON,RADIO_SEARCH,RADIO_DEFENCE,EXTRACTION,VICTORY,DEFEAT};} '''+functions+''' int main() { for (int phase=-1;phase<=7;++phase) for (int flags=0;flags<16;++flags) for (int knowledge=0;knowledge<=2;++knowledge) for (float distance : {-1.f,0.f,4.999f,5.f,5.001f,60.f}) { bool registered=flags&1,radio=flags&2,player=flags&4,conscious=flags&8; bool expected=phase==ERR_Phase::RADIO_SEARCH && registered && radio && knowledge>=2 && player && conscious && distance>=0 && distance<=5; assert(CanTune(phase,registered,radio,knowledge,player,conscious,distance)==expected); } for (int flags=0;flags<4;++flags) for (float distance : {-1.f,0.f,59.999f,60.f,60.001f}) assert(Defender(flags&1,flags&2,distance)==(bool(flags&1)&&bool(flags&2)&&distance>=0&&distance<60)); assert(DefenceRadius()==60 && TuneRadius()==5); float since=SinceAfterSample(-1,-1,1000,2); assert(since==1000); since=SinceAfterSample(since,1000,6000,1); assert(since==1000); // second person can leave without resetting remaining defender since=SinceAfterSample(since,6000,7000,0); assert(since==-1); // absent/dead/unconscious/empty-server samples reset since=SinceAfterSample(since,7000,8000,1); assert(since==8000); assert(!DefenceComplete(37999,since,30000,true)); assert(DefenceComplete(38000,since,30000,true)); assert(!DefenceComplete(38000,since,45000,true)); // live setting increased assert(SinceAfterSample(since,38000,30000,1)==30000); // backward clock resets interval assert(SinceAfterSample(since,38000,-1,1)==-1); assert(SinceAfterSample(since,38000,50000,-1)==-1); } ''') print('PASS: radio authorization/discovery/phase matrix, exact distance limits, defender handover, interruption, empty samples, clock regression and duration boundary')