'makeMove' advances the game by one turn, switches the current player and updates the game result.
85 lines
2.2 KiB
Nim
85 lines
2.2 KiB
Nim
import unittest, options
|
|
|
|
import libmttt
|
|
|
|
suite "Test the move procedures":
|
|
setup:
|
|
var
|
|
player1 = Player(name: "Adam")
|
|
player2 = Player(name: "Eve")
|
|
game: GameState = newGame(player1, player2)
|
|
|
|
test "Inital state":
|
|
check game.currentPlayer == player1
|
|
check game.players == [player1, player2]
|
|
check game.turn == 0
|
|
check game.currentBoard.isNone
|
|
check game.result == mFree
|
|
|
|
test "First move":
|
|
game = game.makeMove((1, 1), (1, 1))
|
|
check game.currentPlayer == player2
|
|
check game.turn == 1
|
|
check game.currentBoard == (1, 1).some()
|
|
check game.result == mFree
|
|
|
|
test "Second move":
|
|
game = game.makeMove((1, 1), (1, 1))
|
|
game = game.makeMove((0, 0))
|
|
check game.currentPlayer == player1
|
|
check game.turn == 2
|
|
check game.currentBoard == (0, 0).some()
|
|
check game.result == mFree
|
|
|
|
test "Move on wrong board":
|
|
game = game.makeMove((1, 1), (1, 1))
|
|
expect(IllegalMoveError):
|
|
game = game.makeMove((0, 0), (2, 2))
|
|
|
|
test "Move on a taken cell":
|
|
game = game.makeMove((1, 1), (1, 1))
|
|
expect(IllegalMoveError):
|
|
game = game.makeMove((1, 1))
|
|
|
|
test "Move out of bounds":
|
|
expect(IndexError):
|
|
game = game.makeMove((3, 0), (0, 0))
|
|
|
|
test "Player 1 wins the game":
|
|
let winner = [
|
|
[mPlayer1, mFree, mFree],
|
|
[mPlayer1, mFree, mFree],
|
|
[mPlayer1, mFree, mFree]
|
|
]
|
|
game.board[0][0] = winner
|
|
game.board[1][1] = winner
|
|
|
|
game.board[2][2] = [
|
|
[mPlayer1, mFree, mFree],
|
|
[mFree, mFree, mFree],
|
|
[mPlayer1, mFree, mFree]
|
|
]
|
|
check checkBoard(game.board) == mFree
|
|
game = game.makeMove((1, 0), (2, 2))
|
|
check game.result == mPlayer1
|
|
check game.currentPlayer == player1
|
|
|
|
test "The game ends in a draw":
|
|
let drawn = [
|
|
[mPlayer2, mPlayer2, mPlayer1],
|
|
[mPlayer1, mPlayer1, mPlayer2],
|
|
[mPlayer2, mPlayer1, mPlayer2]
|
|
]
|
|
for x in 0 .. 2:
|
|
for y in 0 .. 2:
|
|
game.board[x][y] = drawn
|
|
|
|
game.board[2][2] = [
|
|
[mPlayer2, mPlayer2, mPlayer1],
|
|
[mPlayer1, mPlayer1, mPlayer2],
|
|
[mPlayer2, mFree, mPlayer2]
|
|
]
|
|
check checkBoard(game.board) == mFree
|
|
game = game.makeMove((2, 1), (2, 2))
|
|
check game.result == mDraw
|
|
check game.currentPlayer == player1 |