| 1 | package com.takenoko.stats; | |
| 2 | ||
| 3 | import com.takenoko.engine.Board; | |
| 4 | import com.takenoko.layers.tile.ImprovementType; | |
| 5 | import com.takenoko.layers.tile.Tile; | |
| 6 | import com.takenoko.layers.tile.TileColor; | |
| 7 | import com.takenoko.vector.PositionVector; | |
| 8 | import java.util.*; | |
| 9 | ||
| 10 | public class BoardStatistics { | |
| 11 | public final Map<TileColor, Integer> tilesPlaced; | |
| 12 | public final Map<ImprovementType, Integer> improvements; | |
| 13 | ||
| 14 | public float percentageOfIrrigation; | |
| 15 | public float totalNbOfTiles; | |
| 16 | ||
| 17 | public BoardStatistics( | |
| 18 | Map<TileColor, Integer> tilesPlaced, | |
| 19 | Map<ImprovementType, Integer> improvements, | |
| 20 | float percentageOfIrrigation, | |
| 21 | float totalNbOfTiles) { | |
| 22 | this.tilesPlaced = tilesPlaced; | |
| 23 | this.improvements = improvements; | |
| 24 | this.percentageOfIrrigation = percentageOfIrrigation; | |
| 25 | this.totalNbOfTiles = totalNbOfTiles; | |
| 26 | } | |
| 27 | ||
| 28 | public BoardStatistics(BoardStatistics boardStatistics) { | |
| 29 | this.tilesPlaced = boardStatistics.tilesPlaced; | |
| 30 | this.percentageOfIrrigation = boardStatistics.percentageOfIrrigation; | |
| 31 | this.improvements = boardStatistics.improvements; | |
| 32 | this.totalNbOfTiles = boardStatistics.totalNbOfTiles; | |
| 33 | } | |
| 34 | ||
| 35 | public BoardStatistics() { | |
| 36 | this(new HashMap<>(), new HashMap<>(), 0, 0); | |
| 37 | } | |
| 38 | ||
| 39 | public void updateImprovements(ImprovementType improvementType) { | |
| 40 |
1
1. updateImprovements : negated conditional → KILLED |
if (improvementType == null) { |
| 41 | throw new IllegalArgumentException(); | |
| 42 | } | |
| 43 |
1
1. updateImprovements : negated conditional → KILLED |
if (improvements.containsKey(improvementType)) { |
| 44 |
1
1. updateImprovements : Replaced integer addition with subtraction → KILLED |
improvements.replace(improvementType, improvements.get(improvementType) + 1); |
| 45 | } else { | |
| 46 | improvements.put(improvementType, 1); | |
| 47 | } | |
| 48 | } | |
| 49 | ||
| 50 | public void updateTilesPlaced(TileColor tileColor) { | |
| 51 |
1
1. updateTilesPlaced : negated conditional → KILLED |
if (tileColor == null) { |
| 52 | throw new IllegalArgumentException(); | |
| 53 | } | |
| 54 |
1
1. updateTilesPlaced : negated conditional → KILLED |
if (tilesPlaced.containsKey(tileColor)) { |
| 55 |
1
1. updateTilesPlaced : Replaced integer addition with subtraction → TIMED_OUT |
tilesPlaced.put(tileColor, tilesPlaced.get(tileColor) + 1); |
| 56 | } else { | |
| 57 | tilesPlaced.put(tileColor, 1); | |
| 58 | } | |
| 59 | } | |
| 60 | ||
| 61 | public void analyzeBoard(Board board) { | |
| 62 |
1
1. analyzeBoard : negated conditional → KILLED |
if (board == null) { |
| 63 | throw new IllegalArgumentException(); | |
| 64 | } | |
| 65 | totalNbOfTiles = board.getTilesWithoutPond().size(); | |
| 66 | float irrigatedTiles = 0; | |
| 67 | for (Map.Entry<PositionVector, Tile> entry : board.getTilesWithoutPond().entrySet()) { | |
| 68 | Optional<ImprovementType> improvementType = entry.getValue().getImprovement(); | |
| 69 |
2
1. analyzeBoard : negated conditional → TIMED_OUT 2. analyzeBoard : Replaced float addition with subtraction → KILLED |
if (board.isIrrigatedAt(entry.getKey())) irrigatedTiles++; |
| 70 |
1
1. analyzeBoard : removed call to java/util/Optional::ifPresent → KILLED |
improvementType.ifPresent(this::updateImprovements); |
| 71 |
1
1. analyzeBoard : removed call to com/takenoko/stats/BoardStatistics::updateTilesPlaced → KILLED |
updateTilesPlaced(entry.getValue().getColor()); |
| 72 | } | |
| 73 |
2
1. analyzeBoard : Replaced float division with multiplication → KILLED 2. analyzeBoard : Replaced float multiplication with division → KILLED |
percentageOfIrrigation = irrigatedTiles / totalNbOfTiles * 100; |
| 74 | } | |
| 75 | ||
| 76 | @Override | |
| 77 | public String toString() { | |
| 78 | StringBuilder statistics = new StringBuilder(); | |
| 79 | String lineJump = "\n \t \t \t"; | |
| 80 | String indentation = "\t\t* "; | |
| 81 | statistics.append("=========== Board Related Metrics ==========="); | |
| 82 | statistics | |
| 83 | .append(lineJump) | |
| 84 | .append("\t -Total number of tiles placed : ") | |
| 85 | .append(totalNbOfTiles) | |
| 86 | .append(lineJump) | |
| 87 | .append("\t -Percentage of irrigated tiles : ") | |
| 88 | .append(percentageOfIrrigation) | |
| 89 | .append("%"); | |
| 90 | TreeMap<TileColor, Integer> sortedTilesPlaced = new TreeMap<>(tilesPlaced); | |
| 91 | statistics.append(lineJump).append("\t -Tiles placed :"); | |
| 92 | for (TileColor tileColor : sortedTilesPlaced.keySet()) { | |
| 93 | statistics | |
| 94 | .append(lineJump) | |
| 95 | .append(indentation) | |
| 96 | .append(tileColor) | |
| 97 | .append(" : ") | |
| 98 | .append(tilesPlaced.get(tileColor)); | |
| 99 | } | |
| 100 |
1
1. toString : replaced return value with "" for com/takenoko/stats/BoardStatistics::toString → TIMED_OUT |
return statistics.toString(); |
| 101 | } | |
| 102 | ||
| 103 | public BoardStatistics copy() { | |
| 104 |
1
1. copy : replaced return value with null for com/takenoko/stats/BoardStatistics::copy → NO_COVERAGE |
return new BoardStatistics(this); |
| 105 | } | |
| 106 | ||
| 107 | @Override | |
| 108 | public boolean equals(Object o) { | |
| 109 |
2
1. equals : negated conditional → NO_COVERAGE 2. equals : replaced boolean return with false for com/takenoko/stats/BoardStatistics::equals → NO_COVERAGE |
if (this == o) return true; |
| 110 |
3
1. equals : negated conditional → NO_COVERAGE 2. equals : negated conditional → NO_COVERAGE 3. equals : replaced boolean return with true for com/takenoko/stats/BoardStatistics::equals → NO_COVERAGE |
if (o == null || getClass() != o.getClass()) return false; |
| 111 | BoardStatistics that = (BoardStatistics) o; | |
| 112 |
2
1. equals : negated conditional → NO_COVERAGE 2. equals : replaced boolean return with true for com/takenoko/stats/BoardStatistics::equals → NO_COVERAGE |
return Float.compare(that.percentageOfIrrigation, percentageOfIrrigation) == 0 |
| 113 |
1
1. equals : negated conditional → NO_COVERAGE |
&& tilesPlaced.equals(that.tilesPlaced) |
| 114 |
1
1. equals : negated conditional → NO_COVERAGE |
&& improvements.equals(that.improvements); |
| 115 | } | |
| 116 | ||
| 117 | @Override | |
| 118 | public int hashCode() { | |
| 119 |
1
1. hashCode : replaced int return with 0 for com/takenoko/stats/BoardStatistics::hashCode → TIMED_OUT |
return Objects.hash(tilesPlaced, improvements, percentageOfIrrigation); |
| 120 | } | |
| 121 | ||
| 122 | public Map<ImprovementType, Integer> getImprovements() { | |
| 123 |
1
1. getImprovements : replaced return value with Collections.emptyMap for com/takenoko/stats/BoardStatistics::getImprovements → KILLED |
return improvements; |
| 124 | } | |
| 125 | ||
| 126 | public float getPercentageOfIrrigation() { | |
| 127 |
1
1. getPercentageOfIrrigation : replaced float return with 0.0f for com/takenoko/stats/BoardStatistics::getPercentageOfIrrigation → KILLED |
return percentageOfIrrigation; |
| 128 | } | |
| 129 | ||
| 130 | public float getTotalNbOfTiles() { | |
| 131 |
1
1. getTotalNbOfTiles : replaced float return with 0.0f for com/takenoko/stats/BoardStatistics::getTotalNbOfTiles → KILLED |
return totalNbOfTiles; |
| 132 | } | |
| 133 | } | |
Mutations | ||
| 40 |
1.1 |
|
| 43 |
1.1 |
|
| 44 |
1.1 |
|
| 51 |
1.1 |
|
| 54 |
1.1 |
|
| 55 |
1.1 |
|
| 62 |
1.1 |
|
| 69 |
1.1 2.2 |
|
| 70 |
1.1 |
|
| 71 |
1.1 |
|
| 73 |
1.1 2.2 |
|
| 100 |
1.1 |
|
| 104 |
1.1 |
|
| 109 |
1.1 2.2 |
|
| 110 |
1.1 2.2 3.3 |
|
| 112 |
1.1 2.2 |
|
| 113 |
1.1 |
|
| 114 |
1.1 |
|
| 119 |
1.1 |
|
| 123 |
1.1 |
|
| 127 |
1.1 |
|
| 131 |
1.1 |