Add persistent last-disconnect and idle-interval controls with enabled/five-hour defaults. Apply saved settings immediately, reset idle time while occupied, and cover migration, routing, layout and restart behavior.
73 lines
5.0 KiB
Python
73 lines
5.0 KiB
Python
"""Exercise actual Core alias, integer parsing and settings-boundary bodies.
|
|
Native dispatch/storage and remote ownership remain separate tests.
|
|
"""
|
|
from policy_harness import ROOT,body,run
|
|
admin=ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_AdminService.c'
|
|
settings=ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_Settings.c'
|
|
rules='\n'.join(body(path,sig) for path,sig in ((admin,'static string CoreSetting('),(admin,'static bool Integer('),(settings,'static bool Valid(')))
|
|
rules=(rules.replace('string ', 'std::string ').replace('out int ', 'int& ')
|
|
.replace('text.Length()', 'int(text.size())').replace('.IsEmpty()', '.empty()')
|
|
.replace('.Substring(', '.substr(').replace('"0123456789".IndexOf(', 'std::string("0123456789").find(')
|
|
.replace(' < 0) return false;', ' == std::string::npos) return false;').replace('text.ToInt()', 'std::stoi(text)'))
|
|
run('#include <cassert>\n#include <string>\n'+rules+r'''
|
|
int main(){
|
|
assert(CoreSetting("mission","doctrine")=="aiDoctrine");
|
|
assert(CoreSetting("mission","aishadow")=="aiShadow");
|
|
assert(CoreSetting("mission","restartempty")=="restartOnEmpty");
|
|
assert(CoreSetting("mission","emptyhours")=="emptyRestartHours");
|
|
assert(Valid("restartOnEmpty",0)&&Valid("restartOnEmpty",1));
|
|
assert(!Valid("restartOnEmpty",-1)&&!Valid("restartOnEmpty",2));
|
|
assert(Valid("emptyRestartHours",0)&&Valid("emptyRestartHours",1)&&Valid("emptyRestartHours",5)&&Valid("emptyRestartHours",168));
|
|
assert(!Valid("emptyRestartHours",-1)&&!Valid("emptyRestartHours",169));
|
|
for(std::string key:{"aiDoctrine","aiShadow"}){ assert(Valid(key,0)&&Valid(key,1)); assert(!Valid(key,-1)&&!Valid(key,2)); }
|
|
assert(CoreSetting("mission","motorbikes")=="motorbikeCount");
|
|
assert(Valid("motorbikeCount",0)&&Valid("motorbikeCount",2)&&Valid("motorbikeCount",6));
|
|
assert(!Valid("motorbikeCount",-1)&&!Valid("motorbikeCount",7));
|
|
assert(CoreSetting("mission","planealtitude")=="planeAltitudeMetres");
|
|
assert(Valid("planeAltitudeMetres",150)&&Valid("planeAltitudeMetres",250)&&Valid("planeAltitudeMetres",500));
|
|
assert(!Valid("planeAltitudeMetres",149)&&!Valid("planeAltitudeMetres",501)&&!Valid("planeAltitudeMetres",-1));
|
|
assert(CoreSetting("mission","planereplacement")=="planeReplacementSeconds");
|
|
assert(Valid("planeReplacementSeconds",30)&&Valid("planeReplacementSeconds",60)&&Valid("planeReplacementSeconds",1800));
|
|
assert(!Valid("planeReplacementSeconds",29)&&!Valid("planeReplacementSeconds",1801)&&!Valid("planeReplacementSeconds",-1));
|
|
assert(CoreSetting("mission","planesector")=="planeSectorSeconds");
|
|
assert(Valid("planeSectorSeconds",30)&&Valid("planeSectorSeconds",120)&&Valid("planeSectorSeconds",600));
|
|
assert(!Valid("planeSectorSeconds",29)&&!Valid("planeSectorSeconds",601)&&!Valid("planeSectorSeconds",-1));
|
|
assert(CoreSetting("mission","plane")=="planeReconEnabled");
|
|
assert(Valid("planeReconEnabled",0)&&Valid("planeReconEnabled",1));
|
|
assert(!Valid("planeReconEnabled",-1)&&!Valid("planeReconEnabled",2));
|
|
assert(CoreSetting("mission","camps")=="fieldCampCount");
|
|
assert(CoreSetting("mission","hospitals")=="fieldHospitalCount");
|
|
assert(Valid("fieldCampCount",1)&&Valid("fieldCampCount",12)&&Valid("fieldCampCount",16));
|
|
assert(!Valid("fieldCampCount",0)&&!Valid("fieldCampCount",17));
|
|
assert(Valid("fieldHospitalCount",1)&&Valid("fieldHospitalCount",6)&&Valid("fieldHospitalCount",8));
|
|
assert(!Valid("fieldHospitalCount",0)&&!Valid("fieldHospitalCount",9));
|
|
|
|
assert(CoreSetting("intel","reveal")=="intelRevealChancePercent");
|
|
assert(CoreSetting("mission","radio")=="radioDefenceSeconds");
|
|
assert(CoreSetting("mission","objectguards")=="objectGuardCount");
|
|
assert(CoreSetting("mission","objectevery")=="objectGuardEvery");
|
|
assert(CoreSetting("mission","objecthq")=="objectGuardHQMode");
|
|
assert(CoreSetting("hq","objectguards").empty());
|
|
assert(Valid("objectGuardCount",0)&&Valid("objectGuardCount",8)&&Valid("objectGuardCount",16));
|
|
assert(!Valid("objectGuardCount",-1)&&!Valid("objectGuardCount",17));
|
|
for(std::string section:{"", "hq", "mission", "intel", "unknown"})
|
|
for(std::string option:{"", "interval", "carrying", "radio", "reveal", "unknown"}){
|
|
bool recognized=(section=="intel"&&option=="reveal")||(section=="mission"&&option=="radio");
|
|
assert(CoreSetting(section,option).empty()==!recognized);
|
|
}
|
|
int parsed=-1;
|
|
for(std::string malformed:{"", "-1", "+1", "1.0", "10junk", "1e2", "0x10", " 50", "50 ", "1234567"})
|
|
assert(!Integer(malformed,parsed));
|
|
for(int value=0;value<=101;++value){
|
|
assert(Integer(std::to_string(value),parsed)&&parsed==value);
|
|
assert(Valid(CoreSetting("intel","reveal"),parsed)==(value<=100));
|
|
}
|
|
assert(Integer("000050",parsed)&&parsed==50);
|
|
assert(Integer("999999",parsed)&&!Valid("intelRevealChancePercent",parsed));
|
|
assert(!Valid("intelRevealChancePercent",-1));
|
|
assert(Valid("radioDefenceSeconds",30)&&Valid("radioDefenceSeconds",1800));
|
|
assert(!Valid("radioDefenceSeconds",29)&&!Valid("radioDefenceSeconds",1801));
|
|
}
|
|
''')
|
|
print('PASS: Core document-discovery alias, companion-only alias exclusion, strict integer parsing and setting boundaries')
|