diff --git a/backend/src/test/java/de/szut/casino/dice/DiceServiceTest.java b/backend/src/test/java/de/szut/casino/dice/DiceServiceTest.java index 21ca6cf..ec5f979 100644 --- a/backend/src/test/java/de/szut/casino/dice/DiceServiceTest.java +++ b/backend/src/test/java/de/szut/casino/dice/DiceServiceTest.java @@ -10,6 +10,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.Random; import static org.junit.jupiter.api.Assertions.*; @@ -101,78 +102,112 @@ class DiceServiceTest { } @Test - void play_rollOver_targetValueOne_lose() { + void play_rollOver_targetValueOne_rolledOne_lose() { diceDto.setRollOver(true); diceDto.setTargetValue(BigDecimal.valueOf(1)); - when(random.nextInt(anyInt())).thenReturn(0); + when(random.nextInt(anyInt())).thenReturn(0); // rolledValue = 1 DiceResult result = diceService.play(user, diceDto); assertFalse(result.isWin()); assertEquals(BigDecimal.valueOf(1), result.getRolledValue()); assertEquals(BigDecimal.ZERO, result.getPayout()); + verify(balanceService, times(1)).subtractFunds(user, diceDto.getBetAmount()); + verify(balanceService, never()).addFunds(eq(user), any(BigDecimal.class)); } @Test - void play_rollUnder_targetValueOne_win() { + void play_rollOver_targetValueOne_rolledTwo_win() { + diceDto.setRollOver(true); + diceDto.setTargetValue(BigDecimal.valueOf(1)); + when(random.nextInt(anyInt())).thenReturn(1); // rolledValue = 2 + + DiceResult result = diceService.play(user, diceDto); + + assertTrue(result.isWin()); + assertEquals(BigDecimal.valueOf(2), result.getRolledValue()); + // Win chance for target 1 (roll over) is 99. Multiplier = (100-1)/99 = 1 + assertEquals(diceDto.getBetAmount().stripTrailingZeros(), result.getPayout().stripTrailingZeros()); + verify(balanceService, times(1)).subtractFunds(user, diceDto.getBetAmount()); + verify(balanceService, times(1)).addFunds(eq(user), any(BigDecimal.class)); + } + + @Test + void play_rollUnder_targetValueOne_alwaysLose_winChanceZero() { diceDto.setRollOver(false); diceDto.setTargetValue(BigDecimal.valueOf(1)); - when(random.nextInt(anyInt())).thenReturn(0); + when(random.nextInt(anyInt())).thenReturn(0); // rolledValue = 1 DiceResult result = diceService.play(user, diceDto); assertFalse(result.isWin()); assertEquals(BigDecimal.valueOf(1), result.getRolledValue()); assertEquals(BigDecimal.ZERO, result.getPayout()); + verify(balanceService, times(1)).subtractFunds(user, diceDto.getBetAmount()); + verify(balanceService, never()).addFunds(eq(user), any(BigDecimal.class)); } @Test - void play_rollOver_targetValueNinetyNine_win() { + void play_rollOver_targetValueNinetyNine_rolledHundred_win() { diceDto.setRollOver(true); diceDto.setTargetValue(BigDecimal.valueOf(99)); - when(random.nextInt(anyInt())).thenReturn(99); + when(random.nextInt(anyInt())).thenReturn(99); // rolledValue = 100 DiceResult result = diceService.play(user, diceDto); assertTrue(result.isWin()); assertEquals(BigDecimal.valueOf(100), result.getRolledValue()); + // Win chance for target 99 (roll over) is 1. Multiplier = (100-1)/1 = 99 + assertEquals(diceDto.getBetAmount().multiply(BigDecimal.valueOf(99)).stripTrailingZeros(), result.getPayout().stripTrailingZeros()); + verify(balanceService, times(1)).subtractFunds(user, diceDto.getBetAmount()); + verify(balanceService, times(1)).addFunds(eq(user), any(BigDecimal.class)); } @Test - void play_rollUnder_targetValueNinetyNine_win() { + void play_rollUnder_targetValueNinetyNine_rolledNinetyEight_win() { diceDto.setRollOver(false); diceDto.setTargetValue(BigDecimal.valueOf(99)); - when(random.nextInt(anyInt())).thenReturn(97); + when(random.nextInt(anyInt())).thenReturn(97); // rolledValue = 98 DiceResult result = diceService.play(user, diceDto); assertTrue(result.isWin()); assertEquals(BigDecimal.valueOf(98), result.getRolledValue()); + // Win chance for target 99 (roll under) is 98. Multiplier = (100-1)/98 = 99/98 + assertEquals(diceDto.getBetAmount().multiply(BigDecimal.valueOf(99).divide(BigDecimal.valueOf(98), 4, RoundingMode.HALF_UP)), result.getPayout()); + verify(balanceService, times(1)).subtractFunds(user, diceDto.getBetAmount()); + verify(balanceService, times(1)).addFunds(eq(user), any(BigDecimal.class)); } @Test - void play_rollOver_targetValueOneHundred_lose() { + void play_rollOver_targetValueOneHundred_alwaysLose_winChanceZero() { diceDto.setRollOver(true); diceDto.setTargetValue(BigDecimal.valueOf(100)); - when(random.nextInt(anyInt())).thenReturn(99); + when(random.nextInt(anyInt())).thenReturn(99); // rolledValue = 100 DiceResult result = diceService.play(user, diceDto); assertFalse(result.isWin()); assertEquals(BigDecimal.valueOf(100), result.getRolledValue()); assertEquals(BigDecimal.ZERO, result.getPayout()); + verify(balanceService, times(1)).subtractFunds(user, diceDto.getBetAmount()); + verify(balanceService, never()).addFunds(eq(user), any(BigDecimal.class)); } @Test - void play_rollUnder_targetValueOneHundred_win() { - diceDto.setRollOver(false); + void play_rollUnder_targetValueOneHundred_rolledNinetyNine_win() { + diceDto.setRollOver(false); // Assuming a typo in original, should be setRollOver(false) diceDto.setTargetValue(BigDecimal.valueOf(100)); - when(random.nextInt(anyInt())).thenReturn(98); + when(random.nextInt(anyInt())).thenReturn(98); // rolledValue = 99 DiceResult result = diceService.play(user, diceDto); assertTrue(result.isWin()); assertEquals(BigDecimal.valueOf(99), result.getRolledValue()); + // Win chance for target 100 (roll under) is 99. Multiplier = (100-1)/99 = 1 + assertEquals(diceDto.getBetAmount().stripTrailingZeros(), result.getPayout().stripTrailingZeros()); + verify(balanceService, times(1)).subtractFunds(user, diceDto.getBetAmount()); + verify(balanceService, times(1)).addFunds(eq(user), any(BigDecimal.class)); } @Test