package games.strategy.triplea.ui; 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 java.util.Collection; import java.util.Collections; 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.Attachable; import games.strategy.engine.data.GameData; import games.strategy.engine.data.PlayerID; import games.strategy.engine.data.Resource; import games.strategy.engine.data.ResourceList; import games.strategy.triplea.Constants; import games.strategy.triplea.attachments.UserActionAttachment; import games.strategy.util.IntegerMap; @RunWith(MockitoJUnitRunner.class) public final class UserActionPanelTest { @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 testCanPlayerAffordUserAction_ShouldReturnFalseWhenUserActionCostGreaterThanPlayerPUs() { final PlayerID player = createPlayerWithResources(pus); final UserActionAttachment userAction = createUserActionWithCost(player.getResources().getQuantity(pus) + 1); final boolean canAffordUserAction = UserActionPanel.canPlayerAffordUserAction(player, userAction); assertThat(canAffordUserAction, is(false)); } private PlayerID createPlayerWithResources(final Resource... resources) { final PlayerID player = new PlayerID("player", data); player.getResources().add(new IntegerMap<>(Arrays.stream(resources).collect(toList()), 42)); return player; } private UserActionAttachment createUserActionWithCost(final int costInPUs) { final UserActionAttachment userAction = new UserActionAttachment("userAction", mock(Attachable.class), data); userAction.setCostPU(costInPUs); return userAction; } @Test public void testCanPlayerAffordUserAction_ShouldReturnTrueWhenUserActionCostEqualToPlayerPUs() { final PlayerID player = createPlayerWithResources(pus); final UserActionAttachment userAction = createUserActionWithCost(player.getResources().getQuantity(pus)); final boolean canAffordUserAction = UserActionPanel.canPlayerAffordUserAction(player, userAction); assertThat(canAffordUserAction, is(true)); } @Test public void testCanPlayerAffordUserAction_ShouldReturnTrueWhenUserActionCostLessThanPlayerPUs() { final PlayerID player = createPlayerWithResources(pus); final UserActionAttachment userAction = createUserActionWithCost(player.getResources().getQuantity(pus) - 1); final boolean canAffordUserAction = UserActionPanel.canPlayerAffordUserAction(player, userAction); assertThat(canAffordUserAction, is(true)); } @Test public void testCanPlayerAffordUserAction_ShouldReturnTrueWhenUserActionCostIsZeroAndPlayerPUsIsZero() { final PlayerID player = createPlayerWithResources(); final UserActionAttachment userAction = createUserActionWithCost(0); final boolean canAffordUserAction = UserActionPanel.canPlayerAffordUserAction(player, userAction); assertThat(canAffordUserAction, is(true)); } @Test public void testCanSpendResourcesOnUserActions_ShouldReturnFalseWhenNoUserActionsPresent() { final Collection<UserActionAttachment> userActions = Collections.emptyList(); final boolean canSpendResources = UserActionPanel.canSpendResourcesOnUserActions(userActions); assertThat(canSpendResources, is(false)); } @Test public void testCanSpendResourcesOnUserActions_ShouldReturnFalseWhenNoUserActionHasCost() { final Collection<UserActionAttachment> userActions = Arrays.asList( createUserActionWithCost(0), createUserActionWithCost(0)); final boolean canSpendResources = UserActionPanel.canSpendResourcesOnUserActions(userActions); assertThat(canSpendResources, is(false)); } @Test public void testCanSpendResourcesOnUserActions_ShouldReturnTrueWhenAtLeastOneUserActionHasCost() { final Collection<UserActionAttachment> userActions = Arrays.asList( createUserActionWithCost(0), createUserActionWithCost(5)); final boolean canSpendResources = UserActionPanel.canSpendResourcesOnUserActions(userActions); assertThat(canSpendResources, is(true)); } }