You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2020/01/16 12:39:50 UTC

[commons-geometry] 02/04: GEOEMTRY-85: throwing exception instead of returning a ball with negative radius when no points given to encloser

This is an automated email from the ASF dual-hosted git repository.

erans pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-geometry.git

commit 2e3e9be957b31971a7a08d4de89ca85fb3904801
Author: Matt Juntunen <ma...@hotmail.com>
AuthorDate: Wed Jan 15 22:02:47 2020 -0500

    GEOEMTRY-85: throwing exception instead of returning a ball with negative radius when no points given to encloser
---
 commons-geometry-enclosing/pom.xml                 |  9 ++++++++
 .../commons/geometry/enclosing/Encloser.java       |  1 +
 .../commons/geometry/enclosing/WelzlEncloser.java  |  3 +--
 .../euclidean/threed/WelzlEncloser3DTest.java      | 26 +++++++++-------------
 .../euclidean/twod/WelzlEncloser2DTest.java        | 26 +++++++++-------------
 5 files changed, 33 insertions(+), 32 deletions(-)

diff --git a/commons-geometry-enclosing/pom.xml b/commons-geometry-enclosing/pom.xml
index 69e8545..0a33c22 100644
--- a/commons-geometry-enclosing/pom.xml
+++ b/commons-geometry-enclosing/pom.xml
@@ -62,6 +62,15 @@
 
     <dependency>
       <groupId>org.apache.commons</groupId>
+      <artifactId>commons-geometry-core</artifactId>
+      <version>${project.version}</version>
+      <classifier>tests</classifier>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.commons</groupId>
       <artifactId>commons-rng-client-api</artifactId>
       <scope>test</scope>
     </dependency>
diff --git a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/Encloser.java b/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/Encloser.java
index a5fb1fb..ca5bf38 100644
--- a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/Encloser.java
+++ b/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/Encloser.java
@@ -27,6 +27,7 @@ public interface Encloser<P extends Point<P>> {
     /** Find a ball enclosing a list of points.
      * @param points points to enclose
      * @return enclosing ball
+     * @throws IllegalArgumentException if the argument does not contain any points
      */
     EnclosingBall<P> enclose(Iterable<P> points);
 
diff --git a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/WelzlEncloser.java b/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/WelzlEncloser.java
index e21b862..45f4547 100755
--- a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/WelzlEncloser.java
+++ b/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/WelzlEncloser.java
@@ -60,8 +60,7 @@ public class WelzlEncloser<P extends Point<P>> implements Encloser<P> {
     public EnclosingBall<P> enclose(final Iterable<P> points) {
 
         if (points == null || !points.iterator().hasNext()) {
-            // return an empty ball
-            return generator.ballOnSupport(new ArrayList<P>());
+            throw new IllegalArgumentException("Unable to generate enclosing ball: no points given");
         }
 
         // Emo Welzl algorithm with Bernd Gärtner and Linus Källberg improvements
diff --git a/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/threed/WelzlEncloser3DTest.java b/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/threed/WelzlEncloser3DTest.java
index c260eca..73515a4 100644
--- a/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/threed/WelzlEncloser3DTest.java
+++ b/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/threed/WelzlEncloser3DTest.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import org.apache.commons.geometry.core.GeometryTestUtils;
 import org.apache.commons.geometry.core.precision.DoublePrecisionContext;
 import org.apache.commons.geometry.core.precision.EpsilonDoublePrecisionContext;
 import org.apache.commons.geometry.enclosing.EnclosingBall;
@@ -40,23 +41,18 @@ public class WelzlEncloser3DTest {
     private WelzlEncloser3D encloser = new WelzlEncloser3D(TEST_PRECISION);
 
     @Test
-    public void testNullList() {
-        // act
-        EnclosingBall<Vector3D> ball = encloser.enclose(null);
-
-        // assert
-        Assert.assertTrue(ball.getRadius() < 0);
-    }
-
-    @Test
     public void testNoPoints() {
-        // act
-        EnclosingBall<Vector3D> ball = encloser.enclose(new ArrayList<Vector3D>());
+        // arrange
+        String msg = "Unable to generate enclosing ball: no points given";
 
-        // assert
-        Assert.assertTrue(ball.getRadius() < 0);
-        Assert.assertEquals(0, ball.getSupportSize());
-        Assert.assertEquals(0, ball.getSupport().size());
+        // act/assert
+        GeometryTestUtils.assertThrows(() -> {
+            encloser.enclose(null);
+        }, IllegalArgumentException.class, msg);
+
+        GeometryTestUtils.assertThrows(() -> {
+            encloser.enclose(new ArrayList<Vector3D>());
+        }, IllegalArgumentException.class, msg);
     }
 
     @Test
diff --git a/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/twod/WelzlEncloser2DTest.java b/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/twod/WelzlEncloser2DTest.java
index 11356fe..6fb32b7 100755
--- a/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/twod/WelzlEncloser2DTest.java
+++ b/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/twod/WelzlEncloser2DTest.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import org.apache.commons.geometry.core.GeometryTestUtils;
 import org.apache.commons.geometry.core.precision.DoublePrecisionContext;
 import org.apache.commons.geometry.core.precision.EpsilonDoublePrecisionContext;
 import org.apache.commons.geometry.enclosing.EnclosingBall;
@@ -39,23 +40,18 @@ public class WelzlEncloser2DTest {
     private WelzlEncloser2D encloser = new WelzlEncloser2D(TEST_PRECISION);
 
     @Test
-    public void testNullList() {
-        // act
-        EnclosingBall<Vector2D> ball = encloser.enclose(null);
-
-        // assert
-        Assert.assertTrue(ball.getRadius() < 0);
-        Assert.assertEquals(0, ball.getSupportSize());
-        Assert.assertEquals(0, ball.getSupport().size());
-    }
-
-    @Test
     public void testNoPoints() {
-        // act
-        EnclosingBall<Vector2D> ball = encloser.enclose(new ArrayList<Vector2D>());
+        // arrange
+        String msg = "Unable to generate enclosing ball: no points given";
+
+        // act/assert
+        GeometryTestUtils.assertThrows(() -> {
+            encloser.enclose(null);
+        }, IllegalArgumentException.class, msg);
 
-        // assert
-        Assert.assertTrue(ball.getRadius() < 0);
+        GeometryTestUtils.assertThrows(() -> {
+            encloser.enclose(new ArrayList<Vector2D>());
+        }, IllegalArgumentException.class, msg);
     }
 
     @Test