tests/lua_noncritical/staticmines.lua
author Wuzzy <Wuzzy2@mail.ru>
Thu, 11 Jul 2019 16:24:09 +0200
changeset 15252 c10e9261ab9c
parent 14390 7f0166b01dc9
permissions -rw-r--r--
Make lowest line of Splash image frames transparent to work around scaling issues The Splash image is scaled. Sometimes, the lowest line is repeated on the top, which caused some weird lines to appear above big splashes (e.g. piano). This has been done fully automated with a script. Only the alpha channel was changed. The color information is preserved.

--[[ 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