Skip to content

Commit

Permalink
Merge pull request #254 from chesterbr/fix-report-salas-aguardando
Browse files Browse the repository at this point in the history
Encerra salas somente com bots
  • Loading branch information
chesterbr authored Feb 21, 2024
2 parents 85cbec7 + d812e5a commit 4218baf
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 6 deletions.
10 changes: 6 additions & 4 deletions server/src/main/java/me/chester/minitruco/server/ComandoA.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,12 @@ public void executa(String[] args, JogadorConectado j) {
} else {
if (sala.isPublica()) {
sala.trocaPorBot(j);
for (int i = 1; i <= 4; i++) {
Jogador outroJogador = sala.getPartida().getJogador(i);
if (outroJogador instanceof JogadorConectado) {
((JogadorConectado) outroJogador).println("! T " + j.getNome() + " saiu; bot🤖 entrou no lugar.");
if (sala.getPartida() != null) {
for (int i = 1; i <= 4; i++) {
Jogador outroJogador = sala.getPartida().getJogador(i);
if (outroJogador instanceof JogadorConectado) {
((JogadorConectado) outroJogador).println("! T " + j.getNome() + " saiu; bot🤖 entrou no lugar.");
}
}
}
j.setSala(null);
Expand Down
9 changes: 9 additions & 0 deletions server/src/main/java/me/chester/minitruco/server/Sala.java
Original file line number Diff line number Diff line change
Expand Up @@ -274,9 +274,17 @@ public synchronized void trocaPorBot(JogadorConectado j) {
Jogador bot = partida.getJogador(i + 1);
jogadores[i] = bot;
j.setSala(null);
}
}
// Se a partida ficou apenas com bots, encerra e esvazia a sala
for (int i = 0; i <= 3; i++) {
if (!(jogadores[i] instanceof JogadorBot)) {
return;
}
}
partida.abandona(0);
liberaJogo();
atualizaColecoesDeSalas();
}

/**
Expand Down Expand Up @@ -370,6 +378,7 @@ public synchronized void iniciaPartida(Jogador solicitante) {

}
Thread.ofVirtual().start(partida);
atualizaColecoesDeSalas();
}

/**
Expand Down
34 changes: 32 additions & 2 deletions server/src/test/java/me/chester/minitruco/server/ComandoATest.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,11 @@ class ComandoATest {

@BeforeEach
void setUp() {
j1 = spy(new JogadorConectado(null));
Sala.limpaSalas();
j1 = spy(new JogadorConectado(mock(Socket.class)));
j2 = spy(new JogadorConectado(mock(Socket.class)));
j3 = spy(new JogadorConectado(mock(Socket.class)));
j4 = spy(new JogadorConectado(null));
j4 = spy(new JogadorConectado(mock(Socket.class)));
doNothing().when(j1).println(any());
doNothing().when(j2).println(any());
doNothing().when(j3).println(any());
Expand Down Expand Up @@ -92,6 +93,35 @@ void testAbortaSalaPublicaComPartidaTrocaUsuarioPorBot() {
assertEquals(JogadorBot.class, s.getPartida().getJogador(2).getClass());
}

@Test
void testPartidaEncerraSeTodosForemTrocadosPorBots() {
Sala s = new Sala(true, "P");
s.adiciona(j1);
s.adiciona(j2);
s.iniciaPartida(j1);
assertNotNull(s.getPartida());

Comando.interpreta("A", j1);
assertNotNull(s.getPartida());

Comando.interpreta("A", j2);
assertNull(s.getPartida());
}

@Test
void testSalaNaoFicaDisponivelSeTodosForemTrocadosPorBots() {
assertEquals("", Sala.modosAguardandoJogadores());
Sala s = new Sala(true, "P");
s.adiciona(j1);
s.adiciona(j2);
s.iniciaPartida(j1); // posição 3 e 4 serão bots
assertEquals("", Sala.modosAguardandoJogadores());
Comando.interpreta("A", j1);
assertEquals("", Sala.modosAguardandoJogadores());
Comando.interpreta("A", j2); // Neste ponto, todos são bots
assertEquals("", Sala.modosAguardandoJogadores());
}

@Test
void testAbortaSalaPublicaComPartidaDesconectaUsuarioTrocado() {
Sala s = new Sala(true, "P");
Expand Down
34 changes: 34 additions & 0 deletions server/src/test/java/me/chester/minitruco/server/SalaTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,22 @@ void testIniciaPartida() {
s.iniciaPartida(j1);
}

@Test
void testModosAguardandoJogadoresSoConsideraSalaComVaga() {
assertEquals("", Sala.modosAguardandoJogadores());
Sala s = new Sala(true, "P");
s.adiciona(j1);
assertEquals("P", Sala.modosAguardandoJogadores());
s.adiciona(j2);
assertEquals("P", Sala.modosAguardandoJogadores());
s.iniciaPartida(j1);
assertEquals("", Sala.modosAguardandoJogadores());
Comando.interpreta("A", j1); // Troca por bot
assertEquals("", Sala.modosAguardandoJogadores());
Comando.interpreta("A", j2); // Troca por bot, sala vazia
assertEquals("", Sala.modosAguardandoJogadores());
}

@Test
void testSalaNaoIniciaPartidaSozinha() {
Sala s = new Sala(true, "P");
Expand Down Expand Up @@ -429,6 +445,24 @@ void testModosAguardandoJogadores() {
assertEquals("M", sorted(Sala.modosAguardandoJogadores())); // Completou a sala L
}

@Test
void testTrocaTodosPorBotEncerraPartida() {
Sala.colocaEmSalaPublica(j1, "P");
Sala.colocaEmSalaPublica(j2, "P");
Sala.colocaEmSalaPublica(j3, "P");
Sala s = Sala.colocaEmSalaPublica(j4, "P");
s.iniciaPartida(j1);
s.trocaPorBot(j1);
s.trocaPorBot(j2);
s.trocaPorBot(j3);
Partida p = s.getPartida();
assertNotNull(p);
assertFalse(p.finalizada);
s.trocaPorBot(j4);
assertNull(s.getPartida());
assertTrue(p.finalizada);
}

@Test
void testIsPublica() {
Sala s = new Sala(true, "P");
Expand Down

0 comments on commit 4218baf

Please sign in to comment.