Update InvokeSuperTest to new test infrastructure.

Change-Id: I1982c8379d54f348fea37548c1018773c5231b4d
diff --git a/src/test/java/com/android/tools/r8/DiagnosticsChecker.java b/src/test/java/com/android/tools/r8/DiagnosticsChecker.java
index 6eba851..049cdb7 100644
--- a/src/test/java/com/android/tools/r8/DiagnosticsChecker.java
+++ b/src/test/java/com/android/tools/r8/DiagnosticsChecker.java
@@ -7,7 +7,6 @@
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.graph.invokesuper.Consumer;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.origin.PathOrigin;
 import com.android.tools.r8.position.Position;
@@ -17,6 +16,7 @@
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Consumer;
 
 // Helper to check that a particular error occurred.
 public class DiagnosticsChecker implements DiagnosticsHandler {
diff --git a/src/test/java/com/android/tools/r8/graph/InvokeSuperTest.java b/src/test/java/com/android/tools/r8/graph/InvokeSuperTest.java
index 5bf5a36..f71538c 100644
--- a/src/test/java/com/android/tools/r8/graph/InvokeSuperTest.java
+++ b/src/test/java/com/android/tools/r8/graph/InvokeSuperTest.java
@@ -3,48 +3,371 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.graph;
 
-import com.android.tools.r8.AsmTestBase;
-import com.android.tools.r8.ToolHelper;
+import static org.hamcrest.CoreMatchers.allOf;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.TestRunResult;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
-import com.android.tools.r8.VmTestRunner;
-import com.android.tools.r8.VmTestRunner.IgnoreForRangeOfVmVersions;
-import com.android.tools.r8.graph.invokesuper.Consumer;
-import com.android.tools.r8.graph.invokesuper.InvokerClassDump;
-import com.android.tools.r8.graph.invokesuper.InvokerClassFailingDump;
-import com.android.tools.r8.graph.invokesuper.MainClass;
-import com.android.tools.r8.graph.invokesuper.MainClassFailing;
-import com.android.tools.r8.graph.invokesuper.SubLevel1;
-import com.android.tools.r8.graph.invokesuper.SubLevel2;
-import com.android.tools.r8.graph.invokesuper.SubclassOfInvokerClass;
-import com.android.tools.r8.graph.invokesuper.Super;
+import com.android.tools.r8.transformers.ClassTransformer;
+import com.android.tools.r8.utils.DescriptorUtils;
+import com.android.tools.r8.utils.StringUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
 
-@RunWith(VmTestRunner.class)
-public class InvokeSuperTest extends AsmTestBase {
+@RunWith(Parameterized.class)
+public class InvokeSuperTest extends TestBase {
 
-  @Test
-  @IgnoreForRangeOfVmVersions(from = Version.V5_1_1, to = Version.V6_0_1)
-  public void testInvokeSuperTargets() throws Exception {
-    ensureSameOutput(MainClass.class.getCanonicalName(),
-        ToolHelper.getClassAsBytes(MainClass.class),
-        ToolHelper.getClassAsBytes(Consumer.class),
-        ToolHelper.getClassAsBytes(Super.class),
-        ToolHelper.getClassAsBytes(SubLevel1.class),
-        ToolHelper.getClassAsBytes(SubLevel2.class),
-        InvokerClassDump.dump(),
-        ToolHelper.getClassAsBytes(SubclassOfInvokerClass.class));
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
+  }
+
+  final TestParameters parameters;
+
+  public InvokeSuperTest(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  static final String EXPECTED =
+      StringUtils.lines(
+          "superMethod in SubLevel2",
+          "superMethod in SubLevel2",
+          "superMethod in SubLevel2",
+          "java.lang.NoSuchMethodError",
+          "subLevel1Method in SubLevel2",
+          "subLevel1Method in SubLevel2",
+          "subLevel2Method in SubLevel2",
+          "From SubLevel1: otherSuperMethod in Super");
+
+  static final String UNEXPECTED_DEX_5_AND_6_OUTPUT =
+      StringUtils.lines(
+          "superMethod in Super",
+          "superMethod in SubLevel1",
+          "superMethod in SubLevel2",
+          "java.lang.NoSuchMethodError",
+          "subLevel1Method in SubLevel1",
+          "subLevel1Method in SubLevel2",
+          "subLevel2Method in SubLevel2",
+          "From SubLevel1: otherSuperMethod in Super");
+
+  String getExpectedOutput() {
+    if (parameters.isDexRuntime()) {
+      Version version = parameters.getRuntime().asDex().getVm().getVersion();
+      if (version.isAtLeast(Version.V5_1_1) && version.isOlderThanOrEqual(Version.V6_0_1)) {
+        return UNEXPECTED_DEX_5_AND_6_OUTPUT;
+      }
+    }
+    return EXPECTED;
   }
 
   @Test
-  public void testInvokeSuperTargetsNonVerifying() throws Exception {
-    ensureR8FailsWithCompilationError(MainClassFailing.class.getCanonicalName(),
-        ToolHelper.getClassAsBytes(MainClassFailing.class),
-        ToolHelper.getClassAsBytes(Consumer.class),
-        ToolHelper.getClassAsBytes(Super.class),
-        ToolHelper.getClassAsBytes(SubLevel1.class),
-        ToolHelper.getClassAsBytes(SubLevel2.class),
-        InvokerClassFailingDump.dump(),
-        ToolHelper.getClassAsBytes(SubclassOfInvokerClass.class));
+  public void testReference() throws Exception {
+    testForRuntime(parameters)
+        .addProgramClasses(
+            MainClass.class,
+            Consumer.class,
+            Super.class,
+            SubLevel1.class,
+            SubLevel2.class,
+            SubClassOfInvokerClass.class)
+        .addProgramClassFileData(InvokerClassDump.dumpVerifying())
+        .run(parameters.getRuntime(), MainClass.class)
+        .assertSuccessWithOutput(getExpectedOutput());
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    testForR8(parameters.getBackend())
+        .addProgramClasses(
+            MainClass.class,
+            Consumer.class,
+            Super.class,
+            SubLevel1.class,
+            SubLevel2.class,
+            SubClassOfInvokerClass.class)
+        .addProgramClassFileData(InvokerClassDump.dumpVerifying())
+        .setMinApi(parameters.getApiLevel())
+        .addKeepMainRule(MainClass.class)
+        .run(parameters.getRuntime(), MainClass.class)
+        .assertSuccessWithOutput(EXPECTED);
+  }
+
+  @Test
+  public void testReferenceNonVerifying() throws Exception {
+    testForRuntime(parameters)
+        .addProgramClasses(
+            MainClassFailing.class,
+            Consumer.class,
+            Super.class,
+            SubLevel1.class,
+            SubLevel2.class,
+            SubClassOfInvokerClass.class)
+        .addProgramClassFileData(InvokerClassDump.dumpNonVerifying())
+        .run(parameters.getRuntime(), MainClassFailing.class)
+        .apply(this::checkNonVerifyingResult);
+  }
+
+  private void checkNonVerifyingResult(TestRunResult<?> result) {
+    // The input is invalid and any JVM will fail at verification time.
+    if (parameters.isCfRuntime()) {
+      result.assertFailureWithErrorThatMatches(containsString(VerifyError.class.getName()));
+      return;
+    }
+    // D8 cannot verify its inputs and the behavior of the compiled output differs.
+    // The failure is due to lambda desugaring on pre-7 and fails at runtime on 7+.
+    Version version = parameters.getRuntime().asDex().getVm().getVersion();
+    if (version.isOlderThanOrEqual(Version.V6_0_1)) {
+      result.assertFailureWithErrorThatMatches(
+          allOf(containsString("java.lang.NoClassDefFoundError"), containsString("-$$Lambda$")));
+      return;
+    }
+    result.assertSuccessWithOutputLines(NoSuchMethodError.class.getName());
+  }
+
+  @Test
+  public void testR8NonVerifying() throws Exception {
+    try {
+      testForR8(parameters.getBackend())
+          .addProgramClasses(
+              MainClassFailing.class,
+              Consumer.class,
+              Super.class,
+              SubLevel1.class,
+              SubLevel2.class,
+              SubClassOfInvokerClass.class)
+          .addProgramClassFileData(InvokerClassDump.dumpNonVerifying())
+          .setMinApi(parameters.getApiLevel())
+          .addKeepMainRule(MainClassFailing.class)
+          .compileWithExpectedDiagnostics(
+              diagnostics -> {
+                diagnostics.assertErrorMessageThatMatches(containsString("Illegal invoke-super"));
+              });
+      fail("Expected compilation to fail");
+    } catch (CompilationFailedException e) {
+      // Expected compilation failure.
+    }
+  }
+
+  /** Copy of {@ref java.util.function.Consumer} to allow tests to run on early versions of art. */
+  interface Consumer<T> {
+
+    void accept(T item);
+  }
+
+  static class Super {
+
+    public void superMethod() {
+      System.out.println("superMethod in Super");
+    }
+
+    public void otherSuperMethod() {
+      System.out.println("otherSuperMethod in Super");
+    }
+  }
+
+  static class SubLevel1 extends Super {
+
+    @Override
+    public void superMethod() {
+      System.out.println("superMethod in SubLevel1");
+    }
+
+    public void subLevel1Method() {
+      System.out.println("subLevel1Method in SubLevel1");
+    }
+
+    public void otherSuperMethod() {
+      System.out.println("otherSuperMethod in SubLevel1");
+    }
+
+    public void callOtherSuperMethod() {
+      System.out.print("From SubLevel1: ");
+      super.otherSuperMethod();
+    }
+  }
+
+  static class SubClassOfInvokerClass extends InvokerClass {
+
+    public void subLevel2Method() {
+      System.out.println("subLevel2Method in SubClassOfInvokerClass");
+    }
+  }
+
+  static class SubLevel2 extends SubLevel1 {
+
+    @Override
+    public void superMethod() {
+      System.out.println("superMethod in SubLevel2");
+    }
+
+    @Override
+    public void subLevel1Method() {
+      System.out.println("subLevel1Method in SubLevel2");
+    }
+
+    public void subLevel2Method() {
+      System.out.println("subLevel2Method in SubLevel2");
+    }
+
+    public void otherSuperMethod() {
+      System.out.println("otherSuperMethod in SubLevel2");
+    }
+
+    public void callOtherSuperMethodIndirect() {
+      callOtherSuperMethod();
+    }
+  }
+
+  static class MainClass {
+
+    private static void tryInvoke(Consumer<InvokerClass> function) {
+      InvokerClass invoker = new InvokerClass();
+      try {
+        function.accept(invoker);
+      } catch (Throwable e) {
+        System.out.println(e.getClass().getCanonicalName());
+      }
+    }
+
+    public static void main(String... args) {
+      tryInvoke(InvokerClass::invokeSuperMethodOnSuper);
+      tryInvoke(InvokerClass::invokeSuperMethodOnSubLevel1);
+      tryInvoke(InvokerClass::invokeSuperMethodOnSubLevel2);
+      tryInvoke(InvokerClass::invokeSubLevel1MethodOnSuper);
+      tryInvoke(InvokerClass::invokeSubLevel1MethodOnSubLevel1);
+      tryInvoke(InvokerClass::invokeSubLevel1MethodOnSubLevel2);
+      tryInvoke(InvokerClass::invokeSubLevel2MethodOnSubLevel2);
+      tryInvoke(InvokerClass::callOtherSuperMethodIndirect);
+    }
+  }
+
+  static class MainClassFailing {
+
+    private static void tryInvoke(java.util.function.Consumer<InvokerClass> function) {
+      InvokerClass invoker = new InvokerClass();
+      try {
+        function.accept(invoker);
+      } catch (Throwable e) {
+        System.out.println(e.getClass().getCanonicalName());
+      }
+    }
+
+    public static void main(String... args) {
+      tryInvoke(InvokerClass::invokeSubLevel2MethodOnSubClassOfInvokerClass);
+    }
+  }
+
+  /**
+   * This class is a stub class needed to compile the dependent Java classes. The actual
+   * implementation that will be used at runtime is generated by {@link InvokerClassDump}.
+   */
+  static class InvokerClass extends SubLevel2 {
+
+    public void invokeSuperMethodOnSubLevel2() {
+      stubIsUnreachable();
+    }
+
+    public void invokeSuperMethodOnSubLevel1() {
+      stubIsUnreachable();
+    }
+
+    public void invokeSuperMethodOnSuper() {
+      stubIsUnreachable();
+    }
+
+    public void invokeSubLevel1MethodOnSubLevel2() {
+      stubIsUnreachable();
+    }
+
+    public void invokeSubLevel1MethodOnSubLevel1() {
+      stubIsUnreachable();
+    }
+
+    public void invokeSubLevel1MethodOnSuper() {
+      stubIsUnreachable();
+    }
+
+    public void invokeSubLevel2MethodOnSubLevel2() {
+      stubIsUnreachable();
+    }
+
+    public void invokeSubLevel2MethodOnSubClassOfInvokerClass() {
+      stubIsUnreachable();
+    }
+
+    private static void stubIsUnreachable() {
+      throw new RuntimeException("Stub should never be called.");
+    }
+  }
+
+  // This modifies the above {@link InvokerClass} with invoke-special for the corresponding methods.
+  static class InvokerClassDump implements Opcodes {
+
+    public static byte[] dumpVerifying() throws Exception {
+      return dump(true);
+    }
+
+    public static byte[] dumpNonVerifying() throws Exception {
+      return dump(false);
+    }
+
+    static byte[] dump(boolean verifying) throws Exception {
+      return transformer(InvokerClass.class)
+          .addClassTransformer(
+              new ClassTransformer() {
+                @Override
+                public MethodVisitor visitMethod(
+                    int access,
+                    String name,
+                    String descriptor,
+                    String signature,
+                    String[] exceptions) {
+                  // Keep the constructor as is.
+                  if (name.equals("<init>")) {
+                    return super.visitMethod(access, name, descriptor, signature, exceptions);
+                  }
+                  // Remove all methods not in the form of invokeXonY.
+                  if (!name.startsWith("invoke")) {
+                    return null;
+                  }
+                  // If dumping valid methods drop the invoke on a subclass, otherwise drop all
+                  // others.
+                  if (verifying == name.equals("invokeSubLevel2MethodOnSubClassOfInvokerClass")) {
+                    return null;
+                  }
+                  // Replace the body of invokeXonY methods by invoke of X on class Y.
+                  MethodVisitor mv =
+                      super.visitMethod(access, name, descriptor, signature, exceptions);
+                  int split = name.indexOf("On");
+                  assertTrue(split > 0);
+                  String targetMethodRaw = name.substring("invoke".length(), split);
+                  String targetMethod =
+                      targetMethodRaw.substring(0, 1).toLowerCase() + targetMethodRaw.substring(1);
+                  String targetHolderRaw = name.substring(split + 2);
+                  String targetHolderType =
+                      InvokeSuperTest.class.getTypeName() + "$" + targetHolderRaw;
+                  String targetHolderName =
+                      DescriptorUtils.getBinaryNameFromJavaType(targetHolderType);
+                  mv.visitCode();
+                  mv.visitVarInsn(ALOAD, 0);
+                  mv.visitMethodInsn(INVOKESPECIAL, targetHolderName, targetMethod, "()V", false);
+                  mv.visitInsn(RETURN);
+                  mv.visitMaxs(1, 1);
+                  mv.visitEnd();
+                  return null;
+                }
+              })
+          .transform();
+    }
   }
 }
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/Consumer.java b/src/test/java/com/android/tools/r8/graph/invokesuper/Consumer.java
deleted file mode 100644
index b323136..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/Consumer.java
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-/**
- * Copy of {@ref java.util.function.Consumer} to allow tests to run on early versions of art.
- */
-public interface Consumer<T> {
-
-  void accept(T item);
-}
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/InvokerClass.java b/src/test/java/com/android/tools/r8/graph/invokesuper/InvokerClass.java
deleted file mode 100644
index e0c9f93..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/InvokerClass.java
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-import com.android.tools.r8.errors.Unreachable;
-
-/**
- * This class is a stub class needed to compile the dependent Java classes. The actual
- * implementation that will be used at runtime is generated by {@link InvokerClassDump} and {@link
- * InvokerClassFailingDump}.
- */
-public class InvokerClass extends SubLevel2 {
-
-  public void invokeSuperMethodOnSubLevel2() {
-    stubIsUnreachable();
-  }
-
-  public void invokeSuperMethodOnSubLevel1() {
-    stubIsUnreachable();
-  }
-
-  public void invokeSuperMethodOnSuper() {
-    stubIsUnreachable();
-  }
-
-  public void invokeSubLevel1MethodOnSubLevel2() {
-    stubIsUnreachable();
-  }
-
-  public void invokeSubLevel1MethodOnSubLevel1() {
-    stubIsUnreachable();
-  }
-
-  public void invokeSubLevel1MethodOnSuper() {
-    stubIsUnreachable();
-  }
-
-  public void invokeSubLevel2MethodOnSubLevel2() {
-    stubIsUnreachable();
-  }
-
-  public void invokeSubLevel2MethodOnSubClassOfInvokerClass() {
-    stubIsUnreachable();
-  }
-
-  private static void stubIsUnreachable() {
-    throw new Unreachable("Stub should never be called.");
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/InvokerClassDump.java b/src/test/java/com/android/tools/r8/graph/invokesuper/InvokerClassDump.java
deleted file mode 100644
index c01700d..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/InvokerClassDump.java
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-
-/**
- * This is a modified version of {@link InvokerClass} with invoke special instructions corresponding
- * to the methods' names.
- */
-public class InvokerClassDump implements Opcodes {
-
-  public static byte[] dump() throws Exception {
-
-    ClassWriter cw = new ClassWriter(0);
-    FieldVisitor fv;
-    MethodVisitor mv;
-    AnnotationVisitor av0;
-
-    cw.visit(V1_8, ACC_PUBLIC + ACC_SUPER, "com/android/tools/r8/graph/invokesuper/InvokerClass",
-        null, "com/android/tools/r8/graph/invokesuper/SubLevel2", null);
-
-    {
-      mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
-      mv.visitCode();
-      mv.visitVarInsn(ALOAD, 0);
-      mv.visitMethodInsn(INVOKESPECIAL, "com/android/tools/r8/graph/invokesuper/SubLevel2",
-          "<init>", "()V", false);
-      mv.visitInsn(RETURN);
-      mv.visitMaxs(1, 1);
-      mv.visitEnd();
-    }
-    {
-      mv = cw.visitMethod(ACC_PUBLIC, "invokeSuperMethodOnSubLevel2", "()V", null, null);
-      mv.visitCode();
-      mv.visitVarInsn(ALOAD, 0);
-      mv.visitMethodInsn(INVOKESPECIAL, "com/android/tools/r8/graph/invokesuper/SubLevel2",
-          "superMethod", "()V", false);
-      mv.visitInsn(RETURN);
-      mv.visitMaxs(1, 1);
-      mv.visitEnd();
-    }
-    {
-      mv = cw.visitMethod(ACC_PUBLIC, "invokeSuperMethodOnSubLevel1", "()V", null, null);
-      mv.visitCode();
-      mv.visitVarInsn(ALOAD, 0);
-      mv.visitMethodInsn(INVOKESPECIAL, "com/android/tools/r8/graph/invokesuper/SubLevel1",
-          "superMethod", "()V", false);
-      mv.visitInsn(RETURN);
-      mv.visitMaxs(1, 1);
-      mv.visitEnd();
-    }
-    {
-      mv = cw.visitMethod(ACC_PUBLIC, "invokeSuperMethodOnSuper", "()V", null, null);
-      mv.visitCode();
-      mv.visitVarInsn(ALOAD, 0);
-      mv.visitMethodInsn(INVOKESPECIAL, "com/android/tools/r8/graph/invokesuper/Super",
-          "superMethod", "()V", false);
-      mv.visitInsn(RETURN);
-      mv.visitMaxs(1, 1);
-      mv.visitEnd();
-    }
-    {
-      mv = cw.visitMethod(ACC_PUBLIC, "invokeSubLevel1MethodOnSubLevel2", "()V", null, null);
-      mv.visitCode();
-      mv.visitVarInsn(ALOAD, 0);
-      mv.visitMethodInsn(INVOKESPECIAL, "com/android/tools/r8/graph/invokesuper/SubLevel2",
-          "subLevel1Method", "()V", false);
-      mv.visitInsn(RETURN);
-      mv.visitMaxs(1, 1);
-      mv.visitEnd();
-    }
-    {
-      mv = cw.visitMethod(ACC_PUBLIC, "invokeSubLevel1MethodOnSubLevel1", "()V", null, null);
-      mv.visitCode();
-      mv.visitVarInsn(ALOAD, 0);
-      mv.visitMethodInsn(INVOKESPECIAL, "com/android/tools/r8/graph/invokesuper/SubLevel1",
-          "subLevel1Method", "()V", false);
-      mv.visitInsn(RETURN);
-      mv.visitMaxs(1, 1);
-      mv.visitEnd();
-    }
-    {
-      mv = cw.visitMethod(ACC_PUBLIC, "invokeSubLevel1MethodOnSuper", "()V", null, null);
-      mv.visitCode();
-      mv.visitVarInsn(ALOAD, 0);
-      mv.visitMethodInsn(INVOKESPECIAL, "com/android/tools/r8/graph/invokesuper/Super",
-          "subLevel1Method", "()V", false);
-      mv.visitInsn(RETURN);
-      mv.visitMaxs(1, 1);
-      mv.visitEnd();
-    }
-    {
-      mv = cw.visitMethod(ACC_PUBLIC, "invokeSubLevel2MethodOnSubLevel2", "()V", null, null);
-      mv.visitCode();
-      mv.visitVarInsn(ALOAD, 0);
-      mv.visitMethodInsn(INVOKESPECIAL, "com/android/tools/r8/graph/invokesuper/SubLevel2",
-          "subLevel2Method", "()V", false);
-      mv.visitInsn(RETURN);
-      mv.visitMaxs(1, 1);
-      mv.visitEnd();
-    }
-    // The below fails to verify on the JavaVM, so we cannot test it there.
-    // {
-    //   mv = cw.visitMethod(ACC_PUBLIC, "invokeSubLevel2MethodOnSubClassOfInvokerClass", "()V",
-    //       null,
-    //       null);
-    //   mv.visitCode();
-    //   mv.visitVarInsn(ALOAD, 0);
-    //   mv.visitMethodInsn(INVOKESPECIAL,
-    //       "com/android/tools/r8/graph/invokesuper/SubclassOfInvokerClass",
-    //       "subLevel2Method", "()V", false);
-    //   mv.visitInsn(RETURN);
-    //   mv.visitMaxs(1, 1);
-    //   mv.visitEnd();
-    // }
-    cw.visitEnd();
-
-    return cw.toByteArray();
-  }
-}
-
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/InvokerClassFailingDump.java b/src/test/java/com/android/tools/r8/graph/invokesuper/InvokerClassFailingDump.java
deleted file mode 100644
index 18eebe4..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/InvokerClassFailingDump.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-
-/**
- /**
- * This is a modified version of {@link InvokerClass} with invoke special instructions corresponding
- * to the methods' names.
- * <p>
- * This class contains methods that do not verify on Java VMs.
- */
-public class InvokerClassFailingDump implements Opcodes {
-
-  public static byte[] dump() throws Exception {
-
-    ClassWriter cw = new ClassWriter(0);
-    FieldVisitor fv;
-    MethodVisitor mv;
-    AnnotationVisitor av0;
-
-    cw.visit(V1_8, ACC_PUBLIC + ACC_SUPER, "com/android/tools/r8/graph/invokesuper/InvokerClass",
-        null, "com/android/tools/r8/graph/invokesuper/SubLevel2", null);
-
-    {
-      mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
-      mv.visitCode();
-      mv.visitVarInsn(ALOAD, 0);
-      mv.visitMethodInsn(INVOKESPECIAL, "com/android/tools/r8/graph/invokesuper/SubLevel2",
-          "<init>", "()V", false);
-      mv.visitInsn(RETURN);
-      mv.visitMaxs(1, 1);
-      mv.visitEnd();
-    }
-    {
-      mv = cw.visitMethod(ACC_PUBLIC, "invokeSubLevel2MethodOnSubClassOfInvokerClass", "()V", null,
-          null);
-      mv.visitCode();
-      mv.visitVarInsn(ALOAD, 0);
-      mv.visitMethodInsn(INVOKESPECIAL,
-          "com/android/tools/r8/graph/invokesuper/SubclassOfInvokerClass",
-          "subLevel2Method", "()V", false);
-      mv.visitInsn(RETURN);
-      mv.visitMaxs(1, 1);
-      mv.visitEnd();
-    }
-    cw.visitEnd();
-
-    return cw.toByteArray();
-  }
-}
-
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/MainClass.java b/src/test/java/com/android/tools/r8/graph/invokesuper/MainClass.java
deleted file mode 100644
index 80e4d09..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/MainClass.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-public class MainClass {
-
-  private static void tryInvoke(Consumer<InvokerClass> function) {
-    InvokerClass invoker = new InvokerClass();
-    try {
-      function.accept(invoker);
-    } catch (Throwable e) {
-      System.out.println(e.getClass().getCanonicalName());
-    }
-  }
-
-  public static void main(String... args) {
-    tryInvoke(InvokerClass::invokeSuperMethodOnSuper);
-    tryInvoke(InvokerClass::invokeSuperMethodOnSubLevel1);
-    tryInvoke(InvokerClass::invokeSuperMethodOnSubLevel2);
-    tryInvoke(InvokerClass::invokeSubLevel1MethodOnSuper);
-    tryInvoke(InvokerClass::invokeSubLevel1MethodOnSubLevel1);
-    tryInvoke(InvokerClass::invokeSubLevel1MethodOnSubLevel2);
-    tryInvoke(InvokerClass::invokeSubLevel2MethodOnSubLevel2);
-    tryInvoke(InvokerClass::callOtherSuperMethodIndirect);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/MainClassFailing.java b/src/test/java/com/android/tools/r8/graph/invokesuper/MainClassFailing.java
deleted file mode 100644
index c662ff3..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/MainClassFailing.java
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-import java.util.function.Consumer;
-
-public class MainClassFailing {
-
-  private static void tryInvoke(Consumer<InvokerClass> function) {
-    InvokerClass invoker = new InvokerClass();
-    try {
-      function.accept(invoker);
-    } catch (Throwable e) {
-      System.out.println(e.getClass().getCanonicalName());
-    }
-  }
-
-  public static void main(String... args) {
-    tryInvoke(InvokerClass::invokeSubLevel2MethodOnSubClassOfInvokerClass);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/SubLevel1.java b/src/test/java/com/android/tools/r8/graph/invokesuper/SubLevel1.java
deleted file mode 100644
index 50fa633..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/SubLevel1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-public class SubLevel1 extends Super {
-
-  @Override
-  public void superMethod() {
-    System.out.println("superMethod in SubLevel1");
-  }
-
-  public void subLevel1Method() {
-    System.out.println("subLevel1Method in SubLevel1");
-  }
-
-  public void otherSuperMethod() {
-    System.out.println("otherSuperMethod in SubLevel1");
-  }
-
-  public void callOtherSuperMethod() {
-    System.out.print("From SubLevel1: ");
-    super.otherSuperMethod();
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/SubLevel2.java b/src/test/java/com/android/tools/r8/graph/invokesuper/SubLevel2.java
deleted file mode 100644
index 9cb04ec..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/SubLevel2.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-public class SubLevel2 extends SubLevel1 {
-
-  @Override
-  public void superMethod() {
-    System.out.println("superMethod in SubLevel2");
-  }
-
-  @Override
-  public void subLevel1Method() {
-    System.out.println("subLevel1Method in SubLevel2");
-  }
-
-  public void subLevel2Method() {
-    System.out.println("subLevel2Method in SubLevel2");
-  }
-
-  public void otherSuperMethod() {
-    System.out.println("otherSuperMethod in SubLevel2");
-  }
-
-  public void callOtherSuperMethodIndirect() {
-    callOtherSuperMethod();
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/SubclassOfInvokerClass.java b/src/test/java/com/android/tools/r8/graph/invokesuper/SubclassOfInvokerClass.java
deleted file mode 100644
index 77d6aab..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/SubclassOfInvokerClass.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-public class SubclassOfInvokerClass extends InvokerClass {
-
-  public void subLevel2Method() {
-    System.out.println("subLevel2Method in SubclassOfInvokerClass");
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/Super.java b/src/test/java/com/android/tools/r8/graph/invokesuper/Super.java
deleted file mode 100644
index 51596fe..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/Super.java
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-public class Super {
-
-  public void superMethod() {
-    System.out.println("superMethod in Super");
-  }
-
-  public void otherSuperMethod() {
-    System.out.println("otherSuperMethod in Super");
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
index a97372e..bcb02da 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
@@ -25,12 +25,12 @@
 import com.android.tools.r8.StringConsumer;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.graph.invokesuper.Consumer;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import java.util.function.Consumer;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
index 5c01601..5737496 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
@@ -26,7 +26,6 @@
 import com.android.tools.r8.StringConsumer;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.graph.invokesuper.Consumer;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -34,6 +33,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.util.Map;
+import java.util.function.Consumer;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
index dda4a3a..b19ed16 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
@@ -29,7 +29,6 @@
 import com.android.tools.r8.StringConsumer;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.graph.invokesuper.Consumer;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -37,6 +36,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.util.Map;
+import java.util.function.Consumer;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
diff --git a/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java b/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java
index 3cd46e12..eebb7d5 100644
--- a/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java
@@ -12,7 +12,6 @@
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.graph.invokesuper.Consumer;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
@@ -21,6 +20,7 @@
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
+import java.util.function.Consumer;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
index 48c6dea..ee8629f 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
@@ -18,7 +18,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.graph.invokesuper.Consumer;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.shaking.ProguardKeepAttributes;
 import com.android.tools.r8.shaking.forceproguardcompatibility.TestMain.MentionedClass;
@@ -40,6 +39,7 @@
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Consumer;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
diff --git a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/b115867670/B115867670.java b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/b115867670/B115867670.java
index 8f19ef8..f2f6731 100644
--- a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/b115867670/B115867670.java
+++ b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/b115867670/B115867670.java
@@ -11,13 +11,13 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 
-import com.android.tools.r8.graph.invokesuper.Consumer;
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatibilityTestBase;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import java.util.List;
+import java.util.function.Consumer;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
diff --git a/src/test/java/com/android/tools/r8/utils/graphinspector/GraphInspector.java b/src/test/java/com/android/tools/r8/utils/graphinspector/GraphInspector.java
index 59376e6..fe98a17 100644
--- a/src/test/java/com/android/tools/r8/utils/graphinspector/GraphInspector.java
+++ b/src/test/java/com/android/tools/r8/utils/graphinspector/GraphInspector.java
@@ -18,7 +18,6 @@
 import com.android.tools.r8.experimental.graphinfo.GraphNode;
 import com.android.tools.r8.experimental.graphinfo.KeepRuleGraphNode;
 import com.android.tools.r8.experimental.graphinfo.MethodGraphNode;
-import com.android.tools.r8.graph.invokesuper.Consumer;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.position.Position;
 import com.android.tools.r8.position.TextPosition;
@@ -38,6 +37,7 @@
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.function.BiPredicate;
+import java.util.function.Consumer;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
 import org.junit.Assert;