int assertDeleteSucceed(int i, int freeSpaceBeforeDelete, int deleteSpace) {
    int startOffset = appender.getTupleStartOffset(i);
    int endOffset = appender.getTupleEndOffset(i);
    int tupleLength = appender.getTupleLength(i);

    appender.delete(i);

    assertEquals(startOffset, appender.getTupleStartOffset(i));
    assertEquals(-endOffset, appender.getTupleEndOffset(i));
    assertEquals(-tupleLength, appender.getTupleLength(i));
    assertEquals(freeSpaceBeforeDelete, appender.getContiguousFreeSpace());
    assertEquals(deleteSpace + tupleLength + freeSpaceBeforeDelete, appender.getTotalFreeSpace());
    return tupleLength;
  }
  @Test
  public void testReset() throws Exception {
    ByteBuffer buffer = ByteBuffer.allocate(cap);
    appender.reset(buffer);
    assertTrue(appender.getBuffer() == buffer);
    assertTrue(appender.getTupleCount() == 0);
    assertTrue(appender.getContiguousFreeSpace() == cap - 4 - 4);

    int count = 10;
    int deleted = 7;
    buffer = makeAFrame(cap, count, deleted);
    int pos = buffer.position();
    appender.reset(buffer);
    assertTrue(appender.getBuffer() == buffer);
    assertTrue(appender.getTupleCount() == count);
    assertTrue(appender.getContiguousFreeSpace() == cap - 4 - 4 - count * 4 - pos);
    assertTrue(appender.getTotalFreeSpace() == appender.getContiguousFreeSpace() + deleted);

    int dataOffset = 0;
    for (int i = 0; i < count; i++) {
      dataOffset += assertTupleIsExpected(i, dataOffset);
    }
  }
 @Test
 public void testResetAfterDelete() throws Exception {
   testDelete();
   appender.reset(appender.getBuffer());
   assertEquals(cap - appender.getTupleCount() * 4 - 4 - 4, appender.getTotalFreeSpace());
 }