1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
package cgeo.geocaching.geopoint;
import static org.assertj.core.api.Assertions.assertThat;
import cgeo.geocaching.utils.Formatter;
import android.test.AndroidTestCase;
public class GeoPointParserTest extends AndroidTestCase {
private static final double refLongitude = 8.0 + 38.564 / 60.0;
private static final double refLatitude = 49.0 + 56.031 / 60.0;
public static void testParseLatitude() {
assertEquals(refLatitude, GeopointParser.parseLatitude("N 49° 56.031"), 1e-8);
}
public static void testParseLongitude() {
assertEquals(refLongitude, GeopointParser.parseLongitude("E 8° 38.564"), 1e-8);
}
public static void testFullCoordinates() {
final Geopoint goal = new Geopoint(refLatitude, refLongitude);
assertEquals(goal, GeopointParser.parse("N 49° 56.031 | E 8° 38.564"), 1e-6);
}
private static void assertEquals(final Geopoint expected, Geopoint actual, double tolerance) {
assertThat(expected).isNotNull();
assertThat(actual).isNotNull();
assertThat(expected.distanceTo(actual) <= tolerance).isTrue();
}
public static void testCoordinateMissingPart() {
// we are trying to parse a _point_, but have only a latitude. Don't accept the numerical part as longitude!
Geopoint point = null;
try {
point = GeopointParser.parse("N 49° 56.031");
} catch (Geopoint.ParseException e) {
// expected
}
assertThat(point).isNull();
}
public static void testSouth() {
assertEquals(-refLatitude, GeopointParser.parseLatitude("S 49° 56.031"), 1e-8);
}
public static void testWest() {
assertEquals(-refLongitude, GeopointParser.parseLongitude("W 8° 38.564"), 1e-8);
}
public static void testLowerCase() {
assertEquals(refLongitude, GeopointParser.parseLongitude("e 8° 38.564"), 1e-8);
}
public static void testVariousFormats() {
final Geopoint goal1 = GeopointParser.parse("N 49° 43' 57\" | E 2 12' 35");
final Geopoint goal2 = GeopointParser.parse("N 49 43.95 E2°12.5833333333");
assertEquals(goal1, goal2, 1e-6);
}
public static void testParseOurOwnSeparator() {
final Geopoint separator = GeopointParser.parse("N 49° 43' 57\"" + Formatter.SEPARATOR + "E 2 12' 35");
final Geopoint noSeparator = GeopointParser.parse("N 49 43.95 E2°12.5833333333");
assertEquals(separator, noSeparator, 1e-6);
}
public static void testInSentence() {
final Geopoint p1 = GeopointParser.parse("Station3: N51 21.523 / E07 02.680");
final Geopoint p2 = GeopointParser.parse("N51 21.523 E07 02.680");
assertThat(p1).isNotNull();
assertThat(p2).isNotNull();
assertThat(p2).isEqualTo(p1);
}
public static void testUnrelatedParts() {
Geopoint point = null;
try {
point = GeopointParser.parse("N51 21.523 and some words in between, so there is no relation E07 02.680");
} catch (Geopoint.ParseException e) {
// expected
}
assertThat(point).isNull();
}
public static void testComma() {
final Geopoint pointComma = GeopointParser.parse("N 46° 27' 55,65''\n" +
"E 15° 53' 41,68''");
final Geopoint pointDot = GeopointParser.parse("N 46° 27' 55.65''\n" +
"E 15° 53' 41.68''");
assertThat(pointComma).isNotNull();
assertThat(pointDot).isNotNull();
assertThat(pointDot).isEqualTo(pointComma);
}
public static void testBlankAddedByAutocorrectionDot() {
assertEquals(refLatitude, GeopointParser.parseLatitude("N 49° 56. 031"), 1e-8);
}
public static void testBlankAddedByAutocorrectionComma() {
assertEquals(refLatitude, GeopointParser.parseLatitude("N 49° 56, 031"), 1e-8);
}
public static void testNonTrimmed() {
assertEquals(refLatitude, GeopointParser.parseLatitude(" N 49° 56, 031 "), 1e-8);
}
public static void testEquatorGC53() {
assertEquals(new Geopoint(0, 36), GeopointParser.parse("00° 00.000 E 036° 00.000"));
}
public static void testMeridian() {
assertEquals(new Geopoint(23, 0), GeopointParser.parse("N 23° 00.000 00° 00.000"));
}
public static void testEquatorMeridian() {
assertThat(GeopointParser.parse("00° 00.000 00° 00.000")).isEqualTo(Geopoint.ZERO);
}
}
|