package au.gov.amsa.util.nmea;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.LinkedHashMap;
import java.util.List;
import org.junit.Test;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
public class NmeaUtilTest {
private static final String MESSAGE = "GPGSA,A,2,29,19,28,,,,,,,,,,23.4,12.1,20.0";
private static final String MESSAGE2A = "BSVDM,2,1,5,B,5Cm=9f000000h@q<000m>0H`u8@A8uA@0000000010D2600Ht00000000000,0";
private static final String MESSAGE2B = "BSVDM,2,2,5,B,00000000008,2";
private static final String CHECKSUM = "0F";
private static final String CHECKSUM2 = "13";
private static final String CHECKSUM_DELIMITER = "*";
private static final String DOLLAR = "$";
private static final String EXCLAMATION_POINT = "!";
private static final String TAG_BLOCK = "\\c:1234567*23\\";
@Test
public void testChecksumNoLeadingDollar() {
assertEquals(CHECKSUM, NmeaUtil.getChecksum(MESSAGE));
}
@Test
public void testChecksumLeadingDollar() {
assertEquals(CHECKSUM, NmeaUtil.getChecksum(DOLLAR + MESSAGE));
}
@Test
public void testChecksumLeadingExclamation() {
assertEquals(CHECKSUM, NmeaUtil.getChecksum(EXCLAMATION_POINT + MESSAGE));
}
@Test
public void testChecksumTwoLineMessage() {
assertEquals(CHECKSUM2, NmeaUtil.getChecksum(MESSAGE2A + MESSAGE2B, false));
}
@Test
public void testCreateProprietaryHeartbeatLine() {
String s = "$PAMSA," + System.currentTimeMillis() / 1000;
String c = NmeaUtil.getChecksum(s);
String sentence = s + "*" + c;
assertTrue(NmeaUtil.isValid(sentence));
}
@Test
public void testInstantiation() {
NmeaUtil.forTestCoverageOnly();
}
@Test
public void testIsValid() {
assertTrue(NmeaUtil.isValid(MESSAGE + CHECKSUM_DELIMITER + CHECKSUM));
}
@Test
public void testTalker() {
assertEquals(Talker.GP, NmeaUtil.parseNmea(DOLLAR + MESSAGE + CHECKSUM_DELIMITER + CHECKSUM).getTalker());
}
@Test
public void testChecksumCalculationIgnoresTagBlock() {
assertTrue(NmeaUtil.isValid(TAG_BLOCK + DOLLAR + MESSAGE + CHECKSUM_DELIMITER + CHECKSUM));
}
@Test
public void testIsValidNmeaWhenSentenceHasUnclosedTagBlock() {
assertFalse(NmeaUtil.isValid("\\"));
}
@Test
public void testIsValidFieldCharacter() {
assertFalse(NmeaUtil.isValidFieldCharacter((char) 0));
assertFalse(NmeaUtil.isValidFieldCharacter((char) 31));
assertTrue(NmeaUtil.isValidFieldCharacter((char) 32));
assertFalse(NmeaUtil.isValidFieldCharacter((char) 33));
assertFalse(NmeaUtil.isValidFieldCharacter((char) 36));
assertFalse(NmeaUtil.isValidFieldCharacter((char) 126));
assertFalse(NmeaUtil.isValidFieldCharacter((char) 127));
assertFalse(NmeaUtil.isValidFieldCharacter((char) 128));
}
@Test
public void testValidCharacterSymbol() {
assertTrue(NmeaUtil.isValidCharacterSymbol('A'));
assertTrue(NmeaUtil.isValidCharacterSymbol('a'));
assertTrue(NmeaUtil.isValidCharacterSymbol('B'));
assertFalse(NmeaUtil.isValidCharacterSymbol('b'));
}
@Test
public void testGetTalkerGivenNullString() {
assertNull(NmeaUtil.getTalker(null));
}
@Test
public void testGetTalkerGivenRealTalker() {
assertEquals(Talker.AB, NmeaUtil.getTalker("AB"));
}
@Test
public void testGetTalkerGivenUnknownTalker() {
assertEquals(Talker.UNKNOWN, NmeaUtil.getTalker("ZZ"));
}
@Test
public void testGetTalkerDescription() {
assertEquals("Independent AIS Base Station", NmeaUtil.getTalker("AB").getDescription());
}
@Test
public void testCanCreateNmeaLine() {
String line = "!BSVDM,2,1,0,A,577V7s02?k61I8Lg<00Dq@E918U<F1=@58000016Op`BL5D8tIm5@PDPCp0T,0*5B";
List<String> list = createSampleList();
String result = NmeaUtil.createNmeaLine(null, list);
assertEquals(line, result);
}
private List<String> createSampleList() {
List<String> list = Lists.newArrayList();
list.add("!BSVDM");
list.add("2");
list.add("1");
list.add("0");
list.add("A");
list.add("577V7s02?k61I8Lg<00Dq@E918U<F1=@58000016Op`BL5D8tIm5@PDPCp0T");
list.add("0");
return list;
}
@Test
public void testCreationOfTagBlock() {
String tag = "\\g:1-2-1536,c:1334258609*2F\\";
LinkedHashMap<String, String> tags = createSampleTags();
assertEquals(tag, NmeaUtil.createTagBlock(tags));
}
private LinkedHashMap<String, String> createSampleTags() {
LinkedHashMap<String, String> tags = Maps.newLinkedHashMap();
tags.put("g", "1-2-1536");
tags.put("c", "1334258609");
return tags;
}
@Test
public void testCreationOfNmeaLineFromTagsAndMessage() {
String tag = "\\g:1-2-1536,c:1334258609*2F\\";
String line = "!BSVDM,2,1,0,A,577V7s02?k61I8Lg<00Dq@E918U<F1=@58000016Op`BL5D8tIm5@PDPCp0T,0*5B";
List<String> list = createSampleList();
LinkedHashMap<String, String> tags = createSampleTags();
assertEquals(tag + line, NmeaUtil.createNmeaLine(tags, list));
}
@Test
public void testRoundTripOnNmeaMessageOnLineWithTagBlock() {
String line = "\\g:1-2-1234,s:r3669961,c:1120959341*0D\\!ABVDM,1,1,1,B,…..,0*39";
NmeaMessage m = NmeaUtil.parseNmea(line);
assertEquals(line, m.toLine());
}
@Test
public void testSupplementWithTimeDoesNothingToMultilineMessagesAfterFirst() {
String line = "\\g:2-2-3987*58\\!BSVDM,2,2,0,A,lQ@@0000002,0*00";
assertEquals("\\g:2-2-3987,c:0,a:0*5A\\!BSVDM,2,2,0,A,lQ@@0000002,0*00", NmeaUtil.supplementWithTime(line, 0));
}
@Test
public void testSupplementWithTimeAddsArrivalTimeIfMissing() {
String line = "\\s:rEV02,c:1334337322*5E\\!AIVDM,1,1,,B,14`980002?6UgpR1w0c8cG0L0Gww,0*58";
assertEquals("\\s:rEV02,c:1334337322,a:0*19\\!AIVDM,1,1,,B,14`980002?6UgpR1w0c8cG0L0Gww,0*58",
NmeaUtil.supplementWithTime(line, 0));
}
@Test
public void testSupplementWithTimeAddsTagBlockIfDoesntHaveOne() {
String line = "$PGHP,1,2012,1,31,5,55,12,0,316,3,316999999,1AIS_S,18*7A";
assertEquals("\\c:1234567,a:1234567890*1F\\" + line, NmeaUtil.supplementWithTime(line, 1234567890));
assertEquals("1F", NmeaUtil.getChecksum("c:1234567,a:1234567890"));
}
@Test
public void testSupplementWithTimeInsertsIntoExistingTagBlock() {
String line = "\\s:rEV02,d:1334337321*5A\\!AIVDM,1,1,,B,33:JeT0OjtVls<;fDlbl5CFH2000,0*71";
assertEquals(
"\\s:rEV02,d:1334337321,c:1234567,a:1234567890*69\\!AIVDM,1,1,,B,33:JeT0OjtVls<;fDlbl5CFH2000,0*71",
NmeaUtil.supplementWithTime(line, 1234567890));
assertEquals("69", NmeaUtil.getChecksum("s:rEV02,d:1334337321,c:1234567,a:1234567890"));
}
@Test
public void testSupplementWithTimeInsertsIntoTagBlockWhenMessageBlank() {
String line = "\\s:rEV02,d:1334337321*5A\\";
assertEquals("\\s:rEV02,d:1334337321,c:1234567,a:1234567890*69\\",
NmeaUtil.supplementWithTime(line, 1234567890));
assertEquals("69", NmeaUtil.getChecksum("s:rEV02,d:1334337321,c:1234567,a:1234567890"));
}
@Test
public void testSupplementWithTime() {
NmeaUtil.supplementWithTime("\\1G3:33799,s:Point Lookout,c:1486441015*73\\", 123);
}
}