package com.faforever.client.player; import com.faforever.client.chat.PlayerInfoBean; import com.faforever.client.game.GameService; import com.faforever.client.remote.FafService; import com.faforever.client.remote.domain.PlayersMessage; import com.faforever.client.remote.domain.SocialMessage; import com.faforever.client.user.UserService; import com.faforever.client.user.event.LoginSuccessEvent; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.util.ReflectionUtils; import java.util.Set; import java.util.function.Consumer; import static com.faforever.client.chat.SocialStatus.FOE; import static com.faforever.client.chat.SocialStatus.FRIEND; import static com.natpryce.hamcrest.reflection.HasAnnotationMatcher.hasAnnotation; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.hasSize; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.verify; public class PlayerServiceImplTest { @Mock GameService gameService; @Mock FafService fafService; @Mock UserService userService; @Mock EventBus eventBus; private PlayerServiceImpl instance; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); instance = new PlayerServiceImpl(); instance.eventBus = eventBus; instance.fafService = fafService; instance.userService = userService; instance.gameService = gameService; instance.postConstruct(); } @Test @SuppressWarnings("unchecked") public void testPostConstruct() throws Exception { verify(fafService).addOnMessageListener(eq(PlayersMessage.class), any(Consumer.class)); verify(fafService).addOnMessageListener(eq(SocialMessage.class), any(Consumer.class)); } @Test public void testGetPlayerForUsernameUsernameDoesNotExist() throws Exception { PlayerInfoBean playerInfoBean = instance.getPlayerForUsername("junit"); assertNull(playerInfoBean); } @Test public void testGetPlayerForUsernameUsernameExists() throws Exception { instance.createAndGetPlayerForUsername("junit"); PlayerInfoBean playerInfoBean = instance.getPlayerForUsername("junit"); assertNotNull(playerInfoBean); assertEquals("junit", playerInfoBean.getUsername()); } @Test public void testGetPlayerForUsernameNull() throws Exception { PlayerInfoBean playerInfoBean = instance.getPlayerForUsername(null); assertNull(playerInfoBean); } @Test public void testRegisterAndGetPlayerForUsernameDoesNotExist() throws Exception { PlayerInfoBean playerInfoBean = instance.createAndGetPlayerForUsername("junit"); assertNotNull(playerInfoBean); assertEquals("junit", playerInfoBean.getUsername()); } @Test(expected = IllegalArgumentException.class) public void testRegisterAndGetPlayerForUsernameNull() throws Exception { instance.createAndGetPlayerForUsername(null); } @Test public void testGetPlayerNamesEmpty() throws Exception { Set<String> playerNames = instance.getPlayerNames(); assertThat(playerNames, empty()); } @Test public void testGetPlayerNamesSomeInstances() throws Exception { instance.createAndGetPlayerForUsername("player1"); instance.createAndGetPlayerForUsername("player2"); Set<String> playerNames = instance.getPlayerNames(); assertThat(playerNames, hasSize(2)); assertThat(playerNames, containsInAnyOrder("player1", "player2")); } @Test public void testAddFriend() throws Exception { PlayerInfoBean lisa = instance.createAndGetPlayerForUsername("lisa"); PlayerInfoBean ashley = instance.createAndGetPlayerForUsername("ashley"); instance.addFriend(lisa); instance.addFriend(ashley); verify(fafService).addFriend(lisa); verify(fafService).addFriend(ashley); assertTrue("Property 'friend' was not set to true", lisa.getSocialStatus() == FRIEND); assertTrue("Property 'friend' was not set to true", ashley.getSocialStatus() == FRIEND); } @Test public void testAddFriendIsFoe() throws Exception { PlayerInfoBean playerInfoBean = instance.createAndGetPlayerForUsername("player"); playerInfoBean.setSocialStatus(FOE); instance.addFriend(playerInfoBean); assertFalse("Property 'foe' is still true", playerInfoBean.getSocialStatus() == FOE); } @Test public void testRemoveFriend() throws Exception { PlayerInfoBean player1 = instance.createAndGetPlayerForUsername("player1"); PlayerInfoBean player2 = instance.createAndGetPlayerForUsername("player2"); instance.addFriend(player1); verify(fafService).addFriend(player1); instance.addFriend(player2); verify(fafService).addFriend(player1); verify(fafService).addFriend(player2); instance.removeFriend(player1); verify(fafService).removeFriend(player1); assertFalse("Property 'friend' was not set to false", player1.getSocialStatus() == FRIEND); assertTrue("Property 'friend' was not set to true", player2.getSocialStatus() == FRIEND); } @Test public void testAddFoe() throws Exception { PlayerInfoBean player1 = instance.createAndGetPlayerForUsername("player1"); PlayerInfoBean player2 = instance.createAndGetPlayerForUsername("player2"); instance.addFoe(player1); instance.addFoe(player2); verify(fafService).addFoe(player1); verify(fafService).addFoe(player2); assertTrue("Property 'foe' was not set to true", player1.getSocialStatus() == FOE); assertTrue("Property 'foe' was not set to true", player2.getSocialStatus() == FOE); } @Test public void testAddFoeIsFriend() throws Exception { PlayerInfoBean playerInfoBean = instance.createAndGetPlayerForUsername("player"); playerInfoBean.setSocialStatus(FRIEND); instance.addFoe(playerInfoBean); assertFalse("Property 'friend' is still true", playerInfoBean.getSocialStatus() == FRIEND); } @Test public void testRemoveFoe() throws Exception { PlayerInfoBean player = instance.createAndGetPlayerForUsername("player"); instance.addFriend(player); instance.removeFriend(player); assertFalse("Property 'friend' was not set to false", player.getSocialStatus() == FRIEND); } @Test(expected = IllegalStateException.class) public void testGetCurrentPlayerNullThrowsIllegalStateException() throws Exception { instance.getCurrentPlayer(); } @Test public void testGetCurrentPlayer() throws Exception { LoginSuccessEvent event = new LoginSuccessEvent("junit"); instance.onLoginSuccess(event); PlayerInfoBean currentPlayer = instance.getCurrentPlayer(); assertThat(currentPlayer.getUsername(), is("junit")); } @Test public void testSubscribeAnnotations() { assertThat(ReflectionUtils.findMethod(instance.getClass(), "onLoginSuccess", LoginSuccessEvent.class), hasAnnotation(Subscribe.class)); } @Test public void testEventBusRegistered() throws Exception { verify(eventBus).register(instance); } }