summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build.xml24
-rw-r--r--src/org/jetbrains/java/decompiler/main/decompiler/ConsoleDecompiler.java7
-rw-r--r--test/org/jetbrains/java/decompiler/SingleClassesTest.java124
-rw-r--r--test/unit/TestSingleClasses.java95
-rw-r--r--test/unit/classes/TestClassFields.java13
-rw-r--r--test/unit/classes/TestClassSwitch.java16
-rw-r--r--testData/classes/pkg/TestClassFields.classbin0 -> 415 bytes
-rw-r--r--testData/classes/pkg/TestClassLambda.classbin0 -> 3714 bytes
-rw-r--r--testData/classes/pkg/TestClassLoop.classbin0 -> 880 bytes
-rw-r--r--testData/classes/pkg/TestClassSwitch.classbin0 -> 464 bytes
-rw-r--r--testData/classes/pkg/TestClassTypes.classbin0 -> 1151 bytes
-rw-r--r--testData/classes/pkg/TestClassVar.classbin0 -> 992 bytes
-rw-r--r--testData/results/TestClassFields.dec (renamed from test/unit/results/TestClassFields.dec)3
-rw-r--r--testData/results/TestClassLambda.dec (renamed from test/unit/results/TestClassLambda.dec)2
-rw-r--r--testData/results/TestClassLoop.dec (renamed from test/unit/results/TestClassLoop.dec)2
-rw-r--r--testData/results/TestClassSwitch.dec (renamed from test/unit/results/TestClassSwitch.dec)2
-rw-r--r--testData/results/TestClassTypes.dec (renamed from test/unit/results/TestClassTypes.dec)2
-rw-r--r--testData/results/TestClassVar.dec (renamed from test/unit/results/TestClassVar.dec)2
-rw-r--r--testData/src/pkg/TestClassFields.java28
-rw-r--r--testData/src/pkg/TestClassLambda.java (renamed from test/unit/classes/TestClassLambda.java)17
-rw-r--r--testData/src/pkg/TestClassLoop.java (renamed from test/unit/classes/TestClassLoop.java)17
-rw-r--r--testData/src/pkg/TestClassSwitch.java31
-rw-r--r--testData/src/pkg/TestClassTypes.java (renamed from test/unit/classes/TestClassTypes.java)17
-rw-r--r--testData/src/pkg/TestClassVar.java (renamed from test/unit/classes/TestClassVar.java)17
24 files changed, 282 insertions, 137 deletions
diff --git a/build.xml b/build.xml
index 1c1a5f0..24d18f0 100644
--- a/build.xml
+++ b/build.xml
@@ -3,13 +3,19 @@
<target name="init">
<property name="src" value="${basedir}/src"/>
- <property name="out" value="${basedir}/out"/>
+ <property name="out" value="${basedir}/out/production"/>
<property name="dist" value="${basedir}/fernflower.jar"/>
+ <property name="test-src" value="${basedir}/test"/>
+ <property name="test-out" value="${basedir}/out/test"/>
+ <!-- external dependencies, adjust to your own -->
+ <property name="junit" value="${basedir}/../../../lib/junit-4.11.jar"/>
+ <property name="hamcrest" value="${basedir}/../../../lib/hamcrest-core-1.3.jar"/>
</target>
<target name="clean" depends="init">
<delete includeemptydirs="true" failonerror="false">
<fileset dir="${out}"/>
+ <fileset dir="${test-out}"/>
<fileset file="${dist}"/>
</delete>
</target>
@@ -27,4 +33,20 @@
</jar>
</target>
+ <target name="test-compile" depends="init,compile">
+ <mkdir dir="${test-out}"/>
+ <javac srcdir="${test-src}" destdir="${test-out}" source="1.6" target="1.6" encoding="UTF-8" debug="true" includeantruntime="false">
+ <classpath path="${out}:${junit}:${hamcrest}"/>
+ </javac>
+ </target>
+
+ <target name="test" depends="init,test-compile">
+ <junit printsummary="true" haltonfailure="true">
+ <classpath path="${test-out}:${out}:${junit}:${hamcrest}"/>
+ <batchtest>
+ <fileset dir="${test-src}" includes="**/*Test.java"/>
+ </batchtest>
+ </junit>
+ </target>
+
</project>
diff --git a/src/org/jetbrains/java/decompiler/main/decompiler/ConsoleDecompiler.java b/src/org/jetbrains/java/decompiler/main/decompiler/ConsoleDecompiler.java
index 50a55cf..28bb4ee 100644
--- a/src/org/jetbrains/java/decompiler/main/decompiler/ConsoleDecompiler.java
+++ b/src/org/jetbrains/java/decompiler/main/decompiler/ConsoleDecompiler.java
@@ -133,7 +133,12 @@ public class ConsoleDecompiler implements IBytecodeProvider, IDecompilatSaver {
public void decompileContext(File root) {
this.root = root;
- fernflower.decompileContext();
+ try {
+ fernflower.decompileContext();
+ }
+ finally {
+ fernflower.clearContext();
+ }
}
// *******************************************************************
diff --git a/test/org/jetbrains/java/decompiler/SingleClassesTest.java b/test/org/jetbrains/java/decompiler/SingleClassesTest.java
new file mode 100644
index 0000000..1e37d97
--- /dev/null
+++ b/test/org/jetbrains/java/decompiler/SingleClassesTest.java
@@ -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());
+ }
+ }
+}
diff --git a/test/unit/TestSingleClasses.java b/test/unit/TestSingleClasses.java
deleted file mode 100644
index 754fcec..0000000
--- a/test/unit/TestSingleClasses.java
+++ /dev/null
@@ -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();
- }
-
- }
-
-}
diff --git a/test/unit/classes/TestClassFields.java b/test/unit/classes/TestClassFields.java
deleted file mode 100644
index 8ae7449..0000000
--- a/test/unit/classes/TestClassFields.java
+++ /dev/null
@@ -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];
- }
-}
diff --git a/test/unit/classes/TestClassSwitch.java b/test/unit/classes/TestClassSwitch.java
deleted file mode 100644
index 3e29d5e..0000000
--- a/test/unit/classes/TestClassSwitch.java
+++ /dev/null
@@ -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);
- }
- }
-
-}
diff --git a/testData/classes/pkg/TestClassFields.class b/testData/classes/pkg/TestClassFields.class
new file mode 100644
index 0000000..c1c0c6b
--- /dev/null
+++ b/testData/classes/pkg/TestClassFields.class
Binary files differ
diff --git a/testData/classes/pkg/TestClassLambda.class b/testData/classes/pkg/TestClassLambda.class
new file mode 100644
index 0000000..cbb9448
--- /dev/null
+++ b/testData/classes/pkg/TestClassLambda.class
Binary files differ
diff --git a/testData/classes/pkg/TestClassLoop.class b/testData/classes/pkg/TestClassLoop.class
new file mode 100644
index 0000000..d363692
--- /dev/null
+++ b/testData/classes/pkg/TestClassLoop.class
Binary files differ
diff --git a/testData/classes/pkg/TestClassSwitch.class b/testData/classes/pkg/TestClassSwitch.class
new file mode 100644
index 0000000..2fd6b52
--- /dev/null
+++ b/testData/classes/pkg/TestClassSwitch.class
Binary files differ
diff --git a/testData/classes/pkg/TestClassTypes.class b/testData/classes/pkg/TestClassTypes.class
new file mode 100644
index 0000000..45288ca
--- /dev/null
+++ b/testData/classes/pkg/TestClassTypes.class
Binary files differ
diff --git a/testData/classes/pkg/TestClassVar.class b/testData/classes/pkg/TestClassVar.class
new file mode 100644
index 0000000..d66170c
--- /dev/null
+++ b/testData/classes/pkg/TestClassVar.class
Binary files differ
diff --git a/test/unit/results/TestClassFields.dec b/testData/results/TestClassFields.dec
index 85aea77..2a20fb8 100644
--- a/test/unit/results/TestClassFields.dec
+++ b/testData/results/TestClassFields.dec
@@ -1,4 +1,4 @@
-package unit.classes;
+package pkg;
public class TestClassFields {
@@ -10,5 +10,4 @@ public class TestClassFields {
static {
sizes = new int[names.length];
}
-
}
diff --git a/test/unit/results/TestClassLambda.dec b/testData/results/TestClassLambda.dec
index 6ff82d8..baf2cd7 100644
--- a/test/unit/results/TestClassLambda.dec
+++ b/testData/results/TestClassLambda.dec
@@ -1,4 +1,4 @@
-package unit.classes;
+package pkg;
import java.util.ArrayList;
import java.util.Arrays;
diff --git a/test/unit/results/TestClassLoop.dec b/testData/results/TestClassLoop.dec
index a931148..b231ae0 100644
--- a/test/unit/results/TestClassLoop.dec
+++ b/testData/results/TestClassLoop.dec
@@ -1,4 +1,4 @@
-package unit.classes;
+package pkg;
public class TestClassLoop {
diff --git a/test/unit/results/TestClassSwitch.dec b/testData/results/TestClassSwitch.dec
index 386a341..496dd15 100644
--- a/test/unit/results/TestClassSwitch.dec
+++ b/testData/results/TestClassSwitch.dec
@@ -1,4 +1,4 @@
-package unit.classes;
+package pkg;
public class TestClassSwitch {
diff --git a/test/unit/results/TestClassTypes.dec b/testData/results/TestClassTypes.dec
index 0bda616..2c856b1 100644
--- a/test/unit/results/TestClassTypes.dec
+++ b/testData/results/TestClassTypes.dec
@@ -1,4 +1,4 @@
-package unit.classes;
+package pkg;
import java.util.ArrayList;
import java.util.List;
diff --git a/test/unit/results/TestClassVar.dec b/testData/results/TestClassVar.dec
index cca4d7a..ceb3a4d 100644
--- a/test/unit/results/TestClassVar.dec
+++ b/testData/results/TestClassVar.dec
@@ -1,4 +1,4 @@
-package unit.classes;
+package pkg;
public class TestClassVar {
diff --git a/testData/src/pkg/TestClassFields.java b/testData/src/pkg/TestClassFields.java
new file mode 100644
index 0000000..347b687
--- /dev/null
+++ b/testData/src/pkg/TestClassFields.java
@@ -0,0 +1,28 @@
+/*
+ * 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 pkg;
+
+public class TestClassFields {
+
+ private static int[] sizes;
+ private static String[] names;
+
+ static {
+
+ names = new String[]{"name1", "name2"};
+ sizes = new int[names.length];
+ }
+}
diff --git a/test/unit/classes/TestClassLambda.java b/testData/src/pkg/TestClassLambda.java
index a2b9d9a..d3fc7f6 100644
--- a/test/unit/classes/TestClassLambda.java
+++ b/testData/src/pkg/TestClassLambda.java
@@ -1,4 +1,19 @@
-package unit.classes;
+/*
+ * 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 pkg;
import java.util.ArrayList;
import java.util.Arrays;
diff --git a/test/unit/classes/TestClassLoop.java b/testData/src/pkg/TestClassLoop.java
index 5288cf6..25964d9 100644
--- a/test/unit/classes/TestClassLoop.java
+++ b/testData/src/pkg/TestClassLoop.java
@@ -1,4 +1,19 @@
-package unit.classes;
+/*
+ * 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 pkg;
public class TestClassLoop {
diff --git a/testData/src/pkg/TestClassSwitch.java b/testData/src/pkg/TestClassSwitch.java
new file mode 100644
index 0000000..aa49bb1
--- /dev/null
+++ b/testData/src/pkg/TestClassSwitch.java
@@ -0,0 +1,31 @@
+/*
+ * 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 pkg;
+
+public class TestClassSwitch {
+
+ public void testCaseOrder(int a) {
+
+ switch(a) {
+ case 13:
+ System.out.println(13);
+ return;
+ case 5:
+ System.out.println(5);
+ }
+ }
+
+}
diff --git a/test/unit/classes/TestClassTypes.java b/testData/src/pkg/TestClassTypes.java
index a8a5116..70e23c3 100644
--- a/test/unit/classes/TestClassTypes.java
+++ b/testData/src/pkg/TestClassTypes.java
@@ -1,4 +1,19 @@
-package unit.classes;
+/*
+ * 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 pkg;
import java.util.ArrayList;
import java.util.List;
diff --git a/test/unit/classes/TestClassVar.java b/testData/src/pkg/TestClassVar.java
index fdba5c6..9f8fcac 100644
--- a/test/unit/classes/TestClassVar.java
+++ b/testData/src/pkg/TestClassVar.java
@@ -1,4 +1,19 @@
-package unit.classes;
+/*
+ * 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 pkg;
public class TestClassVar {