public void testToString() {
    Geodetic3DPoint p = TestGeoPoint.randomGeodetic3DPoint(r);
    int prevLen = 0;

    String base = p.toString();
    String prefix = base.substring(0, base.indexOf(' ')); // e.g. "75 deg"
    char letter = base.charAt(base.indexOf(')') - 1); // e.g. "S"

    // System.out.println("base=" + base + " pre=" + prefix + " letter=" + letter);

    for (int i = 0; i < 6; i++) {
      /*
      length of string should increase two digits for each fractional # of digits in lat & lon
      0 (133 deg 47' 15" W, 73 deg 17' 33" S) @ 733484m
      1 (133 deg 47' 14.8" W, 73 deg 17' 32.7" S) @ 733484.0m
      2 (133 deg 47' 14.81" W, 73 deg 17' 32.67" S) @ 733484.00m
      3 (133 deg 47' 14.806" W, 73 deg 17' 32.675" S) @ 733484.000m
      4 (133 deg 47' 14.8060" W, 73 deg 17' 32.6749" S) @ 733484.0000m
      5 (133 deg 47' 14.80597" W, 73 deg 17' 32.67487" S) @ 733484.00000m
       ...
       */
      String s = p.toString(i);
      System.out.println(i + " " + s);
      int len = s.length();
      assertTrue(len >= prevLen + 2);
      // simple tests: 1) each should start with same degrees and 2) end with same hemisphere
      assertTrue(s.startsWith(prefix));
      assertEquals(letter, s.charAt(s.indexOf(')') - 1));
      prevLen = len;
    }
  }
 public void testHashCode() {
   assertEquals(a.hashCode(), b.hashCode());
   assertTrue(
       a.hashCode()
           != c
               .hashCode()); // this test isn't required by equals-hashCode contract but by how the
                             // hashCode is computed
 }
  public void testEquals() {
    // test equality with known geo-points
    assertEquals(a, b);
    assertFalse(a.equals(c));
    assertFalse(a.equals(d));
    assertFalse(c.equals(d));

    // test equality with any possible round off errors
    Geodetic3DPoint a2 =
        new Geodetic3DPoint(
            new Longitude(Math.toRadians(a.getLongitude().inDegrees())),
            new Latitude(Math.toRadians(a.getLatitude().inDegrees())),
            a.getElevation());
    assertEquals(a, a2);
    assertEquals(a.hashCode(), a2.hashCode());

    // approximate equals test for elevations up to 3 decimal places
    Geodetic3DPoint a3 =
        new Geodetic3DPoint(a.getLongitude(), a.getLatitude(), a.getElevation() + 10e-6);
    assertEquals(a, a3);
    assertEquals(a.hashCode(), a3.hashCode());
  }
  /** This method performs format conversions with string constructors in degrees and dms */
  public void testRandomEquals() {
    for (int i = 0; i < 1000; i++) {
      Geodetic3DPoint a1 = randomGeoPoint(r);
      Geodetic3DPoint a2 =
          new Geodetic3DPoint(a1.getLongitude(), a1.getLatitude(), a1.getElevation());
      // note by making equals() work in round off errors (such as in this case) using
      // Angle.equals() vs phi1=phi2 && lamb1==lamb2
      // but break contract in hashCode such that a.equals(b) -> true but hashCode(a) may not equal
      // hashCode(b)
      assertEquals(a1, a2);
      assertEquals(a1.hashCode(), a2.hashCode());

      // for symmetric tests to work elevation must be non-zero
      final double elevation = a1.getElevation();
      if (elevation == 0.0 || Math.abs(elevation) < 1e-8) a1.setElevation(1234.5);

      // test symmetric equals tests a.equals(b) -> b.equals(a)
      Geodetic2DPoint pt2 = new Geodetic2DPoint(a1.getLongitude(), a1.getLatitude());
      assertFalse(pt2.equals(a1));
      assertFalse(a1.equals(pt2));
      a1.setElevation(0);
      assertEquals(pt2, a1); // pt2.equals(al) -> a1.equals(pt2)
      assertEquals(a1, pt2);
    }
  }
 public void testNullCompare() {
   Geodetic3DPoint other = null;
   assertFalse(a.equals(other));
   Geodetic2DPoint p2 = null;
   assertFalse(a.equals(p2));
 }