318 lines
14 KiB
Java
318 lines
14 KiB
Java
package uulm.teamname.marvelous.server.lobbymanager;
|
|
|
|
import org.java_websocket.WebSocket;
|
|
import org.junit.jupiter.api.AfterEach;
|
|
import org.junit.jupiter.api.BeforeEach;
|
|
import org.junit.jupiter.api.DisplayName;
|
|
import org.junit.jupiter.api.Test;
|
|
import org.mockito.MockedStatic;
|
|
import org.mockito.Mockito;
|
|
import uulm.teamname.marvelous.gamelibrary.messages.BasicMessage;
|
|
import uulm.teamname.marvelous.gamelibrary.messages.ParticipantType;
|
|
import uulm.teamname.marvelous.gamelibrary.messages.RoleEnum;
|
|
import uulm.teamname.marvelous.gamelibrary.messages.client.PlayerReadyMessage;
|
|
import uulm.teamname.marvelous.server.Server;
|
|
import uulm.teamname.marvelous.server.lobby.Lobby;
|
|
import uulm.teamname.marvelous.server.netconnector.UserManager;
|
|
|
|
import java.lang.reflect.InvocationTargetException;
|
|
import java.util.function.BiConsumer;
|
|
|
|
import static org.mockito.Mockito.*;
|
|
import static org.assertj.core.api.Assertions.*;
|
|
|
|
class LobbyManagerTest {
|
|
/*
|
|
BiConsumer<WebSocket, BasicMessage> onMessageCallback;
|
|
BiConsumer<WebSocket, String> onErrorCallback;
|
|
|
|
LobbyManager manager;
|
|
WebSocket player1;
|
|
WebSocket player2;
|
|
WebSocket player3;
|
|
WebSocket spectator;
|
|
|
|
PlayerReadyMessage playerReady;
|
|
PlayerReadyMessage spectatorReady;
|
|
PlayerReadyMessage aiReady;
|
|
|
|
Participant player1Participant;
|
|
Participant player2Participant;
|
|
Participant player3Participant;
|
|
|
|
LobbyRunner lobbyRunner;
|
|
MockedStatic<LobbyRunner> lobbyRunnerMockedStatic;
|
|
MockedStatic<Server> serverMockedStatic;
|
|
|
|
@BeforeEach
|
|
void beforeEach() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
|
|
|
|
onMessageCallback = mock(BiConsumer.class);
|
|
onErrorCallback = mock(BiConsumer.class);
|
|
|
|
manager = new LobbyManager(onMessageCallback, onErrorCallback);
|
|
|
|
player1 = mock(WebSocket.class);
|
|
player2 = mock(WebSocket.class);
|
|
player3 = mock(WebSocket.class);
|
|
spectator = mock(WebSocket.class);
|
|
|
|
playerReady = new PlayerReadyMessage();
|
|
playerReady.role = RoleEnum.PLAYER;
|
|
|
|
spectatorReady = new PlayerReadyMessage();
|
|
spectatorReady.role = RoleEnum.SPECTATOR;
|
|
|
|
aiReady = new PlayerReadyMessage();
|
|
aiReady.role = RoleEnum.KI;
|
|
|
|
player1Participant = new Participant(
|
|
player1,
|
|
ParticipantType.PlayerOne,
|
|
"AwesomePlayer");
|
|
player2Participant = new Participant(
|
|
player2,
|
|
ParticipantType.PlayerTwo,
|
|
"MoreAwesomePlayer");
|
|
player3Participant = new Participant(
|
|
player3,
|
|
ParticipantType.PlayerOne,
|
|
"AwesomestAwesomePlayer");
|
|
|
|
var constructor = LobbyRunner.class.getDeclaredConstructor();
|
|
constructor.setAccessible(true);
|
|
lobbyRunner = spy(constructor.newInstance());
|
|
doNothing().when(lobbyRunner).startLobby(any(LobbyConnection.class));
|
|
|
|
serverMockedStatic = Mockito.mockStatic(Server.class);
|
|
serverMockedStatic.when(Server::getMaxLobbies).thenReturn(2);
|
|
|
|
lobbyRunnerMockedStatic = Mockito.mockStatic(LobbyRunner.class);
|
|
lobbyRunnerMockedStatic.when(LobbyRunner::getInstance).thenReturn(lobbyRunner);
|
|
}
|
|
|
|
@AfterEach
|
|
void afterEach() {
|
|
lobbyRunnerMockedStatic.close();
|
|
serverMockedStatic.close();
|
|
}
|
|
|
|
@Test
|
|
void lobbyManagerGetsCreatedEmpty() {
|
|
assertThat(manager.getLobbies()).isEmpty();
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("When a participant is added, a new Lobby is created")
|
|
void lobbyCreationTest() {
|
|
|
|
|
|
|
|
var message = new PlayerReadyMessage();
|
|
message.role = RoleEnum.PLAYER;
|
|
|
|
assertThat(manager.getLobbies()).isEmpty();
|
|
|
|
when(player1.getResourceDescriptor()).thenReturn("/ResourcesFTW");
|
|
|
|
manager.assignLobbyToConnection(player1, "AwesomePlayer", message);
|
|
|
|
Participant player1Participant = new Participant(player1, ParticipantType.PlayerOne, "AwesomePlayer");
|
|
|
|
assertThat(manager.getLobbies()).containsOnlyKeys(player1Participant);
|
|
assertThat(manager.getLobbies().get(player1Participant)).isNotNull();
|
|
assertThat(manager.getLobbies().get(player1Participant).getPlayer1()).isEqualTo(player1Participant);
|
|
|
|
assertThat(manager.getResourceDescriptorToLobby()).containsOnlyKeys("/ResourcesFTW");
|
|
assertThat(manager.getResourceDescriptorToLobby().get("/ResourcesFTW"))
|
|
.isEqualTo(manager.getLobbies().get(player1Participant))
|
|
.isNotNull();
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("when two participants with same ResourceDescriptor connect, they get assigned to the same lobby")
|
|
void twoParticipantsSameLobbyTest() {
|
|
|
|
|
|
|
|
when(player1.getResourceDescriptor()).thenReturn("/fancyResourceDescriptor");
|
|
when(player2.getResourceDescriptor()).thenReturn("/fancyResourceDescriptor");
|
|
|
|
manager.assignLobbyToConnection(player1, "AwesomePlayer", playerReady);
|
|
manager.assignLobbyToConnection(player2, "MoreAwesomePlayer", playerReady);
|
|
|
|
Participant player1Participant = new Participant(
|
|
player1, ParticipantType.PlayerOne, "AwesomePlayer");
|
|
|
|
Participant player2Participant = new Participant(
|
|
player2, ParticipantType.PlayerTwo, "MoreAwesomePlayer");
|
|
|
|
assertThat(manager.getLobbies()).containsOnlyKeys(player1Participant, player2Participant);
|
|
assertThat(manager.getLobbies().get(player1Participant))
|
|
.isEqualTo(manager.getLobbies().get(player2Participant))
|
|
.isNotNull();
|
|
|
|
assertThat(manager.getResourceDescriptorToLobby()).containsOnlyKeys("/fancyResourceDescriptor");
|
|
assertThat(manager.getResourceDescriptorToLobby().get("/fancyResourceDescriptor"))
|
|
.isEqualTo(manager.getLobbies().get(player1Participant))
|
|
.isEqualTo(manager.getLobbies().get(player2Participant))
|
|
.isNotNull();
|
|
}
|
|
|
|
|
|
@Test
|
|
@DisplayName("when three participants with same ResourceDescriptor connect, the third gets a new, random lobby")
|
|
void threeParticipantsRandomLobbyTest() {
|
|
|
|
|
|
|
|
when(player1.getResourceDescriptor()).thenReturn("/fancyResourceDescriptor");
|
|
when(player2.getResourceDescriptor()).thenReturn("/fancyResourceDescriptor");
|
|
when(player3.getResourceDescriptor()).thenReturn("/fancyResourceDescriptor");
|
|
|
|
manager.assignLobbyToConnection(player1, "AwesomePlayer", playerReady);
|
|
manager.assignLobbyToConnection(player2, "MoreAwesomePlayer", playerReady);
|
|
manager.assignLobbyToConnection(player3, "AwesomestAwesomePlayer", playerReady);
|
|
|
|
assertThat(manager.getLobbies()).containsOnlyKeys(
|
|
player1Participant,
|
|
player2Participant,
|
|
player3Participant);
|
|
assertThat(manager.getLobbies().get(player1Participant))
|
|
.isEqualTo(manager.getLobbies().get(player2Participant))
|
|
.isNotEqualTo(manager.getLobbies().get(player3Participant))
|
|
.isNotNull();
|
|
|
|
assertThat(manager.getResourceDescriptorToLobby()).containsKey("/fancyResourceDescriptor");
|
|
assertThat(manager.getResourceDescriptorToLobby().get("/fancyResourceDescriptor"))
|
|
.isEqualTo(manager.getLobbies().get(player1Participant))
|
|
.isEqualTo(manager.getLobbies().get(player2Participant))
|
|
.isNotNull();
|
|
|
|
assertThat(manager.getResourceDescriptorToLobby().get(manager.getLobbies().get(player1Participant).gameID))
|
|
.isNotNull()
|
|
.isEqualTo(manager.getLobbies().get(player1Participant))
|
|
.isEqualTo(manager.getLobbies().get(player2Participant))
|
|
.isNotEqualTo(manager.getLobbies().get(player3Participant));
|
|
|
|
System.out.println(manager.getLobbies().get(player3Participant));
|
|
System.out.println(manager.getResourceDescriptorToLobby());
|
|
|
|
assertThat(manager.getResourceDescriptorToLobby().get(manager.getLobbies().get(player3Participant).gameID))
|
|
.isNotNull()
|
|
.isNotEqualTo(manager.getLobbies().get(player1Participant))
|
|
.isNotEqualTo(manager.getLobbies().get(player2Participant))
|
|
.isEqualTo(manager.getLobbies().get(player3Participant));
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("On Participant without ResourceDescriptor random lobby gets generated")
|
|
void randomLobbyTest() {
|
|
when(player1.getResourceDescriptor()).thenReturn(null);
|
|
|
|
manager.assignLobbyToConnection(player1, "AwesomePlayer", playerReady);
|
|
|
|
assertThat(manager.getLobbies()).hasSize(1);
|
|
assertThat(manager.getLobbies().get(player1Participant)).isNotNull();
|
|
assertThat(manager.getLobbies().get(player1Participant).gameID).isNotNull();
|
|
|
|
assertThat(manager.getResourceDescriptorToLobby()).hasSize(1);
|
|
assertThat(manager.getResourceDescriptorToLobby().get(manager.getLobbies().get(player1Participant).gameID))
|
|
.isNotNull()
|
|
.isEqualTo(manager.getLobbies().get(player1Participant));
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("When two people without ResourceDescriptor join, they get allocated to the same lobby")
|
|
void randomLobbyTwoPlayerTest() {
|
|
when(player1.getResourceDescriptor()).thenReturn(null);
|
|
when(player2.getResourceDescriptor()).thenReturn(null);
|
|
manager.assignLobbyToConnection(player1, "AwesomePlayer", playerReady);
|
|
manager.assignLobbyToConnection(player2, "MoreAwesomePlayer", playerReady);
|
|
|
|
assertThat(manager.getLobbies()).hasSize(2);
|
|
assertThat(manager.getLobbies().get(player1Participant))
|
|
.isNotNull()
|
|
.isEqualTo(manager.getLobbies().get(player2Participant));
|
|
|
|
assertThat(manager.getResourceDescriptorToLobby()).hasSize(1);
|
|
assertThat(manager.getResourceDescriptorToLobby().get(manager.getLobbies().get(player1Participant).gameID))
|
|
.isNotNull()
|
|
.isEqualTo(manager.getLobbies().get(player1Participant))
|
|
.isEqualTo(manager.getLobbies().get(player2Participant));
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("When three players connect, a new lobby gets created")
|
|
void randomLobbyThreePlayerTest() {
|
|
when(player1.getResourceDescriptor()).thenReturn(null);
|
|
when(player2.getResourceDescriptor()).thenReturn(null);
|
|
when(player3.getResourceDescriptor()).thenReturn(null);
|
|
manager.assignLobbyToConnection(player1, "AwesomePlayer", playerReady);
|
|
manager.assignLobbyToConnection(player2, "MoreAwesomePlayer", playerReady);
|
|
manager.assignLobbyToConnection(player3, "AwesomestAwesomePlayer", playerReady);
|
|
|
|
assertThat(manager.getLobbies()).hasSize(3);
|
|
assertThat(manager.getLobbies().get(player1Participant))
|
|
.isNotNull()
|
|
.isEqualTo(manager.getLobbies().get(player2Participant))
|
|
.isNotEqualTo(manager.getLobbies().get(player3Participant));
|
|
|
|
assertThat(manager.getLobbies().get(player3Participant)).isNotNull();
|
|
|
|
assertThat(manager.getResourceDescriptorToLobby()).hasSize(2);
|
|
assertThat(manager.getResourceDescriptorToLobby().get(manager.getLobbies().get(player1Participant).gameID))
|
|
.isNotNull()
|
|
.isEqualTo(manager.getLobbies().get(player1Participant))
|
|
.isEqualTo(manager.getLobbies().get(player2Participant))
|
|
.isNotEqualTo(manager.getLobbies().get(player3Participant));
|
|
assertThat(manager.getResourceDescriptorToLobby().get(manager.getLobbies().get(player3Participant).gameID))
|
|
.isNotNull()
|
|
.isEqualTo(manager.getLobbies().get(player3Participant));
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("Spectator joins full lobby")
|
|
void spactatorsJoinLobby() {
|
|
when(player1.getResourceDescriptor()).thenReturn("/awesomeLobby");
|
|
when(player2.getResourceDescriptor()).thenReturn("/awesomeLobby");
|
|
when(spectator.getResourceDescriptor()).thenReturn("/awesomeLobby");
|
|
|
|
Participant player1Participant = new Participant(player1, ParticipantType.PlayerOne, "playerOne");
|
|
Participant player2Participant = new Participant(player2, ParticipantType.PlayerTwo, "playerTwo");
|
|
Participant spectator1 = new Participant(spectator, ParticipantType.Spectator, "spectator1");
|
|
|
|
manager.assignLobbyToConnection(player1, "playerOne", playerReady);
|
|
verify(lobbyRunner, never()).startLobby(any(LobbyConnection.class));
|
|
|
|
manager.assignLobbyToConnection(player2, "playerTwo", playerReady);
|
|
verify(lobbyRunner, times(1)).startLobby(any(LobbyConnection.class));
|
|
when(lobbyRunner.isStarted(any(LobbyConnection.class))).thenReturn(true);
|
|
|
|
manager.assignLobbyToConnection(spectator, "spectator1", spectatorReady);
|
|
verify(lobbyRunner, times(1)).startLobby(any(LobbyConnection.class));
|
|
// manager.assignLobbyToConnection(spectator, "spectator2", spectatorReady);
|
|
|
|
assertThat(manager.getResourceDescriptorToLobby()).hasSize(1);
|
|
assertThat(manager.getLobbies()).containsOnlyKeys(
|
|
player1Participant,
|
|
player2Participant,
|
|
spectator1);
|
|
|
|
assertThat(manager.getLobbies().get(player1Participant))
|
|
.isNotNull()
|
|
.isEqualTo(manager.getLobbies().get(player2Participant))
|
|
.isEqualTo(manager.getLobbies().get(spectator1));
|
|
|
|
assertThat(manager.getResourceDescriptorToLobby().get(manager.getLobbies().get(player1Participant).gameID))
|
|
.isNotNull()
|
|
.isEqualTo(manager.getLobbies().get(player1Participant))
|
|
.isEqualTo(manager.getLobbies().get(player2Participant))
|
|
.isEqualTo(manager.getLobbies().get(spectator1));
|
|
|
|
assertThat(manager.getResourceDescriptorToLobby().get(manager.getLobbies().get(player1Participant).gameID))
|
|
.isEqualTo(manager.getResourceDescriptorToLobby().get(manager.getLobbies().get(player2Participant).gameID))
|
|
.isEqualTo(manager.getResourceDescriptorToLobby().get(manager.getLobbies().get(spectator1).gameID));
|
|
} */
|
|
}
|