package au.gov.amsa.util.nmea; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.LinkedHashMap; import org.junit.Test; import com.google.common.collect.Lists; import com.google.common.collect.Maps; public class NmeaMessageParserTest { @Test public void testNmeaMessageParser() { String line = "\\g:3-3-1234*hh\\$ABVSI,r3669961,1,013536.96326433,1386,-98,,*hh"; NmeaMessage n = NmeaUtil.parseNmea(line); assertEquals("3-3-1234", n.getSentenceGroupingFromTagBlock()); assertNull(n.getSource()); assertNull(n.getDestination()); assertNull(n.getLineCount()); assertNull(n.getRelativeTimeMillis()); assertNull(n.getText()); assertNull(n.getUnixTimeMillis()); assertEquals("$ABVSI", n.getItems().get(0)); assertEquals("r3669961", n.getItems().get(1)); assertEquals(8, n.getItems().size()); } @Test public void testParsingOfTimeAndSourceInTagBlock() { String line = "\\g:1-2-1234,s:r3669961,c:1120959341*hh\\!ABVDM,1,1,1,B,…..,0*hh"; NmeaMessage n = NmeaUtil.parseNmea(line); assertEquals("1-2-1234", n.getSentenceGroupingFromTagBlock()); assertEquals(1, (int) n.getSentenceNumber()); assertEquals(2, (int) n.getSentenceCount()); assertEquals("1234", n.getSentenceGroupId()); assertEquals("r3669961", n.getSource()); assertNull(n.getDestination()); assertNull(n.getLineCount()); assertNull(n.getRelativeTimeMillis()); assertNull(n.getText()); assertEquals(1120959341000L, (long) n.getUnixTimeMillis()); } @Test public void testParsingWithoutTagBlock() { String line = "$ABVSI,r3669961,1,013536.96326433,1386,-98,,*hh"; NmeaMessage n = NmeaUtil.parseNmea(line); assertEquals("$ABVSI", n.getItems().get(0)); assertEquals("r3669961", n.getItems().get(1)); assertEquals(8, n.getItems().size()); assertNull(n.getSentenceGroupingFromTagBlock()); assertNull(n.getSentenceCount()); } @Test(expected = NmeaMessageParseException.class) public void testBadTagBlockParameterNotSplitWithColon() { String line = "\\g*hh\\!ABVDM,1,1,1,B,…..,0*hh"; NmeaUtil.parseNmea(line); } @Test(expected = NmeaMessageParseException.class) public void testBadTagBlockTooManyColons() { String line = "\\g:1:2*hh\\!ABVDM,1,1,1,B,…..,0*hh"; NmeaUtil.parseNmea(line); } @Test public void testNmeaMessageRelativeTimeAndLineCount() { String line = "\\g:1-2-1234,s:r3669961,n:4,r:1120959341*hh\\!ABVDM,1,1,1,B,…..,0*hh"; NmeaMessage n = NmeaUtil.parseNmea(line); assertEquals(1120959341000L, (long) n.getRelativeTimeMillis()); assertEquals(4, (int) n.getLineCount()); } @Test(expected = NmeaMessageParseException.class) public void testNmeaMessageWhenTagBlockNotClosedProperly() { String line = "\\g:1-2-1234,s:r3669961,n:4,r:1120959341,some stuff here"; NmeaUtil.parseNmea(line); } @Test public void testNmeaMessageParsingWhenChecksumNotPresent() { String line = "!AIVDM,1,1,,A,H5MfwBTU653hhhiG3Gookn1P=440,0*2F,1334365469"; NmeaUtil.parseNmea(line); } @Test public void testParseOfNmeaLineWithOnlyTwoElements() { String line = "C9,0*5D"; NmeaUtil.parseNmea(line); } @Test public void testTalkerPartTooShortDoesNotThrowException() { String msg = "DM,1,1,,B,37PACP001T8F=lil<<r7dV9R00sh,0*6B"; new NmeaMessageParser().parse(msg); } @Test public void testMultiSentenceOnLineWithoutTagBlock() { String line1 = "!AIVDM,2,1,3,A,57P@t402AG69HPPr2218UHE9LTa>0l58T62222001p@654bd,0*59"; NmeaMessage n = new NmeaMessageParser().parse(line1); assertEquals(1, n.getSentenceNumber().intValue()); assertEquals(2, n.getSentenceCount().intValue()); assertEquals("3", n.getSentenceGroupId()); } @Test public void testMultiSentenceOnLineWithTagBlock() { String line1 = "\\g:1-2-1130*5E\\!BSVDM,2,1,0,A,00000000002,0*3D"; NmeaMessage n = new NmeaMessageParser().parse(line1); assertEquals(1, n.getSentenceNumber().intValue()); assertEquals(2, n.getSentenceCount().intValue()); assertEquals("1130", n.getSentenceGroupId()); } @Test public void testBadSentenceInfoDoesNotThrowException() { String msg = "!ABVDM,2,2,,,88888888800000000000000000000,4*50"; new NmeaMessageParser().parse(msg); } @Test(expected = NmeaMessageParseException.class) public void testBadSententenceThrowsNmeaMessageParseException() { String msg = "\\s:Penrith Island*08\\!ABVDM,1,1\\s:Penrith Island*08\\!ABVDM,1,1,8,B,13bjW80000bcKtkkl=wEroaD28HF,0*12"; new NmeaMessageParser().parse(msg); } @Test(expected = NmeaMessageParseException.class) public void testGTagDoesNotHaveSufficientPartsThrowsNmeaMessageParseException() { LinkedHashMap<String, String> map = Maps.newLinkedHashMap(); map.put("g", "1-2"); new NmeaMessage(map, Lists.<String> newArrayList("ABVDN", "2", "2"), "00"); } @Test public void testSatelliteMessageFromEv05() { String msg = "\\s:rEV05,c:1399340268*3e\\!AIVDM,1,1,,B,19NWq7h02i9q0bGcNT05NDQN04:D,0*3F"; NmeaMessage n = new NmeaMessageParser().parse(msg); assertEquals(1399340268000L, (long) n.getUnixTimeMillis()); } @Test public void testParseOnly2ItemsInMessage() { String msg = "\\c:1388929778*00\\!ABF?:0000,0*5D"; NmeaMessage n = new NmeaMessageParser().parse(msg); assertEquals(1388929778000L, (long) n.getUnixTimeMillis()); } @Test public void testTagBlockThatIncludesAValueWithAColonIsParsedCorrectly() { String msg = "\\s:rEV06,c:1418371240,i:|X=1|D=1|T=41985.3864759144|P=10.225.253.129:25479|R=IN|*54\\!AIVDM,1,1,,A,13IMtL01BC4mJ7uurMNWP6;>08H:,0*03"; NmeaMessage n = new NmeaMessageParser().parse(msg); LinkedHashMap<String, String> tags = n.getTags(); assertEquals("rEV06", tags.get("s")); assertEquals("1418371240", tags.get("c")); assertEquals("|X=1|D=1|T=41985.3864759144|P=10.225.253.129:25479|R=IN|", tags.get("i")); assertEquals(3, tags.size()); } @Test public void testNmeaWithBackSlashCorruptionInTagBlock() { String msg = "\\s:rEV61,c\\g:1-2-8541,s:rEV61,c:1427240143*20\\!AIVDM,2,1,3,A,53K=Fr42<hQKTP7?KKL<58pUH4j0hDLDp@00000t4T1DD4tj0DTnA3QF@00000,0*18"; NmeaMessage n = new NmeaMessageParser().parse(msg); assertNotNull(n.getTags().get("c\\g")); } @Test public void testNmeaWithBadFormat() { String msg = "\\s:Pt Hedland NOMAD,c:14301062\\s:Penrith Island*08\\!ABVDM,1,1,2,B,404k0nQuu=SjC:inuikL5JQ00<09,0*12"; NmeaMessage n = new NmeaMessageParser().parse(msg); assertNull(n.getUnixTimeMillis()); } @Test public void testNmeaWithTagBlockOnly() { String msg = "\\1G4:53958,s:Gantheaume Pt,c:1481700261*7D\\"; NmeaMessage m = NmeaUtil.parseNmea(msg); assertNotNull(m); String s = NmeaUtil.supplementWithTime(msg, 1000); assertEquals("\\1G4:53958,s:Gantheaume Pt,c:1481700261,a:1000*0B\\", s); } @Test public void testExtractTagsReturnsEmptyMapWhenDoesNotHaveChecksumDelimiter() { assertTrue(NmeaMessageParser.extractTags("c:12334,a:3456").isEmpty()); } }