package com.faforever.client.map; import com.faforever.client.test.AbstractPlainJavaFxTest; import com.google.common.eventbus.EventBus; import javafx.beans.Observable; import javafx.scene.layout.Pane; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.springframework.context.ApplicationContext; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.*; import static org.mockito.Matchers.anyInt; 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 MapVaultControllerTest extends AbstractPlainJavaFxTest { @Mock private MapService mapService; @Mock private ApplicationContext applicationContext; @Mock private MapDetailController mapDetailController; @Mock private EventBus eventBus; private MapVaultController instance; @Before public void setUp() throws Exception { instance = loadController("map_vault.fxml"); instance.mapService = mapService; instance.applicationContext = applicationContext; instance.mapDetailController = mapDetailController; instance.eventBus = eventBus; when(mapDetailController.getRoot()).thenReturn(new Pane()); instance.postConstruct(); } @Test public void testEventBusRegistered() throws Exception { verify(eventBus).register(instance); } @Test public void testGetRoot() throws Exception { assertThat(instance.getRoot(), is(instance.mapVaultRoot)); assertThat(instance.getRoot().getParent(), is(nullValue())); } @Test public void testSetUpIfNecessary() throws Exception { List<MapBean> maps = new ArrayList<>(); for (int i = 0; i < 5; i++) { maps.add( MapBeanBuilder.create() .defaultValues() .displayName("Map " + i) .uid(String.valueOf(i)) .get() ); } when(mapService.getMostDownloadedMaps(anyInt())).thenReturn(CompletableFuture.completedFuture(maps)); when(mapService.getMostLikedMaps(anyInt())).thenReturn(CompletableFuture.completedFuture(maps)); when(mapService.getNewestMaps(anyInt())).thenReturn(CompletableFuture.completedFuture(maps)); when(mapService.getMostPlayedMaps(anyInt())).thenReturn(CompletableFuture.completedFuture(maps)); MapTileController mapTileController = mock(MapTileController.class); doAnswer(invocation -> new Pane()).when(mapTileController).getRoot(); when(applicationContext.getBean(MapTileController.class)).thenReturn(mapTileController); CountDownLatch latch = new CountDownLatch(3); waitUntilInitialized(instance.recommendedMapsPane, latch); waitUntilInitialized(instance.newestMapsPane, latch); waitUntilInitialized(instance.popularMapsPane, latch); instance.setUpIfNecessary(); assertTrue(latch.await(5000, TimeUnit.MILLISECONDS)); } private void waitUntilInitialized(Pane pane, CountDownLatch latch) { pane.getChildren().addListener((Observable observable) -> { if (pane.getChildren().size() == 2) { latch.countDown(); } }); } @Test public void testShowMapDetail() throws Exception { Pane pane = new Pane(); pane.setVisible(false); when(mapDetailController.getRoot()).thenReturn(pane); MapBean mapBean = MapBeanBuilder.create().defaultValues().get(); instance.onShowMapDetail(mapBean); verify(mapDetailController).setMap(mapBean); assertThat(pane.isVisible(), is(true)); } }