1 | package com.takenoko.objective; | |
2 | ||
3 | import com.takenoko.engine.Board; | |
4 | import com.takenoko.engine.BotState; | |
5 | import com.takenoko.vector.PositionVector; | |
6 | import java.util.*; | |
7 | import java.util.stream.Stream; | |
8 | ||
9 | /** Objective is to complete a certain number of single gardener objectives. */ | |
10 | public class MultipleGardenerObjective extends Objective { | |
11 | ||
12 | final SingleGardenerObjective objective; | |
13 | private final int numberOfTimes; | |
14 | ||
15 | public MultipleGardenerObjective( | |
16 | SingleGardenerObjective objective, int numberOfTimes, int points) { | |
17 | super(ObjectiveType.GARDENER, ObjectiveState.NOT_ACHIEVED, points); | |
18 | this.objective = objective; | |
19 | this.numberOfTimes = numberOfTimes; | |
20 | } | |
21 | ||
22 | public MultipleGardenerObjective( | |
23 | MultipleGardenerObjective multipleGardenerObjective, int points) { | |
24 | this( | |
25 | multipleGardenerObjective.objective.copy(), | |
26 | multipleGardenerObjective.numberOfTimes, | |
27 | points); | |
28 | } | |
29 | ||
30 | @Override | |
31 | public void verify(Board board, BotState botState) { | |
32 |
2
1. verify : changed conditional boundary → KILLED 2. verify : negated conditional → KILLED |
if (this.objective.getMatchingPositions(board).size() >= numberOfTimes) { |
33 | this.state = ObjectiveState.ACHIEVED; | |
34 | } | |
35 | } | |
36 | ||
37 | @Override | |
38 | public void reset() { | |
39 | this.state = ObjectiveState.NOT_ACHIEVED; | |
40 | } | |
41 | ||
42 | @Override | |
43 | public MultipleGardenerObjective copy() { | |
44 |
1
1. copy : replaced return value with null for com/takenoko/objective/MultipleGardenerObjective::copy → KILLED |
return new MultipleGardenerObjective(this, 0); |
45 | } | |
46 | ||
47 | @Override | |
48 | public float getCompletion(Board board, BotState botState) { | |
49 | // spotless:off | |
50 | List<Integer> bambooCounts = | |
51 | objective.getEligiblePositions(board).stream() | |
52 |
1
1. lambda$getCompletion$0 : replaced int return with 0 for com/takenoko/objective/MultipleGardenerObjective::lambda$getCompletion$0 → SURVIVED |
.sorted(Comparator.comparingInt(v -> board.getBambooAt((PositionVector) v).getBambooCount()) |
53 | .reversed()) | |
54 | .limit(numberOfTimes) | |
55 |
1
1. lambda$getCompletion$1 : replaced Integer return value with 0 for com/takenoko/objective/MultipleGardenerObjective::lambda$getCompletion$1 → KILLED |
.map(v -> board.getBambooAt(v).getBambooCount()) |
56 | .toList(); | |
57 | Stream<Integer> bambooCountFilled = | |
58 | Stream.concat( | |
59 | bambooCounts.stream(), | |
60 |
1
1. getCompletion : Replaced long subtraction with addition → KILLED |
Stream.generate(() -> 0).limit((long) numberOfTimes - bambooCounts.size())); |
61 |
1
1. getCompletion : replaced float return with 0.0f for com/takenoko/objective/MultipleGardenerObjective::getCompletion → KILLED |
return 1 - ((float) bambooCountFilled |
62 |
2
1. lambda$getCompletion$3 : Replaced integer subtraction with addition → KILLED 2. lambda$getCompletion$3 : replaced Integer return value with 0 for com/takenoko/objective/MultipleGardenerObjective::lambda$getCompletion$3 → KILLED |
.map(v -> Math.abs(v - objective.getTargetSize())) |
63 | .reduce(0, Integer::sum) | |
64 |
3
1. getCompletion : Replaced integer multiplication with division → KILLED 2. getCompletion : Replaced float division with multiplication → KILLED 3. getCompletion : Replaced float subtraction with addition → KILLED |
/ (numberOfTimes * objective.getTargetSize())); |
65 | // spotless:on | |
66 | } | |
67 | ||
68 | public List<PositionVector> getPositionsToComplete(Board board) { | |
69 |
1
1. getPositionsToComplete : replaced return value with Collections.emptyList for com/takenoko/objective/MultipleGardenerObjective::getPositionsToComplete → TIMED_OUT |
return objective.getPositionsToComplete(board); |
70 | } | |
71 | ||
72 | @Override | |
73 | public boolean equals(Object o) { | |
74 |
2
1. equals : replaced boolean return with false for com/takenoko/objective/MultipleGardenerObjective::equals → TIMED_OUT 2. equals : negated conditional → KILLED |
if (this == o) return true; |
75 |
3
1. equals : negated conditional → KILLED 2. equals : negated conditional → KILLED 3. equals : replaced boolean return with true for com/takenoko/objective/MultipleGardenerObjective::equals → KILLED |
if (o == null || getClass() != o.getClass()) return false; |
76 | MultipleGardenerObjective that = (MultipleGardenerObjective) o; | |
77 |
3
1. equals : negated conditional → KILLED 2. equals : negated conditional → KILLED 3. equals : replaced boolean return with true for com/takenoko/objective/MultipleGardenerObjective::equals → KILLED |
return numberOfTimes == that.numberOfTimes && objective.equals(that.objective); |
78 | } | |
79 | ||
80 | @Override | |
81 | public int hashCode() { | |
82 |
1
1. hashCode : replaced int return with 0 for com/takenoko/objective/MultipleGardenerObjective::hashCode → KILLED |
return Objects.hash(objective, numberOfTimes); |
83 | } | |
84 | ||
85 | @Override | |
86 | public String toString() { | |
87 |
1
1. toString : replaced return value with "" for com/takenoko/objective/MultipleGardenerObjective::toString → TIMED_OUT |
return "Multiple Gardener Objective <" |
88 | + objective.toString() | |
89 | + ", " | |
90 | + numberOfTimes | |
91 | + " times>"; | |
92 | } | |
93 | } | |
Mutations | ||
32 |
1.1 2.2 |
|
44 |
1.1 |
|
52 |
1.1 |
|
55 |
1.1 |
|
60 |
1.1 |
|
61 |
1.1 |
|
62 |
1.1 2.2 |
|
64 |
1.1 2.2 3.3 |
|
69 |
1.1 |
|
74 |
1.1 2.2 |
|
75 |
1.1 2.2 3.3 |
|
77 |
1.1 2.2 3.3 |
|
82 |
1.1 |
|
87 |
1.1 |