1
0
mirror of https://github.com/danbee/chess synced 2025-03-04 08:39:06 +00:00

WIP: Show captured pieces

This commit is contained in:
Daniel Barber 2019-04-24 22:55:54 -04:00
parent 35f26d87df
commit 316ee3aa8c
Signed by: danbarber
GPG Key ID: 931D8112E0103DD8
4 changed files with 48 additions and 3 deletions

View File

@ -36,10 +36,11 @@ defmodule Chess.Repo.Queries do
|> Repo.get!(game_id)
end
def moves_with_captures(game_id) do
def captures_for_colour(game, colour) do
Move
|> Move.for_game_id(game_id)
|> Move.for_game_id(game.id)
|> Move.with_captures
|> Move.captures_for_colour(colour)
|> Repo.all
end

View File

@ -37,6 +37,11 @@ defmodule Chess.Store.Move do
where: not is_nil(move.piece_captured)
end
def captures_for_colour(query, colour) do
from move in query,
where: fragment("(piece_captured -> 'colour')::jsonb = ?", ^colour)
end
def transform(move) do
%{
id: move.id,

View File

@ -6,8 +6,8 @@ defmodule ChessWeb.GameChannelView do
import ChessWeb.GameView, only: [player: 2, opponent: 2]
alias Chess.Board
alias Chess.MoveList
alias Chess.Repo.Queries
def after_join_payload(socket, game) do
%{
@ -19,6 +19,10 @@ defmodule ChessWeb.GameChannelView do
turn: game.turn,
state: game.state,
moves: MoveList.transform(game.moves),
graveyard: %{
white: Queries.captures_for_colour(game, "white"),
black: Queries.captures_for_colour(game, "black"),
},
}
end
@ -28,6 +32,10 @@ defmodule ChessWeb.GameChannelView do
turn: game.turn,
state: game.state,
moves: MoveList.transform(game.moves),
graveyard: %{
white: Queries.captures_for_colour(game, "white"),
black: Queries.captures_for_colour(game, "black"),
},
}
end
end

View File

@ -145,6 +145,37 @@ defmodule Chess.Features.MovesTest do
|> assert_has(square_containing("f4-r3", %{type: "pawn", colour: "white"}))
end
test "captured pieces are displayed on the page", %{session: session} do
user = insert(:user, %{password: "mypassword"})
opponent = insert(:opponent)
insert(:game, %{
board: %{
"4,0" => %{"type" => "queen", "colour" => "white"},
"0,2" => %{"type" => "king", "colour" => "white"},
"4,7" => %{"type" => "pawn", "colour" => "black"},
"0,7" => %{"type" => "king", "colour" => "black"},
},
user_id: user.id,
opponent_id: opponent.id,
turn: "white",
})
session
|> login(user.email, "mypassword")
|> visit("/games")
|> click(link("Game with #{opponent.name}"))
refute_has(session, css("li", text: "Black Pawn"))
session
|> click(css("#f4-r0"))
|> click(css("#f4-r7"))
|> assert_has(square_containing("f4-r7", %{type: "queen", colour: "white"}))
|> refute_has(square_containing("f4-r0", %{type: "queen", colour: "white"}))
|> assert_has(css("li", text: "Black Pawn"))
end
test "cannot move the king into a position that would result in check",
%{session: session} do
user = insert(:user, %{