// 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 com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm;
import com.google.common.collect.ImmutableList;
import java.util.Collection;
import java.util.Collections;
import org.junit.Assume;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

@RunWith(Parameterized.class)
public class BreakAtTryAndCatchTestRunner extends DebugTestBase {

  private static final Class<?> CLASS = BreakAtTryAndCatchTest.class;
  private static final String FILE = CLASS.getSimpleName() + ".java";
  private static final String NAME = CLASS.getCanonicalName();

  private final String name;
  private final DebugTestConfig config;

  @Parameterized.Parameters(name = "{0}")
  public static Collection<Object[]> setup() {
    DelayedDebugTestConfig cf =
        temp -> new CfDebugTestConfig().addPaths(ToolHelper.getClassPathForTests());
    DelayedDebugTestConfig d8 =
        temp -> new D8DebugTestConfig().compileAndAddClasses(temp, CLASS);
    DelayedDebugTestConfig d8Reordered =
        temp -> new D8DebugTestConfig().compileAndAdd(
            temp,
            Collections.singletonList(ToolHelper.getClassFileForTestClass(CLASS)),
            options -> options.testing.placeExceptionalBlocksLast = true);
    return ImmutableList.of(
        new Object[]{"CF", cf},
        new Object[]{"D8", d8},
        new Object[]{"D8/reorder", d8Reordered}
    );
  }

  public BreakAtTryAndCatchTestRunner(String name, DelayedDebugTestConfig config) {
    this.name = name;
    this.config = config.getConfig(getStaticTemp());
  }

  @Test
  public void testHitOnEntryOnly() throws Throwable {
    Assume.assumeFalse("b/72933440", name.equals("D8/reorder"));
    Assume.assumeFalse("b/73803266",
        name.equals("D8") && ToolHelper.getDexVm() == DexVm.ART_6_0_1_HOST);
    runDebugTest(
        config,
        NAME,
        breakpoint(NAME, "foo", 10),
        run(),
        checkLine(FILE, 10), // hit line entry, bar does not throw
        run(),
        checkLine(FILE, 10), // hit line entry, bar does throw
        breakpoint(NAME, "main", 31),
        run(),
        checkLine(FILE, 31), // No more hits on line, continue to main.
        run());
  }
}
