test: hazards, ladders and one-way platforms

This commit is contained in:
dualfroz committed 2026-08-28 14:24:00 +02:00
1 parent 207691433c
commit dd74783ff0
3 files changed
+160

No files matched your search

+43
View File
@@ -0,0 +1,43 @@
from game import constants
from tests.support import makeWorld
from game.sim.inputCommand import InputCommand
spikeLevel = [
" ",
" p ",
"^^^^^",
"XXXXX",
]
safeLevel = [
" ",
" p ",
" ",
"XXXXX",
]
def test_spikesDamagePlayer():
world = makeWorld(spikeLevel)
for _ in range(12):
world.step(InputCommand())
assert world.player.hp <= world.player.maxHp - 2
assert world.player.iframes > 0
def test_noHazardKeepsFullHealth():
world = makeWorld(safeLevel)
for _ in range(12):
world.step(InputCommand())
assert world.player.hp == world.player.maxHp
def test_iframesPreventDoubleHit():
world = makeWorld(spikeLevel)
for _ in range(3):
world.step(InputCommand())
hpAfterFirst = world.player.hp
world.step(InputCommand())
assert world.player.hp == hpAfterFirst
assert world.player.hp < world.player.maxHp
+50
View File
@@ -0,0 +1,50 @@
import pytest
from game import constants
from tests.support import makeWorld
from game.sim.inputCommand import InputCommand
ladderLevel = [
" H ",
" H ",
" H ",
"XXXXX",
]
def seatOnLadder(world):
world.player.x = 2 * constants.tileSize
world.player.y = 2 * constants.tileSize
world.player.vy = 0.0
def test_climbLadderReducesHeight():
world = makeWorld(ladderLevel)
seatOnLadder(world)
startY = world.player.y
for _ in range(8):
world.step(InputCommand(up=True))
assert world.player.onLadder
assert world.player.y < startY - 6.0
def test_ladderHoverIgnoresGravity():
world = makeWorld(ladderLevel)
seatOnLadder(world)
for _ in range(6):
world.step(InputCommand(up=True))
restingY = world.player.y
for _ in range(6):
world.step(InputCommand())
assert world.player.y == pytest.approx(restingY, abs=0.5)
def test_leavingLadderTileDropsClimbState():
world = makeWorld(ladderLevel)
seatOnLadder(world)
world.step(InputCommand(up=True))
assert world.player.onLadder
world.player.x = 0.0
world.step(InputCommand())
assert not world.player.onLadder
+67
View File
@@ -0,0 +1,67 @@
import pytest
from game import constants
from tests.support import makeWorld
from game.sim.inputCommand import InputCommand
def test_landsOnOneWayFromAbove():
world = makeWorld([
" p ",
" ",
"======",
" ",
"XXXXXX",
])
for _ in range(30):
world.step(InputCommand())
player = world.player
assert player.onGround
assert player.bottom == pytest.approx(2 * constants.tileSize)
def test_passesThroughOneWayFromBelow():
world = makeWorld([
" ",
"======",
" ",
" p ",
"XXXXXX",
])
minY = world.player.y
world.step(InputCommand(jump=True, jumpHeld=True))
for _ in range(16):
world.step(InputCommand(jumpHeld=True))
minY = min(minY, world.player.y)
assert minY < constants.tileSize
def test_dropThroughOneWay():
world = makeWorld([
" p ",
" ",
"======",
" ",
"XXXXXX",
])
for _ in range(30):
world.step(InputCommand())
assert world.player.bottom == pytest.approx(2 * constants.tileSize)
for _ in range(30):
world.step(InputCommand(down=True, jump=True))
assert world.player.bottom == pytest.approx(4 * constants.tileSize)
def test_downWithoutJumpKeepsPlayerOnOneWay():
world = makeWorld([
" p ",
" ",
"======",
" ",
"XXXXXX",
])
for _ in range(30):
world.step(InputCommand())
for _ in range(20):
world.step(InputCommand(down=True))
assert world.player.bottom == pytest.approx(2 * constants.tileSize)