Files
pixel-platformer/tests/test_moving_platform.py

71 lines
2.1 KiB
Python

import pytest
from tests.support import makeLevel
from game.sim.level import PlatformSpawn
from game.sim.world import World
from game.sim.movingPlatform import MovingPlatform
from game.sim.inputCommand import InputCommand
def buildPlatformWorld(spawn):
level = makeLevel([
" p ",
" ",
" ",
" ",
"XXXXXXXXXX",
])
level.platforms.append(spawn)
return World(level)
def test_platformOscillatesBetweenEndpoints():
platform = MovingPlatform(16, 32, 48, 8, 80, 32, 4.0)
seen = []
for _ in range(60):
platform.update()
seen.append(platform.x)
assert max(seen) <= 80.0 + 1e-6
assert min(seen) >= 16.0 - 1e-6
assert platform.direction in (-1, 1)
def seatOnPlatform(world):
platform = world.platforms[0]
world.player.x = platform.x + 6
world.player.y = platform.y - world.player.h
world.player.vx = 0.0
world.player.vy = 0.0
for _ in range(6):
world.step(InputCommand())
return platform
def test_playerCarriedHorizontallyByPlatform():
world = buildPlatformWorld(PlatformSpawn(16, 48, 48, 8, 160, 48, 1.0))
platform = seatOnPlatform(world)
assert world.player.onGround
assert world.player.groundPlatform is not None
playerStart = world.player.x
platformStart = platform.x
for _ in range(10):
world.step(InputCommand())
playerDelta = world.player.x - playerStart
platformDelta = platform.x - platformStart
assert abs(platformDelta) > 4.0
assert playerDelta == pytest.approx(platformDelta, abs=0.6)
def test_playerCarriedVerticallyByPlatform():
world = buildPlatformWorld(PlatformSpawn(16, 60, 48, 8, 16, 20, 1.0))
platform = seatOnPlatform(world)
assert world.player.groundPlatform is not None
playerStart = world.player.y
platformStart = platform.y
for _ in range(8):
world.step(InputCommand())
playerDelta = world.player.y - playerStart
platformDelta = platform.y - platformStart
assert abs(platformDelta) > 3.0
assert playerDelta == pytest.approx(platformDelta, abs=0.9)