Files
EscapistsReintroduced/tests/test_recon_search.py
T
jakub 6a667d8deb Capture current mission, AI, map and administration development
Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
2026-10-13 22:52:53 +02:00

53 lines
2.4 KiB
Python

"""Run the production search commitment state machine; not a native flight test."""
from policy_harness import ROOT, body, run
path = ROOT / 'addons/core/Scripts/Game/ERR/10_AI/ERR_ReconFlightComponent.c'
policy = body(path, 'class ERR_ReconSearchTask')
policy = policy.replace('class ERR_ReconSearchTask', 'struct ERR_ReconSearchTask').replace('Math.', 'Math::') + ';'
run(r'''
#include <cassert>
#include <algorithm>
struct Math {
static float Max(float a,float b){return std::max(a,b);}
static float Clamp(float a,float lo,float hi){return std::clamp(a,lo,hi);}
};
''' + policy + r'''
int main() {
ERR_ReconSearchTask task{};
assert(!task.Tick(1000,0));
assert(!task.Accept(-1,1000));
assert(!task.Accept(1001,1000));
assert(!task.Accept(0,60001));
assert(task.Accept(1000,61000)); // freshness boundary accepted
// The reported RKS failure: report expires while heli still 1.4km away.
for(int t=62000;t<=400000;t+=1000) assert(task.Tick(t,1446));
assert(task.SearchedMs==0);
assert(!task.Accept(1000,400000)); // replay cannot renew travel allowance
// Only time near the reported area consumes its search budget.
assert(task.Tick(401000,650));
assert(task.SearchedMs==1000);
assert(task.Tick(402000,651));
assert(task.SearchedMs==1000);
for(int t=403000;t<=520000;t+=1000) assert(task.Tick(t,300));
assert(!task.Tick(521000,300));
assert(!task.Accept(1000,521000)); // exhausted report not selected again
assert(task.Accept(521000,521000)); // a genuinely new sighting renews search
assert(task.Tick(522000,300));
assert(!task.Accept(520000,522000)); // older target can't displace newest
assert(task.Accept(522000,522000));
assert(task.SearchedMs==0);
// Native crew sighting wins, including over earlier HQ reports arriving late.
task.Cancel(530000);
assert(!task.Active && !task.Accept(529000,531000));
assert(task.Accept(531000,531000));
assert(task.Tick(1430999,2000));
assert(!task.Tick(1431000,2000)); // finite fifteen-minute unreachable approach
assert(!task.Accept(531000,1431000));
// Time spent on another task is not counted as local searching on return.
ERR_ReconSearchTask interrupted{};
assert(interrupted.Accept(1000,1000));
assert(interrupted.Tick(500000,300));
assert(interrupted.SearchedMs==5000);
}
''')
print('PASS: expired-report approach, arrival-only search, completion, newer/older/replayed reports, visual priority, interrupted search and bounded travel')