Internalize remaining kotlin tests and remove the build targets

Bug: 174292935
Change-Id: I6da556ec5f54944ec91d48bae8017d10c30ad560
diff --git a/build.gradle b/build.gradle
index 1077080..433b39a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -43,6 +43,8 @@
     gsonVersion = '2.7'
     junitVersion = '4.13-beta-2'
     mockitoVersion = '2.10.0'
+    // The kotlin version is only here to specify the kotlin language level,
+    // all kotlin compilations are done in tests.
     kotlinVersion = '1.3.72'
     kotlinExtMetadataJVMVersion = '0.1.0'
     smaliVersion = '2.2b4'
@@ -148,12 +150,6 @@
             srcDirs = ['src/test/testngrunner']
         }
     }
-    examplesKotlin {
-        java {
-            srcDirs = ['src/test/examplesKotlin']
-        }
-        output.resourcesDir = 'build/classes/examplesKotlin'
-    }
     examplesAndroidN {
         java {
             srcDirs = ['src/test/examplesAndroidN']
@@ -274,7 +270,6 @@
     supportLibs "com.android.support.test.espresso:espresso-core:$espressoVersion"
     apiUsageSampleCompile sourceSets.main.output
     apiUsageSampleCompile "com.google.guava:guava:$guavaVersion"
-    examplesKotlinCompileOnly "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
     kotlinR8TestResourcesCompileOnly "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
     errorprone("com.google.errorprone:error_prone_core:$errorproneVersion")
     testImplementation "org.jetbrains.kotlin:kotlin-reflect:1.3.31"
@@ -1229,18 +1224,6 @@
     targetCompatibility = JavaVersion.VERSION_1_8
 }
 
-task buildExampleKotlinJars {
-    def kotlinSrcDir = file("src/test/examplesKotlin")
-    kotlinSrcDir.eachDir { dir ->
-        def name = dir.getName();
-        dependsOn "compile_example_kotlin_${name}"
-        task "compile_example_kotlin_${name}"(type: kotlin.Kotlinc) {
-            source = fileTree(dir: file("src/test/examplesKotlin/${name}"), include: '**/*.kt')
-            destination = file("build/test/examplesKotlin/${name}.jar")
-        }
-    }
-}
-
 task buildProtoGeneratedSources {
     def examplesProtoDir = file("src/test/examplesProto")
     examplesProtoDir.eachDir { dir ->
@@ -1622,52 +1605,15 @@
     }
 }
 
-task buildExamplesKotlin {
-    if (OperatingSystem.current().isMacOsX() || OperatingSystem.current().isWindows()) {
-        logger.lifecycle("WARNING: Testing (including building kotlin examples) is only partially" +
-                " supported on your platform (" + OperatingSystem.current().getName() + ").")
-    } else if (!OperatingSystem.current().isLinux()) {
-        logger.lifecycle("WARNING: Testing (including building kotlin examples) is not supported " +
-                "on your platform. It is fully supported on Linux and partially supported on " +
-                "Mac OS and Windows")
-        return;
-    }
-    def examplesDir = file("src/test/examplesKotlin")
-    examplesDir.eachDir { dir ->
-        def name = dir.getName();
-        dependsOn "dex_example_kotlin_${name}"
-        def exampleOutputDir = file("build/test/examplesKotlin/" + name);
-        def dexPath = file("${exampleOutputDir}")
-        task "dex_example_kotlin_${name}"(type: DxTask,
-                dependsOn: "compile_example_kotlin_${name}") {
-            doFirst {
-                if (!dexPath.exists()) {
-                    dexPath.mkdirs()
-                }
-            }
-            source = files(tasks.getByPath("compile_example_kotlin_${name}")).asFileTree
-            destination = dexPath
-            debug = false
-        }
-    }
-}
-
 task buildKotlinR8TestResources {
     def examplesDir = file("src/test/kotlinR8TestResources")
     examplesDir.eachDir { dir ->
         kotlin.Kotlinc.KotlinTargetVersion.values().each { kotlinTargetVersion ->
             def name = dir.getName()
             def taskName = "jar_kotlinR8TestResources_${name}_${kotlinTargetVersion}"
-            def outputFile = "build/test/kotlinR8TestResources/${kotlinTargetVersion}/${name}.jar"
             def javaOutput = "build/test/kotlinR8TestResources/${kotlinTargetVersion}/${name}/java"
             def javaOutputJarName = "${name}.java.jar"
             def javaOutputJarDir = "build/test/kotlinR8TestResources/${kotlinTargetVersion}"
-            task "${taskName}Kotlin"(type: kotlin.Kotlinc) {
-                source = fileTree(dir: file("${examplesDir}/${name}"),
-                        include: ['**/*.kt', '**/*.java'])
-                destination = file(outputFile)
-                targetVersion = kotlinTargetVersion
-            }
             task "${taskName}Java"(type: JavaCompile) {
                 source = fileTree(dir: file("${examplesDir}/${name}"), include: '**/*.java')
                 destinationDir = file(javaOutput)
@@ -1682,7 +1628,7 @@
                 from javaOutput
                 include "**/*.class"
             }
-            dependsOn "${taskName}Kotlin", "${taskName}JavaJar"
+            dependsOn "${taskName}JavaJar"
         }
     }
 }
@@ -2101,7 +2047,6 @@
         }
         dependsOn downloadDeps
         dependsOn buildExamples
-        dependsOn buildExamplesKotlin
         dependsOn buildKotlinR8TestResources
         dependsOn buildSmali
         dependsOn jctfCommonJar
diff --git a/src/test/java/com/android/tools/r8/KotlinTestBase.java b/src/test/java/com/android/tools/r8/KotlinTestBase.java
index 37f4222..1696327 100644
--- a/src/test/java/com/android/tools/r8/KotlinTestBase.java
+++ b/src/test/java/com/android/tools/r8/KotlinTestBase.java
@@ -24,6 +24,7 @@
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 import org.hamcrest.Matcher;
+import org.junit.rules.TemporaryFolder;
 
 public abstract class KotlinTestBase extends TestBase {
 
@@ -107,6 +108,11 @@
   }
 
   public static KotlinCompileMemoizer getCompileMemoizer(
+      Collection<Path> sources, CfRuntime runtime, TemporaryFolder temporaryFolder) {
+    return new KotlinCompileMemoizer(sources, runtime, temporaryFolder);
+  }
+
+  public static KotlinCompileMemoizer getCompileMemoizer(
       Collection<Path> sources, String sharedFolder) {
     return compileMemoizers.computeIfAbsent(
         sharedFolder, ignore -> new KotlinCompileMemoizer(sources));
@@ -131,12 +137,22 @@
   public static class KotlinCompileMemoizer {
 
     private final Collection<Path> sources;
+    private final CfRuntime runtime;
+    private final TemporaryFolder temporaryFolder;
+
     private Consumer<KotlinCompilerTool> kotlinCompilerToolConsumer = x -> {};
     private final Map<KotlinCompiler, Map<KotlinTargetVersion, Path>> compiledPaths =
         new IdentityHashMap<>();
 
     public KotlinCompileMemoizer(Collection<Path> sources) {
+      this(sources, CfRuntime.getCheckedInJdk9(), null);
+    }
+
+    public KotlinCompileMemoizer(
+        Collection<Path> sources, CfRuntime runtime, TemporaryFolder temporaryFolder) {
       this.sources = sources;
+      this.runtime = runtime;
+      this.temporaryFolder = temporaryFolder;
     }
 
     public KotlinCompileMemoizer configure(Consumer<KotlinCompilerTool> consumer) {
@@ -159,10 +175,11 @@
           targetVersion,
           ignored -> {
             try {
-              return kotlinc(compiler, targetVersion)
-                  .addSourceFiles(sources)
-                  .apply(kotlinCompilerToolConsumer)
-                  .compile();
+              KotlinCompilerTool kotlinc =
+                  temporaryFolder == null
+                      ? kotlinc(compiler, targetVersion)
+                      : kotlinc(runtime, temporaryFolder, compiler, targetVersion);
+              return kotlinc.addSourceFiles(sources).apply(kotlinCompilerToolConsumer).compile();
             } catch (IOException e) {
               throw new RuntimeException(e);
             }
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesKotlinTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesKotlinTest.java
deleted file mode 100644
index 74dfeb4..0000000
--- a/src/test/java/com/android/tools/r8/R8RunExamplesKotlinTest.java
+++ /dev/null
@@ -1,110 +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;
-
-import com.android.tools.r8.KotlinCompilerTool.KotlinCompiler;
-import com.android.tools.r8.R8Command.Builder;
-import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
-import com.android.tools.r8.utils.InternalOptions;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class R8RunExamplesKotlinTest extends R8RunExamplesCommon {
-
-  @Override
-  protected void configure(InternalOptions options) {
-    super.configure(options);
-  }
-
-  @Parameters(name = "{0}_{1}_{2}_{3}_{5}_{6}")
-  public static Collection<String[]> data() {
-    String[] tests = {
-        "loops.LoopKt"
-    };
-
-    List<String[]> fullTestList = new ArrayList<>(tests.length * 2);
-    for (String test : tests) {
-      fullTestList.add(
-          makeTest(Input.JAVAC, CompilerUnderTest.D8, CompilationMode.DEBUG, test, Output.DEX));
-      fullTestList.add(
-          makeTest(Input.JAVAC, CompilerUnderTest.D8, CompilationMode.RELEASE, test, Output.DEX));
-      fullTestList.add(makeTest(Input.DX, CompilerUnderTest.R8, CompilationMode.DEBUG, test));
-      fullTestList.add(makeTest(Input.DX, CompilerUnderTest.R8, CompilationMode.RELEASE, test));
-      fullTestList.add(
-          makeTest(Input.JAVAC, CompilerUnderTest.R8, CompilationMode.DEBUG, test, Output.CF));
-      fullTestList.add(
-          makeTest(Input.JAVAC, CompilerUnderTest.R8, CompilationMode.RELEASE, test, Output.CF));
-    }
-    return fullTestList;
-  }
-
-  @Override
-  public Builder addInputFile(Builder builder) {
-    return super.addInputFile(builder)
-        .addProgramFiles(ToolHelper.getKotlinAnnotationJar(KotlinCompiler.latest()));
-  }
-
-  @Override
-  protected String getExampleDir() {
-    return ToolHelper.EXAMPLES_KOTLIN_BUILD_DIR;
-  }
-
-  @Override
-  protected Map<String, TestCondition> getFailingRun() {
-    return Collections.emptyMap();
-  }
-
-  @Override
-  protected Map<String, TestCondition> getFailingRunCf() {
-    return Collections.emptyMap();
-  }
-
-  @Override
-  protected Set<String> getFailingCompileCfToDex() {
-    return Collections.emptySet();
-  }
-
-  @Override
-  protected Set<String> getFailingRunCfToDex() {
-    return Collections.emptySet();
-  }
-
-  @Override
-  protected Set<String> getFailingCompileCf() {
-    return Collections.emptySet();
-  }
-
-  @Override
-  protected Set<String> getFailingOutputCf() {
-    return Collections.emptySet();
-  }
-
-  @Override
-  protected Map<String, TestCondition> getOutputNotIdenticalToJVMOutput() {
-    return Collections.emptyMap();
-  }
-
-  @Override
-  protected Map<String, TestCondition> getSkip() {
-    return Collections.emptyMap();
-  }
-
-  public R8RunExamplesKotlinTest(
-      String pkg,
-      String input,
-      String compiler,
-      String mode,
-      String mainClass,
-      String output) {
-    super(pkg, input, compiler, mode, mainClass, output);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 883a2b4..16d7ddf 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -103,14 +103,10 @@
   public static final String EXAMPLES_ANDROID_N_DIR = TESTS_DIR + "examplesAndroidN/";
   public static final String EXAMPLES_ANDROID_O_DIR = TESTS_DIR + "examplesAndroidO/";
   public static final String EXAMPLES_ANDROID_P_DIR = TESTS_DIR + "examplesAndroidP/";
-  public static final String EXAMPLES_KOTLIN_DIR = TESTS_DIR + "examplesKotlin/";
   public static final String TESTS_BUILD_DIR = BUILD_DIR + "test/";
   public static final String JDK_TESTS_BUILD_DIR = TESTS_BUILD_DIR + "jdk11Tests/";
   public static final String EXAMPLES_BUILD_DIR = TESTS_BUILD_DIR + "examples/";
   public static final String EXAMPLES_CF_DIR = EXAMPLES_BUILD_DIR + "classes/";
-  public static final String EXAMPLES_KOTLIN_BUILD_DIR = TESTS_BUILD_DIR + "examplesKotlin/";
-  public static final String EXAMPLES_KOTLIN_RESOURCE_DIR =
-      TESTS_BUILD_DIR + "kotlinR8TestResources/";
   public static final String EXAMPLES_ANDROID_N_BUILD_DIR = TESTS_BUILD_DIR + "examplesAndroidN/";
   public static final String EXAMPLES_ANDROID_O_BUILD_DIR = TESTS_BUILD_DIR + "examplesAndroidO/";
   public static final String EXAMPLES_ANDROID_P_BUILD_DIR = TESTS_BUILD_DIR + "examplesAndroidP/";
diff --git a/src/test/java/com/android/tools/r8/debug/ContinuousSteppingTest.java b/src/test/java/com/android/tools/r8/debug/ContinuousSteppingTest.java
index 4552be6..b6448f5 100644
--- a/src/test/java/com/android/tools/r8/debug/ContinuousSteppingTest.java
+++ b/src/test/java/com/android/tools/r8/debug/ContinuousSteppingTest.java
@@ -4,8 +4,12 @@
 
 package com.android.tools.r8.debug;
 
+import com.android.tools.r8.KotlinCompilerTool;
+import com.android.tools.r8.KotlinTestBase;
+import com.android.tools.r8.KotlinTestBase.KotlinCompileMemoizer;
 import com.android.tools.r8.KotlinTestParameters;
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestRuntime.CfRuntime;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.utils.DescriptorUtils;
@@ -87,9 +91,15 @@
 
     public ConfigListBuilder addAllKotlinDebugJars(
         TemporaryFolder temp, Predicate<Version> predicate) {
+      KotlinCompileMemoizer compiledJars =
+          KotlinTestBase.getCompileMemoizer(
+                  KotlinTestBase.getKotlinFilesInResource("debug"),
+                  CfRuntime.getCheckedInJdk9(),
+                  temp)
+              .configure(KotlinCompilerTool::includeRuntime);
       for (KotlinTestParameters kotlinParameter :
           TestBase.getKotlinTestParameters().withAllCompilersAndTargetVersions().build()) {
-        add(KotlinD8Config.compileKotlinMemoized.apply(temp, kotlinParameter), predicate);
+        add(compiledJars.getForConfiguration(kotlinParameter), predicate);
       }
       return this;
     }
diff --git a/src/test/java/com/android/tools/r8/debug/KotlinD8Config.java b/src/test/java/com/android/tools/r8/debug/KotlinD8Config.java
deleted file mode 100644
index a7e31a4..0000000
--- a/src/test/java/com/android/tools/r8/debug/KotlinD8Config.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (c) 2018, 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.debug;
-
-import static com.android.tools.r8.TestBase.kotlinc;
-import static com.android.tools.r8.TestBase.memoizeBiFunction;
-
-import com.android.tools.r8.KotlinTestBase;
-import com.android.tools.r8.KotlinTestParameters;
-import com.android.tools.r8.OutputMode;
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestRuntime;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.Collections;
-import java.util.function.BiFunction;
-import org.junit.rules.TemporaryFolder;
-
-/** Shared test configuration for D8 compiled resources from the "kotlinR8TestResources/debug". */
-class KotlinD8Config extends D8DebugTestConfig {
-
-  public static BiFunction<TemporaryFolder, KotlinTestParameters, Path> compileKotlinMemoized =
-      memoizeBiFunction(KotlinD8Config::compileWithKotlinC);
-
-  private static Path compileWithKotlinC(TemporaryFolder temp, KotlinTestParameters parameters)
-      throws IOException {
-    return kotlinc(
-            TestRuntime.getCheckedInJdk9(),
-            temp,
-            parameters.getCompiler(),
-            parameters.getTargetVersion())
-        .addSourceFiles(KotlinTestBase.getKotlinFilesInResource("debug"))
-        .includeRuntime()
-        .compile();
-  }
-
-  private static BiFunction<KotlinTestParameters, AndroidApiLevel, Path> compiledResourcesMemoized =
-      memoizeBiFunction(KotlinD8Config::getCompiledResources);
-
-  private static Path getCompiledResources(
-      KotlinTestParameters kotlinTestParameters, AndroidApiLevel apiLevel) throws IOException {
-    Path outputPath =
-        TestBase.getStaticTemp().newFolder().toPath().resolve("d8_debug_test_resources_kotlin.jar");
-    Path kotlinJar = compileKotlinMemoized.apply(TestBase.getStaticTemp(), kotlinTestParameters);
-    D8DebugTestConfig.d8Compile(Collections.singletonList(kotlinJar), apiLevel, null)
-        .write(outputPath, OutputMode.DexIndexed);
-    return outputPath;
-  }
-
-  public static KotlinD8Config build(
-      KotlinTestParameters kotlinTestParameters, AndroidApiLevel apiLevel) {
-    try {
-      KotlinD8Config kotlinD8Config = new KotlinD8Config();
-      kotlinD8Config.addPaths(compiledResourcesMemoized.apply(kotlinTestParameters, apiLevel));
-      return kotlinD8Config;
-    } catch (Throwable e) {
-      throw new RuntimeException(e);
-    }
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/debug/KotlinDebugD8Config.java b/src/test/java/com/android/tools/r8/debug/KotlinDebugD8Config.java
new file mode 100644
index 0000000..348d43a
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/debug/KotlinDebugD8Config.java
@@ -0,0 +1,52 @@
+// Copyright (c) 2018, 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.debug;
+
+import static com.android.tools.r8.KotlinTestBase.getCompileMemoizer;
+import static com.android.tools.r8.TestBase.memoizeBiFunction;
+
+import com.android.tools.r8.KotlinCompilerTool;
+import com.android.tools.r8.KotlinTestBase;
+import com.android.tools.r8.KotlinTestBase.KotlinCompileMemoizer;
+import com.android.tools.r8.KotlinTestParameters;
+import com.android.tools.r8.OutputMode;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.Collections;
+import java.util.function.BiFunction;
+
+/** Shared test configuration for D8 compiled resources from the "kotlinR8TestResources/debug". */
+class KotlinDebugD8Config extends D8DebugTestConfig {
+
+  static final KotlinCompileMemoizer compiledKotlinJars =
+      getCompileMemoizer(KotlinTestBase.getKotlinFilesInResource("debug"))
+          .configure(KotlinCompilerTool::includeRuntime);
+
+  private static final BiFunction<KotlinTestParameters, AndroidApiLevel, Path>
+      compiledResourcesMemoized = memoizeBiFunction(KotlinDebugD8Config::getCompiledResources);
+
+  private static Path getCompiledResources(
+      KotlinTestParameters kotlinTestParameters, AndroidApiLevel apiLevel) throws IOException {
+    Path outputPath =
+        TestBase.getStaticTemp().newFolder().toPath().resolve("d8_debug_test_resources_kotlin.jar");
+    Path kotlinJar = compiledKotlinJars.getForConfiguration(kotlinTestParameters);
+    D8DebugTestConfig.d8Compile(Collections.singletonList(kotlinJar), apiLevel, null)
+        .write(outputPath, OutputMode.DexIndexed);
+    return outputPath;
+  }
+
+  public static KotlinDebugD8Config build(
+      KotlinTestParameters kotlinTestParameters, AndroidApiLevel apiLevel) {
+    try {
+      KotlinDebugD8Config kotlinDebugD8Config = new KotlinDebugD8Config();
+      kotlinDebugD8Config.addPaths(compiledResourcesMemoized.apply(kotlinTestParameters, apiLevel));
+      return kotlinDebugD8Config;
+    } catch (Throwable e) {
+      throw new RuntimeException(e);
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/debug/KotlinInlineTest.java b/src/test/java/com/android/tools/r8/debug/KotlinInlineTest.java
index 00333e0..d205f26 100644
--- a/src/test/java/com/android/tools/r8/debug/KotlinInlineTest.java
+++ b/src/test/java/com/android/tools/r8/debug/KotlinInlineTest.java
@@ -39,8 +39,8 @@
     this.kotlinParameters = kotlinParameters;
   }
 
-  protected KotlinD8Config getD8Config() {
-    return KotlinD8Config.build(kotlinParameters, parameters.getApiLevel());
+  protected KotlinDebugD8Config getD8Config() {
+    return KotlinDebugD8Config.build(kotlinParameters, parameters.getApiLevel());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/debug/KotlinLoopD8Config.java b/src/test/java/com/android/tools/r8/debug/KotlinLoopD8Config.java
new file mode 100644
index 0000000..c1f20d3
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/debug/KotlinLoopD8Config.java
@@ -0,0 +1,52 @@
+// Copyright (c) 2018, 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.debug;
+
+import static com.android.tools.r8.KotlinTestBase.getCompileMemoizer;
+import static com.android.tools.r8.TestBase.memoizeBiFunction;
+
+import com.android.tools.r8.KotlinCompilerTool;
+import com.android.tools.r8.KotlinTestBase;
+import com.android.tools.r8.KotlinTestBase.KotlinCompileMemoizer;
+import com.android.tools.r8.KotlinTestParameters;
+import com.android.tools.r8.OutputMode;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.Collections;
+import java.util.function.BiFunction;
+
+/** Shared test configuration for D8 compiled resources from the "kotlinR8TestResources/loops". */
+class KotlinLoopD8Config extends D8DebugTestConfig {
+
+  static final KotlinCompileMemoizer compiledKotlinJars =
+      getCompileMemoizer(KotlinTestBase.getKotlinFilesInResource("loops"))
+          .configure(KotlinCompilerTool::includeRuntime);
+
+  private static final BiFunction<KotlinTestParameters, AndroidApiLevel, Path>
+      compiledResourcesMemoized = memoizeBiFunction(KotlinLoopD8Config::getCompiledResources);
+
+  private static Path getCompiledResources(
+      KotlinTestParameters kotlinTestParameters, AndroidApiLevel apiLevel) throws IOException {
+    Path outputPath =
+        TestBase.getStaticTemp().newFolder().toPath().resolve("d8_debug_test_resources_kotlin.jar");
+    Path kotlinJar = compiledKotlinJars.getForConfiguration(kotlinTestParameters);
+    D8DebugTestConfig.d8Compile(Collections.singletonList(kotlinJar), apiLevel, null)
+        .write(outputPath, OutputMode.DexIndexed);
+    return outputPath;
+  }
+
+  public static KotlinLoopD8Config build(
+      KotlinTestParameters kotlinTestParameters, AndroidApiLevel apiLevel) {
+    try {
+      KotlinLoopD8Config kotlinDebugD8Config = new KotlinLoopD8Config();
+      kotlinDebugD8Config.addPaths(compiledResourcesMemoized.apply(kotlinTestParameters, apiLevel));
+      return kotlinDebugD8Config;
+    } catch (Throwable e) {
+      throw new RuntimeException(e);
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/debug/KotlinLoopTest.java b/src/test/java/com/android/tools/r8/debug/KotlinLoopTest.java
index 85c3ec5..ef55a6d 100644
--- a/src/test/java/com/android/tools/r8/debug/KotlinLoopTest.java
+++ b/src/test/java/com/android/tools/r8/debug/KotlinLoopTest.java
@@ -3,15 +3,34 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.debug;
 
-import com.android.tools.r8.ToolHelper;
-import java.nio.file.Paths;
+import com.android.tools.r8.KotlinTestParameters;
+import com.android.tools.r8.TestParameters;
+import java.util.List;
 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 KotlinLoopTest extends KotlinDebugTestBase {
 
+  private final TestParameters parameters;
+  private final KotlinTestParameters kotlinParameters;
+
+  @Parameters(name = "{0}, {1}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        getTestParameters().withDexRuntimes().withAllApiLevels().build(),
+        getKotlinTestParameters().withAllCompilersAndTargetVersions().build());
+  }
+
+  public KotlinLoopTest(TestParameters parameters, KotlinTestParameters kotlinParameters) {
+    this.parameters = parameters;
+    this.kotlinParameters = kotlinParameters;
+  }
+
   DebugTestConfig config() {
-    return new D8DebugTestConfig()
-        .compileAndAdd(temp, Paths.get(ToolHelper.EXAMPLES_KOTLIN_BUILD_DIR, "loops.jar"));
+    return KotlinLoopD8Config.build(kotlinParameters, parameters.getApiLevel());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/debug/KotlinTest.java b/src/test/java/com/android/tools/r8/debug/KotlinTest.java
index 07e9e05..4c9f8c0 100644
--- a/src/test/java/com/android/tools/r8/debug/KotlinTest.java
+++ b/src/test/java/com/android/tools/r8/debug/KotlinTest.java
@@ -32,8 +32,8 @@
     this.kotlinParameters = kotlinParameters;
   }
 
-  protected KotlinD8Config getD8Config() {
-    return KotlinD8Config.build(kotlinParameters, parameters.getApiLevel());
+  protected KotlinDebugD8Config getD8Config() {
+    return KotlinDebugD8Config.build(kotlinParameters, parameters.getApiLevel());
   }
 
   // TODO(shertz) simplify test
diff --git a/src/test/java/com/android/tools/r8/kotlin/optimize/switches/KotlinEnumSwitchTest.java b/src/test/java/com/android/tools/r8/kotlin/optimize/switches/KotlinEnumSwitchTest.java
index 265aa24..9c01d63 100644
--- a/src/test/java/com/android/tools/r8/kotlin/optimize/switches/KotlinEnumSwitchTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/optimize/switches/KotlinEnumSwitchTest.java
@@ -10,12 +10,12 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertNotEquals;
 
-import com.android.tools.r8.TestBase;
+import com.android.tools.r8.KotlinCompilerTool;
+import com.android.tools.r8.KotlinTestBase;
+import com.android.tools.r8.KotlinTestParameters;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
-import java.nio.file.Paths;
 import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -23,18 +23,28 @@
 import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
-public class KotlinEnumSwitchTest extends TestBase {
+public class KotlinEnumSwitchTest extends KotlinTestBase {
 
   private final boolean enableSwitchMapRemoval;
   private final TestParameters parameters;
 
-  @Parameters(name = "{1}, enable switch map removal: {0}")
+  @Parameters(name = "{1}, enable switch map removal: {0}, {2}")
   public static List<Object[]> data() {
     return buildParameters(
-        BooleanUtils.values(), getTestParameters().withAllRuntimesAndApiLevels().build());
+        BooleanUtils.values(),
+        getTestParameters().withAllRuntimesAndApiLevels().build(),
+        getKotlinTestParameters().withAllCompilersAndTargetVersions().build());
   }
 
-  public KotlinEnumSwitchTest(boolean enableSwitchMapRemoval, TestParameters parameters) {
+  private static final KotlinCompileMemoizer kotlinJars =
+      getCompileMemoizer(getKotlinFilesInResource("enumswitch"))
+          .configure(KotlinCompilerTool::includeRuntime);
+
+  public KotlinEnumSwitchTest(
+      boolean enableSwitchMapRemoval,
+      TestParameters parameters,
+      KotlinTestParameters kotlinParameters) {
+    super(kotlinParameters);
     this.enableSwitchMapRemoval = enableSwitchMapRemoval;
     this.parameters = parameters;
   }
@@ -43,8 +53,7 @@
   public void test() throws Exception {
     testForR8(parameters.getBackend())
         .addProgramFiles(
-            Paths.get(ToolHelper.EXAMPLES_KOTLIN_BUILD_DIR, "enumswitch.jar"),
-            getMostRecentKotlinAnnotationJar())
+            kotlinJars.getForConfiguration(kotlinParameters), getMostRecentKotlinAnnotationJar())
         .addKeepMainRule("enumswitch.EnumSwitchKt")
         .addOptionsModification(
             options -> {
diff --git a/src/test/java/com/android/tools/r8/naming/b139991218/TestRunner.java b/src/test/java/com/android/tools/r8/naming/b139991218/TestRunner.java
index 10ce37d..d9b9a3c 100644
--- a/src/test/java/com/android/tools/r8/naming/b139991218/TestRunner.java
+++ b/src/test/java/com/android/tools/r8/naming/b139991218/TestRunner.java
@@ -10,15 +10,15 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.TestBase;
+import com.android.tools.r8.KotlinCompilerTool;
+import com.android.tools.r8.KotlinTestBase;
+import com.android.tools.r8.KotlinTestParameters;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.KotlinTargetVersion;
 import com.android.tools.r8.ir.optimize.Inliner.Reason;
-import com.android.tools.r8.utils.FileUtils;
 import com.google.common.collect.ImmutableSet;
 import java.io.IOException;
-import java.nio.file.Paths;
+import java.util.List;
 import java.util.concurrent.ExecutionException;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -33,16 +33,26 @@
  * which is why the ASMified code is generated from kotlin.
  */
 @RunWith(Parameterized.class)
-public class TestRunner extends TestBase {
+public class TestRunner extends KotlinTestBase {
 
   private final TestParameters parameters;
 
+  private static final KotlinCompileMemoizer kotlinJars =
+      getCompileMemoizer(getKotlinFilesInResource("lambdas_kstyle_generics"))
+          .configure(KotlinCompilerTool::includeRuntime);
+
   @Parameters(name = "{0}")
-  public static TestParametersCollection data() {
-    return getTestParameters().withDexRuntimes().withAllApiLevels().build();
+  public static List<Object[]> data() {
+    return buildParameters(
+        getTestParameters().withDexRuntimes().withAllApiLevels().build(),
+        getKotlinTestParameters()
+            .withAllCompilers()
+            .withTargetVersion(KotlinTargetVersion.JAVA_8)
+            .build());
   }
 
-  public TestRunner(TestParameters parameters) {
+  public TestRunner(TestParameters parameters, KotlinTestParameters kotlinParameters) {
+    super(kotlinParameters);
     this.parameters = parameters;
   }
 
@@ -52,12 +62,7 @@
     testForR8(parameters.getBackend())
         .addProgramClassFileData(Lambda1.dump(), Lambda2.dump(), Main.dump(), Alpha.dump())
         .addProgramFiles(
-            Paths.get(
-                ToolHelper.TESTS_BUILD_DIR,
-                "kotlinR8TestResources",
-                "JAVA_8",
-                "lambdas_kstyle_generics" + FileUtils.JAR_EXTENSION),
-            getMostRecentKotlinAnnotationJar())
+            kotlinJars.getForConfiguration(kotlinParameters), getMostRecentKotlinAnnotationJar())
         .addKeepMainRule(Main.class)
         .addKeepAllAttributes()
         .addOptionsModification(
diff --git a/src/test/examplesKotlin/enumswitch/EnumSwitch.kt b/src/test/kotlinR8TestResources/enumswitch/EnumSwitch.kt
similarity index 100%
rename from src/test/examplesKotlin/enumswitch/EnumSwitch.kt
rename to src/test/kotlinR8TestResources/enumswitch/EnumSwitch.kt
diff --git a/src/test/examplesKotlin/loops/Loop.kt b/src/test/kotlinR8TestResources/loops/Loop.kt
similarity index 100%
rename from src/test/examplesKotlin/loops/Loop.kt
rename to src/test/kotlinR8TestResources/loops/Loop.kt