Files
EscapistsReintroduced/tests/test_hq_delivered_casualties.py
jakub cab998fb64 Combine Workshop addon and fix prison startup
Merge owned systems into one addon while preserving resource identities. Gate player admission on the replicated prison scene, restore the original framed door, and hold enemy AI until escape. Correct scenario branding and author metadata, include publishing assets, and retain regression and native verification evidence.
2026-09-20 16:42:52 +02:00

55 lines
3.7 KiB
Python

"""Actual Enforce union methods: delivered body/status evidence is never summed."""
from pathlib import Path
import re
from policy_harness import ROOT, run
s=(ROOT/'addons/core/Scripts/Game/ERR/10_AI/ERR_HQDeliveredCasualties.c').read_text()
assert all(token not in s for token in ('IEntity','GetOrigin','GetWorld','GetPlayer','IsDestroyed','GetLifeState'))
code=s.replace('class ','struct ').replace('protected ','').replace('ref ','').replace('Math.','Math::')
code=code.replace('array<int> slots','Array<int>* slots').replace('slots.', 'slots->')
code=code.replace('array<int>','Array<int>').replace('foreach (','for (')
code=code.replace(' : slots)', ' : *slots)').replace('int m_Strength;', 'int m_Strength=0;')
code=code.replace('\n}\n','\n};\n')
run(r'''
#include <cassert>
#include <algorithm>
#include <vector>
struct Math {static int Min(int a,int b){return std::min(a,b);}};
template<class T>struct Array:std::vector<T>{using std::vector<T>::vector;
int Count(){return this->size();}bool Contains(T n){return std::find(this->begin(),this->end(),n)!=this->end();}
void Insert(T n){this->push_back(n);}void Clear(){this->clear();}};
'''+code+r'''
int main(){
ERR_HQDeliveredCasualties ledger;assert(!ledger.Bind(0)&&!ledger.Bind(33));
assert(!ledger.AcceptBody(0));assert(ledger.Bind(6));assert(!ledger.Bind(7));
Array<int> first{0,2};assert(ledger.AcceptStatus(&first,2,4));assert(ledger.Count()==2);
// Same body already confirmed by delivered status never adds a casualty.
assert(ledger.AcceptBody(0)&&ledger.AcceptBody(0)&&ledger.Count()==2);
// Different discovered body adds precisely one; identical rediscovery does not.
assert(ledger.AcceptBody(4)&&ledger.AcceptBody(4)&&ledger.Count()==3);
assert(ledger.LivingUpperBound(4)==3);
// Caller has not seen the outside discovery; valid unchanged status must still arrive.
assert(ledger.AcceptStatus(&first,2,4)&&ledger.Count()==3&&ledger.StatusCount()==2);
Array<int> later{0,2,4};assert(ledger.AcceptStatus(&later,3,3)&&ledger.Count()==3);
Array<int> disjoint{0,2,3,4};assert(ledger.AcceptStatus(&disjoint,4,2)&&ledger.Count()==4);
Array<int> malformed{0,0,2};assert(!ledger.AcceptStatus(&malformed,3,3)&&ledger.Count()==4);
Array<int> outOfRange{0,2,3,4,6};assert(!ledger.AcceptStatus(&outOfRange,5,1)&&ledger.Count()==4);
Array<int> missing{0,2,4};assert(!ledger.AcceptStatus(&missing,3,3));
assert(!ledger.AcceptStatus(&disjoint,3,2)&&!ledger.AcceptStatus(&disjoint,4,3));
assert(!ledger.AcceptStatus(nullptr,0,6)&&!ledger.AcceptBody(-1)&&!ledger.AcceptBody(6));
assert(ledger.AcceptBody(1)&&ledger.AcceptBody(5)&&ledger.Closed()&&ledger.Count()==6);
assert(ledger.LivingUpperBound(-1)==0&&ledger.LivingUpperBound(6)==0);
assert(ledger.Bind(6)&&ledger.Count()==6); // duplicate binding never resets delivered evidence
// Complete wipe can be established from delivered visible bodies even without any check-in.
ERR_HQDeliveredCasualties wiped;assert(wiped.Bind(32));
assert(wiped.LivingUpperBound(-1)==-1&&!wiped.Closed());
for(int slot=31;slot>=0;slot--)for(int replay=0;replay<4;replay++)assert(wiped.AcceptBody(slot));
assert(wiped.Count()==32&&wiped.StatusCount()==0&&wiped.Closed());
Array<int> unknown{};assert(wiped.AcceptStatus(&unknown,0,32));
assert(wiped.Count()==32&&wiped.LivingUpperBound(32)==0); // delayed status cannot reopen known dead roster
// Same numerical slot belongs to separate independent formations, never a global casualty ID.
ERR_HQDeliveredCasualties other;assert(other.Bind(2)&&other.AcceptBody(0)&&other.Count()==1);
assert(ledger.Count()==6&&wiped.Count()==32);
}
''')
print('PASS: actual delivered slot-union bodies preserve overlap/disjoint evidence, replay idempotence, status subset integrity, full-wipe closure and formation-local bounds')