Coverage Summary for Class: ChooseCloudTile (it.polimi.ingsw.Controller.Actions)
Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
ChooseCloudTile |
100%
(1/1)
|
100%
(3/3)
|
72,2%
(13/18)
|
87,5%
(21/24)
|
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.Misc.OptionalValue;
7 import it.polimi.ingsw.Model.Cloud;
8 import it.polimi.ingsw.Model.Model;
9 import it.polimi.ingsw.Model.PlayerBoard;
10
11 import java.io.Serial;
12 import java.util.List;
13
14 import static it.polimi.ingsw.Misc.Utils.countSimilarClassOccurrences;
15
16 /**
17 * {@link PlayerAction} allowing a user to choose one of many cloud tiles present on the gameboard. This action is
18 * linked to the Action Phase
19 */
20 public class ChooseCloudTile extends PlayerAction {
21
22 @Serial
23 private static final long serialVersionUID = 201L; // convention: 2 for controller, (01 -> 99) for objects
24 private final int selectedTile;
25
26 /**
27 * Create a new instance of this class with the following inputs:
28 *
29 * @param playerBoardId the ID of the current {@link PlayerBoard}
30 * @param selectedTile the ID of the {@link Cloud} the player has chosen
31 */
32 public ChooseCloudTile(int playerBoardId, int selectedTile) {
33 super(playerBoardId, true);
34 this.selectedTile = selectedTile;
35 }
36
37 /**
38 * {@inheritDoc}
39 * <ul>
40 * <li>This action can be called only after having called one and only one {@link MoveMotherNature} action</li>
41 * <li>The previous {@link PlayerAction}s must be either {@link MoveMotherNature} or {@link PlayCharacterCard}</li>
42 * <li>The distance declared to move must be within acceptable ranges</li>
43 * <li>The Player who calls the action must have enough space in its "entrance" field to allow for all pawns on the
44 * tile to be transferred</li>
45 * <li>The selected cloud tile must not be empty (unless no other non-empty cloud tiles are present)</li>
46 * </ul>
47 *
48 * @param history the controller stores a {@link List} of previous {@link PlayerAction}s related to the player taking
49 * the current turn (at every new turn, the history is cleared).
50 * Some actions may use this {@link List} to check for duplicates.
51 * @param ctx a reference to {@link Model}. Some actions may use this reference to check for consistency between what
52 * the actions declares and what the Model offers.
53 * @return An empty {@link OptionalValue} in case of a successful validation. Otherwise the returned {@link OptionalValue}
54 * contains the related {@link InputValidationException}
55 */
56 @Override
57 protected OptionalValue<InputValidationException> customValidation(List<PlayerAction> history, Model ctx) {
58 if (countSimilarClassOccurrences(MoveMotherNature.class, history) != 1) {
59 return OptionalValue.of(new GenericInputValidationException("History", "MoveMotherNature action has not been executed"));
60 }
61 if (!(history.get(history.size() - 1).getClass() == MoveMotherNature.class || (history.get(history.size() - 1).getClass() == PlayCharacterCard.class))) {
62 return OptionalValue.of(new GenericInputValidationException("History", "This action can only be executed after a MoveMotherNature action or PlayCharacterCard action"));
63 }
64 if (!(this.selectedTile >= 0 && selectedTile <= ctx.getClouds().size() - 1)) {
65 return OptionalValue.of(new InvalidElementException("Cloud"));
66 }
67 PlayerBoard caller = ctx.getMutableTurnOrder().getMutableCurrentPlayer();
68 Cloud selectedCloud = ctx.getClouds().get(selectedTile);
69 if (!(caller.getEntranceSpaceLeft() >= selectedCloud.getContents().size())) {
70 return OptionalValue.of(new GenericInputValidationException("Entrance",
71 "can't contain " + selectedCloud.getContents().size()
72 + " elements without overflowing."));
73 }
74 if (ctx.getClouds().stream().anyMatch(cloud -> cloud.getContents().size() != 0)) {
75 if (selectedCloud.getContents().size() == 0) {
76 return OptionalValue.of(new GenericInputValidationException("Cloud",
77 "has already been emptied"));
78 }
79 }
80 return OptionalValue.empty();
81 }
82
83 @Override
84 public void unsafeExecute(Model ctx) {
85 Cloud selectedCloud = ctx.getClouds().get(selectedTile); //get cloud
86 try {
87 ctx.getMutableTurnOrder()
88 .getMutableCurrentPlayer()
89 .addStudentsToEntrance(selectedCloud.extractContents());//fill playerboard's entrance
90 } catch (Exception e) {
91 e.printStackTrace();
92 }
93 }
94 }