/**
   * Test encoding of binary route information message
   *
   * @throws SentenceException
   * @throws AisMessageException
   * @throws BitExhaustionException
   */
  @Test
  public void addressedRouteEncode()
      throws SentenceException, SixbitException, AisMessageException {
    int userId = 992199007;
    int destination = 219015063;

    // Make ASM
    AddressedRouteInformation route = new AddressedRouteInformation();
    route.setSenderClassification(1);
    route.setRouteType(RouteInformation.RouteType.RECOMMENDED.ordinal());
    route.setStartMonth(1);
    route.setStartDay(13);
    route.setStartHour(16);
    route.setStartMin(50);
    route.setDuration(35);
    route.setMsgLinkId(10);
    // Add waypoints
    List<AisPosition> waypoints = new ArrayList<>();
    waypoints.add(new AisPosition(Position.create(55.845283333333334, 12.704933333333333)));
    waypoints.add(new AisPosition(Position.create(55.913383333333336, 12.6453)));
    waypoints.add(new AisPosition(Position.create(55.93476666666667, 12.644016666666667)));
    waypoints.add(new AisPosition(Position.create(55.97728333333333, 12.7015)));
    waypoints.add(new AisPosition(Position.create(56.00, 12.8)));
    waypoints.add(new AisPosition(Position.create(56.10, 12.9)));
    for (AisPosition aisPosition : waypoints) {
      route.addWaypoint(aisPosition);
    }

    // Make addressed binary AIS message
    AisMessage6 msg6 = new AisMessage6();
    msg6.setUserId(userId);
    msg6.setDestination(destination);
    msg6.setRetransmit(0);
    msg6.setAppMessage(route);

    System.out.println("Route message 6: " + msg6);

    // Make ABM sentences
    Abm abm = new Abm();
    abm.setTalker("AI");
    abm.setTotal(1);
    abm.setNum(1);
    abm.setDestination(destination);
    abm.setBinaryData(msg6);
    abm.setSequence(0);
    String encoded = abm.getEncoded();
    System.out.println("Route ABM encoded: " + encoded);

    // Make VDM sentences
    String[] vdms = Vdm.createSentences(msg6, 0);
    System.out.println("Route 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
    msg6 = (AisMessage6) AisMessage.getInstance(vdm);
    System.out.println("msg6 decoded: " + msg6);
    // Get the ASM
    AisApplicationMessage appMsg = msg6.getApplicationMessage();
    AddressedRouteInformation parsedRoute = (AddressedRouteInformation) appMsg;
    System.out.println("sentenceStr 6 application: " + appMsg);

    // Assert if mathes original
    Assert.assertEquals(parsedRoute.getWaypointCount(), waypoints.size());
    Assert.assertEquals(route.getMsgLinkId(), parsedRoute.getMsgLinkId());
    Assert.assertEquals(route.getSenderClassification(), parsedRoute.getSenderClassification());
    Assert.assertEquals(route.getRouteType(), parsedRoute.getRouteType());
    Assert.assertEquals(route.getDuration(), parsedRoute.getDuration());
    Assert.assertEquals(route.getStartMonth(), parsedRoute.getStartMonth());
    Assert.assertEquals(route.getStartDay(), parsedRoute.getStartDay());
    Assert.assertEquals(route.getStartHour(), parsedRoute.getStartHour());
    Assert.assertEquals(route.getStartMin(), parsedRoute.getStartMin());
    for (int i = 0; i < parsedRoute.getWaypointCount(); i++) {
      AisPosition parsedWp = parsedRoute.getWaypoints().get(i);
      AisPosition orgWp = waypoints.get(i);
      Assert.assertTrue(parsedWp.equals(orgWp));
    }
  }