java-decompiler: post-import cleanup (tests reorganized)
This commit is contained in:
124
test/org/jetbrains/java/decompiler/SingleClassesTest.java
Normal file
124
test/org/jetbrains/java/decompiler/SingleClassesTest.java
Normal file
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* Copyright 2000-2014 JetBrains s.r.o.
|
||||
*
|
||||
* 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 org.jetbrains.java.decompiler;
|
||||
|
||||
import org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler;
|
||||
import org.jetbrains.java.decompiler.main.extern.IFernflowerPreferences;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.HashMap;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class SingleClassesTest {
|
||||
private File tempDir;
|
||||
private ConsoleDecompiler decompiler;
|
||||
|
||||
@Before
|
||||
public void setUp() throws IOException {
|
||||
tempDir = File.createTempFile("decompiler_test_", "_dir");
|
||||
assertTrue(tempDir.delete());
|
||||
assertTrue(tempDir.mkdirs());
|
||||
decompiler = new ConsoleDecompiler(new HashMap<String, Object>() {{
|
||||
boolean win = System.getProperty("os.name", "").startsWith("Windows");
|
||||
put(IFernflowerPreferences.LOG_LEVEL, "warn");
|
||||
put(IFernflowerPreferences.RENAME_ENTITIES, "1");
|
||||
put(IFernflowerPreferences.HIDE_DEFAULT_CONSTRUCTOR, "1");
|
||||
put(IFernflowerPreferences.DECOMPILE_GENERIC_SIGNATURES, "0");
|
||||
put(IFernflowerPreferences.IDEA_NOT_NULL_ANNOTATION, "1");
|
||||
put(IFernflowerPreferences.LAMBDA_TO_ANONYMOUS_CLASS, "0");
|
||||
put(IFernflowerPreferences.USE_DEBUG_VARNAMES, "0");
|
||||
put(IFernflowerPreferences.NEW_LINE_SEPARATOR, (win ? "0" : "1"));
|
||||
}});
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() {
|
||||
decompiler = null;
|
||||
delete(tempDir);
|
||||
tempDir = null;
|
||||
}
|
||||
|
||||
@Test public void testClassFields() { doTest("TestClassFields"); }
|
||||
@Test public void testClassLambda() { doTest("TestClassLambda"); }
|
||||
@Test public void testClassLoop() { doTest("TestClassLoop"); }
|
||||
@Test public void testClassSwitch() { doTest("TestClassSwitch"); }
|
||||
@Test public void testClassTypes() { doTest("TestClassTypes"); }
|
||||
@Test public void testClassVar() { doTest("TestClassVar"); }
|
||||
|
||||
private void doTest(String testName) {
|
||||
try {
|
||||
File testDataDir = new File("testData");
|
||||
if (!isTestDataDir(testDataDir)) testDataDir = new File("community/plugins/java-decompiler/engine/testData");
|
||||
if (!isTestDataDir(testDataDir)) testDataDir = new File("plugins/java-decompiler/engine/testData");
|
||||
assertTrue(isTestDataDir(testDataDir));
|
||||
|
||||
File classFile = new File(testDataDir, "/classes/pkg/" + testName + ".class");
|
||||
assertTrue(classFile.isFile());
|
||||
decompiler.addSpace(classFile, true);
|
||||
decompiler.decompileContext(tempDir);
|
||||
|
||||
File decompiledFile = new File(tempDir, testName + ".java");
|
||||
assertTrue(decompiledFile.isFile());
|
||||
|
||||
File referenceFile = new File(testDataDir, "results/" + testName + ".dec");
|
||||
assertTrue(referenceFile.isFile());
|
||||
|
||||
String decompiledContent = getContent(decompiledFile);
|
||||
String referenceContent = getContent(referenceFile);
|
||||
assertEquals(referenceContent, decompiledContent);
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isTestDataDir(File dir) {
|
||||
return dir.isDirectory() && new File(dir, "classes").isDirectory() && new File(dir, "results").isDirectory();
|
||||
}
|
||||
|
||||
private static String getContent(File file) throws IOException {
|
||||
Reader reader = new InputStreamReader(new FileInputStream(file), "UTF-8");
|
||||
try {
|
||||
char[] buff = new char[16 * 1024];
|
||||
StringBuilder content = new StringBuilder();
|
||||
int n;
|
||||
while ((n = reader.read(buff)) > 0) {
|
||||
content.append(buff, 0, n);
|
||||
}
|
||||
return content.toString();
|
||||
}
|
||||
finally {
|
||||
reader.close();
|
||||
}
|
||||
}
|
||||
|
||||
private static void delete(File file) {
|
||||
if (file.isDirectory()) {
|
||||
File[] files = file.listFiles();
|
||||
if (files != null) {
|
||||
for (File f : files) delete(f);
|
||||
}
|
||||
}
|
||||
else {
|
||||
assertTrue(file.delete());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,95 +0,0 @@
|
||||
package unit;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import de.fernflower.main.decompiler.ConsoleDecompiler;
|
||||
import de.fernflower.main.extern.IFernflowerPreferences;
|
||||
|
||||
public class TestSingleClasses {
|
||||
|
||||
@Test
|
||||
public void test() throws IOException {
|
||||
|
||||
Date start = new Date();
|
||||
|
||||
String current_path = new File(".").getCanonicalPath().toString();
|
||||
|
||||
iterateDirectory(new File(current_path + "/bin/unit/classes/"));
|
||||
|
||||
System.out.println("\n\nTime elapsed " + (new Date().getTime() - start.getTime())/1000);
|
||||
}
|
||||
|
||||
private void iterateDirectory(File dir) throws IOException {
|
||||
|
||||
for (File file : dir.listFiles()) {
|
||||
if (file.isDirectory()) {
|
||||
iterateDirectory(file);
|
||||
} else if(file.getName().endsWith(".class")) {
|
||||
decompileAndCheckFile(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void decompileAndCheckFile(File file) throws IOException {
|
||||
|
||||
try {
|
||||
|
||||
ConsoleDecompiler decompiler = new ConsoleDecompiler(new HashMap<String, Object>(){{
|
||||
put("log", "warn");
|
||||
put("ren", "1");
|
||||
put(IFernflowerPreferences.HIDE_DEFAULT_CONSTRUCTOR, "1");
|
||||
put(IFernflowerPreferences.DECOMPILE_GENERIC_SIGNATURES, "0");
|
||||
put(IFernflowerPreferences.IDEA_NOT_NULL_ANNOTATION, "1");
|
||||
put(IFernflowerPreferences.LAMBDA_TO_ANONYMOUS_CLASS, "0");
|
||||
put(IFernflowerPreferences.USE_DEBUG_VARNAMES, "0");
|
||||
put(IFernflowerPreferences.NEW_LINE_SEPARATOR, "0");
|
||||
}});
|
||||
|
||||
decompiler.addSpace(file, true);
|
||||
|
||||
// files
|
||||
String current_path = new File(".").getCanonicalPath().toString();
|
||||
|
||||
String file_class_name = file.getName();
|
||||
String file_name = file_class_name.substring(0, file_class_name.lastIndexOf(".class"));
|
||||
String file_java_name = file_name+".java";
|
||||
|
||||
File reference_file = new File(current_path + "/test/unit/results/" + file_name + ".dec");
|
||||
if(!reference_file.exists()) {
|
||||
return; // no reference file for some reason, not yet created
|
||||
}
|
||||
|
||||
File temp_dir = new File(Files.createTempDirectory("tempdec_"+file_name).toString());
|
||||
|
||||
// decompile it
|
||||
decompiler.decompileContext(temp_dir);
|
||||
|
||||
// get both the decompiled file content and the reference
|
||||
// NOTE: reference files are saved with Windows-style line endings. Convert them if you are decompiling to Unix.
|
||||
File decompiled_file = new File(temp_dir, file_java_name);
|
||||
String decompiled_content = new String(Files.readAllBytes(decompiled_file.toPath()), "UTF-8");
|
||||
String reference_content = new String(Files.readAllBytes(reference_file.toPath()), "UTF-8");
|
||||
|
||||
// clean up
|
||||
decompiled_file.delete();
|
||||
temp_dir.delete();
|
||||
|
||||
// compare file content with the reference
|
||||
assertEquals(decompiled_content, reference_content);
|
||||
|
||||
} catch(Exception ex) {
|
||||
System.out.println("ERROR: testing file " + file.getCanonicalPath());
|
||||
ex.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
package unit.classes;
|
||||
|
||||
public class TestClassFields {
|
||||
|
||||
private static int[] sizes;
|
||||
private static String[] names;
|
||||
|
||||
static {
|
||||
|
||||
names = new String[]{"name1", "name2"};
|
||||
sizes = new int[names.length];
|
||||
}
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
package unit.classes;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.OptionalInt;
|
||||
import java.util.function.IntBinaryOperator;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class TestClassLambda {
|
||||
|
||||
public int field = 0;
|
||||
|
||||
public void testLambda() {
|
||||
|
||||
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
|
||||
int b = (int)Math.random();
|
||||
|
||||
list.forEach(n -> {int a = 2 * n; System.out.println(a + b + field);});
|
||||
}
|
||||
|
||||
public void testLambda1() {
|
||||
|
||||
int a = (int)Math.random();
|
||||
|
||||
Runnable r = () -> { System.out.println("hello" + a); };
|
||||
|
||||
Runnable r1 = () -> { System.out.println("hello1" + a); };
|
||||
}
|
||||
|
||||
public void testLambda2() {
|
||||
reduce((left, right) -> Math.max(left, right));
|
||||
}
|
||||
|
||||
public void testLambda3() { // IDEA-127301
|
||||
reduce(Math::max);
|
||||
}
|
||||
|
||||
public void testLambda4() {
|
||||
reduce(TestClassLambda::localMax);
|
||||
}
|
||||
|
||||
public void testLambda5() {
|
||||
String x = "abcd";
|
||||
function(x::toString);
|
||||
}
|
||||
|
||||
public void testLambda6() {
|
||||
List<String> list = new ArrayList<String>();
|
||||
int bottom = list.size() * 2;
|
||||
int top = list.size() * 5;
|
||||
list.removeIf( s -> (bottom >= s.length() && s.length() <= top) );
|
||||
}
|
||||
|
||||
public static OptionalInt reduce(IntBinaryOperator op) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String function(Supplier<String> supplier) {
|
||||
return supplier.get();
|
||||
}
|
||||
|
||||
public static int localMax(int first, int second) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
package unit.classes;
|
||||
|
||||
public class TestClassLoop {
|
||||
|
||||
public static void testSimpleInfinite() {
|
||||
|
||||
while(true) {
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void testFinally() {
|
||||
|
||||
boolean a = (Math.random() > 0);
|
||||
|
||||
while(true) {
|
||||
try {
|
||||
if(!a) {
|
||||
return;
|
||||
}
|
||||
} finally {
|
||||
System.out.println("1");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void testFinallyContinue() {
|
||||
|
||||
boolean a = (Math.random() > 0);
|
||||
|
||||
for(;;) {
|
||||
try {
|
||||
System.out.println("1");
|
||||
} finally {
|
||||
if(a) {
|
||||
System.out.println("3");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("4");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package unit.classes;
|
||||
|
||||
public class TestClassSwitch {
|
||||
|
||||
public void testCaseOrder(int a) {
|
||||
|
||||
switch(a) {
|
||||
case 13:
|
||||
System.out.println(13);
|
||||
return;
|
||||
case 5:
|
||||
System.out.println(5);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
package unit.classes;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class TestClassTypes {
|
||||
|
||||
public void testBoolean() {
|
||||
|
||||
byte var7 = 0;
|
||||
long time = System.currentTimeMillis();
|
||||
|
||||
if(time % 2 > 0) {
|
||||
var7 = 1;
|
||||
} else if(time % 3 > 0) {
|
||||
var7 = 2;
|
||||
}
|
||||
|
||||
if(var7 == 1) {
|
||||
System.out.println();
|
||||
}
|
||||
}
|
||||
|
||||
public boolean testBit(int var0) {
|
||||
return (var0 & 1) == 1;
|
||||
}
|
||||
|
||||
public void testSwitchConsts(int a) {
|
||||
|
||||
switch (a) {
|
||||
case 88:
|
||||
System.out.println("1");
|
||||
break;
|
||||
case 656:
|
||||
System.out.println("2");
|
||||
break;
|
||||
case 65201:
|
||||
case 65489:
|
||||
System.out.println("3");
|
||||
}
|
||||
}
|
||||
|
||||
public void testAssignmentType(List list) {
|
||||
|
||||
List a = list;
|
||||
|
||||
if(a != null) {
|
||||
(a = new ArrayList(a)).add("23");
|
||||
}
|
||||
|
||||
System.out.println(a.size());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
package unit.classes;
|
||||
|
||||
|
||||
public class TestClassVar {
|
||||
|
||||
private boolean field_boolean = (Math.random() > 0);
|
||||
public int field_int = 0;
|
||||
|
||||
public void testFieldSSAU() {
|
||||
|
||||
for(int i = 0; i < 10; i++) {
|
||||
|
||||
try {
|
||||
System.out.println();
|
||||
} finally {
|
||||
if (field_boolean) {
|
||||
System.out.println();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public Long testFieldSSAU1() { // IDEA-127466
|
||||
return new Long(field_int++);
|
||||
}
|
||||
|
||||
public void testComplexPropagation() {
|
||||
|
||||
int a = 0;
|
||||
|
||||
while (a < 10) {
|
||||
|
||||
int b = a;
|
||||
|
||||
for(; a < 10 && a == 0; a++) {}
|
||||
|
||||
if (b != a) {
|
||||
System.out.println();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
package unit.classes;
|
||||
|
||||
|
||||
public class TestClassFields {
|
||||
|
||||
private static int[] sizes;
|
||||
private static String[] names = new String[]{"name1", "name2"};
|
||||
|
||||
|
||||
static {
|
||||
sizes = new int[names.length];
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,75 +0,0 @@
|
||||
package unit.classes;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.OptionalInt;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.IntBinaryOperator;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class TestClassLambda {
|
||||
|
||||
public int field = 0;
|
||||
|
||||
|
||||
public void testLambda() {
|
||||
List var1 = Arrays.asList(new Integer[]{Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3), Integer.valueOf(4), Integer.valueOf(5), Integer.valueOf(6), Integer.valueOf(7)});
|
||||
int var2 = (int)Math.random();
|
||||
var1.forEach((var2x) -> {
|
||||
int var3 = 2 * var2x.intValue();
|
||||
System.out.println(var3 + var2 + this.field);
|
||||
});
|
||||
}
|
||||
|
||||
public void testLambda1() {
|
||||
int var1 = (int)Math.random();
|
||||
Runnable var2 = () -> {
|
||||
System.out.println("hello" + var1);
|
||||
};
|
||||
Runnable var3 = () -> {
|
||||
System.out.println("hello1" + var1);
|
||||
};
|
||||
}
|
||||
|
||||
public void testLambda2() {
|
||||
reduce((var0, var1) -> {
|
||||
return Math.max(var0, var1);
|
||||
});
|
||||
}
|
||||
|
||||
public void testLambda3() {
|
||||
reduce(Math::max);
|
||||
}
|
||||
|
||||
public void testLambda4() {
|
||||
reduce(TestClassLambda::localMax);
|
||||
}
|
||||
|
||||
public void testLambda5() {
|
||||
String var1 = "abcd";
|
||||
function(var1::toString);
|
||||
}
|
||||
|
||||
public void testLambda6() {
|
||||
ArrayList var1 = new ArrayList();
|
||||
int var2 = var1.size() * 2;
|
||||
int var3 = var1.size() * 5;
|
||||
var1.removeIf((var2x) -> {
|
||||
return var2 >= var2x.length() && var2x.length() <= var3;
|
||||
});
|
||||
}
|
||||
|
||||
public static OptionalInt reduce(IntBinaryOperator var0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String function(Supplier var0) {
|
||||
return (String)var0.get();
|
||||
}
|
||||
|
||||
public static int localMax(int var0, int var1) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
package unit.classes;
|
||||
|
||||
|
||||
public class TestClassLoop {
|
||||
|
||||
public static void testSimpleInfinite() {
|
||||
while(true) {
|
||||
System.out.println();
|
||||
}
|
||||
}
|
||||
|
||||
public static void testFinally() {
|
||||
boolean var0 = Math.random() > 0.0D;
|
||||
|
||||
while(true) {
|
||||
try {
|
||||
if(!var0) {
|
||||
return;
|
||||
}
|
||||
} finally {
|
||||
System.out.println("1");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void testFinallyContinue() {
|
||||
boolean var0 = Math.random() > 0.0D;
|
||||
|
||||
while(true) {
|
||||
while(true) {
|
||||
try {
|
||||
System.out.println("1");
|
||||
break;
|
||||
} finally {
|
||||
if(var0) {
|
||||
System.out.println("3");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("4");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package unit.classes;
|
||||
|
||||
|
||||
public class TestClassSwitch {
|
||||
|
||||
public void testCaseOrder(int var1) {
|
||||
switch(var1) {
|
||||
case 5:
|
||||
System.out.println(5);
|
||||
default:
|
||||
return;
|
||||
case 13:
|
||||
System.out.println(13);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
package unit.classes;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class TestClassTypes {
|
||||
|
||||
public void testBoolean() {
|
||||
byte var1 = 0;
|
||||
long var2 = System.currentTimeMillis();
|
||||
if(var2 % 2L > 0L) {
|
||||
var1 = 1;
|
||||
} else if(var2 % 3L > 0L) {
|
||||
var1 = 2;
|
||||
}
|
||||
|
||||
if(var1 == 1) {
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public boolean testBit(int var1) {
|
||||
return (var1 & 1) == 1;
|
||||
}
|
||||
|
||||
public void testSwitchConsts(int var1) {
|
||||
switch(var1) {
|
||||
case 88:
|
||||
System.out.println("1");
|
||||
break;
|
||||
case 656:
|
||||
System.out.println("2");
|
||||
break;
|
||||
case 65201:
|
||||
case 65489:
|
||||
System.out.println("3");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void testAssignmentType(List var1) {
|
||||
Object var2 = var1;
|
||||
if(var1 != null) {
|
||||
((List)(var2 = new ArrayList(var1))).add("23");
|
||||
}
|
||||
|
||||
System.out.println(((List)var2).size());
|
||||
}
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
package unit.classes;
|
||||
|
||||
|
||||
public class TestClassVar {
|
||||
|
||||
private boolean field_boolean = Math.random() > 0.0D;
|
||||
public int field_int = 0;
|
||||
|
||||
|
||||
public void testFieldSSAU() {
|
||||
for(int var1 = 0; var1 < 10; ++var1) {
|
||||
try {
|
||||
System.out.println();
|
||||
} finally {
|
||||
if(this.field_boolean) {
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public Long testFieldSSAU1() {
|
||||
return new Long((long)(this.field_int++));
|
||||
}
|
||||
|
||||
public void testComplexPropagation() {
|
||||
int var1 = 0;
|
||||
|
||||
while(var1 < 10) {
|
||||
int var2;
|
||||
for(var2 = var1; var1 < 10 && var1 == 0; ++var1) {
|
||||
;
|
||||
}
|
||||
|
||||
if(var2 != var1) {
|
||||
System.out.println();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user