Move BufferCovariantReturnType test to java 11 package

Change-Id: Ib3850ce9735dc949bb42277cd571abcafc6d877b
diff --git a/src/test/examplesJava11/buffercovariantreturntype/BufferCovariantReturnTypeMain.java b/src/test/examplesJava11/buffercovariantreturntype/BufferCovariantReturnTypeMain.java
deleted file mode 100644
index 67079a5..0000000
--- a/src/test/examplesJava11/buffercovariantreturntype/BufferCovariantReturnTypeMain.java
+++ /dev/null
@@ -1,377 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package buffercovariantreturntype;
-
-import java.nio.Buffer;
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.DoubleBuffer;
-import java.nio.FloatBuffer;
-import java.nio.IntBuffer;
-import java.nio.LongBuffer;
-import java.nio.ShortBuffer;
-
-public class BufferCovariantReturnTypeMain {
-
-  public static void main(String[] args) {
-    byteBufferTest();
-    charBufferTest();
-    shortBufferTest();
-    intBufferTest();
-    longBufferTest();
-    floatBufferTest();
-    doubleBufferTest();
-  }
-
-  static void byteBufferTest() {
-    byte[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
-    byte putValue = 55;
-
-    ByteBuffer directBuffer = ByteBuffer.wrap(data);
-    Buffer indirectBuffer = ByteBuffer.wrap(data);
-    ByteBuffer castedIndirectBuffer = (ByteBuffer) indirectBuffer;
-
-    directBuffer = directBuffer.position(5);
-    System.out.println(directBuffer.position()); // 5
-    directBuffer = directBuffer.limit(7);
-    System.out.println(directBuffer.remaining()); // 2
-    directBuffer = directBuffer.mark().put(putValue).put(putValue).reset();
-    System.out.println(directBuffer.position()); // 5
-    directBuffer = directBuffer.clear();
-    System.out.println(directBuffer.position()); // 0
-    System.out.println(directBuffer.remaining()); // 16
-    directBuffer.put(putValue);
-    directBuffer.put(putValue);
-    directBuffer = directBuffer.rewind();
-    System.out.println(directBuffer.position()); // 0
-    directBuffer.put(putValue);
-    directBuffer.put(putValue);
-    directBuffer = directBuffer.flip();
-    System.out.println(directBuffer.position()); // 0
-    System.out.println(directBuffer.remaining()); // 2
-
-    indirectBuffer = indirectBuffer.position(5);
-    System.out.println(indirectBuffer.position()); // 5
-    indirectBuffer = indirectBuffer.limit(7);
-    System.out.println(indirectBuffer.remaining()); // 2
-    indirectBuffer = indirectBuffer.mark();
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.reset();
-    System.out.println(indirectBuffer.position()); // 5
-    indirectBuffer = indirectBuffer.clear();
-    System.out.println(indirectBuffer.position()); // 0
-    System.out.println(indirectBuffer.remaining()); // 16
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.rewind();
-    System.out.println(indirectBuffer.position()); // 0
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.flip();
-    System.out.println(indirectBuffer.position()); // 0
-    System.out.println(indirectBuffer.remaining()); // 2
-  }
-
-  static void charBufferTest() {
-    char[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
-    char putValue = 55;
-
-    CharBuffer directBuffer = CharBuffer.wrap(data);
-    Buffer indirectBuffer = CharBuffer.wrap(data);
-    CharBuffer castedIndirectBuffer = (CharBuffer) indirectBuffer;
-
-    directBuffer = directBuffer.position(5);
-    System.out.println(directBuffer.position()); // 5
-    directBuffer = directBuffer.limit(7);
-    System.out.println(directBuffer.remaining()); // 2
-    directBuffer = directBuffer.mark().put(putValue).put(putValue).reset();
-    System.out.println(directBuffer.position()); // 5
-    directBuffer = directBuffer.clear();
-    System.out.println(directBuffer.position()); // 0
-    System.out.println(directBuffer.remaining()); // 16
-    directBuffer.put(putValue);
-    directBuffer.put(putValue);
-    directBuffer = directBuffer.rewind();
-    System.out.println(directBuffer.position()); // 0
-    directBuffer.put(putValue);
-    directBuffer.put(putValue);
-    directBuffer = directBuffer.flip();
-    System.out.println(directBuffer.position()); // 0
-    System.out.println(directBuffer.remaining()); // 2
-
-    indirectBuffer = indirectBuffer.position(5);
-    System.out.println(indirectBuffer.position()); // 5
-    indirectBuffer = indirectBuffer.limit(7);
-    System.out.println(indirectBuffer.remaining()); // 2
-    indirectBuffer = indirectBuffer.mark();
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.reset();
-    System.out.println(indirectBuffer.position()); // 5
-    indirectBuffer = indirectBuffer.clear();
-    System.out.println(indirectBuffer.position()); // 0
-    System.out.println(indirectBuffer.remaining()); // 16
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.rewind();
-    System.out.println(indirectBuffer.position()); // 0
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.flip();
-    System.out.println(indirectBuffer.position()); // 0
-    System.out.println(indirectBuffer.remaining()); // 2
-  }
-
-  static void shortBufferTest() {
-    short[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
-    short putValue = 55;
-
-    ShortBuffer directBuffer = ShortBuffer.wrap(data);
-    Buffer indirectBuffer = ShortBuffer.wrap(data);
-    ShortBuffer castedIndirectBuffer = (ShortBuffer) indirectBuffer;
-
-    directBuffer = directBuffer.position(5);
-    System.out.println(directBuffer.position()); // 5
-    directBuffer = directBuffer.limit(7);
-    System.out.println(directBuffer.remaining()); // 2
-    directBuffer = directBuffer.mark().put(putValue).put(putValue).reset();
-    System.out.println(directBuffer.position()); // 5
-    directBuffer = directBuffer.clear();
-    System.out.println(directBuffer.position()); // 0
-    System.out.println(directBuffer.remaining()); // 16
-    directBuffer.put(putValue);
-    directBuffer.put(putValue);
-    directBuffer = directBuffer.rewind();
-    System.out.println(directBuffer.position()); // 0
-    directBuffer.put(putValue);
-    directBuffer.put(putValue);
-    directBuffer = directBuffer.flip();
-    System.out.println(directBuffer.position()); // 0
-    System.out.println(directBuffer.remaining()); // 2
-
-    indirectBuffer = indirectBuffer.position(5);
-    System.out.println(indirectBuffer.position()); // 5
-    indirectBuffer = indirectBuffer.limit(7);
-    System.out.println(indirectBuffer.remaining()); // 2
-    indirectBuffer = indirectBuffer.mark();
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.reset();
-    System.out.println(indirectBuffer.position()); // 5
-    indirectBuffer = indirectBuffer.clear();
-    System.out.println(indirectBuffer.position()); // 0
-    System.out.println(indirectBuffer.remaining()); // 16
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.rewind();
-    System.out.println(indirectBuffer.position()); // 0
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.flip();
-    System.out.println(indirectBuffer.position()); // 0
-    System.out.println(indirectBuffer.remaining()); // 2
-  }
-
-  static void intBufferTest() {
-    int[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
-    int putValue = 55;
-
-    IntBuffer directBuffer = IntBuffer.wrap(data);
-    Buffer indirectBuffer = IntBuffer.wrap(data);
-    IntBuffer castedIndirectBuffer = (IntBuffer) indirectBuffer;
-
-    directBuffer = directBuffer.position(5);
-    System.out.println(directBuffer.position()); // 5
-    directBuffer = directBuffer.limit(7);
-    System.out.println(directBuffer.remaining()); // 2
-    directBuffer = directBuffer.mark().put(putValue).put(putValue).reset();
-    System.out.println(directBuffer.position()); // 5
-    directBuffer = directBuffer.clear();
-    System.out.println(directBuffer.position()); // 0
-    System.out.println(directBuffer.remaining()); // 16
-    directBuffer.put(putValue);
-    directBuffer.put(putValue);
-    directBuffer = directBuffer.rewind();
-    System.out.println(directBuffer.position()); // 0
-    directBuffer.put(putValue);
-    directBuffer.put(putValue);
-    directBuffer = directBuffer.flip();
-    System.out.println(directBuffer.position()); // 0
-    System.out.println(directBuffer.remaining()); // 2
-
-    indirectBuffer = indirectBuffer.position(5);
-    System.out.println(indirectBuffer.position()); // 5
-    indirectBuffer = indirectBuffer.limit(7);
-    System.out.println(indirectBuffer.remaining()); // 2
-    indirectBuffer = indirectBuffer.mark();
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.reset();
-    System.out.println(indirectBuffer.position()); // 5
-    indirectBuffer = indirectBuffer.clear();
-    System.out.println(indirectBuffer.position()); // 0
-    System.out.println(indirectBuffer.remaining()); // 16
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.rewind();
-    System.out.println(indirectBuffer.position()); // 0
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.flip();
-    System.out.println(indirectBuffer.position()); // 0
-    System.out.println(indirectBuffer.remaining()); // 2
-  }
-
-  static void longBufferTest() {
-    long[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
-    long putValue = 55;
-
-    LongBuffer directBuffer = LongBuffer.wrap(data);
-    Buffer indirectBuffer = LongBuffer.wrap(data);
-    LongBuffer castedIndirectBuffer = (LongBuffer) indirectBuffer;
-
-    directBuffer = directBuffer.position(5);
-    System.out.println(directBuffer.position()); // 5
-    directBuffer = directBuffer.limit(7);
-    System.out.println(directBuffer.remaining()); // 2
-    directBuffer = directBuffer.mark().put(putValue).put(putValue).reset();
-    System.out.println(directBuffer.position()); // 5
-    directBuffer = directBuffer.clear();
-    System.out.println(directBuffer.position()); // 0
-    System.out.println(directBuffer.remaining()); // 16
-    directBuffer.put(putValue);
-    directBuffer.put(putValue);
-    directBuffer = directBuffer.rewind();
-    System.out.println(directBuffer.position()); // 0
-    directBuffer.put(putValue);
-    directBuffer.put(putValue);
-    directBuffer = directBuffer.flip();
-    System.out.println(directBuffer.position()); // 0
-    System.out.println(directBuffer.remaining()); // 2
-
-    indirectBuffer = indirectBuffer.position(5);
-    System.out.println(indirectBuffer.position()); // 5
-    indirectBuffer = indirectBuffer.limit(7);
-    System.out.println(indirectBuffer.remaining()); // 2
-    indirectBuffer = indirectBuffer.mark();
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.reset();
-    System.out.println(indirectBuffer.position()); // 5
-    indirectBuffer = indirectBuffer.clear();
-    System.out.println(indirectBuffer.position()); // 0
-    System.out.println(indirectBuffer.remaining()); // 16
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.rewind();
-    System.out.println(indirectBuffer.position()); // 0
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.flip();
-    System.out.println(indirectBuffer.position()); // 0
-    System.out.println(indirectBuffer.remaining()); // 2
-  }
-
-  static void floatBufferTest() {
-    float[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
-    float putValue = 55;
-
-    FloatBuffer directBuffer = FloatBuffer.wrap(data);
-    Buffer indirectBuffer = FloatBuffer.wrap(data);
-    FloatBuffer castedIndirectBuffer = (FloatBuffer) indirectBuffer;
-
-    directBuffer = directBuffer.position(5);
-    System.out.println(directBuffer.position()); // 5
-    directBuffer = directBuffer.limit(7);
-    System.out.println(directBuffer.remaining()); // 2
-    directBuffer = directBuffer.mark().put(putValue).put(putValue).reset();
-    System.out.println(directBuffer.position()); // 5
-    directBuffer = directBuffer.clear();
-    System.out.println(directBuffer.position()); // 0
-    System.out.println(directBuffer.remaining()); // 16
-    directBuffer.put(putValue);
-    directBuffer.put(putValue);
-    directBuffer = directBuffer.rewind();
-    System.out.println(directBuffer.position()); // 0
-    directBuffer.put(putValue);
-    directBuffer.put(putValue);
-    directBuffer = directBuffer.flip();
-    System.out.println(directBuffer.position()); // 0
-    System.out.println(directBuffer.remaining()); // 2
-
-    indirectBuffer = indirectBuffer.position(5);
-    System.out.println(indirectBuffer.position()); // 5
-    indirectBuffer = indirectBuffer.limit(7);
-    System.out.println(indirectBuffer.remaining()); // 2
-    indirectBuffer = indirectBuffer.mark();
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.reset();
-    System.out.println(indirectBuffer.position()); // 5
-    indirectBuffer = indirectBuffer.clear();
-    System.out.println(indirectBuffer.position()); // 0
-    System.out.println(indirectBuffer.remaining()); // 16
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.rewind();
-    System.out.println(indirectBuffer.position()); // 0
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.flip();
-    System.out.println(indirectBuffer.position()); // 0
-    System.out.println(indirectBuffer.remaining()); // 2
-  }
-
-  static void doubleBufferTest() {
-    double[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
-    double putValue = 55;
-
-    DoubleBuffer directBuffer = DoubleBuffer.wrap(data);
-    Buffer indirectBuffer = DoubleBuffer.wrap(data);
-    DoubleBuffer castedIndirectBuffer = (DoubleBuffer) indirectBuffer;
-
-    directBuffer = directBuffer.position(5);
-    System.out.println(directBuffer.position()); // 5
-    directBuffer = directBuffer.limit(7);
-    System.out.println(directBuffer.remaining()); // 2
-    directBuffer = directBuffer.mark().put(putValue).put(putValue).reset();
-    System.out.println(directBuffer.position()); // 5
-    directBuffer = directBuffer.clear();
-    System.out.println(directBuffer.position()); // 0
-    System.out.println(directBuffer.remaining()); // 16
-    directBuffer.put(putValue);
-    directBuffer.put(putValue);
-    directBuffer = directBuffer.rewind();
-    System.out.println(directBuffer.position()); // 0
-    directBuffer.put(putValue);
-    directBuffer.put(putValue);
-    directBuffer = directBuffer.flip();
-    System.out.println(directBuffer.position()); // 0
-    System.out.println(directBuffer.remaining()); // 2
-
-    indirectBuffer = indirectBuffer.position(5);
-    System.out.println(indirectBuffer.position()); // 5
-    indirectBuffer = indirectBuffer.limit(7);
-    System.out.println(indirectBuffer.remaining()); // 2
-    indirectBuffer = indirectBuffer.mark();
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.reset();
-    System.out.println(indirectBuffer.position()); // 5
-    indirectBuffer = indirectBuffer.clear();
-    System.out.println(indirectBuffer.position()); // 0
-    System.out.println(indirectBuffer.remaining()); // 16
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.rewind();
-    System.out.println(indirectBuffer.position()); // 0
-    castedIndirectBuffer.put(putValue);
-    castedIndirectBuffer.put(putValue);
-    indirectBuffer = indirectBuffer.flip();
-    System.out.println(indirectBuffer.position()); // 0
-    System.out.println(indirectBuffer.remaining()); // 2
-  }
-}
diff --git a/src/test/examplesJava11/buffercovariantreturntype/BufferCovariantReturnTypeTest.java b/src/test/examplesJava11/buffercovariantreturntype/BufferCovariantReturnTypeTest.java
new file mode 100644
index 0000000..ea93966
--- /dev/null
+++ b/src/test/examplesJava11/buffercovariantreturntype/BufferCovariantReturnTypeTest.java
@@ -0,0 +1,438 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package buffercovariantreturntype;
+
+import static com.android.tools.r8.TestRuntime.CfVm.JDK11;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.StringUtils;
+import java.nio.Buffer;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.DoubleBuffer;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+import java.nio.LongBuffer;
+import java.nio.ShortBuffer;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class BufferCovariantReturnTypeTest extends TestBase {
+
+  private static final String EXPECTED_RESULT_PER_BUFFER =
+      StringUtils.lines("5", "2", "5", "0", "16", "0", "0", "2");
+  private static final String EXPECTED_RESULT =
+      new String(new char[14]).replace("\0", EXPECTED_RESULT_PER_BUFFER);
+
+  @Parameter(0)
+  public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters()
+        .withCfRuntimesStartingFromIncluding(JDK11)
+        .withDexRuntimes()
+        .withAllApiLevelsAlsoForCf()
+        .build();
+  }
+
+  @Test
+  public void testJVM() throws Exception {
+    parameters.assumeJvmTestParameters();
+    testForJvm(parameters)
+        .addInnerClassesAndStrippedOuter(getClass())
+        .run(parameters.getRuntime(), BufferCovariantReturnTypeMain.class)
+        .assertSuccessWithOutput(EXPECTED_RESULT);
+  }
+
+  @Test
+  public void testD8() throws Exception {
+    testForD8(parameters.getBackend())
+        .addInnerClassesAndStrippedOuter(getClass())
+        .setMinApi(parameters)
+        .run(parameters.getRuntime(), BufferCovariantReturnTypeMain.class)
+        .assertSuccessWithOutput(EXPECTED_RESULT);
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    parameters.assumeR8TestParameters();
+    testForR8(parameters.getBackend())
+        .addInnerClassesAndStrippedOuter(getClass())
+        .addKeepMainRule(BufferCovariantReturnTypeMain.class)
+        .setMinApi(parameters)
+        .run(parameters.getRuntime(), BufferCovariantReturnTypeMain.class)
+        .assertSuccessWithOutput(EXPECTED_RESULT);
+  }
+
+  public static class BufferCovariantReturnTypeMain {
+
+    public static void main(String[] args) {
+      byteBufferTest();
+      charBufferTest();
+      shortBufferTest();
+      intBufferTest();
+      longBufferTest();
+      floatBufferTest();
+      doubleBufferTest();
+    }
+
+    static void byteBufferTest() {
+      byte[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
+      byte putValue = 55;
+
+      ByteBuffer directBuffer = ByteBuffer.wrap(data);
+      Buffer indirectBuffer = ByteBuffer.wrap(data);
+      ByteBuffer castedIndirectBuffer = (ByteBuffer) indirectBuffer;
+
+      directBuffer = directBuffer.position(5);
+      System.out.println(directBuffer.position()); // 5
+      directBuffer = directBuffer.limit(7);
+      System.out.println(directBuffer.remaining()); // 2
+      directBuffer = directBuffer.mark().put(putValue).put(putValue).reset();
+      System.out.println(directBuffer.position()); // 5
+      directBuffer = directBuffer.clear();
+      System.out.println(directBuffer.position()); // 0
+      System.out.println(directBuffer.remaining()); // 16
+      directBuffer.put(putValue);
+      directBuffer.put(putValue);
+      directBuffer = directBuffer.rewind();
+      System.out.println(directBuffer.position()); // 0
+      directBuffer.put(putValue);
+      directBuffer.put(putValue);
+      directBuffer = directBuffer.flip();
+      System.out.println(directBuffer.position()); // 0
+      System.out.println(directBuffer.remaining()); // 2
+
+      indirectBuffer = indirectBuffer.position(5);
+      System.out.println(indirectBuffer.position()); // 5
+      indirectBuffer = indirectBuffer.limit(7);
+      System.out.println(indirectBuffer.remaining()); // 2
+      indirectBuffer = indirectBuffer.mark();
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.reset();
+      System.out.println(indirectBuffer.position()); // 5
+      indirectBuffer = indirectBuffer.clear();
+      System.out.println(indirectBuffer.position()); // 0
+      System.out.println(indirectBuffer.remaining()); // 16
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.rewind();
+      System.out.println(indirectBuffer.position()); // 0
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.flip();
+      System.out.println(indirectBuffer.position()); // 0
+      System.out.println(indirectBuffer.remaining()); // 2
+    }
+
+    static void charBufferTest() {
+      char[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
+      char putValue = 55;
+
+      CharBuffer directBuffer = CharBuffer.wrap(data);
+      Buffer indirectBuffer = CharBuffer.wrap(data);
+      CharBuffer castedIndirectBuffer = (CharBuffer) indirectBuffer;
+
+      directBuffer = directBuffer.position(5);
+      System.out.println(directBuffer.position()); // 5
+      directBuffer = directBuffer.limit(7);
+      System.out.println(directBuffer.remaining()); // 2
+      directBuffer = directBuffer.mark().put(putValue).put(putValue).reset();
+      System.out.println(directBuffer.position()); // 5
+      directBuffer = directBuffer.clear();
+      System.out.println(directBuffer.position()); // 0
+      System.out.println(directBuffer.remaining()); // 16
+      directBuffer.put(putValue);
+      directBuffer.put(putValue);
+      directBuffer = directBuffer.rewind();
+      System.out.println(directBuffer.position()); // 0
+      directBuffer.put(putValue);
+      directBuffer.put(putValue);
+      directBuffer = directBuffer.flip();
+      System.out.println(directBuffer.position()); // 0
+      System.out.println(directBuffer.remaining()); // 2
+
+      indirectBuffer = indirectBuffer.position(5);
+      System.out.println(indirectBuffer.position()); // 5
+      indirectBuffer = indirectBuffer.limit(7);
+      System.out.println(indirectBuffer.remaining()); // 2
+      indirectBuffer = indirectBuffer.mark();
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.reset();
+      System.out.println(indirectBuffer.position()); // 5
+      indirectBuffer = indirectBuffer.clear();
+      System.out.println(indirectBuffer.position()); // 0
+      System.out.println(indirectBuffer.remaining()); // 16
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.rewind();
+      System.out.println(indirectBuffer.position()); // 0
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.flip();
+      System.out.println(indirectBuffer.position()); // 0
+      System.out.println(indirectBuffer.remaining()); // 2
+    }
+
+    static void shortBufferTest() {
+      short[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
+      short putValue = 55;
+
+      ShortBuffer directBuffer = ShortBuffer.wrap(data);
+      Buffer indirectBuffer = ShortBuffer.wrap(data);
+      ShortBuffer castedIndirectBuffer = (ShortBuffer) indirectBuffer;
+
+      directBuffer = directBuffer.position(5);
+      System.out.println(directBuffer.position()); // 5
+      directBuffer = directBuffer.limit(7);
+      System.out.println(directBuffer.remaining()); // 2
+      directBuffer = directBuffer.mark().put(putValue).put(putValue).reset();
+      System.out.println(directBuffer.position()); // 5
+      directBuffer = directBuffer.clear();
+      System.out.println(directBuffer.position()); // 0
+      System.out.println(directBuffer.remaining()); // 16
+      directBuffer.put(putValue);
+      directBuffer.put(putValue);
+      directBuffer = directBuffer.rewind();
+      System.out.println(directBuffer.position()); // 0
+      directBuffer.put(putValue);
+      directBuffer.put(putValue);
+      directBuffer = directBuffer.flip();
+      System.out.println(directBuffer.position()); // 0
+      System.out.println(directBuffer.remaining()); // 2
+
+      indirectBuffer = indirectBuffer.position(5);
+      System.out.println(indirectBuffer.position()); // 5
+      indirectBuffer = indirectBuffer.limit(7);
+      System.out.println(indirectBuffer.remaining()); // 2
+      indirectBuffer = indirectBuffer.mark();
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.reset();
+      System.out.println(indirectBuffer.position()); // 5
+      indirectBuffer = indirectBuffer.clear();
+      System.out.println(indirectBuffer.position()); // 0
+      System.out.println(indirectBuffer.remaining()); // 16
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.rewind();
+      System.out.println(indirectBuffer.position()); // 0
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.flip();
+      System.out.println(indirectBuffer.position()); // 0
+      System.out.println(indirectBuffer.remaining()); // 2
+    }
+
+    static void intBufferTest() {
+      int[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
+      int putValue = 55;
+
+      IntBuffer directBuffer = IntBuffer.wrap(data);
+      Buffer indirectBuffer = IntBuffer.wrap(data);
+      IntBuffer castedIndirectBuffer = (IntBuffer) indirectBuffer;
+
+      directBuffer = directBuffer.position(5);
+      System.out.println(directBuffer.position()); // 5
+      directBuffer = directBuffer.limit(7);
+      System.out.println(directBuffer.remaining()); // 2
+      directBuffer = directBuffer.mark().put(putValue).put(putValue).reset();
+      System.out.println(directBuffer.position()); // 5
+      directBuffer = directBuffer.clear();
+      System.out.println(directBuffer.position()); // 0
+      System.out.println(directBuffer.remaining()); // 16
+      directBuffer.put(putValue);
+      directBuffer.put(putValue);
+      directBuffer = directBuffer.rewind();
+      System.out.println(directBuffer.position()); // 0
+      directBuffer.put(putValue);
+      directBuffer.put(putValue);
+      directBuffer = directBuffer.flip();
+      System.out.println(directBuffer.position()); // 0
+      System.out.println(directBuffer.remaining()); // 2
+
+      indirectBuffer = indirectBuffer.position(5);
+      System.out.println(indirectBuffer.position()); // 5
+      indirectBuffer = indirectBuffer.limit(7);
+      System.out.println(indirectBuffer.remaining()); // 2
+      indirectBuffer = indirectBuffer.mark();
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.reset();
+      System.out.println(indirectBuffer.position()); // 5
+      indirectBuffer = indirectBuffer.clear();
+      System.out.println(indirectBuffer.position()); // 0
+      System.out.println(indirectBuffer.remaining()); // 16
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.rewind();
+      System.out.println(indirectBuffer.position()); // 0
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.flip();
+      System.out.println(indirectBuffer.position()); // 0
+      System.out.println(indirectBuffer.remaining()); // 2
+    }
+
+    static void longBufferTest() {
+      long[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
+      long putValue = 55;
+
+      LongBuffer directBuffer = LongBuffer.wrap(data);
+      Buffer indirectBuffer = LongBuffer.wrap(data);
+      LongBuffer castedIndirectBuffer = (LongBuffer) indirectBuffer;
+
+      directBuffer = directBuffer.position(5);
+      System.out.println(directBuffer.position()); // 5
+      directBuffer = directBuffer.limit(7);
+      System.out.println(directBuffer.remaining()); // 2
+      directBuffer = directBuffer.mark().put(putValue).put(putValue).reset();
+      System.out.println(directBuffer.position()); // 5
+      directBuffer = directBuffer.clear();
+      System.out.println(directBuffer.position()); // 0
+      System.out.println(directBuffer.remaining()); // 16
+      directBuffer.put(putValue);
+      directBuffer.put(putValue);
+      directBuffer = directBuffer.rewind();
+      System.out.println(directBuffer.position()); // 0
+      directBuffer.put(putValue);
+      directBuffer.put(putValue);
+      directBuffer = directBuffer.flip();
+      System.out.println(directBuffer.position()); // 0
+      System.out.println(directBuffer.remaining()); // 2
+
+      indirectBuffer = indirectBuffer.position(5);
+      System.out.println(indirectBuffer.position()); // 5
+      indirectBuffer = indirectBuffer.limit(7);
+      System.out.println(indirectBuffer.remaining()); // 2
+      indirectBuffer = indirectBuffer.mark();
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.reset();
+      System.out.println(indirectBuffer.position()); // 5
+      indirectBuffer = indirectBuffer.clear();
+      System.out.println(indirectBuffer.position()); // 0
+      System.out.println(indirectBuffer.remaining()); // 16
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.rewind();
+      System.out.println(indirectBuffer.position()); // 0
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.flip();
+      System.out.println(indirectBuffer.position()); // 0
+      System.out.println(indirectBuffer.remaining()); // 2
+    }
+
+    static void floatBufferTest() {
+      float[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
+      float putValue = 55;
+
+      FloatBuffer directBuffer = FloatBuffer.wrap(data);
+      Buffer indirectBuffer = FloatBuffer.wrap(data);
+      FloatBuffer castedIndirectBuffer = (FloatBuffer) indirectBuffer;
+
+      directBuffer = directBuffer.position(5);
+      System.out.println(directBuffer.position()); // 5
+      directBuffer = directBuffer.limit(7);
+      System.out.println(directBuffer.remaining()); // 2
+      directBuffer = directBuffer.mark().put(putValue).put(putValue).reset();
+      System.out.println(directBuffer.position()); // 5
+      directBuffer = directBuffer.clear();
+      System.out.println(directBuffer.position()); // 0
+      System.out.println(directBuffer.remaining()); // 16
+      directBuffer.put(putValue);
+      directBuffer.put(putValue);
+      directBuffer = directBuffer.rewind();
+      System.out.println(directBuffer.position()); // 0
+      directBuffer.put(putValue);
+      directBuffer.put(putValue);
+      directBuffer = directBuffer.flip();
+      System.out.println(directBuffer.position()); // 0
+      System.out.println(directBuffer.remaining()); // 2
+
+      indirectBuffer = indirectBuffer.position(5);
+      System.out.println(indirectBuffer.position()); // 5
+      indirectBuffer = indirectBuffer.limit(7);
+      System.out.println(indirectBuffer.remaining()); // 2
+      indirectBuffer = indirectBuffer.mark();
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.reset();
+      System.out.println(indirectBuffer.position()); // 5
+      indirectBuffer = indirectBuffer.clear();
+      System.out.println(indirectBuffer.position()); // 0
+      System.out.println(indirectBuffer.remaining()); // 16
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.rewind();
+      System.out.println(indirectBuffer.position()); // 0
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.flip();
+      System.out.println(indirectBuffer.position()); // 0
+      System.out.println(indirectBuffer.remaining()); // 2
+    }
+
+    static void doubleBufferTest() {
+      double[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
+      double putValue = 55;
+
+      DoubleBuffer directBuffer = DoubleBuffer.wrap(data);
+      Buffer indirectBuffer = DoubleBuffer.wrap(data);
+      DoubleBuffer castedIndirectBuffer = (DoubleBuffer) indirectBuffer;
+
+      directBuffer = directBuffer.position(5);
+      System.out.println(directBuffer.position()); // 5
+      directBuffer = directBuffer.limit(7);
+      System.out.println(directBuffer.remaining()); // 2
+      directBuffer = directBuffer.mark().put(putValue).put(putValue).reset();
+      System.out.println(directBuffer.position()); // 5
+      directBuffer = directBuffer.clear();
+      System.out.println(directBuffer.position()); // 0
+      System.out.println(directBuffer.remaining()); // 16
+      directBuffer.put(putValue);
+      directBuffer.put(putValue);
+      directBuffer = directBuffer.rewind();
+      System.out.println(directBuffer.position()); // 0
+      directBuffer.put(putValue);
+      directBuffer.put(putValue);
+      directBuffer = directBuffer.flip();
+      System.out.println(directBuffer.position()); // 0
+      System.out.println(directBuffer.remaining()); // 2
+
+      indirectBuffer = indirectBuffer.position(5);
+      System.out.println(indirectBuffer.position()); // 5
+      indirectBuffer = indirectBuffer.limit(7);
+      System.out.println(indirectBuffer.remaining()); // 2
+      indirectBuffer = indirectBuffer.mark();
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.reset();
+      System.out.println(indirectBuffer.position()); // 5
+      indirectBuffer = indirectBuffer.clear();
+      System.out.println(indirectBuffer.position()); // 0
+      System.out.println(indirectBuffer.remaining()); // 16
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.rewind();
+      System.out.println(indirectBuffer.position()); // 0
+      castedIndirectBuffer.put(putValue);
+      castedIndirectBuffer.put(putValue);
+      indirectBuffer = indirectBuffer.flip();
+      System.out.println(indirectBuffer.position()); // 0
+      System.out.println(indirectBuffer.remaining()); // 2
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/buffercovariantreturntype/BufferCovariantReturnTypeTest.java b/src/test/java/com/android/tools/r8/desugar/buffercovariantreturntype/BufferCovariantReturnTypeTest.java
deleted file mode 100644
index 43f183d..0000000
--- a/src/test/java/com/android/tools/r8/desugar/buffercovariantreturntype/BufferCovariantReturnTypeTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.desugar.buffercovariantreturntype;
-
-import static com.android.tools.r8.TestRuntime.CfVm.JDK11;
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.StringUtils;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameter;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class BufferCovariantReturnTypeTest extends TestBase {
-
-  private static final Path JAR =
-      Paths.get(ToolHelper.EXAMPLES_JAVA11_JAR_DIR)
-          .resolve("buffercovariantreturntype" + JAR_EXTENSION);
-  private static final String EXPECTED_RESULT_PER_BUFFER =
-      StringUtils.lines("5", "2", "5", "0", "16", "0", "0", "2");
-  private static final String EXPECTED_RESULT =
-      new String(new char[14]).replace("\0", EXPECTED_RESULT_PER_BUFFER);
-
-  @Parameter(0)
-  public TestParameters parameters;
-
-  @Parameters(name = "{0}")
-  public static TestParametersCollection data() {
-    return getTestParameters()
-        .withCfRuntimesStartingFromIncluding(JDK11)
-        .withDexRuntimes()
-        .withAllApiLevelsAlsoForCf()
-        .build();
-  }
-
-  @Test
-  public void testJVM() throws Exception {
-    parameters.assumeJvmTestParameters();
-    testForJvm(parameters)
-        .addProgramFiles(JAR)
-        .run(parameters.getRuntime(), "buffercovariantreturntype.BufferCovariantReturnTypeMain")
-        .assertSuccessWithOutput(EXPECTED_RESULT);
-  }
-
-  @Test
-  public void testD8() throws Exception {
-    testForD8(parameters.getBackend())
-        .addProgramFiles(JAR)
-        .setMinApi(parameters)
-        .run(parameters.getRuntime(), "buffercovariantreturntype.BufferCovariantReturnTypeMain")
-        .assertSuccessWithOutput(EXPECTED_RESULT);
-  }
-
-  @Test
-  public void testR8() throws Exception {
-    parameters.assumeR8TestParameters();
-    testForR8(parameters.getBackend())
-        .addProgramFiles(JAR)
-        .addKeepMainRule("buffercovariantreturntype.BufferCovariantReturnTypeMain")
-        .setMinApi(parameters)
-        .run(parameters.getRuntime(), "buffercovariantreturntype.BufferCovariantReturnTypeMain")
-        .assertSuccessWithOutput(EXPECTED_RESULT);
-  }
-}