diff --git a/src/main/java/bwem/ChokePoint.java b/src/main/java/bwem/ChokePoint.java
index 71204f43..b62a7d13 100644
--- a/src/main/java/bwem/ChokePoint.java
+++ b/src/main/java/bwem/ChokePoint.java
@@ -43,6 +43,7 @@ public final class ChokePoint {
private final Graph graph;
private final boolean isPseudo;
private final int index;
+ private final String mapHash;
private final Pair areas;
private final WalkPosition[] nodes;
private final List> nodesInArea;
@@ -64,6 +65,7 @@ public final class ChokePoint {
this.graph = graph;
this.index = index;
+ this.mapHash = graph.getMap().game.mapHash();
this.areas = new Pair<>(area1, area2);
this.geometry = geometry;
@@ -313,25 +315,13 @@ public boolean equals(final Object object) {
return false;
} else {
final ChokePoint that = (ChokePoint) object;
- final boolean lel = this.areas.getLeft().equals(that.areas.getLeft());
- final boolean ler = this.areas.getLeft().equals(that.areas.getRight());
- final boolean rer = this.areas.getRight().equals(that.areas.getRight());
- final boolean rel = this.areas.getRight().equals(that.areas.getLeft());
- return lel && rer
- || ler && rel; /* true if area pairs are an exact match or if one pair is reversed. */
+ return this.index == that.index && Objects.equals(this.mapHash, that.mapHash);
}
}
@Override
public int hashCode() {
- int idLeft = areas.getLeft().getId().intValue();
- int idRight = areas.getRight().getId().intValue();
- if (idLeft > idRight) {
- final int idLeftTmp = idLeft;
- idLeft = idRight;
- idRight = idLeftTmp;
- }
- return Objects.hash(idLeft, idRight);
+ return Objects.hash(this.index, this.mapHash);
}
/**
diff --git a/src/test/java/bwapi/BWEMTest.java b/src/test/java/bwapi/BWEMTest.java
index 65558961..f90faf8a 100644
--- a/src/test/java/bwapi/BWEMTest.java
+++ b/src/test/java/bwapi/BWEMTest.java
@@ -1,14 +1,19 @@
package bwapi;
+import bwem.Area;
import bwem.BWEM;
import bwem.BWMap;
+import bwem.ChokePoint;
import org.junit.Test;
import java.io.IOException;
+import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
public class BWEMTest {
static class BWEMMap{
@@ -66,13 +71,44 @@ public int hashCode() {
mapData.put("(4)Roadrunner.scx", new BWEMMap(26, 12, 35));
}
+ @Test
+ public void chokePointsFromSameMapAreEqual() throws IOException {
+ BWEM first = new BWEM(GameBuilder.createGame("(2)Destination.scx"));
+ first.initialize();
+ BWEM second = new BWEM(GameBuilder.createGame("(2)Destination.scx"));
+ second.initialize();
+ assertEquals(first.getMap().getChokePoints(), second.getMap().getChokePoints());
+ assertEquals(new HashSet<>(first.getMap().getChokePoints()), new HashSet<>(second.getMap().getChokePoints()));
+ }
+
+ @Test
+ public void chokePointsFromDifferentMapsAreDistinct() throws IOException {
+ BWEM first = new BWEM(GameBuilder.createGame("(2)Benzene.scx"));
+ first.initialize();
+ BWEM second = new BWEM(GameBuilder.createGame("(2)Destination.scx"));
+ second.initialize();
+ assertTrue(Collections.disjoint(first.getMap().getChokePoints(), second.getMap().getChokePoints()));
+ }
+
@Test
public void checkSSCAITMaps() throws IOException {
for (String mapName : mapData.keySet()) {
Game game = GameBuilder.createGame(mapName);
BWEM bwem = new BWEM(game);
bwem.initialize();
- assertEquals(new BWEMMap(bwem.getMap()), mapData.get(mapName));
+ BWMap map = bwem.getMap();
+ assertEquals(new BWEMMap(map), mapData.get(mapName));
+ assertEquals(mapName, map.getChokePoints().size(), new HashSet<>(map.getChokePoints()).size());
+
+ for (Area area : map.getAreas()) {
+ for (ChokePoint firstChokePoint : area.getChokePoints()) {
+ for (ChokePoint secondChokePoint : area.getChokePoints()) {
+ if (!firstChokePoint.isBlocked() && !secondChokePoint.isBlocked()) {
+ assertTrue(mapName, firstChokePoint.accessibleFrom(secondChokePoint));
+ }
+ }
+ }
+ }
}
}
}