Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions src/main/java/com/mapcode/Decoder.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@

package com.mapcode;

import javax.annotation.Nonnull;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.Nonnull;

class Decoder {
private static final Logger LOG = LoggerFactory.getLogger(Decoder.class);

Expand All @@ -29,7 +29,9 @@ class Decoder {
// ----------------------------------------------------------------------

@Nonnull
static Point decode(@Nonnull final String argMapcode, @Nonnull final Territory argTerritory) {
static Point decode(@Nonnull final String argMapcode,
@Nonnull final Territory argTerritory)
throws UnknownMapcodeException {
LOG.trace("decode: mapcode={}, territory={}", argMapcode, argTerritory.name());

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

final int minpos = mapcode.indexOf('-');
if (minpos > 0) {
extrapostfix = mapcode.substring(minpos + 1).trim();
extrapostfix = decodeUTF16(mapcode.substring(minpos + 1).trim());
if (extrapostfix.contains("Z")) {
throw new UnknownMapcodeException("Invalid character Z");
}
mapcode = mapcode.substring(0, minpos);
}

Expand Down
139 changes: 91 additions & 48 deletions src/test/java/com/mapcode/DecoderTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@

package com.mapcode;

import static org.junit.Assert.assertEquals;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import static org.junit.Assert.assertEquals;

@SuppressWarnings({"OverlyBroadThrowsClause", "ProhibitedExceptionDeclared"})
public class DecoderTest {
private static final Logger LOG = LoggerFactory.getLogger(DecoderTest.class);
Expand Down Expand Up @@ -58,52 +58,71 @@ public void highPrecisionTomTomOffice2() throws Exception {
assertEquals("decodeTomTomOffice hi-precision longitude", 4908540, point.getLonMicroDeg());
}

@Test
public void unicodeMapcodeAthensAcropolis1() throws Exception {
LOG.info("unicodeMapcodeAthensAcropolis1");
final Point point = MapcodeCodec.decode("ΗΠ.Θ2", Territory.GRC);
assertEquals("decodeUnicode latitude", 37971812, point.getLatMicroDeg());
assertEquals("decodeUnicode longitude", 23726247,
point.getLonMicroDeg());
}

@Test
public void unicodeMapcodeAthensAcropolis2() throws Exception {
LOG.info("unicodeMapcodeAthensAcropolis2");
final Point point = MapcodeCodec.decode("GRC ΗΠ.Θ2");
assertEquals("decodeUnicode latitude", 37971812, point.getLatMicroDeg());
assertEquals("decodeUnicode longitude", 23726247,
point.getLonMicroDeg());
}

@Test
public void unicodeMapcodeTokyoTower1() throws Exception {
LOG.info("unicodeMapcodeTokyoTower1");
final Point point = MapcodeCodec.decode("\u30c1\u30ca.8\u30c1", Territory.JPN);
assertEquals("decodeUnicode latitude", 35658660, point.getLatMicroDeg());
assertEquals("decodeUnicode longitude", 139745394,
point.getLonMicroDeg());
}

@Test
public void unicodeMapcodeTokyoTower2() throws Exception {
LOG.info("unicodeMapcodeTokyoTower2");
final Point point = MapcodeCodec.decode("JPN \u30c1\u30ca.8\u30c1");
assertEquals("decodeUnicode latitude", 35658660, point.getLatMicroDeg());
assertEquals("decodeUnicode longitude", 139745394,
point.getLonMicroDeg());
}

@Test
public void mapCodeWithZeroGroitzsch() throws Exception {
LOG.info("mapCodeWithZeroGroitzsch");
final Point point = MapcodeCodec.decode("HMVM.3Q0", Territory.DEU);
assertEquals("decodeUnicode latitude", 51154852, point.getLatMicroDeg());
assertEquals("decodeUnicode longitude", 12278574,
point.getLonMicroDeg());
}

@Test(expected = UnknownMapcodeException.class)
@Test
public void highPrecisionUnicodeAthensAcropolis1() throws Exception {
LOG.info("highPrecisionUnicodeAthensAcropolis1");
final Point point = MapcodeCodec.decode("ΗΠ.Θ2-Φ2", Territory.GRC);
assertEquals("decodeUnicode latitude", 37971844, point.getLatMicroDeg());
assertEquals("decodeUnicode longitude", 23726223,
point.getLonMicroDeg());
}

@Test
public void highPrecisionUnicodeAthensAcropolis2() throws Exception {
LOG.info("highPrecisionUnicodeAthensAcropolis2");
final Point point = MapcodeCodec.decode("GRC ΗΠ.Θ2-Φ2");
assertEquals("decodeUnicode latitude", 37971844, point.getLatMicroDeg());
assertEquals("decodeUnicode longitude", 23726223,
point.getLonMicroDeg());
}

@Test
public void unicodeMapcodeAthensAcropolis1() throws Exception {
LOG.info("unicodeMapcodeAthensAcropolis1");
final Point point = MapcodeCodec.decode("ΗΠ.Θ2", Territory.GRC);
assertEquals("decodeUnicode latitude", 37971812, point.getLatMicroDeg());
assertEquals("decodeUnicode longitude", 23726247,
point.getLonMicroDeg());
}

@Test
public void unicodeMapcodeAthensAcropolis2() throws Exception {
LOG.info("unicodeMapcodeAthensAcropolis2");
final Point point = MapcodeCodec.decode("GRC ΗΠ.Θ2");
assertEquals("decodeUnicode latitude", 37971812, point.getLatMicroDeg());
assertEquals("decodeUnicode longitude", 23726247,
point.getLonMicroDeg());
}

@Test
public void unicodeMapcodeTokyoTower1() throws Exception {
LOG.info("unicodeMapcodeTokyoTower1");
final Point point = MapcodeCodec.decode("\u30c1\u30ca.8\u30c1",
Territory.JPN);
assertEquals("decodeUnicode latitude", 35658660, point.getLatMicroDeg());
assertEquals("decodeUnicode longitude", 139745394,
point.getLonMicroDeg());
}

@Test
public void unicodeMapcodeTokyoTower2() throws Exception {
LOG.info("unicodeMapcodeTokyoTower2");
final Point point = MapcodeCodec.decode("JPN \u30c1\u30ca.8\u30c1");
assertEquals("decodeUnicode latitude", 35658660, point.getLatMicroDeg());
assertEquals("decodeUnicode longitude", 139745394,
point.getLonMicroDeg());
}

@Test
public void mapCodeWithZeroGroitzsch() throws Exception {
LOG.info("mapCodeWithZeroGroitzsch");
final Point point = MapcodeCodec.decode("HMVM.3Q0", Territory.DEU);
assertEquals("decodeUnicode latitude", 51154852, point.getLatMicroDeg());
assertEquals("decodeUnicode longitude", 12278574,
point.getLonMicroDeg());
}

@Test(expected = UnknownMapcodeException.class)
public void invalidTerritory() throws Exception {
LOG.info("invalidTerritory");
MapcodeCodec.decode("NLD 49.4V", Territory.NLD);
Expand Down Expand Up @@ -139,6 +158,30 @@ public void invalidDotLocation4() throws Exception {
MapcodeCodec.decode("494.V494V", Territory.NLD);
}

@Test(expected = UnknownMapcodeException.class)
public void invalidHighPrecisionCharacter() throws Exception {
LOG.info("invalidHighPrecisionCharacter");
MapcodeCodec.decode("49.4V-Z", Territory.NLD);
}

@Test(expected = UnknownMapcodeException.class)
public void invalidHighPrecisionCharacter2() throws Exception {
LOG.info("invalidHighPrecisionCharacter2");
MapcodeCodec.decode("49.4V-HZ", Territory.NLD);
}

@Test(expected = UnknownMapcodeException.class)
public void invalidHighPrecisionCharacter3() throws Exception {
LOG.info("invalidHighPrecisionCharacter3");
MapcodeCodec.decode("ΗΠ.Θ2-Б", Territory.GRC);
}

@Test(expected = UnknownMapcodeException.class)
public void invalidHighPrecisionCharacter4() throws Exception {
LOG.info("invalidHighPrecisionCharacter4");
MapcodeCodec.decode("ΗΠ.Θ2-ББ", Territory.GRC);
}

@SuppressWarnings("ConstantConditions")
@Test(expected = IllegalArgumentException.class)
public void illegalArgument1() throws Exception {
Expand Down