71 lines
2.1 KiB
Python
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)
|