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 feed702f3266e947835e7685f7b9af30d7849b86 Author: Matt Juntunen <matt.juntu...@hotmail.com> AuthorDate: Fri Dec 13 00:49:16 2019 -0500 GEOMETRY-51: adding check for invalid epsilon value in EpsilonDoublePrecisionContext constructor; also making Serializable per Spotbugs report --- .../precision/EpsilonDoublePrecisionContext.java | 12 +++++++++++- .../EpsilonDoublePrecisionContextTest.java | 21 +++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/commons-geometry-core/src/main/java/org/apache/commons/geometry/core/precision/EpsilonDoublePrecisionContext.java b/commons-geometry-core/src/main/java/org/apache/commons/geometry/core/precision/EpsilonDoublePrecisionContext.java index dfc9b34..cc45d27 100644 --- a/commons-geometry-core/src/main/java/org/apache/commons/geometry/core/precision/EpsilonDoublePrecisionContext.java +++ b/commons-geometry-core/src/main/java/org/apache/commons/geometry/core/precision/EpsilonDoublePrecisionContext.java @@ -16,6 +16,8 @@ */ package org.apache.commons.geometry.core.precision; +import java.io.Serializable; + import org.apache.commons.numbers.core.Precision; /** Simple {@link DoublePrecisionContext} subclass that uses an absolute epsilon value to @@ -28,7 +30,11 @@ import org.apache.commons.numbers.core.Precision; * * @see Precision#compareTo(double, double, double) */ -public class EpsilonDoublePrecisionContext extends DoublePrecisionContext { +public class EpsilonDoublePrecisionContext extends DoublePrecisionContext implements Serializable { + + /** Serializable UID. */ + private static final long serialVersionUID = 20191212L; + /** Epsilon value. */ private final double epsilon; @@ -36,8 +42,12 @@ public class EpsilonDoublePrecisionContext extends DoublePrecisionContext { * @param eps Epsilon value. Numbers are considered equal if there is no * floating point value strictly between them or if their difference is less * than or equal to this value. + * @throws IllegalArgumentException if the given epsilon value is infinite, NaN, or negative */ public EpsilonDoublePrecisionContext(final double eps) { + if (!Double.isFinite(eps) || eps < 0.0) { + throw new IllegalArgumentException("Invalid epsilon value: " + eps); + } this.epsilon = eps; } diff --git a/commons-geometry-core/src/test/java/org/apache/commons/geometry/core/precision/EpsilonDoublePrecisionContextTest.java b/commons-geometry-core/src/test/java/org/apache/commons/geometry/core/precision/EpsilonDoublePrecisionContextTest.java index ff75ee8..224a2a8 100644 --- a/commons-geometry-core/src/test/java/org/apache/commons/geometry/core/precision/EpsilonDoublePrecisionContextTest.java +++ b/commons-geometry-core/src/test/java/org/apache/commons/geometry/core/precision/EpsilonDoublePrecisionContextTest.java @@ -16,6 +16,7 @@ */ package org.apache.commons.geometry.core.precision; +import org.apache.commons.geometry.core.GeometryTestUtils; import org.apache.commons.geometry.core.precision.EpsilonDoublePrecisionContext; import org.junit.Assert; import org.junit.Test; @@ -36,6 +37,26 @@ public class EpsilonDoublePrecisionContextTest { } @Test + public void testInvalidEpsilonValues() { + // act/assert + GeometryTestUtils.assertThrows(() -> { + new EpsilonDoublePrecisionContext(-1.0); + }, IllegalArgumentException.class); + + GeometryTestUtils.assertThrows(() -> { + new EpsilonDoublePrecisionContext(Double.NaN); + }, IllegalArgumentException.class, "Invalid epsilon value: NaN"); + + GeometryTestUtils.assertThrows(() -> { + new EpsilonDoublePrecisionContext(Double.POSITIVE_INFINITY); + }, IllegalArgumentException.class, "Invalid epsilon value: Infinity"); + + GeometryTestUtils.assertThrows(() -> { + new EpsilonDoublePrecisionContext(Double.NEGATIVE_INFINITY); + }, IllegalArgumentException.class, "Invalid epsilon value: -Infinity"); + } + + @Test public void testSign() { // arrange double eps = 1e-2;