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)); + } + } + } + } } } }