@Test
  public void testRoundTrip() {
    int positionCount = 40;

    // build dictionary
    BlockBuilder dictionaryBuilder = VARCHAR.createBlockBuilder(new BlockBuilderStatus(), 4);
    VARCHAR.writeString(dictionaryBuilder, "alice");
    VARCHAR.writeString(dictionaryBuilder, "bob");
    VARCHAR.writeString(dictionaryBuilder, "charlie");
    VARCHAR.writeString(dictionaryBuilder, "dave");
    Block dictionary = dictionaryBuilder.build();

    // build ids
    int[] ids = new int[positionCount];
    for (int i = 0; i < 40; i++) {
      ids[i] = i % 4;
    }

    BlockEncoding blockEncoding = new DictionaryBlockEncoding(new VariableWidthBlockEncoding());
    DictionaryBlock dictionaryBlock = new DictionaryBlock(positionCount, dictionary, ids);

    DynamicSliceOutput sliceOutput = new DynamicSliceOutput(1024);
    blockEncoding.writeBlock(sliceOutput, dictionaryBlock);
    Block actualBlock = blockEncoding.readBlock(sliceOutput.slice().getInput());

    assertTrue(actualBlock instanceof DictionaryBlock);
    DictionaryBlock actualDictionaryBlock = (DictionaryBlock) actualBlock;
    assertBlockEquals(VARCHAR, actualDictionaryBlock.getDictionary(), dictionary);
    for (int position = 0; position < actualDictionaryBlock.getPositionCount(); position++) {
      assertEquals(actualDictionaryBlock.getId(position), ids[position]);
    }
    assertEquals(
        actualDictionaryBlock.getDictionarySourceId(), dictionaryBlock.getDictionarySourceId());
  }
  @Override
  protected RunLengthEncodedBlockCursor createTestCursor() {
    Block value = VARCHAR.createBlockBuilder(new BlockBuilderStatus()).appendNull().build();

    return new RunLengthEncodedBlock(value, 11).cursor();
  }