Merge branch 'master' into 1.0-beta1-release; including release fixes from master.
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 bfa6446..e9a5121 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
@@ -94,7 +94,7 @@
final EpsilonDoublePrecisionContext other = (EpsilonDoublePrecisionContext) obj;
- return this.epsilon == other.epsilon;
+ return Double.compare(this.epsilon, other.epsilon) == 0;
}
/** {@inheritDoc} **/
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 e0e26f9..d8d4164 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
@@ -209,6 +209,25 @@
}
@Test
+ public void testEqualsAndHashCode_signedZeroConsistency() {
+ // arrange
+ final EpsilonDoublePrecisionContext a = new EpsilonDoublePrecisionContext(0.0);
+ final EpsilonDoublePrecisionContext b = new EpsilonDoublePrecisionContext(-0.0);
+ final EpsilonDoublePrecisionContext c = new EpsilonDoublePrecisionContext(0.0);
+ final EpsilonDoublePrecisionContext d = new EpsilonDoublePrecisionContext(-0.0);
+
+ // act/assert
+ Assert.assertFalse(a.equals(b));
+ Assert.assertNotEquals(a.hashCode(), b.hashCode());
+
+ Assert.assertTrue(a.equals(c));
+ Assert.assertEquals(a.hashCode(), c.hashCode());
+
+ Assert.assertTrue(b.equals(d));
+ Assert.assertEquals(b.hashCode(), d.hashCode());
+ }
+
+ @Test
public void testToString() {
// arrange
final EpsilonDoublePrecisionContext a = new EpsilonDoublePrecisionContext(1d);
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/oned/Vector1D.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/oned/Vector1D.java
index b046c8a..ed968fe 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/oned/Vector1D.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/oned/Vector1D.java
@@ -277,18 +277,16 @@
*/
@Override
public boolean equals(final Object other) {
-
if (this == other) {
return true;
}
-
if (other instanceof Vector1D) {
final Vector1D rhs = (Vector1D) other;
if (rhs.isNaN()) {
return this.isNaN();
}
- return x == rhs.x;
+ return Double.compare(x, rhs.x) == 0;
}
return false;
}
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/AffineTransformMatrix3D.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/AffineTransformMatrix3D.java
index ab46582..bbda043 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/AffineTransformMatrix3D.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/AffineTransformMatrix3D.java
@@ -24,7 +24,6 @@
import org.apache.commons.geometry.euclidean.internal.Vectors;
import org.apache.commons.geometry.euclidean.threed.rotation.QuaternionRotation;
import org.apache.commons.numbers.arrays.LinearCombination;
-import org.apache.commons.numbers.core.Precision;
/** Class using a matrix to represent affine transformations in 3 dimensional Euclidean space.
*
@@ -442,20 +441,20 @@
final AffineTransformMatrix3D other = (AffineTransformMatrix3D) obj;
- return Precision.equals(this.m00, other.m00) &&
- Precision.equals(this.m01, other.m01) &&
- Precision.equals(this.m02, other.m02) &&
- Precision.equals(this.m03, other.m03) &&
+ return Double.compare(this.m00, other.m00) == 0 &&
+ Double.compare(this.m01, other.m01) == 0 &&
+ Double.compare(this.m02, other.m02) == 0 &&
+ Double.compare(this.m03, other.m03) == 0 &&
- Precision.equals(this.m10, other.m10) &&
- Precision.equals(this.m11, other.m11) &&
- Precision.equals(this.m12, other.m12) &&
- Precision.equals(this.m13, other.m13) &&
+ Double.compare(this.m10, other.m10) == 0 &&
+ Double.compare(this.m11, other.m11) == 0 &&
+ Double.compare(this.m12, other.m12) == 0 &&
+ Double.compare(this.m13, other.m13) == 0 &&
- Precision.equals(this.m20, other.m20) &&
- Precision.equals(this.m21, other.m21) &&
- Precision.equals(this.m22, other.m22) &&
- Precision.equals(this.m23, other.m23);
+ Double.compare(this.m20, other.m20) == 0 &&
+ Double.compare(this.m21, other.m21) == 0 &&
+ Double.compare(this.m22, other.m22) == 0 &&
+ Double.compare(this.m23, other.m23) == 0;
}
/** {@inheritDoc} */
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/SphericalCoordinates.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/SphericalCoordinates.java
index cdab529..b7415e7 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/SphericalCoordinates.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/SphericalCoordinates.java
@@ -181,14 +181,15 @@
if (this == other) {
return true;
}
-
if (other instanceof SphericalCoordinates) {
final SphericalCoordinates rhs = (SphericalCoordinates) other;
if (rhs.isNaN()) {
return this.isNaN();
}
- return (radius == rhs.radius) && (azimuth == rhs.azimuth) && (polar == rhs.polar);
+ return Double.compare(radius, rhs.radius) == 0 &&
+ Double.compare(azimuth, rhs.azimuth) == 0 &&
+ Double.compare(polar, rhs.polar) == 0;
}
return false;
}
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/Vector3D.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/Vector3D.java
index de90eab..acf0d65 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/Vector3D.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/Vector3D.java
@@ -399,10 +399,10 @@
if (isNaN()) {
return 642;
}
- return 643 * (164 * Double.hashCode(x) + 3 * Double.hashCode(y) + Double.hashCode(z));
+ return 643 * (164 * Double.hashCode(x) + 3 * Double.hashCode(y) + Double.hashCode(z));
}
- /**
+ /**d
* Test for the equality of two vector instances.
* <p>
* If all coordinates of two vectors are exactly the same, and none are
@@ -426,14 +426,15 @@
if (this == other) {
return true;
}
-
if (other instanceof Vector3D) {
final Vector3D rhs = (Vector3D) other;
if (rhs.isNaN()) {
return this.isNaN();
}
- return (x == rhs.x) && (y == rhs.y) && (z == rhs.z);
+ return Double.compare(x, rhs.x) == 0 &&
+ Double.compare(y, rhs.y) == 0 &&
+ Double.compare(z, rhs.z) == 0;
}
return false;
}
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/rotation/AxisAngleSequence.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/rotation/AxisAngleSequence.java
index 1f42ee7..494a3f1 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/rotation/AxisAngleSequence.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/rotation/AxisAngleSequence.java
@@ -19,8 +19,6 @@
import java.util.Arrays;
import java.util.Objects;
-import org.apache.commons.numbers.core.Precision;
-
/** <p>
* Class representing a sequence of axis-angle rotations. These types of
* rotations are commonly called <em>Euler angles</em>, <em>Tait-Bryan angles</em>,
@@ -158,9 +156,9 @@
return this.referenceFrame == other.referenceFrame &&
this.axisSequence == other.axisSequence &&
- Precision.equals(this.angle1, other.angle1) &&
- Precision.equals(this.angle2, other.angle2) &&
- Precision.equals(this.angle3, other.angle3);
+ Double.compare(this.angle1, other.angle1) == 0 &&
+ Double.compare(this.angle2, other.angle2) == 0 &&
+ Double.compare(this.angle3, other.angle3) == 0;
}
/** {@inheritDoc} */
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/AffineTransformMatrix2D.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/AffineTransformMatrix2D.java
index 17ff26b..0b7f658 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/AffineTransformMatrix2D.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/AffineTransformMatrix2D.java
@@ -24,7 +24,6 @@
import org.apache.commons.geometry.euclidean.internal.Vectors;
import org.apache.commons.geometry.euclidean.twod.rotation.Rotation2D;
import org.apache.commons.numbers.arrays.LinearCombination;
-import org.apache.commons.numbers.core.Precision;
/** Class using a matrix to represent affine transformations in 2 dimensional Euclidean space.
*
@@ -397,13 +396,13 @@
final AffineTransformMatrix2D other = (AffineTransformMatrix2D) obj;
- return Precision.equals(this.m00, other.m00) &&
- Precision.equals(this.m01, other.m01) &&
- Precision.equals(this.m02, other.m02) &&
+ return Double.compare(this.m00, other.m00) == 0 &&
+ Double.compare(this.m01, other.m01) == 0 &&
+ Double.compare(this.m02, other.m02) == 0 &&
- Precision.equals(this.m10, other.m10) &&
- Precision.equals(this.m11, other.m11) &&
- Precision.equals(this.m12, other.m12);
+ Double.compare(this.m10, other.m10) == 0 &&
+ Double.compare(this.m11, other.m11) == 0 &&
+ Double.compare(this.m12, other.m12) == 0;
}
/** {@inheritDoc} */
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/PolarCoordinates.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/PolarCoordinates.java
index bcaf2bc..bb66412 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/PolarCoordinates.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/PolarCoordinates.java
@@ -151,14 +151,14 @@
if (this == other) {
return true;
}
-
if (other instanceof PolarCoordinates) {
final PolarCoordinates rhs = (PolarCoordinates) other;
if (rhs.isNaN()) {
return this.isNaN();
}
- return (radius == rhs.radius) && (azimuth == rhs.azimuth);
+ return Double.compare(radius, rhs.radius) == 0 &&
+ Double.compare(azimuth, rhs.azimuth) == 0;
}
return false;
}
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/Vector2D.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/Vector2D.java
index 1cdd869..091ec4c 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/Vector2D.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/Vector2D.java
@@ -342,7 +342,7 @@
if (isNaN()) {
return 542;
}
- return 122 * (76 * Double.hashCode(x) + Double.hashCode(y));
+ return 122 * (76 * Double.hashCode(x) + Double.hashCode(y));
}
/**
@@ -369,14 +369,14 @@
if (this == other) {
return true;
}
-
if (other instanceof Vector2D) {
final Vector2D rhs = (Vector2D) other;
if (rhs.isNaN()) {
return this.isNaN();
}
- return (x == rhs.x) && (y == rhs.y);
+ return Double.compare(x, rhs.x) == 0 &&
+ Double.compare(y, rhs.y) == 0;
}
return false;
}
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/AffineTransformMatrix1DTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/AffineTransformMatrix1DTest.java
index e4bd869..bdec5ad 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/AffineTransformMatrix1DTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/AffineTransformMatrix1DTest.java
@@ -734,6 +734,24 @@
}
@Test
+ public void testEqualsAndHashCode_signedZeroConsistency() {
+ // arrange
+ final AffineTransformMatrix1D a = AffineTransformMatrix1D.of(0.0, -0.0);
+ final AffineTransformMatrix1D b = AffineTransformMatrix1D.of(-0.0, 0.0);
+ final AffineTransformMatrix1D c = AffineTransformMatrix1D.of(0.0, -0.0);
+ final AffineTransformMatrix1D d = AffineTransformMatrix1D.of(-0.0, 0.0);
+
+ // act/assert
+ Assert.assertFalse(a.equals(b));
+
+ Assert.assertTrue(a.equals(c));
+ Assert.assertEquals(a.hashCode(), c.hashCode());
+
+ Assert.assertTrue(b.equals(d));
+ Assert.assertEquals(b.hashCode(), d.hashCode());
+ }
+
+ @Test
public void testToString() {
// arrange
final AffineTransformMatrix1D a = AffineTransformMatrix1D.of(1, 2);
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/Vector1DTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/Vector1DTest.java
index 98cc9fb..a392736 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/Vector1DTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/Vector1DTest.java
@@ -599,6 +599,25 @@
}
@Test
+ public void testEqualsAndHashCode_signedZeroConsistency() {
+ // arrange
+ final Vector1D a = Vector1D.of(0.0);
+ final Vector1D b = Vector1D.of(-0.0);
+ final Vector1D c = Vector1D.of(0.0);
+ final Vector1D d = Vector1D.of(-0.0);
+
+ // act/assert
+ Assert.assertFalse(a.equals(b));
+ Assert.assertNotEquals(a.hashCode(), b.hashCode());
+
+ Assert.assertTrue(a.equals(c));
+ Assert.assertEquals(a.hashCode(), c.hashCode());
+
+ Assert.assertTrue(b.equals(d));
+ Assert.assertEquals(b.hashCode(), d.hashCode());
+ }
+
+ @Test
public void testToString() {
// arrange
final Vector1D v = Vector1D.of(3);
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/AffineTransformMatrix3DTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/AffineTransformMatrix3DTest.java
index e0e848c..aca1c30 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/AffineTransformMatrix3DTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/AffineTransformMatrix3DTest.java
@@ -1181,6 +1181,35 @@
}
@Test
+ public void testEqualsAndHashCode_signedZeroConsistency() {
+ // arrange
+ final double[] arrWithPosZero = {
+ 1.0, 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0, 0.0,
+ 0.0, 0.0, 1.0, 0.0,
+ };
+ final double[] arrWithNegZero = {
+ 1.0, 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0, 0.0,
+ 0.0, 0.0, 1.0, -0.0,
+ };
+ final AffineTransformMatrix3D a = AffineTransformMatrix3D.of(arrWithPosZero);
+ final AffineTransformMatrix3D b = AffineTransformMatrix3D.of(arrWithNegZero);
+ final AffineTransformMatrix3D c = AffineTransformMatrix3D.of(arrWithPosZero);
+ final AffineTransformMatrix3D d = AffineTransformMatrix3D.of(arrWithNegZero);
+
+ // act/assert
+ Assert.assertFalse(a.equals(b));
+ Assert.assertNotEquals(a.hashCode(), b.hashCode());
+
+ Assert.assertTrue(a.equals(c));
+ Assert.assertEquals(a.hashCode(), c.hashCode());
+
+ Assert.assertTrue(b.equals(d));
+ Assert.assertEquals(b.hashCode(), d.hashCode());
+ }
+
+ @Test
public void testToString() {
// arrange
final AffineTransformMatrix3D a = AffineTransformMatrix3D.of(
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/SphericalCoordinatesTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/SphericalCoordinatesTest.java
index ca3e220..2f740df 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/SphericalCoordinatesTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/SphericalCoordinatesTest.java
@@ -321,6 +321,25 @@
}
@Test
+ public void testEqualsAndHashCode_signedZeroConsistency() {
+ // arrange
+ final SphericalCoordinates a = SphericalCoordinates.of(0.0, -0.0, 0.0);
+ final SphericalCoordinates b = SphericalCoordinates.of(-0.0, 0.0, -0.0);
+ final SphericalCoordinates c = SphericalCoordinates.of(0.0, -0.0, 0.0);
+ final SphericalCoordinates d = SphericalCoordinates.of(-0.0, 0.0, -0.0);
+
+ // act/assert
+ Assert.assertFalse(a.equals(b));
+ Assert.assertNotEquals(a.hashCode(), b.hashCode());
+
+ Assert.assertTrue(a.equals(c));
+ Assert.assertEquals(a.hashCode(), c.hashCode());
+
+ Assert.assertTrue(b.equals(d));
+ Assert.assertEquals(b.hashCode(), d.hashCode());
+ }
+
+ @Test
public void testToString() {
// arrange
final SphericalCoordinates sph = SphericalCoordinates.of(1, 2, 3);
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/Vector3DTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/Vector3DTest.java
index b89fa71..06b1d3f 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/Vector3DTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/Vector3DTest.java
@@ -1103,6 +1103,24 @@
}
@Test
+ public void testEqualsAndHashCode_signedZeroConsistency() {
+ // arrange
+ final Vector3D a = Vector3D.of(0.0, -0.0, 0.0);
+ final Vector3D b = Vector3D.of(-0.0, 0.0, -0.0);
+ final Vector3D c = Vector3D.of(0.0, -0.0, 0.0);
+ final Vector3D d = Vector3D.of(-0.0, 0.0, -0.0);
+
+ // act/assert
+ Assert.assertFalse(a.equals(b));
+
+ Assert.assertTrue(a.equals(c));
+ Assert.assertEquals(a.hashCode(), c.hashCode());
+
+ Assert.assertTrue(b.equals(d));
+ Assert.assertEquals(b.hashCode(), d.hashCode());
+ }
+
+ @Test
public void testToString() {
// arrange
final Vector3D v = Vector3D.of(1, 2, 3);
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/rotation/AxisAngleSequenceTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/rotation/AxisAngleSequenceTest.java
index 5494fcf..05800ff 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/rotation/AxisAngleSequenceTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/rotation/AxisAngleSequenceTest.java
@@ -81,6 +81,29 @@
}
@Test
+ public void testEqualsAndHashCode_signedZeroConsistency() {
+ // arrange
+ final AxisAngleSequence a = new AxisAngleSequence(AxisReferenceFrame.ABSOLUTE, AxisSequence.XYZ,
+ 0.0, -0.0, 0.0);
+ final AxisAngleSequence b = new AxisAngleSequence(AxisReferenceFrame.ABSOLUTE, AxisSequence.XYZ,
+ -0.0, 0.0, -0.0);
+ final AxisAngleSequence c = new AxisAngleSequence(AxisReferenceFrame.ABSOLUTE, AxisSequence.XYZ,
+ 0.0, -0.0, 0.0);
+ final AxisAngleSequence d = new AxisAngleSequence(AxisReferenceFrame.ABSOLUTE, AxisSequence.XYZ,
+ -0.0, 0.0, -0.0);
+
+ // act/assert
+ Assert.assertFalse(a.equals(b));
+ Assert.assertNotEquals(a.hashCode(), b.hashCode());
+
+ Assert.assertTrue(a.equals(c));
+ Assert.assertEquals(a.hashCode(), c.hashCode());
+
+ Assert.assertTrue(b.equals(d));
+ Assert.assertEquals(b.hashCode(), d.hashCode());
+ }
+
+ @Test
public void testToString() {
// arrange
final AxisAngleSequence seq = new AxisAngleSequence(AxisReferenceFrame.ABSOLUTE, AxisSequence.XYZ, 1, 2, 3);
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/AffineTransformMatrix2DTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/AffineTransformMatrix2DTest.java
index 3e8d39d..6eedde8 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/AffineTransformMatrix2DTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/AffineTransformMatrix2DTest.java
@@ -1188,6 +1188,33 @@
}
@Test
+ public void testEqualsAndHashCode_signedZeroConsistency() {
+ // arrange
+ final double[] arrWithPosZero = {
+ 1.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0
+ };
+ final double[] arrWithNegZero = {
+ 1.0, 0.0, 0.0,
+ 0.0, 1.0, -0.0
+ };
+ final AffineTransformMatrix2D a = AffineTransformMatrix2D.of(arrWithPosZero);
+ final AffineTransformMatrix2D b = AffineTransformMatrix2D.of(arrWithNegZero);
+ final AffineTransformMatrix2D c = AffineTransformMatrix2D.of(arrWithPosZero);
+ final AffineTransformMatrix2D d = AffineTransformMatrix2D.of(arrWithNegZero);
+
+ // act/assert
+ Assert.assertFalse(a.equals(b));
+ Assert.assertNotEquals(a.hashCode(), b.hashCode());
+
+ Assert.assertTrue(a.equals(c));
+ Assert.assertEquals(a.hashCode(), c.hashCode());
+
+ Assert.assertTrue(b.equals(d));
+ Assert.assertEquals(b.hashCode(), d.hashCode());
+ }
+
+ @Test
public void testToString() {
// arrange
final AffineTransformMatrix2D a = AffineTransformMatrix2D.of(
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/PolarCoordinatesTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/PolarCoordinatesTest.java
index c6599a9..eb609d5 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/PolarCoordinatesTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/PolarCoordinatesTest.java
@@ -254,6 +254,24 @@
}
@Test
+ public void testEqualsAndHashCode_signedZeroConsistency() {
+ // arrange
+ final PolarCoordinates a = PolarCoordinates.of(0.0, -0.0);
+ final PolarCoordinates b = PolarCoordinates.of(-0.0, 0.0);
+ final PolarCoordinates c = PolarCoordinates.of(0.0, -0.0);
+ final PolarCoordinates d = PolarCoordinates.of(-0.0, 0.0);
+
+ // act/assert
+ Assert.assertFalse(a.equals(b));
+
+ Assert.assertTrue(a.equals(c));
+ Assert.assertEquals(a.hashCode(), c.hashCode());
+
+ Assert.assertTrue(b.equals(d));
+ Assert.assertEquals(b.hashCode(), d.hashCode());
+ }
+
+ @Test
public void testToCartesian() {
// arrange
final double sqrt2 = Math.sqrt(2);
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/Vector2DTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/Vector2DTest.java
index 5912503..ba623be 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/Vector2DTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/Vector2DTest.java
@@ -919,6 +919,24 @@
}
@Test
+ public void testEqualsAndHashCode_signedZeroConsistency() {
+ // arrange
+ final Vector2D a = Vector2D.of(0.0, 0.0);
+ final Vector2D b = Vector2D.of(-0.0, -0.0);
+ final Vector2D c = Vector2D.of(0.0, 0.0);
+ final Vector2D d = Vector2D.of(-0.0, -0.0);
+
+ // act/assert
+ Assert.assertFalse(a.equals(b));
+
+ Assert.assertTrue(a.equals(c));
+ Assert.assertEquals(a.hashCode(), c.hashCode());
+
+ Assert.assertTrue(b.equals(d));
+ Assert.assertEquals(b.hashCode(), d.hashCode());
+ }
+
+ @Test
public void testToString() {
// arrange
final Vector2D v = Vector2D.of(1, 2);
diff --git a/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/oned/Point1STest.java b/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/oned/Point1STest.java
index e7c0284..f9772c1 100644
--- a/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/oned/Point1STest.java
+++ b/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/oned/Point1STest.java
@@ -209,6 +209,25 @@
}
@Test
+ public void testEqualsAndHashCode_signedZeroConsistency() {
+ // arrange
+ final Point1S a = Point1S.of(0.0);
+ final Point1S b = Point1S.of(-0.0);
+ final Point1S c = Point1S.of(0.0);
+ final Point1S d = Point1S.of(-0.0);
+
+ // act/assert
+ Assert.assertFalse(a.equals(b));
+ Assert.assertNotEquals(a.hashCode(), b.hashCode());
+
+ Assert.assertTrue(a.equals(c));
+ Assert.assertEquals(a.hashCode(), c.hashCode());
+
+ Assert.assertTrue(b.equals(d));
+ Assert.assertEquals(b.hashCode(), d.hashCode());
+ }
+
+ @Test
public void testEq() {
// arrange
final DoublePrecisionContext highPrecision = new EpsilonDoublePrecisionContext(1e-10);
diff --git a/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/twod/ConvexArea2STest.java b/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/twod/ConvexArea2STest.java
index a982560..6683be5 100644
--- a/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/twod/ConvexArea2STest.java
+++ b/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/twod/ConvexArea2STest.java
@@ -228,7 +228,7 @@
@Test
public void testFromBounds_triangle_small() {
// arrange
- final double azMin = 1.125 * PlaneAngleRadians.PI;
+ final double azMin = 1.12 * PlaneAngleRadians.PI;
final double azMax = 1.375 * PlaneAngleRadians.PI;
final double azMid = 0.5 * (azMin + azMax);
final double polarTop = 0.1;
diff --git a/src/main/resources/checkstyle/checkstyle-suppressions.xml b/src/main/resources/checkstyle/checkstyle-suppressions.xml
index 092a279..5ae72a3 100644
--- a/src/main/resources/checkstyle/checkstyle-suppressions.xml
+++ b/src/main/resources/checkstyle/checkstyle-suppressions.xml
@@ -28,7 +28,7 @@
<!-- allow Vector3D.linearCombination() methods -->
<suppress checks="ParameterNumber" files=".*[/\\]threed[/\\]Vector3D" />
<!-- allow internal, non-array QuaterionRotation.orthogonalRotationMatrixToQuaternion() method -->
- <suppress checks="ParameterNumber" files=".*[/\\]threed/rotation[/\\]QuaternionRotation" />
+ <suppress checks="ParameterNumber" files=".*[/\\]threed[/\\]rotation[/\\]QuaternionRotation" />
<!-- allow Vector2D.linearCombination() methods -->
<suppress checks="ParameterNumber" files=".*[/\\]twod[/\\]Vector2D" />
<!-- Prevent subclass error on generic package-private methods (checkstyle parsing issue?) -->