router.post('/move', (request, response) => {
const game = request.game;
const move = request.body.move;
+ const player = game.players[request.session.id];
- const result = game.add_move(move);
+ /* Reject move if there is no player for this session. */
+ if (! player) {
+ response.json({legal: false, message: "No valid player from session"});
+ return;
+ }
+
+ const result = game.add_move(player, move);
/* Feed move response back to the client. */
response.json(result);
tictactoe_move()
{
- curl_post $tictactoe_game_path/move "{ \"move\": $1 }"
+ curl_post $tictactoe_game_path/move "{ \"move\": $1 }" "-b .test-cookie"
}
lmno_profile()
TEST_SUBSECTION "Tic Tac Toe /move"
-TEST "Move to the center square"
+TEST "Illegal to move when not on a team"
+result=$(tictactoe_move 4)
+test "$result" = '{"legal":false,"message":"You must be on a team to take a turn"}'
+TEST_END
+
+TEST "Illegal to move when it's not your turn"
+tictactoe_player_team O
+result=$(tictactoe_move 4)
+test "$result" = '{"legal":false,"message":"It'"'"'s not your turn to move"}'
+TEST_END
+
+TEST "Legal move to center square"
+tictactoe_player_team X
result=$(tictactoe_move 4)
test "$result" = '{"legal":true}'
TEST_END
TEST "Move to center square again is now illegal"
+tictactoe_player_team O
result=$(tictactoe_move 4)
test "$result" = '{"legal":false,"message":"Square is already occupied"}'
TEST_END
}
/* Returns true if move was legal and added, false otherwise. */
- add_move(square) {
+ add_move(player, square) {
+
+ /* Cannot move if you are not on a team. */
+ if (player.team === "")
+ {
+ return { legal: false,
+ message: "You must be on a team to take a turn" };
+ }
+
+ /* Cannot move if it's not this player's team's turn. */
+ if (player.team !== this.state.next_player)
+ {
+ return { legal: false,
+ message: "It's not your turn to move" };
+ }
+
/* Cannot move to an occupied square. */
if (this.state.board[square])
- return { legal: false, message: "Square is already occupied" };
+ {
+ return { legal: false,
+ message: "Square is already occupied" };
+ }
this.state.board[square] = this.state.next_player;
this.state.moves.push(square);