tests/lua/staticmines.lua
branch0.9.25
changeset 14374 7f0166b01dc9
parent 14373 c2a3d15df7d3
child 14381 c3ae3cac8fba
child 14392 1465f34973b5
equal deleted inserted replaced
14373:c2a3d15df7d3 14374:7f0166b01dc9
     1 --[[ Static Mines Test
       
     2 
       
     3 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.
       
     4 
       
     5 The test passes if the mines don't move for a very long time.
       
     6 The test failes if any mine moves even the tiniest bit or is destroyed.
       
     7 
       
     8 This test case has been created as response to bug 96.
       
     9 ]]
       
    10 
       
    11 -- Max. time to test
       
    12 local TEST_TIME_LIMIT = 3600000 * 5 -- 5 hours
       
    13 
       
    14 local hhs = {}
       
    15 
       
    16 function onGameInit()
       
    17 
       
    18 	ClearGameFlags()
       
    19 	EnableGameFlags(gfDisableWind, gfOneClanMode)
       
    20 	Map = ""
       
    21 	Seed = 12
       
    22 	Theme = "Desert"
       
    23 	MapGen = mgDrawn
       
    24 	TurnTime = -1
       
    25 	Explosives = 0
       
    26 	MinesNum = 0
       
    27 	CaseFreq = 0
       
    28 	Delay = 100
       
    29 	WaterRise = 0
       
    30 	HealthDecrease = 0
       
    31 	AirMinesNum = 0
       
    32 
       
    33 
       
    34 	AddTeam("Test Team", 0xFFFF00, "Statue", "Tank", "Default", "cm_test")
       
    35 	hhs[1] = AddHog("Test Hog", 0, 100, "cm_test")
       
    36 	SetGearPosition(hhs[1], 300, 1450)
       
    37 end
       
    38 
       
    39 local mines = {
       
    40 	{ x = 231, y = 1708},
       
    41 	{ x = 290, y = 1708},
       
    42 	{ x = 342, y = 1708},
       
    43 	{ x = 261, y = 1708},
       
    44 	{ x = 319, y = 1708},
       
    45 	{ x = 403, y = 1706},
       
    46 	{ x = 428, y = 1706},
       
    47 	{ x = 461, y = 1706},
       
    48 	{ x = 498, y = 1706},
       
    49 	{ x = 518, y = 1706},
       
    50 }
       
    51 
       
    52 function LoadGearData()
       
    53 	------ GIRDER LIST ------
       
    54 	PlaceGirder(290, 1718, 4)
       
    55 	PlaceGirder(290, 1790, 4)
       
    56 	PlaceGirder(452, 1716, 4)
       
    57 	PlaceGirder(452, 1790, 4)
       
    58 	
       
    59 	PlaceGirder(300, 1500, 4)
       
    60 
       
    61 	------ MINE LIST ------
       
    62 	for m=1, #mines do
       
    63 		mines[m].gear = AddGear(mines[m].x, mines[m].y, gtMine, 0, 0, 0, 0)
       
    64 	end
       
    65 
       
    66 end
       
    67 
       
    68 function onGameStart()
       
    69 	LoadGearData()
       
    70 end
       
    71 
       
    72 function onGearDelete(gear)
       
    73 	for m=#mines, 1, -1 do
       
    74 		if gear == mines[m] then
       
    75 			WriteLnToConsole(string.format("Mine %d died!", m))
       
    76 			table.remove(mines, m)
       
    77 		end
       
    78 	end
       
    79 end
       
    80 
       
    81 -- Give a short time for the mines to settle first.
       
    82 local checkTimer = -5000
       
    83 local initPosCheck = false
       
    84 -- Count the total times the mines managed to stand still
       
    85 local totalTime = 0
       
    86 local fin = false
       
    87 function onGameTick20()
       
    88 	if fin then
       
    89 		return
       
    90 	end
       
    91 	-- Infinite turn time
       
    92 	if TurnTimeLeft < 6000 then
       
    93 		TurnTimeLeft = -1
       
    94 	end
       
    95 	checkTimer = checkTimer + 20
       
    96 	if initPosCheck then
       
    97 		totalTime = totalTime + 20
       
    98 	end
       
    99 	if checkTimer >= 1000 then
       
   100 		local failed = false
       
   101 		for m=1, #mines do
       
   102 			if not initPosCheck then
       
   103 				-- Position initialization
       
   104 				-- Save “real” x and y values after the mines have settled
       
   105 				local x, y = GetGearPosition(mines[m].gear)
       
   106 				mines[m].rx = x
       
   107 				mines[m].ry = y
       
   108 			else
       
   109 				-- Position check
       
   110 				local x, y = GetGearPosition(mines[m].gear)
       
   111 				local rx, ry = mines[m].rx, mines[m].ry
       
   112 				if not x or not y then
       
   113 					WriteLnToConsole(string.format("Mine %d has died!", m))
       
   114 					failed = true
       
   115 				elseif x ~= rx or y ~= ry then
       
   116 					WriteLnToConsole(string.format("Mine %d has moved! Expected: (%d, %d). Actual: (%d, %d)", m, rx, ry, x, y))
       
   117 					failed = true
       
   118 				end
       
   119 			end
       
   120 		end
       
   121 		if not initPosCheck then
       
   122 			initPosCheck = true
       
   123 		end
       
   124 		if failed then
       
   125 			WriteLnToConsole(string.format("Test failed. The mines managed to stand still for %d ticks.", totalTime))
       
   126 			EndLuaTest(TEST_FAILED)
       
   127 			fin = true
       
   128 			return
       
   129 		end
       
   130 	end
       
   131 	if totalTime >= TEST_TIME_LIMIT then
       
   132 		WriteLnToConsole(string.format("All mines have been static for over %d ticks! Success!", TEST_TIME_LIMIT))
       
   133 		EndLuaTest(TEST_SUCCESSFUL)
       
   134 		fin = true
       
   135 		return
       
   136 	end
       
   137 end