Skip to content

Commit 9e24760

Browse files
committed
Merge pull request #2 from b0n541/master
Unicode handling and checking of high precision Mapcodes
2 parents 2dfd255 + 788097b commit 9e24760

File tree

2 files changed

+100
-52
lines changed

2 files changed

+100
-52
lines changed

src/main/java/com/mapcode/Decoder.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616

1717
package com.mapcode;
1818

19+
import javax.annotation.Nonnull;
20+
1921
import org.slf4j.Logger;
2022
import org.slf4j.LoggerFactory;
2123

22-
import javax.annotation.Nonnull;
23-
2424
class Decoder {
2525
private static final Logger LOG = LoggerFactory.getLogger(Decoder.class);
2626

@@ -29,7 +29,9 @@ class Decoder {
2929
// ----------------------------------------------------------------------
3030

3131
@Nonnull
32-
static Point decode(@Nonnull final String argMapcode, @Nonnull final Territory argTerritory) {
32+
static Point decode(@Nonnull final String argMapcode,
33+
@Nonnull final Territory argTerritory)
34+
throws UnknownMapcodeException {
3335
LOG.trace("decode: mapcode={}, territory={}", argMapcode, argTerritory.name());
3436

3537
String mapcode = argMapcode;
@@ -41,7 +43,10 @@ static Point decode(@Nonnull final String argMapcode, @Nonnull final Territory a
4143

4244
final int minpos = mapcode.indexOf('-');
4345
if (minpos > 0) {
44-
extrapostfix = mapcode.substring(minpos + 1).trim();
46+
extrapostfix = decodeUTF16(mapcode.substring(minpos + 1).trim());
47+
if (extrapostfix.contains("Z")) {
48+
throw new UnknownMapcodeException("Invalid character Z");
49+
}
4550
mapcode = mapcode.substring(0, minpos);
4651
}
4752

src/test/java/com/mapcode/DecoderTest.java

Lines changed: 91 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@
1616

1717
package com.mapcode;
1818

19+
import static org.junit.Assert.assertEquals;
20+
1921
import org.junit.Test;
2022
import org.slf4j.Logger;
2123
import org.slf4j.LoggerFactory;
2224

23-
import static org.junit.Assert.assertEquals;
24-
2525
@SuppressWarnings({"OverlyBroadThrowsClause", "ProhibitedExceptionDeclared"})
2626
public class DecoderTest {
2727
private static final Logger LOG = LoggerFactory.getLogger(DecoderTest.class);
@@ -58,52 +58,71 @@ public void highPrecisionTomTomOffice2() throws Exception {
5858
assertEquals("decodeTomTomOffice hi-precision longitude", 4908540, point.getLonMicroDeg());
5959
}
6060

61-
@Test
62-
public void unicodeMapcodeAthensAcropolis1() throws Exception {
63-
LOG.info("unicodeMapcodeAthensAcropolis1");
64-
final Point point = MapcodeCodec.decode("ΗΠ.Θ2", Territory.GRC);
65-
assertEquals("decodeUnicode latitude", 37971812, point.getLatMicroDeg());
66-
assertEquals("decodeUnicode longitude", 23726247,
67-
point.getLonMicroDeg());
68-
}
69-
70-
@Test
71-
public void unicodeMapcodeAthensAcropolis2() throws Exception {
72-
LOG.info("unicodeMapcodeAthensAcropolis2");
73-
final Point point = MapcodeCodec.decode("GRC ΗΠ.Θ2");
74-
assertEquals("decodeUnicode latitude", 37971812, point.getLatMicroDeg());
75-
assertEquals("decodeUnicode longitude", 23726247,
76-
point.getLonMicroDeg());
77-
}
78-
79-
@Test
80-
public void unicodeMapcodeTokyoTower1() throws Exception {
81-
LOG.info("unicodeMapcodeTokyoTower1");
82-
final Point point = MapcodeCodec.decode("\u30c1\u30ca.8\u30c1", Territory.JPN);
83-
assertEquals("decodeUnicode latitude", 35658660, point.getLatMicroDeg());
84-
assertEquals("decodeUnicode longitude", 139745394,
85-
point.getLonMicroDeg());
86-
}
87-
88-
@Test
89-
public void unicodeMapcodeTokyoTower2() throws Exception {
90-
LOG.info("unicodeMapcodeTokyoTower2");
91-
final Point point = MapcodeCodec.decode("JPN \u30c1\u30ca.8\u30c1");
92-
assertEquals("decodeUnicode latitude", 35658660, point.getLatMicroDeg());
93-
assertEquals("decodeUnicode longitude", 139745394,
94-
point.getLonMicroDeg());
95-
}
96-
97-
@Test
98-
public void mapCodeWithZeroGroitzsch() throws Exception {
99-
LOG.info("mapCodeWithZeroGroitzsch");
100-
final Point point = MapcodeCodec.decode("HMVM.3Q0", Territory.DEU);
101-
assertEquals("decodeUnicode latitude", 51154852, point.getLatMicroDeg());
102-
assertEquals("decodeUnicode longitude", 12278574,
103-
point.getLonMicroDeg());
104-
}
105-
106-
@Test(expected = UnknownMapcodeException.class)
61+
@Test
62+
public void highPrecisionUnicodeAthensAcropolis1() throws Exception {
63+
LOG.info("highPrecisionUnicodeAthensAcropolis1");
64+
final Point point = MapcodeCodec.decode("ΗΠ.Θ2-Φ2", Territory.GRC);
65+
assertEquals("decodeUnicode latitude", 37971844, point.getLatMicroDeg());
66+
assertEquals("decodeUnicode longitude", 23726223,
67+
point.getLonMicroDeg());
68+
}
69+
70+
@Test
71+
public void highPrecisionUnicodeAthensAcropolis2() throws Exception {
72+
LOG.info("highPrecisionUnicodeAthensAcropolis2");
73+
final Point point = MapcodeCodec.decode("GRC ΗΠ.Θ2-Φ2");
74+
assertEquals("decodeUnicode latitude", 37971844, point.getLatMicroDeg());
75+
assertEquals("decodeUnicode longitude", 23726223,
76+
point.getLonMicroDeg());
77+
}
78+
79+
@Test
80+
public void unicodeMapcodeAthensAcropolis1() throws Exception {
81+
LOG.info("unicodeMapcodeAthensAcropolis1");
82+
final Point point = MapcodeCodec.decode("ΗΠ.Θ2", Territory.GRC);
83+
assertEquals("decodeUnicode latitude", 37971812, point.getLatMicroDeg());
84+
assertEquals("decodeUnicode longitude", 23726247,
85+
point.getLonMicroDeg());
86+
}
87+
88+
@Test
89+
public void unicodeMapcodeAthensAcropolis2() throws Exception {
90+
LOG.info("unicodeMapcodeAthensAcropolis2");
91+
final Point point = MapcodeCodec.decode("GRC ΗΠ.Θ2");
92+
assertEquals("decodeUnicode latitude", 37971812, point.getLatMicroDeg());
93+
assertEquals("decodeUnicode longitude", 23726247,
94+
point.getLonMicroDeg());
95+
}
96+
97+
@Test
98+
public void unicodeMapcodeTokyoTower1() throws Exception {
99+
LOG.info("unicodeMapcodeTokyoTower1");
100+
final Point point = MapcodeCodec.decode("\u30c1\u30ca.8\u30c1",
101+
Territory.JPN);
102+
assertEquals("decodeUnicode latitude", 35658660, point.getLatMicroDeg());
103+
assertEquals("decodeUnicode longitude", 139745394,
104+
point.getLonMicroDeg());
105+
}
106+
107+
@Test
108+
public void unicodeMapcodeTokyoTower2() throws Exception {
109+
LOG.info("unicodeMapcodeTokyoTower2");
110+
final Point point = MapcodeCodec.decode("JPN \u30c1\u30ca.8\u30c1");
111+
assertEquals("decodeUnicode latitude", 35658660, point.getLatMicroDeg());
112+
assertEquals("decodeUnicode longitude", 139745394,
113+
point.getLonMicroDeg());
114+
}
115+
116+
@Test
117+
public void mapCodeWithZeroGroitzsch() throws Exception {
118+
LOG.info("mapCodeWithZeroGroitzsch");
119+
final Point point = MapcodeCodec.decode("HMVM.3Q0", Territory.DEU);
120+
assertEquals("decodeUnicode latitude", 51154852, point.getLatMicroDeg());
121+
assertEquals("decodeUnicode longitude", 12278574,
122+
point.getLonMicroDeg());
123+
}
124+
125+
@Test(expected = UnknownMapcodeException.class)
107126
public void invalidTerritory() throws Exception {
108127
LOG.info("invalidTerritory");
109128
MapcodeCodec.decode("NLD 49.4V", Territory.NLD);
@@ -139,6 +158,30 @@ public void invalidDotLocation4() throws Exception {
139158
MapcodeCodec.decode("494.V494V", Territory.NLD);
140159
}
141160

161+
@Test(expected = UnknownMapcodeException.class)
162+
public void invalidHighPrecisionCharacter() throws Exception {
163+
LOG.info("invalidHighPrecisionCharacter");
164+
MapcodeCodec.decode("49.4V-Z", Territory.NLD);
165+
}
166+
167+
@Test(expected = UnknownMapcodeException.class)
168+
public void invalidHighPrecisionCharacter2() throws Exception {
169+
LOG.info("invalidHighPrecisionCharacter2");
170+
MapcodeCodec.decode("49.4V-HZ", Territory.NLD);
171+
}
172+
173+
@Test(expected = UnknownMapcodeException.class)
174+
public void invalidHighPrecisionCharacter3() throws Exception {
175+
LOG.info("invalidHighPrecisionCharacter3");
176+
MapcodeCodec.decode("ΗΠ.Θ2-Б", Territory.GRC);
177+
}
178+
179+
@Test(expected = UnknownMapcodeException.class)
180+
public void invalidHighPrecisionCharacter4() throws Exception {
181+
LOG.info("invalidHighPrecisionCharacter4");
182+
MapcodeCodec.decode("ΗΠ.Θ2-ББ", Territory.GRC);
183+
}
184+
142185
@SuppressWarnings("ConstantConditions")
143186
@Test(expected = IllegalArgumentException.class)
144187
public void illegalArgument1() throws Exception {

0 commit comments

Comments
 (0)