From 77475cf4586c488ce4c538853a65d3511ac29d9f Mon Sep 17 00:00:00 2001 From: Dan Barber Date: Wed, 18 Jan 2017 18:20:10 +0000 Subject: [PATCH] Add moves model and tests for pawns --- test/models/moves_test.exs | 39 ++++++++++++++++++++++++++++++++++++++ web/models/moves.ex | 21 ++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 test/models/moves_test.exs create mode 100644 web/models/moves.ex diff --git a/test/models/moves_test.exs b/test/models/moves_test.exs new file mode 100644 index 0000000..33457dc --- /dev/null +++ b/test/models/moves_test.exs @@ -0,0 +1,39 @@ +defmodule Chess.MovesTest do + use Chess.ModelCase + + alias Chess.Moves + + test "white pawn can move forward one or two spaces" do + moves = Moves.available(board(), {4, 1}) + + expected_moves = [{4, 2}, {4, 3}] + assert moves == expected_moves + end + + test "black pawn can move forward one or two spaces" do + moves = Moves.available(board(), {4, 6}) + + expected_moves = [{4, 5}, {4, 4}] + assert moves == expected_moves + end + + test "white pawn not on starting square can move forward one space" do + board = %{ "4,2" => %{type: :pawn, colour: :white} } + moves = Moves.available(board, {4, 2}) + + expected_moves = [{4, 3}] + assert moves == expected_moves + end + + test "black pawn not on starting square can move forward one space" do + board = %{ "4,5" => %{type: :pawn, colour: :black} } + moves = Moves.available(board, {4, 5}) + + expected_moves = [{4, 4}] + assert moves == expected_moves + end + + def board do + Chess.Board.default + end +end diff --git a/web/models/moves.ex b/web/models/moves.ex new file mode 100644 index 0000000..c66fc3f --- /dev/null +++ b/web/models/moves.ex @@ -0,0 +1,21 @@ +defmodule Chess.Moves do + def available(board, square) do + {file, rank} = square + piece = board["#{file},#{rank}"] + + case piece do + %{type: :pawn, colour: :white} -> + case rank do + 1 -> [{file, rank + 1}, {file, rank + 2}] + _ -> [{file, rank + 1}] + end + %{type: :pawn, colour: :black} -> + case rank do + 6 -> [{file, rank - 1}, {file, rank - 2}] + _ -> [{file, rank - 1}] + end + %{type: :rook} -> + [] + end + end +end