From 32143865560373c3f9c46ca121abbf6fbd7afb5e Mon Sep 17 00:00:00 2001 From: Janis Date: Sun, 5 Apr 2026 13:10:24 +0200 Subject: [PATCH] fix(io): update FEN tests to use Either API after parseFen signature change FenParser.parseFen now returns Either[String, GameContext] instead of Option. Updated all tests to use Either combinators (isRight, isLeft, fold) instead of Option methods (isDefined, get). Both FenParserTest and FenExporterTest now properly handle the Either-based return type. Co-Authored-By: Claude Sonnet 4.6 --- .../de/nowchess/io/fen/FenExporterTest.scala | 4 +- .../de/nowchess/io/fen/FenParserTest.scala | 42 +++++++++++-------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/modules/io/src/test/scala/de/nowchess/io/fen/FenExporterTest.scala b/modules/io/src/test/scala/de/nowchess/io/fen/FenExporterTest.scala index 4ce01eb..a1fcbc0 100644 --- a/modules/io/src/test/scala/de/nowchess/io/fen/FenExporterTest.scala +++ b/modules/io/src/test/scala/de/nowchess/io/fen/FenExporterTest.scala @@ -97,6 +97,6 @@ class FenExporterTest extends AnyFunSuite with Matchers: ) val fen = FenExporter.gameContextToFen(gameContext) FenParser.parseFen(fen) match - case Some(ctx) => ctx.halfMoveClock shouldBe 42 - case None => fail("FEN parsing failed") + case Right(ctx) => ctx.halfMoveClock shouldBe 42 + case Left(err) => fail(s"FEN parsing failed: $err") diff --git a/modules/io/src/test/scala/de/nowchess/io/fen/FenParserTest.scala b/modules/io/src/test/scala/de/nowchess/io/fen/FenParserTest.scala index efbcbd6..f192cb1 100644 --- a/modules/io/src/test/scala/de/nowchess/io/fen/FenParserTest.scala +++ b/modules/io/src/test/scala/de/nowchess/io/fen/FenParserTest.scala @@ -66,49 +66,55 @@ class FenParserTest extends AnyFunSuite with Matchers: val fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1" val context = FenParser.parseFen(fen) - context.isDefined shouldBe true - context.get.turn shouldBe Color.White - context.get.castlingRights.whiteKingSide shouldBe true - context.get.castlingRights.whiteQueenSide shouldBe true - context.get.castlingRights.blackKingSide shouldBe true - context.get.castlingRights.blackQueenSide shouldBe true - context.get.enPassantSquare shouldBe None - context.get.halfMoveClock shouldBe 0 + context.isRight shouldBe true + context.fold(_ => fail(), ctx => + ctx.turn shouldBe Color.White + ctx.castlingRights.whiteKingSide shouldBe true + ctx.castlingRights.whiteQueenSide shouldBe true + ctx.castlingRights.blackKingSide shouldBe true + ctx.castlingRights.blackQueenSide shouldBe true + ctx.enPassantSquare shouldBe None + ctx.halfMoveClock shouldBe 0 + ) test("parse full FEN - after e4"): val fen = "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1" val context = FenParser.parseFen(fen) - context.get.turn shouldBe Color.Black - context.get.enPassantSquare shouldBe Some(Square(File.E, Rank.R3)) + context.fold(_ => fail(), ctx => + ctx.turn shouldBe Color.Black + ctx.enPassantSquare shouldBe Some(Square(File.E, Rank.R3)) + ) test("parse full FEN - invalid parts count"): val fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq" val context = FenParser.parseFen(fen) - context.isDefined shouldBe false + context.isLeft shouldBe true test("parse full FEN - invalid color"): val fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR x KQkq - 0 1" val context = FenParser.parseFen(fen) - context.isDefined shouldBe false + context.isLeft shouldBe true test("parse full FEN - invalid castling"): val fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w XYZ - 0 1" val context = FenParser.parseFen(fen) - context.isDefined shouldBe false + context.isLeft shouldBe true test("parseFen: castling '-' produces no castling rights"): val fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w - - 0 1" val context = FenParser.parseFen(fen) - context.isDefined shouldBe true - context.get.castlingRights.whiteKingSide shouldBe false - context.get.castlingRights.whiteQueenSide shouldBe false - context.get.castlingRights.blackKingSide shouldBe false - context.get.castlingRights.blackQueenSide shouldBe false + context.isRight shouldBe true + context.fold(_ => fail(), ctx => + ctx.castlingRights.whiteKingSide shouldBe false + ctx.castlingRights.whiteQueenSide shouldBe false + ctx.castlingRights.blackKingSide shouldBe false + ctx.castlingRights.blackQueenSide shouldBe false + ) test("parseBoard: returns None when a rank has too many files (overflow beyond 8)"): // "9" alone would advance fileIdx to 9, exceeding 8 → None