62 lines
2.0 KiB
Scala
62 lines
2.0 KiB
Scala
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
|