Package jadx.tests.integration.debuginfo

Source Code of jadx.tests.integration.debuginfo.TestLineNumbers$TestCls$Inner

package jadx.tests.integration.debuginfo;

import jadx.core.codegen.CodeWriter;
import jadx.core.dex.attributes.nodes.LineAttrNode;
import jadx.core.dex.nodes.ClassNode;
import jadx.core.dex.nodes.FieldNode;
import jadx.core.dex.nodes.MethodNode;
import jadx.tests.api.IntegrationTest;

import org.junit.Test;

import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;

public class TestLineNumbers extends IntegrationTest {

  public static class TestCls {
    int field;

    public void func() {
    }

    public static class Inner {
      int innerField;

      public void innerFunc() {
      }

      public void innerFunc2() {
        new Runnable() {
          @Override
          public void run() {
          }
        }.run();
      }

      public void innerFunc3() {
      }
    }
  }

  @Test
  public void test() {
    ClassNode cls = getClassNode(TestCls.class);
    String code = cls.getCode().toString();

    FieldNode field = cls.searchFieldByName("field");
    MethodNode func = cls.searchMethodByName("func()V");
    ClassNode inner = cls.getInnerClasses().get(0);
    MethodNode innerFunc = inner.searchMethodByName("innerFunc()V");
    MethodNode innerFunc2 = inner.searchMethodByName("innerFunc2()V");
    MethodNode innerFunc3 = inner.searchMethodByName("innerFunc3()V");
    FieldNode innerField = inner.searchFieldByName("innerField");

    // check source lines (available only for instructions and methods)
    int testClassLine = 18;
    assertEquals(testClassLine + 3, func.getSourceLine());
    assertEquals(testClassLine + 9, innerFunc.getSourceLine());
    assertEquals(testClassLine + 12, innerFunc2.getSourceLine());
    assertEquals(testClassLine + 20, innerFunc3.getSourceLine());

    // check decompiled lines
    String[] lines = code.split(CodeWriter.NL);
    checkLine(lines, field, "int field;");
    checkLine(lines, func, "public void func() {");
    checkLine(lines, inner, "public static class Inner {");
    checkLine(lines, innerField, "int innerField;");
    checkLine(lines, innerFunc, "public void innerFunc() {");
    checkLine(lines, innerFunc2, "public void innerFunc2() {");
    checkLine(lines, innerFunc3, "public void innerFunc3() {");
  }

  private static void checkLine(String[] lines, LineAttrNode node, String str) {
    int lineNumber = node.getDecompiledLine();
    String line = lines[lineNumber - 1];
    assertThat(line, containsString(str));
  }
}
TOP

Related Classes of jadx.tests.integration.debuginfo.TestLineNumbers$TestCls$Inner

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.