/* Copyright (c) 2011 Danish Maritime Authority.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dk.dma.ais.sentence;
import java.util.ArrayList;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import dk.dma.ais.binary.SixbitException;
import dk.dma.ais.message.AisMessage;
import dk.dma.ais.message.AisMessage12;
import dk.dma.ais.message.AisMessage6;
import dk.dma.ais.message.AisMessage8;
import dk.dma.ais.message.AisMessageException;
import dk.dma.ais.message.binary.AsmAcknowledge;
import dk.dma.ais.message.binary.BroadcastRouteInformation;
public class EncodeParseTest {
/**
* Test parsing of encoded ABM message
*
* @throws SixbitException
* @throws SentenceException
* @throws AisMessageException
*/
@Test
public void testAbmEncodeParse() throws SixbitException, SentenceException, AisMessageException {
// Make ABM
AisMessage12 msg12 = new AisMessage12();
String msg = "LONG MESSAGE LONG MESSAGE LONG MESSAGE LONG MESSAGE LONG MESSAGE LONG MESSAGE";
msg12.setMessage(msg);
Abm abm = new Abm();
abm.setTalker("AI");
abm.setDestination(992199007);
abm.setTextData(msg12);
abm.setSequence(1);
abm.setChannel(null);
// Encode ABM
SendSentence[] sentences = abm.split();
List<String> strSentences = new ArrayList<>();
for (SendSentence sendSentence : sentences) {
strSentences.add(sendSentence.getEncoded());
}
Assert.assertEquals(2, strSentences.size());
// Parse ABM
abm = new Abm();
int res = abm.parse(strSentences.get(0));
Assert.assertEquals(1, res);
res = abm.parse(strSentences.get(1));
Assert.assertEquals(0, res);
Assert.assertEquals(1, abm.getSequence());
Assert.assertEquals(992199007, abm.getDestination());
Assert.assertEquals(12, abm.getMsgId());
// Make VDM
Vdm[] vdms = abm.makeVdm(219000000, 0, 0).createSentences();
String[] strVdms = new String[vdms.length];
for (int i = 0; i < vdms.length; i++) {
strVdms[i] = vdms[i].getEncoded();
}
Assert.assertEquals(2, strVdms.length);
// Parse VDM
Vdm vdm = new Vdm();
Assert.assertEquals(1, vdm.parse(strVdms[0]));
Assert.assertEquals(0, vdm.parse(strVdms[1]));
// Get AIS message
AisMessage aisMessage = AisMessage.getInstance(vdm);
Assert.assertEquals(12, aisMessage.getMsgId());
msg12 = (AisMessage12) aisMessage;
Assert.assertTrue(msg12.getMessage().equals(msg));
}
@Test
public void testMsg6AbmDecode() throws SentenceException, SixbitException, AisMessageException {
// Parse ABM
Abm abm = new Abm();
Assert.assertEquals(0, abm.parse("!AIABM,1,1,2,992199014,0,6,04D0G6EB00000000,0*72"));
Assert.assertEquals(2, abm.getSequence());
Assert.assertEquals(992199014, abm.getDestination());
// Make VDM from ABM
Vdm[] vdms = abm.makeVdm(219000000, 0, 0).createSentences();
String[] sentences = new String[vdms.length];
for (int i = 0; i < vdms.length; i++) {
sentences[i] = vdms[i].getEncoded();
}
Assert.assertEquals(1, sentences.length);
Assert.assertTrue(vdms[0].getChannel() == '0');
// Parse VDM
Vdm vdm = new Vdm();
Assert.assertEquals(0, vdm.parse(sentences[0]));
// Get AIS message
AisMessage aisMessage = AisMessage.getInstance(vdm);
Assert.assertEquals(6, aisMessage.getMsgId());
AisMessage6 msg6 = (AisMessage6) aisMessage;
Assert.assertEquals(219000000, msg6.getUserId());
Assert.assertEquals(992199014, msg6.getDestination());
Assert.assertEquals(1, msg6.getDac());
Assert.assertEquals(5, msg6.getFi());
AsmAcknowledge asmAcknowledge = (AsmAcknowledge) msg6.getApplicationMessage();
Assert.assertEquals(1, asmAcknowledge.getReceivedDac());
Assert.assertEquals(28, asmAcknowledge.getReceivedFi());
Assert.assertEquals(810, asmAcknowledge.getTextSequenceNum());
}
@Test
public void testMsg12AbmDecode() throws SentenceException, SixbitException, AisMessageException {
// Parse ABM
Abm abm = new Abm();
Assert.assertEquals(0, abm.parse("!AIABM,1,1,0,219015063,0,12,CD1BDPD5CDP6B?=P41=C1P5>4,0*0B"));
Assert.assertEquals(0, abm.getSequence());
Assert.assertEquals(219015063, abm.getDestination());
// Make VDM from ABM
Vdm[] vdms = abm.makeVdm(219000000, 0, 0).createSentences();
String[] sentences = new String[vdms.length];
for (int i = 0; i < vdms.length; i++) {
sentences[i] = vdms[i].getEncoded();
}
Assert.assertEquals(1, sentences.length);
Assert.assertTrue(vdms[0].getChannel() == '0');
// Parse VDM
Vdm vdm = new Vdm();
Assert.assertEquals(0, vdm.parse(sentences[0]));
// Get AIS message
AisMessage aisMessage = AisMessage.getInstance(vdm);
Assert.assertEquals(12, aisMessage.getMsgId());
AisMessage12 msg12 = (AisMessage12) aisMessage;
Assert.assertEquals(219000000, msg12.getUserId());
Assert.assertEquals(219015063, msg12.getDestination());
Assert.assertTrue(msg12.getMessage().equals("START TEST FROM DAMSA END"));
}
@Test
public void testBbmDecode() throws SentenceException, SixbitException, AisMessageException {
String line1 = "!AIBBM,4,1,0,0,8,05d00EOdJ0:gP3Vs6QwPH41kkE0wiKk0r3K<OqT:0M7Q`?u,0*2B";
String line2 = "!AIBBM,4,2,0,0,8,v@0>UH67wFK@7BVP3wk@D3aQD1wv;p1lBoi04K<0qs8@P4r,0*2B";
String line3 = "!AIBBM,4,3,0,0,8,f0LW3P@3w10>=;P83JE06u@644D:03IL122vTH1b7wQ1hWT,0*1F";
String line4 = "!AIBBM,4,4,0,0,8,0kK10Q8G80He5R@jbE6,3*24";
// Parse BBM
Bbm bbm = new Bbm();
Assert.assertEquals(1, bbm.parse(line1));
Assert.assertEquals(1, bbm.parse(line2));
Assert.assertEquals(1, bbm.parse(line3));
Assert.assertEquals(0, bbm.parse(line4));
// Make VDM from BBM
Vdm[] vdms = bbm.makeVdm(219000000, 0).createSentences();
String[] sentences = new String[vdms.length];
for (int i = 0; i < vdms.length; i++) {
sentences[i] = vdms[i].getEncoded();
}
Assert.assertEquals(3, sentences.length);
Assert.assertTrue(vdms[0].getChannel() == '0');
// Parse VDM
Vdm vdm = new Vdm();
Assert.assertEquals(1, vdm.parse(sentences[0]));
Assert.assertEquals(1, vdm.parse(sentences[1]));
Assert.assertEquals(0, vdm.parse(sentences[2]));
AisMessage8 msg8 = (AisMessage8) AisMessage.getInstance(vdm);
Assert.assertEquals(219000000, msg8.getUserId());
Assert.assertEquals(1, msg8.getDac());
Assert.assertEquals(27, msg8.getFi());
BroadcastRouteInformation routeInformation = (BroadcastRouteInformation) msg8.getApplicationMessage();
Assert.assertEquals(5, routeInformation.getRouteType());
Assert.assertEquals(0, routeInformation.getSenderClassification());
Assert.assertEquals(16, routeInformation.getWaypointCount());
}
}