mirror of
https://github.com/danbee/chess
synced 2025-03-04 08:39:06 +00:00
Add tests for king in check
This commit is contained in:
parent
fd3fad05d1
commit
320cb03b1f
@ -1,6 +1,8 @@
|
|||||||
defmodule Chess.Board do
|
defmodule Chess.Board do
|
||||||
@moduledoc false
|
@moduledoc false
|
||||||
|
|
||||||
|
alias Chess.Moves.Piece
|
||||||
|
|
||||||
def transform(board) do
|
def transform(board) do
|
||||||
Enum.map(0..7, fn (rank) ->
|
Enum.map(0..7, fn (rank) ->
|
||||||
Enum.map(0..7, fn (file) ->
|
Enum.map(0..7, fn (file) ->
|
||||||
@ -30,6 +32,16 @@ defmodule Chess.Board do
|
|||||||
Map.put(board, "#{to_file},#{to_rank}", piece)
|
Map.put(board, "#{to_file},#{to_rank}", piece)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def check?(board, colour) do
|
||||||
|
king =
|
||||||
|
board
|
||||||
|
|> search(%{"type" => "king", "colour" => colour})
|
||||||
|
|> List.first
|
||||||
|
|
||||||
|
board
|
||||||
|
|> Piece.attacked?(king)
|
||||||
|
end
|
||||||
|
|
||||||
def default do
|
def default do
|
||||||
%{
|
%{
|
||||||
"0,7" => %{"type" => "rook", "colour" => "black"},
|
"0,7" => %{"type" => "rook", "colour" => "black"},
|
||||||
|
|||||||
@ -49,6 +49,10 @@ defmodule Chess.Moves.Piece do
|
|||||||
Enum.any?(moves, &(match_piece(board, &1, "pawn")))
|
Enum.any?(moves, &(match_piece(board, &1, "pawn")))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp _attacked?(_board, {0, _rank}, {-1, _}, _), do: false
|
||||||
|
defp _attacked?(_board, {_file, 0}, {_, -1}, _), do: false
|
||||||
|
defp _attacked?(_board, {7, _rank}, {1, _}, _), do: false
|
||||||
|
defp _attacked?(_board, {_file, 7}, {_, 1}, _), do: false
|
||||||
defp _attacked?(board, {file, rank}, {fv, rv}, pieces) do
|
defp _attacked?(board, {file, rank}, {fv, rv}, pieces) do
|
||||||
{file, rank} =
|
{file, rank} =
|
||||||
board
|
board
|
||||||
|
|||||||
@ -31,13 +31,49 @@ defmodule Chess.BoardTest do
|
|||||||
|
|
||||||
test "moves a piece" do
|
test "moves a piece" do
|
||||||
board = %{
|
board = %{
|
||||||
"3,0" => %{"type" => "queen", "colour" => "white"},
|
"3,0" => %{"type" => "queen", "colour" => "white"},
|
||||||
}
|
}
|
||||||
|
|
||||||
new_board = Board.move_piece(board, %{"from" => [3, 0], "to" => [5, 2]})
|
new_board = Board.move_piece(board, %{"from" => [3, 0], "to" => [5, 2]})
|
||||||
|
|
||||||
assert new_board == %{
|
assert new_board == %{
|
||||||
"5,2" => %{"type" => "queen", "colour" => "white"},
|
"5,2" => %{"type" => "queen", "colour" => "white"},
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "recognise when the king is in check" do
|
||||||
|
board = %{
|
||||||
|
"4,0" => %{"type" => "king", "colour" => "white"},
|
||||||
|
"4,7" => %{"type" => "queen", "colour" => "black"},
|
||||||
|
}
|
||||||
|
|
||||||
|
assert Board.check?(board, "white")
|
||||||
|
end
|
||||||
|
|
||||||
|
test "recognise when the king is not in check" do
|
||||||
|
board = %{
|
||||||
|
"5,0" => %{"type" => "king", "colour" => "white"},
|
||||||
|
"4,7" => %{"type" => "queen", "colour" => "black"},
|
||||||
|
}
|
||||||
|
|
||||||
|
refute Board.check?(board, "white")
|
||||||
|
end
|
||||||
|
|
||||||
|
test "recognize when the king is in check by a knight" do
|
||||||
|
board = %{
|
||||||
|
"4,0" => %{"type" => "king", "colour" => "white"},
|
||||||
|
"3,2" => %{"type" => "knight", "colour" => "black"},
|
||||||
|
}
|
||||||
|
|
||||||
|
assert Board.check?(board, "white")
|
||||||
|
end
|
||||||
|
|
||||||
|
test "recognize when the king is in check by a pawn" do
|
||||||
|
board = %{
|
||||||
|
"4,0" => %{"type" => "king", "colour" => "white"},
|
||||||
|
"3,1" => %{"type" => "pawn", "colour" => "black"},
|
||||||
|
}
|
||||||
|
|
||||||
|
assert Board.check?(board, "white")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -12,6 +12,15 @@ defmodule Chess.Moves.PieceTest do
|
|||||||
refute Piece.attacked?(board, {4, 5})
|
refute Piece.attacked?(board, {4, 5})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "piece on the edge of the board is not being attacked" do
|
||||||
|
board = %{
|
||||||
|
"4,0" => %{"type" => "king", "colour" => "white"},
|
||||||
|
"2,7" => %{"type" => "rook", "colour" => "black"},
|
||||||
|
}
|
||||||
|
|
||||||
|
refute Piece.attacked?(board, {4, 0})
|
||||||
|
end
|
||||||
|
|
||||||
test "piece is not being attacked by piece of its own colour" do
|
test "piece is not being attacked by piece of its own colour" do
|
||||||
board = %{
|
board = %{
|
||||||
"4,5" => %{"type" => "king", "colour" => "white"},
|
"4,5" => %{"type" => "king", "colour" => "white"},
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user