// 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.regress.b63935662;

import com.android.tools.r8.R8FullTestBuilder;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.google.common.collect.ImmutableList;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

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

  private TestParameters parameters;

  @Parameterized.Parameters(name = "{0}")
  public static TestParametersCollection data() {
    return getTestParameters()
        .withAllRuntimes()
        .withApiLevelsStartingAtIncluding(AndroidApiLevel.N)
        .build();
  }

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

  void run(R8FullTestBuilder testBuilder, Class<?> mainClass) throws Exception {
    testBuilder
        .addKeepRuleFiles()
        .allowAccessModification()
        .addDontObfuscate()
        .setMinApi(parameters.getApiLevel())
        .compile()
        .run(parameters.getRuntime(), mainClass)
        .assertSuccessWithOutput(runOnJava(mainClass));
  }

  @Test
  public void test() throws Exception {
    Class<?> mainClass = TestClass.class;
    List<Class<?>> app =
        ImmutableList.of(
            TestClass.Top.class,
            TestClass.Left.class,
            TestClass.Right.class,
            TestClass.Bottom.class,
            TestClass.X1.class,
            TestClass.X2.class,
            TestClass.X3.class,
            TestClass.X4.class,
            TestClass.X5.class,
            mainClass);
    run(
        testForR8(parameters.getBackend())
            .addProgramClasses(app)
            .addKeepMainRule(mainClass)
            .enableNoHorizontalClassMergingAnnotations(),
        mainClass);
  }

  @Test
  public void test2() throws Exception {
    Class<?> mainClass = TestFromBug.class;
    List<Class<?>> app =
        ImmutableList.of(
            TestFromBug.Map.class,
            TestFromBug.AbstractMap.class,
            TestFromBug.ConcurrentMap.class,
            TestFromBug.ConcurrentHashMap.class,
            mainClass);
    run(
        testForR8(parameters.getBackend()).addProgramClasses(app).addKeepMainRule(mainClass),
        mainClass);
  }
}
