Coverage Summary for Class: EndTurnOfActionPhase (it.polimi.ingsw.Controller.Actions)
Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
EndTurnOfActionPhase |
100%
(1/1)
|
100%
(3/3)
|
40%
(4/10)
|
72,7%
(8/11)
|
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.Misc.OptionalValue;
6 import it.polimi.ingsw.Model.Enums.GamePhase;
7 import it.polimi.ingsw.Model.Model;
8 import it.polimi.ingsw.Model.PlayerBoard;
9
10 import java.io.Serial;
11 import java.util.List;
12
13 import static it.polimi.ingsw.Misc.Utils.countSimilarClassOccurrences;
14
15 /**
16 * The Action phase is a lengthy one and its length cannot be determined. This {@link PlayerAction} enables the caller to
17 * end an Action phase on its own accord.
18 */
19 public class EndTurnOfActionPhase extends PlayerAction {
20 @Serial
21 private static final long serialVersionUID = 202L; // convention: 2 for controller, (01 -> 99) for objects
22
23 /**
24 * Create a new instance of this class with the following inputs:
25 *
26 * @param playerBoardId the ID of the current {@link PlayerBoard}
27 */
28 public EndTurnOfActionPhase(int playerBoardId) {
29 super(playerBoardId, true);
30 }
31
32 /**
33 * {@inheritDoc}
34 * <ul>
35 * <li>This action can be called only after having called one and only one {@link ChooseCloudTile} action</li>
36 * <li>The previous {@link PlayerAction}s must be either {@link ChooseCloudTile} or {@link PlayCharacterCard}</li>
37 * </ul>
38 *
39 * @param history the controller stores a {@link List} of previous {@link PlayerAction}s related to the player taking
40 * the current turn (at every new turn, the history is cleared).
41 * Some actions may use this {@link List} to check for duplicates.
42 * @param ctx a reference to {@link Model}. Some actions may use this reference to check for consistency between what
43 * the actions declares and what the Model offers.
44 * @return An empty {@link OptionalValue} in case of a successful validation. Otherwise the returned {@link OptionalValue}
45 * contains the related {@link InputValidationException}
46 */
47 @Override
48 protected OptionalValue<InputValidationException> customValidation(List<PlayerAction> history, Model ctx) {
49
50 if (countSimilarClassOccurrences(ChooseCloudTile.class, history) != 1) {
51 return OptionalValue.of(new GenericInputValidationException("History", "ChooseCloudTile action has not been executed"));
52 }
53 if (!(history.get(history.size() - 1).getClass() == ChooseCloudTile.class || (history.get(history.size() - 1).getClass() == PlayCharacterCard.class))) {
54 return OptionalValue.of(new GenericInputValidationException("History", "this action can only be executed after a ChooseCloudTile action or PlayCharacterCard action"));
55 }
56
57 return OptionalValue.empty();
58 }
59
60 @Override
61 public void unsafeExecute(Model ctx) throws Exception {
62 // reset effects through EffectTracker
63 ctx.getMutableEffects().reset();
64 ctx.getMutableTurnOrder().stepToNextPlayer();
65 if (ctx.getMutableTurnOrder().getGamePhase() != GamePhase.ACTION) {
66 if (ctx.getMutableStudentBag().getSize() > 0) {
67 ctx.refillClouds();
68 }
69 }
70 }
71
72
73 }