package games.strategy.engine.lobby.client.ui; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertThat; import java.util.HashMap; import java.util.Map; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; import games.strategy.engine.lobby.server.GameDescription; import games.strategy.engine.lobby.server.ILobbyGameController; import games.strategy.engine.message.IChannelMessenger; import games.strategy.engine.message.IRemoteMessenger; import games.strategy.engine.message.MessageContext; import games.strategy.net.GUID; import games.strategy.net.IMessenger; import games.strategy.net.INode; import games.strategy.test.TestUtil; import games.strategy.util.Tuple; @RunWith(MockitoJUnitRunner.class) public class LobbyGameTableModelTest { private LobbyGameTableModel testObj; @Mock private IMessenger mockMessenger; @Mock private IChannelMessenger mockChannelMessenger; @Mock private IRemoteMessenger mockRemoteMessenger; @Mock private ILobbyGameController mockLobbyController; private Map<GUID, GameDescription> fakeGameMap; private Tuple<GUID, GameDescription> fakeGame; @Mock private GameDescription mockGameDescription; @Mock private INode serverNode; @Before public void setUp() { fakeGameMap = new HashMap<>(); fakeGame = Tuple.of(new GUID(), mockGameDescription); fakeGameMap.put(fakeGame.getFirst(), fakeGame.getSecond()); Mockito.when(mockRemoteMessenger.getRemote(ILobbyGameController.GAME_CONTROLLER_REMOTE)) .thenReturn(mockLobbyController); Mockito.when(mockLobbyController.listGames()).thenReturn(fakeGameMap); testObj = new LobbyGameTableModel(mockMessenger, mockChannelMessenger, mockRemoteMessenger); Mockito.verify(mockLobbyController, Mockito.times(1)).listGames(); MessageContext.setSenderNodeForThread(serverNode); Mockito.when(mockMessenger.getServerNode()).thenReturn(serverNode); TestUtil.waitForSwingThreads(); } @Test public void gamesAreLoadedOnInit() { assertThat(testObj.getRowCount(), is(1)); } @Test public void updateGame() { final int commentColumnIndex = testObj.getColumnIndex(LobbyGameTableModel.Column.Comments); assertThat((String) testObj.getValueAt(0, commentColumnIndex), nullValue()); final String newComment = "comment"; final GameDescription newDescription = new GameDescription(); newDescription.setComment(newComment); testObj.getLobbyGameBroadcaster().gameUpdated(fakeGame.getFirst(), newDescription); TestUtil.waitForSwingThreads(); assertThat(testObj.getRowCount(), is(1)); assertThat((String) testObj.getValueAt(0, commentColumnIndex), is(newComment)); } @Test public void updateGameAddsIfDoesNotExist() { testObj.getLobbyGameBroadcaster().gameUpdated(new GUID(), new GameDescription()); TestUtil.waitForSwingThreads(); assertThat(testObj.getRowCount(), is(2)); } @Test public void updateGameWithNullGuidIsIgnored() { testObj.getLobbyGameBroadcaster().gameUpdated(null, new GameDescription()); TestUtil.waitForSwingThreads(); assertThat("expect row count to remain 1, null guid is bogus data", testObj.getRowCount(), is(1)); } @Test public void removeGame() { testObj.getLobbyGameBroadcaster().gameRemoved(fakeGame.getFirst()); TestUtil.waitForSwingThreads(); assertThat(testObj.getRowCount(), is(0)); } @Test public void removeGameThatDoesNotExistIsIgnored() { testObj.getLobbyGameBroadcaster().gameRemoved(new GUID()); TestUtil.waitForSwingThreads(); assertThat(testObj.getRowCount(), is(1)); } }