| 1 | package com.takenoko.asset; | |
| 2 | ||
| 3 | import com.takenoko.layers.tile.ImprovementType; | |
| 4 | import com.takenoko.layers.tile.Tile; | |
| 5 | import com.takenoko.layers.tile.TileColor; | |
| 6 | import java.security.SecureRandom; | |
| 7 | import java.util.ArrayList; | |
| 8 | import java.util.List; | |
| 9 | import java.util.Objects; | |
| 10 | import java.util.Random; | |
| 11 | import java.util.stream.Collectors; | |
| 12 | ||
| 13 | /** The deck containing all the improvement chips you can place on the tiles. */ | |
| 14 | public class TileDeck extends ArrayList<Tile> { | |
| 15 | ||
| 16 | private final Random random; | |
| 17 | private boolean canPeek; | |
| 18 | ||
| 19 | public TileDeck() { | |
| 20 | this(new SecureRandom()); | |
| 21 | } | |
| 22 | ||
| 23 | public TileDeck(Random random) { | |
| 24 | this.random = random; | |
| 25 | canPeek = false; | |
| 26 | ||
| 27 | // -------- GREEN TILES -------- | |
| 28 |
2
1. <init> : changed conditional boundary → KILLED 2. <init> : negated conditional → KILLED |
for (int i = 0; i < 6; i++) { |
| 29 | this.add(new Tile(TileColor.GREEN)); | |
| 30 | } | |
| 31 | this.add(new Tile(ImprovementType.ENCLOSURE, TileColor.GREEN)); | |
| 32 | this.add(new Tile(ImprovementType.ENCLOSURE, TileColor.GREEN)); | |
| 33 | this.add(new Tile(ImprovementType.FERTILIZER, TileColor.GREEN)); | |
| 34 | this.add(new Tile(ImprovementType.WATERSHED, TileColor.GREEN)); | |
| 35 | this.add(new Tile(ImprovementType.WATERSHED, TileColor.GREEN)); | |
| 36 | ||
| 37 | // -------- PINK TILES -------- | |
| 38 |
2
1. <init> : changed conditional boundary → KILLED 2. <init> : negated conditional → KILLED |
for (int i = 0; i < 4; i++) { |
| 39 | this.add(new Tile()); | |
| 40 | } | |
| 41 | this.add(new Tile(ImprovementType.ENCLOSURE, TileColor.PINK)); | |
| 42 | this.add(new Tile(ImprovementType.FERTILIZER, TileColor.PINK)); | |
| 43 | this.add(new Tile(ImprovementType.WATERSHED, TileColor.PINK)); | |
| 44 | ||
| 45 | // -------- YELLOW TILES -------- | |
| 46 |
2
1. <init> : changed conditional boundary → KILLED 2. <init> : negated conditional → KILLED |
for (int i = 0; i < 6; i++) { |
| 47 | this.add(new Tile(TileColor.YELLOW)); | |
| 48 | } | |
| 49 | this.add(new Tile(ImprovementType.ENCLOSURE, TileColor.YELLOW)); | |
| 50 | this.add(new Tile(ImprovementType.FERTILIZER, TileColor.YELLOW)); | |
| 51 | this.add(new Tile(ImprovementType.WATERSHED, TileColor.YELLOW)); | |
| 52 | ||
| 53 |
1
1. <init> : removed call to com/takenoko/asset/TileDeck::shuffle → TIMED_OUT |
shuffle(); |
| 54 | } | |
| 55 | ||
| 56 | /** Draw tiles from the deck. */ | |
| 57 | public void draw() { | |
| 58 | canPeek = true; | |
| 59 | } | |
| 60 | ||
| 61 | /** | |
| 62 | * Choose what tile to place on the board. | |
| 63 | * | |
| 64 | * @param tile the tile to place | |
| 65 | */ | |
| 66 | public void choose(Tile tile) { | |
| 67 | // remove the tile from the deck and put the remaining tiles back at the end of the deck, do | |
| 68 | // not shuffle | |
| 69 | ||
| 70 | List<Tile> tiles = peek(); | |
| 71 |
1
1. choose : negated conditional → KILLED |
if (!tiles.contains(tile)) { |
| 72 | throw new IllegalArgumentException("This tile is not in the last drawn tiles."); | |
| 73 | } | |
| 74 | ||
| 75 | // remove the first 3 tiles from the deck | |
| 76 |
3
1. choose : changed conditional boundary → KILLED 2. choose : negated conditional → KILLED 3. choose : negated conditional → KILLED |
for (int i = 0; i < 3 && !this.isEmpty(); i++) { |
| 77 | this.remove(0); | |
| 78 | } | |
| 79 | ||
| 80 | tiles.remove(tile); | |
| 81 | // put the remaining tiles back at the end of the deck | |
| 82 | this.addAll(tiles); | |
| 83 | canPeek = false; | |
| 84 | } | |
| 85 | ||
| 86 | public List<Tile> peek() { | |
| 87 |
1
1. peek : negated conditional → KILLED |
if (!canPeek) { |
| 88 | throw new IllegalStateException("You must draw tiles before peeking."); | |
| 89 | } | |
| 90 |
1
1. peek : replaced return value with Collections.emptyList for com/takenoko/asset/TileDeck::peek → KILLED |
return new ArrayList<>(this.stream().limit(3).toList()); |
| 91 | } | |
| 92 | ||
| 93 | private void shuffle() { | |
| 94 |
2
1. shuffle : negated conditional → TIMED_OUT 2. shuffle : changed conditional boundary → KILLED |
for (int i = 0; i < this.size(); i++) { |
| 95 | int j = random.nextInt(this.size()); | |
| 96 | Tile temp = this.get(i); | |
| 97 | this.set(i, this.get(j)); | |
| 98 | this.set(j, temp); | |
| 99 | } | |
| 100 | } | |
| 101 | ||
| 102 | @Override | |
| 103 | public boolean equals(Object o) { | |
| 104 |
2
1. equals : negated conditional → KILLED 2. equals : replaced boolean return with false for com/takenoko/asset/TileDeck::equals → KILLED |
if (this == o) return true; |
| 105 |
3
1. equals : negated conditional → KILLED 2. equals : negated conditional → KILLED 3. equals : replaced boolean return with true for com/takenoko/asset/TileDeck::equals → KILLED |
if (o == null || getClass() != o.getClass()) return false; |
| 106 |
2
1. equals : negated conditional → KILLED 2. equals : replaced boolean return with true for com/takenoko/asset/TileDeck::equals → KILLED |
if (!super.equals(o)) return false; |
| 107 | TileDeck tiles = (TileDeck) o; | |
| 108 |
2
1. equals : replaced boolean return with true for com/takenoko/asset/TileDeck::equals → SURVIVED 2. equals : negated conditional → KILLED |
return canPeek == tiles.canPeek; |
| 109 | } | |
| 110 | ||
| 111 | @Override | |
| 112 | public int hashCode() { | |
| 113 |
1
1. hashCode : replaced int return with 0 for com/takenoko/asset/TileDeck::hashCode → KILLED |
return Objects.hash(super.hashCode(), canPeek); |
| 114 | } | |
| 115 | ||
| 116 | @Override | |
| 117 | public String toString() { | |
| 118 |
1
1. toString : replaced return value with "" for com/takenoko/asset/TileDeck::toString → NO_COVERAGE |
return this.stream().map(Tile::toString).collect(Collectors.joining(", ")); |
| 119 | } | |
| 120 | } | |
Mutations | ||
| 28 |
1.1 2.2 |
|
| 38 |
1.1 2.2 |
|
| 46 |
1.1 2.2 |
|
| 53 |
1.1 |
|
| 71 |
1.1 |
|
| 76 |
1.1 2.2 3.3 |
|
| 87 |
1.1 |
|
| 90 |
1.1 |
|
| 94 |
1.1 2.2 |
|
| 104 |
1.1 2.2 |
|
| 105 |
1.1 2.2 3.3 |
|
| 106 |
1.1 2.2 |
|
| 108 |
1.1 2.2 |
|
| 113 |
1.1 |
|
| 118 |
1.1 |