Refactorings to make progress on having no default min-api in tests.

There are still 500+ failures if the assert is in place. This CL
refactors the builders and updates a handful of tests. Remaining tests
are postponed to follow-ups.

Bug: 186010707
Bug: 167145686
Change-Id: I28884869080081953b44e9945101da5a754ba626
diff --git a/src/test/java/com/android/tools/r8/D8TestBuilder.java b/src/test/java/com/android/tools/r8/D8TestBuilder.java
index c988660..b39af91 100644
--- a/src/test/java/com/android/tools/r8/D8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/D8TestBuilder.java
@@ -71,7 +71,7 @@
     return new D8TestCompileResult(
         getState(),
         app.get(),
-        minApiLevel,
+        getMinApiLevel(),
         getOutputMode(),
         libraryDesugaringTestConfiguration,
         getMapContent());
diff --git a/src/test/java/com/android/tools/r8/DXTestBuilder.java b/src/test/java/com/android/tools/r8/DXTestBuilder.java
index 2459f1d..436f1e7 100644
--- a/src/test/java/com/android/tools/r8/DXTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/DXTestBuilder.java
@@ -52,7 +52,7 @@
       Path outJar = dxOutputFolder.resolve("output.jar");
 
       List<String> args = new ArrayList<>();
-      args.add("--min-sdk-version=" + minApiLevel);
+      args.add("--min-sdk-version=" + getMinApiLevel());
       args.add("--output=" + outJar.toString());
       args.addAll(injars.stream().map(Path::toString).collect(Collectors.toList()));
       ProcessResult result =
@@ -63,7 +63,7 @@
         throw new CompilationFailedException(result.toString());
       }
       return new DXTestCompileResult(
-          getState(), AndroidApp.builder().addProgramFile(outJar).build(), minApiLevel);
+          getState(), AndroidApp.builder().addProgramFile(outJar).build(), getMinApiLevel());
     } catch (IOException e) {
       throw new CompilationFailedException(e);
     }
diff --git a/src/test/java/com/android/tools/r8/ExternalR8TestBuilder.java b/src/test/java/com/android/tools/r8/ExternalR8TestBuilder.java
index 85e7ca6..6d34346 100644
--- a/src/test/java/com/android/tools/r8/ExternalR8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/ExternalR8TestBuilder.java
@@ -190,7 +190,7 @@
               ? FileUtils.readTextFile(proguardMapFile, Charsets.UTF_8)
               : "";
       return new ExternalR8TestCompileResult(
-          getState(), outputJar, processResult, proguardMap, minApiLevel, getOutputMode());
+          getState(), outputJar, processResult, proguardMap, getMinApiLevel(), getOutputMode());
     } catch (IOException e) {
       throw new CompilationFailedException(e);
     }
diff --git a/src/test/java/com/android/tools/r8/ProguardTestBuilder.java b/src/test/java/com/android/tools/r8/ProguardTestBuilder.java
index 8791b27..8d5bdea 100644
--- a/src/test/java/com/android/tools/r8/ProguardTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/ProguardTestBuilder.java
@@ -114,7 +114,7 @@
       }
       String proguardMap =
           Files.exists(mapFile) ? FileUtils.readTextFile(mapFile, Charsets.UTF_8) : "";
-      return new ProguardTestCompileResult(getState(), outJar, minApiLevel, proguardMap);
+      return new ProguardTestCompileResult(getState(), outJar, getMinApiLevel(), proguardMap);
     } catch (IOException e) {
       throw new CompilationFailedException(e);
     }
diff --git a/src/test/java/com/android/tools/r8/R8TestBuilder.java b/src/test/java/com/android/tools/r8/R8TestBuilder.java
index 2db1e9d..0f72c5a 100644
--- a/src/test/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/R8TestBuilder.java
@@ -127,7 +127,7 @@
             box.syntheticProguardRules,
             createDefaultProguardMapConsumer ? proguardMapBuilder.toString() : null,
             graphConsumer,
-            minApiLevel,
+            getMinApiLevel(),
             features);
     switch (allowedDiagnosticMessages) {
       case ALL:
diff --git a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
index fbe6f27..2fe8ae0 100644
--- a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
@@ -68,7 +68,7 @@
   private ProgramConsumer programConsumer;
   private MainDexClassesCollector mainDexClassesCollector;
   private StringConsumer mainDexListConsumer;
-  protected int minApiLevel = ToolHelper.getMinApiLevelForDexVm().getLevel();
+  private int minApiLevel = -1;
   private boolean optimizeMultidexForLinearAlloc = false;
   private Consumer<InternalOptions> optionsConsumer = DEFAULT_OPTIONS;
   private ByteArrayOutputStream stdout = null;
@@ -103,6 +103,11 @@
     }
   }
 
+  protected int getMinApiLevel() {
+    // TODO(b/186010707): Enable assert minApiLevel != -1;
+    return minApiLevel;
+  }
+
   abstract CR internalCompile(
       B builder, Consumer<InternalOptions> optionsConsumer, Supplier<AndroidApp> app)
       throws CompilationFailedException;
@@ -190,7 +195,12 @@
     if (backend.isDex() || !isTestShrinkerBuilder()) {
       assert !builder.isMinApiLevelSet()
           : "Don't set the API level directly through BaseCompilerCommand.Builder in tests";
-      builder.setMinApiLevel(minApiLevel);
+      // TODO(b/186010707): This will always be set when fixed.
+      int minApi =
+          getMinApiLevel() == -1
+              ? ToolHelper.getMinApiLevelForDexVm().getLevel()
+              : getMinApiLevel();
+      builder.setMinApiLevel(minApi);
     }
     builder.setOptimizeMultidexForLinearAlloc(optimizeMultidexForLinearAlloc);
     if (useDefaultRuntimeLibrary) {
@@ -203,7 +213,6 @@
         builder.addLibraryFiles(TestBase.runtimeJar(backend));
       }
     }
-    List<String> mainDexClasses = null;
     assertNull(oldStdout);
     oldStdout = System.out;
     assertNull(oldStderr);
@@ -321,6 +330,7 @@
   }
 
   public T setMinApi(int minApiLevel) {
+    assert minApiLevel != -1;
     this.minApiLevel = minApiLevel;
     return self();
   }
diff --git a/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java b/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
index beb7da4..acd96aa 100644
--- a/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
@@ -58,10 +58,12 @@
 
   @Override
   public T setMinApi(AndroidApiLevel minApiLevel) {
-    if (backend == Backend.DEX) {
-      return super.setMinApi(minApiLevel.getLevel());
-    }
-    return self();
+    return backend == Backend.DEX ? super.setMinApi(minApiLevel.getLevel()) : self();
+  }
+
+  @Override
+  protected int getMinApiLevel() {
+    return backend == Backend.DEX ? super.getMinApiLevel() : -1;
   }
 
   public T treeShaking(boolean enable) {
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationProguardCompatTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationProguardCompatTest.java
index 11bf740..1307d62 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationProguardCompatTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationProguardCompatTest.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.FieldSubject;
@@ -46,6 +47,7 @@
             "  private int field;",
             "}")
         .allowAccessModification()
+        .setMinApi(AndroidApiLevel.B)
         .compile()
         .inspect(inspector -> inspect(inspector, true));
   }
diff --git a/src/test/java/com/android/tools/r8/debug/LoadInvokeLoadOptimizationTestRunner.java b/src/test/java/com/android/tools/r8/debug/LoadInvokeLoadOptimizationTestRunner.java
index 18ae157..9242d61 100644
--- a/src/test/java/com/android/tools/r8/debug/LoadInvokeLoadOptimizationTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/LoadInvokeLoadOptimizationTestRunner.java
@@ -5,6 +5,7 @@
 
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.debug.DebugTestBase.JUnit3Wrapper.FrameInspector;
+import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.DescriptorUtils;
 import java.util.List;
 import org.apache.harmony.jpda.tests.framework.jdwp.Value;
@@ -20,6 +21,7 @@
   static final String NAME = CLASS.getCanonicalName();
   static final String DESC = DescriptorUtils.javaTypeToDescriptor(NAME);
   static final String FILE = CLASS.getSimpleName() + ".java";
+  static final AndroidApiLevel minApi = AndroidApiLevel.B;
 
   private final String name;
   private final DebugTestConfig config;
@@ -29,7 +31,9 @@
     DebugTestParameters parameters =
         parameters()
             .add("CF", temp -> testForJvm(temp).addTestClasspath().debugConfig())
-            .add("D8", temp -> testForD8(temp).addProgramClasses(CLASS).debugConfig());
+            .add(
+                "D8",
+                temp -> testForD8(temp).setMinApi(minApi).addProgramClasses(CLASS).debugConfig());
     for (Backend backend : ToolHelper.getBackends()) {
       parameters.add(
           "R8/" + backend,
@@ -39,6 +43,7 @@
                   .noMinification()
                   .addKeepRules("-keepattributes SourceFile,LineNumberTable")
                   .addProgramClasses(CLASS)
+                  .setMinApi(minApi)
                   .debug()
                   .debugConfig());
     }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/SimplifyIfNotNullTest.java b/src/test/java/com/android/tools/r8/ir/optimize/SimplifyIfNotNullTest.java
index da19669..868a400 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/SimplifyIfNotNullTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/SimplifyIfNotNullTest.java
@@ -7,6 +7,8 @@
 
 import com.android.tools.r8.R8FullTestBuilder;
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ThrowableConsumer;
 import com.android.tools.r8.ir.optimize.nonnull.FieldAccessTest;
 import com.android.tools.r8.ir.optimize.nonnull.NonNullAfterArrayAccess;
@@ -20,9 +22,21 @@
 import com.google.common.collect.Streams;
 import java.util.List;
 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 SimplifyIfNotNullTest extends TestBase {
 
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
+  }
+
+  @Parameter public TestParameters parameters;
+
   private void verifyAbsenceOfIf(
       CodeInspector codeInspector, Class<?> testClass, List<MethodSignature> signatures) {
     for (MethodSignature signature : signatures) {
@@ -43,11 +57,14 @@
       ThrowableConsumer<R8FullTestBuilder> configuration)
       throws Exception {
     CodeInspector codeInspector =
-        testForR8(Backend.DEX)
+        testForR8(parameters.getBackend())
+            .setMinApi(parameters.getApiLevel())
             .addProgramClasses(testClass)
             .addKeepRules("-keep class " + testClass.getCanonicalName() + " { *; }")
             .apply(configuration)
             .compile()
+            .run(parameters.getRuntime(), testClass)
+            .assertSuccessWithOutput("")
             .inspector();
     verifyAbsenceOfIf(codeInspector, testClass, signatures);
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsDoubleTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsDoubleTest.java
index 282371b..4d4654d 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsDoubleTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsDoubleTest.java
@@ -9,23 +9,17 @@
 import com.android.tools.r8.KeepConstantArguments;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.R8FullTestBuilder;
+import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
-import java.util.Collection;
 import org.junit.Assert;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
 public class UnusedArgumentsDoubleTest extends UnusedArgumentsTestBase {
 
-  public UnusedArgumentsDoubleTest(boolean minification) {
-    super(minification);
-  }
-
-  @Parameters(name = "minification:{0}")
-  public static Collection<Object[]> data() {
-    return UnusedArgumentsTestBase.data();
+  public UnusedArgumentsDoubleTest(TestParameters parameters, boolean minification) {
+    super(parameters, minification);
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsIntTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsIntTest.java
index 80309b2..c1a0a21 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsIntTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsIntTest.java
@@ -9,26 +9,20 @@
 import com.android.tools.r8.KeepConstantArguments;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.R8FullTestBuilder;
+import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.google.common.collect.ImmutableSet;
-import java.util.Collection;
 import java.util.Set;
 import org.junit.Assert;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
 public class UnusedArgumentsIntTest extends UnusedArgumentsTestBase {
   private static final Set<String> methodsThatWontBeOptimized = ImmutableSet.of("main", "iinc");
 
-  public UnusedArgumentsIntTest(boolean minification) {
-    super(minification);
-  }
-
-  @Parameters(name = "minification:{0}")
-  public static Collection<Object[]> data() {
-    return UnusedArgumentsTestBase.data();
+  public UnusedArgumentsIntTest(TestParameters parameters, boolean minification) {
+    super(parameters, minification);
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsLongTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsLongTest.java
index 0dba75b..8723f36 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsLongTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsLongTest.java
@@ -9,23 +9,17 @@
 import com.android.tools.r8.KeepConstantArguments;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.R8FullTestBuilder;
+import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
-import java.util.Collection;
 import org.junit.Assert;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
 public class UnusedArgumentsLongTest extends UnusedArgumentsTestBase {
 
-  public UnusedArgumentsLongTest(boolean minification) {
-    super(minification);
-  }
-
-  @Parameters(name = "minification:{0}")
-  public static Collection<Object[]> data() {
-    return UnusedArgumentsTestBase.data();
+  public UnusedArgumentsLongTest(TestParameters parameters, boolean minification) {
+    super(parameters, minification);
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsMixedTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsMixedTest.java
index dd63e78..78a0882 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsMixedTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsMixedTest.java
@@ -9,23 +9,17 @@
 import com.android.tools.r8.KeepConstantArguments;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.R8FullTestBuilder;
+import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
-import java.util.Collection;
 import org.junit.Assert;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
 public class UnusedArgumentsMixedTest extends UnusedArgumentsTestBase {
 
-  public UnusedArgumentsMixedTest(boolean minification) {
-    super(minification);
-  }
-
-  @Parameters(name = "minification:{0}")
-  public static Collection<Object[]> data() {
-    return UnusedArgumentsTestBase.data();
+  public UnusedArgumentsMixedTest(TestParameters parameters, boolean minification) {
+    super(parameters, minification);
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsMixedWidthTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsMixedWidthTest.java
index 7ed9021..175d3ba 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsMixedWidthTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsMixedWidthTest.java
@@ -9,23 +9,17 @@
 import com.android.tools.r8.KeepConstantArguments;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.R8FullTestBuilder;
+import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
-import java.util.Collection;
 import org.junit.Assert;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
 public class UnusedArgumentsMixedWidthTest extends UnusedArgumentsTestBase {
 
-  public UnusedArgumentsMixedWidthTest(boolean minification) {
-    super(minification);
-  }
-
-  @Parameters(name = "minification:{0}")
-  public static Collection<Object[]> data() {
-    return UnusedArgumentsTestBase.data();
+  public UnusedArgumentsMixedWidthTest(TestParameters parameters, boolean minification) {
+    super(parameters, minification);
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsObjectTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsObjectTest.java
index 3a4eeda..c06823f 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsObjectTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsObjectTest.java
@@ -9,24 +9,19 @@
 import com.android.tools.r8.NeverClassInline;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.R8FullTestBuilder;
+import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import org.junit.Assert;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
 public class UnusedArgumentsObjectTest extends UnusedArgumentsTestBase {
 
-  public UnusedArgumentsObjectTest(boolean minification) {
-    super(minification);
-  }
-
-  @Parameters(name = "minification:{0}")
-  public static Collection<Object[]> data() {
-    return UnusedArgumentsTestBase.data();
+  public UnusedArgumentsObjectTest(TestParameters parameters, boolean minification) {
+    super(parameters, minification);
   }
 
   @NeverClassInline
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsTestBase.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsTestBase.java
index 946cc63..d88a978 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsTestBase.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsTestBase.java
@@ -6,27 +6,38 @@
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assume.assumeFalse;
 
 import com.android.tools.r8.R8FullTestBuilder;
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersBuilder;
+import com.android.tools.r8.utils.BooleanUtils;
 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 org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
+@RunWith(Parameterized.class)
 public abstract class UnusedArgumentsTestBase extends TestBase {
 
+  private final TestParameters parameters;
   private final boolean minification;
 
-  public UnusedArgumentsTestBase(boolean minification) {
+  public UnusedArgumentsTestBase(TestParameters parameters, boolean minification) {
+    this.parameters = parameters;
     this.minification = minification;
   }
 
-  @Parameters(name = "minification:{0}")
+  @Parameters(name = "{0}, minification:{1}")
   public static Collection<Object[]> data() {
-    return ImmutableList.of(new Object[] {true}, new Object[] {false});
+    return buildParameters(
+        TestParametersBuilder.builder().withAllRuntimesAndApiLevels().build(),
+        BooleanUtils.values());
   }
 
   public void configure(R8FullTestBuilder builder) {
@@ -50,21 +61,26 @@
   }
 
   @Test
-  public void test() throws Throwable {
-    testForJvm()
-        .addTestClasspath()
-        .run(getTestClass())
+  public void testReference() throws Exception {
+    assumeFalse(minification);
+    testForRuntime(parameters)
+        .addProgramClasses(getTestClass())
+        .addProgramClasses(getAdditionalClasses())
+        .run(parameters.getRuntime(), getTestClass())
         .assertSuccessWithOutput(getExpectedResult());
+  }
 
-    testForR8(Backend.DEX)
+  @Test
+  public void testR8() throws Throwable {
+    testForR8(parameters.getBackend())
+        .setMinApi(parameters.getApiLevel())
         .addProgramClasses(getTestClass())
         .addProgramClasses(getAdditionalClasses())
         .addKeepMainRule(getTestClass())
         .minification(minification)
         .addOptionsModification(options -> options.enableSideEffectAnalysis = false)
         .apply(this::configure)
-        .compile()
-        .run(getTestClass())
+        .run(parameters.getRuntime(), getTestClass())
         .inspect(this::inspect)
         .assertSuccessWithOutput(getExpectedResult());
   }
diff --git a/src/test/java/com/android/tools/r8/proguard/configuration/ProguardRuleWithEllipsisForReturnTypeTest.java b/src/test/java/com/android/tools/r8/proguard/configuration/ProguardRuleWithEllipsisForReturnTypeTest.java
index 33b7f00..17b13cf 100644
--- a/src/test/java/com/android/tools/r8/proguard/configuration/ProguardRuleWithEllipsisForReturnTypeTest.java
+++ b/src/test/java/com/android/tools/r8/proguard/configuration/ProguardRuleWithEllipsisForReturnTypeTest.java
@@ -6,34 +6,50 @@
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assume.assumeTrue;
 
 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 com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 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 ProguardRuleWithEllipsisForReturnTypeTest extends TestBase {
 
   private static final Class<?> clazz = ProguardRuleWithEllipsisForReturnTypeTestClass.class;
   private static final String expectedOutput = StringUtils.lines("Hello world!");
+  
+  @Parameter public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
+  }
 
   @Test
   public void testR8() throws Exception {
-    testForR8(Backend.DEX)
+    testForR8(parameters.getBackend())
         .addProgramClasses(clazz)
         .addKeepRules(
             "-keep class " + clazz.getTypeName() + " {",
             "  private static ... unused;",
             "  public static ... main(...);",
             "}")
-        .run(clazz)
+        .run(parameters.getRuntime(), clazz)
         .assertSuccessWithOutput(expectedOutput)
         .inspect(this::inspect);
   }
 
   @Test
   public void testProguard() throws Exception {
+    assumeTrue(parameters.isCfRuntime());
     testForProguard()
         .addProgramClasses(clazz)
         .addKeepRules(
@@ -41,7 +57,7 @@
             "  private static ... unused;",
             "  public static ... main(...);",
             "}")
-        .run(clazz)
+        .run(parameters.getRuntime(), clazz)
         .assertSuccessWithOutput(expectedOutput)
         .inspect(this::inspect);
   }
diff --git a/src/test/java/com/android/tools/r8/proguard/configuration/UnusedKeepRuleTest.java b/src/test/java/com/android/tools/r8/proguard/configuration/UnusedKeepRuleTest.java
index a391a21..e258520 100644
--- a/src/test/java/com/android/tools/r8/proguard/configuration/UnusedKeepRuleTest.java
+++ b/src/test/java/com/android/tools/r8/proguard/configuration/UnusedKeepRuleTest.java
@@ -5,15 +5,32 @@
 package com.android.tools.r8.proguard.configuration;
 
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.AndroidApiLevel;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
 
+@RunWith(Parameterized.class)
 public class UnusedKeepRuleTest extends TestBase {
 
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withNoneRuntime().build();
+  }
+
+  public UnusedKeepRuleTest(TestParameters parameters) {
+    parameters.assertNoneRuntime();
+  }
+
   @Test
   public void test() throws Exception {
     testForR8(Backend.DEX)
         .addKeepRules("-keep class NotPresent")
         .allowUnusedProguardConfigurationRules()
+        .setMinApi(AndroidApiLevel.B)
         .compile()
         .assertInfosCount(1);
   }
diff --git a/src/test/java/com/android/tools/r8/proguard/printmapping/PrintMappingTest.java b/src/test/java/com/android/tools/r8/proguard/printmapping/PrintMappingTest.java
index 378cf0e..689904c 100644
--- a/src/test/java/com/android/tools/r8/proguard/printmapping/PrintMappingTest.java
+++ b/src/test/java/com/android/tools/r8/proguard/printmapping/PrintMappingTest.java
@@ -7,11 +7,27 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.AndroidApiLevel;
 import java.nio.file.Path;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
 
+@RunWith(Parameterized.class)
 public class PrintMappingTest extends TestBase {
 
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withNoneRuntime().build();
+  }
+
+  public PrintMappingTest(TestParameters parameters) {
+    parameters.assertNoneRuntime();
+  }
+
   @Test
   public void testWithExistingDirectory() throws Exception {
     Path mapping = temp.getRoot().toPath().resolve("existing/directory/mapping.txt");
@@ -29,6 +45,7 @@
         .addInnerClasses(PrintMappingTest.class)
         .addKeepRules("-keep,allowobfuscation class " + TestClass.class.getTypeName())
         .addKeepRules("-printmapping " + mapping)
+        .setMinApi(AndroidApiLevel.B)
         .compile();
     assertTrue(mapping.toFile().exists());
   }
diff --git a/src/test/java/com/android/tools/r8/resolution/PublicFieldInnerClassTest.java b/src/test/java/com/android/tools/r8/resolution/PublicFieldInnerClassTest.java
index 5e93601..4fb3d8b 100644
--- a/src/test/java/com/android/tools/r8/resolution/PublicFieldInnerClassTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/PublicFieldInnerClassTest.java
@@ -5,7 +5,9 @@
 
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.TestBase;
-import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersBuilder;
+import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.utils.StringUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -69,24 +71,25 @@
   private static final Class CLASS = PublicFieldInnerClassTestMain.class;
   private static final String EXPECTED_OUTPUT = StringUtils.lines("0", "0", "0", "0");
 
-  private final Backend backend;
+  private final TestParameters parameters;
 
   @Parameterized.Parameters(name = "Backend: {0}")
-  public static Object[] data() {
-    return ToolHelper.getBackends();
+  public static TestParametersCollection data() {
+    return TestParametersBuilder.builder().withAllRuntimesAndApiLevels().build();
   }
 
-  public PublicFieldInnerClassTest(Backend backend) {
-    this.backend = backend;
+  public PublicFieldInnerClassTest(TestParameters parameters) {
+    this.parameters = parameters;
   }
 
   @Test
   public void test() throws Exception {
-    testForR8(backend)
+    testForR8(parameters.getBackend())
         .setMode(CompilationMode.DEBUG)
         .addProgramClassesAndInnerClasses(CLASS)
         .addKeepMainRule(CLASS)
-        .run(CLASS)
+        .setMinApi(parameters.getApiLevel())
+        .run(parameters.getRuntime(), CLASS)
         .assertSuccessWithOutput(EXPECTED_OUTPUT);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/resolution/b123730538/B123730538.java b/src/test/java/com/android/tools/r8/resolution/b123730538/B123730538.java
index 4cb3b17..c61d7fa 100644
--- a/src/test/java/com/android/tools/r8/resolution/b123730538/B123730538.java
+++ b/src/test/java/com/android/tools/r8/resolution/b123730538/B123730538.java
@@ -7,8 +7,12 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assume.assumeTrue;
 
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersBuilder;
+import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.resolution.b123730538.runner.PublicClassExtender;
 import com.android.tools.r8.resolution.b123730538.runner.Runner;
@@ -32,15 +36,15 @@
   private static List<Path> CLASSES;
   private static final String EXPECTED_OUTPUT = StringUtils.lines("pkg.AbstractClass::foo");
 
-  private final Backend backend;
+  private final TestParameters parameters;
 
   @Parameterized.Parameters(name = "Backend: {0}")
-  public static Object[] data() {
-    return ToolHelper.getBackends();
+  public static TestParametersCollection data() {
+    return TestParametersBuilder.builder().withAllRuntimesAndApiLevels().build();
   }
 
-  public B123730538(Backend backend) {
-    this.backend = backend;
+  public B123730538(TestParameters parameters) {
+    this.parameters = parameters;
   }
 
   @BeforeClass
@@ -53,24 +57,26 @@
 
   @Test
   public void testProguard() throws Exception {
+    assumeTrue(parameters.isCfRuntime());
     Path inJar = temp.newFile("input.jar").toPath().toAbsolutePath();
     writeClassFilesToJar(inJar, CLASSES);
     testForProguard()
         .addProgramFiles(inJar)
         .addKeepMainRule(MAIN)
         .addKeepRules("-dontoptimize")
-        .run(MAIN)
+        .run(parameters.getRuntime(), MAIN)
         .assertSuccessWithOutput(EXPECTED_OUTPUT)
         .inspect(this::inspect);
   }
 
   @Test
   public void testR8() throws Exception {
-    testForR8(backend)
+    testForR8(parameters.getBackend())
         .addProgramFiles(CLASSES)
         .addKeepMainRule(MAIN)
         .addKeepRules("-dontoptimize")
-        .run(MAIN)
+        .setMinApi(parameters.getApiLevel())
+        .run(parameters.getRuntime(), MAIN)
         .assertSuccessWithOutput(EXPECTED_OUTPUT)
         .inspect(this::inspect);
   }
diff --git a/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java b/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java
index 7452a5a..adeb90f 100644
--- a/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java
@@ -166,6 +166,7 @@
 @RunWith(Parameterized.class)
 public class RemoveAssertionsTest extends TestBase {
 
+  private static final AndroidApiLevel minApi = AndroidApiLevel.B;
   private final TestParameters parameters;
 
   @Parameterized.Parameters(name = "{0}")
@@ -190,6 +191,7 @@
         .addOptionsModification(o -> o.inlinerOptions().enableInlining = false)
         .allowAccessModification()
         .noMinification()
+        .setMinApi(minApi)
         .compile();
   }
 
@@ -225,6 +227,7 @@
         .debug()
         .noTreeShaking()
         .noMinification()
+        .setMinApi(minApi)
         .compile();
   }
 
@@ -337,7 +340,7 @@
     return testForD8()
         .addProgramClasses(ClassWithAssertions.class)
         .debug()
-        .setMinApi(AndroidApiLevel.B)
+        .setMinApi(minApi)
         .addAssertionsConfiguration(
             builder -> builder.setTransformation(transformation).setScopeAll().build())
         .compile();
@@ -349,7 +352,7 @@
         testForR8(Backend.CF)
             .addProgramClasses(ClassWithAssertions.class)
             .debug()
-            .setMinApi(AndroidApiLevel.B)
+            .setMinApi(minApi)
             .noTreeShaking()
             .noMinification()
             .compile()
@@ -358,7 +361,7 @@
     return testForD8()
         .addProgramFiles(program)
         .debug()
-        .setMinApi(AndroidApiLevel.B)
+        .setMinApi(minApi)
         .addAssertionsConfiguration(
             builder -> builder.setTransformation(transformation).setScopeAll().build())
         .compile();
@@ -379,7 +382,7 @@
             rewriter.apply(ToolHelper.getClassAsBytes(ClassWithAssertions.class)),
             rewriter.apply(ToolHelper.getClassAsBytes(ChromuimAssertionHookMock.class)))
         .debug()
-        .setMinApi(AndroidApiLevel.B)
+        .setMinApi(minApi)
         .compile();
   }
 
diff --git a/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java b/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
index dddb176..cfffbac 100644
--- a/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
@@ -10,6 +10,7 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersBuilder;
 import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.utils.AndroidApiLevel;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Paths;
 import java.util.List;
@@ -45,6 +46,7 @@
     testForR8(backend)
         .addProgramFiles(Paths.get(ToolHelper.EXAMPLES_BUILD_DIR).resolve(JAR_FILE))
         .addKeepRules(PG_CONFIG)
+        .setMinApi(AndroidApiLevel.B)
         .compile()
         .inspect(
             inspector -> {
diff --git a/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesMissingReferencesInDexTest.java b/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesMissingReferencesInDexTest.java
index b1e75c2..356bfab 100644
--- a/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesMissingReferencesInDexTest.java
+++ b/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesMissingReferencesInDexTest.java
@@ -31,6 +31,8 @@
     return getTestParameters().withNoneRuntime().build();
   }
 
+  private static final AndroidApiLevel minApi = AndroidApiLevel.B;
+
   public TraceReferencesMissingReferencesInDexTest(TestParameters parameters) {
     parameters.assertNoneRuntime();
   }
@@ -91,7 +93,11 @@
   @Test
   public void missingClassReferencedInDexArchive() throws Throwable {
     missingClassReferenced(
-        testForD8(Backend.DEX).addProgramClasses(Source.class).compile().writeToZip());
+        testForD8(Backend.DEX)
+            .addProgramClasses(Source.class)
+            .setMinApi(minApi)
+            .compile()
+            .writeToZip());
   }
 
   @Test
@@ -99,6 +105,7 @@
     missingClassReferenced(
         testForD8(Backend.DEX)
             .addProgramClasses(Source.class)
+            .setMinApi(minApi)
             .compile()
             .writeToDirectory()
             .resolve("classes.dex"));
@@ -131,6 +138,7 @@
         testForD8(Backend.DEX)
             .addProgramClasses(Source.class)
             .addProgramClassFileData(getClassWithTargetRemoved())
+            .setMinApi(minApi)
             .compile()
             .writeToZip());
   }
@@ -141,6 +149,7 @@
         testForD8(Backend.DEX)
             .addProgramClasses(Source.class)
             .addProgramClassFileData(getClassWithTargetRemoved())
+            .setMinApi(minApi)
             .compile()
             .writeToDirectory()
             .resolve("classes.dex"));