Coverage Summary for Class: Card11 (it.polimi.ingsw.Model)
| Class | Class, % | Method, % | Branch, % | Line, % | 
|---|---|---|---|---|
| Card11 | 100% (1/1) | 100% (5/5) | 93,8% (15/16) | 85,2% (23/27) | 
1 package it.polimi.ingsw.Model; 2 3 import it.polimi.ingsw.Exceptions.Container.EmptyContainerException; 4 import it.polimi.ingsw.Exceptions.Input.GenericInputValidationException; 5 import it.polimi.ingsw.Exceptions.Input.InputValidationException; 6 import it.polimi.ingsw.Exceptions.Input.InvalidElementException; 7 import it.polimi.ingsw.Exceptions.Operation.FailedOperationException; 8 import it.polimi.ingsw.Logger; 9 import it.polimi.ingsw.Misc.OptionalValue; 10 import it.polimi.ingsw.Model.Enums.PawnColour; 11 import it.polimi.ingsw.Model.Enums.StateType; 12 13 import java.io.Serial; 14 import java.util.ArrayList; 15 import java.util.Arrays; 16 17 /** 18 * In Setup, draw 4 Students and place them on this card <br> 19 * EFFECT: Take 1 Student from this card and place it in 20 * your Dining Room. Then, draw a new Student from the 21 * Bag and place it on this card. 22 */ 23 public class Card11 extends StatefulEffect { 24 @Serial 25 private static final long serialVersionUID = 113L; // convention: 1 for model, (01 -> 99) for objects 26 27 private final PawnColour[] students = new PawnColour[4]; 28 29 public Card11(Model ctx) { 30 super(11, 2, StateType.PAWNCOLOUR, ctx); 31 for (int i = 0; i < 4; i++) { 32 try { 33 this.students[i] = ctx.getMutableStudentBag().extract(); 34 } catch (EmptyContainerException e) { 35 // should never happen 36 Logger.severe("student bag was found empty while adding a student to Card11. Critical, unrecoverable, error"); 37 throw new RuntimeException(e); 38 } 39 } 40 } 41 42 public ArrayList<Object> getState() { 43 return new ArrayList<>(Arrays.asList(students)); 44 } 45 46 public StateType getStateType() { 47 return stateType; 48 } 49 50 /** 51 * Refer to: {@link CharacterCard#overridableCheckInput(CharacterCardInput)} for further information 52 * 53 * @param input CharacterCardInput should contain: 54 * <ul> 55 * <li>A valid pawnColour from card's state </li> 56 * </ul> 57 */ 58 @Override 59 public OptionalValue<InputValidationException> overridableCheckInput(CharacterCardInput input) { 60 if (input.getTargetPawn().isEmpty()) { 61 return OptionalValue.of(new InvalidElementException("Target Pawn Colour")); 62 } 63 // find if the target pawn colour is present in the card's stored pawn 64 if (Arrays.stream(this.students).noneMatch(cell -> cell == input.getTargetPawn().get())) { 65 return OptionalValue.of(new InvalidElementException("Target Pawn Colour")); 66 } 67 68 PlayerBoard playerBoard = input.getCaller(); 69 // validate size of dining room 70 if (playerBoard.isDiningRoomFull(input.getTargetPawn().get())) { 71 return OptionalValue.of(new GenericInputValidationException("Dining Room", 72 "can't contain " + input.getTargetPawn().get() 73 + "without overflowing.")); 74 } 75 if (context.getMutableStudentBag().getSize() == 0) { 76 return OptionalValue.of(new GenericInputValidationException("Student Bag", "is empty")); 77 } 78 //all tests passed 79 return OptionalValue.empty(); 80 } 81 82 /** 83 * Refer to: {@link CharacterCard#unsafeApplyEffect(CharacterCardInput)} for further information 84 */ 85 @Override 86 protected void unsafeApplyEffect(CharacterCardInput input) throws Exception { 87 PawnColour movedPawn = input.getTargetPawn().get(); 88 //add target pawn to caller's dining room 89 this.context.addStudentToDiningRoom(movedPawn, input.getCaller()); 90 // find first occurrence of same target pawn in card state and swap it with a new pawn 91 for (int i = 0; i < 4; i++) { 92 if (this.students[i] == movedPawn) { 93 this.students[i] = context.getMutableStudentBag().extract(); 94 return; 95 } 96 } 97 throw new FailedOperationException("Card011.unsafeApplyEffect", "Target pawn was not contained in card's state"); 98 } 99 100 //test-purpose only 101 }