diff --git a/modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala b/modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala new file mode 100644 index 0000000..a23f4b1 --- /dev/null +++ b/modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala @@ -0,0 +1,43 @@ +package de.nowchess.chess.engine + +import scala.collection.mutable +import de.nowchess.api.board.{Board, Color} +import de.nowchess.api.game.GameContext +import de.nowchess.chess.observer.{Observer, GameEvent, PgnLoadedEvent} +import de.nowchess.io.pgn.PgnParser +import de.nowchess.io.fen.FenParser +import de.nowchess.io.pgn.PgnExporter +import de.nowchess.io.fen.FenExporter +import org.scalatest.funsuite.AnyFunSuite +import org.scalatest.matchers.should.Matchers + +class GameEngineLoadGameTest extends AnyFunSuite with Matchers: + + test("loadGame with PgnParser: loads valid PGN and enables undo/redo"): + val engine = new GameEngine() + val pgn = "[Event \"Test\"]\n\n1. e4 e5\n" + val result = engine.loadGame(PgnParser, pgn) + result shouldBe Right(()) + engine.context.moves.size shouldBe 2 + engine.canUndo shouldBe true + + test("loadGame with FenParser: loads position without replaying moves"): + val engine = new GameEngine() + val fen = "8/4P3/4k3/8/8/8/8/8 w - - 0 1" + val result = engine.loadGame(FenParser, fen) + result shouldBe Right(()) + engine.context.moves.isEmpty shouldBe true + engine.canUndo shouldBe false + + test("exportGame with PgnExporter: exports current game as PGN"): + val engine = new GameEngine() + engine.processUserInput("e2e4") + engine.processUserInput("e7e5") + val pgn = engine.exportGame(PgnExporter) + pgn.contains("e4") shouldBe true + pgn.contains("e5") shouldBe true + + private class MockObserver extends Observer: + val events = mutable.ListBuffer[GameEvent]() + override def onGameEvent(event: GameEvent): Unit = + events += event diff --git a/modules/io/src/main/scala/de/nowchess/io/pgn/PgnParser.scala b/modules/io/src/main/scala/de/nowchess/io/pgn/PgnParser.scala index 6314bba..1c36afa 100644 --- a/modules/io/src/main/scala/de/nowchess/io/pgn/PgnParser.scala +++ b/modules/io/src/main/scala/de/nowchess/io/pgn/PgnParser.scala @@ -3,6 +3,7 @@ package de.nowchess.io.pgn import de.nowchess.api.board.* import de.nowchess.api.move.{Move, MoveType, PromotionPiece} import de.nowchess.api.game.{GameContext, HistoryMove} +import de.nowchess.io.GameContextImport import de.nowchess.rules.sets.DefaultRules /** A parsed PGN game containing headers and the resolved move list. */ @@ -11,7 +12,7 @@ case class PgnGame( moves: List[HistoryMove] ) -object PgnParser: +object PgnParser extends GameContextImport: /** Strictly validate a PGN text. * Returns Right(PgnGame) if every move token is a legal move in the evolving position.