diff --git a/assets/js/components/move-list.js b/assets/js/components/move-list.js index 187dbbf..0f11cb0 100644 --- a/assets/js/components/move-list.js +++ b/assets/js/components/move-list.js @@ -2,26 +2,58 @@ import React from "react"; import { connect } from "react-redux"; import _ from "lodash"; +const pieceToNotation = (piece) => { + const pieces = { + pawn: "", + knight: "N", + bishop: "B", + rook: "R", + queen: "Q", + king: "K", + }; + + return pieces[piece.type]; +}; + +const renderMove = (move) => { + if (move != undefined) { + return ( + {pieceToNotation(move.piece)}{move.to} + ) + } +} + const renderMoves = (moves) => { return _.map(moves, (move) => { return ( -
  • {move}
  • + + {renderMove(move[0])} + {renderMove(move[1])} + ); }); }; const MoveList = (props) => { return ( -
      - {renderMoves(props.moves)} -
    + + + + + + + + + {renderMoves(props.moves)} + +
    WhiteBlack
    ); }; -function mapStateToProps(state) { +const mapStateToProps = (state) => { return { moves: state.moves, }; -} +}; export default connect(mapStateToProps)(MoveList); diff --git a/lib/chess/move_list.ex b/lib/chess/move_list.ex new file mode 100644 index 0000000..aa69fad --- /dev/null +++ b/lib/chess/move_list.ex @@ -0,0 +1,11 @@ +defmodule Chess.MoveList do + @moduledoc false + + alias Chess.Store.Move + + def transform(moves) do + moves + |> Enum.map(fn(move) -> Move.transform(move) end) + |> Enum.chunk_every(2) + end +end diff --git a/lib/chess/moves.ex b/lib/chess/moves.ex index d9d8672..3eda859 100644 --- a/lib/chess/moves.ex +++ b/lib/chess/moves.ex @@ -11,12 +11,6 @@ defmodule Chess.Moves do alias Chess.Moves.Pieces.Queen alias Chess.Moves.Pieces.King - def transform(moves) do - moves - |> Enum.map(fn(move) -> Move.translate(move) end) - |> Enum.chunk_every(2) - end - def available(board, {file, rank}) do piece = board diff --git a/lib/chess/store/move.ex b/lib/chess/store/move.ex index 4fbc5fb..d9fac62 100644 --- a/lib/chess/store/move.ex +++ b/lib/chess/store/move.ex @@ -27,12 +27,13 @@ defmodule Chess.Store.Move do |> validate_required(required_attrs()) end - def translate(move) do - [ - <<97 + move.from["file"], 49 + move.from["rank"]>>, - <<97 + move.to["file"], 49 + move.to["rank"]>> - ] - |> Enum.join("-") + def transform(move) do + %{ + id: move.id, + piece: move.piece, + from: <<97 + move.from["file"], 49 + move.from["rank"]>>, + to: <<97 + move.to["file"], 49 + move.to["rank"]>>, + } end defp required_attrs, do: ~w[game_id from to piece]a diff --git a/lib/chess_web/channels/game_channel.ex b/lib/chess_web/channels/game_channel.ex index 37ba1f1..aea15aa 100644 --- a/lib/chess_web/channels/game_channel.ex +++ b/lib/chess_web/channels/game_channel.ex @@ -8,6 +8,7 @@ defmodule ChessWeb.GameChannel do alias Chess.Store.Game alias Chess.Board alias Chess.Moves + alias Chess.MoveList def join("game:" <> game_id, _params, socket) do send(self(), {:after_join, game_id}) @@ -27,7 +28,7 @@ defmodule ChessWeb.GameChannel do board: Board.transform(game.board), turn: game.turn, state: game.state, - moves: Moves.transform(game.moves), + moves: MoveList.transform(game.moves), } socket @@ -103,7 +104,7 @@ defmodule ChessWeb.GameChannel do board: Board.transform(game.board), turn: game.turn, state: game.state, - moves: Moves.transform(game.moves), + moves: MoveList.transform(game.moves), } ChessWeb.Endpoint.broadcast("game:#{game.id}", "game:update", payload) end diff --git a/test/chess/move_list_test.exs b/test/chess/move_list_test.exs new file mode 100644 index 0000000..9f19584 --- /dev/null +++ b/test/chess/move_list_test.exs @@ -0,0 +1,57 @@ +defmodule Chess.MoveListTest do + @moduledoc false + + use Chess.DataCase + + describe "moves" do + alias Chess.Store.Move + alias Chess.MoveList + + test "tranforms a list of moves" do + moves = [ + %Move{ + piece: %{"type" => "pawn", "colour" => "white"}, + from: %{"file" => 4, "rank" => 1}, + to: %{"file" => 4, "rank" => 3}, + }, + %Move{ + piece: %{"type" => "pawn", "colour" => "black"}, + from: %{"file" => 4, "rank" => 6}, + to: %{"file" => 4, "rank" => 4}, + }, + %Move{ + piece: %{"type" => "knight", "colour" => "white"}, + from: %{"file" => 1, "rank" => 0}, + to: %{"file" => 2, "rank" => 2}, + }, + ] + + expected_result = [ + [ + %{ + id: nil, + piece: %{"type" => "pawn", "colour" => "white"}, + from: "e2", + to: "e4" + }, + %{ + id: nil, + piece: %{"type" => "pawn", "colour" => "black"}, + from: "e7", + to: "e5" + } + ], + [ + %{ + id: nil, + piece: %{"type" => "knight", "colour" => "white"}, + from: "b1", + to: "c3" + } + ], + ] + + assert MoveList.transform(moves) == expected_result + end + end +end diff --git a/test/chess/moves_test.exs b/test/chess/moves_test.exs deleted file mode 100644 index 57c5935..0000000 --- a/test/chess/moves_test.exs +++ /dev/null @@ -1,34 +0,0 @@ -defmodule Chess.MovesTest do - @moduledoc false - - use Chess.DataCase - - describe "moves" do - alias Chess.Store.Move - alias Chess.Moves - - test "tranforms a list of moves" do - moves = [ - %Move{ - from: %{"file" => 4, "rank" => 1}, - to: %{"file" => 4, "rank" => 3}, - }, - %Move{ - from: %{"file" => 4, "rank" => 6}, - to: %{"file" => 4, "rank" => 4}, - }, - %Move{ - from: %{"file" => 1, "rank" => 0}, - to: %{"file" => 2, "rank" => 2}, - }, - ] - - expected_result = [ - ["e2-e4", "e7-e5"], - ["b1-c3"], - ] - - assert Moves.transform(moves) == expected_result - end - end -end diff --git a/test/chess/store/move_test.exs b/test/chess/store/move_test.exs index 946db3f..c0aba46 100644 --- a/test/chess/store/move_test.exs +++ b/test/chess/store/move_test.exs @@ -81,11 +81,17 @@ defmodule Chess.Store.MoveTest do test "translates a move" do move = %Move{ + piece: %{"type" => "pawn", "colour" => "white"}, from: %{"file" => 4, "rank" => 1}, to: %{"file" => 4, "rank" => 3}, } - assert Move.translate(move) == "e2-e4" + assert Move.transform(move) == %{ + id: nil, + piece: %{"type" => "pawn", "colour" => "white"}, + from: "e2", + to: "e4" + } end end end