Test that the setup of the default test parameters.

This should help avoid an error in the building of test parameters that could
cause tests to silently stop running.

Change-Id: I698970dbc101c4e8aeaf5350fad16f4b1738d71c
diff --git a/src/test/java/com/android/tools/r8/TestParameters.java b/src/test/java/com/android/tools/r8/TestParameters.java
index d73f975..fc9c8db 100644
--- a/src/test/java/com/android/tools/r8/TestParameters.java
+++ b/src/test/java/com/android/tools/r8/TestParameters.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8;
 
 import com.android.tools.r8.TestBase.Backend;
+import com.android.tools.r8.TestRuntime.NoneRuntime;
 import com.android.tools.r8.utils.AndroidApiLevel;
 
 // Actual test parameters for a specific configuration. Currently just the runtime configuration.
@@ -31,6 +32,10 @@
     return runtime.isCf();
   }
 
+  public boolean isNoneRuntime() {
+    return runtime == NoneRuntime.getInstance();
+  }
+
   public AndroidApiLevel getApiLevel() {
     if (runtime.isDex() && apiLevel == null) {
       throw new RuntimeException(
diff --git a/src/test/java/com/android/tools/r8/TestParametersBuilder.java b/src/test/java/com/android/tools/r8/TestParametersBuilder.java
index 8d784e7..f2504f2 100644
--- a/src/test/java/com/android/tools/r8/TestParametersBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestParametersBuilder.java
@@ -235,12 +235,19 @@
     return isSystemJdk(vm) || TestRuntime.isCheckedInJDK(vm);
   }
 
+  public static boolean isRuntimesPropertySet() {
+    return getRuntimesProperty() != null;
+  }
+
+  private static String getRuntimesProperty() {
+    return System.getProperty("runtimes");
+  }
+
   private static Stream<TestRuntime> getAvailableRuntimes() {
-    String runtimesProperty = System.getProperty("runtimes");
     Stream<TestRuntime> runtimes;
-    if (runtimesProperty != null) {
+    if (isRuntimesPropertySet()) {
       runtimes =
-          Arrays.stream(runtimesProperty.split(":"))
+          Arrays.stream(getRuntimesProperty().split(":"))
               .filter(s -> !s.isEmpty())
               .map(
                   name -> {
diff --git a/src/test/java/com/android/tools/r8/utils/TestParametersTest.java b/src/test/java/com/android/tools/r8/utils/TestParametersTest.java
new file mode 100644
index 0000000..2d26e5d
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/TestParametersTest.java
@@ -0,0 +1,74 @@
+// Copyright (c) 2019, 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.utils;
+
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeFalse;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersBuilder;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.TestRuntime.DexRuntime;
+import java.util.HashSet;
+import java.util.IdentityHashMap;
+import java.util.Map;
+import java.util.Set;
+import org.junit.Test;
+
+// This test is should explicitly not be parameterized and using the test parameters as it is
+// testing the correctness of the test-parameters set up.
+public class TestParametersTest {
+
+  @Test
+  public void testNoneRuntime() {
+    assumeFalse(
+        "Test is only valid when no runtimes property is set",
+        TestParametersBuilder.isRuntimesPropertySet());
+    TestParametersCollection params = TestParametersBuilder.builder().withNoneRuntime().build();
+    assertTrue(params.stream().anyMatch(TestParameters::isNoneRuntime));
+  }
+
+  @Test
+  public void testAllRuntimes() {
+    assumeFalse(
+        "Test is only valid when no runtimes property is set",
+        TestParametersBuilder.isRuntimesPropertySet());
+    TestParametersCollection params = TestParametersBuilder.builder().withAllRuntimes().build();
+    assertTrue(params.stream().noneMatch(TestParameters::isNoneRuntime));
+    assertTrue(params.stream().anyMatch(TestParameters::isDexRuntime));
+    assertTrue(params.stream().anyMatch(TestParameters::isCfRuntime));
+  }
+
+  @Test
+  public void testAllApiLevels() {
+    assumeFalse(
+        "Test is only valid when no runtimes property is set",
+        TestParametersBuilder.isRuntimesPropertySet());
+    // This test may also fail once the tests can be configured for with API levels to run.
+    TestParametersCollection params =
+        TestParametersBuilder.builder().withAllRuntimesAndApiLevels().build();
+    assertTrue(params.stream().noneMatch(TestParameters::isNoneRuntime));
+    assertTrue(params.stream().anyMatch(p -> p.isCfRuntime() && p.getApiLevel() == null));
+    // Default API levels are min and max for each DEX VM.
+    Map<DexRuntime, Set<AndroidApiLevel>> levels = new IdentityHashMap<>();
+    params.stream()
+        .forEach(
+            p -> {
+              if (p.isDexRuntime()) {
+                levels
+                    .computeIfAbsent(p.getRuntime().asDex(), key -> new HashSet<>())
+                    .add(p.getApiLevel());
+              }
+            });
+    assertFalse(levels.isEmpty());
+    levels.forEach(
+        (dexRuntime, apiLevels) -> {
+          assertThat(apiLevels, hasItem(AndroidApiLevel.getDefault()));
+          assertThat(apiLevels, hasItem(dexRuntime.getMinApiLevel()));
+        });
+  }
+}