// Copyright (c) 2020, 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.code;

import static junit.framework.Assert.assertSame;

import com.android.tools.r8.ArchiveClassFileProvider;
import com.android.tools.r8.CfFrontendExamplesTest;
import com.android.tools.r8.ClassFileResourceProvider;
import com.android.tools.r8.DirectoryClassFileProvider;
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestShrinkerBuilder;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

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

  private final String EXPECTED = StringUtils.lines("0", "foo", "0", "foo", "foo");

  private final TestParameters parameters;
  private final boolean keepDebug;

  @Parameters(name = "{0}, keep-debug: {1}")
  public static List<Object[]> data() {
    return buildParameters(getTestParameters().withCfRuntimes().build(), BooleanUtils.values());
  }

  public PassThroughTest(TestParameters parameters, boolean keepDebug) {
    this.parameters = parameters;
    this.keepDebug = keepDebug;
  }

  @Test
  public void testJmv() throws Exception {
    CodeInspector inspector =
        testForJvm()
            .addProgramClasses(Main.class)
            .run(parameters.getRuntime(), Main.class)
            .assertSuccessWithOutput(EXPECTED)
            .inspector();
    // Check that reading the same input is actual matches.
    ClassFileResourceProvider original =
        DirectoryClassFileProvider.fromDirectory(ToolHelper.getClassPathForTests());
    verifyInstructionsForMethodMatchingExpectation(original, "main", true, true);
    verifyInstructionsForMethodMatchingExpectation(original, "exceptionTest", true, true);
  }

  @Test
  public void testR8() throws Exception {
    Path outputJar = temp.newFile("output.jar").toPath();
    testForR8(parameters.getBackend())
        .addProgramClasses(Main.class)
        .addKeepAllClassesRule()
        .enableInliningAnnotations()
        .applyIf(keepDebug, TestShrinkerBuilder::addKeepAllAttributes)
        .compile()
        .writeToZip(outputJar)
        .run(parameters.getRuntime(), Main.class)
        .assertSuccessWithOutput(EXPECTED);
    ArchiveClassFileProvider actual = new ArchiveClassFileProvider(outputJar);
    verifyInstructionsForMethodMatchingExpectation(actual, "main", keepDebug, false);
    verifyInstructionsForMethodMatchingExpectation(actual, "exceptionTest", keepDebug, false);
  }

  @Test
  public void testR8ByteCodePassThrough() throws Exception {
    Path outputJar = temp.newFile("output.jar").toPath();
    testForR8(parameters.getBackend())
        .addProgramClasses(Main.class)
        .addKeepAllClassesRule()
        .enableInliningAnnotations()
        .applyIf(keepDebug, TestShrinkerBuilder::addKeepAllAttributes)
        .addOptionsModification(
            internalOptions -> {
              internalOptions.testing.cfByteCodePassThrough =
                  method -> !method.name.toString().equals("<init>");
              internalOptions.testing.readInputStackMaps = true;
            })
        .compile()
        .writeToZip(outputJar)
        .run(parameters.getRuntime(), Main.class)
        .assertSuccessWithOutput(EXPECTED);
    ArchiveClassFileProvider actual = new ArchiveClassFileProvider(outputJar);
    verifyInstructionsForMethodMatchingExpectation(actual, "main", keepDebug, true);
    verifyInstructionsForMethodMatchingExpectation(actual, "exceptionTest", keepDebug, true);
  }

  private void verifyInstructionsForMethodMatchingExpectation(
      ClassFileResourceProvider actual, String methodName, boolean checkDebug, boolean expectation)
      throws Exception {
    ClassFileResourceProvider original =
        DirectoryClassFileProvider.fromDirectory(ToolHelper.getClassPathForTests());
    String descriptor = DescriptorUtils.javaTypeToDescriptor(Main.class.getTypeName());
    byte[] expectedBytes = CfFrontendExamplesTest.getClassAsBytes(original, descriptor);
    byte[] actualBytes = CfFrontendExamplesTest.getClassAsBytes(actual, descriptor);
    if (!Arrays.equals(expectedBytes, actualBytes)) {
      String expectedString = CfFrontendExamplesTest.asmToString(expectedBytes);
      String actualString = CfFrontendExamplesTest.asmToString(actualBytes);
      verifyInstructionsForMethodMatchingExpectation(
          getMethodInstructions(expectedString, methodName),
          getMethodInstructions(actualString, methodName),
          checkDebug,
          expectation);
    }
  }

  private String getMethodInstructions(String asm, String methodName) {
    int methodIndexStart =
        asm.indexOf(
            "methodVisitor = classWriter.visitMethod(ACC_PUBLIC | ACC_STATIC, \""
                + methodName
                + "\",");
    methodIndexStart = asm.indexOf("methodVisitor.visitCode();", methodIndexStart);
    int methodIndexEnd = asm.indexOf("methodVisitor.visitEnd();", methodIndexStart);
    return asm.substring(methodIndexStart, methodIndexEnd);
  }

  private void verifyInstructionsForMethodMatchingExpectation(
      String originalInstructions,
      String actualInstructions,
      boolean checkDebug,
      boolean expectation) {
    if (checkDebug) {
      // We may rewrite jump instructions, so filter those out.
      originalInstructions = filter(originalInstructions, this::isNotLabelOrJumpInstruction);
      actualInstructions = filter(actualInstructions, this::isNotLabelOrJumpInstruction);
    } else {
      originalInstructions = filter(originalInstructions, this::isNotDebugInstructionOrJump);
      actualInstructions = filter(actualInstructions, this::isNotLabelOrJumpInstruction);
    }
    assertSame(expectation, actualInstructions.equals(originalInstructions));
  }

  private String filter(String instructions, Predicate<String> predicate) {
    return StringUtils.splitLines(instructions).stream()
        .filter(predicate)
        .map(instr -> instr + "\n")
        .collect(Collectors.joining());
  }

  private boolean isNotDebugInstructionOrJump(String instruction) {
    return !(instruction.startsWith("methodVisitor.visitLocalVariable")
        || instruction.startsWith("methodVisitor.visitLabel")
        || instruction.startsWith("Label")
        || instruction.startsWith("methodVisitor.visitLineNumber")
        || instruction.startsWith("methodVisitor.visitJumpInsn"));
  }

  private boolean isNotLabelOrJumpInstruction(String instruction) {
    return !(instruction.startsWith("Label")
        || instruction.startsWith("methodVisitor.visitJumpInsn")
        || instruction.startsWith("methodVisitor.visitLabel"));
  }

  public static class Main {

    public static void main(String[] args) {
      int i = 0;
      System.out.println(i);
      int j = 0;
      String foo = "foo";
      // Keep the false to have R8 remove it.
      if (false) {
        System.out.println(foo);
      }
      System.out.println(foo);
      System.out.println(j);
      System.out.println(phiTest(args.length > 0 ? args[0] : null));
      System.out.println(exceptionTest(args.length > 0 ? args[0] : null));
    }

    @NeverInline
    public static String phiTest(String arg) {
      String result;
      if (arg == null) {
        result = "foo";
      } else {
        result = "bar";
      }
      return result;
    }

    @NeverInline
    public static String exceptionTest(String arg) {
      try {
        return arg.toLowerCase();
      } catch (NullPointerException ignored) {
        return "foo";
      }
    }
  }
}
