diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 247b141fe..6e323d456 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,25 +1,32 @@ -image: java:8 - variables: - GRADLE_OPTS: "-Dorg.gradle.daemon=false" - TERM: "dumb" + GRADLE_OPTS: "-Dorg.gradle.daemon=false" + TERM: "dumb" before_script: - - chmod +x gradlew + - chmod +x gradlew stages: - - build + - test + - check -build: - stage: build - before_script: - - export JADX_LAST_TAG="$(git describe --abbrev=0 --tags)" - - export JADX_VERSION="${JADX_LAST_TAG:1}-$(git rev-parse --short HEAD)" +java-8: + stage: test + image: openjdk:8 + script: ./gradlew clean build + +java-11: + stage: test + image: openjdk:11 + script: ./gradlew clean build + +check: + stage: check + image: openjdk:8 script: - - ./gradlew -g /cache/.gradle clean build jacocoTestReport - - ./gradlew -g /cache/.gradle clean sonarqube -Dsonar.host.url=$SONAR_HOST -Dsonar.organization=$SONAR_ORG -Dsonar.login=$SONAR_TOKEN - - ./gradlew -g /cache/.gradle clean dist + - export JADX_LAST_TAG="$(git describe --abbrev=0 --tags)" + - export JADX_VERSION="${JADX_LAST_TAG:1}-dev-$(git rev-parse --short HEAD)" + - ./gradlew clean sonarqube -Dsonar.host.url=$SONAR_HOST -Dsonar.organization=$SONAR_ORG -Dsonar.login=$SONAR_TOKEN -Dsonar.branch.name=dev + - ./gradlew clean dist artifacts: paths: - - build/jadx*.zip - - build/jadx*.exe + - build/jadx*.zip diff --git a/build.gradle b/build.gradle index e27970da9..db3f86c15 100644 --- a/build.gradle +++ b/build.gradle @@ -38,10 +38,15 @@ allprojects { compile 'org.slf4j:slf4j-api:1.7.26' testCompile 'ch.qos.logback:logback-classic:1.2.3' - testCompile 'junit:junit:4.12' testCompile 'org.hamcrest:hamcrest-library:2.1' - testCompile 'org.mockito:mockito-core:2.25.0' - testCompile 'org.spockframework:spock-core:1.1-groovy-2.4' + testCompile 'org.mockito:mockito-core:2.25.1' + + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.4.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.4.1' + } + + test { + useJUnitPlatform() } repositories { diff --git a/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java b/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java index b2eafb770..4d0288838 100644 --- a/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java +++ b/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java @@ -47,6 +47,9 @@ public class JadxCLIArgs { @Parameter(names = {"--no-imports"}, description = "disable use of imports, always write entire package name") protected boolean useImports = true; + @Parameter(names = {"--no-debug-info"}, description = "disable debug info") + protected boolean debugInfo = true; + @Parameter(names = "--no-replace-consts", description = "don't replace constant value with matching constant field") protected boolean replaceConsts = true; @@ -160,6 +163,7 @@ public class JadxCLIArgs { args.setRespectBytecodeAccModifiers(respectBytecodeAccessModifiers); args.setExportAsGradleProject(exportAsGradleProject); args.setUseImports(useImports); + args.setDebugInfo(debugInfo); return args; } @@ -203,6 +207,10 @@ public class JadxCLIArgs { return useImports; } + public boolean isDebugInfo() { + return debugInfo; + } + public boolean isDeobfuscationOn() { return deobfuscationOn; } diff --git a/jadx-cli/src/test/java/jadx/cli/JadxCLIArgsTest.java b/jadx-cli/src/test/java/jadx/cli/JadxCLIArgsTest.java index 7f8658fb4..4bd28622b 100644 --- a/jadx-cli/src/test/java/jadx/cli/JadxCLIArgsTest.java +++ b/jadx-cli/src/test/java/jadx/cli/JadxCLIArgsTest.java @@ -1,11 +1,11 @@ package jadx.cli; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class JadxCLIArgsTest { @@ -33,11 +33,14 @@ public class JadxCLIArgsTest { @Test public void testOptionsOverride() { assertThat(override(new JadxCLIArgs(), "--no-imports").isUseImports(), is(false)); + assertThat(override(new JadxCLIArgs(), "--no-debug-info").isDebugInfo(), is(false)); assertThat(override(new JadxCLIArgs(), "").isUseImports(), is(true)); JadxCLIArgs args = new JadxCLIArgs(); args.useImports = false; assertThat(override(args, "--no-imports").isUseImports(), is(false)); + args.debugInfo = false; + assertThat(override(args, "--no-debug-info").isDebugInfo(), is(false)); args = new JadxCLIArgs(); args.useImports = false; diff --git a/jadx-core/src/main/java/jadx/api/JadxArgs.java b/jadx-core/src/main/java/jadx/api/JadxArgs.java index 2c17b8000..6011cc2aa 100644 --- a/jadx-core/src/main/java/jadx/api/JadxArgs.java +++ b/jadx-core/src/main/java/jadx/api/JadxArgs.java @@ -27,6 +27,7 @@ public class JadxArgs { private boolean showInconsistentCode = false; private boolean useImports = true; + private boolean debugInfo = true; private boolean isSkipResources = false; private boolean isSkipSources = false; @@ -133,6 +134,14 @@ public class JadxArgs { this.useImports = useImports; } + public boolean isDebugInfo() { + return debugInfo; + } + + public void setDebugInfo(boolean debugInfo) { + this.debugInfo = debugInfo; + } + public boolean isSkipResources() { return isSkipResources; } diff --git a/jadx-core/src/main/java/jadx/api/JadxArgsValidator.java b/jadx-core/src/main/java/jadx/api/JadxArgsValidator.java index 7604b39e5..dab7678f0 100644 --- a/jadx-core/src/main/java/jadx/api/JadxArgsValidator.java +++ b/jadx-core/src/main/java/jadx/api/JadxArgsValidator.java @@ -77,7 +77,7 @@ public class JadxArgsValidator { if (pos != -1) { outDirName = name.substring(0, pos); } else { - outDirName = name + "-" + JadxArgs.DEFAULT_OUT_DIR; + outDirName = name + '-' + JadxArgs.DEFAULT_OUT_DIR; } LOG.info("output directory: {}", outDirName); outDir = new File(outDirName); diff --git a/jadx-core/src/main/java/jadx/api/JavaField.java b/jadx-core/src/main/java/jadx/api/JavaField.java index 765ca7528..41794d050 100644 --- a/jadx-core/src/main/java/jadx/api/JavaField.java +++ b/jadx-core/src/main/java/jadx/api/JavaField.java @@ -21,7 +21,7 @@ public final class JavaField implements JavaNode { @Override public String getFullName() { - return parent.getFullName() + "." + getName(); + return parent.getFullName() + '.' + getName(); } @Override diff --git a/jadx-core/src/main/java/jadx/api/ResourceFile.java b/jadx-core/src/main/java/jadx/api/ResourceFile.java index c550f403e..c5f56f5df 100644 --- a/jadx-core/src/main/java/jadx/api/ResourceFile.java +++ b/jadx-core/src/main/java/jadx/api/ResourceFile.java @@ -70,6 +70,6 @@ public class ResourceFile { @Override public String toString() { - return "ResourceFile{name='" + name + '\'' + ", type=" + type + "}"; + return "ResourceFile{name='" + name + '\'' + ", type=" + type + '}'; } } diff --git a/jadx-core/src/main/java/jadx/core/Jadx.java b/jadx-core/src/main/java/jadx/core/Jadx.java index 4c699cf20..61de7ab72 100644 --- a/jadx-core/src/main/java/jadx/core/Jadx.java +++ b/jadx-core/src/main/java/jadx/core/Jadx.java @@ -11,7 +11,6 @@ import org.slf4j.LoggerFactory; import jadx.api.JadxArgs; import jadx.core.dex.visitors.ClassModifier; -import jadx.core.dex.visitors.shrink.CodeShrinkVisitor; import jadx.core.dex.visitors.ConstInlineVisitor; import jadx.core.dex.visitors.ConstructorVisitor; import jadx.core.dex.visitors.DependencyCollector; @@ -42,6 +41,7 @@ import jadx.core.dex.visitors.regions.LoopRegionVisitor; import jadx.core.dex.visitors.regions.RegionMakerVisitor; import jadx.core.dex.visitors.regions.ReturnVisitor; import jadx.core.dex.visitors.regions.variables.ProcessVariables; +import jadx.core.dex.visitors.shrink.CodeShrinkVisitor; import jadx.core.dex.visitors.ssa.SSATransform; import jadx.core.dex.visitors.typeinference.TypeInferenceVisitor; @@ -62,7 +62,10 @@ public class Jadx { if (args.isFallbackMode()) { passes.add(new FallbackModeVisitor()); } else { - passes.add(new DebugInfoParseVisitor()); + if (args.isDebugInfo()) { + passes.add(new DebugInfoParseVisitor()); + } + passes.add(new BlockSplitter()); if (args.isRawCFGOutput()) { passes.add(DotGraphVisitor.dumpRaw()); @@ -78,7 +81,9 @@ public class Jadx { passes.add(new MarkFinallyVisitor()); passes.add(new ConstInlineVisitor()); passes.add(new TypeInferenceVisitor()); - passes.add(new DebugInfoApplyVisitor()); + if (args.isDebugInfo()) { + passes.add(new DebugInfoApplyVisitor()); + } passes.add(new ModVisitor()); passes.add(new CodeShrinkVisitor()); diff --git a/jadx-core/src/main/java/jadx/core/clsp/ClsSet.java b/jadx-core/src/main/java/jadx/core/clsp/ClsSet.java index 338fac8cd..ff2abcf16 100644 --- a/jadx-core/src/main/java/jadx/core/clsp/ClsSet.java +++ b/jadx-core/src/main/java/jadx/core/clsp/ClsSet.java @@ -119,7 +119,7 @@ public class ClsSet { } else if (outputName.endsWith(".jar")) { ZipOutputStream out = new ZipOutputStream(outputStream); try { - out.putNextEntry(new ZipEntry(CLST_PKG_PATH + "/" + CLST_FILENAME)); + out.putNextEntry(new ZipEntry(CLST_PKG_PATH + '/' + CLST_FILENAME)); save(out); } finally { close(out); diff --git a/jadx-core/src/main/java/jadx/core/codegen/AnnotationGen.java b/jadx-core/src/main/java/jadx/core/codegen/AnnotationGen.java index bb53ac1c2..305befc16 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/AnnotationGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/AnnotationGen.java @@ -151,7 +151,7 @@ public class AnnotationGen { InsnGen.makeStaticFieldAccess(code, field, classGen); } else if (val instanceof Iterable) { code.add('{'); - Iterator it = ((Iterable) val).iterator(); + Iterator it = ((Iterable) val).iterator(); while (it.hasNext()) { Object obj = it.next(); encodeValue(code, obj); @@ -164,7 +164,7 @@ public class AnnotationGen { formatAnnotation(code, (Annotation) val); } else { // TODO: also can be method values - throw new JadxRuntimeException("Can't decode value: " + val + " (" + val.getClass() + ")"); + throw new JadxRuntimeException("Can't decode value: " + val + " (" + val.getClass() + ')'); } } diff --git a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java index 14732d245..ca988ad20 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java @@ -143,7 +143,7 @@ public class ClassGen { clsCode.attachDefinition(cls); clsCode.add(cls.getShortName()); - addGenericMap(clsCode, cls.getGenericMap()); + addGenericMap(clsCode, cls.getGenericMap(), true); clsCode.add(' '); ArgType sup = cls.getSuperClass(); @@ -174,7 +174,7 @@ public class ClassGen { } } - public boolean addGenericMap(CodeWriter code, Map> gmap) { + public boolean addGenericMap(CodeWriter code, Map> gmap, boolean classDeclaration) { if (gmap == null || gmap.isEmpty()) { return false; } @@ -199,6 +199,10 @@ public class ClassGen { code.add(g.getObject()); } else { useClass(code, g); + + if (classDeclaration && !cls.getAlias().isInner()) { + addImport(ClassInfo.extCls(cls.root(), g)); + } } if (it.hasNext()) { code.add(" & "); @@ -532,7 +536,7 @@ public class ClassGen { && importCls.getShortName().equals(shortName)) { if (extClsInfo.isInner()) { String parent = useClassInternal(useCls, extClsInfo.getParentClass().getAlias()); - return parent + "." + shortName; + return parent + '.' + shortName; } else { return fullName; } diff --git a/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java b/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java index 332d43a84..c27dc6598 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java @@ -92,7 +92,7 @@ public class MethodGen { code.add(mth.isVirtual() ? "/* virtual */ " : "/* direct */ "); } - if (classGen.addGenericMap(code, mth.getGenericMap())) { + if (classGen.addGenericMap(code, mth.getGenericMap(), false)) { code.add(' '); } if (ai.isConstructor()) { @@ -230,7 +230,7 @@ public class MethodGen { } if (addLabels && needLabel(insn, prevInsn)) { code.decIndent(); - code.startLine(getLabelName(insn.getOffset()) + ":"); + code.startLine(getLabelName(insn.getOffset()) + ':'); code.incIndent(); } try { diff --git a/jadx-core/src/main/java/jadx/core/codegen/NameGen.java b/jadx-core/src/main/java/jadx/core/codegen/NameGen.java index ff1bc4fe5..b1588a935 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/NameGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/NameGen.java @@ -126,7 +126,7 @@ public class NameGen { String name = var.getName(); String varName = name != null ? name : guessName(var); if (NameMapper.isReserved(varName)) { - varName = varName + "R"; + varName = varName + 'R'; } if (!NameMapper.isValidIdentifier(varName)) { varName = getFallbackName(var); diff --git a/jadx-core/src/main/java/jadx/core/codegen/TypeGen.java b/jadx-core/src/main/java/jadx/core/codegen/TypeGen.java index 3a68201e5..4c9b2266d 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/TypeGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/TypeGen.java @@ -153,7 +153,7 @@ public class TypeGen { if (d == Double.MIN_NORMAL) { return "Double.MIN_NORMAL"; } - return Double.toString(d) + "d"; + return Double.toString(d) + 'd'; } public static String formatFloat(float f) { @@ -175,6 +175,6 @@ public class TypeGen { if (f == Float.MIN_NORMAL) { return "Float.MIN_NORMAL"; } - return Float.toString(f) + "f"; + return Float.toString(f) + 'f'; } } diff --git a/jadx-core/src/main/java/jadx/core/deobf/Deobfuscator.java b/jadx-core/src/main/java/jadx/core/deobf/Deobfuscator.java index e555b05de..a82e9f5ac 100644 --- a/jadx-core/src/main/java/jadx/core/deobf/Deobfuscator.java +++ b/jadx-core/src/main/java/jadx/core/deobf/Deobfuscator.java @@ -17,6 +17,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import jadx.api.JadxArgs; +import jadx.core.dex.attributes.AFlag; import jadx.core.dex.attributes.AType; import jadx.core.dex.attributes.nodes.SourceFileAttr; import jadx.core.dex.info.ClassInfo; @@ -225,6 +226,9 @@ public class Deobfuscator { clsInfo.rename(cls.dex().root(), fullName); } for (FieldNode field : cls.getFields()) { + if (field.contains(AFlag.DONT_RENAME)) { + continue; + } renameField(field); } for (MethodNode mth : cls.getMethods()) { @@ -391,7 +395,7 @@ public class Deobfuscator { return null; } } - ClassNode otherCls = cls.dex().root().searchClassByName(cls.getPackage() + "." + name); + ClassNode otherCls = cls.dex().root().searchClassByName(cls.getPackage() + '.' + name); if (otherCls != null) { return null; } @@ -481,7 +485,7 @@ public class Deobfuscator { private String prepareNamePart(String name) { if (name.length() > maxLength) { - return "x" + Integer.toHexString(name.hashCode()); + return 'x' + Integer.toHexString(name.hashCode()); } return NameMapper.removeInvalidCharsMiddle(name); } diff --git a/jadx-core/src/main/java/jadx/core/deobf/NameMapper.java b/jadx-core/src/main/java/jadx/core/deobf/NameMapper.java index 9262f051f..8d6ba6225 100644 --- a/jadx-core/src/main/java/jadx/core/deobf/NameMapper.java +++ b/jadx-core/src/main/java/jadx/core/deobf/NameMapper.java @@ -126,7 +126,7 @@ public class NameMapper { *

*/ public static String removeInvalidCharsMiddle(String name) { - if (isValidIdentifier(name) && isAllCharsPrintable(name)) { + if (isValidIdentifier(name)) { return name; } int len = name.length(); diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java b/jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java index 64a9628de..27cec6bc1 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java @@ -15,6 +15,7 @@ public enum AFlag { DONT_WRAP, DONT_INLINE, DONT_GENERATE, // process as usual, but don't output to generated code + DONT_RENAME, // do not rename during deobfuscation REMOVE, // can be completely removed ADDED_TO_REGION, diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/AType.java b/jadx-core/src/main/java/jadx/core/dex/attributes/AType.java index c18f01f67..aaeccd901 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/AType.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/AType.java @@ -61,7 +61,4 @@ public class AType { // registers public static final AType REG_DEBUG_INFO = new AType<>(); - - private AType() { - } } diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/AttributeStorage.java b/jadx-core/src/main/java/jadx/core/dex/attributes/AttributeStorage.java index 259cbf7fe..caefb44d6 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/AttributeStorage.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/AttributeStorage.java @@ -121,6 +121,6 @@ public class AttributeStorage { if (list.isEmpty()) { return ""; } - return "A[" + Utils.listToString(list) + "]"; + return "A[" + Utils.listToString(list) + ']'; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/annotations/Annotation.java b/jadx-core/src/main/java/jadx/core/dex/attributes/annotations/Annotation.java index 9b23c0b2d..99ad42917 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/annotations/Annotation.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/annotations/Annotation.java @@ -42,6 +42,6 @@ public class Annotation { @Override public String toString() { - return "Annotation[" + visibility + ", " + atype + ", " + values + "]"; + return "Annotation[" + visibility + ", " + atype + ", " + values + ']'; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/annotations/AnnotationsList.java b/jadx-core/src/main/java/jadx/core/dex/attributes/annotations/AnnotationsList.java index 72fc6d8e6..3278ca538 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/annotations/AnnotationsList.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/annotations/AnnotationsList.java @@ -12,7 +12,7 @@ import jadx.core.utils.Utils; public class AnnotationsList implements IAttribute { - public static final AnnotationsList EMPTY = new AnnotationsList(Collections.emptyList()); + public static final AnnotationsList EMPTY = new AnnotationsList(Collections.emptyList()); private final Map map; diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/EdgeInsnAttr.java b/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/EdgeInsnAttr.java index c07ca4e5d..c0f4c3f34 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/EdgeInsnAttr.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/EdgeInsnAttr.java @@ -43,6 +43,6 @@ public class EdgeInsnAttr implements IAttribute { @Override public String toString() { - return "EDGE_INSN: " + start + "->" + end + " " + insn; + return "EDGE_INSN: " + start + "->" + end + ' ' + insn; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/FieldReplaceAttr.java b/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/FieldReplaceAttr.java index 87ac110f0..62c7201b0 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/FieldReplaceAttr.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/FieldReplaceAttr.java @@ -44,6 +44,6 @@ public class FieldReplaceAttr implements IAttribute { @Override public String toString() { - return "REPLACE: " + replaceType + " " + replaceObj; + return "REPLACE: " + replaceType + ' ' + replaceObj; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/JadxError.java b/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/JadxError.java index 12e0766a7..913927eee 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/JadxError.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/JadxError.java @@ -34,9 +34,9 @@ public class JadxError { } if (cause != null) { str.append(cause.getClass()); - str.append(":"); + str.append(':'); str.append(cause.getMessage()); - str.append("\n"); + str.append('\n'); str.append(Utils.getStackTrace(cause)); } return str.toString(); diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/PhiListAttr.java b/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/PhiListAttr.java index da0b18767..cba4c9010 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/PhiListAttr.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/PhiListAttr.java @@ -25,10 +25,10 @@ public class PhiListAttr implements IAttribute { StringBuilder sb = new StringBuilder(); sb.append("PHI: "); for (PhiInsn phiInsn : list) { - sb.append('r').append(phiInsn.getResult().getRegNum()).append(" "); + sb.append('r').append(phiInsn.getResult().getRegNum()).append(' '); } for (PhiInsn phiInsn : list) { - sb.append("\n ").append(phiInsn).append(" ").append(phiInsn.getAttributesString()); + sb.append("\n ").append(phiInsn).append(' ').append(phiInsn.getAttributesString()); } return sb.toString(); } diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/RegDebugInfoAttr.java b/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/RegDebugInfoAttr.java index a08fd17ec..531794775 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/RegDebugInfoAttr.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/nodes/RegDebugInfoAttr.java @@ -53,6 +53,6 @@ public class RegDebugInfoAttr implements IAttribute { @Override public String toString() { - return "D('" + name + "' " + type + ")"; + return "D('" + name + "' " + type + ')'; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/info/AccessInfo.java b/jadx-core/src/main/java/jadx/core/dex/info/AccessInfo.java index 0c511a336..b08485ce1 100644 --- a/jadx-core/src/main/java/jadx/core/dex/info/AccessInfo.java +++ b/jadx-core/src/main/java/jadx/core/dex/info/AccessInfo.java @@ -203,6 +203,6 @@ public class AccessInfo { @Override public String toString() { - return "AccessInfo: " + type + " 0x" + Integer.toHexString(accFlags) + " (" + rawString() + ")"; + return "AccessInfo: " + type + " 0x" + Integer.toHexString(accFlags) + " (" + rawString() + ')'; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/info/ClassInfo.java b/jadx-core/src/main/java/jadx/core/dex/info/ClassInfo.java index 42e5688f0..fb9d1f916 100644 --- a/jadx-core/src/main/java/jadx/core/dex/info/ClassInfo.java +++ b/jadx-core/src/main/java/jadx/core/dex/info/ClassInfo.java @@ -91,7 +91,7 @@ public final class ClassInfo implements Comparable { int sep = clsName.lastIndexOf('$'); if (canBeInner && sep > 0 && sep != clsName.length() - 1) { - String parClsName = pkg + "." + clsName.substring(0, sep); + String parClsName = pkg + '.' + clsName.substring(0, sep); if (pkg.isEmpty()) { parClsName = clsName.substring(0, sep); } @@ -110,7 +110,7 @@ public final class ClassInfo implements Comparable { String innerSep = raw ? "$" : "."; return parentClass.makeFullClsName(parentClass.getShortName(), raw) + innerSep + shortName; } - return pkg.isEmpty() ? shortName : pkg + "." + shortName; + return pkg.isEmpty() ? shortName : pkg + '.' + shortName; } public String makeRawFullName() { @@ -148,7 +148,7 @@ public final class ClassInfo implements Comparable { if (parentClass == null) { return name; } - return parentClass.getNameWithoutPackage() + "." + name; + return parentClass.getNameWithoutPackage() + '.' + name; } public ClassInfo getParentClass() { diff --git a/jadx-core/src/main/java/jadx/core/dex/info/FieldInfo.java b/jadx-core/src/main/java/jadx/core/dex/info/FieldInfo.java index 451c757b2..983412c6e 100644 --- a/jadx-core/src/main/java/jadx/core/dex/info/FieldInfo.java +++ b/jadx-core/src/main/java/jadx/core/dex/info/FieldInfo.java @@ -54,11 +54,11 @@ public final class FieldInfo { } public String getFullId() { - return declClass.getFullName() + "." + name + ":" + TypeGen.signature(type); + return declClass.getFullName() + '.' + name + ':' + TypeGen.signature(type); } public String getRawFullId() { - return declClass.makeRawFullName() + "." + name + ":" + TypeGen.signature(type); + return declClass.makeRawFullName() + '.' + name + ':' + TypeGen.signature(type); } public boolean isRenamed() { @@ -93,6 +93,6 @@ public final class FieldInfo { @Override public String toString() { - return declClass + "." + name + " " + type; + return declClass + "." + name + ' ' + type; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/info/MethodInfo.java b/jadx-core/src/main/java/jadx/core/dex/info/MethodInfo.java index a53ec0f56..7e236097f 100644 --- a/jadx-core/src/main/java/jadx/core/dex/info/MethodInfo.java +++ b/jadx-core/src/main/java/jadx/core/dex/info/MethodInfo.java @@ -65,15 +65,15 @@ public final class MethodInfo { } public String getFullName() { - return declClass.getFullName() + "." + name; + return declClass.getFullName() + '.' + name; } public String getFullId() { - return declClass.getFullName() + "." + shortId; + return declClass.getFullName() + '.' + shortId; } public String getRawFullId() { - return declClass.makeRawFullName() + "." + shortId; + return declClass.makeRawFullName() + '.' + shortId; } /** @@ -151,7 +151,7 @@ public final class MethodInfo { @Override public String toString() { - return declClass.getFullName() + "." + name - + "(" + Utils.listToString(args) + "):" + retType; + return declClass.getFullName() + '.' + name + + '(' + Utils.listToString(args) + "):" + retType; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/ArithNode.java b/jadx-core/src/main/java/jadx/core/dex/instructions/ArithNode.java index 48a191af9..17277a9af 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/ArithNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/ArithNode.java @@ -76,8 +76,8 @@ public class ArithNode extends InsnNode { return InsnUtils.formatOffset(offset) + ": " + InsnUtils.insnTypeToString(insnType) + getResult() + " = " - + getArg(0) + " " - + op.getSymbol() + " " + + getArg(0) + ' ' + + op.getSymbol() + ' ' + getArg(1); } } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/ConstClassNode.java b/jadx-core/src/main/java/jadx/core/dex/instructions/ConstClassNode.java index c6ee7c1e9..2a6167ac8 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/ConstClassNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/ConstClassNode.java @@ -35,6 +35,6 @@ public final class ConstClassNode extends InsnNode { @Override public String toString() { - return super.toString() + " " + clsType; + return super.toString() + ' ' + clsType; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/ConstStringNode.java b/jadx-core/src/main/java/jadx/core/dex/instructions/ConstStringNode.java index 9fd2d9366..f6ad50fb0 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/ConstStringNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/ConstStringNode.java @@ -34,6 +34,6 @@ public final class ConstStringNode extends InsnNode { @Override public String toString() { - return super.toString() + " \"" + str + "\""; + return super.toString() + " \"" + str + '"'; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/IfNode.java b/jadx-core/src/main/java/jadx/core/dex/instructions/IfNode.java index b72b25794..98feb1019 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/IfNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/IfNode.java @@ -127,7 +127,7 @@ public class IfNode extends GotoNode { public String toString() { return InsnUtils.formatOffset(offset) + ": " + InsnUtils.insnTypeToString(insnType) - + getArg(0) + " " + op.getSymbol() + " " + getArg(1) + + getArg(0) + ' ' + op.getSymbol() + ' ' + getArg(1) + " -> " + (thenBlock != null ? thenBlock : InsnUtils.formatOffset(target)); } } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/IndexInsnNode.java b/jadx-core/src/main/java/jadx/core/dex/instructions/IndexInsnNode.java index bdd129ca4..66cea5297 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/IndexInsnNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/IndexInsnNode.java @@ -47,7 +47,7 @@ public class IndexInsnNode extends InsnNode { + Utils.listToString(getArguments()); default: - return super.toString() + " " + InsnUtils.indexToString(index); + return super.toString() + ' ' + InsnUtils.indexToString(index); } } } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java b/jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java index 06ff001bd..51d0b568e 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java @@ -579,7 +579,7 @@ public class InsnDecoder { InsnArg.reg(insn, 0, ArgType.UNKNOWN_OBJECT)); default: - throw new DecodeException("Unknown instruction: '" + OpcodeInfo.getName(insn.getOpcode()) + "'"); + throw new DecodeException("Unknown instruction: '" + OpcodeInfo.getName(insn.getOpcode()) + '\''); } } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/InvokeNode.java b/jadx-core/src/main/java/jadx/core/dex/instructions/InvokeNode.java index 217fa08e5..7342c2e75 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/InvokeNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/InvokeNode.java @@ -73,7 +73,7 @@ public class InvokeNode extends InsnNode implements CallMthInterface { + InsnUtils.insnTypeToString(insnType) + (getResult() == null ? "" : getResult() + " = ") + Utils.listToString(getArguments()) - + " " + mth + + ' ' + mth + " type: " + type; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/ArgType.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/ArgType.java index 406f4633c..6bbb103ea 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/ArgType.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/ArgType.java @@ -255,7 +255,7 @@ public abstract class ArgType { if (bounds == 0) { return "?"; } - return "? " + (bounds == -1 ? "super" : "extends") + " " + type; + return "? " + (bounds == -1 ? "super" : "extends") + ' ' + type; } } @@ -271,7 +271,7 @@ public abstract class ArgType { } public GenericObject(GenericObject outerType, String innerName, ArgType[] generics) { - super(outerType.getObject() + "$" + innerName); + super(outerType.getObject() + '$' + innerName); this.outerType = outerType; this.generics = generics; this.hash = outerType.hashCode() + 31 * innerName.hashCode() @@ -301,7 +301,7 @@ public abstract class ArgType { @Override public String toString() { - return super.toString() + "<" + Utils.arrayToStr(generics) + ">"; + return super.toString() + '<' + Utils.arrayToStr(generics) + '>'; } } @@ -415,7 +415,7 @@ public abstract class ArgType { if (possibleTypes.length == PrimitiveType.values().length) { return "?"; } else { - return "?[" + Utils.arrayToStr(possibleTypes) + "]"; + return "?[" + Utils.arrayToStr(possibleTypes) + ']'; } } } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/CodeVar.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/CodeVar.java index 0ba886361..8685e4875 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/CodeVar.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/CodeVar.java @@ -94,6 +94,6 @@ public class CodeVar { @Override public String toString() { - return (isFinal ? "final " : "") + type + " " + name; + return (isFinal ? "final " : "") + type + ' ' + name; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/FieldArg.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/FieldArg.java index c4b5662c5..8d2767b6c 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/FieldArg.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/FieldArg.java @@ -81,6 +81,6 @@ public final class FieldArg extends RegisterArg { @Override public String toString() { - return "(" + field + ")"; + return "(" + field + ')'; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnWrapArg.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnWrapArg.java index cc28a59a7..d65eea995 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnWrapArg.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnWrapArg.java @@ -62,6 +62,6 @@ public final class InsnWrapArg extends InsnArg { @Override public String toString() { - return "(wrap: " + type + "\n " + wrappedInsn + ")"; + return "(wrap: " + type + "\n " + wrappedInsn + ')'; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/LiteralArg.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/LiteralArg.java index 9d0892796..4e5740a69 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/LiteralArg.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/LiteralArg.java @@ -74,10 +74,10 @@ public final class LiteralArg extends InsnArg { if (getType().equals(ArgType.BOOLEAN) && (value.equals("true") || value.equals("false"))) { return value; } - return "(" + value + " " + type + ")"; + return '(' + value + ' ' + type + ')'; } catch (JadxRuntimeException ex) { // can't convert literal to string - return "(" + literal + " " + type + ")"; + return "(" + literal + ' ' + type + ')'; } } } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/NamedArg.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/NamedArg.java index 5e53e272c..640f43ecd 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/NamedArg.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/NamedArg.java @@ -44,6 +44,6 @@ public final class NamedArg extends InsnArg implements Named { @Override public String toString() { - return "(" + name + " " + type + ")"; + return '(' + name + ' ' + type + ')'; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/SSAVar.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/SSAVar.java index 78d06ad63..e8612e3d5 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/SSAVar.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/SSAVar.java @@ -160,14 +160,14 @@ public class SSAVar extends AttrNode { } public String toShortString() { - return "r" + regNum + "v" + version; + return "r" + regNum + 'v' + version; } @Override public String toString() { return toShortString() + (StringUtils.notEmpty(getName()) ? " '" + getName() + "' " : "") - + " " + typeInfo.getType(); + + ' ' + typeInfo.getType(); } public String getDetailedVarInfo(MethodNode mth) { diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/mods/ConstructorInsn.java b/jadx-core/src/main/java/jadx/core/dex/instructions/mods/ConstructorInsn.java index 9a39665ae..21eb17b97 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/mods/ConstructorInsn.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/mods/ConstructorInsn.java @@ -106,6 +106,6 @@ public class ConstructorInsn extends InsnNode implements CallMthInterface { @Override public String toString() { - return super.toString() + " " + callMth + " " + callType; + return super.toString() + ' ' + callMth + ' ' + callType; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java index 1ab674ba7..4c7c60c54 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java @@ -192,6 +192,6 @@ public class BlockNode extends AttrNode implements IBlock { @Override public String toString() { - return "B:" + id + ":" + InsnUtils.formatOffset(startOffset); + return "B:" + id + ':' + InsnUtils.formatOffset(startOffset); } } diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java index 3ae9e8de3..e8cff65c4 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java @@ -231,7 +231,7 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode { return; } if (fileName.contains("$") - && fileName.endsWith("$" + name)) { + && fileName.endsWith('$' + name)) { return; } ClassInfo parentClass = clsInfo.getTopParentClass(); diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java index bb1a02dd3..0d16099d5 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java @@ -685,7 +685,7 @@ public class MethodNode extends LineAttrNode implements ILoadable, ICodeNode { @Override public String toString() { return parentClass + "." + mthInfo.getName() - + "(" + Utils.listToString(mthInfo.getArgumentsTypes()) + "):" + + '(' + Utils.listToString(mthInfo.getArgumentsTypes()) + "):" + retType; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/regions/Region.java b/jadx-core/src/main/java/jadx/core/dex/regions/Region.java index 9a6d9aefc..70e179aa4 100644 --- a/jadx-core/src/main/java/jadx/core/dex/regions/Region.java +++ b/jadx-core/src/main/java/jadx/core/dex/regions/Region.java @@ -53,6 +53,6 @@ public final class Region extends AbstractRegion { @Override public String toString() { - return "R" + baseString(); + return 'R' + baseString(); } } diff --git a/jadx-core/src/main/java/jadx/core/dex/regions/conditions/Compare.java b/jadx-core/src/main/java/jadx/core/dex/regions/conditions/Compare.java index 10e83e0b6..cd544828f 100644 --- a/jadx-core/src/main/java/jadx/core/dex/regions/conditions/Compare.java +++ b/jadx-core/src/main/java/jadx/core/dex/regions/conditions/Compare.java @@ -44,6 +44,6 @@ public final class Compare { @Override public String toString() { - return getA() + " " + getOp().getSymbol() + " " + getB(); + return getA() + " " + getOp().getSymbol() + ' ' + getB(); } } diff --git a/jadx-core/src/main/java/jadx/core/dex/regions/conditions/IfCondition.java b/jadx-core/src/main/java/jadx/core/dex/regions/conditions/IfCondition.java index 75ffd9446..14644ae6e 100644 --- a/jadx-core/src/main/java/jadx/core/dex/regions/conditions/IfCondition.java +++ b/jadx-core/src/main/java/jadx/core/dex/regions/conditions/IfCondition.java @@ -226,7 +226,7 @@ public final class IfCondition { case TERNARY: return first() + " ? " + second() + " : " + third(); case NOT: - return "!(" + first() + ")"; + return "!(" + first() + ')'; case AND: case OR: String op = mode == Mode.OR ? " || " : " && "; diff --git a/jadx-core/src/main/java/jadx/core/dex/trycatch/ExcHandlerAttr.java b/jadx-core/src/main/java/jadx/core/dex/trycatch/ExcHandlerAttr.java index c4ac90640..2ccb232b8 100644 --- a/jadx-core/src/main/java/jadx/core/dex/trycatch/ExcHandlerAttr.java +++ b/jadx-core/src/main/java/jadx/core/dex/trycatch/ExcHandlerAttr.java @@ -30,6 +30,6 @@ public class ExcHandlerAttr implements IAttribute { public String toString() { return "ExcHandler: " + (handler.isFinally() ? " FINALLY" - : handler.catchTypeStr() + " " + handler.getArg()); + : handler.catchTypeStr() + ' ' + handler.getArg()); } } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/DotGraphVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/DotGraphVisitor.java index 0dcf289ca..301062339 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/DotGraphVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/DotGraphVisitor.java @@ -96,8 +96,8 @@ public class DotGraphVisitor extends AbstractVisitor { dot.startLine("MethodNode[shape=record,label=\"{"); dot.add(escape(mth.getAccessFlags().makeString())); dot.add(escape(mth.getReturnType() + " " - + mth.getParentClass() + "." + mth.getName() - + "(" + Utils.listToString(mth.getArguments(true)) + ") ")); + + mth.getParentClass() + '.' + mth.getName() + + '(' + Utils.listToString(mth.getArguments(true)) + ") ")); String attrs = attributesString(mth); if (!attrs.isEmpty()) { @@ -241,9 +241,9 @@ public class DotGraphVisitor extends AbstractVisitor { if (c instanceof BlockNode) { name = "Node_" + ((BlockNode) c).getId(); } else if (c instanceof IBlock) { - name = "Node_" + c.getClass().getSimpleName() + "_" + c.hashCode(); + name = "Node_" + c.getClass().getSimpleName() + '_' + c.hashCode(); } else { - name = "cluster_" + c.getClass().getSimpleName() + "_" + c.hashCode(); + name = "cluster_" + c.getClass().getSimpleName() + '_' + c.hashCode(); } return name; } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java index 4f91ed490..9595d72fa 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java @@ -76,10 +76,11 @@ public class RenameVisitor extends AbstractVisitor { String newShortName = fixClsShortName(clsName); if (!newShortName.equals(clsName)) { classInfo.rename(cls.root(), alias.makeFullClsName(newShortName, true)); + alias = classInfo.getAlias(); } if (alias.getPackage().isEmpty()) { String fullName = alias.makeFullClsName(alias.getShortName(), true); - String newFullName = Consts.DEFAULT_PACKAGE_NAME + "." + fullName; + String newFullName = Consts.DEFAULT_PACKAGE_NAME + '.' + fullName; classInfo.rename(cls.root(), newFullName); } } @@ -92,7 +93,11 @@ public class RenameVisitor extends AbstractVisitor { if (firstChar == '$') { return 'C' + NameMapper.removeInvalidCharsMiddle(clsName); } - return NameMapper.removeInvalidChars(clsName, "C"); + String cleanClsName = NameMapper.removeInvalidChars(clsName, "C"); + if (!NameMapper.isValidIdentifier(cleanClsName)) { + return 'C' + cleanClsName; + } + return cleanClsName; } private void checkFields(ClassNode cls) { diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/helpers/InsnsSlice.java b/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/helpers/InsnsSlice.java index 243d1bd63..f8eccab4d 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/helpers/InsnsSlice.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/helpers/InsnsSlice.java @@ -65,8 +65,8 @@ public class InsnsSlice { public String toString() { return "{[" + insnsList.stream().map(insn -> insn.getType().toString()).collect(Collectors.joining(", ")) - + "]" + + ']' + (complete ? " complete" : "") - + "}"; + + '}'; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/debuginfo/LocalVar.java b/jadx-core/src/main/java/jadx/core/dex/visitors/debuginfo/LocalVar.java index 5d5612ef9..f20044a60 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/debuginfo/LocalVar.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/debuginfo/LocalVar.java @@ -113,7 +113,7 @@ public final class LocalVar { @Override public String toString() { return InsnUtils.formatOffset(startAddr) - + "-" + (isEnd ? InsnUtils.formatOffset(endAddr) : " ") + + '-' + (isEnd ? InsnUtils.formatOffset(endAddr) : " ") + ": r" + regNum + " '" + name + "' " + type; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java index 8429ad7f8..34cc99d5b 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java @@ -140,7 +140,7 @@ public class IfRegionVisitor extends AbstractVisitor { || ifRegion.getElseRegion().contains(AFlag.ELSE_IF_CHAIN)) { return false; } - if (!hasBranchTerminator(ifRegion.getThenRegion())) { + if (!RegionUtils.hasExitBlock(ifRegion.getThenRegion())) { return false; } // code style check: @@ -162,12 +162,6 @@ public class IfRegionVisitor extends AbstractVisitor { return false; } - private static boolean hasBranchTerminator(IContainer region) { - // TODO: check for exception throw - return RegionUtils.hasExitBlock(region) - || RegionUtils.hasBreakInsn(region); - } - private static void invertIfRegion(IfRegion ifRegion) { IContainer elseRegion = ifRegion.getElseRegion(); if (elseRegion != null) { diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/LoopRegionVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/LoopRegionVisitor.java index 866bb2f88..fb653959f 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/LoopRegionVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/LoopRegionVisitor.java @@ -33,9 +33,9 @@ import jadx.core.dex.regions.loops.ForLoop; import jadx.core.dex.regions.loops.LoopRegion; import jadx.core.dex.regions.loops.LoopType; import jadx.core.dex.visitors.AbstractVisitor; -import jadx.core.dex.visitors.shrink.CodeShrinkVisitor; import jadx.core.dex.visitors.JadxVisitor; import jadx.core.dex.visitors.regions.variables.ProcessVariables; +import jadx.core.dex.visitors.shrink.CodeShrinkVisitor; import jadx.core.utils.BlockUtils; import jadx.core.utils.RegionUtils; import jadx.core.utils.exceptions.JadxOverflowException; @@ -125,7 +125,7 @@ public class LoopRegionVisitor extends AbstractVisitor implements IRegionVisitor // all checks passed initInsn.add(AFlag.DONT_GENERATE); incrInsn.add(AFlag.DONT_GENERATE); - LoopType arrForEach = checkArrayForEach(mth, initInsn, incrInsn, condition); + LoopType arrForEach = checkArrayForEach(mth, loopRegion, initInsn, incrInsn, condition); if (arrForEach != null) { loopRegion.setType(arrForEach); } else { @@ -134,7 +134,7 @@ public class LoopRegionVisitor extends AbstractVisitor implements IRegionVisitor return true; } - private static LoopType checkArrayForEach(MethodNode mth, InsnNode initInsn, InsnNode incrInsn, + private static LoopType checkArrayForEach(MethodNode mth, LoopRegion loopRegion, InsnNode initInsn, InsnNode incrInsn, IfCondition condition) { if (!(incrInsn instanceof ArithNode)) { return null; @@ -195,6 +195,9 @@ public class LoopRegionVisitor extends AbstractVisitor implements IRegionVisitor if (iterVar == null) { return null; } + if (!usedOnlyInLoop(mth, loopRegion, iterVar)) { + return null; + } // array for each loop confirmed incrInsn.getResult().add(AFlag.DONT_GENERATE); diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java index 23ca10417..fc4da506d 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java @@ -7,6 +7,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Optional; import java.util.Set; import org.slf4j.Logger; @@ -75,7 +76,7 @@ public class RegionMaker { int startBlockId = startBlock.getId(); if (processedBlocks.get(startBlockId)) { - mth.addWarn("Removed duplicated region for block: " + startBlock + " " + startBlock.getAttributesString()); + mth.addWarn("Removed duplicated region for block: " + startBlock + ' ' + startBlock.getAttributesString()); return r; } processedBlocks.set(startBlockId); @@ -192,7 +193,7 @@ public class RegionMaker { // add 'break' instruction before path cross between main loop exit and sub-exit for (Edge exitEdge : loop.getExitEdges()) { if (exitBlocks.contains(exitEdge.getSource())) { - insertBreak(stack, loopExit, exitEdge); + insertLoopBreak(stack, loop, loopExit, exitEdge); } } } @@ -290,6 +291,9 @@ public class RegionMaker { } } } + if (found && !checkLoopExits(loop, block)) { + found = false; + } if (found) { return loopRegion; } @@ -298,6 +302,32 @@ public class RegionMaker { return null; } + private boolean checkLoopExits(LoopInfo loop, BlockNode mainExitBlock) { + List exitEdges = loop.getExitEdges(); + if (exitEdges.size() < 2) { + return true; + } + Optional mainEdgeOpt = exitEdges.stream().filter(edge -> edge.getSource() == mainExitBlock).findFirst(); + if (!mainEdgeOpt.isPresent()) { + throw new JadxRuntimeException("Not found exit edge by exit block: " + mainExitBlock); + } + Edge mainExitEdge = mainEdgeOpt.get(); + BlockNode mainOutBlock = skipSyntheticSuccessor(mainExitEdge.getTarget()); + for (Edge exitEdge : exitEdges) { + if (exitEdge != mainExitEdge) { + BlockNode outBlock = skipSyntheticSuccessor(exitEdge.getTarget()); + // all exit paths must be same or don't cross (will be inside loop) + if (!isEqualPaths(mainOutBlock, outBlock)) { + BlockNode crossBlock = BlockUtils.getPathCross(mth, mainOutBlock, outBlock); + if (crossBlock != null) { + return false; + } + } + } + } + return true; + } + private BlockNode makeEndlessLoop(IRegion curRegion, RegionStack stack, LoopInfo loop, BlockNode loopStart) { LoopRegion loopRegion = new LoopRegion(curRegion, loop, null, false); curRegion.getSubBlocks().add(loopRegion); @@ -312,7 +342,7 @@ public class RegionMaker { if (exitEdges.size() == 1) { Edge exitEdge = exitEdges.get(0); BlockNode exit = exitEdge.getTarget(); - if (insertBreak(stack, exit, exitEdge)) { + if (insertLoopBreak(stack, loop, exit, exitEdge)) { BlockNode nextBlock = getNextBlock(exit); if (nextBlock != null) { stack.addExit(nextBlock); @@ -326,10 +356,10 @@ public class RegionMaker { for (BlockNode block : blocks) { if (BlockUtils.isPathExists(exit, block)) { stack.addExit(block); - insertBreak(stack, block, exitEdge); + insertLoopBreak(stack, loop, block, exitEdge); out = block; } else { - insertBreak(stack, exit, exitEdge); + insertLoopBreak(stack, loop, exit, exitEdge); } } } @@ -388,7 +418,7 @@ public class RegionMaker { return true; } - private boolean insertBreak(RegionStack stack, BlockNode loopExit, Edge exitEdge) { + private boolean insertLoopBreak(RegionStack stack, LoopInfo loop, BlockNode loopExit, Edge exitEdge) { BlockNode exit = exitEdge.getTarget(); BlockNode insertBlock = null; boolean confirm = false; @@ -427,6 +457,7 @@ public class RegionMaker { return false; } InsnNode breakInsn = new InsnNode(InsnType.BREAK, 0); + breakInsn.addAttr(AType.LOOP, loop); EdgeInsnAttr.addEdgeInsn(insertBlock, insertBlock.getSuccessors().get(0), breakInsn); stack.addExit(exit); // add label to 'break' if needed diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMakerVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMakerVisitor.java index 97e1c8aad..14057fcf3 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMakerVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMakerVisitor.java @@ -102,6 +102,13 @@ public class RegionMakerVisitor extends AbstractVisitor { if (!insnAttr.getStart().equals(last)) { return; } + if (last instanceof BlockNode) { + BlockNode block = (BlockNode) last; + if (block.getInstructions().isEmpty()) { + block.getInstructions().add(insnAttr.getInsn()); + return; + } + } List insns = Collections.singletonList(insnAttr.getInsn()); region.add(new InsnContainer(insns)); } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/variables/VarUsage.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/variables/VarUsage.java index 7fd14ad0d..706818303 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/variables/VarUsage.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/variables/VarUsage.java @@ -28,6 +28,6 @@ class VarUsage { @Override public String toString() { - return "{" + (var == null ? "-" : var.toShortString()) + ", a:" + assigns + ", u:" + uses + "}"; + return '{' + (var == null ? "-" : var.toShortString()) + ", a:" + assigns + ", u:" + uses + '}'; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/shrink/ArgsInfo.java b/jadx-core/src/main/java/jadx/core/dex/visitors/shrink/ArgsInfo.java index 42151506f..e96e09532 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/shrink/ArgsInfo.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/shrink/ArgsInfo.java @@ -137,6 +137,6 @@ final class ArgsInfo { public String toString() { return "ArgsInfo: |" + inlineBorder + " ->" + (inlinedInsn == null ? "-" : inlinedInsn.pos) - + " " + args + " : " + insn; + + ' ' + args + " : " + insn; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/AbstractTypeConstraint.java b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/AbstractTypeConstraint.java index 98c994e2e..307dfc54f 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/AbstractTypeConstraint.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/AbstractTypeConstraint.java @@ -45,6 +45,6 @@ public abstract class AbstractTypeConstraint implements ITypeConstraint { @Override public String toString() { - return "(" + insn.getType() + ":" + Utils.listToString(relatedVars, SSAVar::toShortString) + ")"; + return "(" + insn.getType() + ':' + Utils.listToString(relatedVars, SSAVar::toShortString) + ')'; } } diff --git a/jadx-core/src/main/java/jadx/core/utils/InsnUtils.java b/jadx-core/src/main/java/jadx/core/utils/InsnUtils.java index 51d2c1199..d8aa1e842 100644 --- a/jadx-core/src/main/java/jadx/core/utils/InsnUtils.java +++ b/jadx-core/src/main/java/jadx/core/utils/InsnUtils.java @@ -57,7 +57,7 @@ public class InsnUtils { return ""; } if (index instanceof String) { - return "\"" + index + "\""; + return "\"" + index + '"'; } return index.toString(); } diff --git a/jadx-core/src/main/java/jadx/core/utils/InstructionRemover.java b/jadx-core/src/main/java/jadx/core/utils/InstructionRemover.java index 37352e0a1..3af7386a1 100644 --- a/jadx-core/src/main/java/jadx/core/utils/InstructionRemover.java +++ b/jadx-core/src/main/java/jadx/core/utils/InstructionRemover.java @@ -44,6 +44,7 @@ public class InstructionRemover { public void add(InsnNode insn) { toRemove.add(insn); } + public void addAndUnbind(MethodNode mth, InsnNode insn) { toRemove.add(insn); unbindInsn(mth, insn); diff --git a/jadx-core/src/main/java/jadx/core/utils/RegionUtils.java b/jadx-core/src/main/java/jadx/core/utils/RegionUtils.java index 5ded8fe65..014fbc11b 100644 --- a/jadx-core/src/main/java/jadx/core/utils/RegionUtils.java +++ b/jadx-core/src/main/java/jadx/core/utils/RegionUtils.java @@ -8,6 +8,9 @@ import java.util.Set; import org.jetbrains.annotations.Nullable; import jadx.core.dex.attributes.AType; +import jadx.core.dex.attributes.AttrList; +import jadx.core.dex.attributes.nodes.LoopInfo; +import jadx.core.dex.attributes.nodes.LoopLabelAttr; import jadx.core.dex.instructions.InsnType; import jadx.core.dex.nodes.BlockNode; import jadx.core.dex.nodes.IBlock; @@ -91,22 +94,71 @@ public class RegionUtils { } /** - * Return true if last block in region has no successors + * Return true if last block in region has no successors or jump out insn (return or break) */ public static boolean hasExitBlock(IContainer container) { + return hasExitBlock(container, container); + } + + private static boolean hasExitBlock(IContainer rootContainer, IContainer container) { if (container instanceof BlockNode) { - return ((BlockNode) container).getSuccessors().isEmpty(); + BlockNode blockNode = (BlockNode) container; + if (blockNode.getSuccessors().isEmpty()) { + return true; + } + return isInsnExitContainer(rootContainer, (IBlock) container); + } else if (container instanceof IBranchRegion) { + return false; } else if (container instanceof IBlock) { - return true; + return isInsnExitContainer(rootContainer, (IBlock) container); } else if (container instanceof IRegion) { List blocks = ((IRegion) container).getSubBlocks(); return !blocks.isEmpty() - && hasExitBlock(blocks.get(blocks.size() - 1)); + && hasExitBlock(rootContainer, blocks.get(blocks.size() - 1)); } else { throw new JadxRuntimeException(unknownContainerType(container)); } } + private static boolean isInsnExitContainer(IContainer rootContainer, IBlock block) { + InsnNode lastInsn = BlockUtils.getLastInsn(block); + if (lastInsn == null) { + return false; + } + InsnType insnType = lastInsn.getType(); + if (insnType == InsnType.RETURN) { + return true; + } + if (insnType == InsnType.THROW) { + // check if after throw execution can continue in current container + CatchAttr catchAttr = lastInsn.get(AType.CATCH_BLOCK); + if (catchAttr != null) { + for (ExceptionHandler handler : catchAttr.getTryBlock().getHandlers()) { + if (RegionUtils.isRegionContainsBlock(rootContainer, handler.getHandlerBlock())) { + return false; + } + } + } + return true; + } + if (insnType == InsnType.BREAK) { + AttrList loopInfoAttrList = lastInsn.get(AType.LOOP); + if (loopInfoAttrList != null) { + for (LoopInfo loopInfo : loopInfoAttrList.getList()) { + if (!RegionUtils.isRegionContainsBlock(rootContainer, loopInfo.getStart())) { + return true; + } + } + } + LoopLabelAttr loopLabelAttr = lastInsn.get(AType.LOOP_LABEL); + if (loopLabelAttr != null + && !RegionUtils.isRegionContainsBlock(rootContainer, loopLabelAttr.getLoop().getStart())) { + return true; + } + } + return false; + } + public static boolean hasBreakInsn(IContainer container) { if (container instanceof IBlock) { return BlockUtils.checkLastInsnType((IBlock) container, InsnType.BREAK); diff --git a/jadx-core/src/main/java/jadx/core/utils/android/AndroidResourcesUtils.java b/jadx-core/src/main/java/jadx/core/utils/android/AndroidResourcesUtils.java index 3efb5125a..cbc66ec3c 100644 --- a/jadx-core/src/main/java/jadx/core/utils/android/AndroidResourcesUtils.java +++ b/jadx-core/src/main/java/jadx/core/utils/android/AndroidResourcesUtils.java @@ -14,6 +14,7 @@ import org.slf4j.LoggerFactory; import jadx.core.codegen.ClassGen; import jadx.core.codegen.CodeWriter; import jadx.core.deobf.NameMapper; +import jadx.core.dex.attributes.AFlag; import jadx.core.dex.attributes.AType; import jadx.core.dex.info.AccessInfo; import jadx.core.dex.info.ClassInfo; @@ -124,6 +125,7 @@ public class AndroidResourcesUtils { if (fieldNode != null && !fieldNode.getName().equals(resName) && NameMapper.isValidIdentifier(resName)) { + fieldNode.add(AFlag.DONT_RENAME); fieldNode.getFieldInfo().setAlias(resName); } } @@ -131,7 +133,7 @@ public class AndroidResourcesUtils { @NotNull private static ClassNode addClassForResType(ClassNode resCls, boolean rClsExists, String typeName) { - ClassNode newTypeCls = new ClassNode(resCls.dex(), resCls.getFullName() + "$" + typeName, + ClassNode newTypeCls = new ClassNode(resCls.dex(), resCls.getFullName() + '$' + typeName, AccessFlags.ACC_PUBLIC | AccessFlags.ACC_STATIC | AccessFlags.ACC_FINAL); resCls.addInnerClass(newTypeCls); if (rClsExists) { diff --git a/jadx-core/src/main/java/jadx/core/utils/files/DexFile.java b/jadx-core/src/main/java/jadx/core/utils/files/DexFile.java index 27b3d2c77..f5b9661f6 100644 --- a/jadx-core/src/main/java/jadx/core/utils/files/DexFile.java +++ b/jadx-core/src/main/java/jadx/core/utils/files/DexFile.java @@ -27,6 +27,6 @@ public class DexFile { @Override public String toString() { - return inputFile + (name.isEmpty() ? "" : ":" + name); + return inputFile + (name.isEmpty() ? "" : ':' + name); } } diff --git a/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java b/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java index fa523eb7c..cebbf6e34 100644 --- a/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java +++ b/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java @@ -77,7 +77,7 @@ public class FileUtils { public static File createTempDir(String suffix) { try { - Path path = Files.createTempDirectory("jadx-tmp-" + System.nanoTime() + "-" + suffix); + Path path = Files.createTempDirectory("jadx-tmp-" + System.nanoTime() + '-' + suffix); path.toFile().deleteOnExit(); return path.toFile(); } catch (IOException e) { diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/BinaryXMLParser.java b/jadx-core/src/main/java/jadx/core/xmlgen/BinaryXMLParser.java index d0dedc8ac..9cd1cf444 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/BinaryXMLParser.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/BinaryXMLParser.java @@ -470,7 +470,7 @@ public class BinaryXMLParser extends CommonBinaryParser { private boolean isDeobfCandidateAttr(String shortNsName, String attrName) { String fullName; if (shortNsName != null) { - fullName = shortNsName + ":" + attrName; + fullName = shortNsName + ':' + attrName; } else { return false; } diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/ManifestAttributes.java b/jadx-core/src/main/java/jadx/core/xmlgen/ManifestAttributes.java index 09a2ddadb..34ab9750e 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/ManifestAttributes.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/ManifestAttributes.java @@ -43,7 +43,7 @@ public class ManifestAttributes { @Override public String toString() { - return "[" + type + ", " + values + "]"; + return "[" + type + ", " + values + ']'; } } @@ -173,7 +173,7 @@ public class ManifestAttributes { StringBuilder sb = new StringBuilder(); for (Map.Entry entry : attr.getValues().entrySet()) { if (value == entry.getKey()) { - sb = new StringBuilder(entry.getValue() + "|"); + sb = new StringBuilder(entry.getValue() + '|'); break; } else if ((value & entry.getKey()) == entry.getKey()) { sb.append(entry.getValue()).append('|'); diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/ParserConstants.java b/jadx-core/src/main/java/jadx/core/xmlgen/ParserConstants.java index 9497867cb..6f60fb7bb 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/ParserConstants.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/ParserConstants.java @@ -138,6 +138,9 @@ public class ParserConstants { protected static final int FLAG_COMPLEX = 0x0001; // If set, this resource has been declared public, so libraries are allowed to reference it. protected static final int FLAG_PUBLIC = 0x0002; + // If set, this is a weak resource and may be overriden by strong resources of the same name/type. + // This is only useful during linking with other resource tables. + protected static final int FLAG_WEAK = 0x0004; /** * ResTable_map diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/ParserStream.java b/jadx-core/src/main/java/jadx/core/xmlgen/ParserStream.java index fc6cb2731..a50d45d7a 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/ParserStream.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/ParserStream.java @@ -1,5 +1,6 @@ package jadx.core.xmlgen; +import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; @@ -143,6 +144,25 @@ public class ParserStream { input.reset(); } + public void readFully(byte[] b) throws IOException { + readFully(b, 0, b.length); + } + + public void readFully(byte[] b, int off, int len) throws IOException { + readPos += len; + if (len < 0) { + throw new IndexOutOfBoundsException(); + } + int n = 0; + while (n < len) { + int count = input.read(b, off + n, len - n); + if (count < 0) { + throw new EOFException(); + } + n += count; + } + } + @Override public String toString() { return "pos: 0x" + Long.toHexString(readPos); diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/ResContainer.java b/jadx-core/src/main/java/jadx/core/xmlgen/ResContainer.java index cf8e72772..87fbfa989 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/ResContainer.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/ResContainer.java @@ -96,6 +96,6 @@ public class ResContainer implements Comparable { @Override public String toString() { - return "Res{" + name + ", type=" + dataType + ", subFiles=" + subFiles + "}"; + return "Res{" + name + ", type=" + dataType + ", subFiles=" + subFiles + '}'; } } diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/ResTableParser.java b/jadx-core/src/main/java/jadx/core/xmlgen/ResTableParser.java index dd04ae6c1..56bacc653 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/ResTableParser.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/ResTableParser.java @@ -21,6 +21,8 @@ public class ResTableParser extends CommonBinaryParser { private static final Logger LOG = LoggerFactory.getLogger(ResTableParser.class); + private static final int KNOWN_CONFIG_BYTES = 56; + private static final class PackageChunk { private final int id; private final String name; @@ -79,7 +81,7 @@ public class ResTableParser extends CommonBinaryParser { Set addedValues = new HashSet<>(); for (ResourceEntry ri : resStorage.getResources()) { - if (addedValues.add(ri.getTypeName() + "." + ri.getKeyName())) { + if (addedValues.add(ri.getTypeName() + '.' + ri.getKeyName())) { String format = String.format("", ri.getTypeName(), ri.getKeyName(), ri.getId()); writer.startLine(format); @@ -194,6 +196,11 @@ public class ResTableParser extends CommonBinaryParser { EntryConfig config = parseConfig(); + if (config.isInvalid) { + String typeName = pkg.getTypeStrings()[id - 1]; + LOG.warn("Invalid config flags detected: " + typeName + config.getQualifiers()); + } + int[] entryIndexes = new int[entryCount]; for (int i = 0; i < entryCount; i++) { entryIndexes[i] = is.readInt32(); @@ -208,8 +215,7 @@ public class ResTableParser extends CommonBinaryParser { } private void parseEntry(PackageChunk pkg, int typeId, int entryId, EntryConfig config) throws IOException { - /* int size = */ - is.readInt16(); + int size = is.readInt16(); int flags = is.readInt16(); int key = is.readInt32(); @@ -219,17 +225,17 @@ public class ResTableParser extends CommonBinaryParser { ResourceEntry ri = new ResourceEntry(resRef, pkg.getName(), typeName, keyName); ri.setConfig(config); - if ((flags & FLAG_COMPLEX) == 0) { - ri.setSimpleValue(parseValue()); - } else { + if ((flags & FLAG_COMPLEX) != 0 || size == 16) { int parentRef = is.readInt32(); - ri.setParentRef(parentRef); int count = is.readInt32(); + ri.setParentRef(parentRef); List values = new ArrayList<>(count); for (int i = 0; i < count; i++) { values.add(parseValueMap()); } ri.setNamedValues(values); + } else { + ri.setSimpleValue(parseValue()); } resStorage.add(ri); } @@ -250,132 +256,99 @@ public class ResTableParser extends CommonBinaryParser { private EntryConfig parseConfig() throws IOException { long start = is.getPos(); int size = is.readInt32(); + if (size < 28) { + throw new IOException("Config size < 28"); + } - EntryConfig config = new EntryConfig(); + boolean isInvalid = false; - is.readInt16(); //mcc - is.readInt16(); //mnc + short mcc = (short) is.readInt16(); + short mnc = (short) is.readInt16(); - config.setLanguage(parseLocale()); - config.setCountry(parseLocale()); + char[] language = unpackLocaleOrRegion((byte) is.readInt8(), (byte) is.readInt8(), 'a'); + char[] country = unpackLocaleOrRegion((byte) is.readInt8(), (byte) is.readInt8(), '0'); - int orientation = is.readInt8(); - int touchscreen = is.readInt8(); + byte orientation = (byte) is.readInt8(); + byte touchscreen = (byte) is.readInt8(); int density = is.readInt16(); - if (density != 0) { - config.setDensity(parseDensity(density)); - } - - is.readInt8(); // keyboard - is.readInt8(); // navigation - is.readInt8(); // inputFlags + byte keyboard = (byte) is.readInt8(); + byte navigation = (byte) is.readInt8(); + byte inputFlags = (byte) is.readInt8(); is.readInt8(); // inputPad0 - int screenWidth = is.readInt16(); - int screenHeight = is.readInt16(); + short screenWidth = (short) is.readInt16(); + short screenHeight = (short) is.readInt16(); - if (screenWidth != 0 && screenHeight != 0) { - config.setScreenSize(screenWidth + "x" + screenHeight); + short sdkVersion = (short) is.readInt16(); + is.readInt16(); // minorVersion must always be 0 + + byte screenLayout = 0; + byte uiMode = 0; + short smallestScreenWidthDp = 0; + if (size >= 32) { + screenLayout = (byte) is.readInt8(); + uiMode = (byte) is.readInt8(); + smallestScreenWidthDp = (short) is.readInt16(); } - int sdkVersion = is.readInt16(); - - if (sdkVersion != 0) { - config.setSdkVersion("v" + sdkVersion); + short screenWidthDp = 0; + short screenHeightDp = 0; + if (size >= 36) { + screenWidthDp = (short) is.readInt16(); + screenHeightDp = (short) is.readInt16(); } - int minorVersion = is.readInt16(); - - int screenLayout = is.readInt8(); - int uiMode = is.readInt8(); - int smallestScreenWidthDp = is.readInt16(); - - int screenWidthDp = is.readInt16(); - int screenHeightDp = is.readInt16(); - - if (screenLayout != 0) { - config.setScreenLayout(parseScreenLayout(screenLayout)); + char[] localeScript = null; + char[] localeVariant = null; + if (size >= 48) { + localeScript = readScriptOrVariantChar(4).toCharArray(); + localeVariant = readScriptOrVariantChar(8).toCharArray(); } - if (smallestScreenWidthDp != 0) { - config.setSmallestScreenWidthDp("sw" + smallestScreenWidthDp + "dp"); + byte screenLayout2 = 0; + byte colorMode = 0; + if (size >= 52) { + screenLayout2 = (byte) is.readInt8(); + colorMode = (byte) is.readInt8(); + is.readInt16(); // reserved padding } - if (orientation != 0) { - config.setOrientation(parseOrientation(orientation)); - } + is.skipToPos(start + size, "Config skip trailing bytes"); - if (screenWidthDp != 0) { - config.setScreenWidthDp("w" + screenWidthDp + "dp"); - } - - if (screenHeightDp != 0) { - config.setScreenHeightDp("h" + screenHeightDp + "dp"); - } - - is.skipToPos(start + size, "Skip config parsing"); - return config; + return new EntryConfig(mcc, mnc, language, country, + orientation, touchscreen, density, keyboard, navigation, + inputFlags, screenWidth, screenHeight, sdkVersion, + screenLayout, uiMode, smallestScreenWidthDp, screenWidthDp, + screenHeightDp, localeScript, localeVariant, screenLayout2, + colorMode, isInvalid, size); } - private String parseOrientation(int orientation) { - if (orientation == 1) { - return "port"; - } else if (orientation == 2) { - return "land"; - } else { - return "o" + orientation; + private char[] unpackLocaleOrRegion(byte in0, byte in1, char base) { + // check high bit, if so we have a packed 3 letter code + if (((in0 >> 7) & 1) == 1) { + int first = in1 & 0x1F; + int second = ((in1 & 0xE0) >> 5) + ((in0 & 0x03) << 3); + int third = (in0 & 0x7C) >> 2; + + // since this function handles languages & regions, we add the value(s) to the base char + // which is usually 'a' or '0' depending on language or region. + return new char[]{(char) (first + base), (char) (second + base), (char) (third + base)}; } + return new char[]{(char) in0, (char) in1}; } - private String parseScreenLayout(int screenLayout) { - switch (screenLayout) { - case 1: - return "small"; - case 2: - return "normal"; - case 3: - return "large"; - case 4: - return "xlarge"; - case 64: - return "ldltr"; - case 128: - return "ldrtl"; - default: - return "sl" + screenLayout; - } - } - - private String parseDensity(int density) { - if (density == 120) { - return "ldpi"; - } else if (density == 160) { - return "mdpi"; - } else if (density == 240) { - return "hdpi"; - } else if (density == 320) { - return "xhdpi"; - } else if (density == 480) { - return "xxhdpi"; - } else if (density == 640) { - return "xxxhdpi"; - } else { - return density + "dpi"; - } - } - - private String parseLocale() throws IOException { - int b1 = is.readInt8(); - int b2 = is.readInt8(); - String str = null; - if (b1 != 0 && b2 != 0) { - if ((b1 & 0x80) == 0) { - str = new String(new char[]{(char) b1, (char) b2}); - } else { - LOG.warn("TODO: parse locale: 0x{}{}", Integer.toHexString(b1), Integer.toHexString(b2)); + private String readScriptOrVariantChar(int length) throws IOException { + long start = is.getPos(); + StringBuilder sb = new StringBuilder(16); + for (int i = 0; i < length; i++) { + short ch = (short) is.readInt8(); + if (ch == 0) { + break; } + sb.append((char) ch); } - return str; + is.skipToPos(start + length, "readScriptOrVariantChar"); + return sb.toString(); } } diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/ResXmlGen.java b/jadx-core/src/main/java/jadx/core/xmlgen/ResXmlGen.java index 452744809..d465b8642 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/ResXmlGen.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/ResXmlGen.java @@ -15,6 +15,8 @@ import jadx.core.xmlgen.entry.RawNamedValue; import jadx.core.xmlgen.entry.ResourceEntry; import jadx.core.xmlgen.entry.ValuesParser; +import static jadx.core.xmlgen.ParserConstants.PLURALS_MAP; + public class ResXmlGen { private static final Set SKIP_RES_TYPES = new HashSet<>(Arrays.asList( @@ -147,16 +149,24 @@ public class ResXmlGen { } } } - if (typeName.equals("attr")) { - if (nameStr != null) { - addSimpleValue(cw, typeName, itemTag, nameStr, valueStr, ""); - } - } else if (typeName.equals("style")) { - if (nameStr != null) { - addSimpleValue(cw, typeName, itemTag, nameStr, "", valueStr); - } - } else { - addSimpleValue(cw, typeName, itemTag, null, null, valueStr); + switch (typeName) { + case "attr": + if (nameStr != null) { + addSimpleValue(cw, typeName, itemTag, nameStr, valueStr, ""); + } + break; + case "style": + if (nameStr != null) { + addSimpleValue(cw, typeName, itemTag, nameStr, "", valueStr); + } + break; + case "plurals": + final String quantity = PLURALS_MAP.get(value.getNameRef()); + addSimpleValue(cw, typeName, itemTag, "quantity", quantity, valueStr); + break; + default: + addSimpleValue(cw, typeName, itemTag, null, null, valueStr); + break; } } @@ -194,10 +204,10 @@ public class ResXmlGen { private String getFileName(ResourceEntry ri) { StringBuilder sb = new StringBuilder(); - String locale = ri.getConfig().getLocale(); + String qualifiers = ri.getConfig().getQualifiers(); sb.append("res/values"); - if (!locale.isEmpty()) { - sb.append('-').append(locale); + if (!qualifiers.isEmpty()) { + sb.append(qualifiers); } sb.append('/'); sb.append(ri.getTypeName()); diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/ResourceStorage.java b/jadx-core/src/main/java/jadx/core/xmlgen/ResourceStorage.java index 7102a34df..ef162163e 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/ResourceStorage.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/ResourceStorage.java @@ -47,7 +47,7 @@ public class ResourceStorage { public Map getResourcesNames() { Map map = new HashMap<>(); for (ResourceEntry entry : list) { - map.put(entry.getId(), entry.getTypeName() + "/" + entry.getKeyName()); + map.put(entry.getId(), entry.getTypeName() + '/' + entry.getKeyName()); } return map; } diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/entry/EntryConfig.java b/jadx-core/src/main/java/jadx/core/xmlgen/entry/EntryConfig.java index d19b84666..d1d0fdfc4 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/entry/EntryConfig.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/entry/EntryConfig.java @@ -1,159 +1,649 @@ +/** + * Copyright (C) 2018 Ryszard Wiśniewski + * Copyright (C) 2018 Connor Tumbleson + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package jadx.core.xmlgen.entry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Original source code can be found + * here + */ + public class EntryConfig { - private String language; - private String country; - private String density; - private String screenSize; - private String sdkVersion; - private String screenLayout; - private String smallestScreenWidthDp; - private String orientation; - private String screenWidthDp; - private String screenHeightDp; + public final short mcc; + public final short mnc; - public String getLanguage() { - return language; + public final char[] language; + public final char[] region; + + public final byte orientation; + public final byte touchscreen; + public final int density; + + public final byte keyboard; + public final byte navigation; + public final byte inputFlags; + + public final short screenWidth; + public final short screenHeight; + + public final short sdkVersion; + + public final byte screenLayout; + public final byte uiMode; + public final short smallestScreenWidthDp; + + public final short screenWidthDp; + public final short screenHeightDp; + + private final char[] localeScript; + private final char[] localeVariant; + + private final byte screenLayout2; + private final byte colorMode; + + public final boolean isInvalid; + + private final String mQualifiers; + + private final int size; + + public EntryConfig() { + mcc = 0; + mnc = 0; + language = new char[]{'\00', '\00'}; + region = new char[]{'\00', '\00'}; + orientation = ORIENTATION_ANY; + touchscreen = TOUCHSCREEN_ANY; + density = DENSITY_DEFAULT; + keyboard = KEYBOARD_ANY; + navigation = NAVIGATION_ANY; + inputFlags = KEYSHIDDEN_ANY | NAVHIDDEN_ANY; + screenWidth = 0; + screenHeight = 0; + sdkVersion = 0; + screenLayout = SCREENLONG_ANY | SCREENSIZE_ANY; + uiMode = UI_MODE_TYPE_ANY | UI_MODE_NIGHT_ANY; + smallestScreenWidthDp = 0; + screenWidthDp = 0; + screenHeightDp = 0; + localeScript = null; + localeVariant = null; + screenLayout2 = 0; + colorMode = COLOR_WIDE_UNDEFINED; + isInvalid = false; + mQualifiers = ""; + size = 0; } - public void setLanguage(String language) { + public EntryConfig(short mcc, short mnc, char[] language, + char[] region, byte orientation, + byte touchscreen, int density, byte keyboard, byte navigation, + byte inputFlags, short screenWidth, short screenHeight, + short sdkVersion, byte screenLayout, byte uiMode, + short smallestScreenWidthDp, short screenWidthDp, + short screenHeightDp, char[] localeScript, char[] localeVariant, + byte screenLayout2, byte colorMode, boolean isInvalid, int size) { + if (orientation < 0 || orientation > 3) { + LOG.warn("Invalid orientation value: " + orientation); + orientation = 0; + isInvalid = true; + } + if (touchscreen < 0 || touchscreen > 3) { + LOG.warn("Invalid touchscreen value: " + touchscreen); + touchscreen = 0; + isInvalid = true; + } + if (density < -1) { + LOG.warn("Invalid density value: " + density); + density = 0; + isInvalid = true; + } + if (keyboard < 0 || keyboard > 3) { + LOG.warn("Invalid keyboard value: " + keyboard); + keyboard = 0; + isInvalid = true; + } + if (navigation < 0 || navigation > 4) { + LOG.warn("Invalid navigation value: " + navigation); + navigation = 0; + isInvalid = true; + } + + if (localeScript != null && localeScript.length != 0) { + if (localeScript[0] == '\00') { + localeScript = null; + } + } else { + localeScript = null; + } + + if (localeVariant != null && localeVariant.length != 0) { + if (localeVariant[0] == '\00') { + localeVariant = null; + } + } else { + localeVariant = null; + } + + this.mcc = mcc; + this.mnc = mnc; this.language = language; + this.region = region; + this.orientation = orientation; + this.touchscreen = touchscreen; + this.density = density; + this.keyboard = keyboard; + this.navigation = navigation; + this.inputFlags = inputFlags; + this.screenWidth = screenWidth; + this.screenHeight = screenHeight; + this.sdkVersion = sdkVersion; + this.screenLayout = screenLayout; + this.uiMode = uiMode; + this.smallestScreenWidthDp = smallestScreenWidthDp; + this.screenWidthDp = screenWidthDp; + this.screenHeightDp = screenHeightDp; + this.localeScript = localeScript; + this.localeVariant = localeVariant; + this.screenLayout2 = screenLayout2; + this.colorMode = colorMode; + this.isInvalid = isInvalid; + this.size = size; + mQualifiers = generateQualifiers(); } - public String getCountry() { - return country; + public String getQualifiers() { + return mQualifiers; } - public void setCountry(String country) { - this.country = country; + private String generateQualifiers() { + StringBuilder ret = new StringBuilder(); + if (mcc != 0) { + ret.append("-mcc").append(String.format("%03d", mcc)); + if (mnc != MNC_ZERO) { + if (mnc != 0) { + ret.append("-mnc"); + if (size <= 32) { + if (mnc > 0 && mnc < 10) { + ret.append(String.format("%02d", mnc)); + } else { + ret.append(String.format("%03d", mnc)); + } + } else { + ret.append(mnc); + } + } + } else { + ret.append("-mnc00"); + } + } else { + if (mnc != 0) { + ret.append("-mnc").append(mnc); + } + } + ret.append(getLocaleString()); + + switch (screenLayout & MASK_LAYOUTDIR) { + case SCREENLAYOUT_LAYOUTDIR_RTL: + ret.append("-ldrtl"); + break; + case SCREENLAYOUT_LAYOUTDIR_LTR: + ret.append("-ldltr"); + break; + } + if (smallestScreenWidthDp != 0) { + ret.append("-sw").append(smallestScreenWidthDp).append("dp"); + } + if (screenWidthDp != 0) { + ret.append("-w").append(screenWidthDp).append("dp"); + } + if (screenHeightDp != 0) { + ret.append("-h").append(screenHeightDp).append("dp"); + } + switch (screenLayout & MASK_SCREENSIZE) { + case SCREENSIZE_SMALL: + ret.append("-small"); + break; + case SCREENSIZE_NORMAL: + ret.append("-normal"); + break; + case SCREENSIZE_LARGE: + ret.append("-large"); + break; + case SCREENSIZE_XLARGE: + ret.append("-xlarge"); + break; + } + switch (screenLayout & MASK_SCREENLONG) { + case SCREENLONG_YES: + ret.append("-long"); + break; + case SCREENLONG_NO: + ret.append("-notlong"); + break; + } + switch (screenLayout2 & MASK_SCREENROUND) { + case SCREENLAYOUT_ROUND_NO: + ret.append("-notround"); + break; + case SCREENLAYOUT_ROUND_YES: + ret.append("-round"); + break; + } + switch (colorMode & COLOR_HDR_MASK) { + case COLOR_HDR_YES: + ret.append("-highdr"); + break; + case COLOR_HDR_NO: + ret.append("-lowdr"); + break; + } + switch (colorMode & COLOR_WIDE_MASK) { + case COLOR_WIDE_YES: + ret.append("-widecg"); + break; + case COLOR_WIDE_NO: + ret.append("-nowidecg"); + break; + } + switch (orientation) { + case ORIENTATION_PORT: + ret.append("-port"); + break; + case ORIENTATION_LAND: + ret.append("-land"); + break; + case ORIENTATION_SQUARE: + ret.append("-square"); + break; + } + switch (uiMode & MASK_UI_MODE_TYPE) { + case UI_MODE_TYPE_CAR: + ret.append("-car"); + break; + case UI_MODE_TYPE_DESK: + ret.append("-desk"); + break; + case UI_MODE_TYPE_TELEVISION: + ret.append("-television"); + break; + case UI_MODE_TYPE_SMALLUI: + ret.append("-smallui"); + break; + case UI_MODE_TYPE_MEDIUMUI: + ret.append("-mediumui"); + break; + case UI_MODE_TYPE_LARGEUI: + ret.append("-largeui"); + break; + case UI_MODE_TYPE_GODZILLAUI: + ret.append("-godzillaui"); + break; + case UI_MODE_TYPE_HUGEUI: + ret.append("-hugeui"); + break; + case UI_MODE_TYPE_APPLIANCE: + ret.append("-appliance"); + break; + case UI_MODE_TYPE_WATCH: + ret.append("-watch"); + break; + case UI_MODE_TYPE_VR_HEADSET: + ret.append("-vrheadset"); + break; + } + switch (uiMode & MASK_UI_MODE_NIGHT) { + case UI_MODE_NIGHT_YES: + ret.append("-night"); + break; + case UI_MODE_NIGHT_NO: + ret.append("-notnight"); + break; + } + switch (density) { + case DENSITY_DEFAULT: + break; + case DENSITY_LOW: + ret.append("-ldpi"); + break; + case DENSITY_MEDIUM: + ret.append("-mdpi"); + break; + case DENSITY_HIGH: + ret.append("-hdpi"); + break; + case DENSITY_TV: + ret.append("-tvdpi"); + break; + case DENSITY_XHIGH: + ret.append("-xhdpi"); + break; + case DENSITY_XXHIGH: + ret.append("-xxhdpi"); + break; + case DENSITY_XXXHIGH: + ret.append("-xxxhdpi"); + break; + case DENSITY_ANY: + ret.append("-anydpi"); + break; + case DENSITY_NONE: + ret.append("-nodpi"); + break; + default: + ret.append('-').append(density).append("dpi"); + } + switch (touchscreen) { + case TOUCHSCREEN_NOTOUCH: + ret.append("-notouch"); + break; + case TOUCHSCREEN_STYLUS: + ret.append("-stylus"); + break; + case TOUCHSCREEN_FINGER: + ret.append("-finger"); + break; + } + switch (inputFlags & MASK_KEYSHIDDEN) { + case KEYSHIDDEN_NO: + ret.append("-keysexposed"); + break; + case KEYSHIDDEN_YES: + ret.append("-keyshidden"); + break; + case KEYSHIDDEN_SOFT: + ret.append("-keyssoft"); + break; + } + switch (keyboard) { + case KEYBOARD_NOKEYS: + ret.append("-nokeys"); + break; + case KEYBOARD_QWERTY: + ret.append("-qwerty"); + break; + case KEYBOARD_12KEY: + ret.append("-12key"); + break; + } + switch (inputFlags & MASK_NAVHIDDEN) { + case NAVHIDDEN_NO: + ret.append("-navexposed"); + break; + case NAVHIDDEN_YES: + ret.append("-navhidden"); + break; + } + switch (navigation) { + case NAVIGATION_NONAV: + ret.append("-nonav"); + break; + case NAVIGATION_DPAD: + ret.append("-dpad"); + break; + case NAVIGATION_TRACKBALL: + ret.append("-trackball"); + break; + case NAVIGATION_WHEEL: + ret.append("-wheel"); + break; + } + if (screenWidth != 0 && screenHeight != 0) { + if (screenWidth > screenHeight) { + ret.append(String.format("-%dx%d", screenWidth, screenHeight)); + } else { + ret.append(String.format("-%dx%d", screenHeight, screenWidth)); + } + } + if (sdkVersion > 0 && sdkVersion >= getNaturalSdkVersionRequirement()) { + ret.append("-v").append(sdkVersion); + } + if (isInvalid) { + ret.append("-ERR").append(sErrCounter++); + } + + return ret.toString(); } - public String getLocale() { + private short getNaturalSdkVersionRequirement() { + if ((uiMode & MASK_UI_MODE_TYPE) == UI_MODE_TYPE_VR_HEADSET || (colorMode & COLOR_WIDE_MASK) != 0 || ((colorMode & COLOR_HDR_MASK) != 0)) { + return SDK_OREO; + } + if ((screenLayout2 & MASK_SCREENROUND) != 0) { + return SDK_MNC; + } + if (density == DENSITY_ANY) { + return SDK_LOLLIPOP; + } + if (smallestScreenWidthDp != 0 || screenWidthDp != 0 || screenHeightDp != 0) { + return SDK_HONEYCOMB_MR2; + } + if ((uiMode & (MASK_UI_MODE_TYPE | MASK_UI_MODE_NIGHT)) != UI_MODE_NIGHT_ANY) { + return SDK_FROYO; + } + if ((screenLayout & (MASK_SCREENSIZE | MASK_SCREENLONG)) != SCREENSIZE_ANY || density != DENSITY_DEFAULT) { + return SDK_DONUT; + } + return 0; + } + + private String getLocaleString() { StringBuilder sb = new StringBuilder(); - if (screenSize != null) { - if (sb.length() != 0) { - sb.append("-"); + + // check for old style non BCP47 tags + // allows values-xx-rXX, values-xx, values-xxx-rXX + // denies values-xxx, anything else + if (localeVariant == null && localeScript == null && (region[0] != '\00' || language[0] != '\00') && + region.length != 3) { + sb.append('-').append(language); + if (region[0] != '\00') { + sb.append("-r").append(region); } - sb.append(screenSize); - } else if (screenHeightDp != null) { - if (sb.length() != 0) { - sb.append("-"); + } else { // BCP47 + if (language[0] == '\00' && region[0] == '\00') { + return sb.toString(); // early return, no language or region } - sb.append(screenHeightDp); - } else if (screenWidthDp != null) { - if (sb.length() != 0) { - sb.append("-"); + sb.append("-b+"); + if (language[0] != '\00') { + sb.append(language); } - sb.append(screenWidthDp); - } else if (screenLayout != null) { - if (sb.length() != 0) { - sb.append("-"); + if (localeScript != null && localeScript.length == 4) { + sb.append('+').append(localeScript); } - sb.append(screenLayout); - } else if (smallestScreenWidthDp != null) { - if (sb.length() != 0) { - sb.append("-"); + if ((region.length == 2 || region.length == 3) && region[0] != '\00') { + sb.append('+').append(region); } - sb.append(smallestScreenWidthDp); - } else if (density != null) { - sb.append(density); - } - if (language != null) { - if (sb.length() != 0) { - sb.append("-"); + if (localeVariant != null && localeVariant.length >= 5) { + sb.append('+').append(toUpper(localeVariant)); } - sb.append(language); - } - if (country != null) { - sb.append("-r").append(country); - } - if (orientation != null) { - if (sb.length() != 0) { - sb.append("-"); - } - sb.append(orientation); - } - if (sdkVersion != null) { - if (sb.length() != 0) { - sb.append("-"); - } - sb.append(sdkVersion); } return sb.toString(); } - public String getDensity() { - return density; - } - - public void setDensity(String density) { - this.density = density; + private String toUpper(char[] character) { + StringBuilder sb = new StringBuilder(); + for (char ch : character) { + sb.append(Character.toUpperCase(ch)); + } + return sb.toString(); } @Override public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(getLocale()); - if (sb.length() != 0) { - sb.insert(0, " ["); - sb.append(']'); + return !getQualifiers().equals("") ? getQualifiers() : "[DEFAULT]"; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; } - return sb.toString(); + if (getClass() != obj.getClass()) { + return false; + } + final EntryConfig other = (EntryConfig) obj; + return this.mQualifiers.equals(other.mQualifiers); } - public void setScreenSize(String screenSize) { - this.screenSize = screenSize; + @Override + public int hashCode() { + int hash = 17; + hash = 31 * hash + this.mQualifiers.hashCode(); + return hash; } - public String getScreenSize() { - return screenSize; - } + // TODO: Dirty static hack. This counter should be a part of ResPackage, + // but it would be hard right now and this feature is very rarely used. + private static int sErrCounter = 0; - public void setSdkVersion(String sdkVersion) { - this.sdkVersion = sdkVersion; - } + public final static byte SDK_BASE = 1; + public final static byte SDK_BASE_1_1 = 2; + public final static byte SDK_CUPCAKE = 3; + public final static byte SDK_DONUT = 4; + public final static byte SDK_ECLAIR = 5; + public final static byte SDK_ECLAIR_0_1 = 6; + public final static byte SDK_ECLAIR_MR1 = 7; + public final static byte SDK_FROYO = 8; + public final static byte SDK_GINGERBREAD = 9; + public final static byte SDK_GINGERBREAD_MR1 = 10; + public final static byte SDK_HONEYCOMB = 11; + public final static byte SDK_HONEYCOMB_MR1 = 12; + public final static byte SDK_HONEYCOMB_MR2 = 13; + public final static byte SDK_ICE_CREAM_SANDWICH = 14; + public final static byte SDK_ICE_CREAM_SANDWICH_MR1 = 15; + public final static byte SDK_JELLY_BEAN = 16; + public final static byte SDK_JELLY_BEAN_MR1 = 17; + public final static byte SDK_JELLY_BEAN_MR2 = 18; + public final static byte SDK_KITKAT = 19; + public final static byte SDK_LOLLIPOP = 21; + public final static byte SDK_LOLLIPOP_MR1 = 22; + public final static byte SDK_MNC = 23; + public final static byte SDK_NOUGAT = 24; + public final static byte SDK_NOUGAT_MR1 = 25; + public final static byte SDK_OREO = 26; + public final static byte SDK_OREO_MR1 = 27; + public final static byte SDK_P = 28; - public String getSdkVersion() { - return sdkVersion; - } + public final static byte ORIENTATION_ANY = 0; + public final static byte ORIENTATION_PORT = 1; + public final static byte ORIENTATION_LAND = 2; + public final static byte ORIENTATION_SQUARE = 3; - public void setScreenLayout(String screenLayout) { - this.screenLayout = screenLayout; - } + public final static byte TOUCHSCREEN_ANY = 0; + public final static byte TOUCHSCREEN_NOTOUCH = 1; + public final static byte TOUCHSCREEN_STYLUS = 2; + public final static byte TOUCHSCREEN_FINGER = 3; - public String getScreenLayout() { - return screenLayout; - } + public final static int DENSITY_DEFAULT = 0; + public final static int DENSITY_LOW = 120; + public final static int DENSITY_MEDIUM = 160; + public final static int DENSITY_400 = 190; + public final static int DENSITY_TV = 213; + public final static int DENSITY_HIGH = 240; + public final static int DENSITY_XHIGH = 320; + public final static int DENSITY_XXHIGH = 480; + public final static int DENSITY_XXXHIGH = 640; + public final static int DENSITY_ANY = 0xFFFE; + public final static int DENSITY_NONE = 0xFFFF; - public void setSmallestScreenWidthDp(String smallestScreenWidthDp) { - this.smallestScreenWidthDp = smallestScreenWidthDp; - } + public final static int MNC_ZERO = -1; - public String getSmallestScreenWidthDp() { - return smallestScreenWidthDp; - } + public final static short MASK_LAYOUTDIR = 0xc0; + public final static short SCREENLAYOUT_LAYOUTDIR_ANY = 0x00; + public final static short SCREENLAYOUT_LAYOUTDIR_LTR = 0x40; + public final static short SCREENLAYOUT_LAYOUTDIR_RTL = 0x80; + public final static short SCREENLAYOUT_LAYOUTDIR_SHIFT = 0x06; - public void setOrientation(String orientation) { - this.orientation = orientation; - } + public final static short MASK_SCREENROUND = 0x03; + public final static short SCREENLAYOUT_ROUND_ANY = 0; + public final static short SCREENLAYOUT_ROUND_NO = 0x1; + public final static short SCREENLAYOUT_ROUND_YES = 0x2; - public String getOrientation() { - return orientation; - } + public final static byte KEYBOARD_ANY = 0; + public final static byte KEYBOARD_NOKEYS = 1; + public final static byte KEYBOARD_QWERTY = 2; + public final static byte KEYBOARD_12KEY = 3; - public void setScreenWidthDp(String screenWidthDp) { - this.screenWidthDp = screenWidthDp; - } + public final static byte NAVIGATION_ANY = 0; + public final static byte NAVIGATION_NONAV = 1; + public final static byte NAVIGATION_DPAD = 2; + public final static byte NAVIGATION_TRACKBALL = 3; + public final static byte NAVIGATION_WHEEL = 4; - public String getScreenWidthDp() { - return screenWidthDp; - } + public final static byte MASK_KEYSHIDDEN = 0x3; + public final static byte KEYSHIDDEN_ANY = 0x0; + public final static byte KEYSHIDDEN_NO = 0x1; + public final static byte KEYSHIDDEN_YES = 0x2; + public final static byte KEYSHIDDEN_SOFT = 0x3; - public void setScreenHeightDp(String screenHeightDp) { - this.screenHeightDp = screenHeightDp; - } + public final static byte MASK_NAVHIDDEN = 0xc; + public final static byte NAVHIDDEN_ANY = 0x0; + public final static byte NAVHIDDEN_NO = 0x4; + public final static byte NAVHIDDEN_YES = 0x8; - public String getScreenHeightDp() { - return screenHeightDp; - } + public final static byte MASK_SCREENSIZE = 0x0f; + public final static byte SCREENSIZE_ANY = 0x00; + public final static byte SCREENSIZE_SMALL = 0x01; + public final static byte SCREENSIZE_NORMAL = 0x02; + public final static byte SCREENSIZE_LARGE = 0x03; + public final static byte SCREENSIZE_XLARGE = 0x04; + + public final static byte MASK_SCREENLONG = 0x30; + public final static byte SCREENLONG_ANY = 0x00; + public final static byte SCREENLONG_NO = 0x10; + public final static byte SCREENLONG_YES = 0x20; + + public final static byte MASK_UI_MODE_TYPE = 0x0f; + public final static byte UI_MODE_TYPE_ANY = 0x00; + public final static byte UI_MODE_TYPE_NORMAL = 0x01; + public final static byte UI_MODE_TYPE_DESK = 0x02; + public final static byte UI_MODE_TYPE_CAR = 0x03; + public final static byte UI_MODE_TYPE_TELEVISION = 0x04; + public final static byte UI_MODE_TYPE_APPLIANCE = 0x05; + public final static byte UI_MODE_TYPE_WATCH = 0x06; + public final static byte UI_MODE_TYPE_VR_HEADSET = 0x07; + + // start - miui + public final static byte UI_MODE_TYPE_GODZILLAUI = 0x0b; + public final static byte UI_MODE_TYPE_SMALLUI = 0x0c; + public final static byte UI_MODE_TYPE_MEDIUMUI = 0x0d; + public final static byte UI_MODE_TYPE_LARGEUI = 0x0e; + public final static byte UI_MODE_TYPE_HUGEUI = 0x0f; + // end - miui + + public final static byte MASK_UI_MODE_NIGHT = 0x30; + public final static byte UI_MODE_NIGHT_ANY = 0x00; + public final static byte UI_MODE_NIGHT_NO = 0x10; + public final static byte UI_MODE_NIGHT_YES = 0x20; + + public final static byte COLOR_HDR_MASK = 0xC; + public final static byte COLOR_HDR_NO = 0x4; + public final static byte COLOR_HDR_SHIFT = 0x2; + public final static byte COLOR_HDR_UNDEFINED = 0x0; + public final static byte COLOR_HDR_YES = 0x8; + + public final static byte COLOR_UNDEFINED = 0x0; + + public final static byte COLOR_WIDE_UNDEFINED = 0x0; + public final static byte COLOR_WIDE_NO = 0x1; + public final static byte COLOR_WIDE_YES = 0x2; + public final static byte COLOR_WIDE_MASK = 0x3; + + private static final Logger LOG = LoggerFactory.getLogger(EntryConfig.class); } diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/entry/ResourceEntry.java b/jadx-core/src/main/java/jadx/core/xmlgen/entry/ResourceEntry.java index 33931d92a..c95ec2278 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/entry/ResourceEntry.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/entry/ResourceEntry.java @@ -75,6 +75,6 @@ public final class ResourceEntry { @Override public String toString() { - return " 0x" + Integer.toHexString(id) + " (" + id + ")" + config + " = " + typeName + "." + keyName; + return " 0x" + Integer.toHexString(id) + " (" + id + ')' + config + " = " + typeName + '.' + keyName; } } diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/entry/ValuesParser.java b/jadx-core/src/main/java/jadx/core/xmlgen/entry/ValuesParser.java index ed02114a0..bd8e51877 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/entry/ValuesParser.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/entry/ValuesParser.java @@ -60,7 +60,7 @@ public class ValuesParser extends ParserConstants { if (nameStr == null) { strList.add(valueStr); } else { - strList.add(nameStr + "=" + valueStr); + strList.add(nameStr + '=' + valueStr); } } return strList.toString(); @@ -110,7 +110,7 @@ public class ValuesParser extends ParserConstants { } return "?unknown_ref: " + Integer.toHexString(data); } - return "@" + ri; + return '@' + ri; } case TYPE_ATTRIBUTE: { @@ -122,7 +122,7 @@ public class ValuesParser extends ParserConstants { } return "?unknown_attr_ref: " + Integer.toHexString(data); } - return "?" + ri; + return '?' + ri; } case TYPE_DIMENSION: @@ -132,7 +132,7 @@ public class ValuesParser extends ParserConstants { default: LOG.warn("Unknown data type: 0x{} {}", Integer.toHexString(dataType), data); - return " ?0x" + Integer.toHexString(dataType) + " " + data; + return " ?0x" + Integer.toHexString(dataType) + ' ' + data; } } @@ -215,7 +215,7 @@ public class ValuesParser extends ParserConstants { } private static String floatToString(float value) { - return doubleToString((double) value); + return doubleToString(value); } public static Map getAndroidResMap() { diff --git a/jadx-core/src/test/groovy/jadx/tests/TestAttributeStorage.groovy b/jadx-core/src/test/groovy/jadx/tests/TestAttributeStorage.groovy deleted file mode 100644 index 89204f9e7..000000000 --- a/jadx-core/src/test/groovy/jadx/tests/TestAttributeStorage.groovy +++ /dev/null @@ -1,82 +0,0 @@ -package jadx.tests - -import jadx.core.dex.attributes.AType -import jadx.core.dex.attributes.AttributeStorage -import jadx.core.dex.attributes.IAttribute -import spock.lang.Specification - -import static jadx.core.dex.attributes.AFlag.SYNTHETIC - -class TestAttributeStorage extends Specification { - - AttributeStorage storage - - def setup() { - storage = new AttributeStorage() - } - - def "add flag"() { - when: - storage.add(SYNTHETIC) - then: - storage.contains(SYNTHETIC) - } - - def "remove flag"() { - setup: - storage.add(SYNTHETIC) - when: - storage.remove(SYNTHETIC) - then: - !storage.contains(SYNTHETIC) - } - - def TEST = new AType() - class TestAttr implements IAttribute { - AType getType() { TEST } - } - - def "add attribute"() { - setup: - def attr = new TestAttr() - when: - storage.add(attr) - then: - storage.contains(TEST) - storage.get(TEST) == attr - } - - def "remove attribute"() { - setup: - def attr = new TestAttr() - storage.add(attr) - when: - storage.remove(attr) - then: - !storage.contains(TEST) - storage.get(TEST) == null - } - - def "remove attribute other"() { - setup: - def attr = new TestAttr() - storage.add(attr) - when: - storage.remove(new TestAttr()) - then: - storage.contains(TEST) - storage.get(TEST) == attr - } - - def "clear"() { - setup: - storage.add(SYNTHETIC) - storage.add(new TestAttr()) - when: - storage.clear() - then: - !storage.contains(SYNTHETIC) - !storage.contains(TEST) - } - -} diff --git a/jadx-core/src/test/groovy/jadx/tests/TestNameMapper.groovy b/jadx-core/src/test/groovy/jadx/tests/TestNameMapper.groovy deleted file mode 100644 index ecd9b429c..000000000 --- a/jadx-core/src/test/groovy/jadx/tests/TestNameMapper.groovy +++ /dev/null @@ -1,39 +0,0 @@ -package jadx.tests - -import spock.lang.Specification - -import static jadx.core.deobf.NameMapper.isValidFullIdentifier - -class TestNameMapper extends Specification { - - def "test is Valid Full Identifier"() { - expect: - isValidFullIdentifier(valid) - where: - valid << [ - 'C', - 'Cc', - 'b.C', - 'b.Cc', - 'aAa.b.Cc', - 'a.b.Cc', - 'a.b.C_c', - 'a.b.C$c', - 'a.b.C9' - ] - } - - def "test is not Valid Full Identifier"() { - expect: - !isValidFullIdentifier(invalid) - where: - invalid << [ - '', - '5', - '7A', - '.C', - 'b.9C', - 'b..C', - ] - } -} diff --git a/jadx-core/src/test/groovy/jadx/tests/TestSignatureParser.groovy b/jadx-core/src/test/groovy/jadx/tests/TestSignatureParser.groovy deleted file mode 100644 index 02f11fa61..000000000 --- a/jadx-core/src/test/groovy/jadx/tests/TestSignatureParser.groovy +++ /dev/null @@ -1,107 +0,0 @@ -package jadx.tests - -import jadx.core.dex.instructions.args.ArgType -import jadx.core.dex.nodes.parser.SignatureParser -import spock.lang.Specification - -import static jadx.core.dex.instructions.args.ArgType.* - -class TestSignatureParser extends Specification { - def "simple types"() { - expect: - new SignatureParser(str).consumeType() == result - - where: - str | result - "" | null - "I" | INT - "[I" | array(INT) - "Ljava/lang/Object;" | OBJECT - "[Ljava/lang/Object;" | array(OBJECT) - "[[I" | array(array(INT)) - } - - def "generics"() { - expect: - new SignatureParser(str).consumeType() == result - - where: - str | result - "TD;" | genericType("D") - "La;" | generic("La;", genericType("V"), object("b")) - "La;>;" | generic("La;", generic("Lb;", object("Lc;"))) - "La/b/C;>;" | generic("La/b/C;", generic("Ld/E;", object("Lf/G;"))) - "La.c;" | genericInner(generic("La;", genericType("D")), "c", null) - "La.c/d;" | genericInner(generic("La;", genericType("D")), "c.d", null) - "La.c;" | genericInner(generic("La;", object("Lb;")), "c", genericType("V")) - } - - def "inner generic"() { - expect: - new SignatureParser(str).consumeType().getObject() == result - - where: - str | result - "La.LinkedHashIterator;>;" | "a\$LinkedHashIterator" - } - - def "wildcards"() { - expect: - new SignatureParser("La<$s>;").consumeType() == generic("La;", r as ArgType[]) - - where: - s | r - "*" | wildcard() - "+Lb;" | wildcard(object("b"), 1) - "-Lb;" | wildcard(object("b"), -1) - "+TV;" | wildcard(genericType("V"), 1) - "-TV;" | wildcard(genericType("V"), -1) - - "**" | [wildcard(), wildcard()] - "*Lb;" | [wildcard(), object("b")] - "*TV;" | [wildcard(), genericType("V")] - "TV;*" | [genericType("V"), wildcard()] - "Lb;*" | [object("b"), wildcard()] - - "***" | [wildcard(), wildcard(), wildcard()] - "*Lb;*" | [wildcard(), object("b"), wildcard()] - } - - def "generic map"() { - expect: - new SignatureParser(str).consumeGenericMap() == result.collectEntries { [genericType(it.key), it.value] } - - where: - str | result - "" | [:] - "" | ["T": []] - "" | ["K": [], "LongType": []] - "" | ["ResultT": [object("java.lang.Exception")]] - } - - def "method args"() { - when: - def argTypes = new SignatureParser("(Ljava/util/List<*>;)V").consumeMethodArgs() - then: - argTypes.size() == 1 - argTypes.get(0) == generic("Ljava/util/List;", wildcard()) - } - - def "method args 2"() { - when: - def argTypes = new SignatureParser("(La/b/C.d/E;)V").consumeMethodArgs() - then: - argTypes.size() == 1 - def argType = argTypes.get(0) - argType.getObject().indexOf('/') == -1 - argTypes.get(0) == genericInner(generic("La/b/C;", genericType("T")), "d.E", null) - } - - def "generic map: bad signature"() { - when: - def map = new SignatureParser("This would cause a failure to be considered as success and a success as failure, + * with the benefit of updating the related issue when it has been resolved even unintentionally.

+ * + *

To have an effect, the test class must be annotated with: + * + * + * @ExtendWith(NotYetImplementedExtension.class) + * + *

+ */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) +public @interface NotYetImplemented { + String value() default ""; +} diff --git a/jadx-core/src/test/java/jadx/NotYetImplementedExtension.java b/jadx-core/src/test/java/jadx/NotYetImplementedExtension.java new file mode 100644 index 000000000..1bff2ae13 --- /dev/null +++ b/jadx-core/src/test/java/jadx/NotYetImplementedExtension.java @@ -0,0 +1,38 @@ +package jadx; + +import java.lang.reflect.Method; +import java.util.HashSet; +import java.util.Set; + +import org.junit.jupiter.api.extension.AfterTestExecutionCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.TestExecutionExceptionHandler; + +public class NotYetImplementedExtension implements AfterTestExecutionCallback, TestExecutionExceptionHandler { + + private Set knownFailedMethods = new HashSet<>(); + + @Override + public void handleTestExecutionException(ExtensionContext context, Throwable throwable) throws Throwable { + if (!isNotYetImplemented(context)) { + throw throwable; + } + knownFailedMethods.add(context.getTestMethod().get()); + } + + @Override + public void afterTestExecution(ExtensionContext context) throws Exception { + if (!knownFailedMethods.contains(context.getTestMethod().get()) + && isNotYetImplemented(context) + && !context.getExecutionException().isPresent()) { + throw new AssertionError("Test " + + context.getTestClass().get().getName() + '.' + context.getTestMethod().get().getName() + + " is marked as @NotYetImplemented, but passes!"); + } + } + + private static boolean isNotYetImplemented(ExtensionContext context) { + return context.getTestMethod().get().getAnnotation(NotYetImplemented.class) != null + || context.getTestClass().get().getAnnotation(NotYetImplemented.class) != null; + } +} diff --git a/jadx-core/src/test/java/jadx/api/JadxArgsValidatorOutDirsTest.java b/jadx-core/src/test/java/jadx/api/JadxArgsValidatorOutDirsTest.java index e03775b27..e99a89a63 100644 --- a/jadx-core/src/test/java/jadx/api/JadxArgsValidatorOutDirsTest.java +++ b/jadx-core/src/test/java/jadx/api/JadxArgsValidatorOutDirsTest.java @@ -1,14 +1,14 @@ package jadx.api; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import jadx.core.utils.files.FileUtils; import static jadx.core.utils.files.FileUtils.toFile; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; public class JadxArgsValidatorOutDirsTest { diff --git a/jadx-core/src/test/java/jadx/api/JadxDecompilerTest.java b/jadx-core/src/test/java/jadx/api/JadxDecompilerTest.java index 5c3814d8d..55a5e717e 100644 --- a/jadx-core/src/test/java/jadx/api/JadxDecompilerTest.java +++ b/jadx-core/src/test/java/jadx/api/JadxDecompilerTest.java @@ -2,13 +2,13 @@ package jadx.api; import java.io.File; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; public class JadxDecompilerTest { @Test - @Ignore + @Disabled public void testExampleUsage() { JadxArgs args = new JadxArgs(); args.getInputFiles().add(new File("test.apk")); diff --git a/jadx-core/src/test/java/jadx/core/deobf/NameMapperTest.java b/jadx-core/src/test/java/jadx/core/deobf/NameMapperTest.java index b5ff7b203..14278a707 100644 --- a/jadx-core/src/test/java/jadx/core/deobf/NameMapperTest.java +++ b/jadx-core/src/test/java/jadx/core/deobf/NameMapperTest.java @@ -1,12 +1,12 @@ package jadx.core.deobf; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static jadx.core.deobf.NameMapper.isValidIdentifier; import static jadx.core.deobf.NameMapper.removeInvalidChars; import static jadx.core.deobf.NameMapper.removeInvalidCharsMiddle; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; public class NameMapperTest { diff --git a/jadx-core/src/test/java/jadx/core/dex/info/AccessInfoTest.java b/jadx-core/src/test/java/jadx/core/dex/info/AccessInfoTest.java index 7fd7acc87..f0e984ecc 100644 --- a/jadx-core/src/test/java/jadx/core/dex/info/AccessInfoTest.java +++ b/jadx-core/src/test/java/jadx/core/dex/info/AccessInfoTest.java @@ -1,13 +1,13 @@ package jadx.core.dex.info; import com.android.dx.rop.code.AccessFlags; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.info.AccessInfo.AFType; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertThat; +import static org.junit.jupiter.api.Assertions.assertSame; public class AccessInfoTest { diff --git a/jadx-core/src/test/java/jadx/core/dex/visitors/typeinference/TypeCompareTest.java b/jadx-core/src/test/java/jadx/core/dex/visitors/typeinference/TypeCompareTest.java index acdf5d8bc..2129774d0 100644 --- a/jadx-core/src/test/java/jadx/core/dex/visitors/typeinference/TypeCompareTest.java +++ b/jadx-core/src/test/java/jadx/core/dex/visitors/typeinference/TypeCompareTest.java @@ -2,9 +2,12 @@ package jadx.core.dex.visitors.typeinference; import java.util.Collections; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import jadx.NotYetImplemented; +import jadx.NotYetImplementedExtension; import jadx.api.JadxArgs; import jadx.core.dex.instructions.args.ArgType; import jadx.core.dex.nodes.RootNode; @@ -19,13 +22,14 @@ import static jadx.core.dex.instructions.args.ArgType.UNKNOWN; import static jadx.core.dex.instructions.args.ArgType.UNKNOWN_ARRAY; import static jadx.core.dex.instructions.args.ArgType.UNKNOWN_OBJECT; import static jadx.core.dex.instructions.args.ArgType.array; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; +@ExtendWith(NotYetImplementedExtension.class) public class TypeCompareTest { private TypeCompare compare; - @Before + @BeforeEach public void init() { JadxArgs args = new JadxArgs(); RootNode root = new RootNode(args); @@ -99,10 +103,15 @@ public class TypeCompareTest { check(tType, ArgType.OBJECT, TypeCompareEnum.NARROW_BY_GENERIC); check(ArgType.OBJECT, tType, TypeCompareEnum.WIDER_BY_GENERIC); + } + @Test + @NotYetImplemented + public void compareGenericTypesNYI() { + ArgType vType = ArgType.genericType("V"); // TODO: use extend types from generic declaration for more strict checks -// check(vType, ArgType.STRING, TypeCompareEnum.CONFLICT); -// check(ArgType.STRING, vType, TypeCompareEnum.CONFLICT); + check(vType, ArgType.STRING, TypeCompareEnum.CONFLICT); + check(ArgType.STRING, vType, TypeCompareEnum.CONFLICT); } private void firstIsNarrow(ArgType first, ArgType second) { diff --git a/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java b/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java index 1070345f0..8e4bca9a0 100644 --- a/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java +++ b/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java @@ -35,16 +35,16 @@ import jadx.tests.api.compiler.StaticCompiler; import jadx.tests.api.utils.TestUtils; import static jadx.core.utils.files.FileUtils.addFileToJar; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.notNullValue; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; public abstract class IntegrationTest extends TestUtils { @@ -92,9 +92,21 @@ public abstract class IntegrationTest extends TestUtils { } public ClassNode getClassNodeFromFile(File file, String clsName) { + JadxDecompiler d = loadFiles(Collections.singletonList(file)); + RootNode root = JadxInternalAccess.getRoot(d); + + ClassNode cls = root.searchClassByName(clsName); + assertThat("Class not found: " + clsName, cls, notNullValue()); + assertThat(clsName, is(cls.getClassInfo().getFullName())); + + decompileAndCheckCls(d, cls); + return cls; + } + + protected JadxDecompiler loadFiles(List inputFiles) { JadxDecompiler d = null; try { - args.setInputFiles(Collections.singletonList(file)); + args.setInputFiles(inputFiles); d = new JadxDecompiler(args); d.load(); } catch (Exception e) { @@ -103,11 +115,10 @@ public abstract class IntegrationTest extends TestUtils { } RootNode root = JadxInternalAccess.getRoot(d); insertResources(root); + return d; + } - ClassNode cls = root.searchClassByName(clsName); - assertThat("Class not found: " + clsName, cls, notNullValue()); - assertThat(clsName, is(cls.getClassInfo().getFullName())); - + protected void decompileAndCheckCls(JadxDecompiler d, ClassNode cls) { if (unloadCls) { decompile(d, cls); } else { @@ -120,8 +131,7 @@ public abstract class IntegrationTest extends TestUtils { checkCode(cls); compile(cls); - runAutoCheck(clsName); - return cls; + runAutoCheck(cls.getClassInfo().getFullName()); } private void insertResources(RootNode root) { @@ -162,9 +172,9 @@ public abstract class IntegrationTest extends TestUtils { } protected static void checkCode(ClassNode cls) { - assertFalse("Inconsistent cls: " + cls, hasErrors(cls)); + assertFalse(hasErrors(cls), "Inconsistent cls: " + cls); for (MethodNode mthNode : cls.getMethods()) { - assertFalse("Method with problems: " + mthNode, hasErrors(mthNode)); + assertFalse(hasErrors(mthNode), "Method with problems: " + mthNode); } assertThat(cls.getCode().toString(), not(containsString("inconsistent"))); } @@ -257,7 +267,7 @@ public abstract class IntegrationTest extends TestUtils { try { dynamicCompiler = new DynamicCompiler(cls); boolean result = dynamicCompiler.compile(); - assertTrue("Compilation failed", result); + assertTrue(result, "Compilation failed"); System.out.println("Compilation: PASSED"); } catch (Exception e) { e.printStackTrace(); @@ -275,7 +285,7 @@ public abstract class IntegrationTest extends TestUtils { } public Method getReflectMethod(String method, Class... types) { - assertNotNull("dynamicCompiler not ready", dynamicCompiler); + assertNotNull(dynamicCompiler, "dynamicCompiler not ready"); try { return dynamicCompiler.getMethod(method, types); } catch (Exception e) { @@ -286,8 +296,8 @@ public abstract class IntegrationTest extends TestUtils { } public Object invoke(Method mth, Object... args) throws Exception { - assertNotNull("dynamicCompiler not ready", dynamicCompiler); - assertNotNull("unknown method", mth); + assertNotNull(dynamicCompiler, "dynamicCompiler not ready"); + assertNotNull(mth, "unknown method"); return dynamicCompiler.invoke(mth, args); } @@ -427,7 +437,7 @@ public abstract class IntegrationTest extends TestUtils { protected void setOutputCFG() { this.args.setCfgOutput(true); this.args.setRawCFGOutput(true); - } // Use only for debug purpose + } // Use only for debug purpose @Deprecated protected void setOutputRawCFG() { diff --git a/jadx-core/src/test/java/jadx/tests/api/SmaliTest.java b/jadx-core/src/test/java/jadx/tests/api/SmaliTest.java index 49658e4e0..baabbda9c 100644 --- a/jadx-core/src/test/java/jadx/tests/api/SmaliTest.java +++ b/jadx-core/src/test/java/jadx/tests/api/SmaliTest.java @@ -6,11 +6,16 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; +import org.jetbrains.annotations.Nullable; import org.jf.smali.Smali; import org.jf.smali.SmaliOptions; +import jadx.api.JadxDecompiler; import jadx.core.dex.nodes.ClassNode; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.notNullValue; + public abstract class SmaliTest extends IntegrationTest { private static final String SMALI_TESTS_PROJECT = "jadx-core"; @@ -24,6 +29,10 @@ public abstract class SmaliTest extends IntegrationTest { return getClassNodeFromFile(outDex, clsName); } + protected ClassNode getClassNodeFromSmali(String clsName) { + return getClassNodeFromSmali(clsName, clsName); + } + protected ClassNode getClassNodeFromSmaliWithPath(String path, String clsName) { return getClassNodeFromSmali(path + File.separatorChar + clsName, clsName); } @@ -32,17 +41,37 @@ public abstract class SmaliTest extends IntegrationTest { return getClassNodeFromSmali(pkg + File.separatorChar + clsName, pkg + '.' + clsName); } - protected ClassNode getClassNodeFromSmaliFiles(String pkg, String testName, String clsName, String... smaliFileNames) { + protected ClassNode getClassNodeFromSmaliFiles(String pkg, String testName, String clsName) { File outDex = createTempFile(".dex"); - List smaliFiles = Arrays.stream(smaliFileNames) - .map(file -> getSmaliFile(pkg + File.separatorChar + testName + File.separatorChar + file)) - .collect(Collectors.toList()); - compileSmali(outDex, smaliFiles); + compileSmali(outDex, collectSmaliFiles(pkg, testName)); return getClassNodeFromFile(outDex, pkg + "." + clsName); } - protected ClassNode getClassNodeFromSmali(String clsName) { - return getClassNodeFromSmali(clsName, clsName); + protected JadxDecompiler loadSmaliFile(String pkg, String smaliFileName) { + File outDex = createTempFile(".dex"); + compileSmali(outDex, Collections.singletonList(getSmaliFile(pkg + File.separatorChar + smaliFileName))); + return loadFiles(Collections.singletonList(outDex)); + } + + protected JadxDecompiler loadSmaliFiles(String pkg, String testNameDir) { + File outDex = createTempFile(".dex"); + compileSmali(outDex, collectSmaliFiles(pkg, testNameDir)); + return loadFiles(Collections.singletonList(outDex)); + } + + private List collectSmaliFiles(String pkg, @Nullable String testDir) { + String smaliFilesDir; + if (testDir == null) { + smaliFilesDir = pkg + File.separatorChar; + } else { + smaliFilesDir = pkg + File.separatorChar + testDir + File.separatorChar; + } + File smaliDir = new File(SMALI_TESTS_DIR, smaliFilesDir); + String[] smaliFileNames = smaliDir.list((dir, name) -> name.endsWith(".smali")); + assertThat("Smali files not found", smaliFileNames, notNullValue()); + return Arrays.stream(smaliFileNames) + .map(file -> new File(smaliDir, file)) + .collect(Collectors.toList()); } private static File getSmaliFile(String baseName) { diff --git a/jadx-core/src/test/java/jadx/tests/api/compiler/ClassFileManager.java b/jadx-core/src/test/java/jadx/tests/api/compiler/ClassFileManager.java index d07e1511a..da3c61610 100644 --- a/jadx-core/src/test/java/jadx/tests/api/compiler/ClassFileManager.java +++ b/jadx-core/src/test/java/jadx/tests/api/compiler/ClassFileManager.java @@ -22,7 +22,7 @@ public class ClassFileManager extends ForwardingJavaFileManager TEST = new AType<>(); + + public static class TestAttr implements IAttribute { + @Override + public AType getType() { + return TEST; + } + } + + @Test + public void testAddAttribute() { + TestAttr attr = new TestAttr(); + storage.add(attr); + + assertThat(storage.contains(TEST), is(true)); + assertThat(storage.get(TEST), is(attr)); + } + + @Test + public void testRemoveAttribute() { + TestAttr attr = new TestAttr(); + storage.add(attr); + storage.remove(attr); + + assertThat(storage.contains(TEST), is(false)); + assertThat(storage.get(TEST), nullValue()); + } + + @Test + public void testRemoveOtherAttribute() { + TestAttr attr = new TestAttr(); + storage.add(attr); + storage.remove(new TestAttr()); + + assertThat(storage.contains(TEST), is(true)); + assertThat(storage.get(TEST), is(attr)); + } + + @Test + public void clear() { + storage.add(SYNTHETIC); + storage.add(new TestAttr()); + storage.clear(); + + assertThat(storage.contains(SYNTHETIC), is(false)); + assertThat(storage.contains(TEST), is(false)); + assertThat(storage.get(TEST), nullValue()); + } +} diff --git a/jadx-core/src/test/java/jadx/tests/functional/JadxClasspathTest.java b/jadx-core/src/test/java/jadx/tests/functional/JadxClasspathTest.java index 6b472f9cb..e9911980e 100644 --- a/jadx-core/src/test/java/jadx/tests/functional/JadxClasspathTest.java +++ b/jadx-core/src/test/java/jadx/tests/functional/JadxClasspathTest.java @@ -2,8 +2,8 @@ package jadx.tests.functional; import java.io.IOException; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import jadx.core.clsp.ClspGraph; import jadx.core.dex.instructions.args.ArgType; @@ -13,8 +13,8 @@ import jadx.core.utils.exceptions.DecodeException; import static jadx.core.dex.instructions.args.ArgType.STRING; import static jadx.core.dex.instructions.args.ArgType.object; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -26,7 +26,7 @@ public class JadxClasspathTest { private DexNode dex; private ClspGraph clsp; - @Before + @BeforeEach public void initClsp() throws IOException, DecodeException { clsp = new ClspGraph(); clsp.load(); diff --git a/jadx-core/src/test/java/jadx/tests/functional/JadxVisitorsOrderTest.java b/jadx-core/src/test/java/jadx/tests/functional/JadxVisitorsOrderTest.java index 3a20ed9b7..99e3ba561 100644 --- a/jadx-core/src/test/java/jadx/tests/functional/JadxVisitorsOrderTest.java +++ b/jadx-core/src/test/java/jadx/tests/functional/JadxVisitorsOrderTest.java @@ -5,7 +5,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,8 +14,8 @@ import jadx.core.Jadx; import jadx.core.dex.visitors.IDexTreeVisitor; import jadx.core.dex.visitors.JadxVisitor; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; -import static org.junit.Assert.assertThat; public class JadxVisitorsOrderTest { diff --git a/jadx-core/src/test/java/jadx/tests/functional/NameMapperTest.java b/jadx-core/src/test/java/jadx/tests/functional/NameMapperTest.java new file mode 100644 index 000000000..58f4b6968 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/functional/NameMapperTest.java @@ -0,0 +1,44 @@ +package jadx.tests.functional; + +import org.junit.jupiter.api.Test; + +import jadx.core.deobf.NameMapper; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +public class NameMapperTest { + + @Test + public void testValidFullIdentifiers() { + String[] validNames = { + "C", + "Cc", + "b.C", + "b.Cc", + "aAa.b.Cc", + "a.b.Cc", + "a.b.C_c", + "a.b.C$c", + "a.b.C9" + }; + for (String validName : validNames) { + assertThat(NameMapper.isValidFullIdentifier(validName), is(true)); + } + } + + @Test + public void testInvalidFullIdentifiers() { + String[] invalidNames = { + "", + "5", + "7A", + ".C", + "b.9C", + "b..C", + }; + for (String invalidName : invalidNames) { + assertThat(NameMapper.isValidFullIdentifier(invalidName), is(false)); + } + } +} diff --git a/jadx-core/src/test/java/jadx/tests/functional/SignatureParserTest.java b/jadx-core/src/test/java/jadx/tests/functional/SignatureParserTest.java new file mode 100644 index 000000000..34d1c1271 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/functional/SignatureParserTest.java @@ -0,0 +1,128 @@ +package jadx.tests.functional; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +import jadx.core.dex.instructions.args.ArgType; +import jadx.core.dex.nodes.parser.SignatureParser; + +import static jadx.core.dex.instructions.args.ArgType.INT; +import static jadx.core.dex.instructions.args.ArgType.OBJECT; +import static jadx.core.dex.instructions.args.ArgType.array; +import static jadx.core.dex.instructions.args.ArgType.generic; +import static jadx.core.dex.instructions.args.ArgType.genericInner; +import static jadx.core.dex.instructions.args.ArgType.genericType; +import static jadx.core.dex.instructions.args.ArgType.object; +import static jadx.core.dex.instructions.args.ArgType.wildcard; +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.anEmptyMap; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; + +class SignatureParserTest { + + @Test + public void testSimpleTypes() { + checkType("", null); + checkType("I", INT); + checkType("[I", array(INT)); + checkType("Ljava/lang/Object;", OBJECT); + checkType("[Ljava/lang/Object;", array(OBJECT)); + checkType("[[I", array(array(INT))); + } + + private static void checkType(String str, ArgType type) { + assertThat(new SignatureParser(str).consumeType(), is(type)); + } + + @Test + public void testGenerics() { + checkType("TD;", genericType("D")); + checkType("La;", generic("La;", new ArgType[]{genericType("V"), object("b")})); + checkType("La;>;", generic("La;", new ArgType[]{generic("Lb;", new ArgType[]{object("Lc;")})})); + checkType("La/b/C;>;", generic("La/b/C;", new ArgType[]{generic("Ld/E;", new ArgType[]{object("Lf/G;")})})); + checkType("La.c;", genericInner(generic("La;", new ArgType[]{genericType("D")}), "c", null)); + checkType("La.c/d;", genericInner(generic("La;", new ArgType[]{genericType("D")}), "c.d", null)); + checkType("La.c;", genericInner(generic("La;", new ArgType[]{object("Lb;")}), "c", new ArgType[]{genericType("V")})); + } + + @Test + public void testInnerGeneric() { + String signature = "La.LinkedHashIterator;>;"; + String objectStr = new SignatureParser(signature).consumeType().getObject(); + assertThat(objectStr, is("a$LinkedHashIterator")); + } + + @Test + public void testWildcards() { + checkWildcards("*", wildcard()); + checkWildcards("+Lb;", wildcard(object("b"), 1)); + checkWildcards("-Lb;", wildcard(object("b"), -1)); + checkWildcards("+TV;", wildcard(genericType("V"), 1)); + checkWildcards("-TV;", wildcard(genericType("V"), -1)); + + checkWildcards("**", wildcard(), wildcard()); + checkWildcards("*Lb;", wildcard(), object("b")); + checkWildcards("*TV;", wildcard(), genericType("V")); + checkWildcards("TV;*", genericType("V"), wildcard()); + checkWildcards("Lb;*", object("b"), wildcard()); + + checkWildcards("***", wildcard(), wildcard(), wildcard()); + checkWildcards("*Lb;*", wildcard(), object("b"), wildcard()); + } + + private static void checkWildcards(String w, ArgType... types) { + ArgType parsedType = new SignatureParser("La<" + w + ">;").consumeType(); + ArgType expectedType = generic("La;", types); + assertThat(parsedType, is(expectedType)); + } + + @Test + public void testGenericMap() { + checkGenerics(""); + checkGenerics("", "T", emptyList()); + checkGenerics("", "K", emptyList(), "LongType", emptyList()); + checkGenerics("", "ResultT", singletonList(object("java.lang.Exception"))); + } + + @SuppressWarnings("unchecked") + private static void checkGenerics(String g, Object... objs) { + Map> map = new SignatureParser(g).consumeGenericMap(); + Map> expectedMap = new LinkedHashMap<>(); + for (int i = 0; i < objs.length; i += 2) { + ArgType generic = genericType((String) objs[i]); + List list = (List) objs[i + 1]; + expectedMap.put(generic, list); + } + assertThat(map, is(expectedMap)); + } + + @Test + public void testMethodArgs() { + List argTypes = new SignatureParser("(Ljava/util/List<*>;)V").consumeMethodArgs(); + + assertThat(argTypes, hasSize(1)); + assertThat(argTypes.get(0), is(generic("Ljava/util/List;", new ArgType[]{wildcard()}))); + } + + @Test + public void testMethodArgs2() { + List argTypes = new SignatureParser("(La/b/C.d/E;)V").consumeMethodArgs(); + + assertThat(argTypes, hasSize(1)); + ArgType argType = argTypes.get(0); + assertThat(argType.getObject().indexOf('/'), is(-1)); + assertThat(argType, is(genericInner(generic("La/b/C;", new ArgType[]{genericType("T")}), "d.E", null))); + } + + @Test + public void testBadGenericMap() { + Map> map = new SignatureParser(" 0); - assertTrue(err.getExceptionTypes()[0] == Exception.class); + assertSame(err.getExceptionTypes()[0], Exception.class); Method d = cls.getMethod("depr", String[].class); assertTrue(d.getAnnotations().length > 0); - assertTrue(d.getAnnotations()[0].annotationType() == Deprecated.class); + assertSame(d.getAnnotations()[0].annotationType(), Deprecated.class); Method ma = cls.getMethod("test", String[].class); assertTrue(ma.getAnnotations().length > 0); MyAnnotation a = (MyAnnotation) ma.getAnnotations()[0]; - assertTrue(a.num() == 7); - assertTrue(a.state() == Thread.State.TERMINATED); + assertEquals(7, a.num()); + assertSame(a.state(), Thread.State.TERMINATED); return true; } @@ -100,10 +103,6 @@ public class TestAnnotationsMix extends IntegrationTest { String code = cls.getCode().toString(); assertThat(code, not(containsString("int i = false;"))); - - // TODO -// assertThat(code, not(containsString("Thread thread = new Thread();"))); -// assertThat(code, containsString("new Thread();")); } @Test @@ -111,4 +110,14 @@ public class TestAnnotationsMix extends IntegrationTest { noDebugInfo(); getClassNode(TestCls.class); } + + @Test + @NotYetImplemented + public void testNYI() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, not(containsString("Thread thread = new Thread();"))); + assertThat(code, containsString("new Thread();")); + } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/annotations/TestParamAnnotations.java b/jadx-core/src/test/java/jadx/tests/integration/annotations/TestParamAnnotations.java index 9738bd568..9eac38b3d 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/annotations/TestParamAnnotations.java +++ b/jadx-core/src/test/java/jadx/tests/integration/annotations/TestParamAnnotations.java @@ -5,13 +5,13 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestParamAnnotations extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith.java b/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith.java index 639634356..a2618978f 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith.java @@ -1,6 +1,6 @@ package jadx.tests.integration.arith; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; diff --git a/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith2.java b/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith2.java index dee0d8ff3..45941f02e 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith2.java @@ -5,7 +5,7 @@ import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestArith2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith3.java b/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith3.java index 2ab65cc2b..7132e0699 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith3.java @@ -1,6 +1,6 @@ package jadx.tests.integration.arith; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -8,7 +8,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestArith3 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/arith/TestArithConst.java b/jadx-core/src/test/java/jadx/tests/integration/arith/TestArithConst.java index 8476f3354..688733cea 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arith/TestArithConst.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arith/TestArithConst.java @@ -1,12 +1,12 @@ package jadx.tests.integration.arith; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestArithConst extends SmaliTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/arith/TestArithNot.java b/jadx-core/src/test/java/jadx/tests/integration/arith/TestArithNot.java index dc7944077..9eedade4f 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arith/TestArithNot.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arith/TestArithNot.java @@ -1,13 +1,13 @@ package jadx.tests.integration.arith; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestArithNot extends SmaliTest { /* diff --git a/jadx-core/src/test/java/jadx/tests/integration/arith/TestFieldIncrement.java b/jadx-core/src/test/java/jadx/tests/integration/arith/TestFieldIncrement.java index 1811c403b..728bf722e 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arith/TestFieldIncrement.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arith/TestFieldIncrement.java @@ -1,12 +1,12 @@ package jadx.tests.integration.arith; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestFieldIncrement extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/arith/TestFieldIncrement2.java b/jadx-core/src/test/java/jadx/tests/integration/arith/TestFieldIncrement2.java index ca0a66433..72820efba 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arith/TestFieldIncrement2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arith/TestFieldIncrement2.java @@ -1,12 +1,13 @@ package jadx.tests.integration.arith; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import jadx.NotYetImplemented; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestFieldIncrement2 extends IntegrationTest { @@ -33,7 +34,14 @@ public class TestFieldIncrement2 extends IntegrationTest { assertThat(code, containsString("this.a.f += n;")); assertThat(code, containsString("a2.f *= n;")); - // TODO: - // assertThat(code, containsString("this.a.f *= n;")); + } + + @Test + @NotYetImplemented + public void test2() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, containsString("this.a.f *= n;")); } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/arith/TestFieldIncrement3.java b/jadx-core/src/test/java/jadx/tests/integration/arith/TestFieldIncrement3.java index 166f43b41..372c7ce1d 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arith/TestFieldIncrement3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arith/TestFieldIncrement3.java @@ -2,13 +2,13 @@ package jadx.tests.integration.arith; import java.util.Random; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestFieldIncrement3 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/arith/TestSpecialValues.java b/jadx-core/src/test/java/jadx/tests/integration/arith/TestSpecialValues.java index 8a2f0a730..504c2c32c 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arith/TestSpecialValues.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arith/TestSpecialValues.java @@ -1,12 +1,12 @@ package jadx.tests.integration.arith; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestSpecialValues extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrayFill.java b/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrayFill.java index eda1c0998..9768a1afe 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrayFill.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrayFill.java @@ -1,12 +1,12 @@ package jadx.tests.integration.arrays; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestArrayFill extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrayFill2.java b/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrayFill2.java index 1904b8516..1ef487398 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrayFill2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrayFill2.java @@ -1,12 +1,13 @@ package jadx.tests.integration.arrays; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import jadx.NotYetImplemented; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestArrayFill2 extends IntegrationTest { @@ -15,11 +16,6 @@ public class TestArrayFill2 extends IntegrationTest { public int[] test(int a) { return new int[]{1, a + 1, 2}; } - - // TODO -// public int[] test2(int a) { -// return new int[]{1, a++, a * 2}; -// } } @Test @@ -28,8 +24,21 @@ public class TestArrayFill2 extends IntegrationTest { String code = cls.getCode().toString(); assertThat(code, containsString("return new int[]{1, a + 1, 2};")); + } - // TODO - // assertThat(code, containsString("return new int[]{1, a++, a * 2};")); + public static class TestCls2 { + + public int[] test2(int a) { + return new int[]{1, a++, a * 2}; + } + } + + @Test + @NotYetImplemented + public void test2() { + ClassNode cls = getClassNode(TestCls2.class); + String code = cls.getCode().toString(); + + assertThat(code, containsString("return new int[]{1, a++, a * 2};")); } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrayFillConstReplace.java b/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrayFillConstReplace.java index 8371016b6..960c30b38 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrayFillConstReplace.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrayFillConstReplace.java @@ -1,12 +1,12 @@ package jadx.tests.integration.arrays; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestArrayFillConstReplace extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrays.java b/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrays.java index 8b3587ac5..59adc5fa0 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrays.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrays.java @@ -1,12 +1,12 @@ package jadx.tests.integration.arrays; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestArrays extends IntegrationTest { public static class TestCls { diff --git a/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrays2.java b/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrays2.java index 9f0235dab..d68e769eb 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrays2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrays2.java @@ -1,13 +1,13 @@ package jadx.tests.integration.arrays; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.instanceOf; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestArrays2 extends IntegrationTest { public static class TestCls { diff --git a/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrays3.java b/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrays3.java index 7c7f54eb8..28d10cd7a 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrays3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrays3.java @@ -1,14 +1,14 @@ package jadx.tests.integration.arrays; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; public class TestArrays3 extends IntegrationTest { public static class TestCls { @@ -21,7 +21,7 @@ public class TestArrays3 extends IntegrationTest { byte[] inputArr = {1, 2}; Object result = test(inputArr); assertThat(result, instanceOf(Object[].class)); - assertThat(((Object[])result)[0], is(inputArr)); + assertThat(((Object[]) result)[0], is(inputArr)); } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrays4.java b/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrays4.java index ca109c41f..9a8b768e4 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrays4.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrays4.java @@ -1,12 +1,12 @@ package jadx.tests.integration.arrays; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestArrays4 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/arrays/TestMultiDimArrayFill.java b/jadx-core/src/test/java/jadx/tests/integration/arrays/TestMultiDimArrayFill.java index bed241eda..c4f9fcb21 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arrays/TestMultiDimArrayFill.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arrays/TestMultiDimArrayFill.java @@ -1,12 +1,12 @@ package jadx.tests.integration.arrays; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestMultiDimArrayFill extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestCmpOp.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestCmpOp.java index 0936b1529..22c866810 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestCmpOp.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestCmpOp.java @@ -1,12 +1,12 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestCmpOp extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestCmpOp2.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestCmpOp2.java index 92479b7be..f823ba22d 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestCmpOp2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestCmpOp2.java @@ -1,12 +1,12 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestCmpOp2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestComplexIf.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestComplexIf.java index 5ac1dab3f..9fc863ec3 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestComplexIf.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestComplexIf.java @@ -1,12 +1,12 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestComplexIf extends SmaliTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestComplexIf2.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestComplexIf2.java index 21ddc3311..8b0609c42 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestComplexIf2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestComplexIf2.java @@ -1,12 +1,12 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestComplexIf2 extends SmaliTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditionInLoop.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditionInLoop.java index 45d36811a..a369f6ef0 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditionInLoop.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditionInLoop.java @@ -1,13 +1,13 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; public class TestConditionInLoop extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions.java index 7434956d5..79717b765 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions.java @@ -1,13 +1,13 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestConditions extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions10.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions10.java index df73596b2..7fdebd6a2 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions10.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions10.java @@ -1,6 +1,6 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -8,7 +8,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestConditions10 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions11.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions11.java index ed2341eef..bb9b6104d 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions11.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions11.java @@ -1,6 +1,6 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -8,7 +8,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestConditions11 extends IntegrationTest { @@ -33,6 +33,5 @@ public class TestConditions11 extends IntegrationTest { assertThat(code, containsOne("f();")); assertThat(code, not(containsString("return"))); assertThat(code, not(containsString("else"))); - } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions12.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions12.java index fb92b6dde..2d386159d 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions12.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions12.java @@ -1,6 +1,6 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -8,7 +8,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestConditions12 extends IntegrationTest { @@ -65,6 +65,5 @@ public class TestConditions12 extends IntegrationTest { assertThat(code, containsOne("if (quality >= 30 && autoStop) {")); assertThat(code, containsOne("if (!autoStop && lastValidRaw > -1 && quality < 10) {")); assertThat(code, not(containsString("return"))); - } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions13.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions13.java index 58290fcfe..7c67f1a69 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions13.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions13.java @@ -1,6 +1,6 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -8,7 +8,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestConditions13 extends IntegrationTest { @@ -37,6 +37,5 @@ public class TestConditions13 extends IntegrationTest { assertThat(code, containsOne("qualityReading = false;")); assertThat(code, containsOne("} else if (raw == 0 || quality < 6 || !qualityReading) {")); assertThat(code, not(containsString("return"))); - } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions14.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions14.java index 56b68e735..df524fd15 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions14.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions14.java @@ -1,12 +1,12 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestConditions14 extends IntegrationTest { @@ -30,6 +30,5 @@ public class TestConditions14 extends IntegrationTest { assertThat(code, containsOne("boolean r = a == null ? b != null : !a.equals(b);")); assertThat(code, containsOne("if (r) {")); assertThat(code, containsOne("System.out.println(\"1\");")); - } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions15.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions15.java index 8a84d6a8e..030c79e3e 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions15.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions15.java @@ -1,12 +1,12 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestConditions15 extends IntegrationTest { @@ -64,6 +64,5 @@ public class TestConditions15 extends IntegrationTest { assertThat(code, containsOne("\"1\".equals(name)")); assertThat(code, containsOne("\"30\".equals(name)")); - } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions16.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions16.java index 4e988aaf2..d584f22d1 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions16.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions16.java @@ -1,14 +1,14 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; public class TestConditions16 extends IntegrationTest { @@ -32,6 +32,5 @@ public class TestConditions16 extends IntegrationTest { // assertThat(code, containsOne("return a < 0 || (b % 2 != 0 && a > 28) || b < 0;")); assertThat(code, containsOne("return a < 0 || ((b % 2 != 0 && a > 28) || b < 0);")); - } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions2.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions2.java index 055b1dc7e..34da34677 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions2.java @@ -1,6 +1,6 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions3.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions3.java index 455437709..71f589188 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions3.java @@ -3,14 +3,14 @@ package jadx.tests.integration.conditions; import java.util.List; import java.util.regex.Pattern; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestConditions3 extends IntegrationTest { @@ -65,7 +65,6 @@ public class TestConditions3 extends IntegrationTest { assertThat(code, containsString("return null;")); assertThat(code, not(containsString("else"))); - // TODO: fix constant inline -// assertThat(code, not(containsString("AnonymousClass_1"))); + assertThat(code, not(containsString("AnonymousClass_1"))); } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions4.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions4.java index 3033e7108..f810e2724 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions4.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions4.java @@ -1,13 +1,13 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestConditions4 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions5.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions5.java index bfcaa2d3f..c7b8281ef 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions5.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions5.java @@ -1,18 +1,18 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestConditions5 extends IntegrationTest { public static class TestCls { - public static void assertEquals(Object a1, Object a2) { + public static void test(Object a1, Object a2) { if (a1 == null) { if (a2 != null) { throw new AssertionError(a1 + " != " + a2); @@ -22,7 +22,7 @@ public class TestConditions5 extends IntegrationTest { } } - public static void assertEquals2(Object a1, Object a2) { + public static void test2(Object a1, Object a2) { if (a1 != null) { if (!a1.equals(a2)) { throw new AssertionError(a1 + " != " + a2); diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions6.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions6.java index ce793964d..94da02fd0 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions6.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions6.java @@ -2,14 +2,14 @@ package jadx.tests.integration.conditions; import java.util.List; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestConditions6 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions7.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions7.java index 6ba5deb2c..add7b73e7 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions7.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions7.java @@ -1,13 +1,13 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestConditions7 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions8.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions8.java index 4ce573a5a..9fcfd51e8 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions8.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions8.java @@ -1,12 +1,12 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestConditions8 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions9.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions9.java index 3b0bd34e3..9325627bb 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions9.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions9.java @@ -1,6 +1,6 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -8,7 +8,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestConditions9 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestElseIf.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestElseIf.java index 52e2321ef..383d175d1 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestElseIf.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestElseIf.java @@ -1,6 +1,6 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -8,7 +8,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestElseIf extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestNestedIf.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestNestedIf.java index bbe4fbd49..148bdb608 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestNestedIf.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestNestedIf.java @@ -1,13 +1,13 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static jadx.tests.api.utils.JadxMatchers.countString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestNestedIf extends IntegrationTest { @@ -42,6 +42,5 @@ public class TestNestedIf extends IntegrationTest { assertThat(code, countString(2, "return false;")); assertThat(code, containsOne("test1();")); assertThat(code, containsOne("return true;")); - } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestNestedIf2.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestNestedIf2.java index 63cc64a35..51c232e14 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestNestedIf2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestNestedIf2.java @@ -1,6 +1,6 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -8,7 +8,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestNestedIf2 extends IntegrationTest { @@ -52,6 +52,5 @@ public class TestNestedIf2 extends IntegrationTest { assertThat(code, containsOne("if (executedCount != repeatCount && isRun(delta, object)) {")); assertThat(code, containsOne("if (finished) {")); assertThat(code, not(containsString("else"))); - } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestSimpleConditions.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestSimpleConditions.java index d8a023599..fa1f4514c 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestSimpleConditions.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestSimpleConditions.java @@ -1,12 +1,12 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestSimpleConditions extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestTernary.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestTernary.java index 19455e133..c49624612 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestTernary.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestTernary.java @@ -1,14 +1,14 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; public class TestTernary extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestTernary2.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestTernary2.java index 10c1b496a..4080695d3 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestTernary2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestTernary2.java @@ -1,11 +1,14 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import jadx.NotYetImplemented; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; -import static org.junit.Assert.assertEquals; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestTernary2 extends IntegrationTest { @@ -32,7 +35,14 @@ public class TestTernary2 extends IntegrationTest { String code = cls.getCode().toString(); assertEquals(1, count(code, "f(1, 0)")); - // TODO: -// assertThat(code, containsString("checkFalse(f(1, 0) == 0);")); + } + + @Test + @NotYetImplemented + public void test2() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, containsString("assertTrue(f(1, 0) == 0);")); } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestTernary3.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestTernary3.java index f0dece784..a0bcfc107 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestTernary3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestTernary3.java @@ -1,6 +1,6 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.instructions.args.InsnArg; import jadx.core.dex.instructions.args.Named; @@ -11,7 +11,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTernary3 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestTernaryInIf.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestTernaryInIf.java index 67175bec4..c8f56e0f1 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestTernaryInIf.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestTernaryInIf.java @@ -1,6 +1,6 @@ package jadx.tests.integration.conditions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -8,7 +8,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTernaryInIf extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestLineNumbers.java b/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestLineNumbers.java index 4aa4576c7..ee62db2f1 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestLineNumbers.java +++ b/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestLineNumbers.java @@ -1,6 +1,6 @@ package jadx.tests.integration.debuginfo; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.codegen.CodeWriter; import jadx.core.dex.attributes.nodes.LineAttrNode; @@ -10,8 +10,8 @@ import jadx.core.dex.nodes.MethodNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestLineNumbers extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestLineNumbers2.java b/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestLineNumbers2.java index aad9ad13c..0e6349b3f 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestLineNumbers2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestLineNumbers2.java @@ -3,13 +3,13 @@ package jadx.tests.integration.debuginfo; import java.lang.ref.WeakReference; import java.util.Map; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.codegen.CodeWriter; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestLineNumbers2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestReturnSourceLine.java b/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestReturnSourceLine.java index 859d567bc..c6b4f970f 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestReturnSourceLine.java +++ b/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestReturnSourceLine.java @@ -1,7 +1,8 @@ package jadx.tests.integration.debuginfo; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import jadx.NotYetImplemented; import jadx.core.codegen.CodeWriter; import jadx.core.dex.attributes.nodes.LineAttrNode; import jadx.core.dex.nodes.ClassNode; @@ -9,9 +10,9 @@ import jadx.core.dex.nodes.MethodNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; public class TestReturnSourceLine extends IntegrationTest { @@ -59,10 +60,18 @@ public class TestReturnSourceLine extends IntegrationTest { // MethodNode test2 = cls.searchMethodByName("test2(I)I"); // checkLine(lines, codeWriter, test2, 3, "return v - 1;"); + } -// TODO: -// MethodNode test3 = cls.searchMethodByName("test3(I)I"); -// checkLine(lines, codeWriter, test3, 3, "return v;"); + @Test + @NotYetImplemented + public void test2() { + ClassNode cls = getClassNode(TestCls.class); + CodeWriter codeWriter = cls.getCode(); + String code = codeWriter.toString(); + String[] lines = code.split(CodeWriter.NL); + + MethodNode test3 = cls.searchMethodByName("test3(I)I"); + checkLine(lines, codeWriter, test3, 3, "return v;"); } private static void checkLine(String[] lines, CodeWriter cw, LineAttrNode node, int offset, String str) { diff --git a/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestVariablesNames.java b/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestVariablesNames.java index 098c4e5c0..356c80a66 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestVariablesNames.java +++ b/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestVariablesNames.java @@ -1,12 +1,12 @@ package jadx.tests.integration.debuginfo; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestVariablesNames extends SmaliTest { /* diff --git a/jadx-core/src/test/java/jadx/tests/integration/deobf/TestMthRename.java b/jadx-core/src/test/java/jadx/tests/integration/deobf/TestMthRename.java index 6bb21a288..e0538e7f1 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/deobf/TestMthRename.java +++ b/jadx-core/src/test/java/jadx/tests/integration/deobf/TestMthRename.java @@ -1,13 +1,13 @@ package jadx.tests.integration.deobf; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestMthRename extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums.java b/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums.java index 556faac67..eb1b066f1 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums.java +++ b/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums.java @@ -1,12 +1,12 @@ package jadx.tests.integration.enums; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsLines; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestEnums extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums2.java b/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums2.java index 2a3eee326..11f65a0e1 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums2.java @@ -1,12 +1,12 @@ package jadx.tests.integration.enums; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import jadx.tests.api.utils.JadxMatchers; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestEnums2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums3.java b/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums3.java index 37f04fcf3..2384d53f7 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums3.java @@ -1,13 +1,13 @@ package jadx.tests.integration.enums; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; public class TestEnums3 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums4.java b/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums4.java index 2c39df54d..0fb338610 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums4.java +++ b/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums4.java @@ -1,13 +1,13 @@ package jadx.tests.integration.enums; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; public class TestEnums4 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnumsInterface.java b/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnumsInterface.java index f2831660d..62a09be8b 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnumsInterface.java +++ b/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnumsInterface.java @@ -1,12 +1,12 @@ package jadx.tests.integration.enums; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import jadx.tests.api.utils.JadxMatchers; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestEnumsInterface extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnumsWithConsts.java b/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnumsWithConsts.java index d6ed1152d..6734bc8b4 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnumsWithConsts.java +++ b/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnumsWithConsts.java @@ -1,12 +1,12 @@ package jadx.tests.integration.enums; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsLines; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestEnumsWithConsts extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/enums/TestSwitchOverEnum.java b/jadx-core/src/test/java/jadx/tests/integration/enums/TestSwitchOverEnum.java index af70110a5..10fa01f09 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/enums/TestSwitchOverEnum.java +++ b/jadx-core/src/test/java/jadx/tests/integration/enums/TestSwitchOverEnum.java @@ -1,13 +1,13 @@ package jadx.tests.integration.enums; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.countString; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestSwitchOverEnum extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/enums/TestSwitchOverEnum2.java b/jadx-core/src/test/java/jadx/tests/integration/enums/TestSwitchOverEnum2.java index 482031d33..7115a3f77 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/enums/TestSwitchOverEnum2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/enums/TestSwitchOverEnum2.java @@ -1,13 +1,13 @@ package jadx.tests.integration.enums; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.countString; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestSwitchOverEnum2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/fallback/TestFallbackMode.java b/jadx-core/src/test/java/jadx/tests/integration/fallback/TestFallbackMode.java index b13cf2310..aff039140 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/fallback/TestFallbackMode.java +++ b/jadx-core/src/test/java/jadx/tests/integration/fallback/TestFallbackMode.java @@ -1,6 +1,6 @@ package jadx.tests.integration.fallback; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -8,7 +8,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestFallbackMode extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/generics/MissingGenericsTypesTest.java b/jadx-core/src/test/java/jadx/tests/integration/generics/MissingGenericsTypesTest.java new file mode 100644 index 000000000..c1521da29 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/generics/MissingGenericsTypesTest.java @@ -0,0 +1,34 @@ +package jadx.tests.integration.generics; + +import org.junit.jupiter.api.Test; + +import jadx.NotYetImplemented; +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.SmaliTest; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; + +public class MissingGenericsTypesTest extends SmaliTest { + + /* + private int x; + + public void test() { + Map map = new HashMap(); + x = 1; + for (String s : map.keySet()) { + System.out.println(s); + } + } + */ + + @Test + @NotYetImplemented + public void test() { + ClassNode cls = getClassNodeFromSmaliWithPath("generics", "MissingGenericsTypesTest"); + String code = cls.getCode().toString(); + + assertThat(code, containsString("Map { + + interface ToImport { + } + + interface NotToImport { + } + + static final class Class1 { + } + + public SuperClass(Class1 zzf) { + } +} diff --git a/jadx-core/src/test/java/jadx/tests/integration/inline/TestInline.java b/jadx-core/src/test/java/jadx/tests/integration/inline/TestInline.java index 088982bb9..66abf389b 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inline/TestInline.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inline/TestInline.java @@ -1,12 +1,12 @@ package jadx.tests.integration.inline; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestInline extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inline/TestInline2.java b/jadx-core/src/test/java/jadx/tests/integration/inline/TestInline2.java index 59a90fd95..57c4797a5 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inline/TestInline2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inline/TestInline2.java @@ -1,12 +1,12 @@ package jadx.tests.integration.inline; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestInline2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inline/TestInline3.java b/jadx-core/src/test/java/jadx/tests/integration/inline/TestInline3.java index 105309e1a..33ce72b91 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inline/TestInline3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inline/TestInline3.java @@ -1,13 +1,13 @@ package jadx.tests.integration.inline; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestInline3 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inline/TestInline6.java b/jadx-core/src/test/java/jadx/tests/integration/inline/TestInline6.java index 83a6139c2..f6778691a 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inline/TestInline6.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inline/TestInline6.java @@ -1,13 +1,13 @@ package jadx.tests.integration.inline; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestInline6 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inline/TestInlineInLoop.java b/jadx-core/src/test/java/jadx/tests/integration/inline/TestInlineInLoop.java index c6263419e..2efd2e74a 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inline/TestInlineInLoop.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inline/TestInlineInLoop.java @@ -1,12 +1,12 @@ package jadx.tests.integration.inline; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestInlineInLoop extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inline/TestIssue86.java b/jadx-core/src/test/java/jadx/tests/integration/inline/TestIssue86.java index f789dfe5f..8186cf6c0 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inline/TestIssue86.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inline/TestIssue86.java @@ -3,13 +3,13 @@ package jadx.tests.integration.inline; import java.util.ArrayList; import java.util.List; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestIssue86 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inline/TestSyntheticInline.java b/jadx-core/src/test/java/jadx/tests/integration/inline/TestSyntheticInline.java index ed13fe892..3299cf9d2 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inline/TestSyntheticInline.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inline/TestSyntheticInline.java @@ -1,13 +1,13 @@ package jadx.tests.integration.inline; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestSyntheticInline extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inline/TestSyntheticInline2.java b/jadx-core/src/test/java/jadx/tests/integration/inline/TestSyntheticInline2.java index 58e6a8c6c..aa7312c92 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inline/TestSyntheticInline2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inline/TestSyntheticInline2.java @@ -1,13 +1,13 @@ package jadx.tests.integration.inline; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestSyntheticInline2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass.java index 40b6409be..7ace92742 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass.java @@ -3,14 +3,14 @@ package jadx.tests.integration.inner; import java.io.File; import java.io.FilenameFilter; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestAnonymousClass extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass10.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass10.java index eb9e0dda2..bb7a07abd 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass10.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass10.java @@ -2,15 +2,15 @@ package jadx.tests.integration.inner; import java.util.Random; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestAnonymousClass10 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass11.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass11.java index e92edcd93..70cafc6ec 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass11.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass11.java @@ -2,15 +2,15 @@ package jadx.tests.integration.inner; import java.util.Random; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestAnonymousClass11 extends IntegrationTest { @@ -36,7 +36,6 @@ public class TestAnonymousClass11 extends IntegrationTest { } public abstract void m(); - } private void func(A a) { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass12.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass12.java index 9f41e89ec..423858c2e 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass12.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass12.java @@ -1,12 +1,12 @@ package jadx.tests.integration.inner; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestAnonymousClass12 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass2.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass2.java index 338b6889a..6ded86fe5 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass2.java @@ -1,13 +1,13 @@ package jadx.tests.integration.inner; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestAnonymousClass2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass3.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass3.java index 88e51dd6b..d5a3d7672 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass3.java @@ -1,12 +1,12 @@ package jadx.tests.integration.inner; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestAnonymousClass3 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass4.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass4.java index 46150792b..6c53a59a3 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass4.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass4.java @@ -1,13 +1,13 @@ package jadx.tests.integration.inner; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static jadx.tests.api.utils.JadxMatchers.countString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestAnonymousClass4 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass5.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass5.java index bcfd0c83b..faf5b6f59 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass5.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass5.java @@ -4,17 +4,17 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.sameInstance; -import static org.junit.Assert.assertThat; public class TestAnonymousClass5 extends IntegrationTest { @@ -79,7 +79,6 @@ public class TestAnonymousClass5 extends IntegrationTest { assertThat(code, containsOne("map.get(name);")); assertThat(code, not(containsString("access$008"))); - // TODO -// assertThat(code, not(containsString("synthetic"))); + assertThat(code, not(containsString("synthetic"))); } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass6.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass6.java index 4d6b75751..30441b1dd 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass6.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass6.java @@ -1,14 +1,14 @@ package jadx.tests.integration.inner; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestAnonymousClass6 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass7.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass7.java index 50dd716e3..b5e40a82f 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass7.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass7.java @@ -1,14 +1,14 @@ package jadx.tests.integration.inner; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestAnonymousClass7 extends IntegrationTest { @@ -20,7 +20,6 @@ public class TestAnonymousClass7 extends IntegrationTest { } }; } - } @Test diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass8.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass8.java index d0adca6f1..1dbf88d47 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass8.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass8.java @@ -1,14 +1,14 @@ package jadx.tests.integration.inner; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestAnonymousClass8 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass9.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass9.java index e26c8bb79..5733292e2 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass9.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass9.java @@ -3,15 +3,15 @@ package jadx.tests.integration.inner; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestAnonymousClass9 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestInner2Samples.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestInner2Samples.java index 30b467143..a8b457e6c 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestInner2Samples.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestInner2Samples.java @@ -1,14 +1,14 @@ package jadx.tests.integration.inner; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestInner2Samples extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass.java index 93a8ee819..ec89ff6a1 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass.java @@ -1,13 +1,13 @@ package jadx.tests.integration.inner; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestInnerClass extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass2.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass2.java index c27adde13..67d4404c8 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass2.java @@ -3,14 +3,14 @@ package jadx.tests.integration.inner; import java.util.Timer; import java.util.TimerTask; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestInnerClass2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass3.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass3.java index e06fc96ea..0e40e7246 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass3.java @@ -1,13 +1,13 @@ package jadx.tests.integration.inner; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestInnerClass3 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass4.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass4.java index 215e1a707..7b5a57fdb 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass4.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass4.java @@ -1,12 +1,12 @@ package jadx.tests.integration.inner; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestInnerClass4 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass5.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass5.java index 065725bce..737c14fca 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass5.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClass5.java @@ -1,13 +1,13 @@ package jadx.tests.integration.inner; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; public class TestInnerClass5 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClassFakeSyntheticConstructor.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClassFakeSyntheticConstructor.java index 1a9a88021..040c66cb6 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClassFakeSyntheticConstructor.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClassFakeSyntheticConstructor.java @@ -1,12 +1,12 @@ package jadx.tests.integration.inner; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestInnerClassFakeSyntheticConstructor extends SmaliTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClassSyntheticConstructor.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClassSyntheticConstructor.java index 7431c5eb0..9225252a5 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClassSyntheticConstructor.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClassSyntheticConstructor.java @@ -1,6 +1,6 @@ package jadx.tests.integration.inner; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.tests.api.IntegrationTest; diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClassSyntheticRename.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClassSyntheticRename.java index 240473567..345bc2df8 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClassSyntheticRename.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClassSyntheticRename.java @@ -1,14 +1,14 @@ package jadx.tests.integration.inner; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; /** * Issue: https://github.com/skylot/jadx/issues/336 diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestOuterConstructorCall.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestOuterConstructorCall.java index 4e2f2f2c1..5d4a44b40 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestOuterConstructorCall.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestOuterConstructorCall.java @@ -1,13 +1,13 @@ package jadx.tests.integration.inner; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestOuterConstructorCall extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestRFieldAccess.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestRFieldAccess.java index 0db9653cb..2283faf4d 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestRFieldAccess.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestRFieldAccess.java @@ -1,12 +1,12 @@ package jadx.tests.integration.inner; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.countString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestRFieldAccess extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestRFieldRestore.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestRFieldRestore.java index 6967e8303..785bb7875 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestRFieldRestore.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestRFieldRestore.java @@ -3,15 +3,15 @@ package jadx.tests.integration.inner; import java.util.HashMap; import java.util.Map; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestRFieldRestore extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestRFieldRestore2.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestRFieldRestore2.java index 6fc479c9a..4ea2d019c 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestRFieldRestore2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestRFieldRestore2.java @@ -3,13 +3,13 @@ package jadx.tests.integration.inner; import java.util.HashMap; import java.util.Map; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestRFieldRestore2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestSyntheticMthRename.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestSyntheticMthRename.java index 2ca61e986..33033b0d7 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestSyntheticMthRename.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestSyntheticMthRename.java @@ -1,14 +1,14 @@ package jadx.tests.integration.inner; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; /** * Issue: https://github.com/skylot/jadx/issues/397 @@ -33,9 +33,7 @@ public class TestSyntheticMthRename extends SmaliTest { @Test public void test() { - ClassNode cls = getClassNodeFromSmaliFiles("inner", "TestSyntheticMthRename", "TestCls", - "TestCls", "TestCls$I", "TestCls$A" - ); + ClassNode cls = getClassNodeFromSmaliFiles("inner", "TestSyntheticMthRename", "TestCls"); String code = cls.getCode().toString(); assertThat(code, containsOne("public String call(Runnable... p) {")); diff --git a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestCastInOverloadedInvoke.java b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestCastInOverloadedInvoke.java index bbb65e347..27e740edf 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestCastInOverloadedInvoke.java +++ b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestCastInOverloadedInvoke.java @@ -3,17 +3,20 @@ package jadx.tests.integration.invoke; import java.util.ArrayList; import java.util.List; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import jadx.NotYetImplemented; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; public class TestCastInOverloadedInvoke extends IntegrationTest { public static class TestCls { + int c = 0; public void test() { call(new ArrayList<>()); @@ -27,12 +30,23 @@ public class TestCastInOverloadedInvoke extends IntegrationTest { } public void call(String str) { + c += 1; } public void call(List list) { + c += 2; } public void call(ArrayList list) { + c += 4; + } + + public void check() { + test(); + assertThat(c, is(2 + 4)); + c = 0; + test2("str"); + assertThat(c, is(1)); } } @@ -41,14 +55,21 @@ public class TestCastInOverloadedInvoke extends IntegrationTest { ClassNode cls = getClassNode(TestCls.class); String code = cls.getCode().toString(); -// TODO: implement more checks for casts in overloaded methods -// assertThat(code, containsOne("call(new ArrayList<>());")); assertThat(code, containsOne("call((ArrayList) new ArrayList());")); - -// TODO: fix generics in constructors -// assertThat(code, containsOne("call((List) new ArrayList());")); assertThat(code, containsOne("call((List) new ArrayList());")); assertThat(code, containsOne("call((String) obj);")); } + + @Test + @NotYetImplemented + public void testNYI() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, containsOne("call(new ArrayList<>());")); + assertThat(code, containsOne("call((List) new ArrayList());")); + + assertThat(code, containsOne("call((String) obj);")); + } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestConstructorInvoke.java b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestConstructorInvoke.java index 308185e52..6f5b598d4 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestConstructorInvoke.java +++ b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestConstructorInvoke.java @@ -1,12 +1,12 @@ package jadx.tests.integration.invoke; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; -import static org.junit.Assert.assertThat; public class TestConstructorInvoke extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestInheritedStaticInvoke.java b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestInheritedStaticInvoke.java index 7f677e6d9..308457db9 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestInheritedStaticInvoke.java +++ b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestInheritedStaticInvoke.java @@ -1,12 +1,12 @@ package jadx.tests.integration.invoke; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestInheritedStaticInvoke extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestInvoke1.java b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestInvoke1.java index 4e2758e0f..dde882e03 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestInvoke1.java +++ b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestInvoke1.java @@ -2,13 +2,13 @@ package jadx.tests.integration.invoke; import java.io.IOException; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestInvoke1 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestInvokeInCatch.java b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestInvokeInCatch.java index 66017c89c..9f4eac344 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestInvokeInCatch.java +++ b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestInvokeInCatch.java @@ -2,7 +2,7 @@ package jadx.tests.integration.invoke; import java.io.IOException; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -10,7 +10,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestInvokeInCatch extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestOverloadedMethodInvoke.java b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestOverloadedMethodInvoke.java index e34e80835..fbabf3b55 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestOverloadedMethodInvoke.java +++ b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestOverloadedMethodInvoke.java @@ -1,6 +1,6 @@ package jadx.tests.integration.invoke; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -8,8 +8,8 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestOverloadedMethodInvoke extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestSuperInvoke.java b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestSuperInvoke.java index e71fca13f..70b464efb 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestSuperInvoke.java +++ b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestSuperInvoke.java @@ -1,13 +1,13 @@ package jadx.tests.integration.invoke; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.countString; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestSuperInvoke extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestVarArg.java b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestVarArg.java index 38152fa6b..44df58f12 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestVarArg.java +++ b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestVarArg.java @@ -1,12 +1,12 @@ package jadx.tests.integration.invoke; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestVarArg extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestArrayForEach.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestArrayForEach.java index 103c5ad55..6ff052807 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestArrayForEach.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestArrayForEach.java @@ -1,12 +1,12 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsLines; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestArrayForEach extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestArrayForEach2.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestArrayForEach2.java index 2a033b687..97138fafe 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestArrayForEach2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestArrayForEach2.java @@ -1,14 +1,14 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsLines; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestArrayForEach2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestArrayForEachNegative.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestArrayForEachNegative.java index 3ad3192d6..28a03ba8d 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestArrayForEachNegative.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestArrayForEachNegative.java @@ -1,13 +1,13 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestArrayForEachNegative extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakInComplexIf.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakInComplexIf.java index c9658c8ef..00f4c5847 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakInComplexIf.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakInComplexIf.java @@ -3,14 +3,14 @@ package jadx.tests.integration.loops; import java.util.HashMap; import java.util.Map; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; public class TestBreakInComplexIf extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakInComplexIf2.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakInComplexIf2.java index c9f1b024b..dc6d3fe8c 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakInComplexIf2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakInComplexIf2.java @@ -3,14 +3,14 @@ package jadx.tests.integration.loops; import java.util.Arrays; import java.util.List; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.countString; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; public class TestBreakInComplexIf2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakInLoop.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakInLoop.java index fd83b6cad..042049c00 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakInLoop.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakInLoop.java @@ -1,13 +1,13 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static jadx.tests.api.utils.JadxMatchers.countString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestBreakInLoop extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakInLoop2.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakInLoop2.java index 8f964ac2a..a360a4f25 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakInLoop2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakInLoop2.java @@ -2,13 +2,13 @@ package jadx.tests.integration.loops; import java.util.List; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.anyOf; public class TestBreakInLoop2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakWithLabel.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakWithLabel.java index 91cfe231c..482634910 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakWithLabel.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestBreakWithLabel.java @@ -2,15 +2,15 @@ package jadx.tests.integration.loops; import java.lang.reflect.Method; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; public class TestBreakWithLabel extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestContinueInLoop.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestContinueInLoop.java index 26ee681f5..89de52268 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestContinueInLoop.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestContinueInLoop.java @@ -1,12 +1,12 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestContinueInLoop extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestContinueInLoop2.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestContinueInLoop2.java index de7b54fea..e644aac7d 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestContinueInLoop2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestContinueInLoop2.java @@ -1,6 +1,6 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.attributes.AType; import jadx.core.dex.instructions.InsnType; @@ -19,7 +19,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestContinueInLoop2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestDoWhileBreak.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestDoWhileBreak.java index 040d951f9..abc33c361 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestDoWhileBreak.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestDoWhileBreak.java @@ -1,12 +1,12 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestDoWhileBreak extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestEndlessLoop.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestEndlessLoop.java index cc463ed7f..68b62d92e 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestEndlessLoop.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestEndlessLoop.java @@ -1,12 +1,12 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; -import static org.junit.Assert.assertThat; public class TestEndlessLoop extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestIfInLoop2.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestIfInLoop2.java index 4e2f3fc2c..62cf976ac 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestIfInLoop2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestIfInLoop2.java @@ -1,13 +1,13 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestIfInLoop2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestIfInLoop3.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestIfInLoop3.java index d86de34d1..df9cc159f 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestIfInLoop3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestIfInLoop3.java @@ -1,13 +1,13 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; public class TestIfInLoop3 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestIndexForLoop.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestIndexForLoop.java index e23061526..f85ff09fc 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestIndexForLoop.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestIndexForLoop.java @@ -1,13 +1,13 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsLines; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestIndexForLoop extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestIndexedLoop.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestIndexedLoop.java new file mode 100644 index 000000000..a73bbaf2d --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestIndexedLoop.java @@ -0,0 +1,71 @@ +package jadx.tests.integration.loops; + +import java.io.File; + +import org.junit.jupiter.api.Test; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.IntegrationTest; + +import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.nullValue; + +public class TestIndexedLoop extends IntegrationTest { + + public static class TestCls { + + public File test(File[] files) { + File file = null; + if (files != null) { + int length = files.length; + if (length == 0) { + file = null; + } else { + for (int i = 0; i < length; i++) { + file = files[i]; + if (file.getName().equals("f")) { + break; + } + } + } + } else { + file = null; + } + if (file != null) { + file.deleteOnExit(); + } + return file; + } + + public void check() { + assertThat(test(null), nullValue()); + assertThat(test(new File[]{}), nullValue()); + + File file = new File("f"); + assertThat(test(new File[]{new File("a"), file}), is(file)); + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, not(containsString("for (File file :"))); + assertThat(code, containsOne("for (int i = 0; i < length; i++) {")); + } + + @Test + public void testNoDebug() { + noDebugInfo(); + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, not(containsString("for (File file :"))); + assertThat(code, containsOne("for (int i = 0; i < length; i++) {")); + } +} diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestIterableForEach.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestIterableForEach.java index f43b852e1..587111065 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestIterableForEach.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestIterableForEach.java @@ -1,12 +1,12 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsLines; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestIterableForEach extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestIterableForEach2.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestIterableForEach2.java index 7282a932a..0b973b85d 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestIterableForEach2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestIterableForEach2.java @@ -3,13 +3,13 @@ package jadx.tests.integration.loops; import java.io.IOException; import java.util.List; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestIterableForEach2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestIterableForEach3.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestIterableForEach3.java index 3588244a8..782f02887 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestIterableForEach3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestIterableForEach3.java @@ -2,13 +2,13 @@ package jadx.tests.integration.loops; import java.util.Set; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestIterableForEach3 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition.java index bc5f89935..f769ab8e0 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition.java @@ -1,12 +1,12 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestLoopCondition extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition2.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition2.java index 713c0698a..01cab1e8e 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition2.java @@ -1,12 +1,12 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestLoopCondition2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition3.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition3.java index e76a946cb..0efaf1fa0 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition3.java @@ -1,12 +1,12 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestLoopCondition3 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition4.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition4.java index a1fa71e90..0eadd2295 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition4.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition4.java @@ -1,12 +1,12 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestLoopCondition4 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition5.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition5.java index 5f3a97354..1dd0c215c 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition5.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopCondition5.java @@ -1,14 +1,14 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static jadx.tests.api.utils.JadxMatchers.countString; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.anyOf; -import static org.junit.Assert.assertThat; public class TestLoopCondition5 extends SmaliTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopConditionInvoke.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopConditionInvoke.java index dbfca8f9d..f2a46db47 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopConditionInvoke.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopConditionInvoke.java @@ -1,12 +1,12 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestLoopConditionInvoke extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopDetection.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopDetection.java index 606a9dad1..a002eb675 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopDetection.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopDetection.java @@ -1,13 +1,13 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestLoopDetection extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopDetection2.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopDetection2.java index bc22f8c33..7048eef8b 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopDetection2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopDetection2.java @@ -1,6 +1,6 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -8,7 +8,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestLoopDetection2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopDetection3.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopDetection3.java index 152d3ab02..4290a6d13 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopDetection3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopDetection3.java @@ -1,12 +1,13 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import jadx.NotYetImplemented; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestLoopDetection3 extends IntegrationTest { @@ -37,7 +38,14 @@ public class TestLoopDetection3 extends IntegrationTest { String code = cls.getCode().toString(); assertThat(code, containsString("while")); - // TODO - // assertThat(code, containsString("while (--pos >= 0) {")); + } + + @Test + @NotYetImplemented + public void test2() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, containsString("while (--pos >= 0) {")); } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopDetection4.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopDetection4.java index 91e724e2a..b4852faa6 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopDetection4.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopDetection4.java @@ -2,13 +2,13 @@ package jadx.tests.integration.loops; import java.util.Iterator; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestLoopDetection4 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestNestedLoops.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestNestedLoops.java index 2edc6aedd..f9ca07673 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestNestedLoops.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestNestedLoops.java @@ -2,13 +2,13 @@ package jadx.tests.integration.loops; import java.util.List; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestNestedLoops extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestNestedLoops2.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestNestedLoops2.java index 90067a23c..044b94f95 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestNestedLoops2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestNestedLoops2.java @@ -2,13 +2,13 @@ package jadx.tests.integration.loops; import java.util.List; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestNestedLoops2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestNestedLoops3.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestNestedLoops3.java index f6b13e2a7..0f73339f8 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestNestedLoops3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestNestedLoops3.java @@ -1,13 +1,13 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestNestedLoops3 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestNotIndexedLoop.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestNotIndexedLoop.java new file mode 100644 index 000000000..7642a4661 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestNotIndexedLoop.java @@ -0,0 +1,77 @@ +package jadx.tests.integration.loops; + +import java.io.File; + +import org.junit.jupiter.api.Test; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.IntegrationTest; + +import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.nullValue; + +public class TestNotIndexedLoop extends IntegrationTest { + + public static class TestCls { + + public File test(File[] files) { + File file; + if (files != null) { + int length = files.length; + if (length == 0) { + file = null; + } else { + int i = 0; + while (true) { + if (i >= length) { + file = null; + break; + } + file = files[i]; + if (file.getName().equals("f")) { + break; + } + i++; + } + } + } else { + file = null; + } + if (file != null) { + file.deleteOnExit(); + } + return file; + } + + public void check() { + assertThat(test(null), nullValue()); + assertThat(test(new File[]{}), nullValue()); + + File file = new File("f"); + assertThat(test(new File[]{new File("a"), file}), is(file)); + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, not(containsString("for ("))); + assertThat(code, containsOne("while (true) {")); + } + + @Test + public void testNoDebug() { + noDebugInfo(); + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, not(containsString("for ("))); + assertThat(code, containsOne("while (true) {")); + } +} diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestSequentialLoops.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestSequentialLoops.java index e064369ef..f2b722a86 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestSequentialLoops.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestSequentialLoops.java @@ -1,6 +1,6 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -9,7 +9,7 @@ import static jadx.tests.api.utils.JadxMatchers.containsOne; import static jadx.tests.api.utils.JadxMatchers.countString; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestSequentialLoops extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestSequentialLoops2.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestSequentialLoops2.java index 894053b2e..28fa94350 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestSequentialLoops2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestSequentialLoops2.java @@ -1,6 +1,6 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -8,7 +8,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static jadx.tests.api.utils.JadxMatchers.countString; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestSequentialLoops2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestSynchronizedInEndlessLoop.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestSynchronizedInEndlessLoop.java new file mode 100644 index 000000000..0c574aaff --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestSynchronizedInEndlessLoop.java @@ -0,0 +1,48 @@ +package jadx.tests.integration.loops; + +import org.junit.jupiter.api.Test; + +import jadx.NotYetImplemented; +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.IntegrationTest; + +import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; + +public class TestSynchronizedInEndlessLoop extends IntegrationTest { + + public static class TestCls { + int f = 5; + + int test() { + while (true) { + synchronized (this) { + if (f > 7) { + return 7; + } else if (f < 3) { + return 3; + } + } + try { + f++; + Thread.sleep(100); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + } + + @Test + @NotYetImplemented + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, containsOne("synchronized (this) {")); + assertThat(code, containsOne("try {")); + assertThat(code, containsOne("f++;")); + assertThat(code, containsOne("Thread.sleep(100);")); + assertThat(code, containsOne("} catch (Exception e) {")); + } +} diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestTryCatchInLoop.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestTryCatchInLoop.java index c8a3059b5..7d318e347 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestTryCatchInLoop.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestTryCatchInLoop.java @@ -1,13 +1,13 @@ package jadx.tests.integration.loops; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestTryCatchInLoop extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestTryCatchInLoop2.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestTryCatchInLoop2.java index 58e8b0d4a..8533c5bc8 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestTryCatchInLoop2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestTryCatchInLoop2.java @@ -3,13 +3,13 @@ package jadx.tests.integration.loops; import java.util.HashMap; import java.util.Map; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTryCatchInLoop2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/names/TestClassNameWithInvalidChar.java b/jadx-core/src/test/java/jadx/tests/integration/names/TestClassNameWithInvalidChar.java new file mode 100644 index 000000000..7d0a98f88 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/names/TestClassNameWithInvalidChar.java @@ -0,0 +1,36 @@ +package jadx.tests.integration.names; + +import org.junit.jupiter.api.Test; + +import jadx.api.JadxDecompiler; +import jadx.api.JadxInternalAccess; +import jadx.core.dex.nodes.ClassNode; +import jadx.core.dex.nodes.RootNode; +import jadx.tests.api.SmaliTest; + +public class TestClassNameWithInvalidChar extends SmaliTest { + /* + public class do- {} + public class i-f {} + */ + + @Test + public void test() { + JadxDecompiler d = loadSmaliFiles("names", "TestClassNameWithInvalidChar"); + RootNode root = JadxInternalAccess.getRoot(d); + for (ClassNode cls : root.getClasses(false)) { + decompileAndCheckCls(d, cls); + } + } + + @Test + public void testWithDeobfuscation() { + enableDeobfuscation(); + + JadxDecompiler d = loadSmaliFiles("names", "TestClassNameWithInvalidChar"); + RootNode root = JadxInternalAccess.getRoot(d); + for (ClassNode cls : root.getClasses(false)) { + decompileAndCheckCls(d, cls); + } + } +} diff --git a/jadx-core/src/test/java/jadx/tests/integration/names/TestDuplicatedNames.java b/jadx-core/src/test/java/jadx/tests/integration/names/TestDuplicatedNames.java index 75684d896..b0f808322 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/names/TestDuplicatedNames.java +++ b/jadx-core/src/test/java/jadx/tests/integration/names/TestDuplicatedNames.java @@ -1,29 +1,29 @@ package jadx.tests.integration.names; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestDuplicatedNames extends SmaliTest { -/* - public static class TestCls { + /* + public static class TestCls { - public Object fieldName; - public String fieldName; + public Object fieldName; + public String fieldName; - public Object run() { - return this.fieldName; + public Object run() { + return this.fieldName; + } + + public String run() { + return this.fieldName; + } } - - public String run() { - return this.fieldName; - } - } -*/ + */ @Test public void test() { commonChecks(); diff --git a/jadx-core/src/test/java/jadx/tests/integration/names/TestNameAssign2.java b/jadx-core/src/test/java/jadx/tests/integration/names/TestNameAssign2.java index 608798bcc..0e7070dfa 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/names/TestNameAssign2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/names/TestNameAssign2.java @@ -5,7 +5,7 @@ import java.util.Deque; import java.util.LinkedList; import java.util.List; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.BlockNode; import jadx.core.dex.nodes.ClassNode; @@ -13,9 +13,9 @@ import jadx.core.dex.nodes.MethodNode; import jadx.core.dex.visitors.ssa.LiveVarAnalysis; import jadx.tests.api.IntegrationTest; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestNameAssign2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/names/TestReservedClassNames.java b/jadx-core/src/test/java/jadx/tests/integration/names/TestReservedClassNames.java new file mode 100644 index 000000000..79db7246e --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/names/TestReservedClassNames.java @@ -0,0 +1,27 @@ +package jadx.tests.integration.names; + +import java.io.File; + +import org.junit.jupiter.api.Test; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.SmaliTest; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; + +public class TestReservedClassNames extends SmaliTest { + /* + public class do { + } + */ + + @Test + public void test() { + ClassNode cls = getClassNodeFromSmali("names" + File.separatorChar + "TestReservedClassNames", "do"); + String code = cls.getCode().toString(); + + assertThat(code, not(containsString("public class do"))); + } +} diff --git a/jadx-core/src/test/java/jadx/tests/integration/names/TestReservedNames.java b/jadx-core/src/test/java/jadx/tests/integration/names/TestReservedNames.java index 70cbb57c6..c359657a2 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/names/TestReservedNames.java +++ b/jadx-core/src/test/java/jadx/tests/integration/names/TestReservedNames.java @@ -1,13 +1,13 @@ package jadx.tests.integration.names; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestReservedNames extends SmaliTest { /* diff --git a/jadx-core/src/test/java/jadx/tests/integration/names/TestSameMethodsNames.java b/jadx-core/src/test/java/jadx/tests/integration/names/TestSameMethodsNames.java index e052bf62d..f0918dc90 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/names/TestSameMethodsNames.java +++ b/jadx-core/src/test/java/jadx/tests/integration/names/TestSameMethodsNames.java @@ -1,12 +1,12 @@ package jadx.tests.integration.names; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestSameMethodsNames extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/others/TestBadMethodAccessModifiers.java b/jadx-core/src/test/java/jadx/tests/integration/others/TestBadMethodAccessModifiers.java index f267d5eb9..201b4c808 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/others/TestBadMethodAccessModifiers.java +++ b/jadx-core/src/test/java/jadx/tests/integration/others/TestBadMethodAccessModifiers.java @@ -1,14 +1,14 @@ package jadx.tests.integration.others; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestBadMethodAccessModifiers extends SmaliTest { /* @@ -24,10 +24,10 @@ public class TestBadMethodAccessModifiers extends SmaliTest { } } */ + @Test public void test() { - ClassNode cls = getClassNodeFromSmaliFiles("others", "TestBadMethodAccessModifiers", "TestCls", - "TestCls$A", "TestCls$B", "TestCls"); + ClassNode cls = getClassNodeFromSmaliFiles("others", "TestBadMethodAccessModifiers", "TestCls"); String code = cls.getCode().toString(); assertThat(code, not(containsString("protected void test() {"))); diff --git a/jadx-core/src/test/java/jadx/tests/integration/others/TestDefConstructorNotRemoved.java b/jadx-core/src/test/java/jadx/tests/integration/others/TestDefConstructorNotRemoved.java index 89211412c..9c0185199 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/others/TestDefConstructorNotRemoved.java +++ b/jadx-core/src/test/java/jadx/tests/integration/others/TestDefConstructorNotRemoved.java @@ -1,14 +1,14 @@ package jadx.tests.integration.others; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestDefConstructorNotRemoved extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/others/TestFieldInit.java b/jadx-core/src/test/java/jadx/tests/integration/others/TestFieldInit.java index fe399efe5..6b8087242 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/others/TestFieldInit.java +++ b/jadx-core/src/test/java/jadx/tests/integration/others/TestFieldInit.java @@ -4,15 +4,15 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestFieldInit extends IntegrationTest { @@ -24,7 +24,7 @@ public class TestFieldInit extends IntegrationTest { private static List s = new ArrayList<>(); private A a = new A(); - private int i = 1 + Random.class.getSimpleName().length(); + private int i = 1 + Random.class.getSimpleName().length(); private int n = 0; public TestCls(int z) { diff --git a/jadx-core/src/test/java/jadx/tests/integration/others/TestFieldInit2.java b/jadx-core/src/test/java/jadx/tests/integration/others/TestFieldInit2.java index 9b0399e23..b7d591d8d 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/others/TestFieldInit2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/others/TestFieldInit2.java @@ -1,13 +1,13 @@ package jadx.tests.integration.others; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsLines; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestFieldInit2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/others/TestFieldInitInTryCatch.java b/jadx-core/src/test/java/jadx/tests/integration/others/TestFieldInitInTryCatch.java index a76769996..b37ccbc85 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/others/TestFieldInitInTryCatch.java +++ b/jadx-core/src/test/java/jadx/tests/integration/others/TestFieldInitInTryCatch.java @@ -3,14 +3,14 @@ package jadx.tests.integration.others; import java.net.MalformedURLException; import java.net.URL; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsLines; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestFieldInitInTryCatch extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/others/TestIfInTry.java b/jadx-core/src/test/java/jadx/tests/integration/others/TestIfInTry.java index c47211b12..cb38e5879 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/others/TestIfInTry.java +++ b/jadx-core/src/test/java/jadx/tests/integration/others/TestIfInTry.java @@ -3,14 +3,14 @@ package jadx.tests.integration.others; import java.io.File; import java.io.IOException; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static jadx.tests.api.utils.JadxMatchers.countString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestIfInTry extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/others/TestIfTryInCatch.java b/jadx-core/src/test/java/jadx/tests/integration/others/TestIfTryInCatch.java index 7ec6ff9f7..e28849f4c 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/others/TestIfTryInCatch.java +++ b/jadx-core/src/test/java/jadx/tests/integration/others/TestIfTryInCatch.java @@ -1,13 +1,13 @@ package jadx.tests.integration.others; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static jadx.tests.api.utils.JadxMatchers.countString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestIfTryInCatch extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/others/TestIssue13a.java b/jadx-core/src/test/java/jadx/tests/integration/others/TestIssue13a.java index 88ac0089b..f97189a24 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/others/TestIssue13a.java +++ b/jadx-core/src/test/java/jadx/tests/integration/others/TestIssue13a.java @@ -3,13 +3,15 @@ package jadx.tests.integration.others; import java.lang.reflect.Field; import java.util.HashMap; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; public class TestIssue13a extends IntegrationTest { @@ -97,6 +99,6 @@ public class TestIssue13a extends IntegrationTest { } // TODO: add additional checks -// assertThat(code, not(containsString("Throwable"))); + assertThat(code, not(containsString("Throwable"))); } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/others/TestIssue13b.java b/jadx-core/src/test/java/jadx/tests/integration/others/TestIssue13b.java index ffc110668..272a079e7 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/others/TestIssue13b.java +++ b/jadx-core/src/test/java/jadx/tests/integration/others/TestIssue13b.java @@ -6,14 +6,14 @@ import java.io.IOException; import java.util.Properties; import java.util.concurrent.CountDownLatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static jadx.tests.api.utils.JadxMatchers.countString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestIssue13b extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/others/TestLoopInTry.java b/jadx-core/src/test/java/jadx/tests/integration/others/TestLoopInTry.java index 25b753d65..03b2aaefb 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/others/TestLoopInTry.java +++ b/jadx-core/src/test/java/jadx/tests/integration/others/TestLoopInTry.java @@ -1,12 +1,12 @@ package jadx.tests.integration.others; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestLoopInTry extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/others/TestLoopInTry2.java b/jadx-core/src/test/java/jadx/tests/integration/others/TestLoopInTry2.java index 93c9468fd..a45b636dc 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/others/TestLoopInTry2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/others/TestLoopInTry2.java @@ -5,7 +5,7 @@ import java.io.EOFException; import com.android.dex.Code; import com.android.dx.io.instructions.DecodedInstruction; import com.android.dx.io.instructions.ShortArrayCodeInput; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.core.dex.nodes.DexNode; @@ -14,7 +14,7 @@ import jadx.core.utils.exceptions.DecodeException; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestLoopInTry2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitch.java b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitch.java index 44de3786a..b5d3cbccc 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitch.java +++ b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitch.java @@ -1,13 +1,13 @@ package jadx.tests.integration.switches; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestSwitch extends IntegrationTest { public static class TestCls { diff --git a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitch2.java b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitch2.java index 335509c52..e48cffcf9 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitch2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitch2.java @@ -1,12 +1,12 @@ package jadx.tests.integration.switches; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.countString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestSwitch2 extends IntegrationTest { public static class TestCls { diff --git a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitch3.java b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitch3.java index f57c4bbc5..6935b97aa 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitch3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitch3.java @@ -1,13 +1,13 @@ package jadx.tests.integration.switches; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.countString; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; public class TestSwitch3 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchBreak.java b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchBreak.java index 0df2517f3..135f4ec32 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchBreak.java +++ b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchBreak.java @@ -1,16 +1,16 @@ package jadx.tests.integration.switches; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestSwitchBreak extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchContinue.java b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchContinue.java index 3775dce46..c2d29b114 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchContinue.java +++ b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchContinue.java @@ -1,14 +1,14 @@ package jadx.tests.integration.switches; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestSwitchContinue extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchInLoop.java b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchInLoop.java index 362e32e8a..d09b39eb0 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchInLoop.java +++ b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchInLoop.java @@ -1,13 +1,13 @@ package jadx.tests.integration.switches; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestSwitchInLoop extends IntegrationTest { public static class TestCls { diff --git a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchLabels.java b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchLabels.java index c7ebc7f44..d2d9148b2 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchLabels.java +++ b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchLabels.java @@ -1,13 +1,13 @@ package jadx.tests.integration.switches; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestSwitchLabels extends IntegrationTest { public static class TestCls { diff --git a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchNoDefault.java b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchNoDefault.java index b6eef55ca..44a9838af 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchNoDefault.java +++ b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchNoDefault.java @@ -1,11 +1,11 @@ package jadx.tests.integration.switches; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestSwitchNoDefault extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchReturnFromCase.java b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchReturnFromCase.java index c6486ce14..c77012de0 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchReturnFromCase.java +++ b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchReturnFromCase.java @@ -1,14 +1,14 @@ package jadx.tests.integration.switches; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestSwitchReturnFromCase extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchReturnFromCase2.java b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchReturnFromCase2.java index 383820ade..bad3cc7b2 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchReturnFromCase2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchReturnFromCase2.java @@ -1,13 +1,14 @@ package jadx.tests.integration.switches; +import org.junit.jupiter.api.Test; + import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; -import org.junit.Test; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; public class TestSwitchReturnFromCase2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchSimple.java b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchSimple.java index c695b64ac..dafb59e46 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchSimple.java +++ b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchSimple.java @@ -1,14 +1,14 @@ package jadx.tests.integration.switches; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestSwitchSimple extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithFallThroughCase.java b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithFallThroughCase.java index 1eb65ad9c..3c6bb05ae 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithFallThroughCase.java +++ b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithFallThroughCase.java @@ -1,13 +1,13 @@ package jadx.tests.integration.switches; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestSwitchWithFallThroughCase extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithFallThroughCase2.java b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithFallThroughCase2.java index 29cef0222..fe90991c3 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithFallThroughCase2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithFallThroughCase2.java @@ -1,13 +1,13 @@ package jadx.tests.integration.switches; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestSwitchWithFallThroughCase2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithTryCatch.java b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithTryCatch.java index ada4979dd..f9c43d222 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithTryCatch.java +++ b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithTryCatch.java @@ -1,12 +1,12 @@ package jadx.tests.integration.switches; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.countString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestSwitchWithTryCatch extends IntegrationTest { public static class TestCls { diff --git a/jadx-core/src/test/java/jadx/tests/integration/synchronize/TestSynchronized.java b/jadx-core/src/test/java/jadx/tests/integration/synchronize/TestSynchronized.java index 7ca4c6950..f5d946ab7 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/synchronize/TestSynchronized.java +++ b/jadx-core/src/test/java/jadx/tests/integration/synchronize/TestSynchronized.java @@ -1,6 +1,6 @@ package jadx.tests.integration.synchronize; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -8,7 +8,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestSynchronized extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/synchronize/TestSynchronized2.java b/jadx-core/src/test/java/jadx/tests/integration/synchronize/TestSynchronized2.java index 17493af2f..a90aabd47 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/synchronize/TestSynchronized2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/synchronize/TestSynchronized2.java @@ -1,12 +1,14 @@ package jadx.tests.integration.synchronize; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import jadx.NotYetImplemented; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; public class TestSynchronized2 extends IntegrationTest { @@ -23,8 +25,15 @@ public class TestSynchronized2 extends IntegrationTest { assertThat(code, containsString("private static synchronized boolean test(Object obj) {")); assertThat(code, containsString("obj.toString() != null;")); - // TODO -// assertThat(code, containsString("return obj.toString() != null;")); -// assertThat(code, not(containsString("synchronized ("))); + } + + @Test + @NotYetImplemented + public void test2() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, containsString("return obj.toString() != null;")); + assertThat(code, not(containsString("synchronized ("))); } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/synchronize/TestSynchronized3.java b/jadx-core/src/test/java/jadx/tests/integration/synchronize/TestSynchronized3.java index 62be9249f..313691f45 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/synchronize/TestSynchronized3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/synchronize/TestSynchronized3.java @@ -1,12 +1,12 @@ package jadx.tests.integration.synchronize; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsLines; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestSynchronized3 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestFinally.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestFinally.java index 72cb20947..f0ff3195e 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestFinally.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestFinally.java @@ -1,13 +1,13 @@ package jadx.tests.integration.trycatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestFinally extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestFinally2.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestFinally2.java index d451a12f7..22daaf9ad 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestFinally2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestFinally2.java @@ -4,13 +4,15 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import jadx.NotYetImplemented; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; public class TestFinally2 extends IntegrationTest { @@ -57,7 +59,14 @@ public class TestFinally2 extends IntegrationTest { String code = cls.getCode().toString(); assertThat(code, containsOne("decode(inputStream);")); - // TODO - // assertThat(code, not(containsOne("result ="))); + } + + @Test + @NotYetImplemented + public void test2() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, not(containsOne("result ="))); } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestFinallyExtract.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestFinallyExtract.java index b59db5981..2c4db000f 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestFinallyExtract.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestFinallyExtract.java @@ -1,15 +1,15 @@ package jadx.tests.integration.trycatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestFinallyExtract extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestInlineInCatch.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestInlineInCatch.java index e87d5ed01..e692227b4 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestInlineInCatch.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestInlineInCatch.java @@ -2,13 +2,13 @@ package jadx.tests.integration.trycatch; import java.io.File; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestInlineInCatch extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestMultiExceptionCatch.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestMultiExceptionCatch.java index 8c7970927..94e3d0d26 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestMultiExceptionCatch.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestMultiExceptionCatch.java @@ -3,7 +3,7 @@ package jadx.tests.integration.trycatch; import java.security.ProviderException; import java.time.DateTimeException; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -11,7 +11,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestMultiExceptionCatch extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestMultiExceptionCatch2.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestMultiExceptionCatch2.java index f4004226f..59aba4a64 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestMultiExceptionCatch2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestMultiExceptionCatch2.java @@ -3,13 +3,13 @@ package jadx.tests.integration.trycatch; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestMultiExceptionCatch2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestMultiExceptionCatchSameJump.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestMultiExceptionCatchSameJump.java index 6081f810f..a1c707fa6 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestMultiExceptionCatchSameJump.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestMultiExceptionCatchSameJump.java @@ -1,6 +1,6 @@ package jadx.tests.integration.trycatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; @@ -8,20 +8,20 @@ import jadx.tests.api.SmaliTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestMultiExceptionCatchSameJump extends SmaliTest { -/* - public static class TestCls { - public void test() { - try { - System.out.println("Test"); - } catch (ProviderException | DateTimeException e) { - throw new RuntimeException(e); + /* + public static class TestCls { + public void test() { + try { + System.out.println("Test"); + } catch (ProviderException | DateTimeException e) { + throw new RuntimeException(e); + } } } - } -*/ + */ @Test public void test() { ClassNode cls = getClassNodeFromSmaliWithPkg("trycatch", "TestMultiExceptionCatchSameJump"); diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestNestedTryCatch.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestNestedTryCatch.java index e9e7a57ed..f45ca3ac6 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestNestedTryCatch.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestNestedTryCatch.java @@ -1,13 +1,13 @@ package jadx.tests.integration.trycatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestNestedTryCatch extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch.java index e8f243120..b3d616f09 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch.java @@ -1,13 +1,13 @@ package jadx.tests.integration.trycatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTryCatch extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch2.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch2.java index 993b58c43..361cd923b 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch2.java @@ -1,12 +1,12 @@ package jadx.tests.integration.trycatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTryCatch2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch4.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch4.java index 4958b1b11..091ad5ff0 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch4.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch4.java @@ -4,14 +4,14 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTryCatch4 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch6.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch6.java index afc20706e..ae1e98ca8 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch6.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch6.java @@ -2,14 +2,14 @@ package jadx.tests.integration.trycatch; import java.io.IOException; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; public class TestTryCatch6 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch7.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch7.java index 2aeb7395c..44c61245f 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch7.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch7.java @@ -1,12 +1,12 @@ package jadx.tests.integration.trycatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTryCatch7 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch8.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch8.java index f2bc53b15..d51da9eaa 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch8.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatch8.java @@ -1,15 +1,15 @@ package jadx.tests.integration.trycatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.isA; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; -import static org.junit.Assert.assertThat; public class TestTryCatch8 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally.java index 6f204ced0..d33cd0b69 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally.java @@ -1,13 +1,13 @@ package jadx.tests.integration.trycatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; public class TestTryCatchFinally extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally2.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally2.java index c960fb4ae..580720cd2 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally2.java @@ -4,14 +4,16 @@ import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import jadx.NotYetImplemented; import jadx.core.clsp.NClass; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static jadx.tests.api.utils.JadxMatchers.countString; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTryCatchFinally2 extends IntegrationTest { @@ -52,9 +54,16 @@ public class TestTryCatchFinally2 extends IntegrationTest { assertThat(code, containsOne("for (NClass parent : parents) {")); - // TODO -// assertThat(code, countString(2, "for (NClass cls : classes) {")); assertThat(code, containsOne("for (NClass cls : this.classes) {")); assertThat(code, containsOne("for (NClass cls2 : this.classes) {")); } + + @Test + @NotYetImplemented + public void test2() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, countString(2, "for (NClass cls : classes) {")); + } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally3.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally3.java index 874ab8f93..236178ed7 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally3.java @@ -2,7 +2,7 @@ package jadx.tests.integration.trycatch; import java.util.List; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,7 +12,7 @@ import jadx.core.dex.visitors.IDexTreeVisitor; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTryCatchFinally3 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally4.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally4.java index 0d1fd731d..caf1314fe 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally4.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally4.java @@ -5,13 +5,13 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTryCatchFinally4 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally5.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally5.java index 10547ea6c..613aa092c 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally5.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally5.java @@ -3,13 +3,14 @@ package jadx.tests.integration.trycatch; import java.util.ArrayList; import java.util.List; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import jadx.NotYetImplemented; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTryCatchFinally5 extends IntegrationTest { @@ -65,7 +66,14 @@ public class TestTryCatchFinally5 extends IntegrationTest { String code = cls.getCode().toString(); assertThat(code, containsOne("} finally {")); - // TODO: remove duplicates on multiple paths -// assertThat(code, containsOne("d.close();")); + } + + @Test + @NotYetImplemented + public void test2() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, containsOne("d.close();")); } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally6.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally6.java index 447b566bc..cf74391a9 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally6.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally6.java @@ -4,13 +4,13 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsLines; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTryCatchFinally6 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally7.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally7.java index c844263a4..d49af08a8 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally7.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally7.java @@ -1,15 +1,15 @@ package jadx.tests.integration.trycatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; public class TestTryCatchFinally7 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally8.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally8.java index fdedb146f..c563faa3f 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally8.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally8.java @@ -4,14 +4,14 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import jadx.NotYetImplemented; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTryCatchFinally8 extends IntegrationTest { @@ -42,16 +42,24 @@ public class TestTryCatchFinally8 extends IntegrationTest { } } - @Ignore("Fix merged catch blocks (shared code between catches)") @Test + @NotYetImplemented("Fix merged catch blocks (shared code between catches)") public void test() { ClassNode cls = getClassNode(TestCls.class); String code = cls.getCode().toString(); assertThat(code, containsString("try {")); - // TODO: -// assertThat(code, containsString("output = new FileOutputStream(file);")); -// assertThat(code, containsString("} catch (IOException e) {")); assertThat(code, containsString("file.delete();")); } + + @Test + @NotYetImplemented + public void test2() { + disableCompilation(); + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, containsString("output = new FileOutputStream(file);")); + assertThat(code, containsString("} catch (IOException e) {")); + } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchInIf.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchInIf.java index bbc66c4c3..29a1e8f6c 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchInIf.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchInIf.java @@ -1,13 +1,13 @@ package jadx.tests.integration.trycatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; public class TestTryCatchInIf extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchMultiException.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchMultiException.java index 3ec18de03..57febf7aa 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchMultiException.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchMultiException.java @@ -3,13 +3,13 @@ package jadx.tests.integration.trycatch; import java.security.ProviderException; import java.time.DateTimeException; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTryCatchMultiException extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchNoMoveExc.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchNoMoveExc.java index a0c127162..291ed9e11 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchNoMoveExc.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchNoMoveExc.java @@ -1,12 +1,12 @@ package jadx.tests.integration.trycatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTryCatchNoMoveExc extends SmaliTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchNoMoveExc2.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchNoMoveExc2.java index 92b4a4ff3..3333705b9 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchNoMoveExc2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchNoMoveExc2.java @@ -1,13 +1,13 @@ package jadx.tests.integration.trycatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; import static jadx.tests.api.utils.JadxMatchers.containsLines; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; /** * Issue: https://github.com/skylot/jadx/issues/395 diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchStartOnMove.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchStartOnMove.java index 468a3a243..35897dc4e 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchStartOnMove.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchStartOnMove.java @@ -1,12 +1,12 @@ package jadx.tests.integration.trycatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTryCatchStartOnMove extends SmaliTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TryAfterDeclaration.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TryAfterDeclaration.java new file mode 100644 index 000000000..70b5e1423 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TryAfterDeclaration.java @@ -0,0 +1,43 @@ +package jadx.tests.integration.trycatch; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.junit.jupiter.api.Test; + +import jadx.NotYetImplemented; +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.IntegrationTest; + +import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; + +public class TryAfterDeclaration extends IntegrationTest { + + /** + * Issue #62. + */ + @Test + @NotYetImplemented + public void test62() { + ClassNode cls = getClassNode(TestClass.class); + String code = cls.getCode().toString(); + + assertThat(code, containsOne("try {")); + } +} + +class TestClass { + public static void consume() throws IOException { + InputStream bis = null; + try { + bis = new FileInputStream("1.txt"); + while (bis != null) { + System.out.println("c"); + } + } catch (final IOException e) { + } + } +} + diff --git a/jadx-core/src/test/java/jadx/tests/integration/types/TestArrayTypes.java b/jadx-core/src/test/java/jadx/tests/integration/types/TestArrayTypes.java index 80a9748ce..1849dd320 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/types/TestArrayTypes.java +++ b/jadx-core/src/test/java/jadx/tests/integration/types/TestArrayTypes.java @@ -1,12 +1,12 @@ package jadx.tests.integration.types; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestArrayTypes extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/types/TestConstInline.java b/jadx-core/src/test/java/jadx/tests/integration/types/TestConstInline.java index 16051c1af..fe111f56d 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/types/TestConstInline.java +++ b/jadx-core/src/test/java/jadx/tests/integration/types/TestConstInline.java @@ -1,12 +1,12 @@ package jadx.tests.integration.types; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestConstInline extends SmaliTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/types/TestConstTypeInference.java b/jadx-core/src/test/java/jadx/tests/integration/types/TestConstTypeInference.java index 8f0afe479..5d7972992 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/types/TestConstTypeInference.java +++ b/jadx-core/src/test/java/jadx/tests/integration/types/TestConstTypeInference.java @@ -1,15 +1,15 @@ package jadx.tests.integration.types; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.anyOf; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; public class TestConstTypeInference extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/types/TestGenerics.java b/jadx-core/src/test/java/jadx/tests/integration/types/TestGenerics.java index 88bb51032..5a4a5e922 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/types/TestGenerics.java +++ b/jadx-core/src/test/java/jadx/tests/integration/types/TestGenerics.java @@ -1,12 +1,12 @@ package jadx.tests.integration.types; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestGenerics extends IntegrationTest { @@ -29,7 +29,6 @@ public class TestGenerics extends IntegrationTest { @Test public void test2() { -// setFallback(); noDebugInfo(); ClassNode cls = getClassNode(TestCls.class); String code = cls.getCode().toString(); diff --git a/jadx-core/src/test/java/jadx/tests/integration/types/TestPrimitivesInIf.java b/jadx-core/src/test/java/jadx/tests/integration/types/TestPrimitivesInIf.java index 88af91d5f..20c86d1eb 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/types/TestPrimitivesInIf.java +++ b/jadx-core/src/test/java/jadx/tests/integration/types/TestPrimitivesInIf.java @@ -1,13 +1,13 @@ package jadx.tests.integration.types; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; public class TestPrimitivesInIf extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeInheritance.java b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeInheritance.java index fec892bfa..8dce850b4 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeInheritance.java +++ b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeInheritance.java @@ -1,12 +1,12 @@ package jadx.tests.integration.types; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTypeInheritance extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver.java b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver.java index dcbb37614..39f0f0ae7 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver.java +++ b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver.java @@ -1,13 +1,13 @@ package jadx.tests.integration.types; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTypeResolver extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver2.java b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver2.java index 897d86206..774c05ea0 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver2.java @@ -2,13 +2,13 @@ package jadx.tests.integration.types; import java.io.IOException; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTypeResolver2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver3.java b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver3.java index 850a60805..7a6773f97 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver3.java @@ -1,12 +1,13 @@ package jadx.tests.integration.types; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import jadx.NotYetImplemented; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTypeResolver3 extends IntegrationTest { @@ -26,10 +27,18 @@ public class TestTypeResolver3 extends IntegrationTest { ClassNode cls = getClassNode(TestCls.class); String code = cls.getCode().toString(); - // TODO inline into return assertThat(code, containsOne("s1.length() == s2.length() ? 0 : s1.length() < s2.length() ? -1 : 1;")); } + @Test + @NotYetImplemented + public void test3() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, containsOne("return s1.length() == s2.length() ? 0 : s1.length() < s2.length() ? -1 : 1;")); + } + @Test public void test2() { noDebugInfo(); diff --git a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver4.java b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver4.java index 3aac73e44..cf2985a0d 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver4.java +++ b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver4.java @@ -2,14 +2,14 @@ package jadx.tests.integration.types; import java.util.Arrays; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; public class TestTypeResolver4 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver5.java b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver5.java index af34c54c4..12665a8fc 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver5.java +++ b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver5.java @@ -1,13 +1,13 @@ package jadx.tests.integration.types; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestTypeResolver5 extends SmaliTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver6.java b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver6.java index 2a0609182..f30740484 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver6.java +++ b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver6.java @@ -1,12 +1,12 @@ package jadx.tests.integration.types; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTypeResolver6 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver6a.java b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver6a.java index eae2ac8f8..85c2f1c5f 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver6a.java +++ b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver6a.java @@ -1,12 +1,12 @@ package jadx.tests.integration.types; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTypeResolver6a extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver7.java b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver7.java index c4f1b0e7a..08473d49f 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver7.java +++ b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver7.java @@ -1,12 +1,12 @@ package jadx.tests.integration.types; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestTypeResolver7 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/usethis/TestDontInlineThis.java b/jadx-core/src/test/java/jadx/tests/integration/usethis/TestDontInlineThis.java index db8710c6f..7b9e0cd16 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/usethis/TestDontInlineThis.java +++ b/jadx-core/src/test/java/jadx/tests/integration/usethis/TestDontInlineThis.java @@ -2,13 +2,13 @@ package jadx.tests.integration.usethis; import java.util.Random; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestDontInlineThis extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/usethis/TestInlineThis.java b/jadx-core/src/test/java/jadx/tests/integration/usethis/TestInlineThis.java index 93f5239f0..b9dfc17cd 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/usethis/TestInlineThis.java +++ b/jadx-core/src/test/java/jadx/tests/integration/usethis/TestInlineThis.java @@ -1,6 +1,6 @@ package jadx.tests.integration.usethis; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -8,7 +8,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestInlineThis extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/usethis/TestInlineThis2.java b/jadx-core/src/test/java/jadx/tests/integration/usethis/TestInlineThis2.java index ff68382bc..dfcbbf55b 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/usethis/TestInlineThis2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/usethis/TestInlineThis2.java @@ -2,7 +2,7 @@ package jadx.tests.integration.usethis; import java.util.Objects; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -10,7 +10,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestInlineThis2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/usethis/TestRedundantThis.java b/jadx-core/src/test/java/jadx/tests/integration/usethis/TestRedundantThis.java index 18b01d410..947e41d9c 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/usethis/TestRedundantThis.java +++ b/jadx-core/src/test/java/jadx/tests/integration/usethis/TestRedundantThis.java @@ -5,7 +5,7 @@ import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestRedundantThis extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables2.java b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables2.java index 2fe922cf4..bdd8eaf1f 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables2.java @@ -1,12 +1,12 @@ package jadx.tests.integration.variables; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestVariables2 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables3.java b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables3.java index 513d7e9d6..b4884d724 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables3.java @@ -1,12 +1,12 @@ package jadx.tests.integration.variables; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestVariables3 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables4.java b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables4.java index 7d298251b..9baa1de13 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables4.java +++ b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables4.java @@ -3,13 +3,13 @@ package jadx.tests.integration.variables; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestVariables4 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables5.java b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables5.java index 3fe200d39..fb51bee86 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables5.java +++ b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables5.java @@ -1,6 +1,6 @@ package jadx.tests.integration.variables; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -8,8 +8,8 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; public class TestVariables5 extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables6.java b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables6.java index 61c180c7b..52b4b2f8c 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables6.java +++ b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables6.java @@ -1,13 +1,13 @@ package jadx.tests.integration.variables; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestVariables6 extends SmaliTest { @@ -20,6 +20,7 @@ public class TestVariables6 extends SmaliTest { assertThat(code, not(containsString("r4"))); assertThat(code, not(containsString("r1v1"))); assertThat(code, containsString("DateStringParser dateStringParser")); - assertThat(code, containsString("FinancialInstrumentMetadataAttribute startYear = this.mFinancialInstrumentMetadataDefinition.getStartYear();")); + assertThat(code, containsString("FinancialInstrumentMetadataAttribute startYear = this.mFinancialInstrumentMetadataDefinition" + + ".getStartYear();")); } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariablesDefinitions.java b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariablesDefinitions.java index 1c88e314a..a28b4a99d 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariablesDefinitions.java +++ b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariablesDefinitions.java @@ -2,7 +2,7 @@ package jadx.tests.integration.variables; import java.util.List; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import jadx.core.dex.nodes.ClassNode; @@ -13,7 +13,7 @@ import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestVariablesDefinitions extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariablesGeneric.java b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariablesGeneric.java index 502cf8246..c09cd6a43 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariablesGeneric.java +++ b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariablesGeneric.java @@ -1,13 +1,13 @@ package jadx.tests.integration.variables; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; public class TestVariablesGeneric extends SmaliTest { /* diff --git a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariablesIfElseChain.java b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariablesIfElseChain.java index 4a4ba32ff..f2b0ec69b 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariablesIfElseChain.java +++ b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariablesIfElseChain.java @@ -1,13 +1,13 @@ package jadx.tests.integration.variables; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; public class TestVariablesIfElseChain extends IntegrationTest { diff --git a/jadx-core/src/test/java/jadx/tests/smali/TestConstructor.java b/jadx-core/src/test/java/jadx/tests/smali/TestConstructor.java index 40d2b3040..a08e64db5 100644 --- a/jadx-core/src/test/java/jadx/tests/smali/TestConstructor.java +++ b/jadx-core/src/test/java/jadx/tests/smali/TestConstructor.java @@ -1,6 +1,6 @@ package jadx.tests.smali; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; @@ -8,7 +8,7 @@ import jadx.tests.api.SmaliTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestConstructor extends SmaliTest { diff --git a/jadx-core/src/test/java/jadx/tests/smali/TestInlineVarArg.java b/jadx-core/src/test/java/jadx/tests/smali/TestInlineVarArg.java index dd6d4afcc..0f85d0c21 100644 --- a/jadx-core/src/test/java/jadx/tests/smali/TestInlineVarArg.java +++ b/jadx-core/src/test/java/jadx/tests/smali/TestInlineVarArg.java @@ -1,12 +1,12 @@ package jadx.tests.smali; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; import static jadx.tests.api.utils.JadxMatchers.containsOne; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class TestInlineVarArg extends SmaliTest { diff --git a/jadx-core/src/test/java/jadx/tests/smali/TestN21.java b/jadx-core/src/test/java/jadx/tests/smali/TestN21.java index 02dfd2a71..be2070350 100644 --- a/jadx-core/src/test/java/jadx/tests/smali/TestN21.java +++ b/jadx-core/src/test/java/jadx/tests/smali/TestN21.java @@ -1,6 +1,6 @@ package jadx.tests.smali; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.SmaliTest; diff --git a/jadx-core/src/test/smali/generics/MissingGenericsTypesTest.smali b/jadx-core/src/test/smali/generics/MissingGenericsTypesTest.smali new file mode 100644 index 000000000..a7be5824c --- /dev/null +++ b/jadx-core/src/test/smali/generics/MissingGenericsTypesTest.smali @@ -0,0 +1,64 @@ +.class public LMissingGenericsTypesTest; +.super Ljava/lang/Object; + +# instance fields +.field private x:I + + +# direct methods +.method public constructor ()V + .locals 0 + + .line 9 + invoke-direct {p0}, Ljava/lang/Object;->()V + + return-void +.end method + + +# virtual methods +.method public test()V + .locals 3 + + .line 14 + new-instance v0, Ljava/util/HashMap; + + invoke-direct {v0}, Ljava/util/HashMap;->()V + + const/4 v1, 0x1 + + .line 15 + iput v1, p0, LMissingGenericsTypesTest;->x:I + + .line 16 + invoke-interface {v0}, Ljava/util/Map;->keySet()Ljava/util/Set; + + move-result-object v0 + + invoke-interface {v0}, Ljava/util/Set;->iterator()Ljava/util/Iterator; + + move-result-object v0 + + :goto_0 + invoke-interface {v0}, Ljava/util/Iterator;->hasNext()Z + + move-result v1 + + if-eqz v1, :cond_0 + + invoke-interface {v0}, Ljava/util/Iterator;->next()Ljava/lang/Object; + + move-result-object v1 + + check-cast v1, Ljava/lang/String; + + .line 17 + sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream; + + invoke-virtual {v2, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + goto :goto_0 + + :cond_0 + return-void +.end method diff --git a/jadx-core/src/test/smali/names/TestClassNameWithInvalidChar/a.smali b/jadx-core/src/test/smali/names/TestClassNameWithInvalidChar/a.smali new file mode 100644 index 000000000..cdd749958 --- /dev/null +++ b/jadx-core/src/test/smali/names/TestClassNameWithInvalidChar/a.smali @@ -0,0 +1,2 @@ +.class public Ldo-; +.super Ljava/lang/Object; diff --git a/jadx-core/src/test/smali/names/TestClassNameWithInvalidChar/b.smali b/jadx-core/src/test/smali/names/TestClassNameWithInvalidChar/b.smali new file mode 100644 index 000000000..b2edc2f7d --- /dev/null +++ b/jadx-core/src/test/smali/names/TestClassNameWithInvalidChar/b.smali @@ -0,0 +1,2 @@ +.class public Li-f; +.super Ljava/lang/Object; diff --git a/jadx-core/src/test/smali/names/TestReservedClassNames.smali b/jadx-core/src/test/smali/names/TestReservedClassNames.smali new file mode 100644 index 000000000..b5dadcccc --- /dev/null +++ b/jadx-core/src/test/smali/names/TestReservedClassNames.smali @@ -0,0 +1,12 @@ +.class public Ldo; +.super Ljava/lang/Object; + +# direct methods +.method public constructor ()V + .locals 0 + + .line 3 + invoke-direct {p0}, Ljava/lang/Object;->()V + + return-void +.end method diff --git a/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java b/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java index 69bd82107..acd493317 100644 --- a/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java +++ b/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java @@ -53,7 +53,7 @@ public class JadxWrapper { while (ex.isTerminating()) { long total = ex.getTaskCount(); long done = ex.getCompletedTaskCount(); - progressMonitor.setProgress((int) (done * 100.0 / (double) total)); + progressMonitor.setProgress((int) (done * 100.0 / total)); Thread.sleep(500); } progressMonitor.close(); @@ -88,7 +88,8 @@ public class JadxWrapper { return classList.stream().filter(cls -> { for (String exclude : excludedPackages) { - if (cls.getFullName().startsWith(exclude)) { + if (cls.getFullName().equals(exclude) + || cls.getFullName().startsWith(exclude + '.')) { return false; } } @@ -98,11 +99,15 @@ public class JadxWrapper { public List getExcludedPackages() { String excludedPackages = settings.getExcludedPackages().trim(); + if (excludedPackages.isEmpty()) { + return Collections.emptyList(); + } return Arrays.asList(excludedPackages.split("[ ]+")); } public void addExcludedPackage(String packageToExclude) { - settings.setExcludedPackages(settings.getExcludedPackages() + ' ' + packageToExclude); + String newExclusion = settings.getExcludedPackages() + ' ' + packageToExclude; + settings.setExcludedPackages(newExclusion.trim()); settings.sync(); } diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/JPackage.java b/jadx-gui/src/main/java/jadx/gui/treemodel/JPackage.java index 8481bbbcb..ef710d18b 100644 --- a/jadx-gui/src/main/java/jadx/gui/treemodel/JPackage.java +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/JPackage.java @@ -46,7 +46,8 @@ public class JPackage extends JNode implements Comparable { private void setEnabled(JadxWrapper wrapper) { List excludedPackages = wrapper.getExcludedPackages(); this.enabled = excludedPackages.isEmpty() - || excludedPackages.stream().filter(p -> !p.isEmpty()).noneMatch(p -> name.startsWith(p)); + || excludedPackages.stream().filter(p -> !p.isEmpty()) + .noneMatch(p -> name.equals(p) || name.startsWith(p + '.')); } public final void update() { diff --git a/jadx-gui/src/main/java/jadx/gui/ui/AboutDialog.java b/jadx-gui/src/main/java/jadx/gui/ui/AboutDialog.java index 4659aab39..a32e9a290 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/AboutDialog.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/AboutDialog.java @@ -34,7 +34,7 @@ class AboutDialog extends JDialog { version.setAlignmentX(0.5f); String javaVm = System.getProperty("java.vm.name"); - String javaVer = System.getProperty("java.vm.version"); + String javaVer = System.getProperty("java.version"); javaVm = javaVm == null ? "" : javaVm; diff --git a/jadx-gui/src/test/groovy/jadx/gui/tests/TestJumpManager.groovy b/jadx-gui/src/test/groovy/jadx/gui/tests/TestJumpManager.groovy deleted file mode 100644 index ab71c9c30..000000000 --- a/jadx-gui/src/test/groovy/jadx/gui/tests/TestJumpManager.groovy +++ /dev/null @@ -1,117 +0,0 @@ -package jadx.gui.tests - -import jadx.gui.utils.JumpManager -import jadx.gui.utils.JumpPosition -import spock.lang.Specification - -class TestJumpManager extends Specification { - - JumpManager jm - - def setup() { - jm = new JumpManager() - } - - def "empty history"() { - expect: - jm.getPrev() == null - jm.getNext() == null - } - - def "empty history 2"() { - expect: - jm.getPrev() == null - jm.getNext() == null - jm.getPrev() == null - jm.getNext() == null - jm.getPrev() == null - } - - def "1 element"() { - when: - jm.addPosition(Mock(JumpPosition)) - then: - jm.getPrev() == null - jm.getNext() == null - } - - def "2 elements"() { - when: - def mock1 = Mock(JumpPosition) - jm.addPosition(mock1) - def mock2 = Mock(JumpPosition) - jm.addPosition(mock2) - // 1 - 2@ - then: - noExceptionThrown() - jm.getPrev() == mock1 - jm.getPrev() == null - jm.getNext() == mock2 - jm.getNext() == null - } - - def "navigation"() { - expect: - def mock1 = Mock(JumpPosition) - jm.addPosition(mock1) - // 1@ - def mock2 = Mock(JumpPosition) - jm.addPosition(mock2) - // 1 - 2@ - jm.getPrev() == mock1 - // 1@ - 2 - def mock3 = Mock(JumpPosition) - jm.addPosition(mock3) - // 1 - 3@ - jm.getNext() == null - jm.getPrev() == mock1 - // 1@ - 3 - jm.getNext() == mock3 - } - - def "navigation2"() { - expect: - def mock1 = Mock(JumpPosition) - jm.addPosition(mock1) - // 1@ - def mock2 = Mock(JumpPosition) - jm.addPosition(mock2) - // 1 - 2@ - def mock3 = Mock(JumpPosition) - jm.addPosition(mock3) - // 1 - 2 - 3@ - def mock4 = Mock(JumpPosition) - jm.addPosition(mock4) - // 1 - 2 - 3 - 4@ - jm.getPrev() == mock3 - // 1 - 2 - 3@ - 4 - jm.getPrev() == mock2 - // 1 - 2@ - 3 - 4 - def mock5 = Mock(JumpPosition) - jm.addPosition(mock5) - // 1 - 2 - 5@ - jm.getNext() == null - jm.getNext() == null - jm.getPrev() == mock2 - // 1 - 2@ - 5 - jm.getPrev() == mock1 - // 1@ - 2 - 5 - jm.getPrev() == null - jm.getNext() == mock2 - // 1 - 2@ - 5 - jm.getNext() == mock5 - // 1 - 2 - 5@ - jm.getNext() == null - } - - def "add same element"() { - when: - def mock = Mock(JumpPosition) - jm.addPosition(mock) - jm.addPosition(mock) - then: - noExceptionThrown() - jm.getPrev() == null - jm.getNext() == null - } -} diff --git a/jadx-gui/src/test/groovy/jadx/gui/tests/TestStringRef.groovy b/jadx-gui/src/test/groovy/jadx/gui/tests/TestStringRef.groovy deleted file mode 100644 index b6d30cdd3..000000000 --- a/jadx-gui/src/test/groovy/jadx/gui/tests/TestStringRef.groovy +++ /dev/null @@ -1,71 +0,0 @@ -package jadx.gui.tests - -import jadx.gui.utils.search.StringRef -import spock.lang.Specification - -import static jadx.gui.utils.search.StringRef.fromStr -import static jadx.gui.utils.search.StringRef.subString - -class TestStringRef extends Specification { - - def "test substring"() { - expect: - s1.toString() == expected - s1 == fromStr(expected) - where: - s1 | expected - fromStr("a") | "a" - subString("a", 0) | "a" - subString("a", 1) | "" - subString("a", 0, 0) | "" - subString("a", 0, 1) | "a" - subString("abc", 1, 2) | "b" - subString("abc", 2) | "c" - subString("abc", 2, 3) | "c" - } - - def "compare with original substring"() { - expect: - s == expected - where: - s | expected - "a".substring(0) | "a" - "a".substring(1) | "" - "a".substring(0, 0) | "" - "a".substring(0, 1) | "a" - } - - def "test trim"() { - expect: - s.trim().toString() == expected - where: - s | expected - fromStr("a") | "a" - fromStr(" a ") | "a" - fromStr("\ta") | "a" - subString("a b c", 1) | "b c" - subString("a b\tc", 1, 4) | "b" - subString("a b\tc", 2, 3) | "b" - } - - def "test split"() { - expect: - StringRef.split(s, d) == (expected as String[]).collect { fromStr(it) } - if (!Arrays.equals(s.split(d), (expected).toArray(new String[0]))) { - throw new IllegalArgumentException("Don't match with original split: " - + " s='" + s + "' d='" + d - + "', expected:" + expected + ", got: " + Arrays.toString(s.split(d))); - } - where: - s | d | expected - "abc" | "b" | ["a", "c"] - "abc" | "a" | ["", "bc"] - "abc" | "c" | ["ab"] - "abc" | "d" | ["abc"] - "abbbc" | "b" | ["a", "", "", "c"] - "abbbc" | "bb" | ["a", "bc"] - "abbbc" | "bbb" | ["a", "c"] - "abbbc" | "bbc" | ["ab"] - "abbbc" | "bbbc" | ["a"] - } -} diff --git a/jadx-gui/src/test/groovy/jadx/gui/tests/TestVersionsComparator.groovy b/jadx-gui/src/test/groovy/jadx/gui/tests/TestVersionsComparator.groovy deleted file mode 100644 index 93e09c2c9..000000000 --- a/jadx-gui/src/test/groovy/jadx/gui/tests/TestVersionsComparator.groovy +++ /dev/null @@ -1,31 +0,0 @@ -package jadx.gui.tests - -import jadx.gui.update.VersionComparator -import spock.lang.Specification - -class TestVersionsComparator extends Specification { - - def "test"() { - expect: - VersionComparator.compare(s1, s2) == expected - VersionComparator.compare(s2, s1) == -expected - - where: - s1 | s2 | expected - "" | "" | 0 - "1" | "1" | 0 - "1" | "2" | -1 - "1.1" | "1.1" | 0 - "0.5" | "0.5" | 0 - "0.5" | "0.5.0" | 0 - "0.5" | "0.5.00" | 0 - "0.5" | "0.5.0.0" | 0 - "0.5" | "0.5.0.1" | -1 - "0.5.0" | "0.5.0" | 0 - "0.5.0" | "0.5.1" | -1 - "0.5" | "0.5.1" | -1 - "0.4.8" | "0.5" | -1 - "0.4.8" | "0.5.0" | -1 - "0.4.8" | "0.6" | -1 - } -} diff --git a/jadx-gui/src/test/java/jadx/gui/treemodel/JSourcesTest.java b/jadx-gui/src/test/java/jadx/gui/treemodel/JSourcesTest.java index cf4630949..9053faa61 100644 --- a/jadx-gui/src/test/java/jadx/gui/treemodel/JSourcesTest.java +++ b/jadx-gui/src/test/java/jadx/gui/treemodel/JSourcesTest.java @@ -3,8 +3,8 @@ package jadx.gui.treemodel; import java.util.Collections; import java.util.List; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import jadx.api.Factory; import jadx.api.JadxArgs; @@ -17,7 +17,7 @@ import jadx.gui.JadxWrapper; import static java.util.Arrays.asList; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -26,7 +26,7 @@ public class JSourcesTest { private JSources sources; private JadxDecompiler decompiler; - @Before + @BeforeEach public void init() { JRoot root = mock(JRoot.class); when(root.isFlatPackages()).thenReturn(false); diff --git a/jadx-gui/src/test/java/jadx/gui/update/VersionComparatorTest.java b/jadx-gui/src/test/java/jadx/gui/update/VersionComparatorTest.java new file mode 100644 index 000000000..f6e95bd5c --- /dev/null +++ b/jadx-gui/src/test/java/jadx/gui/update/VersionComparatorTest.java @@ -0,0 +1,33 @@ +package jadx.gui.update; + +import org.junit.jupiter.api.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +class VersionComparatorTest { + + @Test + public void testCompare() { + checkCompare("", "", 0); + checkCompare("1", "1", 0); + checkCompare("1", "2", -1); + checkCompare("1.1", "1.1", 0); + checkCompare("0.5", "0.5", 0); + checkCompare("0.5", "0.5.0", 0); + checkCompare("0.5", "0.5.00", 0); + checkCompare("0.5", "0.5.0.0", 0); + checkCompare("0.5", "0.5.0.1", -1); + checkCompare("0.5.0", "0.5.0", 0); + checkCompare("0.5.0", "0.5.1", -1); + checkCompare("0.5", "0.5.1", -1); + checkCompare("0.4.8", "0.5", -1); + checkCompare("0.4.8", "0.5.0", -1); + checkCompare("0.4.8", "0.6", -1); + } + + private static void checkCompare(String a, String b, int result) { + assertThat(VersionComparator.compare(a, b), is(result)); + assertThat(VersionComparator.compare(b, a), is(-result)); + } +} diff --git a/jadx-gui/src/test/java/jadx/gui/utils/CertificateManagerTest.java b/jadx-gui/src/test/java/jadx/gui/utils/CertificateManagerTest.java index 0e0e15268..c5616f16a 100644 --- a/jadx-gui/src/test/java/jadx/gui/utils/CertificateManagerTest.java +++ b/jadx-gui/src/test/java/jadx/gui/utils/CertificateManagerTest.java @@ -1,5 +1,8 @@ package jadx.gui.utils; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; @@ -7,9 +10,8 @@ import java.net.URL; import java.security.cert.Certificate; import java.util.Collection; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; public class CertificateManagerTest { private static final String CERTIFICATE_TEST_DIR = "certificate-test/"; @@ -32,7 +34,7 @@ public class CertificateManagerTest { } } - @Before + @BeforeEach public void setUp() { emptyPath = getResourcePath(EMPTY); certificateManagerRSA = getCertificateManger(RSA); @@ -43,72 +45,72 @@ public class CertificateManagerTest { public void decodeNotCertificateFile() throws IOException { try (InputStream in = new FileInputStream(emptyPath)) { String result = CertificateManager.decode(in); - Assert.assertEquals("", result); + assertEquals("", result); } } @Test public void decodeRSAKeyHeader() { String string = certificateManagerRSA.generateHeader(); - Assert.assertTrue(string.contains("X.509")); - Assert.assertTrue(string.contains("0x4bd68052")); - Assert.assertTrue(string.contains("CN=test cert, OU=test unit, O=OOO TestOrg, L=St.Peterburg, ST=Russia, C=123456")); + assertTrue(string.contains("X.509")); + assertTrue(string.contains("0x4bd68052")); + assertTrue(string.contains("CN=test cert, OU=test unit, O=OOO TestOrg, L=St.Peterburg, ST=Russia, C=123456")); } @Test public void decodeDSAKeyHeader() { String string = certificateManagerDSA.generateHeader(); - Assert.assertTrue(string.contains("X.509")); - Assert.assertTrue(string.contains("0x16420ba2")); - Assert.assertTrue(string.contains("O=\"UJMRFVV CN=EDCVBGT C=TG\"")); + assertTrue(string.contains("X.509")); + assertTrue(string.contains("0x16420ba2")); + assertTrue(string.contains("O=\"UJMRFVV CN=EDCVBGT C=TG\"")); } @Test public void decodeRSAKeySignature() { String string = certificateManagerRSA.generateSignature(); - Assert.assertTrue(string.contains("SHA256withRSA")); - Assert.assertTrue(string.contains("1.2.840.113549.1.1.11")); + assertTrue(string.contains("SHA256withRSA")); + assertTrue(string.contains("1.2.840.113549.1.1.11")); } @Test public void decodeDSAKeySignature() { String string = certificateManagerDSA.generateSignature(); - Assert.assertTrue(string.contains("SHA1withDSA")); - Assert.assertTrue(string.contains("1.2.840.10040.4.3")); + assertTrue(string.contains("SHA1withDSA")); + assertTrue(string.contains("1.2.840.10040.4.3")); } @Test public void decodeRSAFingerprint() { String string = certificateManagerRSA.generateFingerprint(); - Assert.assertTrue(string.contains("61 18 0A 71 3F C9 55 16 4E 04 E3 C5 45 08 D9 11")); - Assert.assertTrue(string.contains("A0 6E A6 06 DB 2C 6F 3A 16 56 7F 75 97 7B AE 85 C2 13 09 37")); - Assert.assertTrue(string.contains("12 53 E8 BB C8 AA 27 A8 49 9B F8 0D 6E 68 CE 32 35 50 DE 55 A7 E7 8C 29 51 00 96 D7 56 F4 54 " + + assertTrue(string.contains("61 18 0A 71 3F C9 55 16 4E 04 E3 C5 45 08 D9 11")); + assertTrue(string.contains("A0 6E A6 06 DB 2C 6F 3A 16 56 7F 75 97 7B AE 85 C2 13 09 37")); + assertTrue(string.contains("12 53 E8 BB C8 AA 27 A8 49 9B F8 0D 6E 68 CE 32 35 50 DE 55 A7 E7 8C 29 51 00 96 D7 56 F4 54 " + "44")); } @Test public void decodeDSAFingerprint() { String string = certificateManagerDSA.generateFingerprint(); - Assert.assertTrue(string.contains("D9 06 A6 2D 1F 79 8C 9D A6 EF 40 C7 2E C2 EA 0B")); - Assert.assertTrue(string.contains("18 E9 9C D4 A1 40 8F 63 FA EC 2E 62 A0 F2 AE B7 3F C3 C2 04")); - Assert.assertTrue(string.contains("74 F9 48 64 EE AC 92 26 53 2C 7A 0E 55 BE 5E D8 2F A7 D9 A9 99 F5 D5 21 2C 51 21 C4 31 AD 73 " + + assertTrue(string.contains("D9 06 A6 2D 1F 79 8C 9D A6 EF 40 C7 2E C2 EA 0B")); + assertTrue(string.contains("18 E9 9C D4 A1 40 8F 63 FA EC 2E 62 A0 F2 AE B7 3F C3 C2 04")); + assertTrue(string.contains("74 F9 48 64 EE AC 92 26 53 2C 7A 0E 55 BE 5E D8 2F A7 D9 A9 99 F5 D5 21 2C 51 21 C4 31 AD 73 " + "40")); } @Test public void decodeRSAPubKey() { String string = certificateManagerRSA.generatePublicKey(); - Assert.assertTrue(string.contains("RSA")); - Assert.assertTrue(string.contains("65537")); - Assert.assertTrue(string.contains( + assertTrue(string.contains("RSA")); + assertTrue(string.contains("65537")); + assertTrue(string.contains( "16819531290318044625546437357099080306019392752925688951114880688329201213180109168890384305768067101521914473763638669503560977521269328582980060332888147680193318231260043189411794465899645633586173494259691101582064441956032924396850221679489313043628562082670183392670094163371858684118480409374749790551473773845213427476236147328434427272177623018935282929152308753854314219987617604037468769472089902090243358285991739642170211970862773121939911777280101937073243006335384636193260583579409760790138329893534549366882523130765297472656435892831796545149793228897111760122091442123535919361963075454640516520743")); } @Test public void decodeDSAPubKey() { String string = certificateManagerDSA.generatePublicKey(); - Assert.assertTrue(string.contains("DSA")); - Assert.assertTrue(string.contains( + assertTrue(string.contains("DSA")); + assertTrue(string.contains( "19323367605058154682563301282345453222279312104889899001698209626254725581511375469963812461090495963838615773832867364330457010553974237985991904800958394169421485070378434746792379708805563793253282995274293621162504943287538455944652344378242226897507369146942411692220922477368782490423187845815262510366")); } diff --git a/jadx-gui/src/test/java/jadx/gui/utils/JumpManagerTest.java b/jadx-gui/src/test/java/jadx/gui/utils/JumpManagerTest.java new file mode 100644 index 000000000..02b90806d --- /dev/null +++ b/jadx-gui/src/test/java/jadx/gui/utils/JumpManagerTest.java @@ -0,0 +1,123 @@ +package jadx.gui.utils; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import jadx.gui.treemodel.TextNode; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.nullValue; +import static org.hamcrest.Matchers.sameInstance; + +class JumpManagerTest { + private JumpManager jm; + + @BeforeEach + public void setup() { + jm = new JumpManager(); + } + + @Test + public void testEmptyHistory() { + assertThat(jm.getPrev(), nullValue()); + assertThat(jm.getNext(), nullValue()); + } + + @Test + public void testEmptyHistory2() { + assertThat(jm.getPrev(), nullValue()); + assertThat(jm.getNext(), nullValue()); + assertThat(jm.getPrev(), nullValue()); + assertThat(jm.getNext(), nullValue()); + assertThat(jm.getPrev(), nullValue()); + } + + @Test + public void testOneElement() { + jm.addPosition(makeJumpPos()); + + assertThat(jm.getPrev(), nullValue()); + assertThat(jm.getNext(), nullValue()); + } + + @Test + public void testTwoElements() { + JumpPosition pos1 = makeJumpPos(); + jm.addPosition(pos1); + JumpPosition pos2 = makeJumpPos(); + jm.addPosition(pos2); + + assertThat(jm.getPrev(), sameInstance(pos1)); + assertThat(jm.getPrev(), nullValue()); + assertThat(jm.getNext(), sameInstance(pos2)); + assertThat(jm.getNext(), nullValue()); + } + + @Test + public void testNavigation() { + JumpPosition pos1 = makeJumpPos(); + jm.addPosition(pos1); + // 1@ + JumpPosition pos2 = makeJumpPos(); + jm.addPosition(pos2); + // 1 - 2@ + assertThat(jm.getPrev(), sameInstance(pos1)); + // 1@ - 2 + JumpPosition pos3 = makeJumpPos(); + jm.addPosition(pos3); + // 1 - 3@ + assertThat(jm.getNext(), nullValue()); + assertThat(jm.getPrev(), sameInstance(pos1)); + // 1@ - 3 + assertThat(jm.getNext(), sameInstance(pos3)); + } + + @Test + public void testNavigation2() { + JumpPosition pos1 = makeJumpPos(); + jm.addPosition(pos1); + // 1@ + JumpPosition pos2 = makeJumpPos(); + jm.addPosition(pos2); + // 1 - 2@ + JumpPosition pos3 = makeJumpPos(); + jm.addPosition(pos3); + // 1 - 2 - 3@ + JumpPosition pos4 = makeJumpPos(); + jm.addPosition(pos4); + // 1 - 2 - 3 - 4@ + assertThat(jm.getPrev(), sameInstance(pos3)); + // 1 - 2 - 3@ - 4 + assertThat(jm.getPrev(), sameInstance(pos2)); + // 1 - 2@ - 3 - 4 + JumpPosition pos5 = makeJumpPos(); + jm.addPosition(pos5); + // 1 - 2 - 5@ + assertThat(jm.getNext(), nullValue()); + assertThat(jm.getNext(), nullValue()); + assertThat(jm.getPrev(), sameInstance(pos2)); + // 1 - 2@ - 5 + assertThat(jm.getPrev(), sameInstance(pos1)); + // 1@ - 2 - 5 + assertThat(jm.getPrev(), nullValue()); + assertThat(jm.getNext(), sameInstance(pos2)); + // 1 - 2@ - 5 + assertThat(jm.getNext(), sameInstance(pos5)); + // 1 - 2 - 5@ + assertThat(jm.getNext(), nullValue()); + } + + @Test + public void addSame() { + JumpPosition pos = makeJumpPos(); + jm.addPosition(pos); + jm.addPosition(pos); + + assertThat(jm.getPrev(), nullValue()); + assertThat(jm.getNext(), nullValue()); + } + + private JumpPosition makeJumpPos() { + return new JumpPosition(new TextNode(""), 0); + } +} diff --git a/jadx-gui/src/test/java/jadx/gui/utils/search/StringRefTest.java b/jadx-gui/src/test/java/jadx/gui/utils/search/StringRefTest.java new file mode 100644 index 000000000..28f991e3c --- /dev/null +++ b/jadx-gui/src/test/java/jadx/gui/utils/search/StringRefTest.java @@ -0,0 +1,71 @@ +package jadx.gui.utils.search; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.jupiter.api.Test; + +import static jadx.gui.utils.search.StringRef.fromStr; +import static jadx.gui.utils.search.StringRef.subString; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +class StringRefTest { + + @Test + public void testConvert() { + assertThat(fromStr("a").toString(), is("a")); + } + + @Test + public void testSubstring() { + checkStr(subString("a", 0), "a"); + checkStr(subString("a", 1), ""); + checkStr(subString("a", 0, 0), ""); + checkStr(subString("a", 0, 1), "a"); + checkStr(subString("abc", 1, 2), "b"); + checkStr(subString("abc", 2), "c"); + checkStr(subString("abc", 2, 3), "c"); + } + + public static void checkStr(StringRef ref, String str) { + assertThat(ref.toString(), is(str)); + assertThat(ref, is(fromStr(str))); + } + + @Test + public void testTrim() { + checkTrim(fromStr("a"), "a"); + checkTrim(fromStr(" a "), "a"); + checkTrim(fromStr("\ta"), "a"); + checkTrim(subString("a b c", 1), "b c"); + checkTrim(subString("a b\tc", 1, 4), "b"); + checkTrim(subString("a b\tc", 2, 3), "b"); + } + + private static void checkTrim(StringRef ref, String result) { + assertThat(ref.trim().toString(), is(result)); + } + + @Test + public void testSplit() { + checkSplit("abc", "b", "a", "c"); + checkSplit("abc", "a", "", "bc"); + checkSplit("abc", "c", "ab"); + checkSplit("abc", "d", "abc"); + checkSplit("abbbc", "b", "a", "", "", "c"); + checkSplit("abbbc", "bb", "a", "bc"); + checkSplit("abbbc", "bbb", "a", "c"); + checkSplit("abbbc", "bbc", "ab"); + checkSplit("abbbc", "bbbc", "a"); + } + + private static void checkSplit(String str, String splitBy, String... result) { + List expectedStringRegList = Arrays.stream(result).map(StringRef::fromStr).collect(Collectors.toList()); + assertThat(StringRef.split(str, splitBy), is(expectedStringRegList)); + + // compare with original split + assertThat(str.split(splitBy), is(result)); + } +} diff --git a/jadx-samples/src/main/java/jadx/samples/TestCF4.java b/jadx-samples/src/main/java/jadx/samples/TestCF4.java index 630482031..fa5fd7a79 100644 --- a/jadx-samples/src/main/java/jadx/samples/TestCF4.java +++ b/jadx-samples/src/main/java/jadx/samples/TestCF4.java @@ -21,13 +21,13 @@ public class TestCF4 extends AbstractTest { f = null; c = 2; testComplexIf("abcdef", 0); - assertEquals(c, (int) 'c'); + assertEquals(c, 'c'); d = ""; f = null; c = 0; testComplexIf("abcdef", 0); - assertEquals(c, (int) 'a'); + assertEquals(c, 'a'); d = ""; f = "1";