package com.revolsys.geometry.test.model; import java.util.Arrays; import com.revolsys.geometry.model.Geometry; import com.revolsys.geometry.model.Point; import com.revolsys.geometry.model.coordinates.CoordinatesUtil; import com.revolsys.geometry.model.impl.PointDouble; import com.revolsys.geometry.model.impl.PointDoubleXY; import com.revolsys.geometry.model.impl.PointDoubleXYZ; import com.revolsys.util.number.Doubles; import junit.framework.TestCase; import junit.textui.TestRunner; public class CoordinatesTest extends TestCase { public static void assertEquals(final Point point, final double... coordinates) { for (int i = 0; i < coordinates.length; i++) { final double value = point.getCoordinate(i); final double expected = coordinates[i]; final boolean equal = Doubles.equal(value, expected); failNotEqual("Coordinate not equal " + i, equal, expected, value); } } public static void assertEquals3d(final Point point1, final Point point2) { final boolean equal = point1.equals(3, point2); failNotEqual("Not Equal 3D", equal, point1, point2); final boolean inverseEqual = point2.equals(3, point1); failNotEqual("Not Equal 3D Inverse", inverseEqual, point2, point1); } public static void failNotEqual(final String message, final boolean equal, final Object value1, final Object value2) { if (!equal) { failNotEquals(message, value1, value2); } } public static void main(final String args[]) { TestRunner.run(CoordinatesTest.class); } public CoordinatesTest(final String name) { super(name); } private void assertArcDistance(final double x1, final double y1, final double x2, final double y2, final int expectedCompare) { final int actualCompare = CoordinatesUtil.compareArcDistance(x1, y1, x2, y2); assertEquals("POINT(" + x1 + " " + y1 + "),POINT(" + x2 + " " + y2 + ")", expectedCompare, actualCompare); } public void testClone() { for (final Point point : Arrays.asList(// new PointDoubleXY(100.0, 200.0), // new PointDoubleXYZ(100.0, 200.0, 50.0), // new PointDouble(100.0, 200.0, 50.0, 4.0))) { final Point clone = point.newPoint(); assertEquals3d(point, clone); } } public void testCompareArcDistance() { assertArcDistance(-1, -1, 0, 0, -1); assertArcDistance(0, 0, -1, -1, 1); assertArcDistance(0, 1, 1, 0, -1); assertArcDistance(1, 0, 0, 1, 1); assertArcDistance(0, 0, 0, 0, 0); } public void testCompareTo() { final Point lowest = new PointDoubleXYZ(10.0, 100.0, 50.0); final Point highest = new PointDoubleXYZ(20.0, 100.0, 50.0); final Point equalToHighest = new PointDoubleXYZ(20.0, 100.0, 50.0); final Point higherStill = new PointDoubleXYZ(20.0, 200.0, 50.0); assertEquals(-1, lowest.compareTo(highest)); assertEquals(1, highest.compareTo(lowest)); assertEquals(-1, highest.compareTo(higherStill)); assertEquals(0, highest.compareTo(equalToHighest)); } public void testConstructor2D() { final Point c = new PointDoubleXY(350.2, 4566.8); assertEquals(c, 350.2, 4566.8); } public void testConstructor3D() { final Point c = new PointDoubleXYZ(350.2, 4566.8, 5266.3); assertEquals(c, 350.2, 4566.8, 5266.3); } public void testDistance() { final Point coord1 = new PointDoubleXYZ(0.0, 0.0, 0.0); final Point coord2 = new PointDoubleXYZ(100.0, 200.0, 50.0); final double distance = coord1.distancePoint(coord2); assertEquals(distance, 223.60679774997897, 0.00001); } public void testDistance3D() { final Point coord1 = new PointDoubleXYZ(0.0, 0.0, 0.0); final Point coord2 = new PointDoubleXYZ(100.0, 200.0, 50.0); final double distance = coord1.distance3d(coord2); assertEquals(distance, 229.128784747792, 0.000001); } public void testEquals() { final Point c1 = new PointDoubleXYZ(1.0, 2, 3); final String s = "Not a coordinate"; assertTrue(!c1.equals(s)); final Point c2 = new PointDoubleXYZ(1.0, 2.0, 3.0); assertTrue(c1.equals(2, c2)); final Point c3 = new PointDoubleXYZ(1.0, 22.0, 3.0); assertTrue(!c1.equals(2, c3)); } public void testEquals2D() { final Point c1 = new PointDoubleXYZ(1.0, 2.0, 3.0); final Point c2 = new PointDoubleXYZ(1.0, 2.0, 3.0); assertTrue(c1.equals(2, c2)); final Point c3 = new PointDoubleXYZ(1.0, 22.0, 3.0); assertTrue(!c1.equals(2, c3)); } public void testEquals2DWithinTolerance() { final Point c = new PointDoubleXYZ(100.0, 200.0, 50.0); final Point aBitOff = new PointDoubleXYZ(100.1, 200.1, 50.0); assertTrue(c.equalsVertex2d(aBitOff, 0.2)); } public void testEquals3D() { final Point c1 = new PointDoubleXYZ(1.0, 2.0, 3.0); final Point c2 = new PointDoubleXYZ(1.0, 2.0, 3.0); assertTrue(c1.equals(3, c2)); final Point c3 = new PointDoubleXYZ(1.0, 22.0, 3.0); assertTrue(!c1.equals(3, c3)); } public void testGetOrdinate() { final Point c = new PointDoubleXYZ(350.2, 4566.8, 5266.3); assertEquals(c.getCoordinate(Geometry.X), 350.2); assertEquals(c.getCoordinate(Geometry.Y), 4566.8); assertEquals(c.getCoordinate(Geometry.Z), 5266.3); } public void testToString() { final String expectedResult = "POINT Z(100 200 50)"; final String actualResult = new PointDoubleXYZ(100.0, 200.0, 50.0).toString(); assertEquals(expectedResult, actualResult); } }