java-decompiler: base class extracted to allow decompiler customization in tests
authorRoman Shevchenko <roman.shevchenko@jetbrains.com>
Thu, 9 Oct 2014 16:34:08 +0000 (18:34 +0200)
committerRoman Shevchenko <roman.shevchenko@jetbrains.com>
Thu, 9 Oct 2014 16:34:08 +0000 (18:34 +0200)
plugins/java-decompiler/engine/test/org/jetbrains/java/decompiler/DecompilerTestFixture.java
plugins/java-decompiler/engine/test/org/jetbrains/java/decompiler/SingleClassesTest.java
plugins/java-decompiler/engine/test/org/jetbrains/java/decompiler/SingleClassesTestBase.java [new file with mode: 0644]

index 540c998dd16ddfc3add0e53e6172f12fbe51000f..9508c611922747c80c683a870797cc7432e2b37a 100644 (file)
@@ -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.<String, Object>emptyMap());
+  }
+
+  public void setUp(final Map<String, Object> 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);
     }});
   }
 
index 2443c64c38b79c574853b63ae77af374a91f4135..73af499e39c1b0cc87df1f2419d4c660989a0e20 100644 (file)
  */
 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<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;
-  }
-
-  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/plugins/java-decompiler/engine/test/org/jetbrains/java/decompiler/SingleClassesTestBase.java b/plugins/java-decompiler/engine/test/org/jetbrains/java/decompiler/SingleClassesTestBase.java
new file mode 100644 (file)
index 0000000..985fc95
--- /dev/null
@@ -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<String, Object> 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<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;
+  }
+
+  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);
+  }
+}