Parameterize analysis tests.

Change-Id: I010e7b2983edaaad4a3164578bbabed833d56be1
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/AnalysisTestBase.java b/src/test/java/com/android/tools/r8/ir/analysis/AnalysisTestBase.java
index b2acadc..3af6b17 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/AnalysisTestBase.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/AnalysisTestBase.java
@@ -7,6 +7,7 @@
 import static org.junit.Assert.fail;
 
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.dex.ApplicationReader;
 import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.AppView;
@@ -23,23 +24,39 @@
 
 public abstract class AnalysisTestBase extends TestBase {
 
+  protected final TestParameters parameters;
   private final AndroidApp app;
   private final String className;
   private final InternalOptions options = new InternalOptions();
 
   public AppView<?> appView;
 
-  public AnalysisTestBase(Class<?> clazz) throws Exception {
-    this.app = testForD8().release().addProgramClasses(clazz).compile().app;
+  public AnalysisTestBase(TestParameters parameters, Class<?> clazz) throws Exception {
+    this.parameters = parameters;
+    this.app =
+        testForD8()
+            .release()
+            .setMinApi(parameters.getRuntime())
+            .addProgramClasses(clazz)
+            .compile()
+            .app;
     this.className = clazz.getTypeName();
   }
 
-  public AnalysisTestBase(String mainClassName, Class<?>... classes) throws Exception {
-    this.app = testForD8().addProgramClasses(classes).compile().app;
+  public AnalysisTestBase(
+      TestParameters parameters, String mainClassName, Class<?>... classes) throws Exception {
+    this.parameters = parameters;
+    this.app =
+        testForD8()
+            .addProgramClasses(classes)
+            .setMinApi(parameters.getRuntime())
+            .compile()
+            .app;
     this.className = mainClassName;
   }
 
-  public AnalysisTestBase(AndroidApp app, String className) {
+  public AnalysisTestBase(TestParameters parameters, AndroidApp app, String className) {
+    this.parameters = parameters;
     this.app = app;
     this.className = className;
   }
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/DeterminismAnalysisTest.java b/src/test/java/com/android/tools/r8/ir/analysis/DeterminismAnalysisTest.java
index 1ea789d..5bd8472 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/DeterminismAnalysisTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/DeterminismAnalysisTest.java
@@ -5,14 +5,24 @@
 
 import static org.junit.Assert.assertEquals;
 
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ir.code.IRCode;
 import java.util.function.Consumer;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 
+@RunWith(Parameterized.class)
 public class DeterminismAnalysisTest extends AnalysisTestBase {
 
-  public DeterminismAnalysisTest() throws Exception {
-    super(TestClass.class.getTypeName(), TestClass.class);
+  @Parameterized.Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimes().build();
+  }
+
+  public DeterminismAnalysisTest(TestParameters parameters) throws Exception {
+    super(parameters, TestClass.class.getTypeName(), TestClass.class);
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/escape/EscapeAnalysisForNameReflectionTest.java b/src/test/java/com/android/tools/r8/ir/analysis/escape/EscapeAnalysisForNameReflectionTest.java
index de19967..1f10390 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/escape/EscapeAnalysisForNameReflectionTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/escape/EscapeAnalysisForNameReflectionTest.java
@@ -8,6 +8,8 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.ir.analysis.AnalysisTestBase;
@@ -24,11 +26,21 @@
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 
+@RunWith(Parameterized.class)
 public class EscapeAnalysisForNameReflectionTest extends AnalysisTestBase {
 
-  public EscapeAnalysisForNameReflectionTest() throws Exception {
-    super(TestClass.class.getTypeName(), TestClass.class, Helper.class, NamingInterface.class);
+  @Parameterized.Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimes().build();
+  }
+
+  public EscapeAnalysisForNameReflectionTest(TestParameters parameters) throws Exception {
+    super(
+        parameters,
+        TestClass.class.getTypeName(), TestClass.class, Helper.class, NamingInterface.class);
   }
 
   private static Predicate<Instruction> invokesMethodWithName(String name) {
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/ArrayTypeTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/ArrayTypeTest.java
index 2d50834..e5e0a86 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/ArrayTypeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/ArrayTypeTest.java
@@ -9,6 +9,8 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ir.analysis.AnalysisTestBase;
 import com.android.tools.r8.ir.code.ArrayGet;
 import com.android.tools.r8.ir.code.ArrayPut;
@@ -20,11 +22,19 @@
 import com.android.tools.r8.ir.code.Value;
 import java.util.function.Consumer;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 
+@RunWith(Parameterized.class)
 public class ArrayTypeTest extends AnalysisTestBase {
 
-  public ArrayTypeTest() throws Exception {
-    super(TestClass.class);
+  @Parameterized.Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimes().build();
+  }
+
+  public ArrayTypeTest(TestParameters parameters) throws Exception {
+    super(parameters, TestClass.class);
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/ConstrainedPrimitiveTypeTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/ConstrainedPrimitiveTypeTest.java
index 06ea239..fd6ada0 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/ConstrainedPrimitiveTypeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/ConstrainedPrimitiveTypeTest.java
@@ -11,6 +11,8 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ir.analysis.AnalysisTestBase;
 import com.android.tools.r8.ir.code.ConstNumber;
 import com.android.tools.r8.ir.code.IRCode;
@@ -19,11 +21,19 @@
 import com.google.common.collect.Streams;
 import java.util.function.Consumer;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 
+@RunWith(Parameterized.class)
 public class ConstrainedPrimitiveTypeTest extends AnalysisTestBase {
 
-  public ConstrainedPrimitiveTypeTest() throws Exception {
-    super(TestClass.class);
+  @Parameterized.Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimes().build();
+  }
+
+  public ConstrainedPrimitiveTypeTest(TestParameters parameters) throws Exception {
+    super(parameters, TestClass.class);
   }
 
   @Test
@@ -33,11 +43,11 @@
 
     testForJvm().addTestClasspath().run(TestClass.class).assertSuccessWithOutput(expectedOutput);
 
-    testForR8(Backend.DEX)
+    testForR8(parameters.getBackend())
         .addInnerClasses(ConstrainedPrimitiveTypeTest.class)
         .addKeepMainRule(TestClass.class)
         .enableInliningAnnotations()
-        .run(TestClass.class)
+        .run(parameters.getRuntime(), TestClass.class)
         .assertSuccessWithOutput(expectedOutput);
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeConstraintOnTrivialPhiTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeConstraintOnTrivialPhiTest.java
index 7c69cc4..ad428dd 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeConstraintOnTrivialPhiTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeConstraintOnTrivialPhiTest.java
@@ -10,6 +10,8 @@
 import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.LONG;
 import static org.junit.Assert.assertEquals;
 
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.ir.analysis.AnalysisTestBase;
 import com.android.tools.r8.ir.code.ConstNumber;
@@ -21,7 +23,10 @@
 import com.google.common.collect.ImmutableList;
 import java.util.function.Consumer;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 
+@RunWith(Parameterized.class)
 public class TypeConstraintOnTrivialPhiTest extends AnalysisTestBase {
 
   private enum Config {
@@ -61,8 +66,13 @@
     }
   }
 
-  public TypeConstraintOnTrivialPhiTest() throws Exception {
-    super(buildApp(), "TestClass");
+  @Parameterized.Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimes().build();
+  }
+
+  public TypeConstraintOnTrivialPhiTest(TestParameters parameters) throws Exception {
+    super(parameters, buildApp(), "TestClass");
   }
 
   public static AndroidApp buildApp() throws Exception {
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/UnconstrainedPrimitiveTypeTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/UnconstrainedPrimitiveTypeTest.java
index ffa586b..09c27ea 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/UnconstrainedPrimitiveTypeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/UnconstrainedPrimitiveTypeTest.java
@@ -8,6 +8,8 @@
 import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.LONG;
 import static org.junit.Assert.assertEquals;
 
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ir.analysis.AnalysisTestBase;
 import com.android.tools.r8.ir.code.ConstNumber;
 import com.android.tools.r8.ir.code.IRCode;
@@ -19,11 +21,19 @@
 import com.google.common.collect.Streams;
 import java.util.function.Consumer;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 
+@RunWith(Parameterized.class)
 public class UnconstrainedPrimitiveTypeTest extends AnalysisTestBase {
 
-  public UnconstrainedPrimitiveTypeTest() throws Exception {
-    super(buildApp(), "TestClass");
+  @Parameterized.Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimes().build();
+  }
+
+  public UnconstrainedPrimitiveTypeTest(TestParameters parameters) throws Exception {
+    super(parameters, buildApp(), "TestClass");
   }
 
   private static AndroidApp buildApp() throws Exception {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderOptimizerAnalysisTest.java b/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderOptimizerAnalysisTest.java
index d562e53..7cd2190 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderOptimizerAnalysisTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderOptimizerAnalysisTest.java
@@ -5,6 +5,8 @@
 
 import static org.junit.Assert.assertEquals;
 
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.analysis.AnalysisTestBase;
@@ -15,11 +17,22 @@
 import java.util.function.Consumer;
 import org.junit.Ignore;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 
+@RunWith(Parameterized.class)
 public class StringBuilderOptimizerAnalysisTest extends AnalysisTestBase {
 
-  public StringBuilderOptimizerAnalysisTest() throws Exception {
-    super(StringConcatenationTestClass.class.getTypeName(), StringConcatenationTestClass.class);
+  @Parameterized.Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimes().build();
+  }
+
+  public StringBuilderOptimizerAnalysisTest(TestParameters parameters) throws Exception {
+    super(
+        parameters,
+        StringConcatenationTestClass.class.getTypeName(),
+        StringConcatenationTestClass.class);
   }
 
   @Test
@@ -67,7 +80,7 @@
     }));
   }
 
-  // TODO(b/114002137): Parameterize tests and make sure analysis result is same at all VMs.
+  // TODO(b/114002137): Make sure analysis result / tests don't depend on VMs.
   @Ignore("b/114002137")
   @Test
   public void testPhiAtInit() throws Exception {