From 8fea58409c0d99f5145e64bc4605dfd4a7c47bee Mon Sep 17 00:00:00 2001 From: ccornu <ccornu@takima.fr> Date: Tue, 11 Feb 2025 10:05:41 +0100 Subject: [PATCH] feat: handle same points number edge case --- src/main/kotlin/player/services/PlayerServiceImpl.kt | 8 +++++++- src/test/kotlin/player/PlayerServiceTest.kt | 10 ++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/player/services/PlayerServiceImpl.kt b/src/main/kotlin/player/services/PlayerServiceImpl.kt index 22f92a7..57eb05a 100644 --- a/src/main/kotlin/player/services/PlayerServiceImpl.kt +++ b/src/main/kotlin/player/services/PlayerServiceImpl.kt @@ -37,11 +37,17 @@ class PlayerServiceImpl(private val playerRepository: PlayerRepository) : Player override suspend fun getPlayersRanked(): List<PlayerInfoDTO> { val allPlayers = playerRepository.findAll() + var currentRank = 1 + var previousPoints = 0 return allPlayers.sortedByDescending { it.pointsNumber }.mapIndexed { index, player -> + if (previousPoints != player.pointsNumber) { + currentRank = index + 1 + } + previousPoints = player.pointsNumber PlayerInfoDTO( pseudo = player.pseudo, pointsNumber = player.pointsNumber, - ranking = index + 1 + ranking = currentRank, ) } diff --git a/src/test/kotlin/player/PlayerServiceTest.kt b/src/test/kotlin/player/PlayerServiceTest.kt index e4aaa14..38de6eb 100644 --- a/src/test/kotlin/player/PlayerServiceTest.kt +++ b/src/test/kotlin/player/PlayerServiceTest.kt @@ -102,6 +102,16 @@ class PlayerServiceTest { assertThat(result.last().ranking).isEqualTo(2) } + @Test + fun `when getting all players with two players with the same points number, should return the same rank`() { + val player2WithSamePoints = player2.copy(pointsNumber = 30) + val player3WithSamePoints = Player(pseudo = "Charlie", pointsNumber = 30) + coEvery { playerRepository.findAll() } returns listOf(player1, player2WithSamePoints, player3WithSamePoints) + val result = runBlocking { playerService.getPlayersRanked() } + assertThat(result.first().ranking).isEqualTo(result[1].ranking) + assertThat(result.last().ranking).isNotEqualTo(2) + } + @Test fun `when deleting all players, should call the repository once`() { coEvery { playerRepository.deleteAllPlayers() } just runs -- GitLab