public static <T> ZstdCoder<T> of(Coder<T> innerCoder, byte[] dict, int level) {
    return new ZstdCoder<>(innerCoder, dict, level);
  }
@Test
  public void testCoderEquals() throws Exception {
    // True if coder, dict and level are equal.
    assertEquals(
        ZstdCoder.of(ListCoder.of(StringUtf8Coder.of()), null, 0),
        ZstdCoder.of(ListCoder.of(StringUtf8Coder.of()), null, 0));
    assertEquals(
        ZstdCoder.of(ListCoder.of(ByteArrayCoder.of()), new byte[0], 1),
        ZstdCoder.of(ListCoder.of(ByteArrayCoder.of()), new byte[0], 1));
    // False if coder, dict or level differs.
    assertNotEquals(
        ZstdCoder.of(ListCoder.of(StringUtf8Coder.of()), null, 0),
        ZstdCoder.of(ListCoder.of(ByteArrayCoder.of()), null, 0));
    assertNotEquals(
        ZstdCoder.of(ListCoder.of(StringUtf8Coder.of()), null, 0),
        ZstdCoder.of(ListCoder.of(StringUtf8Coder.of()), new byte[0], 0));
    assertNotEquals(
        ZstdCoder.of(ListCoder.of(StringUtf8Coder.of()), null, 0),
        ZstdCoder.of(ListCoder.of(StringUtf8Coder.of()), null, 1));
    assertNotEquals(
        ZstdCoder.of(ListCoder.of(StringUtf8Coder.of()), null, 0),
        ZstdCoder.of(ListCoder.of(ByteArrayCoder.of()), new byte[0], 1));
  }