Coverage Summary for Class: PlayAssistantCard (it.polimi.ingsw.Controller.Actions)
| Class | Class, % | Method, % | Branch, % | Line, % |
|---|---|---|---|---|
| PlayAssistantCard | 100% (1/1) | 100% (3/3) | 75% (9/12) | 94,4% (17/18) |
1 package it.polimi.ingsw.Controller.Actions; 2 3 import it.polimi.ingsw.Exceptions.Input.GenericInputValidationException; 4 import it.polimi.ingsw.Exceptions.Input.InputValidationException; 5 import it.polimi.ingsw.Exceptions.Input.InvalidElementException; 6 import it.polimi.ingsw.Exceptions.Operation.OperationException; 7 import it.polimi.ingsw.Misc.OptionalValue; 8 import it.polimi.ingsw.Model.AssistantCard; 9 import it.polimi.ingsw.Model.Enums.GamePhase; 10 import it.polimi.ingsw.Model.Model; 11 import it.polimi.ingsw.Model.PlayerBoard; 12 import it.polimi.ingsw.Model.TurnOrder; 13 14 import java.io.Serial; 15 import java.util.List; 16 17 18 /** 19 * This {@link PlayerAction} allows the caller to select the desired assistant card to be played this round. This action 20 * is linked to the Setup (Preparation) Phase. 21 */ 22 public class PlayAssistantCard extends PlayerAction { 23 @Serial 24 private static final long serialVersionUID = 206L; // convention: 2 for controller, (01 -> 99) for objects 25 26 private final int selectedAssistant; 27 28 /** 29 * Create a new instance of this class with the following inputs: 30 * 31 * @param playerBoardId the ID of the current {@link PlayerBoard} 32 * @param selectedAssistant the priority of the {@link AssistantCard} to be selected 33 */ 34 public PlayAssistantCard(int playerBoardId, int selectedAssistant) { 35 super(playerBoardId, true); 36 this.selectedAssistant = selectedAssistant - 1; 37 } 38 39 /** 40 * {@inheritDoc} 41 * <ul> 42 * <li>The {@link GamePhase} must be {@link GamePhase#SETUP}</li> 43 * <li>The selected assistant card must be within bounds (always greater or equal to 0, always lesser or equal to the size of 44 * the player's assistants deck</li> 45 * <li>The player must play a card that has not been chosen by other players before (unless there are no other cards left to choose from)</li> 46 * <li>The selected {@link AssistantCard} can only be used once by the player</li> 47 * </ul> 48 * 49 * @param history the controller stores a {@link List} of previous {@link PlayerAction}s related to the player taking 50 * the current turn (at every new turn, the history is cleared). 51 * Some actions may use this {@link List} to check for duplicates. 52 * @param ctx a reference to {@link Model}. Some actions may use this reference to check for consistency between what 53 * the actions declares and what the Model offers. 54 * @return An empty {@link OptionalValue} in case of a successful validation. Otherwise the returned {@link OptionalValue} 55 * contains the related {@link InputValidationException} 56 */ 57 @Override 58 protected OptionalValue<InputValidationException> customValidation(List<PlayerAction> history, Model ctx) { 59 PlayerBoard currentPlayer = ctx.getMutableTurnOrder().getMutableCurrentPlayer(); 60 TurnOrder turnOrder = ctx.getMutableTurnOrder(); 61 if (ctx.getMutableTurnOrder().getGamePhase() != GamePhase.SETUP) { 62 return OptionalValue.of(new GenericInputValidationException("Assitant Card", "may only be used during the setup phase")); 63 } 64 if (!(this.selectedAssistant >= 0 && this.selectedAssistant <= currentPlayer.getMutableAssistantCards().size() - 1)) { 65 return OptionalValue.of(new InvalidElementException("Assitant Card")); 66 } 67 AssistantCard selectedCard = currentPlayer.getMutableAssistantCards().get(selectedAssistant); 68 if (selectedCard.getUsed()) { 69 return OptionalValue.of(new GenericInputValidationException("Assitant Card", "can only be used once")); 70 } 71 if (ctx.getMutableTurnOrder().isAlreadyInSelection(selectedCard) && turnOrder.canPlayUniqueCard(currentPlayer)) { 72 return OptionalValue.of(new GenericInputValidationException("Assitant Card", "has already been selected by another player")); 73 } 74 return OptionalValue.empty(); 75 } 76 77 public void unsafeExecute(Model ctx) throws OperationException { 78 PlayerBoard pb = ctx.getMutableTurnOrder().getMutableCurrentPlayer(); 79 AssistantCard sa = pb.getMutableAssistantCards().get(selectedAssistant); 80 ctx.getMutableTurnOrder().setSelectedCard(pb, sa); 81 ctx.getMutableTurnOrder().stepToNextPlayer(); 82 } 83 }