55 lines
3.7 KiB
Python
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/ai/Scripts/Game/ERR/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')
|