// Path: src/cmanager/geo/Coordinate.java
// public class Coordinate implements Serializable
// {
//     private static final long serialVersionUID = -2526305963690482539L;
// 
//     public class UnparsableException extends Exception
//     {
//         private static final long serialVersionUID = -3199033370349089535L;
//     }
// 
// 
//     private double lat, lon;
// 
//     public Coordinate(String lat, String lon)
//     {
//         this(new Double(lat), new Double(lon));
//     }
// 
//     public Coordinate(String input) throws UnparsableException
//     {
//         Pattern pattern = Pattern.compile(
//             "N\\s*(\\d+)[\\s|°]\\s*((?:\\d+\\.\\d+)|(?:\\d+))'*\\s*E\\s*(\\d+)[\\s|°]\\s*((?:\\d+\\.\\d+)|(?:\\d+))'*\\s*");
//         final Matcher matcher = pattern.matcher(input);
// 
//         if (!matcher.find())
//         {
//             throw new UnparsableException();
//         }
// 
//         lat = new Double(matcher.group(1)) + new Double(matcher.group(2)) / 60;
//         lon = new Double(matcher.group(3)) + new Double(matcher.group(4)) / 60;
// 
//         if (matcher.find())
//         {
//             throw new UnparsableException();
//         }
//     }
// 
//     public Coordinate(double lat, double lon)
//     {
//         this.lat = lat;
//         this.lon = lon;
//     }
// 
//     public Double getLat()
//     {
//         return lat;
//     }
// 
//     public Double getLon()
//     {
//         return lon;
//     }
// 
//     public boolean equals(Coordinate c)
//     {
//         return lat == c.getLat() && lon == c.getLon();
//     }
// 
//     public String toString()
//     {
//         return new Double(lat).toString() + ", " + new Double(lon).toString();
//     }
// 
//     public double distanceHaversine(Coordinate other)
//     {
//         // "haversine" distance
//         // http://www.movable-type.co.uk/scripts/latlong.html
// 
//         final double radianFactor = 2 * Math.PI / 360;
// 
//         final double φ1 = lat * radianFactor;
//         final double φ2 = other.lat * radianFactor;
//         final double Δφ = (other.lat - lat) * radianFactor;
//         final double Δλ = (other.lon - lon) * radianFactor;
// 
//         final double a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +
//                          Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2);
//         final double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
// 
//         final double R = 6371e3; // metres
//         return R * c;
//     }
// 
//     public double distanceHaversineRounded(Coordinate c2)
//     {
//         return round(distanceHaversine(c2), 3);
//     }
// 
//     public static double round(double value, int places)
//     {
//         if (places < 0)
//             throw new IllegalArgumentException();
// 
//         BigDecimal bd = new BigDecimal(value);
//         bd = bd.setScale(places, RoundingMode.HALF_UP);
//         return bd.doubleValue();
//     }
// }
// 
// Path: src/cmanager/geo/Coordinate.java
// public class UnparsableException extends Exception
// {
//     private static final long serialVersionUID = -3199033370349089535L;
// }


import static org.junit.Assert.*;
import org.junit.Test;
import cmanager.geo.Coordinate;
import cmanager.geo.Coordinate.UnparsableException;
package cmanager.geo;


public class CoordinateTest
{

    @Test
    public void test()
    {
        Coordinate c1 = new Coordinate("1.23", "4.56");
        assertEquals(c1.getLat(), 1.23, 0.0);
        assertEquals(c1.getLon(), 4.56, 0.0);

        Coordinate c2 = new Coordinate(1.23, 4.56);
        assertEquals(c2.getLat(), 1.23, 0.0);
        assertEquals(c2.getLon(), 4.56, 0.0);
        assertEquals(c2.toString(), "1.23, 4.56");

        assertTrue(c1.equals(c2));
        assertEquals(c1.distanceHaversine(c2), 0, 0);

        Coordinate c3 = new Coordinate(1.23, 4.567);
        assertFalse(c1.equals(c3));
        assertEquals(c1.distanceHaversine(c3), 778.1851, 0.00009);
        assertEquals(c1.distanceHaversineRounded(c3), 778.185, 0);
    }


    @Test
    public void testDistance()
    {
        Coordinate c1 = new Coordinate(53.09780, 8.74908);
// Path: src/cmanager/geo/Coordinate.java
// public class Coordinate implements Serializable
// {
//     private static final long serialVersionUID = -2526305963690482539L;
// 
//     public class UnparsableException extends Exception
//     {
//         private static final long serialVersionUID = -3199033370349089535L;
//     }
// 
// 
//     private double lat, lon;
// 
//     public Coordinate(String lat, String lon)
//     {
//         this(new Double(lat), new Double(lon));
//     }
// 
//     public Coordinate(String input) throws UnparsableException
//     {
//         Pattern pattern = Pattern.compile(
//             "N\\s*(\\d+)[\\s|°]\\s*((?:\\d+\\.\\d+)|(?:\\d+))'*\\s*E\\s*(\\d+)[\\s|°]\\s*((?:\\d+\\.\\d+)|(?:\\d+))'*\\s*");
//         final Matcher matcher = pattern.matcher(input);
// 
//         if (!matcher.find())
//         {
//             throw new UnparsableException();
//         }
// 
//         lat = new Double(matcher.group(1)) + new Double(matcher.group(2)) / 60;
//         lon = new Double(matcher.group(3)) + new Double(matcher.group(4)) / 60;
// 
//         if (matcher.find())
//         {
//             throw new UnparsableException();
//         }
//     }
// 
//     public Coordinate(double lat, double lon)
//     {
//         this.lat = lat;
//         this.lon = lon;
//     }
// 
//     public Double getLat()
//     {
//         return lat;
//     }
// 
//     public Double getLon()
//     {
//         return lon;
//     }
// 
//     public boolean equals(Coordinate c)
//     {
//         return lat == c.getLat() && lon == c.getLon();
//     }
// 
//     public String toString()
//     {
//         return new Double(lat).toString() + ", " + new Double(lon).toString();
//     }
// 
//     public double distanceHaversine(Coordinate other)
//     {
//         // "haversine" distance
//         // http://www.movable-type.co.uk/scripts/latlong.html
// 
//         final double radianFactor = 2 * Math.PI / 360;
// 
//         final double φ1 = lat * radianFactor;
//         final double φ2 = other.lat * radianFactor;
//         final double Δφ = (other.lat - lat) * radianFactor;
//         final double Δλ = (other.lon - lon) * radianFactor;
// 
//         final double a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +
//                          Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2);
//         final double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
// 
//         final double R = 6371e3; // metres
//         return R * c;
//     }
// 
//     public double distanceHaversineRounded(Coordinate c2)
//     {
//         return round(distanceHaversine(c2), 3);
//     }
// 
//     public static double round(double value, int places)
//     {
//         if (places < 0)
//             throw new IllegalArgumentException();
// 
//         BigDecimal bd = new BigDecimal(value);
//         bd = bd.setScale(places, RoundingMode.HALF_UP);
//         return bd.doubleValue();
//     }
// }
// 
// Path: src/cmanager/geo/Coordinate.java
// public class UnparsableException extends Exception
// {
//     private static final long serialVersionUID = -3199033370349089535L;
// }


// Path: test/cmanager/geo/CoordinateTest.java
import static org.junit.Assert.*;
import org.junit.Test;
import cmanager.geo.Coordinate;
import cmanager.geo.Coordinate.UnparsableException;

package cmanager.geo;


public class CoordinateTest
{

    @Test
    public void test()
    {
        Coordinate c1 = new Coordinate("1.23", "4.56");
        assertEquals(c1.getLat(), 1.23, 0.0);
        assertEquals(c1.getLon(), 4.56, 0.0);

        Coordinate c2 = new Coordinate(1.23, 4.56);
        assertEquals(c2.getLat(), 1.23, 0.0);
        assertEquals(c2.getLon(), 4.56, 0.0);
        assertEquals(c2.toString(), "1.23, 4.56");

        assertTrue(c1.equals(c2));
        assertEquals(c1.distanceHaversine(c2), 0, 0);

        Coordinate c3 = new Coordinate(1.23, 4.567);
        assertFalse(c1.equals(c3));
        assertEquals(c1.distanceHaversine(c3), 778.1851, 0.00009);
        assertEquals(c1.distanceHaversineRounded(c3), 778.185, 0);
    }


    @Test
    public void testDistance()
    {
        Coordinate c1 = new Coordinate(53.09780, 8.74908);
        Coordinate c2 = new Coordinate(53.05735, 8.59148);