Coverage Summary for Class: CharacterCard (it.polimi.ingsw.Model)
Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
CharacterCard |
100%
(1/1)
|
85,7%
(6/7)
|
83,3%
(5/6)
|
82,4%
(14/17)
|
1 package it.polimi.ingsw.Model;
2
3 import it.polimi.ingsw.Exceptions.Input.InputValidationException;
4 import it.polimi.ingsw.Exceptions.Input.InvalidElementException;
5 import it.polimi.ingsw.Misc.OptionalValue;
6
7 import java.io.Serial;
8 import java.io.Serializable;
9
10 public abstract class CharacterCard implements Serializable {
11 @Serial
12 private static final long serialVersionUID = 115L; // convention: 1 for model, (01 -> 99) for objects
13
14 protected final int id;
15 protected final int cost;
16 protected final Model context;
17 protected int timeUsed;
18
19 public CharacterCard(int id, int cost, Model context) {
20 this.id = id;
21 this.cost = cost;
22 this.timeUsed = 0;
23 this.context = context;
24 }
25
26 public final int getId() {
27 return this.id;
28 }
29
30 public final int getCost() {
31 return this.timeUsed > 0 ? this.cost + 1 : this.cost;
32 }
33
34 public final int getTimeUsed() {
35 return this.timeUsed;
36 }
37
38 /**
39 * This function checks whether the correct input has been provided. It should always be called BEFORE calling an
40 * unsafeApplyEffect. Keep in mind this function does not alterate the gamestate.
41 *
42 * @param input user's input object
43 * @return a non empty {@link OptionalValue} containing a validation error. Or an empty one when the input is correct
44 */
45 public final OptionalValue<InputValidationException> checkInput(CharacterCardInput input) {
46 if (input.getCaller() == null || !input.getCaller().getNickname().equals(this.context.getMutableTurnOrder().getMutableCurrentPlayer().getNickname())) {
47
48 return OptionalValue.of(new InvalidElementException("Card Caller"));
49 }
50 return overridableCheckInput(input);
51 }
52
53 /**
54 * This function checks whether the correct input has been provided. It is part of the checkInput function.
55 * Keep in mind this function does not alterate the gamestate.
56 * NOTE: checkInput(input) by default checks whether the correct player has called the card, then relays all other
57 * checks to this function. So don't check the correct user in this function as it is pointless.
58 *
59 * @param input user's input object
60 * @return a non empty {@link OptionalValue} containing a validation error. Or an empty one when the input is correct
61 */
62 protected abstract OptionalValue<InputValidationException> overridableCheckInput(CharacterCardInput input);
63
64
65 /**
66 * This method must be called after checking user's input
67 * Play
68 *
69 * @param input a {@link CharacterCardInput} object, the same used during validation
70 */
71 public final void unsafeUseCard(CharacterCardInput input) {
72 try { // we should never get an exception now, if we do we crash
73 unsafeApplyEffect(input);
74 } catch (Exception e) {
75 e.printStackTrace();
76 }
77 addUse();
78 }
79
80 /**
81 * This method must be called after {@link #checkInput(CharacterCardInput)}
82 * Execute CharacterCard's effect (NOTE: keep in mind this funcion DOES ALTERATE the gamestate)
83 *
84 * @param input verified user's input
85 * @throws Exception not related to user's input and not recoverable
86 */
87 protected abstract void unsafeApplyEffect(CharacterCardInput input) throws Exception;
88
89 private void addUse() {
90 this.timeUsed++;
91 }
92 }