Cleanup (java decompiler test optimization)

master
Roman Shevchenko 9 years ago
parent 1794156473
commit a725e5b7b6
  1. 29
      test/org/jetbrains/java/decompiler/DecompilerTestFixture.java
  2. 79
      test/org/jetbrains/java/decompiler/SingleClassesTest.java
  3. 97
      test/org/jetbrains/java/decompiler/SingleClassesTestBase.java

@ -22,10 +22,10 @@ import org.jetbrains.java.decompiler.util.InterpreterUtil;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
@ -35,11 +35,9 @@ public class DecompilerTestFixture {
private File targetDir; private File targetDir;
private ConsoleDecompiler decompiler; private ConsoleDecompiler decompiler;
public void setUp() throws IOException { public void setUp(String... optionPairs) throws IOException {
setUp(Collections.<String, Object>emptyMap()); assertEquals(0, optionPairs.length % 2);
}
public void setUp(final Map<String, Object> options) throws IOException {
testDataDir = new File("testData"); testDataDir = new File("testData");
if (!isTestDataDir(testDataDir)) testDataDir = new File("community/plugins/java-decompiler/engine/testData"); if (!isTestDataDir(testDataDir)) testDataDir = new File("community/plugins/java-decompiler/engine/testData");
if (!isTestDataDir(testDataDir)) testDataDir = new File("plugins/java-decompiler/engine/testData"); if (!isTestDataDir(testDataDir)) testDataDir = new File("plugins/java-decompiler/engine/testData");
@ -54,15 +52,18 @@ public class DecompilerTestFixture {
targetDir = new File(tempDir, "decompiled"); targetDir = new File(tempDir, "decompiled");
assertTrue(targetDir.mkdirs()); assertTrue(targetDir.mkdirs());
decompiler = new ConsoleDecompiler(this.targetDir, new HashMap<String, Object>() {{
put(IFernflowerPreferences.LOG_LEVEL, "warn"); Map<String, Object> options = new HashMap<String, Object>();
put(IFernflowerPreferences.DECOMPILE_GENERIC_SIGNATURES, "1"); options.put(IFernflowerPreferences.LOG_LEVEL, "warn");
put(IFernflowerPreferences.REMOVE_SYNTHETIC, "1"); options.put(IFernflowerPreferences.DECOMPILE_GENERIC_SIGNATURES, "1");
put(IFernflowerPreferences.REMOVE_BRIDGE, "1"); options.put(IFernflowerPreferences.REMOVE_SYNTHETIC, "1");
put(IFernflowerPreferences.LITERALS_AS_IS, "1"); options.put(IFernflowerPreferences.REMOVE_BRIDGE, "1");
put(IFernflowerPreferences.UNIT_TEST_MODE, "1"); options.put(IFernflowerPreferences.LITERALS_AS_IS, "1");
putAll(options); options.put(IFernflowerPreferences.UNIT_TEST_MODE, "1");
}}); for (int i = 0; i < optionPairs.length; i += 2) {
options.put(optionPairs[i], optionPairs[i + 1]);
}
decompiler = new ConsoleDecompiler(targetDir, options);
} }
public void tearDown() { public void tearDown() {

@ -15,19 +15,34 @@
*/ */
package org.jetbrains.java.decompiler; package org.jetbrains.java.decompiler;
import org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler;
import org.jetbrains.java.decompiler.main.extern.IFernflowerPreferences; import org.jetbrains.java.decompiler.main.extern.IFernflowerPreferences;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import java.util.HashMap; import java.io.File;
import java.util.Map; import java.io.FilenameFilter;
import java.io.IOException;
import java.util.*;
public class SingleClassesTest extends SingleClassesTestBase { import static org.jetbrains.java.decompiler.DecompilerTestFixture.assertFilesEqual;
@Override import static org.junit.Assert.assertTrue;
protected Map<String, Object> getDecompilerOptions() {
return new HashMap<String, Object>() {{ public class SingleClassesTest {
put(IFernflowerPreferences.BYTECODE_SOURCE_MAPPING, "1"); private DecompilerTestFixture fixture;
put(IFernflowerPreferences.DUMP_ORIGINAL_LINES, "1");
}}; @Before
public void setUp() throws IOException {
fixture = new DecompilerTestFixture();
fixture.setUp(IFernflowerPreferences.BYTECODE_SOURCE_MAPPING, "1",
IFernflowerPreferences.DUMP_ORIGINAL_LINES, "1");
}
@After
public void tearDown() {
fixture.tearDown();
fixture = null;
} }
@Test public void testClassFields() { doTest("pkg/TestClassFields"); } @Test public void testClassFields() { doTest("pkg/TestClassFields"); }
@ -62,4 +77,50 @@ public class SingleClassesTest extends SingleClassesTestBase {
@Test public void testInnerSignature() { doTest("pkg/TestInnerSignature"); } @Test public void testInnerSignature() { doTest("pkg/TestInnerSignature"); }
@Test public void testParameterizedTypes() { doTest("pkg/TestParameterizedTypes"); } @Test public void testParameterizedTypes() { doTest("pkg/TestParameterizedTypes"); }
@Test public void testShadowing() { doTest("pkg/TestShadowing", "pkg/Shadow", "ext/Shadow"); } @Test public void testShadowing() { doTest("pkg/TestShadowing", "pkg/Shadow", "ext/Shadow"); }
protected void doTest(String testFile, String... companionFiles) {
ConsoleDecompiler decompiler = fixture.getDecompiler();
File classFile = new File(fixture.getTestDataDir(), "/classes/" + testFile + ".class");
assertTrue(classFile.isFile());
for (File file : collectClasses(classFile)) {
decompiler.addSpace(file, true);
}
for (String companionFile : companionFiles) {
File companionClassFile = new File(fixture.getTestDataDir(), "/classes/" + companionFile + ".class");
assertTrue(companionClassFile.isFile());
for (File file : collectClasses(companionClassFile)) {
decompiler.addSpace(file, true);
}
}
decompiler.decompileContext();
String testName = classFile.getName().substring(0, classFile.getName().length() - 6);
File decompiledFile = new File(fixture.getTargetDir(), testName + ".java");
assertTrue(decompiledFile.isFile());
File referenceFile = new File(fixture.getTestDataDir(), "results/" + testName + ".dec");
assertTrue(referenceFile.isFile());
assertFilesEqual(referenceFile, decompiledFile);
}
private static List<File> collectClasses(File classFile) {
List<File> files = new ArrayList<File>();
files.add(classFile);
File parent = classFile.getParentFile();
if (parent != null) {
final String pattern = classFile.getName().replace(".class", "") + "\\$.+\\.class";
File[] inner = parent.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.matches(pattern);
}
});
if (inner != null) Collections.addAll(files, inner);
}
return files;
}
} }

@ -1,97 +0,0 @@
/*
* Copyright 2000-2015 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.junit.After;
import org.junit.Before;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static org.jetbrains.java.decompiler.DecompilerTestFixture.assertFilesEqual;
import static org.junit.Assert.assertTrue;
public abstract class SingleClassesTestBase {
private DecompilerTestFixture fixture;
@Before
public void setUp() throws IOException {
fixture = new DecompilerTestFixture();
fixture.setUp(getDecompilerOptions());
}
@After
public void tearDown() {
fixture.tearDown();
fixture = null;
}
protected Map<String, Object> getDecompilerOptions() {
return Collections.emptyMap();
}
protected void doTest(String testFile, String... companionFiles) {
ConsoleDecompiler decompiler = fixture.getDecompiler();
File classFile = new File(fixture.getTestDataDir(), "/classes/" + testFile + ".class");
assertTrue(classFile.isFile());
for (File file : collectClasses(classFile)) {
decompiler.addSpace(file, true);
}
for (String companionFile : companionFiles) {
File companionClassFile = new File(fixture.getTestDataDir(), "/classes/" + companionFile + ".class");
assertTrue(companionClassFile.isFile());
for (File file : collectClasses(companionClassFile)) {
decompiler.addSpace(file, true);
}
}
decompiler.decompileContext();
String testName = classFile.getName().substring(0, classFile.getName().length() - 6);
File decompiledFile = new File(fixture.getTargetDir(), testName + ".java");
assertTrue(decompiledFile.isFile());
File referenceFile = new File(fixture.getTestDataDir(), "results/" + testName + ".dec");
assertTrue(referenceFile.isFile());
assertFilesEqual(referenceFile, decompiledFile);
}
private static List<File> collectClasses(File classFile) {
List<File> files = new ArrayList<File>();
files.add(classFile);
File parent = classFile.getParentFile();
if (parent != null) {
final String pattern = classFile.getName().replace(".class", "") + "\\$.+\\.class";
File[] inner = parent.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.matches(pattern);
}
});
if (inner != null) Collections.addAll(files, inner);
}
return files;
}
}
Loading…
Cancel
Save