Coverage Summary for Class: Card05 (it.polimi.ingsw.Model)

Class Class, % Method, % Branch, % Line, %
Card05 100% (1/1) 100% (6/6) 87,5% (14/16) 95,7% (22/23)


1 package it.polimi.ingsw.Model; 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.FailedOperationException; 7 import it.polimi.ingsw.Misc.OptionalValue; 8 import it.polimi.ingsw.Model.Enums.StateType; 9  10 import java.io.Serial; 11 import java.util.ArrayList; 12  13 /** 14  * In Setup, put the 4 No Entry tiles on this card. 15  * EFFECT: Place a No Entrytile on an Island of your choice. 16  * The first time Mother Nature ends her movement there, put the No Entry tile back onto this card 17  * DO NOT calculate influence on that Island, or place any Towers. 18  */ 19 public class Card05 extends StatefulEffect { 20  @Serial 21  private static final long serialVersionUID = 107L; // convention: 1 for model, (01 -> 99) for objects 22  23  //List containing card's tiles 24  private final ArrayList<NoEntryTile> tiles; 25  26  public Card05(Model ctx) { 27  super(5, 2, StateType.NOENTRY, ctx); 28  tiles = new ArrayList<>(4); 29  for (int i = 0; i < 4; i++) { 30  tiles.add(new NoEntryTile(this)); 31  } 32  } 33  34  /** 35  * Get card's content 36  * 37  * @return ArrayList of Objects with noEntryTile (Can be casted to {@link NoEntryTile}) 38  */ 39  public ArrayList<Object> getState() { 40  return new ArrayList<>(tiles); 41  } 42  43  /** 44  * Get card's stateType 45  * 46  * @return card's stateType 47  */ 48  public StateType getStateType() { 49  return stateType; 50  } 51  52  /** 53  * Refer to: {@link CharacterCard#overridableCheckInput(CharacterCardInput)} for further information 54  * 55  * @param input CharacterCardInput should contain: 56  * <ul> 57  * <li>A valid island's ID </li> 58  * </ul> 59  */ 60  public OptionalValue<InputValidationException> overridableCheckInput(CharacterCardInput input) { 61  if (input.getTargetIsland().isEmpty()) { 62  return OptionalValue.of(new InvalidElementException("Target Island")); // target ti not set 63  } 64  Island ti = input.getTargetIsland().get(); 65  if (ti.getId() < 0 || ti.getId() >= 12) { 66  return OptionalValue.of(new InvalidElementException("Target Island")); // target ti out of bounds for id 67  } 68  if (!this.context.getMutableIslandField().getMutableIslands().contains(ti)) { 69  return OptionalValue.of(new InvalidElementException("Target Island")); // target ti not in field 70  } // note: if island is in field then the island must also be in a group, due to how islandfield works. 71  if (tiles.size() == 0) { 72  return OptionalValue.of(new GenericInputValidationException("Card05", 73  "has finished all its NoEntryTile(s)")); 74  } 75  //all tests passed 76  return OptionalValue.empty(); 77  } 78  79  /** 80  * Refer to: {@link CharacterCard#unsafeApplyEffect(CharacterCardInput)} for further information 81  */ 82  @Override 83  protected void unsafeApplyEffect(CharacterCardInput input) throws Exception { 84  Island ti = input.getTargetIsland().get(); 85  for (IslandGroup ig : this.context.getMutableIslandField().getMutableGroups()) { 86  if (ig.contains(ti)) { 87  ig.addNoEntry(tiles.remove(0)); 88  return; 89  } 90  } 91  throw new FailedOperationException("Card05.unsafeApplyEffect", "Target Island was not contained in any IslandGroup"); 92  } 93  94  /** 95  * Add NoEntryTile to card 96  * 97  * @param tile tile to add 98  */ 99  public void tileReset(NoEntryTile tile) { 100  this.tiles.add(tile); 101  } 102  103  //test-purpose only 104 }