feat(scala): m09 input/app/runtime and m10 extensions with tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
bd0c9fcc0c
commit
c6ecb7c013
@@ -0,0 +1,52 @@
|
||||
package snake
|
||||
|
||||
import Fixtures.*
|
||||
import M09Helpers.drawn
|
||||
|
||||
class M10ExtensionsSuite extends munit.FunSuite:
|
||||
cases("m10-update").foreach { c =>
|
||||
test(s"update: ${c("name").str}") {
|
||||
val a = c("args")
|
||||
assertEquals(Game.update(gameState(a(0)), action(a(1))), gameState(c("expected")))
|
||||
}
|
||||
}
|
||||
|
||||
cases("m10-moves-every").foreach { c =>
|
||||
test(s"movesEvery: ${c("name").str}") {
|
||||
assertEquals(Game.movesEvery(c("args")(0).num.toInt), c("expected").num.toInt)
|
||||
}
|
||||
}
|
||||
|
||||
cases("m10-input").foreach { c =>
|
||||
test(s"keyToAction: ${c("name").str}") {
|
||||
assertEquals(Input.keyToAction(c("args")(0).str), opt(c("expected"))(action))
|
||||
}
|
||||
}
|
||||
|
||||
private def time(t: Long): Event = Event.Time(t)
|
||||
private val frameTimes = List(25L, 50L, 75L, 100L, 125L, 150L, 175L, 200L)
|
||||
|
||||
test("the animation clock runs every 25 ms") { assertEquals(App.FRAME_MS, 25L) }
|
||||
|
||||
test("speedActions turns the clock into Frame actions every 25 ms") {
|
||||
assertEquals(App.speedActions.run(frameTimes.map(time)), List.fill(8)(Action.Frame))
|
||||
}
|
||||
|
||||
test("speedActions still turns keys into actions, including pause and restart") {
|
||||
assertEquals(
|
||||
App.speedActions.run(List(Event.KeyDown(" "), Event.KeyDown("r"), Event.KeyDown("ArrowUp"))),
|
||||
List(Action.TogglePause, Action.Restart, Action.Turn(Direction.Up))
|
||||
)
|
||||
}
|
||||
|
||||
test("main (seed 42) draws a moved snake after eight 25 ms frames") {
|
||||
val traced = IO.trace(App.main, 42)
|
||||
assertEquals(traced.ops, List(Op.RandomSeed))
|
||||
val (first, afterFirst) = traced.result.step(time(0))
|
||||
assertEquals(drawn(first.head), View.view(Spawn.newGame(42)))
|
||||
val drawings = afterFirst.run(frameTimes.map(time))
|
||||
assertEquals(drawings.length, 8)
|
||||
val start = Spawn.newGame(42)
|
||||
val moved = start.copy(snake = start.snake.map(p => p.copy(x = p.x + 1)), frame = 8)
|
||||
assertEquals(drawn(drawings(7)), View.view(moved))
|
||||
}
|
||||
Reference in New Issue
Block a user