diff --git a/tests/test_hazard.py b/tests/test_hazard.py new file mode 100644 index 0000000..0fade53 --- /dev/null +++ b/tests/test_hazard.py @@ -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 diff --git a/tests/test_ladder.py b/tests/test_ladder.py new file mode 100644 index 0000000..f401882 --- /dev/null +++ b/tests/test_ladder.py @@ -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 diff --git a/tests/test_oneway.py b/tests/test_oneway.py new file mode 100644 index 0000000..7869216 --- /dev/null +++ b/tests/test_oneway.py @@ -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)