52 lines
2.9 KiB
Python
52 lines
2.9 KiB
Python
"""Execute production time policies; do not claim native simulation coverage."""
|
|
from policy_harness import ROOT, body, run
|
|
source = ROOT/'addons/core/Scripts/Game/ERR/ERR_ExtractionPlacement.c'
|
|
methods = '\n'.join(body(source, signature) for signature in (
|
|
'static bool CanWake(', 'static bool Fresh(', 'static bool QualificationAllowed(', 'static bool Stable('))
|
|
run('#include <cassert>\n' + methods + '''
|
|
int main() {
|
|
assert(CanWake(true,0,0,30000));
|
|
assert(CanWake(true,0,29999,30000));
|
|
assert(!CanWake(false,0,1,30000));
|
|
assert(!CanWake(true,1,1,30000)); // activation cannot be repeated
|
|
assert(!CanWake(true,2,1,30000));
|
|
assert(!CanWake(true,0,30000,30000)); // no wake after expired preparation
|
|
assert(!CanWake(true,0,30001,30000));
|
|
assert(QualificationAllowed(false,29999,30000));
|
|
assert(!QualificationAllowed(false,30000,30000)); // exactly deadline is not first qualification
|
|
assert(!QualificationAllowed(false,30001,30000));
|
|
assert(QualificationAllowed(true,30000,30000)); // continuous monitoring may outlive settling
|
|
assert(QualificationAllowed(true,90000,30000));
|
|
assert(!Fresh(-1,0));
|
|
assert(!Fresh(1000,999));
|
|
assert(Fresh(1000,2500));
|
|
assert(!Fresh(1000,2501)); // delayed callbacks restart the stability window
|
|
assert(!Stable(-1,1000,2000));
|
|
assert(!Stable(1000,999,2000));
|
|
assert(!Stable(1000,1750,1999));
|
|
assert(Stable(1000,1750,2000));
|
|
assert(!Stable(1000,1000,2501));
|
|
assert(!Stable(1000,2000,1999));
|
|
}
|
|
''')
|
|
text = source.read_text()
|
|
poll = body(source, 'ERR_PrepareResult Poll(')
|
|
assert text.count('physics.SetActive(ActiveState.ACTIVE)') == 1
|
|
assert poll.index('!QualificationAllowed(') < poll.index('m_Result = ERR_PrepareResult.READY;')
|
|
assert poll.index('if (m_Stopped') < poll.index('physics.SetActive(')
|
|
assert poll.index('!Replication.IsServer()') < poll.index('physics.SetActive(')
|
|
assert poll.index('m_Mode.ExtractionVehicle() != m_Aircraft') < poll.index('physics.SetActive(')
|
|
assert poll.index('m_WakeCount = 1;') < poll.index('physics.SetActive(')
|
|
assert 'fuel.HasFuel() && ERR_CasualtyLoadingRules.AircraftReady(m_Aircraft)' in poll
|
|
for forbidden in ('SetVelocity(', 'SetAngularVelocity(', 'SetTransform(', 'SetWorldTransform(', 'Teleport(', 'ApplyImpulse', 'EnableDamageHandling('):
|
|
assert forbidden not in text, forbidden
|
|
site = (ROOT/'addons/core/Scripts/Game/ERR/ERR_SiteService.c').read_text()
|
|
assert 'if (m_ExtractionPlacement) m_ExtractionPlacement.Stop();' in site
|
|
assert 'Fail(m_ExtractionPlacement.FailureReason())' in site
|
|
assert 'pendingGuards > 0 || aircraftPlacement == ERR_PrepareResult.PENDING' in site
|
|
assert 'SetSpawnImmediately(false)' in site and 'PurgeSpawnRequestsForGroup' in site
|
|
probe = (ROOT/'addons/core/Scripts/Game/ERR/ERR_NativeCasualtyGroundProbe.c').read_text()
|
|
assert 'placement.Ready() && placement.WakeCount() == 1' in probe
|
|
assert 'SetActive(' not in probe
|
|
print('PASS: actual one-shot deadline/stability policies and preparation ownership, fuel, cleanup integration contracts')
|