package com.faforever.client.game;
import com.faforever.client.connectivity.ConnectivityService;
import com.faforever.client.connectivity.ConnectivityState;
import com.faforever.client.i18n.I18n;
import com.faforever.client.map.MapBean;
import com.faforever.client.map.MapBuilder;
import com.faforever.client.map.MapService;
import com.faforever.client.mod.ModInfoBean;
import com.faforever.client.mod.ModService;
import com.faforever.client.preferences.ForgedAlliancePrefs;
import com.faforever.client.preferences.Preferences;
import com.faforever.client.preferences.PreferencesService;
import com.faforever.client.test.AbstractPlainJavaFxTest;
import com.faforever.client.theme.ThemeService;
import javafx.beans.property.ReadOnlyObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import javafx.collections.MapChangeListener;
import javafx.collections.MapChangeListener.Change;
import javafx.collections.ObservableList;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.springframework.core.env.Environment;
import java.nio.file.Paths;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class CreateGameControllerTest extends AbstractPlainJavaFxTest {
private static final KeyEvent keyUpPressed = new KeyEvent(KeyEvent.KEY_PRESSED, "0", "", KeyCode.UP, false, false, false, false);
private static final KeyEvent keyUpReleased = new KeyEvent(KeyEvent.KEY_RELEASED, "0", "", KeyCode.UP, false, false, false, false);
private static final KeyEvent keyDownPressed = new KeyEvent(KeyEvent.KEY_PRESSED, "0", "", KeyCode.DOWN, false, false, false, false);
private static final KeyEvent keyDownReleased = new KeyEvent(KeyEvent.KEY_RELEASED, "0", "", KeyCode.DOWN, false, false, false, false);
@Mock
private PreferencesService preferencesService;
@Mock
private MapService mapService;
@Mock
private GameService gameService;
@Mock
private ModService modService;
@Mock
private Preferences preferences;
@Mock
private ForgedAlliancePrefs forgedAlliancePrefs;
@Mock
private Environment environment;
@Mock
private I18n i18n;
@Mock
private ThemeService themeService;
@Mock
private ConnectivityService connectivityService;
private CreateGameController instance;
private ObservableList<MapBean> mapList;
@Before
public void setUp() throws Exception {
instance = loadController("create_game.fxml");
instance.preferencesService = preferencesService;
instance.mapService = mapService;
instance.gameService = gameService;
instance.modService = modService;
instance.environment = environment;
instance.i18n = i18n;
instance.themeService = themeService;
instance.connectivityService = connectivityService;
mapList = FXCollections.observableArrayList();
ReadOnlyObjectProperty<ConnectivityState> connectivityStateProperty = new SimpleObjectProperty<>();
when(preferencesService.getPreferences()).thenReturn(preferences);
when(preferences.getForgedAlliance()).thenReturn(forgedAlliancePrefs);
when(forgedAlliancePrefs.getPath()).thenReturn(Paths.get(""));
when(mapService.getInstalledMaps()).thenReturn(mapList);
when(connectivityService.connectivityStateProperty()).thenReturn(connectivityStateProperty);
doAnswer(invocation -> getThemeFile(invocation.getArgumentAt(0, String.class)))
.when(themeService).getThemeFile(any());
doAnswer(invocation -> getThemeFile(invocation.getArgumentAt(0, String.class)))
.when(themeService).getThemeFile(ThemeService.UNKNOWN_MAP_IMAGE);
instance.postConstruct();
}
@Test
public void testMapSearchTextFieldFilteringEmpty() throws Exception {
instance.mapSearchTextField.setText("Test");
assertThat(instance.filteredMapBeans.getSource(), empty());
}
@Test
public void testMapSearchTextFieldFilteringPopulated() throws Exception {
mapList.add(MapBuilder.create().defaultValues().displayName("Test1").get());
mapList.add(MapBuilder.create().defaultValues().technicalName("test2").get());
mapList.add(MapBuilder.create().defaultValues().displayName("foo").get());
instance.mapSearchTextField.setText("Test");
assertThat(instance.filteredMapBeans.get(0).getDisplayName(), is("Test1"));
assertThat(instance.filteredMapBeans.get(1).getFolderName(), is("test2"));
}
@Test
public void testMapSearchTextFieldKeyPressedUpForEmpty() throws Exception {
instance.mapSearchTextField.setText("Test");
instance.mapSearchTextField.getOnKeyPressed().handle(keyUpPressed);
instance.mapSearchTextField.getOnKeyPressed().handle(keyUpReleased);
assertThat(instance.mapListView.getSelectionModel().getSelectedIndex(), is(-1));
}
@Test
public void testMapSearchTextFieldKeyPressedDownForEmpty() throws Exception {
instance.mapSearchTextField.setText("Test");
instance.mapSearchTextField.getOnKeyPressed().handle(keyDownPressed);
instance.mapSearchTextField.getOnKeyPressed().handle(keyDownReleased);
assertThat(instance.mapListView.getSelectionModel().getSelectedIndex(), is(-1));
}
@Test
public void testMapSearchTextFieldKeyPressedUpForPopulated() throws Exception {
mapList.add(MapBuilder.create().defaultValues().displayName("Test1").get());
mapList.add(MapBuilder.create().defaultValues().displayName("Test1").get());
instance.mapSearchTextField.setText("Test");
instance.mapSearchTextField.getOnKeyPressed().handle(keyDownPressed);
instance.mapSearchTextField.getOnKeyPressed().handle(keyDownReleased);
instance.mapSearchTextField.getOnKeyPressed().handle(keyUpPressed);
instance.mapSearchTextField.getOnKeyPressed().handle(keyUpReleased);
assertThat(instance.mapListView.getSelectionModel().getSelectedIndex(), is(0));
}
@Test
public void testMapSearchTextFieldKeyPressedDownForPopulated() throws Exception {
mapList.add(MapBuilder.create().defaultValues().displayName("Test1").get());
mapList.add(MapBuilder.create().defaultValues().displayName("Test1").get());
instance.mapSearchTextField.setText("Test");
instance.mapSearchTextField.getOnKeyPressed().handle(keyDownPressed);
instance.mapSearchTextField.getOnKeyPressed().handle(keyDownReleased);
assertThat(instance.mapListView.getSelectionModel().getSelectedIndex(), is(1));
}
@Test
public void testSetLastGameTitle() throws Exception {
when(preferences.getLastGameTitle()).thenReturn("testGame");
when(preferences.getForgedAlliance().getPath()).thenReturn(Paths.get(""));
instance.postConstruct();
assertThat(instance.titleTextField.getText(), is("testGame"));
}
@Test
public void testSelectLastMap() throws Exception {
MapBean lastMapBean = MapBuilder.create().defaultValues().technicalName("foo").get();
when(preferences.getLastMap()).thenReturn("foo");
mapList.add(MapBuilder.create().defaultValues().technicalName("Test1").get());
mapList.add(lastMapBean);
instance.postConstruct();
assertThat(instance.mapListView.getSelectionModel().getSelectedItem(), is(lastMapBean));
}
@Test
public void testInitGameTypeComboBoxEmpty() throws Exception {
instance = loadController("create_game.fxml");
assertThat(instance.gameTypeListView.getItems(), empty());
}
@Test
public void testInitGameTypeComboBoxPostPopulated() throws Exception {
instance.postConstruct();
GameTypeBean gameTypeBean = mock(GameTypeBean.class);
onGameTypeAdded(gameTypeBean);
assertThat(instance.gameTypeListView.getItems(), hasSize(1));
assertThat(instance.gameTypeListView.getItems().get(0), is(gameTypeBean));
}
private void onGameTypeAdded(GameTypeBean gameTypeBean) {
ArgumentCaptor<MapChangeListener<String, GameTypeBean>> argument = ArgumentCaptor.forClass(MapChangeListener.class);
verify(instance.gameService, atLeastOnce()).addOnGameTypesChangeListener(argument.capture());
MapChangeListener<String, GameTypeBean> listener = argument.getValue();
@SuppressWarnings("unchecked")
Change<String, GameTypeBean> change = mock(Change.class);
when(change.wasAdded()).thenReturn(true);
when(change.getValueAdded()).thenReturn(gameTypeBean);
listener.onChanged(change);
}
// FIXME fix this
@Test
public void testSelectLastOrDefaultSelectDefault() throws Exception {
GameTypeBean gameTypeBean = mock(GameTypeBean.class);
GameTypeBean gameTypeBean2 = mock(GameTypeBean.class);
when(preferences.getLastGameType()).thenReturn(null);
when(gameTypeBean.getName()).thenReturn(GameType.DEFAULT.getString());
when(gameTypeBean2.getName()).thenReturn(null);
instance.postConstruct();
onGameTypeAdded(gameTypeBean2);
onGameTypeAdded(gameTypeBean);
assertThat(instance.gameTypeListView.getSelectionModel().getSelectedItem(), is(gameTypeBean));
}
@Test
public void testSelectLastOrDefaultSelectLast() throws Exception {
GameTypeBean gameTypeBean = mock(GameTypeBean.class);
GameTypeBean gameTypeBean2 = mock(GameTypeBean.class);
when(preferences.getLastGameType()).thenReturn("last");
when(gameTypeBean.getName()).thenReturn(null);
when(gameTypeBean2.getName()).thenReturn("last");
instance.postConstruct();
onGameTypeAdded(gameTypeBean);
onGameTypeAdded(gameTypeBean2);
assertThat(instance.gameTypeListView.getSelectionModel().getSelectedItem(), is(gameTypeBean2));
}
@Test
public void testInitModListEmpty() throws Exception {
assertThat(instance.modListView.getItems(), nullValue());
instance.postConstruct();
assertThat(instance.modListView.getItems(), nullValue());
}
@Test
public void testInitModListPopulated() throws Exception {
assertThat(instance.modListView.getItems(), nullValue());
ModInfoBean modInfoBean1 = mock(ModInfoBean.class);
ModInfoBean modInfoBean2 = mock(ModInfoBean.class);
when(modService.getInstalledMods()).thenReturn(FXCollections.observableArrayList(
modInfoBean1, modInfoBean2
));
instance.postConstruct();
assertThat(instance.modListView.getItems(), hasSize(2));
assertThat(instance.modListView.getItems(), contains(modInfoBean1, modInfoBean2));
}
}