Fixes an issue where a circleiterator with radius 0 still returned a tile.

This commit is contained in:
Stian Grenborgen 2022-08-14 09:22:57 +02:00
parent cc4254b397
commit 6025d5c679
2 changed files with 88 additions and 13 deletions

View File

@ -979,9 +979,11 @@ public class Map extends FreeColGameObject implements Location {
}
this.radius = radius;
n = 0;
Position step;
if (isFilled || radius == 1) {
if (radius <= 0) {
x = y = UNDEFINED;
} else if (isFilled || radius == 1) {
step = Direction.NE.step(center.getX(), center.getY());
x = step.x;
y = step.y;
@ -1097,11 +1099,12 @@ public class Map extends FreeColGameObject implements Location {
*
* @param center The center {@code Tile} to iterate around.
* @param isFilled True to get all of the positions in the circle.
* @param radius The radius of circle.
* @return The circle iterator.
* @param radius The radius of circle. No tiles are returned if
* {@code radius <= 0}.
* @return The circle iterator. The center tile is never returned.
* The innermost tiles are returned first.
*/
public Iterator<Tile> getCircleIterator(Tile center, boolean isFilled,
int radius) {
public Iterator<Tile> getCircleIterator(Tile center, boolean isFilled, int radius) {
return new CircleIterator(center, isFilled, radius);
}
@ -1111,12 +1114,12 @@ public class Map extends FreeColGameObject implements Location {
*
* @param center The center {@code Tile} to iterate around.
* @param isFilled True to get all of the positions in the circle.
* @param radius The radius of circle.
* @return An {@code Iterable} for a circle of tiles.
* @param radius The radius of circle. No tiles are returned if
* {@code radius <= 0}.
* @return An {@code Iterable} The center tile is never returned.
* The innermost tiles are returned first.
*/
public Iterable<Tile> getCircleTiles(final Tile center,
final boolean isFilled,
final int radius) {
public Iterable<Tile> getCircleTiles(final Tile center, final boolean isFilled, final int radius) {
return new Iterable<Tile>() {
@Override
public Iterator<Tile> iterator() {

View File

@ -19,18 +19,20 @@
package net.sf.freecol.common.model;
import static net.sf.freecol.common.model.Constants.INFINITY;
import static net.sf.freecol.common.util.CollectionUtils.alwaysTrue;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.Set;
import net.sf.freecol.common.FreeColException;
import static net.sf.freecol.common.model.Constants.*;
import net.sf.freecol.common.model.pathfinding.CostDecider;
import net.sf.freecol.common.model.pathfinding.CostDeciders;
import net.sf.freecol.common.model.pathfinding.GoalDecider;
import static net.sf.freecol.common.util.CollectionUtils.*;
import net.sf.freecol.server.model.ServerUnit;
import net.sf.freecol.util.test.FreeColTestCase;
import net.sf.freecol.util.test.FreeColTestUtils;
@ -445,6 +447,76 @@ public class MapTest extends FreeColTestCase {
assertEquals(90, map.getLatitude(90));
assertEquals(90, map.getRow(90));
}
public void testCircleIterator() {
final Game game = getStandardGame();
final Map map = getCoastTestMap(plainsType, true);
game.changeMap(map);
final Tile tile = map.getTile(10, 10);
final List<Tile> radiusMinusOneList = iteratorToList(map.getCircleIterator(tile, false, -1));
assertEquals("Radius -1 should produce 0 tiles", 0, radiusMinusOneList.size());
final List<Tile> radius0List = iteratorToList(map.getCircleIterator(tile, false, 0));
assertEquals("Radius 0 should produce 0 tiles", 0, radius0List.size());
final List<Tile> radius1List = iteratorToList(map.getCircleIterator(tile, false, 1));
assertEquals("Radius 1", 8, radius1List.size());
final List<Tile> radius2List = iteratorToList(map.getCircleIterator(tile, false, 2));
assertEquals("Radius 2", 16, radius2List.size());
final List<Tile> radius2FilledList = iteratorToList(map.getCircleIterator(tile, true, 2));
assertEquals("Radius 2", 24, radius2FilledList.size());
assertEquals("The tiles should be returned in a certain order (spiraling clockwise outwards).",
List.of(
// Radius 1
map.getTile(10, 9),
map.getTile(11, 10),
map.getTile(10, 11),
map.getTile(10, 12),
map.getTile(9, 11),
map.getTile(9, 10),
map.getTile(9, 9),
map.getTile(10, 8),
// Radius 2
map.getTile(10, 7),
map.getTile(11, 8),
map.getTile(11, 9),
map.getTile(12, 10),
map.getTile(11, 11),
map.getTile(11, 12),
map.getTile(10, 13),
map.getTile(10, 14),
map.getTile(9, 13),
map.getTile(9, 12),
map.getTile(8, 11),
map.getTile(8, 10),
map.getTile(8, 9),
map.getTile(9, 8),
map.getTile(9, 7),
map.getTile(10, 6)
),
radius2FilledList);
final Tile cornertile = map.getTile(0, 1);
final List<Tile> radius1CornerList = iteratorToList(map.getCircleIterator(cornertile, false, 1));
assertEquals("Radius 1 in corner", 6, radius1CornerList.size());
final Tile cornertile2 = map.getTile(map.getWidth() - 1, 1);
final List<Tile> radius1CornerList2 = iteratorToList(map.getCircleIterator(cornertile2, false, 1));
assertEquals("Radius 1 in corner2", 4, radius1CornerList2.size());
}
private <T> List<T> iteratorToList(Iterator<T> iterator) {
final List<T> result = new ArrayList<>();
while (iterator.hasNext()) {
result.add(iterator.next());
}
return result;
}
public void testFindPath() {
Game game = getStandardGame();