/**
   * Verify that the computed checksum is the same whether the buffer is backed by an array or not
   * when the checksum is computed for only a region of the buffer (native heap buffer version).
   */
  public void test_checksum05_direct() {

    byte[] data = new byte[100];
    r.nextBytes(data);

    Adler32 adler32 = new Adler32();
    adler32.update(data, 20, 100 - 10 - 20);
    final int expectedChecksum = (int) adler32.getValue();

    assertEquals(expectedChecksum, chk.checksum(ByteBuffer.wrap(data), 20, data.length - 10));

    ByteBuffer direct = ByteBuffer.allocateDirect(data.length);
    direct.put(data);
    assertEquals(expectedChecksum, chk.checksum(direct, 20, data.length - 10));
  }
  /** Test verifies that the mark, position and limit are unchanged by the checksum operation. */
  public void test_checksum03() {

    byte[] data = new byte[100];
    r.nextBytes(data);

    ByteBuffer buf = ByteBuffer.wrap(data);
    // set the limit.
    buf.limit(20);
    /*
     * set the mark (we have to choose a mark less than the position we will
     * set and test below or the mark will be discarded when we set the
     * position).
     */
    buf.position(9);
    buf.mark();
    // set the position.
    buf.position(12);
    chk.checksum(buf, 0, data.length);
    // verify limit unchanged.
    assertEquals(20, buf.limit());
    // verify position unchanged.
    assertEquals(12, buf.position());
    // reset the buffer to the mark and verify the mark was not changed.
    buf.reset();
    assertEquals(9, buf.position());
  }
  /** Test verifies that only the specified region of the buffer is used to compute the checksum. */
  public void test_checksum02() {

    byte[] data = new byte[100];
    r.nextBytes(data);

    Adler32 adler32 = new Adler32();
    adler32.update(data, 10, 90);
    final int expectedChecksum = (int) adler32.getValue();

    assertEquals(expectedChecksum, chk.checksum(ByteBuffer.wrap(data), 10, data.length));
  }