Thanks! Le lun. 11 sept. 2017 à 16:54, Karl Wright <daddy...@gmail.com> a écrit :
> I didn't forget, precisely. I used git commit -a and it didn't pick up > the file (for some reason as yet undetermined) and I didn't catch it. > Fixed now (via explicit git add). > > Karl > > > On Mon, Sep 11, 2017 at 9:40 AM, Adrien Grand <jpou...@gmail.com> wrote: > >> Karl, did you forget to git add RandomGeo3dShapeGenerator? >> >> Le lun. 11 sept. 2017 à 15:01, <kwri...@apache.org> a écrit : >> >>> Repository: lucene-solr >>> Updated Branches: >>> refs/heads/master 64d142858 -> cd425d609 >>> >>> >>> LUCENE-7906: Add new shapes to testing paradigm. Committed on behalf of >>> Ignacio Vera. >>> >>> >>> Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo >>> Commit: >>> http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/cd425d60 >>> Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/cd425d60 >>> Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/cd425d60 >>> >>> Branch: refs/heads/master >>> Commit: cd425d609cee8bcea6dbfeab8b3d42b1ce48eb40 >>> Parents: 64d1428 >>> Author: Karl Wright <daddy...@gmail.com> >>> Authored: Mon Sep 11 09:00:47 2017 -0400 >>> Committer: Karl Wright <daddy...@gmail.com> >>> Committed: Mon Sep 11 09:00:47 2017 -0400 >>> >>> ---------------------------------------------------------------------- >>> .../spatial3d/geom/RandomBinaryCodecTest.java | 10 +- >>> .../spatial3d/geom/RandomGeoShapeGenerator.java | 944 >>> ------------------- >>> .../geom/RandomGeoShapeRelationshipTest.java | 65 +- >>> 3 files changed, 53 insertions(+), 966 deletions(-) >>> ---------------------------------------------------------------------- >>> >>> >>> >>> http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cd425d60/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomBinaryCodecTest.java >>> ---------------------------------------------------------------------- >>> diff --git >>> a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomBinaryCodecTest.java >>> b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomBinaryCodecTest.java >>> index ba9ee6e..250b652 100644 >>> --- >>> a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomBinaryCodecTest.java >>> +++ >>> b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomBinaryCodecTest.java >>> @@ -27,18 +27,18 @@ import org.junit.Test; >>> /** >>> * Test to check Serialization >>> */ >>> -public class RandomBinaryCodecTest extends RandomGeoShapeGenerator{ >>> +public class RandomBinaryCodecTest extends RandomGeo3dShapeGenerator { >>> >>> @Test >>> @Repeat(iterations = 10) >>> public void testRandomPointCodec() throws IOException{ >>> PlanetModel planetModel = randomPlanetModel(); >>> - GeoPoint shape = randomGeoPoint(planetModel, getEmptyConstraint()); >>> + GeoPoint shape = randomGeoPoint(planetModel); >>> ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); >>> SerializableObject.writeObject(outputStream, shape); >>> ByteArrayInputStream inputStream = new >>> ByteArrayInputStream(outputStream.toByteArray()); >>> SerializableObject shapeCopy = >>> SerializableObject.readObject(planetModel, inputStream); >>> - assertEquals(shape, shapeCopy); >>> + assertEquals(shape.toString(), shape, shapeCopy); >>> } >>> >>> @Test >>> @@ -51,7 +51,7 @@ public class RandomBinaryCodecTest extends >>> RandomGeoShapeGenerator{ >>> SerializableObject.writePlanetObject(outputStream, shape); >>> ByteArrayInputStream inputStream = new >>> ByteArrayInputStream(outputStream.toByteArray()); >>> SerializableObject shapeCopy = >>> SerializableObject.readPlanetObject(inputStream); >>> - assertEquals(shape, shapeCopy); >>> + assertEquals(shape.toString(), shape, shapeCopy); >>> } >>> >>> @Test >>> @@ -64,6 +64,6 @@ public class RandomBinaryCodecTest extends >>> RandomGeoShapeGenerator{ >>> SerializableObject.writeObject(outputStream, shape); >>> ByteArrayInputStream inputStream = new >>> ByteArrayInputStream(outputStream.toByteArray()); >>> SerializableObject shapeCopy = >>> SerializableObject.readObject(planetModel, inputStream); >>> - assertEquals(shape, shapeCopy); >>> + assertEquals(shape.toString(), shape, shapeCopy); >>> } >>> } >>> >>> >>> http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cd425d60/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoShapeGenerator.java >>> ---------------------------------------------------------------------- >>> diff --git >>> a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoShapeGenerator.java >>> b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoShapeGenerator.java >>> deleted file mode 100644 >>> index ca7aecd..0000000 >>> --- >>> a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoShapeGenerator.java >>> +++ /dev/null >>> @@ -1,944 +0,0 @@ >>> -/* >>> -* Licensed to the Apache Software Foundation (ASF) under one or more >>> -* contributor license agreements. See the NOTICE file distributed with >>> -* this work for additional information regarding copyright ownership. >>> -* The ASF licenses this file to You under the Apache License, Version >>> 2.0 >>> -* (the "License"); you may not use this file except in compliance with >>> -* the License. You may obtain a copy of the License at >>> -* >>> -* http://www.apache.org/licenses/LICENSE-2.0 >>> -* >>> -* Unless required by applicable law or agreed to in writing, software >>> -* distributed under the License is distributed on an "AS IS" BASIS, >>> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >>> implied. >>> -* See the License for the specific language governing permissions and >>> -* limitations under the License. >>> -*/ >>> - >>> -package org.apache.lucene.spatial3d.geom; >>> - >>> -import java.util.ArrayList; >>> -import java.util.Collections; >>> -import java.util.Comparator; >>> -import java.util.HashMap; >>> -import java.util.List; >>> - >>> -import org.apache.lucene.util.LuceneTestCase; >>> - >>> -import static >>> com.carrotsearch.randomizedtesting.RandomizedTest.randomDouble; >>> - >>> -/** >>> - * Class for generating random Geo3dShapes. They can be generated under >>> - * given constraints which are expressed as a shape and a relationship. >>> - * >>> - * note that convexity for polygons is defined as polygons that contains >>> - * antipodal points, otherwise they are convex. Internally they can be >>> - * created using GeoConvexPolygons and GeoConcavePolygons. >>> - * >>> - */ >>> -public class RandomGeoShapeGenerator extends LuceneTestCase { >>> - >>> - /* Max num of iterations to find right shape under given constrains */ >>> - final private static int MAX_SHAPE_ITERATIONS = 50; >>> - /* Max num of iterations to find right point under given constrains */ >>> - final private static int MAX_POINT_ITERATIONS = 1000; >>> - >>> - /* Supported shapes */ >>> - final protected static int CONVEX_POLYGON = 0; >>> - final protected static int CONVEX_POLYGON_WITH_HOLES = 1; >>> - final protected static int CONCAVE_POLYGON = 2; >>> - final protected static int CONCAVE_POLYGON_WITH_HOLES = 3; >>> - final protected static int COMPLEX_POLYGON = 4; >>> - final protected static int CIRCLE = 5; >>> - final protected static int RECTANGLE = 6; >>> - final protected static int PATH = 7; >>> - final protected static int COLLECTION = 8; >>> - >>> - /* Helper shapes for generating constraints whch are just three sided >>> polygons */ >>> - final protected static int CONVEX_SIMPLE_POLYGON = 500; >>> - final protected static int CONCAVE_SIMPLE_POLYGON = 501; >>> - >>> - >>> - /** >>> - * Method that returns empty Constraints object.. >>> - * >>> - * @return an empty Constraints object >>> - */ >>> - public Constraints getEmptyConstraint(){ >>> - return new Constraints(); >>> - } >>> - >>> - /** >>> - * Method that returns a random generated a random Shape code from all >>> - * supported shapes. >>> - * >>> - * @return a random generated shape code >>> - */ >>> - public int randomShapeType(){ >>> - return random().nextInt(9); >>> - } >>> - >>> - /** >>> - * Method that returns a random generated a random Shape code from all >>> - * convex supported shapes. >>> - * >>> - * @return a random generated convex shape code >>> - */ >>> - public int randomConvexShapeType(){ >>> - int shapeType = randomShapeType(); >>> - while (isConcave(shapeType)){ >>> - shapeType = randomShapeType(); >>> - } >>> - return shapeType; >>> - } >>> - >>> - /** >>> - * Method that returns a random generated a random Shape code from all >>> - * concave supported shapes. >>> - * >>> - * @return a random generated concave shape code >>> - */ >>> - public int randomConcaveShapeType(){ >>> - int shapeType = randomShapeType(); >>> - while (!isConcave(shapeType)){ >>> - shapeType = randomShapeType(); >>> - } >>> - return shapeType; >>> - } >>> - >>> - /** >>> - * Method that returns a random generated GeoAreaShape code from all >>> - * supported GeoAreaShapes. >>> - * >>> - * We are removing Collections because it is difficult to create >>> shapes >>> - * with properties in some cases. >>> - * >>> - * @return a random generated polygon code >>> - */ >>> - public int randomGeoAreaShapeType(){ >>> - return random().nextInt(8); >>> - } >>> - >>> - /** >>> - * Check if a shape code represents a concave shape >>> - * >>> - * @return true if the shape represented by the code is concave >>> - */ >>> - public boolean isConcave(int shapeType){ >>> - return (shapeType == CONCAVE_POLYGON); >>> - } >>> - >>> - /** >>> - * Method that returns a random generated Planet model from the >>> supported >>> - * Planet models. currently SPHERE and WGS84 >>> - * >>> - * @return a random generated Planet model >>> - */ >>> - public PlanetModel randomPlanetModel() { >>> - final int shapeType = random().nextInt(2); >>> - switch (shapeType) { >>> - case 0: { >>> - return PlanetModel.SPHERE; >>> - } >>> - case 1: { >>> - return PlanetModel.WGS84; >>> - } >>> - default: >>> - throw new IllegalStateException("Unexpected planet model"); >>> - } >>> - } >>> - >>> - /** >>> - * Method that returns a random generated GeoPoint under given >>> constraints. Returns >>> - * NULL if it cannot find a point under the given constraints. >>> - * >>> - * @param planetModel The planet model. >>> - * @param constraints The given constraints. >>> - * @return The random generated GeoPoint. >>> - */ >>> - public GeoPoint randomGeoPoint(PlanetModel planetModel, Constraints >>> constraints) { >>> - int iterations = 0; >>> - while (iterations < MAX_POINT_ITERATIONS) { >>> - double lat = randomDouble(); >>> - if (Math.PI/2 - Math.abs(lat) <0){ >>> - continue; >>> - } >>> - double lon = randomDouble(); >>> - if (Math.PI - Math.abs(lat) <0){ >>> - continue; >>> - } >>> - iterations++; >>> - GeoPoint point = new GeoPoint(planetModel, lat, lon); >>> - if (constraints.isWithin(point)) { >>> - return point; >>> - } >>> - } >>> - return null; >>> - } >>> - >>> - /** >>> - * Method that returns a random generated GeoAreaShape. >>> - * >>> - * @param shapeType The GeoAreaShape code. >>> - * @param planetModel The planet model. >>> - * @return The random generated GeoAreaShape. >>> - */ >>> - public GeoAreaShape randomGeoAreaShape(int shapeType, PlanetModel >>> planetModel){ >>> - GeoAreaShape geoAreaShape = null; >>> - while (geoAreaShape == null){ >>> - geoAreaShape = randomGeoAreaShape(shapeType,planetModel,new >>> Constraints()); >>> - } >>> - return geoAreaShape; >>> - } >>> - >>> - /** >>> - * Method that returns a random generated GeoAreaShape under given >>> constraints. Returns >>> - * NULL if it cannot build the GeoAreaShape under the given >>> constraints. >>> - * >>> - * @param shapeType The GeoAreaShape code. >>> - * @param planetModel The planet model. >>> - * @param constraints The given constraints. >>> - * @return The random generated GeoAreaShape. >>> - */ >>> - public GeoAreaShape randomGeoAreaShape(int shapeType, PlanetModel >>> planetModel, Constraints constraints){ >>> - return (GeoAreaShape)randomGeoShape(shapeType, planetModel, >>> constraints); >>> - } >>> - >>> - /** >>> - * Method that returns a random generated GeoShape. >>> - * >>> - * @param shapeType The shape code. >>> - * @param planetModel The planet model. >>> - * @return The random generated GeoShape. >>> - */ >>> - public GeoShape randomGeoShape(int shapeType, PlanetModel >>> planetModel){ >>> - GeoShape geoShape = null; >>> - while (geoShape == null){ >>> - geoShape = randomGeoShape(shapeType,planetModel,new >>> Constraints()); >>> - } >>> - return geoShape; >>> - } >>> - >>> - /** >>> - * Method that returns a random generated GeoShape under given >>> constraints. Returns >>> - * NULL if it cannot build the GeoShape under the given constraints. >>> - * >>> - * @param shapeType The polygon code. >>> - * @param planetModel The planet model. >>> - * @param constraints The given constraints. >>> - * @return The random generated GeoShape. >>> - */ >>> - public GeoShape randomGeoShape(int shapeType, PlanetModel >>> planetModel, Constraints constraints){ >>> - switch (shapeType) { >>> - case CONVEX_POLYGON: { >>> - return convexPolygon(planetModel, constraints); >>> - } >>> - case CONVEX_POLYGON_WITH_HOLES: { >>> - return convexPolygonWithHoles(planetModel, constraints); >>> - } >>> - case CONCAVE_POLYGON: { >>> - return concavePolygon(planetModel, constraints); >>> - } >>> - case CONCAVE_POLYGON_WITH_HOLES: { >>> - return concavePolygonWithHoles(planetModel, constraints); >>> - } >>> - case COMPLEX_POLYGON: { >>> - return complexPolygon(planetModel, constraints); >>> - } >>> - case CIRCLE: { >>> - return circle(planetModel, constraints); >>> - } >>> - case RECTANGLE: { >>> - return rectangle(planetModel, constraints); >>> - } >>> - case PATH: { >>> - return path(planetModel, constraints); >>> - } >>> - case COLLECTION: { >>> - return collection(planetModel, constraints); >>> - } >>> - case CONVEX_SIMPLE_POLYGON: { >>> - return simpleConvexPolygon(planetModel, constraints); >>> - } >>> - case CONCAVE_SIMPLE_POLYGON: { >>> - return concaveSimplePolygon(planetModel, constraints); >>> - } >>> - default: >>> - throw new IllegalStateException("Unexpected shape type"); >>> - } >>> - } >>> - >>> - /** >>> - * Method that returns a random generated a GeoCircle under given >>> constraints. Returns >>> - * NULL if it cannot build the GeoCircle under the given constraints. >>> - * >>> - * @param planetModel The planet model. >>> - * @param constraints The given constraints. >>> - * @return The random generated GeoCircle. >>> - */ >>> - private GeoCircle circle(PlanetModel planetModel , Constraints >>> constraints) { >>> - int iterations=0; >>> - while (iterations < MAX_SHAPE_ITERATIONS) { >>> - iterations++; >>> - final GeoPoint center = randomGeoPoint(planetModel, constraints); >>> - if (center == null){ >>> - continue; >>> - } >>> - final double radius = randomCutoffAngle(); >>> - try { >>> - >>> - GeoCircle circle = GeoCircleFactory.makeGeoCircle(planetModel, >>> center.getLatitude(), center.getLongitude(), radius); >>> - if (!constraints.valid(circle)) { >>> - continue; >>> - } >>> - return circle; >>> - } catch (IllegalArgumentException e) { >>> - continue; >>> - } >>> - } >>> - return null; >>> - } >>> - >>> - /** >>> - * Method that returns a random generated a GeoBBox under given >>> constraints. Returns >>> - * NULL if it cannot build the GeoBBox under the given constraints. >>> - * >>> - * @param planetModel The planet model. >>> - * @param constraints The given constraints. >>> - * @return The random generated GeoBBox. >>> - */ >>> - private GeoBBox rectangle(PlanetModel planetModel, Constraints >>> constraints) { >>> - >>> - int iterations = 0; >>> - while (iterations < MAX_SHAPE_ITERATIONS) { >>> - iterations++; >>> - final GeoPoint point1 = randomGeoPoint(planetModel, constraints); >>> - if (point1 == null){ >>> - continue; >>> - } >>> - final GeoPoint point2 = randomGeoPoint(planetModel, constraints); >>> - if (point2 == null){ >>> - continue; >>> - } >>> - >>> - double minLat = Math.min(point1.getLatitude(), >>> point2.getLatitude()); >>> - double maxLat = Math.max(point1.getLatitude(), >>> point2.getLatitude()); >>> - double minLon = Math.min(point1.getLongitude(), >>> point2.getLongitude()); >>> - double maxLon = Math.max(point1.getLongitude(), >>> point2.getLongitude()); >>> - >>> - try { >>> - GeoBBox bbox = GeoBBoxFactory.makeGeoBBox(planetModel, maxLat, >>> minLat, minLon, maxLon); >>> - if (!constraints.valid(bbox)) { >>> - continue; >>> - } >>> - return bbox; >>> - } catch (IllegalArgumentException e) { >>> - continue; >>> - } >>> - } >>> - return null; >>> - } >>> - >>> - /** >>> - * Method that returns a random generated a GeoPath under given >>> constraints. Returns >>> - * NULL if it cannot build the GeoPath under the given constraints. >>> - * >>> - * @param planetModel The planet model. >>> - * @param constraints The given constraints. >>> - * @return The random generated GeoPath. >>> - */ >>> - private GeoPath path(PlanetModel planetModel, Constraints >>> constraints) { >>> - int iterations = 0; >>> - while (iterations < MAX_SHAPE_ITERATIONS) { >>> - iterations++; >>> - int vertexCount = random().nextInt(2) + 2; >>> - List<GeoPoint> geoPoints = points(vertexCount, planetModel, >>> constraints); >>> - double width =randomCutoffAngle(); >>> - try { >>> - GeoPath path = GeoPathFactory.makeGeoPath(planetModel, width, >>> geoPoints.toArray(new GeoPoint[geoPoints.size()])); >>> - if (!constraints.valid(path)) { >>> - continue; >>> - } >>> - return path; >>> - } catch (IllegalArgumentException e) { >>> - continue; >>> - } >>> - } >>> - return null; >>> - } >>> - >>> - /** >>> - * Method that returns a random generated a >>> GeoCompositeMembershipShape under given constraints. Returns >>> - * NULL if it cannot build the GGeoCompositeMembershipShape under the >>> given constraints. >>> - * >>> - * @param planetModel The planet model. >>> - * @param constraints The given constraints. >>> - * @return The random generated GeoCompositeMembershipShape. >>> - */ >>> - private GeoCompositeAreaShape collection(PlanetModel planetModel, >>> Constraints constraints) { >>> - int iterations = 0; >>> - while (iterations < MAX_SHAPE_ITERATIONS) { >>> - iterations++; >>> - int numberShapes = random().nextInt(3) + 2; >>> - GeoCompositeAreaShape collection = new >>> GeoCompositeAreaShape(planetModel); >>> - for(int i=0; i<numberShapes;i++){ >>> - GeoPolygon member = convexPolygon(planetModel, constraints); >>> - if (member != null){ >>> - collection.addShape(member); >>> - } >>> - } >>> - if (collection.shapes.size() ==0){ >>> - continue; >>> - } >>> - return collection; >>> - } >>> - return null; >>> - } >>> - >>> - /** >>> - * Method that returns a random generated a convex GeoPolygon under >>> given constraints. Returns >>> - * NULL if it cannot build the GePolygon under the given constraints. >>> - * >>> - * @param planetModel The planet model. >>> - * @param constraints The given constraints. >>> - * @return The random generated GeoPolygon. >>> - */ >>> - private GeoPolygon convexPolygon(PlanetModel planetModel, Constraints >>> constraints) { >>> - int vertexCount = random().nextInt(4) + 3; >>> - int iterations = 0; >>> - while (iterations < MAX_SHAPE_ITERATIONS) { >>> - iterations++; >>> - List<GeoPoint> geoPoints = points(vertexCount,planetModel, >>> constraints); >>> - List<GeoPoint> orderedGeoPoints = orderPoints(geoPoints); >>> - try { >>> - GeoPolygon polygon = >>> GeoPolygonFactory.makeGeoPolygon(planetModel, orderedGeoPoints); >>> - if (!constraints.valid(polygon) || isConcave(planetModel, >>> polygon)) { >>> - continue; >>> - } >>> - return polygon; >>> - } catch (IllegalArgumentException e) { >>> - continue; >>> - } >>> - } >>> - return null; >>> - } >>> - >>> - /** >>> - * Method that returns a random generated a convex GeoPolygon with >>> holes under given constraints. Returns >>> - * NULL if it cannot build the GeoPolygon with holes under the given >>> constraints. >>> - * >>> - * @param planetModel The planet model. >>> - * @param constraints The given constraints. >>> - * @return The random generated GeoPolygon. >>> - */ >>> - private GeoPolygon convexPolygonWithHoles(PlanetModel planetModel, >>> Constraints constraints) { >>> - int vertexCount = random().nextInt(4) + 3; >>> - int iterations = 0; >>> - while (iterations < MAX_SHAPE_ITERATIONS) { >>> - iterations++; >>> - List<GeoPoint> geoPoints = points(vertexCount,planetModel, >>> constraints); >>> - List<GeoPoint> orderedGeoPoints = orderPoints(geoPoints); >>> - try { >>> - GeoPolygon polygon = >>> GeoPolygonFactory.makeGeoPolygon(planetModel, orderedGeoPoints); >>> - //polygon should comply with all constraints except disjoint as >>> we have holes >>> - Constraints polygonConstraints = new Constraints(); >>> - polygonConstraints.putAll(constraints.getContains()); >>> - polygonConstraints.putAll(constraints.getWithin()); >>> - polygonConstraints.putAll(constraints.getDisjoint()); >>> - if (!polygonConstraints.valid(polygon) || >>> isConcave(planetModel, polygon)){ >>> - continue; >>> - } >>> - //hole must overlap with polygon and comply with any CONTAINS >>> constraint. >>> - Constraints holeConstraints = new Constraints(); >>> - holeConstraints.putAll(constraints.getContains()); >>> - holeConstraints.put(polygon,GeoArea.OVERLAPS); >>> - //Points must be with in the polygon and must comply >>> - // CONTAINS and DISJOINT constraints >>> - Constraints pointsConstraints = new Constraints(); >>> - pointsConstraints.put(polygon,GeoArea.WITHIN); >>> - pointsConstraints.putAll(constraints.getContains()); >>> - pointsConstraints.putAll(constraints.getDisjoint()); >>> - List<GeoPolygon> holes = concavePolygonHoles(planetModel, >>> holeConstraints, pointsConstraints); >>> - //we should have at least one hole >>> - if (holes.size() == 0){ >>> - continue; >>> - } >>> - polygon = >>> GeoPolygonFactory.makeGeoPolygon(planetModel,orderedGeoPoints,holes); >>> - if (!constraints.valid(polygon) || isConcave(planetModel, >>> polygon)){ >>> - continue; >>> - } >>> - return polygon; >>> - } catch (IllegalArgumentException e) { >>> - continue; >>> - } >>> - } >>> - return null; >>> - } >>> - >>> - /** >>> - * Method that returns a random list if concave GeoPolygons under >>> given constraints. Method >>> - * use to generate convex holes. Note that constraints for points and >>> holes are different, >>> - * >>> - * @param planetModel The planet model. >>> - * @param holeConstraints The given constraints that a hole must >>> comply. >>> - * @param pointConstraints The given constraints that a point must >>> comply. >>> - * @return The random generated GeoPolygon. >>> - */ >>> - private List<GeoPolygon> concavePolygonHoles(PlanetModel planetModel, >>> - Constraints >>> holeConstraints, >>> - Constraints >>> pointConstraints) { >>> - int iterations =0; >>> - int holesCount = random().nextInt(3) + 1; >>> - List<GeoPolygon> holes = new ArrayList<>(); >>> - while (iterations < MAX_SHAPE_ITERATIONS) { >>> - iterations++; >>> - int vertexCount = random().nextInt(3) + 3; >>> - List<GeoPoint> geoPoints = points(vertexCount, planetModel, >>> pointConstraints); >>> - geoPoints = orderPoints(geoPoints); >>> - Collections.reverse(geoPoints); >>> - try { >>> - GeoPolygon hole = GeoPolygonFactory.makeGeoPolygon(planetModel, >>> geoPoints); >>> - if (!holeConstraints.valid(hole) || isConvex(planetModel, >>> hole)) { >>> - continue; >>> - } >>> - holes.add(hole); >>> - if (holes.size() == holesCount){ >>> - return holes; >>> - } >>> - pointConstraints.put(hole, GeoArea.DISJOINT); >>> - } catch (IllegalArgumentException e) { >>> - continue; >>> - } >>> - } >>> - return holes; >>> - } >>> - >>> - /** >>> - * Method that returns a random generated a concave GeoPolygon under >>> given constraints. Returns >>> - * NULL if it cannot build the concave GeoPolygon under the given >>> constraints. >>> - * >>> - * @param planetModel The planet model. >>> - * @param constraints The given constraints. >>> - * @return The random generated GeoPolygon. >>> - */ >>> - private GeoPolygon concavePolygon(PlanetModel planetModel, >>> Constraints constraints) { >>> - >>> - int vertexCount = random().nextInt(4) + 3; >>> - int iterations = 0; >>> - while (iterations < MAX_SHAPE_ITERATIONS) { >>> - iterations++; >>> - List<GeoPoint> geoPoints = points(vertexCount,planetModel, >>> constraints); >>> - List<GeoPoint> orderedGeoPoints = orderPoints(geoPoints); >>> - Collections.reverse(orderedGeoPoints); >>> - try { >>> - GeoPolygon polygon = >>> GeoPolygonFactory.makeGeoPolygon(planetModel, orderedGeoPoints); >>> - if (!constraints.valid(polygon) || isConvex(planetModel, >>> polygon)) { >>> - continue; >>> - } >>> - return polygon; >>> - } catch (IllegalArgumentException e) { >>> - continue; >>> - } >>> - } >>> - return null; >>> - } >>> - >>> - /** >>> - * Method that returns a random generated a concave GeoPolygon with >>> holes under given constraints. Returns >>> - * NULL if it cannot build the GeoPolygon under the given >>> constraints. Note that the final GeoPolygon is >>> - * convex as the hole wraps the convex GeoPolygon. >>> - * >>> - * @param planetModel The planet model. >>> - * @param constraints The given constraints. >>> - * @return The random generated GeoPolygon. >>> - */ >>> - private GeoPolygon concavePolygonWithHoles(PlanetModel planetModel, >>> Constraints constraints) { >>> - int vertexCount = random().nextInt(4) + 3; >>> - int iterations = 0; >>> - while (iterations < MAX_SHAPE_ITERATIONS) { >>> - iterations++; >>> - //we first build the hole. We consider all constraints except >>> - // disjoint as we have a hole >>> - Constraints holeConstraints = new Constraints(); >>> - holeConstraints.putAll(constraints.getContains()); >>> - holeConstraints.putAll(constraints.getWithin()); >>> - holeConstraints.putAll(constraints.getOverlaps()); >>> - GeoPolygon hole = convexPolygon(planetModel, holeConstraints); >>> - if (hole == null){ >>> - continue; >>> - } >>> - // Now we get points for polygon. Must we with in the hole >>> - // and we add contain constraints >>> - Constraints pointConstraints = new Constraints(); >>> - pointConstraints.put(hole, GeoArea.WITHIN); >>> - pointConstraints.putAll(constraints.getContains()); >>> - List<GeoPoint> geoPoints = points(vertexCount,planetModel, >>> pointConstraints); >>> - List<GeoPoint> orderedGeoPoints = orderPoints(geoPoints); >>> - Collections.reverse(orderedGeoPoints); >>> - try { >>> - GeoPolygon polygon = >>> GeoPolygonFactory.makeGeoPolygon(planetModel, orderedGeoPoints, >>> Collections.singletonList(hole)); >>> - //final polygon must be convex >>> - if (!constraints.valid(polygon) || >>> isConcave(planetModel,polygon)) { >>> - continue; >>> - } >>> - return polygon; >>> - } catch (IllegalArgumentException e) { >>> - continue; >>> - } >>> - } >>> - return null; >>> - } >>> - >>> - /** >>> - * Method that returns a random generated complex GeoPolygon under >>> given constraints. Returns >>> - * NULL if it cannot build the complex GeoPolygon under the given >>> constraints. >>> - * >>> - * @param planetModel The planet model. >>> - * @param constraints The given constraints. >>> - * @return The random generated GeoPolygon. >>> - */ >>> - private GeoPolygon complexPolygon(PlanetModel planetModel, >>> Constraints constraints) { >>> - int polygonsCount =random().nextInt(2) + 1; >>> - int iterations = 0; >>> - while (iterations < MAX_SHAPE_ITERATIONS) { >>> - iterations++; >>> - List<GeoPolygonFactory.PolygonDescription> polDescription = new >>> ArrayList<>(); >>> - while(polDescription.size() < polygonsCount){ >>> - int vertexCount = random().nextInt(14) + 3; >>> - List<GeoPoint> geoPoints = points(vertexCount,planetModel, >>> constraints); >>> - orderPoints(geoPoints); >>> - polDescription.add(new >>> GeoPolygonFactory.PolygonDescription(geoPoints)); >>> - } >>> - try { >>> - GeoPolygon polygon = >>> GeoPolygonFactory.makeLargeGeoPolygon(planetModel,polDescription); >>> - if (!constraints.valid(polygon)) { >>> - continue; >>> - } >>> - return polygon; >>> - } catch (IllegalArgumentException e) { >>> - continue; >>> - } >>> - } >>> - return null; >>> - } >>> - >>> - /** >>> - * Method that returns a random generated a concave square GeoPolygon >>> under given constraints. Returns >>> - * NULL if it cannot build the concave GeoPolygon under the given >>> constraints. This shape is an utility >>> - * to build constraints. >>> - * >>> - * @param planetModel The planet model. >>> - * @param constraints The given constraints. >>> - * @return The random generated GeoPolygon. >>> - */ >>> - private GeoPolygon simpleConvexPolygon(PlanetModel planetModel, >>> Constraints constraints) { >>> - int iterations = 0; >>> - while (iterations < MAX_SHAPE_ITERATIONS) { >>> - iterations++; >>> - List<GeoPoint> points = points(3,planetModel,constraints); >>> - points = orderPoints(points); >>> - try { >>> - GeoPolygon polygon = >>> GeoPolygonFactory.makeGeoConvexPolygon(planetModel, points); >>> - if(!constraints.valid(polygon) || >>> isConcave(planetModel,polygon)){ >>> - continue; >>> - } >>> - return polygon; >>> - } catch (IllegalArgumentException e) { >>> - continue; >>> - } >>> - } >>> - return null; >>> - } >>> - >>> - /** >>> - * Method that returns a random generated a convex square GeoPolygon >>> under given constraints. Returns >>> - * NULL if it cannot build the convex GeoPolygon under the given >>> constraints. This shape is an utility >>> - * to build constraints. >>> - * >>> - * @param planetModel The planet model. >>> - * @param constraints The given constraints. >>> - * @return The random generated GeoPolygon. >>> - */ >>> - private GeoPolygon concaveSimplePolygon(PlanetModel planetModel, >>> Constraints constraints) { >>> - int iterations = 0; >>> - while (iterations < MAX_SHAPE_ITERATIONS) { >>> - iterations++; >>> - List<GeoPoint> points = points(3, planetModel, constraints); >>> - points = orderPoints(points); >>> - Collections.reverse(points); >>> - try { >>> - GeoPolygon polygon = >>> GeoPolygonFactory.makeGeoConcavePolygon(planetModel, points); >>> - if(!constraints.valid(polygon) || isConvex(planetModel, >>> polygon)){ >>> - continue; >>> - } >>> - return polygon; >>> - } catch (IllegalArgumentException e) { >>> - continue; >>> - } >>> - } >>> - return null; >>> - } >>> - >>> - /** >>> - * Method that returns a random list of generated GeoPoints under >>> given constraints. If it cannot >>> - * find a point it will add a point that might not comply with the >>> constraints. >>> - * >>> - * @param count The number of points >>> - * @param planetModel The planet model. >>> - * @param constraints The given constraints. >>> - * @return The random generated List of GeoPoints. >>> - */ >>> - private List<GeoPoint> points(int count, PlanetModel planetModel, >>> Constraints constraints){ >>> - List<GeoPoint> geoPoints = new ArrayList<>(count); >>> - for(int i= 0; i< count; i++) { >>> - GeoPoint point = randomGeoPoint(planetModel, constraints); >>> - if (point == null){ >>> - point = randomGeoPoint(planetModel, new Constraints()); >>> - } >>> - geoPoints.add(point); >>> - } >>> - return geoPoints; >>> - } >>> - >>> - /** >>> - * Check if a GeoPolygon is pure concave. Note that our definition >>> for concavity is that the polygon >>> - * contains antipodal points. >>> - * >>> - * @param planetModel The planet model. >>> - * @param shape The polygon to check. >>> - * @return True if the polygon contains antipodal points. >>> - */ >>> - private boolean isConcave(PlanetModel planetModel, GeoPolygon shape){ >>> - return (shape.isWithin(planetModel.NORTH_POLE) && >>> shape.isWithin(planetModel.SOUTH_POLE))|| >>> - (shape.isWithin(planetModel.MAX_X_POLE) && >>> shape.isWithin(planetModel.MIN_X_POLE)) || >>> - (shape.isWithin(planetModel.MAX_Y_POLE) && >>> shape.isWithin(planetModel.MIN_Y_POLE)); >>> - } >>> - >>> - /** >>> - * Check if a GeoPolygon is pure convex. Note that our definition for >>> convexity is that the polygon >>> - * does not contain antipodal points. >>> - * >>> - * @param planetModel The planet model. >>> - * @param shape The polygon to check. >>> - * @return True if the polygon dies not contains antipodal points. >>> - */ >>> - private boolean isConvex(PlanetModel planetModel, GeoPolygon shape){ >>> - return !isConcave(planetModel,shape); >>> - } >>> - >>> - /** >>> - * Generates a random number between 0 and PI. >>> - * >>> - * @return the cutoff angle. >>> - */ >>> - private double randomCutoffAngle() { >>> - while(true) { >>> - double radius = randomDouble(); >>> - if (radius <0 || radius > Math.PI){ >>> - continue; >>> - } >>> - return radius; >>> - } >>> - } >>> - >>> - /** >>> - * Method that orders a lit of points anti-clock-wise to prevent >>> crossing edges. >>> - * >>> - * @param originalPoints The points to order. >>> - * @return The list of ordered points anti-clockwise. >>> - */ >>> - private List<GeoPoint> orderPoints(List<GeoPoint> originalPoints){ >>> - List<GeoPoint> points = new ArrayList<>(originalPoints.size()); >>> - points.addAll(originalPoints); //make a copy >>> - GeoPoint lPoint = getPointLefLon(points); >>> - points.remove(lPoint); >>> - GeoPoint rPoint = getPointRigthLon(points); >>> - points.remove(rPoint); >>> - List<GeoPoint> APoints = getPointsBelowAndSort(points, lPoint); >>> - List<GeoPoint> BPoints = getPointsAboveAndsort(points, lPoint); >>> - List<GeoPoint> result = new ArrayList<>(); >>> - result.add(lPoint); >>> - result.addAll(APoints); >>> - result.add(rPoint); >>> - result.addAll(BPoints); >>> - return result; >>> - } >>> - >>> - private List<GeoPoint> getPointsAboveAndsort(List<GeoPoint> >>> points,GeoPoint lPoint) { >>> - List<GeoPoint> BPoints = new ArrayList<>(); >>> - for (GeoPoint point : points){ >>> - if(point.getLatitude() > lPoint.getLatitude()){ >>> - BPoints.add(point); >>> - } >>> - } >>> - Collections.sort(BPoints, new Comparator<GeoPoint>() { >>> - public int compare(GeoPoint idx1, GeoPoint idx2) { >>> - return Double.compare(idx1.getLongitude(), idx2.getLongitude()); >>> - } >>> - }); >>> - return BPoints; >>> - } >>> - >>> - private List<GeoPoint> getPointsBelowAndSort(List<GeoPoint> >>> points,GeoPoint lPoint) { >>> - List<GeoPoint> APoints = new ArrayList<>(); >>> - for (GeoPoint point : points){ >>> - if(point.getLatitude() < lPoint.getLatitude()){ >>> - APoints.add(point); >>> - } >>> - } >>> - Collections.sort(APoints, new Comparator<GeoPoint>() { >>> - public int compare(GeoPoint idx1, GeoPoint idx2) { >>> - return Double.compare(idx1.getLongitude(), idx2.getLongitude()); >>> - } >>> - }); >>> - return APoints; >>> - } >>> - >>> - private GeoPoint getPointLefLon(List<GeoPoint> points) { >>> - GeoPoint lPoint = null; >>> - for (GeoPoint point : points){ >>> - if(lPoint == null ){ >>> - lPoint = point; >>> - } >>> - else{ >>> - if (lPoint.getLongitude() > point.getLongitude()){ >>> - lPoint = point; >>> - } >>> - } >>> - } >>> - return lPoint; >>> - } >>> - >>> - private GeoPoint getPointRigthLon(List<GeoPoint> points) { >>> - GeoPoint rPoint = null; >>> - for (GeoPoint point : points){ >>> - if(rPoint == null ){ >>> - rPoint = point; >>> - } >>> - else{ >>> - if (rPoint.getLongitude() < point.getLongitude()){ >>> - rPoint = point; >>> - } >>> - } >>> - } >>> - return rPoint; >>> - } >>> - >>> - /** >>> - * Class that holds the constraints that are given to >>> - * build shapes. It consists in a list of GeoAreaShapes >>> - * and relationships the new shape needs to satisfy. >>> - */ >>> - class Constraints extends HashMap<GeoAreaShape, Integer>{ >>> - >>> - /** >>> - * Check if the shape is valid under the constraints. >>> - * >>> - * @param shape The shape to check >>> - * @return true if the shape satisfy the constraints, else false. >>> - */ >>> - public boolean valid(GeoShape shape) { >>> - if (shape == null){ >>> - return false; >>> - } >>> - for (GeoAreaShape constraint : keySet()) { >>> - if (constraint.getRelationship(shape) != get(constraint)) { >>> - return false; >>> - } >>> - } >>> - return true; >>> - } >>> - >>> - /** >>> - * Check if a point is Within the constraints. >>> - * >>> - * @param point The point to check >>> - * @return true if the point satisfy the constraints, else false. >>> - */ >>> - public boolean isWithin(GeoPoint point) { >>> - for (GeoShape constraint : keySet()) { >>> - if (!(validPoint(point, constraint, get(constraint)))) { >>> - return false; >>> - } >>> - } >>> - return true; >>> - } >>> - >>> - /** >>> - * Check if a point is Within one constraint given by a shape and a >>> relationship. >>> - * >>> - * @param point The point to check >>> - * @param shape The shape of the constraint >>> - * @param relationship The relationship of the constraint. >>> - * @return true if the point satisfy the constraint, else false. >>> - */ >>> - private boolean validPoint(GeoPoint point, GeoShape shape, int >>> relationship) { >>> - //For GeoCompositeMembershipShape we only consider the first >>> shape to help >>> - // converging >>> - if (relationship == GeoArea.WITHIN && shape instanceof >>> GeoCompositeMembershipShape) { >>> - shape = (((GeoCompositeMembershipShape) shape).shapes.get(0)); >>> - } >>> - switch (relationship) { >>> - case GeoArea.DISJOINT: >>> - return !shape.isWithin(point); >>> - case GeoArea.OVERLAPS: >>> - return true; >>> - case GeoArea.CONTAINS: >>> - return !shape.isWithin(point); >>> - case GeoArea.WITHIN: >>> - return shape.isWithin(point); >>> - default: >>> - return true; >>> - } >>> - } >>> - >>> - /** >>> - * Collect the CONTAINS constraints in the object >>> - * >>> - * @return the CONTAINS constraints. >>> - */ >>> - public Constraints getContains(){ >>> - return getConstraintsOfType(GeoArea.CONTAINS); >>> - } >>> - >>> - /** >>> - * Collect the WITHIN constraints in the object >>> - * >>> - * @return the WITHIN constraints. >>> - */ >>> - public Constraints getWithin(){ >>> - return getConstraintsOfType(GeoArea.WITHIN); >>> - } >>> - >>> - /** >>> - * Collect the OVERLAPS constraints in the object >>> - * >>> - * @return the OVERLAPS constraints. >>> - */ >>> - public Constraints getOverlaps(){ >>> - return getConstraintsOfType(GeoArea.OVERLAPS); >>> - } >>> - >>> - /** >>> - * Collect the DISJOINT constraints in the object >>> - * >>> - * @return the DISJOINT constraints. >>> - */ >>> - public Constraints getDisjoint(){ >>> - return getConstraintsOfType(GeoArea.DISJOINT); >>> - } >>> - >>> - private Constraints getConstraintsOfType(int type){ >>> - Constraints constraints = new Constraints(); >>> - for (GeoAreaShape constraint : keySet()) { >>> - if (type == get(constraint)) { >>> - constraints.put(constraint, type); >>> - } >>> - } >>> - return constraints; >>> - } >>> - } >>> -} >>> - >>> - >>> - >>> >>> >>> http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cd425d60/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoShapeRelationshipTest.java >>> ---------------------------------------------------------------------- >>> diff --git >>> a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoShapeRelationshipTest.java >>> b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoShapeRelationshipTest.java >>> index 75a8c28..9c791b7 100644 >>> --- >>> a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoShapeRelationshipTest.java >>> +++ >>> b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoShapeRelationshipTest.java >>> @@ -23,8 +23,7 @@ import org.junit.Test; >>> /** >>> * Random test to check relationship between GeoAreaShapes and >>> GeoShapes. >>> */ >>> -public class RandomGeoShapeRelationshipTest extends >>> RandomGeoShapeGenerator { >>> - >>> +public class RandomGeoShapeRelationshipTest extends >>> RandomGeo3dShapeGenerator { >>> >>> /** >>> * Test for WITHIN points. We build a WITHIN shape with respect the >>> geoAreaShape >>> @@ -38,6 +37,9 @@ public class RandomGeoShapeRelationshipTest extends >>> RandomGeoShapeGenerator { >>> int referenceShapeType = CONVEX_POLYGON; >>> PlanetModel planetModel = randomPlanetModel(); >>> int shapeType = randomShapeType(); >>> + while (shapeType == POINT || shapeType == LINE) { >>> + shapeType = randomShapeType(); >>> + } >>> GeoAreaShape shape = null; >>> GeoPoint point = null; >>> while (point == null) { >>> @@ -51,7 +53,10 @@ public class RandomGeoShapeRelationshipTest extends >>> RandomGeoShapeGenerator { >>> point = randomGeoPoint(planetModel, constraints); >>> } >>> } >>> - assertTrue(shape.isWithin(point)); >>> + StringBuilder b = new StringBuilder(); >>> + b.append("shape: " + shape + "\n"); >>> + b.append("point: " + point); >>> + assertTrue(b.toString(), shape.isWithin(point)); >>> } >>> >>> /** >>> @@ -78,7 +83,10 @@ public class RandomGeoShapeRelationshipTest extends >>> RandomGeoShapeGenerator { >>> point = randomGeoPoint(planetModel, constraints); >>> } >>> } >>> - assertFalse(shape.isWithin(point)); >>> + StringBuilder b = new StringBuilder(); >>> + b.append("shape: " + shape + "\n"); >>> + b.append("point: " + point); >>> + assertFalse(b.toString(), shape.isWithin(point)); >>> } >>> >>> /** >>> @@ -94,7 +102,7 @@ public class RandomGeoShapeRelationshipTest extends >>> RandomGeoShapeGenerator { >>> int referenceShapeType = CONVEX_SIMPLE_POLYGON; >>> PlanetModel planetModel = randomPlanetModel(); >>> int geoAreaShapeType = randomGeoAreaShapeType(); >>> - int shapeType =randomConvexShapeType(); >>> + int shapeType = randomConvexShapeType(); >>> >>> GeoShape shape = null; >>> GeoAreaShape geoAreaShape = null; >>> @@ -109,11 +117,14 @@ public class RandomGeoShapeRelationshipTest >>> extends RandomGeoShapeGenerator { >>> shape = randomGeoShape(shapeType, planetModel, constraints); >>> } >>> } >>> + StringBuilder b = new StringBuilder(); >>> + b.append("geoAreaShape: " + geoAreaShape + "\n"); >>> + b.append("shape: " + shape); >>> int rel = geoAreaShape.getRelationship(shape); >>> - assertEquals(GeoArea.DISJOINT, rel); >>> + assertEquals(b.toString(), GeoArea.DISJOINT, rel); >>> if (shape instanceof GeoArea) { >>> rel = ((GeoArea)shape).getRelationship(geoAreaShape); >>> - assertEquals(GeoArea.DISJOINT, rel); >>> + assertEquals(b.toString(), GeoArea.DISJOINT, rel); >>> } >>> } >>> >>> @@ -129,7 +140,11 @@ public class RandomGeoShapeRelationshipTest extends >>> RandomGeoShapeGenerator { >>> public void testRandomWithIn() { >>> PlanetModel planetModel = randomPlanetModel(); >>> int geoAreaShapeType = randomGeoAreaShapeType(); >>> - int shapeType =randomShapeType(); >>> + //shapes cannot be point or line -- no area! >>> + while(geoAreaShapeType == POINT || geoAreaShapeType == LINE) { >>> + geoAreaShapeType = randomGeoAreaShapeType(); >>> + } >>> + int shapeType = LINE;//randomShapeType(); >>> int referenceShapeType = CONVEX_SIMPLE_POLYGON; >>> if (!isConcave(geoAreaShapeType)){ >>> shapeType =randomConvexShapeType(); >>> @@ -150,11 +165,14 @@ public class RandomGeoShapeRelationshipTest >>> extends RandomGeoShapeGenerator { >>> shape = randomGeoShape(shapeType, planetModel, constraints); >>> } >>> } >>> + StringBuilder b = new StringBuilder(); >>> + b.append("geoAreaShape: " + geoAreaShape + "\n"); >>> + b.append("shape: " + shape); >>> int rel = geoAreaShape.getRelationship(shape); >>> - assertEquals(GeoArea.WITHIN, rel); >>> + assertEquals(b.toString(), GeoArea.WITHIN, rel); >>> if (shape instanceof GeoArea) { >>> rel = ((GeoArea)shape).getRelationship(geoAreaShape); >>> - assertEquals(GeoArea.CONTAINS, rel); >>> + assertEquals(b.toString(), GeoArea.CONTAINS, rel); >>> } >>> } >>> >>> @@ -174,10 +192,13 @@ public class RandomGeoShapeRelationshipTest >>> extends RandomGeoShapeGenerator { >>> int referenceShapeType = CONVEX_SIMPLE_POLYGON; >>> PlanetModel planetModel = randomPlanetModel(); >>> int geoAreaShapeType = randomGeoAreaShapeType(); >>> - while (geoAreaShapeType == COLLECTION){ >>> + while (geoAreaShapeType == COLLECTION ){ >>> geoAreaShapeType = randomGeoAreaShapeType(); >>> } >>> int shapeType = randomShapeType(); >>> + while (shapeType == POINT || shapeType == LINE) { >>> + shapeType = randomShapeType(); >>> + } >>> if (isConcave(geoAreaShapeType)){ >>> shapeType = randomConcaveShapeType(); >>> } >>> @@ -197,11 +218,14 @@ public class RandomGeoShapeRelationshipTest >>> extends RandomGeoShapeGenerator { >>> shape = randomGeoShape(shapeType, planetModel, constraints); >>> } >>> } >>> + StringBuilder b = new StringBuilder(); >>> + b.append("geoAreaShape: " + geoAreaShape + "\n"); >>> + b.append("shape: " + shape); >>> int rel = geoAreaShape.getRelationship(shape); >>> - assertEquals(GeoArea.CONTAINS, rel); >>> + assertEquals(b.toString(), GeoArea.CONTAINS, rel); >>> if (shape instanceof GeoArea) { >>> rel = ((GeoArea)shape).getRelationship(geoAreaShape); >>> - assertEquals(GeoArea.WITHIN, rel); >>> + assertEquals(b.toString(), GeoArea.WITHIN, rel); >>> } >>> } >>> >>> @@ -216,8 +240,13 @@ public class RandomGeoShapeRelationshipTest extends >>> RandomGeoShapeGenerator { >>> public void testRandomOverlaps() { >>> PlanetModel planetModel = randomPlanetModel(); >>> int geoAreaShapeType = randomGeoAreaShapeType(); >>> + while (geoAreaShapeType == POINT || geoAreaShapeType == LINE) { >>> + geoAreaShapeType = randomGeoAreaShapeType(); >>> + } >>> int shapeType = randomShapeType(); >>> - >>> + while (shapeType == POINT || shapeType == LINE) { >>> + shapeType = randomShapeType(); >>> + } >>> GeoShape shape = null; >>> GeoAreaShape geoAreaShape = null; >>> while (shape == null) { >>> @@ -246,12 +275,14 @@ public class RandomGeoShapeRelationshipTest >>> extends RandomGeoShapeGenerator { >>> shape = randomGeoShape(shapeType, planetModel, constraints); >>> } >>> } >>> + StringBuilder b = new StringBuilder(); >>> + b.append("geoAreaShape: " + geoAreaShape + "\n"); >>> + b.append("shape: " + shape); >>> int rel = geoAreaShape.getRelationship(shape); >>> - assertEquals(GeoArea.OVERLAPS, rel); >>> + assertEquals(b.toString(), GeoArea.OVERLAPS, rel); >>> if (shape instanceof GeoArea) { >>> rel = ((GeoArea)shape).getRelationship(geoAreaShape); >>> - assertEquals(GeoArea.OVERLAPS, rel); >>> + assertEquals(b.toString(), GeoArea.OVERLAPS, rel); >>> } >>> } >>> } >>> - >>> >>> >