45 lines
2.5 KiB
Python
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')
|