public void testEncodeDecodeOperations() {
    ByteBuffer buff = ByteBuffer.allocate(4000);
    int i;

    System.out.println();
    System.out.print("executing test testEncodeDecodeOperations (TP_3.3.5.3): ");

    // verifying message level encode/decode reciprocity" << std::endl;

    m_MsgIn1.getHeader().getHeaderRec().setMessageID(41);
    m_MsgIn2.getHeader().getHeaderRec().setMessageID(0);
    for (i = 0; i < m_MsgIn1.getBody().getRecord().getArray7().getDimension1Size(); i++) {
      m_MsgIn1.getBody().getRecord().getArray7().setVariableLengthString1(i, Integer.toString(i));
      m_MsgIn2.getBody().getRecord().getArray7().setVariableLengthString1(i, Integer.toString(42));
    }
    m_MsgIn1.encode(buff, 0);
    m_MsgIn2.decode(buff, 0);

    assertEquals(41, m_MsgIn2.getHeader().getHeaderRec().getMessageID());
    for (i = 0; i < m_MsgIn1.getBody().getRecord().getArray7().getDimension1Size(); i++) {
      assertEquals(
          Integer.toString(i),
          m_MsgIn2.getBody().getRecord().getArray7().getVariableLengthString1(i));
    }

    // verify encoded header decodes properly

    m_MsgIn2.getHeader().getHeaderRec().setMessageID(0);
    m_MsgIn1.getHeader().encode(buff, 0);
    m_MsgIn2.getHeader().decode(buff, 0);
    assertEquals(41, m_MsgIn2.getHeader().getHeaderRec().getMessageID());

    // verify encoded body decodes properly

    for (i = 0; i < m_MsgIn1.getBody().getRecord().getArray7().getDimension1Size(); i++) {
      m_MsgIn2.getBody().getRecord().getArray7().setVariableLengthString1(i, "foo");
    }

    m_MsgIn1.getBody().encode(buff, 0);
    m_MsgIn2.getBody().decode(buff, 0);
    for (i = 0; i < m_MsgIn1.getBody().getRecord().getArray7().getDimension1Size(); i++) {
      assertEquals(
          Integer.toString(i),
          m_MsgIn2.getBody().getRecord().getArray7().getVariableLengthString1(i));
    }

    for (i = 0; i < m_MsgIn1.getBody().getRecord().getArray7().getDimension1Size(); i++) {
      m_MsgIn2.getBody().getRecord().getArray7().setVariableLengthString1(i, "foo");
    }

    m_MsgIn1.getBody().getRecord().encode(buff, 0);
    m_MsgIn2.getBody().getRecord().decode(buff, 0);
    for (i = 0; i < m_MsgIn1.getBody().getRecord().getArray7().getDimension1Size(); i++) {
      assertEquals(
          Integer.toString(i),
          m_MsgIn2.getBody().getRecord().getArray7().getVariableLengthString1(i));
    }

    for (i = 0; i < m_MsgIn1.getBody().getRecord().getArray7().getDimension1Size(); i++) {
      m_MsgIn2.getBody().getRecord().getArray7().setVariableLengthString1(i, "foo");
    }

    m_MsgIn1.getBody().getRecord().getArray7().encode(buff, 0);
    m_MsgIn2.getBody().getRecord().getArray7().decode(buff, 0);
    for (i = 0; i < m_MsgIn1.getBody().getRecord().getArray7().getDimension1Size(); i++) {
      assertEquals(
          Integer.toString(i),
          m_MsgIn2.getBody().getRecord().getArray7().getVariableLengthString1(i));
    }
  }
  public void testEncodeToSpec() {
    ByteBuffer buff = ByteBuffer.allocate(1024);
    int i;

    System.out.println("");
    System.out.print("executing test testEncodeToSpec(TP_3.3.5.2): ");

    m_MsgIn1.getHeader().getHeaderRec().setMessageID(256);

    // array's length should be 9.
    // populate the array with 9 strings; first is 'A', second is 'BB', up to 'IIIIIIIII' (nine
    // 'I's)
    for (i = 0; i < m_MsgIn1.getBody().getRecord().getArray7().getDimension1Size(); i++) {
      m_MsgIn1
          .getBody()
          .getRecord()
          .getArray7()
          .setVariableLengthString1(i, buildEncodeTestString(65 + i, i + 1));
    }

    // verifying message level encode is AS-5684 compliant
    m_MsgIn1.encode(buff, 0);

    System.out.println("");
    // offset 0 in buff is message ID, should be 256 (in an unsigned short)
    assertEquals(256, (int) (buff.getShort(0) & 0xffff));

    // offset 2 in buff is length of first string, should be 1 (in an unsigned short)
    // System.out.println("*** data @ 2: " + (int)(buff.getShort(2) & 0xffff));
    assertEquals(1, (int) (buff.getShort(2) & 0xffff));

    // offset 4 in buff is single 'A' of first string, single byte UTF-8 character
    assertEquals(65, (short) (buff.get(4) & 0xff));

    // offset 5 = length of 2nd string, 2 in unsigned short.
    assertEquals(2, (int) (buff.getShort(5) & 0xffff));

    // offset 7 = 1st 'B' in 2nd string, single byte UTF-8 character
    assertEquals(66, (short) (buff.get(7) & 0xff));

    // offset 8 = 2nd 'B' in 2nd string
    assertEquals(66, (short) (buff.get(8) & 0xff));

    // offset 9 = length of 3rd string, 3 in unsigned short.
    assertEquals(3, (int) (buff.getShort(9) & 0xffff));

    // offset 11 = 1st 'C' in 3rd string
    assertEquals(67, (short) (buff.get(11) & 0xff));

    //        12 = 2nd 'C' in 3rd string
    assertEquals(67, (short) (buff.get(12) & 0xff));

    //        13 = 3rd 'C' in 3rd string
    assertEquals(67, (short) (buff.get(13) & 0xff));

    // skipping to 9th string, should be 9 'I's, length value at offset 54
    assertEquals(9, (int) (buff.getShort(54) & 0xffff));

    //        56 = 1st 'I' in 9th string
    assertEquals(73, (short) (buff.get(56) & 0xff));

    //        57 = 5th 'I' in 9th string
    assertEquals(73, (short) (buff.get(57) & 0xff));

    //        64 = 9th 'I' in 9th string
    assertEquals(73, (short) (buff.get(64) & 0xff));

    //        65 = past end of message data, should be 0.
    assertEquals(0, (short) (buff.get(65) & 0xff));
  }