From 48ac4156bdb9b72583d4ae50e810781d89c4a337 Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Mon, 17 Mar 2025 18:23:29 +0100 Subject: [PATCH] change cardOnCurrentStack on lastCardPlayer --- .../interfaceLayer/ReadTheGameState.kt | 1 - .../business/event/projection/GameState.kt | 19 +++++++------------ .../event/projection/GameStateBuilder.kt | 4 ++-- .../event/projection/GameStateBuilderTest.kt | 4 ++-- ...GameStateTest.kt => GameSimulationTest.kt} | 5 +++-- 5 files changed, 14 insertions(+), 19 deletions(-) rename src/test/kotlin/eventDemo/app/query/{GameStateTest.kt => GameSimulationTest.kt} (98%) diff --git a/src/main/kotlin/eventDemo/adapter/interfaceLayer/ReadTheGameState.kt b/src/main/kotlin/eventDemo/adapter/interfaceLayer/ReadTheGameState.kt index 4868456..9110272 100644 --- a/src/main/kotlin/eventDemo/adapter/interfaceLayer/ReadTheGameState.kt +++ b/src/main/kotlin/eventDemo/adapter/interfaceLayer/ReadTheGameState.kt @@ -41,7 +41,6 @@ fun Route.readTheGameState(gameStateRepository: GameStateRepository) { gameStateRepository .getLast(body.game.id) .cardOnCurrentStack - ?.card ?.let { call.respond(it) } ?: call.response.status(HttpStatusCode.BadRequest) } diff --git a/src/main/kotlin/eventDemo/business/event/projection/GameState.kt b/src/main/kotlin/eventDemo/business/event/projection/GameState.kt index 840343a..650f9ca 100644 --- a/src/main/kotlin/eventDemo/business/event/projection/GameState.kt +++ b/src/main/kotlin/eventDemo/business/event/projection/GameState.kt @@ -12,7 +12,7 @@ data class GameState( override val lastEventVersion: Int = 0, val players: Set = emptySet(), val currentPlayerTurn: Player? = null, - val cardOnCurrentStack: LastCard? = null, + val lastCardPlayer: Player? = null, val colorOnCurrentStack: Card.Color? = null, val direction: Direction = Direction.CLOCKWISE, val readyPlayers: Set = emptySet(), @@ -20,12 +20,6 @@ data class GameState( val isStarted: Boolean = false, val playerWins: Set = emptySet(), ) : Projection { - @Serializable - data class LastCard( - val card: Card, - val player: Player, - ) - enum class Direction { CLOCKWISE, COUNTER_CLOCKWISE, @@ -39,6 +33,8 @@ data class GameState( } } + val cardOnCurrentStack: Card? = deck.discard.lastOrNull() + val isReady: Boolean get() { return players.size == readyPlayers.size && players.all { readyPlayers.contains(it) } } @@ -98,8 +94,8 @@ data class GameState( }.let { it % players.size } val Player.cardOnBoardIsForYou: Boolean get() { - if (cardOnCurrentStack == null) error("No card") - return this.playerDiffIndex(cardOnCurrentStack.player) == 1 + if (lastCardPlayer == null) error("No card") + return this.playerDiffIndex(lastCardPlayer) == 1 } fun playableCards(player: Player): List = @@ -118,7 +114,7 @@ data class GameState( player: Player, card: Card, ): Boolean { - val cardOnBoard = cardOnCurrentStack?.card ?: return false + val cardOnBoard = cardOnCurrentStack ?: return false return when (cardOnBoard) { is Card.NumericCard -> { when (card) { @@ -159,9 +155,8 @@ data class GameState( true } else { when (card) { - is Card.AllColorCard -> true is Card.Plus2Card -> true - is Card.ColorCard -> card.color == cardOnBoard.color + else -> false } } } diff --git a/src/main/kotlin/eventDemo/business/event/projection/GameStateBuilder.kt b/src/main/kotlin/eventDemo/business/event/projection/GameStateBuilder.kt index 1ffa802..fc1a9ca 100644 --- a/src/main/kotlin/eventDemo/business/event/projection/GameStateBuilder.kt +++ b/src/main/kotlin/eventDemo/business/event/projection/GameStateBuilder.kt @@ -53,7 +53,7 @@ fun GameState.apply(event: GameEvent): GameState = currentPlayerTurn = currentPlayerAfterThePlay, direction = nextDirectionAfterPlay, colorOnCurrentStack = color, - cardOnCurrentStack = GameState.LastCard(event.card, event.player), + lastCardPlayer = event.player, deck = state.deck.putOneCardFromHand(event.player, event.card), ) } @@ -97,7 +97,7 @@ fun GameState.apply(event: GameEvent): GameState = is GameStartedEvent -> { state.copy( colorOnCurrentStack = (event.deck.discard.first() as? Card.ColorCard)?.color ?: state.colorOnCurrentStack, - cardOnCurrentStack = GameState.LastCard(event.deck.discard.first(), event.firstPlayer), + lastCardPlayer = null, currentPlayerTurn = event.firstPlayer, deck = event.deck, isStarted = true, diff --git a/src/test/kotlin/eventDemo/app/event/projection/GameStateBuilderTest.kt b/src/test/kotlin/eventDemo/app/event/projection/GameStateBuilderTest.kt index aac62d3..40b217c 100644 --- a/src/test/kotlin/eventDemo/app/event/projection/GameStateBuilderTest.kt +++ b/src/test/kotlin/eventDemo/app/event/projection/GameStateBuilderTest.kt @@ -100,7 +100,7 @@ class GameStateBuilderTest : ) apply(event).also { state -> state.aggregateId shouldBeEqual gameId - assertNotNull(state.cardOnCurrentStack).card shouldBeEqual playedCard + assertNotNull(state.cardOnCurrentStack) shouldBeEqual playedCard assertIs(playedCard).let { it.number shouldBeEqual 0 it.color shouldBeEqual Card.Color.Red @@ -117,7 +117,7 @@ class GameStateBuilderTest : ) apply(event).also { state -> state.aggregateId shouldBeEqual gameId - assertNotNull(state.cardOnCurrentStack).card shouldBeEqual playedCard + assertNotNull(state.cardOnCurrentStack) shouldBeEqual playedCard assertIs(playedCard).let { it.number shouldBeEqual 7 it.color shouldBeEqual Card.Color.Red diff --git a/src/test/kotlin/eventDemo/app/query/GameStateTest.kt b/src/test/kotlin/eventDemo/app/query/GameSimulationTest.kt similarity index 98% rename from src/test/kotlin/eventDemo/app/query/GameStateTest.kt rename to src/test/kotlin/eventDemo/app/query/GameSimulationTest.kt index e10de81..bc749ca 100644 --- a/src/test/kotlin/eventDemo/app/query/GameStateTest.kt +++ b/src/test/kotlin/eventDemo/app/query/GameSimulationTest.kt @@ -43,7 +43,7 @@ import kotlin.test.assertTrue import kotlin.time.Duration.Companion.seconds @DelicateCoroutinesApi -class GameStateTest : +class GameSimulationTest : FunSpec({ test("Simulation of a game") { withTimeout(2.seconds) { @@ -199,7 +199,8 @@ class GameStateTest : state.players shouldBeEqual setOf(player1, player2) state.readyPlayers shouldBeEqual setOf(player1, player2) state.direction shouldBeEqual GameState.Direction.CLOCKWISE - assertNotNull(state.cardOnCurrentStack) shouldBeEqual GameState.LastCard(assertNotNull(playedCard2), player2) + assertNotNull(state.lastCardPlayer) shouldBeEqual player2 + assertNotNull(state.cardOnCurrentStack) shouldBeEqual assertNotNull(playedCard2) } } }