Files
EscapistsReintroduced/tests/test_radio_defence_policy.py
T

45 lines
2.5 KiB
Python

"""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/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/ERR_MissionRules.c','static bool DefenceComplete(')
run('''#include <cassert>
#include <initializer_list>
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')