// Copyright (c) 2021, 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 static com.android.tools.r8.TestRuntime.getCheckedInJdk8;

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.junit.Assume;
import org.junit.rules.TemporaryFolder;

public class Jdk11TestUtils {

  public static ThrowableConsumer<R8FullTestBuilder> addJdk11LibraryFiles(
      TemporaryFolder temporaryFolder) {
    return builder -> builder.addLibraryFiles(getJdk11LibraryFiles(temporaryFolder));
  }

  public static Path[] getJdk11LibraryFiles(TemporaryFolder temp) throws IOException {
    Assume.assumeFalse(ToolHelper.isWindows());
    // TODO(b/180553597): Add JDK-11 runtime jar instead. As a temporary solution we use the JDK-8
    //  runtime with additional stubs.
    Path stubs =
        JavaCompilerTool.create(getCheckedInJdk8(), temp)
            .addSourceFiles(Paths.get("src", "test", "javaStubs", "StringConcatFactory.java"))
            .addSourceFiles(Paths.get("src", "test", "javaStubs", "VarHandle.java"))
            .compile();
    return new Path[] {stubs, ToolHelper.getJava8RuntimeJar()};
  }
}
