|
1
|
|
package com.takenoko.actors; |
|
2
|
|
|
|
3
|
|
import com.takenoko.engine.Board; |
|
4
|
|
import com.takenoko.layers.bamboo.LayerBambooStack; |
|
5
|
|
import com.takenoko.vector.PositionVector; |
|
6
|
|
import java.util.List; |
|
7
|
|
import java.util.Map; |
|
8
|
|
import java.util.Objects; |
|
9
|
|
|
|
10
|
|
public abstract class Actor { |
|
11
|
|
PositionVector position; |
|
12
|
|
|
|
13
|
|
protected Actor(PositionVector position) { |
|
14
|
|
this.position = position; |
|
15
|
|
} |
|
16
|
|
|
|
17
|
|
/** |
|
18
|
|
* @return the position of the actor |
|
19
|
|
*/ |
|
20
|
|
public PositionVector getPosition() { |
|
21
|
1
1. getPosition : replaced return value with null for com/takenoko/actors/Actor::getPosition → KILLED
|
return position; |
|
22
|
|
} |
|
23
|
|
|
|
24
|
|
/** |
|
25
|
|
* Check if the move is possible. The actor can only move in a straight line on the board tiles. |
|
26
|
|
* |
|
27
|
|
* @param vector the vector to move the actor |
|
28
|
|
* @return true if the move is possible, false otherwise |
|
29
|
|
*/ |
|
30
|
|
protected boolean isMovePossible(PositionVector vector, Board board) { |
|
31
|
|
// check if the actor is moving in a straight line |
|
32
|
3
1. isMovePossible : negated conditional → KILLED
2. isMovePossible : negated conditional → KILLED
3. isMovePossible : negated conditional → KILLED
|
if (!(vector.r() == 0 || vector.q() == 0 || vector.s() == 0)) { |
|
33
|
1
1. isMovePossible : replaced boolean return with true for com/takenoko/actors/Actor::isMovePossible → KILLED
|
return false; |
|
34
|
|
} |
|
35
|
|
|
|
36
|
|
// check if the actor is moving on a tile |
|
37
|
3
1. isMovePossible : changed conditional boundary → KILLED
2. isMovePossible : Replaced double addition with subtraction → KILLED
3. isMovePossible : negated conditional → KILLED
|
for (int i = 0; i < vector.length() + 1; i++) { |
|
38
|
|
PositionVector ray = |
|
39
|
|
this.position.add(vector.normalize().multiply(i)).toPositionVector(); |
|
40
|
|
|
|
41
|
1
1. isMovePossible : negated conditional → KILLED
|
if (!board.isTile(ray)) { |
|
42
|
1
1. isMovePossible : replaced boolean return with true for com/takenoko/actors/Actor::isMovePossible → KILLED
|
return false; |
|
43
|
|
} |
|
44
|
|
} |
|
45
|
1
1. isMovePossible : replaced boolean return with false for com/takenoko/actors/Actor::isMovePossible → KILLED
|
return true; |
|
46
|
|
} |
|
47
|
|
|
|
48
|
|
/** |
|
49
|
|
* Returns possible moves for the actor. |
|
50
|
|
* |
|
51
|
|
* @return the possible moves |
|
52
|
|
*/ |
|
53
|
|
public List<PositionVector> getPossibleMoves(Board board) { |
|
54
|
1
1. getPossibleMoves : replaced return value with Collections.emptyList for com/takenoko/actors/Actor::getPossibleMoves → KILLED
|
return board.getTiles().keySet().stream() |
|
55
|
1
1. lambda$getPossibleMoves$0 : replaced return value with null for com/takenoko/actors/Actor::lambda$getPossibleMoves$0 → KILLED
|
.map(v -> v.sub(position).toPositionVector()) |
|
56
|
2
1. lambda$getPossibleMoves$1 : replaced boolean return with false for com/takenoko/actors/Actor::lambda$getPossibleMoves$1 → KILLED
2. lambda$getPossibleMoves$1 : replaced boolean return with true for com/takenoko/actors/Actor::lambda$getPossibleMoves$1 → KILLED
|
.filter(v -> isMovePossible(v, board)) |
|
57
|
2
1. lambda$getPossibleMoves$2 : negated conditional → KILLED
2. lambda$getPossibleMoves$2 : replaced boolean return with true for com/takenoko/actors/Actor::lambda$getPossibleMoves$2 → KILLED
|
.filter(v -> !v.equals(new PositionVector(0, 0, 0))) |
|
58
|
|
.toList(); |
|
59
|
|
} |
|
60
|
|
|
|
61
|
|
/** |
|
62
|
|
* Move the panda with a vector and try to eat bamboo. |
|
63
|
|
* |
|
64
|
|
* @param vector the vector to move the panda |
|
65
|
|
*/ |
|
66
|
|
public Map<PositionVector, LayerBambooStack> move(PositionVector vector, Board board) { |
|
67
|
1
1. move : negated conditional → KILLED
|
if (!isMovePossible(vector, board)) { |
|
68
|
|
throw new IllegalArgumentException("This move is not possible"); |
|
69
|
|
} |
|
70
|
|
position = position.add(vector).toPositionVector(); |
|
71
|
1
1. move : replaced return value with Collections.emptyMap for com/takenoko/actors/Actor::move → KILLED
|
return this.afterMove(board); |
|
72
|
|
} |
|
73
|
|
|
|
74
|
|
public abstract Map<PositionVector, LayerBambooStack> afterMove(Board board); |
|
75
|
|
|
|
76
|
|
@Override |
|
77
|
|
public boolean equals(Object o) { |
|
78
|
2
1. equals : negated conditional → KILLED
2. equals : replaced boolean return with false for com/takenoko/actors/Actor::equals → KILLED
|
if (this == o) return true; |
|
79
|
3
1. equals : negated conditional → KILLED
2. equals : negated conditional → KILLED
3. equals : replaced boolean return with true for com/takenoko/actors/Actor::equals → KILLED
|
if (o == null || getClass() != o.getClass()) return false; |
|
80
|
|
Actor actor = (Actor) o; |
|
81
|
2
1. equals : replaced boolean return with false for com/takenoko/actors/Actor::equals → KILLED
2. equals : replaced boolean return with true for com/takenoko/actors/Actor::equals → KILLED
|
return getPosition().equals(actor.getPosition()); |
|
82
|
|
} |
|
83
|
|
|
|
84
|
|
@Override |
|
85
|
|
public int hashCode() { |
|
86
|
1
1. hashCode : replaced int return with 0 for com/takenoko/actors/Actor::hashCode → KILLED
|
return Objects.hash(getPosition()); |
|
87
|
|
} |
|
88
|
|
|
|
89
|
|
public PositionVector getPositionVector() { |
|
90
|
1
1. getPositionVector : replaced return value with null for com/takenoko/actors/Actor::getPositionVector → KILLED
|
return position; |
|
91
|
|
} |
|
92
|
|
} |
| | Mutations |
| 21 |
|
1.1 Location : getPosition Killed by : com.takenoko.actors.GardenerTest.[engine:junit-jupiter]/[class:com.takenoko.actors.GardenerTest]/[nested-class:TestCopy]/[method:shouldMakeACopyOfTheGardener()] replaced return value with null for com/takenoko/actors/Actor::getPosition → KILLED
|
| 32 |
|
1.1 Location : isMovePossible Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestHashCode]/[method:shouldReturnADifferentHashcodeIfTheTwoObjectsAreNotTheSame()] negated conditional → KILLED 2.2 Location : isMovePossible Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestGetPossibleMoves]/[method:shouldReturnAListOfPossibleMoves()] negated conditional → KILLED 3.3 Location : isMovePossible Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestGetPossibleMoves]/[method:shouldReturnAListOfPossibleMoves()] negated conditional → KILLED
|
| 33 |
|
1.1 Location : isMovePossible Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestMove]/[method:shouldThrowAnExceptionIfThePandaIsNotMovingWithAValidVector()] replaced boolean return with true for com/takenoko/actors/Actor::isMovePossible → KILLED
|
| 37 |
|
1.1 Location : isMovePossible Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestHashCode]/[method:shouldReturnADifferentHashcodeIfTheTwoObjectsAreNotTheSame()] changed conditional boundary → KILLED 2.2 Location : isMovePossible Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestGetPossibleMoves]/[method:shouldReturnAListOfPossibleMoves()] Replaced double addition with subtraction → KILLED 3.3 Location : isMovePossible Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestGetPossibleMoves]/[method:shouldReturnAListOfPossibleMoves()] negated conditional → KILLED
|
| 41 |
|
1.1 Location : isMovePossible Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestHashCode]/[method:shouldReturnADifferentHashcodeIfTheTwoObjectsAreNotTheSame()] negated conditional → KILLED
|
| 42 |
|
1.1 Location : isMovePossible Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestGetPossibleMoves]/[method:shouldReturnAListOfPossibleMoves()] replaced boolean return with true for com/takenoko/actors/Actor::isMovePossible → KILLED
|
| 45 |
|
1.1 Location : isMovePossible Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestHashCode]/[method:shouldReturnADifferentHashcodeIfTheTwoObjectsAreNotTheSame()] replaced boolean return with false for com/takenoko/actors/Actor::isMovePossible → KILLED
|
| 54 |
|
1.1 Location : getPossibleMoves Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestGetPossibleMoves]/[method:shouldReturnAllPositionIfWeatherIsStorm()] replaced return value with Collections.emptyList for com/takenoko/actors/Actor::getPossibleMoves → KILLED
|
| 55 |
|
1.1 Location : lambda$getPossibleMoves$0 Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestGetPossibleMoves]/[method:shouldReturnAllPositionIfWeatherIsStorm()] replaced return value with null for com/takenoko/actors/Actor::lambda$getPossibleMoves$0 → KILLED
|
| 56 |
|
1.1 Location : lambda$getPossibleMoves$1 Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestGetPossibleMoves]/[method:shouldReturnAllPositionIfWeatherIsStorm()] replaced boolean return with false for com/takenoko/actors/Actor::lambda$getPossibleMoves$1 → KILLED 2.2 Location : lambda$getPossibleMoves$1 Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestGetPossibleMoves]/[method:shouldReturnAListOfPossibleMoves()] replaced boolean return with true for com/takenoko/actors/Actor::lambda$getPossibleMoves$1 → KILLED
|
| 57 |
|
1.1 Location : lambda$getPossibleMoves$2 Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestGetPossibleMoves]/[method:shouldReturnAllPositionIfWeatherIsStorm()] negated conditional → KILLED 2.2 Location : lambda$getPossibleMoves$2 Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestGetPossibleMoves]/[method:shouldReturnAllPositionIfWeatherIsStorm()] replaced boolean return with true for com/takenoko/actors/Actor::lambda$getPossibleMoves$2 → KILLED
|
| 67 |
|
1.1 Location : move Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestMove]/[method:shouldThrowAnExceptionIfThePandaIsNotMovingWithAValidVector()] negated conditional → KILLED
|
| 71 |
|
1.1 Location : move Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestAfterMove]/[method:shouldEatABambooIfThereIsOne()] replaced return value with Collections.emptyMap for com/takenoko/actors/Actor::move → KILLED
|
| 78 |
|
1.1 Location : equals Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestEquals]/[method:shouldReturnFalseIfTheTwoObjectsAreOfDifferentClasses()] negated conditional → KILLED 2.2 Location : equals Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestEquals]/[method:equals_shouldReturnTrueIfTheTwoObjectsAreTheSame()] replaced boolean return with false for com/takenoko/actors/Actor::equals → KILLED
|
| 79 |
|
1.1 Location : equals Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestEquals]/[method:shouldReturnTrueIfTheTwoObjectsAreEqual()] negated conditional → KILLED 2.2 Location : equals Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestEquals]/[method:shouldReturnFalseIfTheTwoObjectsAreOfDifferentClasses()] negated conditional → KILLED 3.3 Location : equals Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestEquals]/[method:shouldReturnFalseIfTheTwoObjectsAreOfDifferentClasses()] replaced boolean return with true for com/takenoko/actors/Actor::equals → KILLED
|
| 81 |
|
1.1 Location : equals Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestEquals]/[method:shouldReturnTrueIfTheTwoObjectsAreEqual()] replaced boolean return with false for com/takenoko/actors/Actor::equals → KILLED 2.2 Location : equals Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestEquals]/[method:shouldReturnFalseIfTheTwoObjectsAreNotTheSame()] replaced boolean return with true for com/takenoko/actors/Actor::equals → KILLED
|
| 86 |
|
1.1 Location : hashCode Killed by : com.takenoko.actors.PandaTest.[engine:junit-jupiter]/[class:com.takenoko.actors.PandaTest]/[nested-class:TestHashCode]/[method:shouldReturnADifferentHashcodeIfTheTwoObjectsAreNotTheSame()] replaced int return with 0 for com/takenoko/actors/Actor::hashCode → KILLED
|
| 90 |
|
1.1 Location : getPositionVector Killed by : com.takenoko.actors.GardenerTest.[engine:junit-jupiter]/[class:com.takenoko.actors.GardenerTest]/[nested-class:TestConstructor]/[method:shouldInstantiateTheGardenerAtTheOrigin()] replaced return value with null for com/takenoko/actors/Actor::getPositionVector → KILLED
|