Files
EscapistsReintroduced/tests/test_spawn_loading_protection.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

27 lines
1.8 KiB
Python

"""Run actual loading-damage lease methods; native damage routing is checked separately."""
from policy_harness import ROOT, body, run
p=ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_SpawnFinalization.c'
s='\n'.join(body(p,key) for key in ('bool Begin(IEntity actor)', 'void Stop()'))
for before,after in [('IEntity actor','Actor* actor'),('DamageManagerComponent damage','Damage* damage'),('DamageManagerComponent.Cast(actor.FindComponent(DamageManagerComponent))','actor->damage'),('Replication.IsServer()','server'),('m_Damage.','m_Damage->'),('damage.','damage->'),('null','nullptr')]:s=s.replace(before,after)
run(r'''
#include <cassert>
bool server=true;
struct Damage {bool enabled=true,destroyed=false;int writes=0;bool IsDestroyed(){return destroyed;}bool IsDamageHandlingEnabled(){return enabled;}void EnableDamageHandling(bool value){enabled=value;writes++;}};
struct Actor {Damage* damage;};
struct Lease {Damage* m_Damage=nullptr;bool m_RestoreDamage=false;
'''+s+r'''
};
int main(){
Damage damage;Actor actor{&damage};Lease lease;
assert(lease.Begin(&actor)&&!damage.enabled);assert(!lease.Begin(&actor));
lease.Stop();assert(damage.enabled&&damage.writes==2);lease.Stop();assert(damage.writes==2);
damage.enabled=false;assert(lease.Begin(&actor));lease.Stop();assert(!damage.enabled&&damage.writes==3);
damage.destroyed=true;assert(!lease.Begin(&actor));damage.destroyed=false;
server=false;assert(!lease.Begin(&actor));server=true;
Actor missing{nullptr};assert(!lease.Begin(&missing)&&!lease.Begin(nullptr));
// Deleted native component is a weak null reference; teardown must be harmless.
damage.enabled=true;assert(lease.Begin(&actor));lease.m_Damage=nullptr;lease.Stop();
}
''')
print('PASS: loading protection restores only its own damage change, rejects invalid admission actors, and tolerates repeat/deleted cleanup')