diff --git a/addons/common/XEH_PREP.hpp b/addons/common/XEH_PREP.hpp index 868e5b27a5..9489fa94bd 100644 --- a/addons/common/XEH_PREP.hpp +++ b/addons/common/XEH_PREP.hpp @@ -135,6 +135,7 @@ PREP(requestCallback); PREP(resetAllDefaults); PREP(restoreVariablesJIP); PREP(runAfterSettingsInit); +PREP(runTests); PREP(sanitizeString); PREP(sendRequest); PREP(serverLog); diff --git a/addons/common/config.cpp b/addons/common/config.cpp index 5dbe4209a5..76258ca0cb 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -89,3 +89,8 @@ class CfgUIGrids { class ACE_Extensions { extensions[] = {}; }; + +class ACE_Tests { + vehicleTransportInventory = QPATHTOF(dev\test_vehicleInventory.sqf); + mapConfigs = QPATHTOF(dev\test_mapConfigs.sqf); +}; diff --git a/addons/common/dev/test_mapConfigs.sqf b/addons/common/dev/test_mapConfigs.sqf new file mode 100644 index 0000000000..1b114d79e3 --- /dev/null +++ b/addons/common/dev/test_mapConfigs.sqf @@ -0,0 +1,49 @@ +// PabstMirror +// ["mapConfigs"] call ace_common_fnc_runTests; +// execVM "z\ace\addons\common\dev\test_mapConfigs.sqf"; + +#include "\z\ace\addons\common\script_component.hpp" + +diag_log text format ["--- Checking Map Configs ---"]; + +private _testPass = true; + +private _maps = configProperties [configFile >> "CfgWorldList", "(isClass _x)", true]; +{ + private _mapConfigName = configName _x; + private _worldConfig = configFile >> "CfgWorlds" >> _mapConfigName; + private _mapDescription = getText (_worldConfig >> "description"); + + // Check if custom latitude/elevation in lookup table (ace_common_fnc_getMapData) + private _getMapData = [_mapConfigName] call FUNC(getMapData); + if (_getMapData isEqualTo []) then { + diag_log text format ["%1 [%2] - Not in getMapData",_mapDescription,_mapConfigName]; + diag_log text format [" - Using map's config [latitude: %1] [elevationOffset: %2]", getNumber (_worldConfig >> "latitude"), getNumber (_worldConfig >> "elevationOffset")]; + }; + + // Test MGRS grid step size (from ace_common_fnc_getMapGridData) + private _zoomMax = 1e99; + private _formatX = ""; + private _formatY = ""; + private _stepX = 1e10; + private _stepY = 1e10; + { + private _zoom = getnumber (_x >> "zoomMax"); + if (_zoom < _zoomMax) then { + _zoomMax = _zoom; + _formatX = getText (_x >> "formatX"); + _formatY = getText (_x >> "formatY"); + _stepX = getNumber (_x >> "stepX"); + _stepY = getNumber (_x >> "stepY"); + }; + } forEach configProperties [(_worldConfig >> "Grid"), "isClass _x", false]; + private _stepXat5 = _stepX * 10 ^ ((count _formatX) - 5); + private _stepYat5 = -1 * _stepY * 10 ^ ((count _formatY) - 5); + if (_stepYat5 < 0) then {diag_log text format ["%1 [%2] - Northing is reversed.",_mapDescription,_mapConfigName];}; + if (_stepXat5 != 1) then {diag_log text format ["%1 [%2] - MGRS 10 digit grid does not equal 1 meter: (%3) for x.",_mapDescription,_mapConfigName,_stepXat5];}; + if (_stepYat5 != 1 && {_stepYat5 != -1}) then {diag_log text format ["%1 [%2] - MGRS 10 digit grid does not equal 1 meter: (%3) for y.",_mapDescription,_mapConfigName,_stepXat5];}; + +} forEach _maps; + +// Always return true, these are just warnings +_testPass diff --git a/addons/common/dev/test_vehicleInventory.sqf b/addons/common/dev/test_vehicleInventory.sqf new file mode 100644 index 0000000000..fced35a987 --- /dev/null +++ b/addons/common/dev/test_vehicleInventory.sqf @@ -0,0 +1,47 @@ +// PabstMirror +// ["vehicleTransportInventory"] call ace_common_fnc_runTests; +// execVM "z\ace\addons\common\dev\test_vehicleInventory.sqf"; + +private _testPass = true; + +private _vehicles = configProperties [configFile >> "CfgVehicles", "(isClass _x)", true]; +{ + private _vehType = configName _x; + { + private _name = getText (_x >> "name"); + if (_name != "MineDetector") then { // Vanilla mixes up mineDetector alot? + private _weaponConfig = configFile >> "CfgWeapons" >> _name; + private _glassesConfig = configFile >> "CfgGlasses" >> _name; + if (((!isClass _weaponConfig) || {(getNumber (_weaponConfig >> "type")) in [1,2,4]}) && {!isClass _glassesConfig}) then { + diag_log text format ["%1 -> TransportItems -> %2 = Bad", _vehType, _name]; + _testPass = false; + }; + }; + } forEach (configProperties [_x >> "TransportItems", "isClass _x", true]); + { + private _name = getText (_x >> "weapon"); + private _weaponConfig = configFile >> "CfgWeapons" >> _name; + if ((!isClass _weaponConfig) || {!((getNumber (_weaponConfig >> "type")) in [1,2,4])}) then { + diag_log text format ["%1 -> TransportWeapons -> %2 = Bad", _vehType, _name]; + _testPass = false; + }; + } forEach (configProperties [_x >> "TransportWeapons", "isClass _x", true]); + { + private _name = getText (_x >> "magazine"); + private _magConfig = configFile >> "CfgMagazines" >> _name; + if ((!isClass _magConfig)) then { + diag_log text format ["%1 -> TransportMagazines -> %2 = Bad", _vehType, _name]; + _testPass = false; + }; + } forEach (configProperties [_x >> "TransportMagazines", "isClass _x", true]); + { + private _name = getText (_x >> "backpack"); + private _vehConfig = configFile >> "CfgVehicles" >> _name; + if ((!isClass _vehConfig)) then { + diag_log text format ["%1 -> TransportBackpacks -> %2 = Bad", _vehType, _name]; + _testPass = false; + }; + } forEach (configProperties [_x >> "TransportBackpacks", "isClass _x", true]); +} forEach _vehicles; + +_testPass diff --git a/addons/common/functions/fnc_getMGRSdata.sqf b/addons/common/functions/fnc_getMGRSdata.sqf index 4e0df618e1..4b4906aba3 100644 --- a/addons/common/functions/fnc_getMGRSdata.sqf +++ b/addons/common/functions/fnc_getMGRSdata.sqf @@ -22,7 +22,7 @@ params [["_map", worldName]]; private _long = getNumber (configFile >> "CfgWorlds" >> _map >> "longitude"); -private _lat = getNumber (configFile >> "CfgWorlds" >> _map >> "latitude"); +private _lat = -1 * getNumber (configFile >> "CfgWorlds" >> _map >> "latitude"); // latitude is reversed in arma (negative config values in north) private _altitude = getNumber (configFile >> "CfgWorlds" >> _map >> "elevationOffset"); private _mapData = _map call FUNC(getMapData); diff --git a/addons/common/functions/fnc_getMapData.sqf b/addons/common/functions/fnc_getMapData.sqf index 33f3e09d83..b4cb56d75f 100644 --- a/addons/common/functions/fnc_getMapData.sqf +++ b/addons/common/functions/fnc_getMapData.sqf @@ -31,6 +31,7 @@ if (_map in ["abramia"]) exitWith { [60, 0] }; if (_map in ["af_kandahar_province"]) exitWith { [42, 0] }; if (_map in ["angel"]) exitWith { [38, 0] }; if (_map in ["anim_helvantis_v2"]) exitWith { [50, 0] }; +if (_map in ["anim_starokovka"]) exitWith { [50, 0] }; if (_map in ["australia"]) exitWith { [-25, 0] }; if (_map in ["baranow", "ivachev", "panavo", "staszow"]) exitWith { [50, 148.1] }; // IFA3LITE - default elevationOffset if (_map in ["beketov"]) exitWith { [55, 0] }; diff --git a/addons/common/functions/fnc_getMapGridData.sqf b/addons/common/functions/fnc_getMapGridData.sqf index 60edb8941d..a33e49e7d0 100644 --- a/addons/common/functions/fnc_getMapGridData.sqf +++ b/addons/common/functions/fnc_getMapGridData.sqf @@ -68,15 +68,13 @@ private _stepXat5 = _stepX * 10 ^ ((count _formatX) - 5); private _stepYat5 = -1 * _stepY * 10 ^ ((count _formatY) - 5); if (_stepYat5 < 0) then { - WARNING_1("Map Grid Warning (%1) - Northing is reversed.",worldName); + TRACE_1("Northing is reversed",worldName); }; - if (_stepXat5 != 1) then { - WARNING_2("Map Grid Warning (%1) - MGRS 10 digit grid does not equal 1 meter: (%2) for x.",worldName,_stepXat5); + TRACE_2("MGRS 10 digit grid does not equal 1 meter",_stepXat5,worldName); }; - if (_stepYat5 != 1 && {_stepYat5 != -1}) then { - WARNING_2("Map Grid Warning (%1) - MGRS 10 digit grid does not equal 1 meter: (%2) for y.",worldName,_stepXat5); + TRACE_2("MGRS 10 digit grid does not equal 1 meter",_stepYat5,worldName); }; GVAR(mapGridData) = [_offsetX, _realOffsetY, _stepXat5, _stepYat5]; diff --git a/addons/common/functions/fnc_runTests.sqf b/addons/common/functions/fnc_runTests.sqf new file mode 100644 index 0000000000..538f321765 --- /dev/null +++ b/addons/common/functions/fnc_runTests.sqf @@ -0,0 +1,48 @@ +/* + * Author: PabstMirror + * Run test functions. + * + * Arguments: + * 0: Specific test to run (default is to run all) (default: #all) + * + * Return Value: + * None + * + * Example: + * [] call ace_common_fnc_runTests + * ["fcs"] call ace_common_fnc_runTests + * + * Public: Yes + */ +#include "script_component.hpp" + +params [["_specificTest", "#all", [""]]]; + +private _startTime = diag_tickTime; +private _fails = []; +private _total = 0; + +INFO_1("ace_common_fnc_runTests starting for [%1]", _specificTest); + +{ + private _testName = configName _x; + if ((_specificTest == "#all") || {_specificTest == _testName}) then { + _total = _total + 1; + private _testFile = getText _x; + diag_log text format ["----- Starting Testing %1 [%2] -----", _testName, _testFile]; + private _return = ([nil] apply (compile preProcessFileLineNumbers _testFile)) select 0; + if ((isNil "_return") || {!(_return isEqualTo true)}) then { + systemChat format ["Test [%1] Failed", _testName]; + diag_log text format ["----- Finished Testing %1 [Failed] -----", _testName]; + _fails pushBack _testName; + } else { + diag_log text format ["----- Finished Testing %1 [Passed] -----", _testName]; + }; + }; +} forEach (configProperties [configFile >> "ACE_Tests"]); + +INFO_1("ace_common_fnc_runTests finished in %1 ms", (1000 * (diag_tickTime - _startTime)) toFixed 1); +INFO_2("[%1 / %2] Tests Passed", (_total - (count _fails)), _total); +if (!(_fails isEqualTo [])) then { + INFO_1("Failed: %1", _fails); +}; diff --git a/addons/fcs/config.cpp b/addons/fcs/config.cpp index 29aba659b5..df849ec346 100644 --- a/addons/fcs/config.cpp +++ b/addons/fcs/config.cpp @@ -30,3 +30,7 @@ class CfgPatches { class ACE_Extensions { extensions[] += {"ace_fcs"}; }; + +class ACE_Tests { + fcs = QPATHTOF(dev\test_debugConfigs.sqf); +}; diff --git a/addons/fcs/functions/dev_debugConfigs.sqf b/addons/fcs/dev/test_debugConfigs.sqf similarity index 89% rename from addons/fcs/functions/dev_debugConfigs.sqf rename to addons/fcs/dev/test_debugConfigs.sqf index 73abd89771..89fa6b0d31 100644 --- a/addons/fcs/functions/dev_debugConfigs.sqf +++ b/addons/fcs/dev/test_debugConfigs.sqf @@ -1,5 +1,8 @@ // PabstMirror -#include "script_component.hpp" +// ["fcs"] call ace_common_fnc_runTests; +// execVM "z\ace\addons\fcs\dev\test_debugConfigs.sqf; + +private _testPass = true; diag_log text format ["[ACE_FCS] ---------------"]; private _vehicles = configProperties [configFile >> "CfgVehicles", "(isClass _x) && {2 == getNumber (_x >> 'scope')}", true]; @@ -20,7 +23,10 @@ private _problemUIs = []; _ballisticComputer = [_ballisticComputer, 5] call ace_common_fnc_toBin; if ((_ballisticComputer select [(count _ballisticComputer) - 5, 1]) == "1") then { _vanillaFCS = true; - if (_aceFCS) then {diag_log text format ["%1 -> %2: ACE FCS Enabled CONFLICTS with vanilla FCS [%3]", _vehicleType, _weapon, _ballisticComputer];}; + if (_aceFCS) then { + _testPass = false; + diag_log text format ["%1 -> %2: ACE FCS Enabled CONFLICTS with vanilla FCS [%3]", _vehicleType, _weapon, _ballisticComputer]; + }; }; } forEach _weapons; @@ -76,7 +82,8 @@ private _problemUIs = []; }; }; }; - } forEach [[0],[0,0]]; + // } forEach [[0],[0,0]]; + } forEach [[0],[0,0], [1], [2]]; } forEach _vehicles; _problemUIs sort true; @@ -86,3 +93,5 @@ diag_log text format ["[ACE_FCS] ------- Problem UIs --------"]; diag_log text format ["- %1", _x]; } forEach _problemUIs; diag_log text format ["[ACE_FCS] ---------------"]; + +_testPass diff --git a/addons/rearm/CfgVehicles.hpp b/addons/rearm/CfgVehicles.hpp index de141c2837..56bf0ec7ba 100644 --- a/addons/rearm/CfgVehicles.hpp +++ b/addons/rearm/CfgVehicles.hpp @@ -106,12 +106,8 @@ class CfgVehicles { GVAR(defaultSupply) = 1200; }; - class Truck_02_Ammo_base_F; - class I_Truck_02_ammo_F: Truck_02_Ammo_base_F { - transportAmmo = 0; - GVAR(defaultSupply) = 1200; - }; - class O_Truck_02_Ammo_F: Truck_02_Ammo_base_F { + class Truck_02_base_F; + class Truck_02_Ammo_base_F: Truck_02_base_F { transportAmmo = 0; GVAR(defaultSupply) = 1200; }; diff --git a/addons/rearm/XEH_postInit.sqf b/addons/rearm/XEH_postInit.sqf index 59920be498..1fd9462df8 100644 --- a/addons/rearm/XEH_postInit.sqf +++ b/addons/rearm/XEH_postInit.sqf @@ -24,10 +24,3 @@ if (isServer) then { [QGVAR(rearmSuccessEH), LINKFUNC(rearmSuccess)] call CBA_fnc_addEventHandler; [QGVAR(rearmSuccessLocalEH), LINKFUNC(rearmSuccessLocal)] call CBA_fnc_addEventHandler; - -#ifdef DEBUG_MODE_FULL -INFO("Showing CfgVehicles with vanilla transportAmmo"); -{ - WARNING_2("Type [%1] needs config [transportAmmo: %2]", configName _x, getNumber (_x >> 'transportAmmo')); -} forEach (configProperties [configFile >> "CfgVehicles", "(isClass _x) && {(getNumber (_x >> 'transportAmmo')) > 0}", true]); -#endif diff --git a/addons/rearm/config.cpp b/addons/rearm/config.cpp index a4c130c974..348ca8751b 100644 --- a/addons/rearm/config.cpp +++ b/addons/rearm/config.cpp @@ -20,3 +20,7 @@ class CfgPatches { #include "CfgAmmo.hpp" #include "CfgMagazines.hpp" #include "CfgVehicles.hpp" + +class ACE_Tests { + vehicleTransportAmmo = QPATHTOF(dev\test_debugConfigs.sqf); +}; diff --git a/addons/rearm/dev/test_debugConfigs.sqf b/addons/rearm/dev/test_debugConfigs.sqf new file mode 100644 index 0000000000..8b61bf195f --- /dev/null +++ b/addons/rearm/dev/test_debugConfigs.sqf @@ -0,0 +1,14 @@ +// ["vehicleTransportAmmo"] call ace_common_fnc_runTests; +// execVM "z\ace\addons\rearm\dev\test_debugConfigs.sqf"; + +#include "\z\ace\addons\rearm\script_component.hpp" + +private _testPass = true; + +INFO("Showing CfgVehicles with vanilla transportAmmo"); +{ + WARNING_2("Type [%1] needs config [transportAmmo: %2]", configName _x, getNumber (_x >> 'transportAmmo')); + _testPass = false; +} forEach (configProperties [configFile >> "CfgVehicles", "(isClass _x) && {(getNumber (_x >> 'transportAmmo')) > 0}", true]); + +_testPass diff --git a/addons/refuel/XEH_postInit.sqf b/addons/refuel/XEH_postInit.sqf index 5d56e388e9..8f4a4fc09c 100644 --- a/addons/refuel/XEH_postInit.sqf +++ b/addons/refuel/XEH_postInit.sqf @@ -26,18 +26,6 @@ if (hasInterface) then { }; -#ifdef DEBUG_MODE_FULL -diag_log text format ["[ACE-refuel] Showing CfgVehicles with vanilla transportFuel"]; -private _fuelTrucks = configProperties [configFile >> "CfgVehicles", "(isClass _x) && {(getNumber (_x >> 'transportFuel')) > 0}", true]; -{ - if ((configName _x) isKindOf "Car") then { - diag_log text format ["Car [%1] needs config [fuel: %2]", configName _x, getNumber (_x >> 'transportFuel')]; - } else { - diag_log text format ["Non-car? [%1] needs config [fuel: %2]", configName _x, getNumber (_x >> 'transportFuel')]; - }; -} forEach _fuelTrucks; -#endif - #ifdef DRAW_HOOKS_POS addMissionEventHandler ["Draw3D", { private _target = cursorObject; diff --git a/addons/refuel/config.cpp b/addons/refuel/config.cpp index 40e28d9222..63538726ca 100644 --- a/addons/refuel/config.cpp +++ b/addons/refuel/config.cpp @@ -17,3 +17,7 @@ class CfgPatches { #include "ACE_Settings.hpp" #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" + +class ACE_Tests { + vehicleTransportFuel = QPATHTOF(dev\test_debugConfigs.sqf); +}; diff --git a/addons/refuel/dev/test_debugConfigs.sqf b/addons/refuel/dev/test_debugConfigs.sqf new file mode 100644 index 0000000000..834d3626bf --- /dev/null +++ b/addons/refuel/dev/test_debugConfigs.sqf @@ -0,0 +1,18 @@ +// ["vehicleTransportFuel"] call ace_common_fnc_runTests; +// execVM "z\ace\addons\refuel\dev\test_debugConfigs.sqf"; + +#include "\z\ace\addons\refuel\script_component.hpp" + +private _testPass = true; + +diag_log text format ["[ACE-refuel] Showing CfgVehicles with vanilla transportFuel"]; +private _fuelTrucks = configProperties [configFile >> "CfgVehicles", "(isClass _x) && {(getNumber (_x >> 'transportFuel')) > 0}", true]; +{ + if ((configName _x) isKindOf "Car") then { + diag_log text format ["Car [%1] needs config [transportFuel: %2]", configName _x, getNumber (_x >> 'transportFuel')]; + } else { + diag_log text format ["Non-car? [%1] needs config [transportFuel: %2]", configName _x, getNumber (_x >> 'transportFuel')]; + }; +} forEach _fuelTrucks; + +_testPass