/* 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.encode;
import dk.dma.ais.binary.SixbitException;
import dk.dma.ais.message.AisMessage;
import dk.dma.ais.message.AisMessage8;
import dk.dma.ais.message.AisMessageException;
import dk.dma.ais.message.binary.AisApplicationMessage;
import dk.dma.ais.message.binary.AreaNotice;
import dk.dma.ais.message.binary.BroadcastAreaNotice;
import dk.dma.ais.message.binary.SubArea;
import dk.dma.ais.sentence.SentenceException;
import dk.dma.ais.sentence.SentenceLine;
import dk.dma.ais.sentence.Vdm;
import org.apache.commons.lang3.StringUtils;
import org.junit.Assert;
import org.junit.Test;
import java.util.ArrayList;
/**
* Class for testing the encoding of area notice ASM
*
*/
public class EncodeAreaNoticeTest {
// private ArrayList<SubArea> subareas = null;
@Test
public void areaNoticeEncode() throws SentenceException, SixbitException, AisMessageException {
// Make ASM
BroadcastAreaNotice areaNotice = new BroadcastAreaNotice();
areaNotice.setNotice(0);
areaNotice.setStartMonth(1);
areaNotice.setStartDay(13);
areaNotice.setStartHour(16);
areaNotice.setStartMin(50);
areaNotice.setDuration(35);
ArrayList<SubArea> subareas = new ArrayList<>();
SubArea subarea = new SubArea();
subarea.setRawAreaShape(2);
subarea.setRawScaleFactor(1);
subarea.setRawLongitude(1233);
subarea.setRawLatitude(14441);
subarea.setRawPrecision(4);
subarea.setRawRadius(12);
subarea.setRawLeftBound(15);
subarea.setRawRightBound(7);
subarea.setSpare(0);
subareas.add(subarea);
areaNotice.addSubArea(subarea);
areaNotice.setSubAreas(subareas);
subarea = new SubArea();
subarea.setRawAreaShape(1);
subarea.setRawScaleFactor(4);
subarea.setRawLongitude(12333);
subarea.setRawLatitude(144421);
subarea.setRawPrecision(2);
subarea.setRawRadius(12);
subarea.setRawLeftBound(15);
subarea.setRawRightBound(7);
subarea.setSpare(0);
subareas.add(subarea);
subarea = new SubArea();
subarea.setRawAreaShape(3);
subarea.setRawScaleFactor(4);
subarea.setRawLongitude(12333);
subarea.setRawLatitude(144421);
subarea.setRawPrecision(2);
subarea.setRawRadius(12);
subarea.setRawLeftBound(15);
subarea.setRawRightBound(7);
subarea.setSpare(0);
subareas.add(subarea);
areaNotice.setSubAreas(subareas);
// System.out.println(areaNotice.toString() + "raz dwa" +
// subarea.toString());
// TODO set rest of relevant fields
// Make broadcast binary AIS message
AisMessage8 msg8 = new AisMessage8();
msg8.setUserId(992199007);
msg8.setAppMessage(areaNotice);
System.out.println("Area notice msg8: " + msg8);
System.out.println("MSG8 = " + msg8);
System.out.println("AreaNoticeMSG = " + areaNotice);
// Make VDM sentences
String[] vdms = Vdm.createSentences(msg8, 0);
System.out.println("Area notice VDM encoded:\n" + StringUtils.join(vdms, "\r\n"));
// Decode VDM sentences
Vdm vdm = new Vdm();
for (int i = 0; i < vdms.length; i++) {
int result = vdm.parse(new SentenceLine(vdms[i]));
if (i < vdms.length - 1) {
Assert.assertEquals(result, 1);
} else {
Assert.assertEquals(result, 0);
}
}
// Extract AisMessage6
msg8 = (AisMessage8) AisMessage.getInstance(vdm);
System.out.println("msg8 decoded: " + msg8);
// Get the ASM
AisApplicationMessage appMsg = msg8.getApplicationMessage();
AreaNotice parsedAreNotice = (AreaNotice) appMsg;
System.out.println("sentenceStr 8 application: " + appMsg);
// Assert if mathes original
Assert.assertEquals(parsedAreNotice.getDac(), 1);
Assert.assertEquals(parsedAreNotice.getFi(), 22);
Assert.assertEquals(parsedAreNotice.getMsgLinkId(), areaNotice.getMsgLinkId());
Assert.assertEquals(parsedAreNotice.getStartMonth(), areaNotice.getStartMonth());
Assert.assertEquals(parsedAreNotice.getStartDay(), areaNotice.getStartDay());
Assert.assertEquals(parsedAreNotice.getStartHour(), areaNotice.getStartHour());
Assert.assertEquals(parsedAreNotice.getStartMin(), areaNotice.getStartMin());
Assert.assertEquals(parsedAreNotice.getDuration(), areaNotice.getDuration());
for (int i = 0; i < 1; i++) {
SubArea parsedSA = parsedAreNotice.getSubAreas().get(i);
SubArea orgSA = subareas.get(i);
Assert.assertTrue(parsedSA.equals(orgSA));
}
// TODO the rest of the fields
}
}