// 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.desugar.b72538146;

import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.google.common.collect.ImmutableList;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

@RunWith(Parameterized.class)
public class B72538146 extends TestBase {

  private final TestParameters parameters;

  @Parameterized.Parameters(name = "{0}")
  public static TestParametersCollection data() {
    return getTestParameters()
        .withDexRuntimesStartingFromIncluding(Version.V7_0_0)
        .withAllApiLevels()
        .build();
  }

  public B72538146(TestParameters parameters) {
    this.parameters = parameters;
  }

  @Test
  public void test() throws Exception {
    // Compile the parent and child applications into separate dex applications.
    List<Class<?>> parentClasses =
        ImmutableList.of(
            Parent.class,
            Parent.Inner1.class,
            Parent.Inner2.class,
            Parent.Inner3.class,
            Parent.Inner4.class);

    Path parent =
        testForD8().addProgramClasses(parentClasses).setMinApi(parameters).compile().writeToZip();

    Path child =
        testForD8()
            .addProgramClasses(Child.class)
            .addClasspathClasses(parentClasses)
            .setMinApi(parameters)
            .compile()
            .writeToZip();

    // Run the classloader test loading the two dex applications.
    testForD8()
        .addProgramFiles(
            Paths.get("build/test/examplesAndroidApi/classes/classloader/Runner.class"))
        .setMinApi(parameters)
        .compile()
        .run(
            parameters.getRuntime(),
            "classloader.Runner",
            parent.toString(),
            child.toString(),
            Child.class.getTypeName())
        .assertSuccessWithOutput("SUCCESS");
  }
}
