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

import static org.junit.Assert.assertEquals;

import com.android.tools.r8.debuginfo.DebugInfoInspector;
import com.android.tools.r8.jasmin.JasminBuilder.ClassFileVersion;
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
import com.android.tools.r8.utils.AndroidApp;
import com.google.common.collect.ImmutableList;
import org.junit.Test;

public class JumpSubroutineDebugInfoTests extends JasminTestBase {

  @Test
  public void testJsrWithStraightlineAndDebugInfoCode() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    MethodSignature foo = clazz.addStaticMethod("foo", ImmutableList.of("I"), "I",
        ".limit stack 3",
        ".limit locals 3",
        ".var 0 is x I from LabelInit to LabelExit",
        "LabelInit:",
        ".line 1",
        "  ldc 0",
        "  ldc 1",
        "  jsr LabelSub",
        "  ldc 2",
        "  jsr LabelSub",
        "  ldc 3",
        "  jsr LabelSub",
        ".line 2",
        "  ireturn",
        "LabelSub:",
        ".line 3",
        "  astore 1",
        "  iadd",
        "  istore 0", // store and load in local 'x' to ensure we don't optimize out the subroutine.
        ".line 4",
        "  iload 0",
        "  ret 1",
        "LabelExit:");

    clazz.addMainMethod(
        ".limit stack 3",
        ".limit locals 1",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  ldc 1",
        "  invokestatic Test/foo(I)I",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  return");

    String expected = "6";
    String javaResult = runOnJava(builder, clazz.name);
    assertEquals(expected, javaResult);
    AndroidApp d8App = compileWithD8(builder);
    String artResult = runOnArt(d8App, clazz.name);
    assertEquals(expected, artResult);

    DebugInfoInspector info = new DebugInfoInspector(d8App, clazz.name, foo);
    info.checkStartLine(1);
    // Check the subroutine line is duplicated 3 times.
    assertEquals(3, info.checkLineHasExactLocals(3, "x", "int"));
  }
}
