Files
2026-10-29 00:07:27 +01:00

55 lines
1.8 KiB
Scala

package snake
import Fixtures.*
class M02ModelSuite extends munit.FunSuite:
cases("m02-delta").foreach { c =>
test(s"delta: ${c("name").str}") {
assertEquals(Model.delta(direction(c("args")(0))), point(c("expected")))
}
}
cases("m02-opposite").foreach { c =>
test(s"opposite: ${c("name").str}") {
assertEquals(Model.opposite(direction(c("args")(0))), direction(c("expected")))
}
}
// pointEquals has no Scala function: case classes already compare structurally with `==`.
// The shared fixture is kept so every track checks the same four situations.
cases("m02-point-equals").foreach { c =>
test(s"pointEquals (case-class ==): ${c("name").str}") {
val a = point(c("args")(0))
val b = point(c("args")(1))
assertEquals(a == b, c("expected").bool)
}
}
cases("m02-initial-state").foreach { c =>
test(s"initialState: ${c("name").str}") {
assertEquals(Model.initialState(c("args")(0).num.toLong), gameState(c("expected")))
}
}
test("Point holds its coordinates") {
val p = Point(3, 4)
assertEquals((p.x, p.y), (3, 4))
}
test("opposite is its own inverse") {
Direction.values.foreach(d => assertEquals(Model.opposite(Model.opposite(d)), d))
}
test("Action.Turn carries the direction") {
assertEquals(Action.Turn(Direction.Left), Action.Turn(Direction.Left))
assertNotEquals(Action.Turn(Direction.Left), Action.Turn(Direction.Right))
Action.Turn(Direction.Left) match
case Action.Turn(d) => assertEquals(d, Direction.Left)
case other => fail(s"expected Turn, got $other")
}
test("the other Actions are distinct constants") {
val all = List(Action.Tick, Action.TogglePause, Action.Restart, Action.Frame)
assertEquals(all.distinct.length, 4)
}