package org.drooms.impl.util;
import org.assertj.core.api.Assertions;
import org.drooms.api.Node;
import org.drooms.api.Player;
import org.drooms.api.Playground;
import org.drooms.impl.DefaultGame;
import org.drooms.impl.PlayerPosition;
import org.drooms.impl.logic.PathTrackerTest;
import org.junit.Assert;
import org.junit.Test;
import java.util.*;
public class CollisionDetectionTest {
private static final Playground PLAYGROUND = new DefaultGame().buildPlayground("test", PathTrackerTest.class
.getResourceAsStream("testing.playground"));
private static Deque<Node> toPlayer(Node... positions) {
return new LinkedList<>(Arrays.asList(positions));
}
private static Node SHARED_NODE = PLAYGROUND.getNodeAt(1, 1);
private static Node COLLISION_NODE = PLAYGROUND.getNodeAt(5, 6);
private static Node HEAD_COLLISION_NODE = PLAYGROUND.getNodeAt(11, 11);
private static Node WALL_NODE = PLAYGROUND.getNodeAt(10, 15);
private static Deque<Node> PLAYER_COLLIDED_WITH_ITSELF = CollisionDetectionTest.toPlayer(
CollisionDetectionTest.SHARED_NODE,
CollisionDetectionTest.PLAYGROUND.getNodeAt(1, 2),
CollisionDetectionTest.PLAYGROUND.getNodeAt(2, 2),
CollisionDetectionTest.PLAYGROUND.getNodeAt(2, 1),
CollisionDetectionTest.SHARED_NODE);
private static Deque<Node> PLAYER_COLLIDED_WITH_WALL = CollisionDetectionTest.toPlayer(
CollisionDetectionTest.WALL_NODE,
CollisionDetectionTest.PLAYGROUND.getNodeAt(10, 14));
private static Deque<Node> PLAYER_UNCOLLIDED = CollisionDetectionTest.toPlayer(
CollisionDetectionTest.PLAYGROUND.getNodeAt(5, 5),
CollisionDetectionTest.COLLISION_NODE,
CollisionDetectionTest.PLAYGROUND.getNodeAt(6, 6));
private static Deque<Node> PLAYER_HITTING_THE_UNCOLLIDED = CollisionDetectionTest.toPlayer(
CollisionDetectionTest.COLLISION_NODE,
CollisionDetectionTest.PLAYGROUND.getNodeAt(4, 6),
CollisionDetectionTest.PLAYGROUND.getNodeAt(3, 6));
private static Deque<Node> PLAYER_HEAD_ON_HEAD_1 = CollisionDetectionTest.toPlayer(
CollisionDetectionTest.HEAD_COLLISION_NODE,
CollisionDetectionTest.PLAYGROUND.getNodeAt(11, 12)
);
private static Deque<Node> PLAYER_HEAD_ON_HEAD_2 = CollisionDetectionTest.toPlayer(
CollisionDetectionTest.HEAD_COLLISION_NODE,
CollisionDetectionTest.PLAYGROUND.getNodeAt(10, 11)
);
@Test
public void testCollidedWithItself() {
Assert.assertTrue(Detectors.didPlayerHitItself(CollisionDetectionTest.PLAYER_COLLIDED_WITH_ITSELF));
}
@Test
public void testCollidedWithWall() {
Assert.assertTrue(Detectors.didPlayerHitWall(CollisionDetectionTest.PLAYER_COLLIDED_WITH_WALL.getFirst(),
CollisionDetectionTest.PLAYGROUND));
}
@Test
public void testMutuallyUncollided() {
Assert.assertFalse(Detectors.didPlayerCollideWithOther(
CollisionDetectionTest.PLAYER_COLLIDED_WITH_ITSELF.getFirst(),
CollisionDetectionTest.PLAYER_COLLIDED_WITH_WALL));
Assert.assertFalse(Detectors.didPlayerCollideWithOther(
CollisionDetectionTest.PLAYER_COLLIDED_WITH_WALL.getFirst(),
CollisionDetectionTest.PLAYER_COLLIDED_WITH_ITSELF));
}
@Test
public void testHeadOnCollision() {
Assert.assertFalse(Detectors.didPlayerCollideWithOther(CollisionDetectionTest.PLAYER_UNCOLLIDED.getFirst(),
CollisionDetectionTest.PLAYER_HITTING_THE_UNCOLLIDED));
Assert.assertTrue(Detectors.didPlayerCollideWithOther(
CollisionDetectionTest.PLAYER_HITTING_THE_UNCOLLIDED.getFirst(),
CollisionDetectionTest.PLAYER_UNCOLLIDED));
}
@Test
public void testIntegration() {
// prepare the scenario
final PlayerPosition expected = PlayerPosition.build(CollisionDetectionTest.PLAYGROUND,
new Player("a", "b", "c", "1.0"), CollisionDetectionTest.PLAYER_UNCOLLIDED);
final Set<PlayerPosition> players = new HashSet<>();
players.add(expected);
players.add(PlayerPosition.build(CollisionDetectionTest.PLAYGROUND, new Player("d", "e", "f", "1.0"),
CollisionDetectionTest.PLAYER_HITTING_THE_UNCOLLIDED));
players.add(PlayerPosition.build(CollisionDetectionTest.PLAYGROUND, new Player("g", "h", "i", "1.0"),
CollisionDetectionTest.PLAYER_HEAD_ON_HEAD_1));
players.add(PlayerPosition.build(CollisionDetectionTest.PLAYGROUND, new Player("j", "k", "l", "1.0"),
CollisionDetectionTest.PLAYER_HEAD_ON_HEAD_2));
players.add(PlayerPosition.build(CollisionDetectionTest.PLAYGROUND, new Player("m", "n", "o", "1.0"),
CollisionDetectionTest.PLAYER_COLLIDED_WITH_WALL));
players.add(PlayerPosition.build(CollisionDetectionTest.PLAYGROUND, new Player("p", "q", "r", "1.0"),
CollisionDetectionTest.PLAYER_COLLIDED_WITH_ITSELF));
// run the scenario
final Set<PlayerPosition> collided = Detectors.detectCollision(players);
Assertions.assertThat(collided).doesNotContain(expected);
}
}