test(eval): add evaluation and see tests

This commit is contained in:
dualfroz committed 2026-08-27 19:15:00 +02:00
1 parent 7f6ee4e6f1
commit cc78b32f85
2 files changed
+112

No files matched your search

+61
View File
@@ -0,0 +1,61 @@
package gambit
class SeeTest extends munit.FunSuite:
private def seeOf(fen: String, uci: String): Int =
val pos = Fen.parse(fen)
val legal = new MoveList()
MoveGen.generateLegal(pos, legal)
var move = 0
var i = 0
while i < legal.size do
if Move.uci(legal(i)) == uci then move = legal(i)
i += 1
assert(move != 0, s"move $uci not legal in $fen")
See.gain(pos, move)
test("rook grabs an undefended pawn for a clean pawn") {
assertEquals(seeOf("4k3/8/8/4p3/8/8/8/4R1K1 w - - 0 1", "e1e5"), 100)
}
test("rook takes a pawn defended by a pawn and loses the exchange") {
assertEquals(seeOf("4k3/8/3p4/4p3/8/8/8/4R1K1 w - - 0 1", "e1e5"), -400)
}
test("pawn trade supported on both sides is exactly even") {
assertEquals(seeOf("4k3/8/3p4/4p3/3P4/8/8/4K3 w - - 0 1", "d4e5"), 0)
}
test("knight takes a pawn defended by a pawn") {
assertEquals(seeOf("4k3/8/3p4/4p3/8/5N2/8/4K3 w - - 0 1", "f3e5"), -220)
}
test("doubled rooks x-ray through the front rook to win the exchange back") {
assertEquals(seeOf("4rk2/8/8/4p3/8/4R3/8/4R1K1 w - - 0 1", "e3e5"), 100)
}
test("capturing a hanging queen wins its full value") {
assertEquals(seeOf("4k3/8/8/3q4/8/8/8/3RK3 w - - 0 1", "d1d5"), 900)
}
test("en passant capture is evaluated as a pawn trade") {
assertEquals(seeOf("4k3/8/8/3pP3/8/8/8/4K3 w - d6 0 1", "e5d6"), 100)
}
test("isWinning and isLosing classify captures consistently with the swap value") {
val fen = "4k3/8/3p4/4p3/8/5N2/8/4K3 w - - 0 1"
assert(See.isLosing(Fen.parse(fen), findMove(fen, "f3e5")))
val fenWin = "4k3/8/8/3q4/8/8/8/3RK3 w - - 0 1"
assert(See.isWinning(Fen.parse(fenWin), findMove(fenWin, "d1d5")))
}
private def findMove(fen: String, uci: String): Int =
val pos = Fen.parse(fen)
val legal = new MoveList()
MoveGen.generateLegal(pos, legal)
var move = 0
var i = 0
while i < legal.size do
if Move.uci(legal(i)) == uci then move = legal(i)
i += 1
move