90 lines
3.8 KiB
Java
90 lines
3.8 KiB
Java
package games.dmg.spigottyrant;
|
|
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
|
|
import java.time.Duration;
|
|
import java.time.Instant;
|
|
import java.util.Map;
|
|
import java.util.Optional;
|
|
import java.util.Set;
|
|
import java.util.UUID;
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
final class RoleRelinquishmentServiceTest {
|
|
@Test
|
|
void vigilanteCanRelinquishAndOpenArenaChallenge() {
|
|
UUID tyrant = UUID.fromString("11111111-1111-1111-1111-111111111111");
|
|
UUID vigilante = UUID.fromString("22222222-2222-2222-2222-222222222222");
|
|
UUID candidate = UUID.fromString("33333333-3333-3333-3333-333333333333");
|
|
Instant now = Instant.parse("2026-08-14T12:00:00Z");
|
|
TyrantSuccessionService succession = new TyrantSuccessionService();
|
|
RoleMaintenanceService maintenance = new RoleMaintenanceService(
|
|
succession, Duration.ofHours(48)
|
|
);
|
|
RoleRelinquishmentService service = new RoleRelinquishmentService(
|
|
succession, maintenance
|
|
);
|
|
GameState game = new GameState(
|
|
GameLifecycle.RUNNING, Optional.of(tyrant), Optional.of(vigilante),
|
|
Optional.empty(), Optional.empty(), Optional.empty(), Duration.ZERO,
|
|
0, 0, Set.of()
|
|
);
|
|
PlayerState tyrantState = active(tyrant, now);
|
|
PlayerState vigilanteState = active(vigilante, now);
|
|
PlayerState candidateState = active(candidate, now);
|
|
|
|
RelinquishmentResult result = service.relinquish(
|
|
new PersistentState(game, Map.of(
|
|
tyrant, tyrantState, vigilante, vigilanteState, candidate, candidateState
|
|
)),
|
|
vigilante,
|
|
Set.of(tyrant, candidate),
|
|
now
|
|
);
|
|
|
|
assertEquals(RelinquishmentStatus.RELINQUISHED, result.status());
|
|
assertEquals(Optional.empty(), result.state().game().vigilanteId());
|
|
assertEquals(Optional.empty(), result.state().game().pendingVigilante());
|
|
}
|
|
|
|
@Test
|
|
void tyrantRelinquishmentOpensTyrantArenaAndClearsReign() {
|
|
UUID tyrant = UUID.fromString("11111111-1111-1111-1111-111111111111");
|
|
UUID vigilante = UUID.fromString("22222222-2222-2222-2222-222222222222");
|
|
Instant now = Instant.parse("2026-08-14T12:00:00Z");
|
|
TyrantSuccessionService succession = new TyrantSuccessionService();
|
|
RoleRelinquishmentService service = new RoleRelinquishmentService(
|
|
succession, new RoleMaintenanceService(succession, Duration.ofHours(48))
|
|
);
|
|
GameState game = new GameState(
|
|
GameLifecycle.RUNNING, Optional.of(tyrant), Optional.of(vigilante),
|
|
Optional.empty(), Optional.empty(), Optional.empty(), Duration.ZERO,
|
|
4, 0, Set.of(TyrantUnlock.STRENGTH)
|
|
);
|
|
|
|
RelinquishmentResult result = service.relinquish(
|
|
new PersistentState(game, Map.of(
|
|
tyrant, active(tyrant, now), vigilante, active(vigilante, now)
|
|
)),
|
|
tyrant,
|
|
Set.of(tyrant, vigilante),
|
|
now
|
|
);
|
|
|
|
assertEquals(RelinquishmentStatus.RELINQUISHED, result.status());
|
|
assertEquals(Optional.empty(), result.state().game().tyrantId());
|
|
assertEquals(Optional.empty(), result.state().game().pendingTyrant());
|
|
assertEquals(Optional.empty(), result.state().game().vigilanteId());
|
|
assertEquals(0, result.state().game().tyrantLevel());
|
|
assertEquals(1, result.state().game().unspentChoices());
|
|
}
|
|
|
|
private static PlayerState active(UUID id, Instant now) {
|
|
PlayerState player = PlayerState.newPlayer(id, id.toString());
|
|
return new PlayerState(
|
|
id, player.latestName(), Optional.of(now.minusSeconds(60)), Optional.empty(),
|
|
TyrantClass.NONE, Optional.empty(), Map.of(), Set.of(), java.util.List.of()
|
|
);
|
|
}
|
|
}
|