Create replay file, run engine, result from it and send it to the server. Not implemented: filtering of engine output.
--[[ Static Mines Test
This test tests if mines are able to stand still on the ground for a very long time. 8 mines are spawned on a few girders.
The test passes if the mines don't move for a very long time.
The test failes if any mine moves even the tiniest bit or is destroyed.
This test case has been created as response to bug 96.
]]
-- Max. time to test
local TEST_TIME_LIMIT = 3600000 * 5 -- 5 hours
local hhs = {}
function onGameInit()
ClearGameFlags()
EnableGameFlags(gfDisableWind, gfOneClanMode)
Map = ""
Seed = 12
Theme = "Desert"
MapGen = mgDrawn
TurnTime = -1
Explosives = 0
MinesNum = 0
CaseFreq = 0
Delay = 100
WaterRise = 0
HealthDecrease = 0
AirMinesNum = 0
AddTeam("Test Team", 0xFFFF00, "Statue", "Tank", "Default", "cm_test")
hhs[1] = AddHog("Test Hog", 0, 100, "cm_test")
SetGearPosition(hhs[1], 300, 1450)
end
local mines = {
{ x = 231, y = 1708},
{ x = 290, y = 1708},
{ x = 342, y = 1708},
{ x = 261, y = 1708},
{ x = 319, y = 1708},
{ x = 403, y = 1706},
{ x = 428, y = 1706},
{ x = 461, y = 1706},
{ x = 498, y = 1706},
{ x = 518, y = 1706},
}
function LoadGearData()
------ GIRDER LIST ------
PlaceGirder(290, 1718, 4)
PlaceGirder(290, 1790, 4)
PlaceGirder(452, 1716, 4)
PlaceGirder(452, 1790, 4)
PlaceGirder(300, 1500, 4)
------ MINE LIST ------
for m=1, #mines do
mines[m].gear = AddGear(mines[m].x, mines[m].y, gtMine, 0, 0, 0, 0)
end
end
function onGameStart()
LoadGearData()
end
function onGearDelete(gear)
for m=#mines, 1, -1 do
if gear == mines[m] then
WriteLnToConsole(string.format("Mine %d died!", m))
table.remove(mines, m)
end
end
end
-- Give a short time for the mines to settle first.
local checkTimer = -5000
local initPosCheck = false
-- Count the total times the mines managed to stand still
local totalTime = 0
local fin = false
function onGameTick20()
if fin then
return
end
-- Infinite turn time
if TurnTimeLeft < 6000 then
TurnTimeLeft = -1
end
checkTimer = checkTimer + 20
if initPosCheck then
totalTime = totalTime + 20
end
if checkTimer >= 1000 then
local failed = false
for m=1, #mines do
if not initPosCheck then
-- Position initialization
-- Save “real” x and y values after the mines have settled
local x, y = GetGearPosition(mines[m].gear)
mines[m].rx = x
mines[m].ry = y
else
-- Position check
local x, y = GetGearPosition(mines[m].gear)
local rx, ry = mines[m].rx, mines[m].ry
if not x or not y then
WriteLnToConsole(string.format("Mine %d has died!", m))
failed = true
elseif x ~= rx or y ~= ry then
WriteLnToConsole(string.format("Mine %d has moved! Expected: (%d, %d). Actual: (%d, %d)", m, rx, ry, x, y))
failed = true
end
end
end
if not initPosCheck then
initPosCheck = true
end
if failed then
WriteLnToConsole(string.format("Test failed. The mines managed to stand still for %d ticks.", totalTime))
EndLuaTest(TEST_FAILED)
fin = true
return
end
end
if totalTime >= TEST_TIME_LIMIT then
WriteLnToConsole(string.format("All mines have been static for over %d ticks! Success!", TEST_TIME_LIMIT))
EndLuaTest(TEST_SUCCESSFUL)
fin = true
return
end
end