test: dice service #237
1 changed files with 48 additions and 13 deletions
|
@ -10,6 +10,7 @@ import org.mockito.Mock;
|
||||||
import org.mockito.junit.jupiter.MockitoExtension;
|
import org.mockito.junit.jupiter.MockitoExtension;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.math.RoundingMode;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
@ -101,78 +102,112 @@ class DiceServiceTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void play_rollOver_targetValueOne_lose() {
|
void play_rollOver_targetValueOne_rolledOne_lose() {
|
||||||
diceDto.setRollOver(true);
|
diceDto.setRollOver(true);
|
||||||
diceDto.setTargetValue(BigDecimal.valueOf(1));
|
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);
|
DiceResult result = diceService.play(user, diceDto);
|
||||||
|
|
||||||
assertFalse(result.isWin());
|
assertFalse(result.isWin());
|
||||||
assertEquals(BigDecimal.valueOf(1), result.getRolledValue());
|
assertEquals(BigDecimal.valueOf(1), result.getRolledValue());
|
||||||
assertEquals(BigDecimal.ZERO, result.getPayout());
|
assertEquals(BigDecimal.ZERO, result.getPayout());
|
||||||
|
verify(balanceService, times(1)).subtractFunds(user, diceDto.getBetAmount());
|
||||||
|
verify(balanceService, never()).addFunds(eq(user), any(BigDecimal.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@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.setRollOver(false);
|
||||||
diceDto.setTargetValue(BigDecimal.valueOf(1));
|
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);
|
DiceResult result = diceService.play(user, diceDto);
|
||||||
|
|
||||||
assertFalse(result.isWin());
|
assertFalse(result.isWin());
|
||||||
assertEquals(BigDecimal.valueOf(1), result.getRolledValue());
|
assertEquals(BigDecimal.valueOf(1), result.getRolledValue());
|
||||||
assertEquals(BigDecimal.ZERO, result.getPayout());
|
assertEquals(BigDecimal.ZERO, result.getPayout());
|
||||||
|
verify(balanceService, times(1)).subtractFunds(user, diceDto.getBetAmount());
|
||||||
|
verify(balanceService, never()).addFunds(eq(user), any(BigDecimal.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void play_rollOver_targetValueNinetyNine_win() {
|
void play_rollOver_targetValueNinetyNine_rolledHundred_win() {
|
||||||
diceDto.setRollOver(true);
|
diceDto.setRollOver(true);
|
||||||
diceDto.setTargetValue(BigDecimal.valueOf(99));
|
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);
|
DiceResult result = diceService.play(user, diceDto);
|
||||||
|
|
||||||
assertTrue(result.isWin());
|
assertTrue(result.isWin());
|
||||||
assertEquals(BigDecimal.valueOf(100), result.getRolledValue());
|
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
|
@Test
|
||||||
void play_rollUnder_targetValueNinetyNine_win() {
|
void play_rollUnder_targetValueNinetyNine_rolledNinetyEight_win() {
|
||||||
diceDto.setRollOver(false);
|
diceDto.setRollOver(false);
|
||||||
diceDto.setTargetValue(BigDecimal.valueOf(99));
|
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);
|
DiceResult result = diceService.play(user, diceDto);
|
||||||
|
|
||||||
assertTrue(result.isWin());
|
assertTrue(result.isWin());
|
||||||
assertEquals(BigDecimal.valueOf(98), result.getRolledValue());
|
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
|
@Test
|
||||||
void play_rollOver_targetValueOneHundred_lose() {
|
void play_rollOver_targetValueOneHundred_alwaysLose_winChanceZero() {
|
||||||
diceDto.setRollOver(true);
|
diceDto.setRollOver(true);
|
||||||
diceDto.setTargetValue(BigDecimal.valueOf(100));
|
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);
|
DiceResult result = diceService.play(user, diceDto);
|
||||||
|
|
||||||
assertFalse(result.isWin());
|
assertFalse(result.isWin());
|
||||||
assertEquals(BigDecimal.valueOf(100), result.getRolledValue());
|
assertEquals(BigDecimal.valueOf(100), result.getRolledValue());
|
||||||
assertEquals(BigDecimal.ZERO, result.getPayout());
|
assertEquals(BigDecimal.ZERO, result.getPayout());
|
||||||
|
verify(balanceService, times(1)).subtractFunds(user, diceDto.getBetAmount());
|
||||||
|
verify(balanceService, never()).addFunds(eq(user), any(BigDecimal.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void play_rollUnder_targetValueOneHundred_win() {
|
void play_rollUnder_targetValueOneHundred_rolledNinetyNine_win() {
|
||||||
diceDto.setRollOver(false);
|
diceDto.setRollOver(false); // Assuming a typo in original, should be setRollOver(false)
|
||||||
diceDto.setTargetValue(BigDecimal.valueOf(100));
|
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);
|
DiceResult result = diceService.play(user, diceDto);
|
||||||
|
|
||||||
assertTrue(result.isWin());
|
assertTrue(result.isWin());
|
||||||
assertEquals(BigDecimal.valueOf(99), result.getRolledValue());
|
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
|
@Test
|
||||||
|
|
Reference in a new issue