fix(rules): Code quality

linter corrections
This commit is contained in:
LQ63
2026-04-21 18:40:49 +02:00
committed by Janis
parent c131bdc139
commit 204b0f04f5
3 changed files with 59 additions and 46 deletions
@@ -29,7 +29,7 @@ object DtoMapper:
case "castleKingside" => Right(MoveType.CastleKingside) case "castleKingside" => Right(MoveType.CastleKingside)
case "castleQueenside" => Right(MoveType.CastleQueenside) case "castleQueenside" => Right(MoveType.CastleQueenside)
case "enPassant" => Right(MoveType.EnPassant) case "enPassant" => Right(MoveType.EnPassant)
case "promotion" => case "promotion" =>
dto.promotionPiece.toRight("Missing promotion piece").flatMap(toPromotionPiece).map(MoveType.Promotion(_)) dto.promotionPiece.toRight("Missing promotion piece").flatMap(toPromotionPiece).map(MoveType.Promotion(_))
case other => Left(s"Unknown move type: $other") case other => Left(s"Unknown move type: $other")
@@ -51,13 +51,13 @@ object DtoMapper:
moves <- sequenceList(dto.moves.map(toMove)) moves <- sequenceList(dto.moves.map(toMove))
initialBoard <- toBoard(dto.initialBoard) initialBoard <- toBoard(dto.initialBoard)
yield GameContext( yield GameContext(
board = board, board = board,
turn = turn, turn = turn,
castlingRights = toCastlingRights(dto.castlingRights), castlingRights = toCastlingRights(dto.castlingRights),
enPassantSquare = epSquare, enPassantSquare = epSquare,
halfMoveClock = dto.halfMoveClock, halfMoveClock = dto.halfMoveClock,
moves = moves, moves = moves,
initialBoard = initialBoard, initialBoard = initialBoard,
) )
def fromMove(move: Move): MoveDto = def fromMove(move: Move): MoveDto =
@@ -71,13 +71,13 @@ object DtoMapper:
def fromGameContext(ctx: GameContext): GameContextDto = def fromGameContext(ctx: GameContext): GameContextDto =
GameContextDto( GameContextDto(
board = fromBoard(ctx.board), board = fromBoard(ctx.board),
turn = ctx.turn.label, turn = ctx.turn.label,
castlingRights = fromCastlingRights(ctx.castlingRights), castlingRights = fromCastlingRights(ctx.castlingRights),
enPassantSquare = ctx.enPassantSquare.map(_.toString), enPassantSquare = ctx.enPassantSquare.map(_.toString),
halfMoveClock = ctx.halfMoveClock, halfMoveClock = ctx.halfMoveClock,
moves = ctx.moves.map(fromMove), moves = ctx.moves.map(fromMove),
initialBoard = fromBoard(ctx.initialBoard), initialBoard = fromBoard(ctx.initialBoard),
) )
private def toPromotionPiece(s: String): Either[String, PromotionPiece] = s match private def toPromotionPiece(s: String): Either[String, PromotionPiece] = s match
@@ -247,11 +247,13 @@ class RuleSetResourceTest:
// ── position builders ───────────────────────────────────────────── // ── position builders ─────────────────────────────────────────────
private def buildCheckContext(): GameContext = private def buildCheckContext(): GameContext =
val board = Board(Map( val board = Board(
Square(File.E, Rank.R1) -> Piece(Color.White, PieceType.King), Map(
Square(File.E, Rank.R8) -> Piece(Color.Black, PieceType.King), Square(File.E, Rank.R1) -> Piece(Color.White, PieceType.King),
Square(File.E, Rank.R3) -> Piece(Color.Black, PieceType.Rook), Square(File.E, Rank.R8) -> Piece(Color.Black, PieceType.King),
)) Square(File.E, Rank.R3) -> Piece(Color.Black, PieceType.Rook),
),
)
GameContext(board, Color.White, CastlingRights.None, None, 0, List.empty, initialBoard = board) GameContext(board, Color.White, CastlingRights.None, None, 0, List.empty, initialBoard = board)
private def buildFoolsMate(): GameContext = private def buildFoolsMate(): GameContext =
@@ -263,18 +265,22 @@ class RuleSetResourceTest:
} }
private def buildStalemateContext(): GameContext = private def buildStalemateContext(): GameContext =
val board = Board(Map( val board = Board(
Square(File.H, Rank.R8) -> Piece(Color.Black, PieceType.King), Map(
Square(File.F, Rank.R7) -> Piece(Color.White, PieceType.Queen), Square(File.H, Rank.R8) -> Piece(Color.Black, PieceType.King),
Square(File.G, Rank.R6) -> Piece(Color.White, PieceType.King), Square(File.F, Rank.R7) -> Piece(Color.White, PieceType.Queen),
)) Square(File.G, Rank.R6) -> Piece(Color.White, PieceType.King),
),
)
GameContext(board, Color.Black, CastlingRights.None, None, 0, List.empty, initialBoard = board) GameContext(board, Color.Black, CastlingRights.None, None, 0, List.empty, initialBoard = board)
private def buildKingsOnlyContext(): GameContext = private def buildKingsOnlyContext(): GameContext =
val board = Board(Map( val board = Board(
Square(File.E, Rank.R1) -> Piece(Color.White, PieceType.King), Map(
Square(File.E, Rank.R8) -> Piece(Color.Black, PieceType.King), Square(File.E, Rank.R1) -> Piece(Color.White, PieceType.King),
)) Square(File.E, Rank.R8) -> Piece(Color.Black, PieceType.King),
),
)
GameContext(board, Color.White, CastlingRights.None, None, 0, List.empty, initialBoard = board) GameContext(board, Color.White, CastlingRights.None, None, 0, List.empty, initialBoard = board)
private def buildThreefoldContext(): GameContext = private def buildThreefoldContext(): GameContext =
@@ -16,16 +16,18 @@ class RuleSetResourceUnitTest extends AnyFunSuite with Matchers:
private def ctx(g: GameContext) = ContextRequest(DtoMapper.fromGameContext(g)) private def ctx(g: GameContext) = ContextRequest(DtoMapper.fromGameContext(g))
private def ctxSq(g: GameContext, sq: String) = ContextSquareRequest(DtoMapper.fromGameContext(g), sq) private def ctxSq(g: GameContext, sq: String) = ContextSquareRequest(DtoMapper.fromGameContext(g), sq)
private def ctxMv(g: GameContext, m: Move) = ContextMoveRequest(DtoMapper.fromGameContext(g), DtoMapper.fromMove(m)) private def ctxMv(g: GameContext, m: Move) = ContextMoveRequest(DtoMapper.fromGameContext(g), DtoMapper.fromMove(m))
// ── position builders ───────────────────────────────────────────── // ── position builders ─────────────────────────────────────────────
private def checkContext(): GameContext = private def checkContext(): GameContext =
val board = Board(Map( val board = Board(
Square(File.E, Rank.R1) -> Piece(Color.White, PieceType.King), Map(
Square(File.E, Rank.R8) -> Piece(Color.Black, PieceType.King), Square(File.E, Rank.R1) -> Piece(Color.White, PieceType.King),
Square(File.E, Rank.R3) -> Piece(Color.Black, PieceType.Rook), Square(File.E, Rank.R8) -> Piece(Color.Black, PieceType.King),
)) Square(File.E, Rank.R3) -> Piece(Color.Black, PieceType.Rook),
),
)
GameContext(board, Color.White, CastlingRights.None, None, 0, List.empty, initialBoard = board) GameContext(board, Color.White, CastlingRights.None, None, 0, List.empty, initialBoard = board)
private def foolsMate(): GameContext = private def foolsMate(): GameContext =
@@ -37,18 +39,22 @@ class RuleSetResourceUnitTest extends AnyFunSuite with Matchers:
} }
private def stalemateContext(): GameContext = private def stalemateContext(): GameContext =
val board = Board(Map( val board = Board(
Square(File.H, Rank.R8) -> Piece(Color.Black, PieceType.King), Map(
Square(File.F, Rank.R7) -> Piece(Color.White, PieceType.Queen), Square(File.H, Rank.R8) -> Piece(Color.Black, PieceType.King),
Square(File.G, Rank.R6) -> Piece(Color.White, PieceType.King), Square(File.F, Rank.R7) -> Piece(Color.White, PieceType.Queen),
)) Square(File.G, Rank.R6) -> Piece(Color.White, PieceType.King),
),
)
GameContext(board, Color.Black, CastlingRights.None, None, 0, List.empty, initialBoard = board) GameContext(board, Color.Black, CastlingRights.None, None, 0, List.empty, initialBoard = board)
private def kingsOnlyContext(): GameContext = private def kingsOnlyContext(): GameContext =
val board = Board(Map( val board = Board(
Square(File.E, Rank.R1) -> Piece(Color.White, PieceType.King), Map(
Square(File.E, Rank.R8) -> Piece(Color.Black, PieceType.King), Square(File.E, Rank.R1) -> Piece(Color.White, PieceType.King),
)) Square(File.E, Rank.R8) -> Piece(Color.Black, PieceType.King),
),
)
GameContext(board, Color.White, CastlingRights.None, None, 0, List.empty, initialBoard = board) GameContext(board, Color.White, CastlingRights.None, None, 0, List.empty, initialBoard = board)
private def threefoldContext(): GameContext = private def threefoldContext(): GameContext =
@@ -100,9 +106,9 @@ class RuleSetResourceUnitTest extends AnyFunSuite with Matchers:
test("isCheck throws BadRequestException for invalid context"): test("isCheck throws BadRequestException for invalid context"):
an[BadRequestException] should be thrownBy an[BadRequestException] should be thrownBy
resource.isCheck(ctx(GameContext.initial).copy(context = resource.isCheck(
DtoMapper.fromGameContext(GameContext.initial).copy(turn = "Red"), ctx(GameContext.initial).copy(context = DtoMapper.fromGameContext(GameContext.initial).copy(turn = "Red")),
)) )
// ── isCheckmate ─────────────────────────────────────────────────── // ── isCheckmate ───────────────────────────────────────────────────
@@ -154,7 +160,8 @@ class RuleSetResourceUnitTest extends AnyFunSuite with Matchers:
resource.applyMove(ctxMv(GameContext.initial, move)).turn shouldBe "Black" resource.applyMove(ctxMv(GameContext.initial, move)).turn shouldBe "Black"
test("applyMove throws BadRequestException for invalid move"): test("applyMove throws BadRequestException for invalid move"):
val badMove = DtoMapper.fromMove(Move(Square(File.E, Rank.R2), Square(File.E, Rank.R4))) val badMove = DtoMapper
.fromMove(Move(Square(File.E, Rank.R2), Square(File.E, Rank.R4)))
.copy(moveType = "unknown") .copy(moveType = "unknown")
an[BadRequestException] should be thrownBy an[BadRequestException] should be thrownBy
resource.applyMove(ContextMoveRequest(DtoMapper.fromGameContext(GameContext.initial), badMove)) resource.applyMove(ContextMoveRequest(DtoMapper.fromGameContext(GameContext.initial), badMove))