Coverage Summary for Class: StudentBag (it.polimi.ingsw.Model)
| Class | Class, % | Method, % | Branch, % | Line, % |
|---|---|---|---|---|
| StudentBag | 100% (1/1) | 100% (7/7) | 85,7% (12/14) | 91,3% (21/23) |
1 package it.polimi.ingsw.Model; 2 3 import it.polimi.ingsw.Exceptions.Container.EmptyContainerException; 4 import it.polimi.ingsw.Misc.Utils; 5 import it.polimi.ingsw.Model.Enums.PawnColour; 6 7 import java.io.Serial; 8 import java.io.Serializable; 9 import java.util.ArrayList; 10 import java.util.List; 11 12 /** 13 * The StudentBag contains a limited number of {@link PawnColour} ordered randomly. 14 */ 15 public class StudentBag implements Serializable { 16 @Serial 17 private static final long serialVersionUID = 130L; // convention: 1 for model, (01 -> 99) for objects 18 private ArrayList<PawnColour> studentBag; 19 private boolean isEmpty; 20 21 /** 22 * Construct the bag 23 * 24 * @param numOfStudentsPerColour the number of each color of students to put in the bag 25 */ 26 public StudentBag(int numOfStudentsPerColour) { 27 this.studentBag = new ArrayList<>(numOfStudentsPerColour * PawnColour.values().length); 28 for (PawnColour colour : 29 PawnColour.values()) { 30 for (int i = 0; i < numOfStudentsPerColour; i++) { 31 studentBag.add(colour); 32 } 33 } 34 Utils.shuffle(this.studentBag); 35 this.isEmpty = false; 36 } 37 38 /** 39 * Check to see if the bag is empty 40 * 41 * @return true if the bag is empty 42 */ 43 public boolean isEmpty() { 44 return this.isEmpty; 45 } 46 47 /** 48 * Extract multiple {@link PawnColour}s at once 49 * 50 * @param extractions number of maximum extractions to carry out. The number of extracted students may be lower than the 51 * number specified as input, if the bag empties out during the extraction 52 * @return an Unmodifiable {@link List} containing the extracted {@link PawnColour} 53 */ 54 public List<PawnColour> multipleExtraction(int extractions) { 55 List<PawnColour> extracted = new ArrayList<>(); 56 for (int i = 0; i < extractions && !this.isEmpty; i++) { 57 try { 58 extracted.add(this.extract()); 59 } catch (EmptyContainerException e) { 60 // this catch clause should never be executed 61 throw new RuntimeException(e); 62 } 63 } 64 return List.copyOf(extracted); 65 } 66 67 /** 68 * Extract a single {@link PawnColour} from the bag 69 * 70 * @return the extracted student 71 * @throws EmptyContainerException if the bag is empty 72 */ 73 public PawnColour extract() throws EmptyContainerException { 74 if (this.isEmpty) throw new EmptyContainerException("StudentBag"); 75 if (this.getSize() == 1) this.isEmpty = true; 76 return this.studentBag.remove(this.studentBag.size() - 1); 77 } 78 79 /** 80 * Check the remaining students in the bag 81 * 82 * @return the size of the bag 83 */ 84 public int getSize() { 85 return studentBag.size(); 86 } 87 88 /** 89 * Put a student back in the bag and shuffle it in. 90 * 91 * @param colour the {@link PawnColour} to add back to the bag 92 */ 93 public void appendAndShuffle(PawnColour colour) { 94 if (this.getSize() == 0) this.isEmpty = false; 95 this.studentBag.add(colour); 96 Utils.shuffle(this.studentBag); 97 } 98 99 /** 100 * Used to sanitize {@link Model}. Removes information about the internal contents of the bag, making the spoofing of 101 * technically hidden information impossible on the client side. 102 */ 103 public void removeContentReference() { 104 this.studentBag = null; 105 } 106 }