1 /*
2  * Copyright (c) 2016 Vivid Solutions.
3  *
4  * All rights reserved. This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * and Eclipse Distribution License v. 1.0 which accompanies this distribution.
7  * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v20.html
8  * and the Eclipse Distribution License is available at
9  *
10  * http://www.eclipse.org/org/documents/edl-v10.php.
11  */
12 
13 package org.locationtech.jts.geom;
14 
15 import junit.framework.TestCase;
16 import junit.textui.TestRunner;
17 
18 public class CoordinateTest extends TestCase
19 {
CoordinateTest(String name)20   public CoordinateTest(String name)
21   {
22     super(name);
23   }
24 
main(String args[])25   public static void main(String args[]) {
26     TestRunner.run(CoordinateTest.class);
27   }
28 
testConstructor3D()29   public void testConstructor3D()
30   {
31     Coordinate c = new Coordinate(350.2, 4566.8, 5266.3);
32     assertEquals(c.x, 350.2);
33     assertEquals(c.y, 4566.8);
34     assertEquals(c.getZ(), 5266.3);
35   }
36 
testConstructor2D()37   public void testConstructor2D()
38   {
39     Coordinate c = new Coordinate(350.2, 4566.8);
40     assertEquals(c.x, 350.2);
41     assertEquals(c.y, 4566.8);
42     assertEquals(c.getZ(), Coordinate.NULL_ORDINATE);
43   }
testDefaultConstructor()44   public void testDefaultConstructor()
45   {
46     Coordinate c = new Coordinate();
47     assertEquals(c.x, 0.0);
48     assertEquals(c.y, 0.0);
49     assertEquals(c.getZ(), Coordinate.NULL_ORDINATE);
50   }
testCopyConstructor3D()51   public void testCopyConstructor3D()
52   {
53     Coordinate orig = new Coordinate(350.2, 4566.8, 5266.3);
54     Coordinate c = new Coordinate(orig);
55     assertEquals(c.x, 350.2);
56     assertEquals(c.y, 4566.8);
57     assertEquals(c.getZ(), 5266.3);
58   }
testSetCoordinate()59   public void testSetCoordinate()
60   {
61     Coordinate orig = new Coordinate(350.2, 4566.8, 5266.3);
62     Coordinate c = new Coordinate();
63     c.setCoordinate(orig);
64     assertEquals(c.x, 350.2);
65     assertEquals(c.y, 4566.8);
66     assertEquals(c.getZ(), 5266.3);
67   }
testGetOrdinate()68   public void testGetOrdinate()
69   {
70     Coordinate c = new Coordinate(350.2, 4566.8, 5266.3);
71     assertEquals(c.getOrdinate(Coordinate.X), 350.2);
72     assertEquals(c.getOrdinate(Coordinate.Y), 4566.8);
73     assertEquals(c.getOrdinate(Coordinate.Z), 5266.3);
74   }
testSetOrdinate()75   public void testSetOrdinate()
76   {
77     Coordinate c = new Coordinate();
78     c.setOrdinate(Coordinate.X, 111);
79     c.setOrdinate(Coordinate.Y, 222);
80     c.setOrdinate(Coordinate.Z, 333);
81     assertEquals(c.getOrdinate(Coordinate.X), 111.0);
82     assertEquals(c.getOrdinate(Coordinate.Y), 222.0);
83     assertEquals(c.getOrdinate(Coordinate.Z), 333.0);
84   }
testEquals()85   public void testEquals()
86   {
87     Coordinate c1 = new Coordinate(1,2,3);
88     String s = "Not a coordinate";
89     assertTrue(! c1.equals(s));
90 
91     Coordinate c2 = new Coordinate(1,2,3);
92     assertTrue(c1.equals2D(c2));
93 
94     Coordinate c3 = new Coordinate(1,22,3);
95     assertTrue(! c1.equals2D(c3));
96   }
testEquals2D()97   public void testEquals2D()
98   {
99     Coordinate c1 = new Coordinate(1,2,3);
100     Coordinate c2 = new Coordinate(1,2,3);
101     assertTrue(c1.equals2D(c2));
102 
103     Coordinate c3 = new Coordinate(1,22,3);
104     assertTrue(! c1.equals2D(c3));
105   }
testEquals3D()106   public void testEquals3D()
107   {
108     Coordinate c1 = new Coordinate(1,2,3);
109     Coordinate c2 = new Coordinate(1,2,3);
110     assertTrue(c1.equals3D(c2));
111 
112     Coordinate c3 = new Coordinate(1,22,3);
113     assertTrue(! c1.equals3D(c3));
114   }
testEquals2DWithinTolerance()115   public void testEquals2DWithinTolerance()
116   {
117     Coordinate c = new Coordinate(100.0, 200.0, 50.0);
118     Coordinate aBitOff = new Coordinate(100.1, 200.1, 50.0);
119     assertTrue(c.equals2D(aBitOff, 0.2));
120   }
121 
testEqualsInZ()122   public void testEqualsInZ() {
123 
124     Coordinate c = new Coordinate(100.0, 200.0, 50.0);
125     Coordinate withSameZ = new Coordinate(100.1, 200.1, 50.1);
126     assertTrue(c.equalInZ(withSameZ, 0.2));
127   }
128 
testCompareTo()129   public void testCompareTo()
130   {
131     Coordinate lowest = new Coordinate(10.0, 100.0, 50.0);
132     Coordinate highest = new Coordinate(20.0, 100.0, 50.0);
133     Coordinate equalToHighest = new Coordinate(20.0, 100.0, 50.0);
134     Coordinate higherStill = new Coordinate(20.0, 200.0, 50.0);
135 
136     assertEquals(-1, lowest.compareTo(highest));
137     assertEquals(1, highest.compareTo(lowest));
138     assertEquals(-1, highest.compareTo(higherStill));
139     assertEquals(0, highest.compareTo(equalToHighest));
140   }
testToString()141   public void testToString()
142   {
143     String expectedResult = "(100.0, 200.0, 50.0)";
144     String actualResult = new Coordinate(100.0, 200.0, 50.0).toString();
145     assertEquals(expectedResult, actualResult);
146   }
147 
testClone()148   public void testClone() {
149     Coordinate c = new Coordinate(100.0, 200.0, 50.0);
150     Coordinate clone = (Coordinate) c.clone();
151     assertTrue(c.equals3D(clone));
152   }
153 
testDistance()154   public void testDistance() {
155     Coordinate coord1 = new Coordinate(0.0, 0.0, 0.0);
156     Coordinate coord2 = new Coordinate(100.0, 200.0, 50.0);
157     double distance = coord1.distance(coord2);
158     assertEquals(distance, 223.60679774997897, 0.00001);
159   }
testDistance3D()160   public void testDistance3D() {
161     Coordinate coord1 = new Coordinate(0.0, 0.0, 0.0);
162     Coordinate coord2 = new Coordinate(100.0, 200.0, 50.0);
163     double distance = coord1.distance3D(coord2);
164     assertEquals(distance, 229.128784747792, 0.000001);
165   }
testCoordinateXY()166   public void testCoordinateXY() {
167     Coordinate xy = new CoordinateXY();
168     checkZUnsupported(xy);
169     checkMUnsupported(xy);
170 
171     xy = new CoordinateXY(1.0,1.0);        // 2D
172     Coordinate coord = new Coordinate(xy); // copy
173     assertEquals( xy, coord );
174     assertTrue( !xy.equalInZ(coord,0.000001) );
175 
176     coord = new Coordinate(1.0,1.0,1.0); // 2.5d
177     xy = new CoordinateXY( coord ); // copy
178     assertEquals( xy, coord );
179     assertTrue( !xy.equalInZ(coord,0.000001) );
180   }
testCoordinateXYM()181   public void testCoordinateXYM() {
182       Coordinate xym = new CoordinateXYM();
183       checkZUnsupported(xym);
184 
185       xym.setM(1.0);
186       assertEquals( 1.0, xym.getM());
187 
188       Coordinate coord = new Coordinate(xym); // copy
189       assertEquals( xym, coord );
190       assertTrue( !xym.equalInZ(coord,0.000001) );
191 
192       coord = new Coordinate(1.0,1.0,1.0); // 2.5d
193       xym = new CoordinateXYM( coord ); // copy
194       assertEquals( xym, coord );
195       assertTrue( !xym.equalInZ(coord,0.000001) );
196   }
testCoordinateXYZM()197   public void testCoordinateXYZM() {
198       Coordinate xyzm = new CoordinateXYZM();
199       xyzm.setZ(1.0);
200       assertEquals( 1.0, xyzm.getZ());
201       xyzm.setM(1.0);
202       assertEquals( 1.0, xyzm.getM());
203 
204       Coordinate coord = new Coordinate(xyzm); // copy
205       assertEquals( xyzm, coord );
206       assertTrue( xyzm.equalInZ(coord,0.000001) );
207       assertTrue( Double.isNaN(coord.getM()));
208 
209       coord = new Coordinate(1.0,1.0,1.0); // 2.5d
210       xyzm = new CoordinateXYZM( coord ); // copy
211       assertEquals( xyzm, coord );
212       assertTrue( xyzm.equalInZ(coord,0.000001) );
213   }
214 
testCoordinateHash()215   public void testCoordinateHash() {
216     doTestCoordinateHash(true, new Coordinate(1, 2), new Coordinate(1, 2));
217     doTestCoordinateHash(false, new Coordinate(1, 2), new Coordinate(3, 4));
218     doTestCoordinateHash(false, new Coordinate(1, 2), new Coordinate(1, 4));
219     doTestCoordinateHash(false, new Coordinate(1, 2), new Coordinate(3, 2));
220     doTestCoordinateHash(false, new Coordinate(1, 2), new Coordinate(2, 1));
221   }
222 
doTestCoordinateHash(boolean equal, Coordinate a, Coordinate b)223   private void doTestCoordinateHash(boolean equal, Coordinate a, Coordinate b) {
224     assertEquals(equal, a.equals(b));
225     assertEquals(equal, a.hashCode() == b.hashCode());
226   }
227 
228   /**
229    * Confirm the z field is not supported by getZ and setZ.
230    */
checkZUnsupported(Coordinate coord )231   private void checkZUnsupported(Coordinate coord )
232   {
233       try {
234           coord.setZ(0.0);
235           fail(coord.getClass().getSimpleName() + " does not support Z");
236       }
237       catch(IllegalArgumentException expected) {
238       }
239       assertTrue( Double.isNaN(coord.z));
240       coord.z = 0.0;                      // field still public
241       assertTrue( "z field not used", Double.isNaN(coord.getZ())); // but not used
242   }
243   /**
244    * Confirm the z field is not supported by getZ and setZ.
245    */
checkMUnsupported(Coordinate coord )246   private void checkMUnsupported(Coordinate coord )
247   {
248       try {
249           coord.setM(0.0);
250           fail(coord.getClass().getSimpleName() + " does not support M");
251       }
252       catch(IllegalArgumentException expected) {
253       }
254       assertTrue( Double.isNaN(coord.getM()));
255   }
256 
257 }
258