tests/lua/staticmines.lua
changeset 12652 31c4a81823eb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/lua/staticmines.lua	Thu Oct 05 05:20:25 2017 +0200
@@ -0,0 +1,137 @@
+--[[ 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
\ No newline at end of file