package games.strategy.engine.data.util;
import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import games.strategy.engine.data.GameData;
import games.strategy.engine.data.Resource;
import games.strategy.engine.data.ResourceCollection;
import games.strategy.engine.data.ResourceList;
import games.strategy.triplea.Constants;
import games.strategy.util.IntegerMap;
@RunWith(MockitoJUnitRunner.class)
public final class ResourceCollectionUtilsTest {
@Mock
private GameData data;
private Resource pus;
private Resource techTokens;
private Resource vps;
@Before
public void setUp() {
pus = createResource(Constants.PUS);
techTokens = createResource(Constants.TECH_TOKENS);
vps = createResource(Constants.VPS);
setGameResources(pus, techTokens, vps);
}
private Resource createResource(final String name) {
return new Resource(name, data);
}
private void setGameResources(final Resource... resources) {
final ResourceList gameResources = mock(ResourceList.class);
for (final Resource resource : resources) {
when(gameResources.getResource(resource.getName())).thenReturn(resource);
}
when(data.getResourceList()).thenReturn(gameResources);
}
@Test
public void testExcludeByResources_ShouldExcludeSpecifiedResources() {
final ResourceCollection unfiltered = createResourceCollection(pus, techTokens, vps);
final ResourceCollection filtered = ResourceCollectionUtils.exclude(unfiltered, pus, vps);
assertThat(filtered.getQuantity(pus), is(0));
assertThat(filtered.getQuantity(techTokens), is(unfiltered.getQuantity(techTokens)));
assertThat(filtered.getQuantity(vps), is(0));
}
private ResourceCollection createResourceCollection(final Resource... resources) {
final ResourceCollection resourceCollection = new ResourceCollection(data);
resourceCollection.add(new IntegerMap<>(Arrays.stream(resources).collect(toList()), 42));
return resourceCollection;
}
@Test
public void testExcludeByResources_ShouldIgnoreUnregisteredResources() {
final Resource gold = createResource("gold");
final ResourceCollection unfiltered = createResourceCollection(pus);
final ResourceCollection filtered = ResourceCollectionUtils.exclude(unfiltered, gold);
assertThat(filtered.getQuantity(pus), is(unfiltered.getQuantity(pus)));
}
@Test
public void testExcludeByNames_ShouldExcludeSpecifiedResources() {
final ResourceCollection unfiltered = createResourceCollection(pus, techTokens, vps);
final ResourceCollection filtered = ResourceCollectionUtils.exclude(unfiltered, pus.getName(), vps.getName());
assertThat(filtered.getQuantity(pus), is(0));
assertThat(filtered.getQuantity(techTokens), is(unfiltered.getQuantity(techTokens)));
assertThat(filtered.getQuantity(vps), is(0));
}
@Test
public void testExcludeByNames_ShouldIgnoreUnregisteredResourceNames() {
final Resource gold = createResource("gold");
final ResourceCollection unfiltered = createResourceCollection(pus);
final ResourceCollection filtered = ResourceCollectionUtils.exclude(unfiltered, gold.getName());
assertThat(filtered.getQuantity(pus), is(unfiltered.getQuantity(pus)));
}
@Test
public void testGetProductionResources_ShouldIncludeAllResourcesExceptTechTokensAndVPs() {
final Resource gold = createResource("gold");
setGameResources(gold, pus, techTokens, vps);
final ResourceCollection unfiltered = createResourceCollection(gold, pus, techTokens, vps);
final ResourceCollection filtered = ResourceCollectionUtils.getProductionResources(unfiltered);
assertThat(filtered.getQuantity(gold), is(unfiltered.getQuantity(gold)));
assertThat(filtered.getQuantity(pus), is(unfiltered.getQuantity(pus)));
assertThat(filtered.getQuantity(techTokens), is(0));
assertThat(filtered.getQuantity(vps), is(0));
}
}