Files
Chess/board/fen_test.go
Isaac 6726754cfe Feat/static check (#5)
* ci: Add and update CI workflows; refine build and test steps

- Add new "Static" GitHub Actions workflow for running `staticcheck`
- Rename `go.yml` to `buildtest.yml` and update workflows
  - Add build and test jobs with caching, coverage, and result publishing
- Update `.gitignore` to exclude `.vscode` files

[.github/workflows/static.yml]
- Added a new GitHub Actions workflow named "Static".
- Configured the workflow to trigger on push and pull request events.
- Defined a CI job running on `ubuntu-latest`.
- Included steps for checking out the repository and running the `staticcheck` tool using a specific version (`2022.1.1`).
[.github/workflows/go.yml]
- Renamed the GitHub Actions workflow file from `go.yml` to `buildtest.yml`.
- Updated the file paths in the `push` trigger to reflect the new filename.
- Renamed the `unit_tests` job to `build` and added a "Build" step to run `go build -v ./...`.
- Introduced a cache setup step in the `build` job for Golang caches, improving build performance.
- Added a new `test` job that runs after the `build` job (with `needs: build` dependency).
   - `test` job includes permissions configuration for checks and pull requests.
   - Installs dependencies, runs tests with coverage, generates JUnit reports, and publishes test results.
- Removed unused permissions settings in the `build` job.
[.gitignore]
- Added `.vscode` to the ignored files in the `.gitignore` file.

* ci: Update checkout action to version 4 in workflow

* ci: Update staticcheck action to version 1.3.1

* ci: Update staticcheck action to use the latest version

* Fix/static errors (#4)

* refactor: Refactor piece enums to prioritize color over type

- Update piece composition order to prioritize color before piece type across relevant files (`Color | Piece` instead of `Piece | Color`)
- Remove `filterEnemies` method from `board/move.go`
- Update test cases and helper functions in `board/fen_test.go` to reflect the new composition order
- Adjust piece constant definitions in `board/pieces_test.go` for consistency with new composition order

[board/pieces_test.go]
- Updated the order of composition for piece constants to prioritize color before piece type (e.g., White | King instead of King | White).
[board/move.go]
- Removed the `filterEnemies` method, which filtered moves based on whether the captured piece was an enemy.
- No other changes to the file.
[board/fen_test.go]
- Reordered enum composition for clarity and consistency, changing the order from `Piece | Color` to `Color | Piece`.
- Updated test cases in `TestGenerateRow` to reflect the new order of enum composition.
  - Modified piece definitions in scenarios including "All Pawns", "Rooks Only", "Alternating Pawns", "Many Kings".
- Adjusted the helper function `getTestBoard` to match the new enum composition order in all board row definitions.

* ci: Refactor workflows by merging test into build job

- Update `.github/workflows/buildtest.yml` to merge "Test" job into "Build" job
- Add explicit permissions for checks and pull-requests in the "Build" job
- Integrate testing, coverage reporting, JUnit report generation, and result publishing into the "Build" job

[.github/workflows/buildtest.yml]
- Added explicit permissions for checks and pull-requests in the "Build" job.
- Removed the "Test" job and merged its steps into the "Build" job.
- Integrated testing, coverage reporting, JUnit report generation, and result publishing directly into the "Build" job.

* ci: Specify read permissions in CI job configuration
2025-03-24 19:51:38 +00:00

167 lines
3.6 KiB
Go

package board
import "testing"
func TestGenerateBoard(t *testing.T) {
tests := map[string]struct {
input string
result [8][8]Piece
}{
"Starting": {
input: "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR",
result: *getStartBoard(),
},
"Empty Board": {
input: "8/8/8/8/8/8/8/8",
result: [8][8]Piece{},
},
"Test Board": {
input: getTestPieceString(),
result: *getTestBoard(),
},
}
for name, test := range tests {
t.Run(name, func(t *testing.T) {
t.Parallel()
result, err := GenerateBoard(test.input)
if err != nil {
t.Errorf("unexpected error: %v", err)
}
if *result != test.result {
t.Errorf("boards are not equal, expected %v, got %v",
test.result, *result)
}
})
}
}
func TestGenerateRow(t *testing.T) {
tests := map[string]struct {
input string
result [8]Piece
}{
"Empty Row": {
input: "8",
result: [8]Piece{},
},
"All Pawns": {
input: "pppppppp",
result: [8]Piece{Black | Pawn, Black | Pawn, Black | Pawn, Black | Pawn, Black | Pawn, Black | Pawn, Black | Pawn, Black | Pawn},
},
"Starting Row": {
input: "RNBQKBNR",
result: getStartRow(),
},
"Rooks Only": {
input: "r6R",
result: [8]Piece{Rook | Black, 0, 0, 0, 0, 0, 0, White | Rook},
},
"Alternating Pawns": {
input: "pP1Pp2P",
result: [8]Piece{Pawn | Black, White | Pawn, 0, White | Pawn, Pawn | Black, 0, 0, White | Pawn},
},
"Many Kings": {
input: "KKKKkkkk",
result: [8]Piece{White | King, White | King, White | King, White | King, Black | King, Black | King, King | Black, King | Black},
},
}
for name, test := range tests {
t.Run(name, func(t *testing.T) {
t.Parallel()
result, err := generateBoardRow(test.input)
if err != nil {
t.Errorf("unexpected error: %v", err)
}
if *result != test.result {
t.Errorf("rows do not match, expected %v, got %v",
test.result, *result)
}
})
}
}
func getStartRow() [8]Piece {
return [8]Piece{Rook, Knight, Bishop, Queen, King, Bishop, Knight, Rook}
}
func getStartBoard() *[8][8]Piece {
pawnRow := [8]Piece{Pawn, Pawn, Pawn, Pawn, Pawn, Pawn, Pawn, Pawn}
board := [8][8]Piece{
getStartRow(), // White starting row
pawnRow, // White pawn row
{},
{},
{},
{},
pawnRow, // Black pawn row
getStartRow(), // Black starting row
}
markRowColor(&board[0], White)
markRowColor(&board[1], White)
markRowColor(&board[6], Black)
markRowColor(&board[7], Black)
return &board
}
func getTestBoard() *[8][8]Piece {
board := [8][8]Piece{
{0, 0, White | Pawn, 0, 0, 0, White | Knight},
{0, Pawn | Black, 0, 0, 0, Bishop | Black},
{White | Bishop, 0, 0, 0, Black | Rook},
{0, 0, 0, White | Queen, 0, 0, 0, Black | Queen},
{Pawn | Black, Pawn | Black, Pawn | Black},
{Pawn | Black, Pawn | Black},
{Pawn | Black},
{0, 0, 0, 0, 0, 0, 0, King | Black},
}
return &board
}
func getTestPieceString() string {
return "7k/p7/pp6/ppp5/3Q3q/B3r3/1p3b2/2P3N1"
}
func TestGeneratePieceString(t *testing.T) {
tests := map[string]struct {
input [8][8]Piece
expected string
}{
"Starting": {
input: *getStartBoard(),
expected: "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR",
},
"Empty Board": {
input: [8][8]Piece{},
expected: "8/8/8/8/8/8/8/8",
},
"Test Board": {
input: *getTestBoard(),
expected: getTestPieceString(),
},
}
for name, test := range tests {
t.Run(name, func(t *testing.T) {
t.Parallel()
result := GeneratePieceString(test.input)
if test.expected != result {
t.Errorf("got invalid board, expected %s, got %s",
test.expected, result)
}
})
}
}