From ce2169f372db942afe566d0dde39688affe171f9 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 9 Oct 2014 18:34:08 +0200 Subject: [PATCH] java-decompiler: base class extracted to allow decompiler customization in tests --- .../decompiler/DecompilerTestFixture.java | 10 +- .../java/decompiler/SingleClassesTest.java | 84 +------------- .../decompiler/SingleClassesTestBase.java | 103 ++++++++++++++++++ 3 files changed, 113 insertions(+), 84 deletions(-) create mode 100644 test/org/jetbrains/java/decompiler/SingleClassesTestBase.java diff --git a/test/org/jetbrains/java/decompiler/DecompilerTestFixture.java b/test/org/jetbrains/java/decompiler/DecompilerTestFixture.java index 540c998..9508c61 100644 --- a/test/org/jetbrains/java/decompiler/DecompilerTestFixture.java +++ b/test/org/jetbrains/java/decompiler/DecompilerTestFixture.java @@ -18,8 +18,11 @@ package org.jetbrains.java.decompiler; import org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler; import org.jetbrains.java.decompiler.main.extern.IFernflowerPreferences; -import java.io.*; +import java.io.File; +import java.io.IOException; +import java.util.Collections; import java.util.HashMap; +import java.util.Map; import static org.junit.Assert.assertTrue; @@ -30,6 +33,10 @@ public class DecompilerTestFixture { private ConsoleDecompiler decompiler; public void setUp() throws IOException { + setUp(Collections.emptyMap()); + } + + public void setUp(final Map options) throws IOException { 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"); @@ -49,6 +56,7 @@ public class DecompilerTestFixture { put(IFernflowerPreferences.REMOVE_SYNTHETIC, "1"); put(IFernflowerPreferences.REMOVE_BRIDGE, "1"); put(IFernflowerPreferences.LITERALS_AS_IS, "1"); + putAll(options); }}); } diff --git a/test/org/jetbrains/java/decompiler/SingleClassesTest.java b/test/org/jetbrains/java/decompiler/SingleClassesTest.java index 2443c64..73af499 100644 --- a/test/org/jetbrains/java/decompiler/SingleClassesTest.java +++ b/test/org/jetbrains/java/decompiler/SingleClassesTest.java @@ -15,35 +15,9 @@ */ package org.jetbrains.java.decompiler; -import org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler; -import org.jetbrains.java.decompiler.util.InterpreterUtil; -import org.junit.After; -import org.junit.Before; import org.junit.Test; -import java.io.*; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -public class SingleClassesTest { - private DecompilerTestFixture fixture; - - @Before - public void setUp() throws IOException { - fixture = new DecompilerTestFixture(); - fixture.setUp(); - } - - @After - public void tearDown() { - fixture.tearDown(); - fixture = null; - } - +public class SingleClassesTest extends SingleClassesTestBase { @Test public void testClassFields() { doTest("pkg/TestClassFields"); } @Test public void testClassLambda() { doTest("pkg/TestClassLambda"); } @Test public void testClassLoop() { doTest("pkg/TestClassLoop"); } @@ -60,60 +34,4 @@ public class SingleClassesTest { @Test public void testEnum() { doTest("pkg/TestEnum"); } @Test public void testDebugSymbols() { doTest("pkg/TestDebugSymbols"); } @Test public void testInvalidMethodSignature() { doTest("InvalidMethodSignature"); } - - private void doTest(String testFile) { - try { - File classFile = new File(fixture.getTestDataDir(), "/classes/" + testFile + ".class"); - assertTrue(classFile.isFile()); - String testName = classFile.getName().replace(".class", ""); - - ConsoleDecompiler decompiler = fixture.getDecompiler(); - for (File file : collectClasses(classFile)) { - decompiler.addSpace(file, true); - } - - decompiler.decompileContext(); - - File decompiledFile = new File(fixture.getTargetDir(), testName + ".java"); - assertTrue(decompiledFile.isFile()); - - File referenceFile = new File(fixture.getTestDataDir(), "results/" + testName + ".dec"); - assertTrue(referenceFile.isFile()); - - compareContent(decompiledFile, referenceFile); - } - catch (Exception e) { - throw new RuntimeException(e); - } - } - - private static List collectClasses(File classFile) { - List files = new ArrayList(); - 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; - } - - private static void compareContent(File decompiledFile, File referenceFile) throws IOException { - String decompiledContent = new String(InterpreterUtil.getBytes(decompiledFile), "UTF-8"); - - String referenceContent = new String(InterpreterUtil.getBytes(referenceFile), "UTF-8"); - if (InterpreterUtil.IS_WINDOWS && !referenceContent.contains("\r\n")) { - referenceContent = referenceContent.replace("\n", "\r\n"); // fix for broken Git checkout on Windows - } - - assertEquals(referenceContent, decompiledContent); - } } diff --git a/test/org/jetbrains/java/decompiler/SingleClassesTestBase.java b/test/org/jetbrains/java/decompiler/SingleClassesTestBase.java new file mode 100644 index 0000000..985fc95 --- /dev/null +++ b/test/org/jetbrains/java/decompiler/SingleClassesTestBase.java @@ -0,0 +1,103 @@ +/* + * 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.util.InterpreterUtil; +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.junit.Assert.assertEquals; +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 getDecompilerOptions() { + return Collections.emptyMap(); + } + + protected void doTest(String testFile) { + try { + File classFile = new File(fixture.getTestDataDir(), "/classes/" + testFile + ".class"); + assertTrue(classFile.isFile()); + String testName = classFile.getName().substring(0, classFile.getName().length() - 6); + + ConsoleDecompiler decompiler = fixture.getDecompiler(); + for (File file : collectClasses(classFile)) decompiler.addSpace(file, true); + decompiler.decompileContext(); + + File decompiledFile = new File(fixture.getTargetDir(), testName + ".java"); + assertTrue(decompiledFile.isFile()); + File referenceFile = new File(fixture.getTestDataDir(), "results/" + testName + ".dec"); + assertTrue(referenceFile.isFile()); + compareContent(decompiledFile, referenceFile); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static List collectClasses(File classFile) { + List files = new ArrayList(); + 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; + } + + private static void compareContent(File decompiledFile, File referenceFile) throws IOException { + String decompiledContent = new String(InterpreterUtil.getBytes(decompiledFile), "UTF-8"); + + String referenceContent = new String(InterpreterUtil.getBytes(referenceFile), "UTF-8"); + if (InterpreterUtil.IS_WINDOWS && !referenceContent.contains("\r\n")) { + referenceContent = referenceContent.replace("\n", "\r\n"); // fix for broken Git checkout on Windows + } + + assertEquals(referenceContent, decompiledContent); + } +}