package chess import ( "mchess_server/types" "testing" "github.com/stretchr/testify/assert" ) func Test_CheckMove_validPawnMove(t *testing.T) { var board = newBoard() board.position[types.Coordinate{Col: 1, Row: 2}] = Pawn{Color: types.White} board.position[types.Coordinate{Col: 2, Row: 4}] = Pawn{Color: types.Black} board.position[types.Coordinate{Col: 5, Row: 1}] = King{Color: types.White} board.position[types.Coordinate{Col: 5, Row: 8}] = King{Color: types.Black} move := types.Move{ StartSquare: types.Coordinate{Col: 1, Row: 2}, EndSquare: types.Coordinate{Col: 1, Row: 3}, } good, _ := board.CheckAndPlay(move) assert.True(t, good) //we take the pawn secondMove := types.Move{ StartSquare: types.Coordinate{Col: 2, Row: 4}, EndSquare: types.Coordinate{Col: 1, Row: 3}, } good, _ = board.CheckAndPlay(secondMove) assert.True(t, good) } func Test_CheckMove_enPassant(t *testing.T) { var board = newBoard() board.position[types.Coordinate{Col: 6, Row: 4}] = Pawn{Color: types.Black} board.position[types.Coordinate{Col: 5, Row: 2}] = Pawn{Color: types.White} board.position[types.Coordinate{Col: 5, Row: 1}] = King{Color: types.White} board.position[types.Coordinate{Col: 5, Row: 8}] = King{Color: types.Black} move := types.Move{ StartSquare: types.Coordinate{Col: 5, Row: 2}, EndSquare: types.Coordinate{Col: 5, Row: 4}, } good, reason := board.CheckAndPlay(move) assert.True(t, good) assert.Empty(t, reason) assert.Equal(t, Pawn{Color: types.White}, board.position[types.Coordinate{Col: 5, Row: 4}]) newMove := types.Move{ StartSquare: types.Coordinate{Col: 6, Row: 4}, EndSquare: types.Coordinate{Col: 5, Row: 3}, } good, reason = board.CheckAndPlay(newMove) assert.True(t, good) assert.Empty(t, reason) // the black pawn is on its correct square assert.Equal(t, Pawn{Color: types.Black}, board.position[types.Coordinate{Col: 5, Row: 3}]) //the white pawn is gone assert.Nil(t, board.position[types.Coordinate{Col: 5, Row: 4}]) } func Test_CheckMove_invalidPawnMoves(t *testing.T) { t.Run("pawn is blocked", func(t *testing.T) { var board = newBoard() board.position[types.Coordinate{Col: 2, Row: 5}] = Pawn{Color: types.White} board.position[types.Coordinate{Col: 1, Row: 5}] = King{Color: types.White} board.position[types.Coordinate{Col: 7, Row: 5}] = Queen{Color: types.Black} board.position[types.Coordinate{Col: 8, Row: 5}] = King{Color: types.Black} board.position[types.Coordinate{Col: 2, Row: 6}] = Pawn{Color: types.Black} move := types.Move{ StartSquare: types.Coordinate{Col: 2, Row: 5}, EndSquare: types.Coordinate{Col: 2, Row: 6}, } legalMove, _ := board.CheckAndPlay(move) assert.False(t, legalMove) }) t.Run("pawn moves to the side", func(t *testing.T) { var board = newBoard() boardBeforeMove := board board.position[types.Coordinate{Col: 1, Row: 5}] = King{Color: types.White} board.position[types.Coordinate{Col: 8, Row: 5}] = King{Color: types.Black} board.position[types.Coordinate{Col: 2, Row: 5}] = Pawn{Color: types.White} move := types.Move{ StartSquare: types.Coordinate{Col: 2, Row: 5}, EndSquare: types.Coordinate{Col: 3, Row: 5}, } legal, _ := board.CheckAndPlay(move) assert.False(t, legal) assert.Equal(t, boardBeforeMove, board) move = types.Move{ StartSquare: types.Coordinate{Col: 2, Row: 5}, EndSquare: types.Coordinate{Col: 1, Row: 5}, } legal, _ = board.CheckAndPlay(move) assert.False(t, legal) assert.Equal(t, boardBeforeMove, board) move = types.Move{ StartSquare: types.Coordinate{Col: 2, Row: 5}, EndSquare: types.Coordinate{Col: 6, Row: 5}, } legal, _ = board.CheckAndPlay(move) assert.False(t, legal) assert.Equal(t, boardBeforeMove, board) }) // t.Run("king of moving color is in check after move", func(t *testing.T) { // good, _ := board.CheckMove(move) // assert.False(t, good) // }) } func Test_CheckMove_validPromotion(t *testing.T) { var board Board = newBoard() board.position[types.Coordinate{Col: 1, Row: 7}] = Pawn{Color: types.White} board.position[types.Coordinate{Col: 1, Row: 1}] = King{Color: types.White} board.position[types.Coordinate{Col: 8, Row: 7}] = King{Color: types.Black} shortName := types.QueenShortName move := types.Move{ StartSquare: types.Coordinate{Col: 1, Row: 7}, EndSquare: types.Coordinate{Col: 1, Row: 8}, PromotionToPiece: &shortName, } good, reason := board.CheckAndPlay(move) assert.Empty(t, reason) assert.True(t, good) assert.Equal(t, Queen{Color: types.White}, board.getPieceAt(types.Coordinate{Row: 8, Col: 1})) } func Test_CheckMove_HistoryWorks(t *testing.T) { var board = newBoard() board.position[types.Coordinate{Col: 3, Row: 7}] = Pawn{Color: types.Black} board.position[types.Coordinate{Col: 1, Row: 2}] = Pawn{Color: types.White} board.position[types.Coordinate{Col: 1, Row: 5}] = King{Color: types.White} board.position[types.Coordinate{Col: 8, Row: 5}] = King{Color: types.Black} firstMove := types.Move{ StartSquare: types.Coordinate{Col: 1, Row: 2}, EndSquare: types.Coordinate{Col: 1, Row: 3}, } secondMove := types.Move{ StartSquare: types.Coordinate{Col: 3, Row: 7}, EndSquare: types.Coordinate{Col: 3, Row: 5}, } thirdMove := types.Move{ StartSquare: types.Coordinate{Col: 1, Row: 3}, EndSquare: types.Coordinate{Col: 1, Row: 4}, } good, _ := board.CheckAndPlay(firstMove) assert.True(t, good) good, _ = board.CheckAndPlay(secondMove) assert.True(t, good) good, _ = board.CheckAndPlay(thirdMove) assert.True(t, good) expectedHistory := []types.Move{ { StartSquare: types.Coordinate{Col: 1, Row: 2}, EndSquare: types.Coordinate{Col: 1, Row: 3}, PieceMoved: 'p', ColorMoved: "white", }, { StartSquare: types.Coordinate{Col: 3, Row: 7}, EndSquare: types.Coordinate{Col: 3, Row: 5}, PieceMoved: 'p', ColorMoved: "black", }, { StartSquare: types.Coordinate{Col: 1, Row: 3}, EndSquare: types.Coordinate{Col: 1, Row: 4}, PieceMoved: 'p', ColorMoved: "white", }, } assert.Equal(t, expectedHistory, board.history) }