// 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.naming;

import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.OutputMode;
import com.android.tools.r8.R8Command;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.debug.DebugTestBase;
import com.android.tools.r8.debug.DebugTestConfig;
import com.android.tools.r8.debug.DexDebugTestConfig;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.google.common.collect.ImmutableList;
import java.nio.file.Path;
import org.junit.BeforeClass;
import org.junit.Test;

/**
 * Tests -renamesourcefileattribute.
 */
public class RenameSourceFileDebugTest extends DebugTestBase {

  private static final String TEST_FILE = "TestFile.java";

  private static DebugTestConfig config;

  @BeforeClass
  public static void initDebuggeePath() throws Exception {
    AndroidApiLevel minSdk = ToolHelper.getMinApiLevelForDexVm();
    Path outdir = temp.newFolder().toPath();
    Path outjar = outdir.resolve("r8_compiled.jar");
    Path proguardMapPath = outdir.resolve("proguard.map");
    ToolHelper.runR8(
        ToolHelper.addProguardConfigurationConsumer(
                R8Command.builder(),
                pgConfig -> {
                  pgConfig.setRenameSourceFileAttribute(TEST_FILE);
                  pgConfig.addKeepAttributePatterns(
                      ImmutableList.of("SourceFile", "LineNumberTable"));
                })
            .addProgramFiles(DEBUGGEE_JAR)
            .setMinApiLevel(minSdk.getLevel())
            .addLibraryFiles(ToolHelper.getAndroidJar(minSdk))
            .setMode(CompilationMode.DEBUG)
            .setOutput(outjar, OutputMode.DexIndexed)
            .setProguardMapOutputPath(proguardMapPath)
            .build());
    config = new DexDebugTestConfig(outjar);
    config.setProguardMap(proguardMapPath);
  }

  /**
   * replica of {@link com.android.tools.r8.debug.ClassInitializationTest#testBreakpointInEmptyClassInitializer}
   */
  @Test
  public void testBreakpointInEmptyClassInitializer() throws Throwable {
    final String CLASS = "ClassInitializerEmpty";
    runDebugTest(
        config, CLASS, breakpoint(CLASS, "<clinit>"), run(), checkLine(TEST_FILE, 8), run());
  }

  /**
   * replica of {@link com.android.tools.r8.debug.LocalsTest#testNoLocal},
   * except for checking overwritten class file.
   */
  @Test
  public void testNoLocal() throws Throwable {
    final String className = "Locals";
    final String methodName = "noLocals";
    runDebugTest(
        config,
        className,
        breakpoint(className, methodName),
        run(),
        checkMethod(className, methodName),
        checkLine(TEST_FILE, 8),
        checkNoLocal(),
        stepOver(),
        checkMethod(className, methodName),
        checkLine(TEST_FILE, 9),
        checkNoLocal(),
        run());
  }

  /**
   * replica of {@link com.android.tools.r8.debug.MultipleReturnsTest#testMultipleReturns}
   */
  @Test
  public void testMultipleReturns() throws Throwable {
    runDebugTest(
        config,
        "MultipleReturns",
        breakpoint("MultipleReturns", "multipleReturns"),
        run(),
        stepOver(),
        checkLine(TEST_FILE, 16), // this should be the 1st return statement
        run(),
        stepOver(),
        checkLine(TEST_FILE, 18), // this should be the 2nd return statement
        run());
  }
}
