diff options
Diffstat (limited to 'javaparser-testing/src/test/java/com/github/javaparser/manual/BulkParseTest.java')
-rw-r--r-- | javaparser-testing/src/test/java/com/github/javaparser/manual/BulkParseTest.java | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/javaparser-testing/src/test/java/com/github/javaparser/manual/BulkParseTest.java b/javaparser-testing/src/test/java/com/github/javaparser/manual/BulkParseTest.java new file mode 100644 index 000000000..b09651f7d --- /dev/null +++ b/javaparser-testing/src/test/java/com/github/javaparser/manual/BulkParseTest.java @@ -0,0 +1,120 @@ +package com.github.javaparser.manual; + +import com.github.javaparser.ParserConfiguration; +import com.github.javaparser.Problem; +import com.github.javaparser.utils.CodeGenerationUtils; +import com.github.javaparser.utils.Log; +import com.github.javaparser.utils.SourceRoot; +import com.github.javaparser.utils.SourceZip; +import org.junit.Test; + +import java.io.BufferedWriter; +import java.io.IOException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import static com.github.javaparser.ParserConfiguration.LanguageLevel.JAVA_10; +import static com.github.javaparser.ParserConfiguration.LanguageLevel.JAVA_9; +import static com.github.javaparser.utils.CodeGenerationUtils.f; +import static com.github.javaparser.utils.SourceRoot.Callback.Result.DONT_SAVE; +import static com.github.javaparser.utils.TestUtils.download; +import static com.github.javaparser.utils.TestUtils.temporaryDirectory; +import static java.util.Comparator.comparing; + +public class BulkParseTest { + /** + * Running this will download a version of the OpenJDK, unzip it, and parse it. If it throws a stack overflow + * exception, increase the JVM's stack size. + */ + public static void main(String[] args) throws IOException { + Log.setAdapter(new Log.StandardOutStandardErrorAdapter()); + // This contains all kinds of test cases so it will lead to a lot of errors: + new BulkParseTest().parseOpenJdkLangToolsRepository(); + // This contains the JDK source code, so it should have zero errors: + new BulkParseTest().parseJdkSrcZip(); + } + + private void parseOpenJdkLangToolsRepository() throws IOException { + Path workdir = CodeGenerationUtils.mavenModuleRoot(BulkParseTest.class).resolve(Paths.get(temporaryDirectory(), "javaparser_bulkparsetest")); + workdir.toFile().mkdirs(); + Path openJdkZipPath = workdir.resolve("langtools.zip"); + if (Files.notExists(openJdkZipPath)) { + Log.info("Downloading JDK langtools"); + /* Found by choosing a tag here: http://hg.openjdk.java.net/jdk9/jdk9/langtools/tags + then copying the "zip" link to the line below: */ + download(new URL("http://hg.openjdk.java.net/jdk10/jdk10/langtools/archive/19293ea3999f.zip"), openJdkZipPath); + } + bulkTest(new SourceZip(openJdkZipPath), "openjdk_src_repo_test_results.txt", new ParserConfiguration().setLanguageLevel(JAVA_10)); + } + + private void parseJdkSrcZip() throws IOException { + // This is where Ubuntu stores the contents of package openjdk-8-src + Path path = Paths.get("/usr/lib/jvm/openjdk-9/src.zip"); + bulkTest(new SourceZip(path), "openjdk_src_zip_test_results.txt", new ParserConfiguration().setLanguageLevel(JAVA_9)); + } + + @Test + public void parseOwnSourceCode() throws IOException { + bulkTest( + new SourceRoot(CodeGenerationUtils.mavenModuleRoot(BulkParseTest.class).resolve("..")), + "javaparser_test_results.txt", + new ParserConfiguration().setLanguageLevel(JAVA_9)); + } + + public void bulkTest(SourceRoot sourceRoot, String testResultsFileName, ParserConfiguration configuration) throws IOException { + sourceRoot.setParserConfiguration(configuration); + TreeMap<Path, List<Problem>> results = new TreeMap<>(comparing(o -> o.toString().toLowerCase())); + sourceRoot.parseParallelized((localPath, absolutePath, result) -> { + if (!localPath.toString().contains("target")) { + if (!result.isSuccessful()) { + results.put(localPath, result.getProblems()); + } + } + return DONT_SAVE; + }); + writeResults(results, testResultsFileName); + } + + public void bulkTest(SourceZip sourceRoot, String testResultsFileName, ParserConfiguration configuration) throws IOException { + sourceRoot.setParserConfiguration(configuration); + TreeMap<Path, List<Problem>> results = new TreeMap<>(comparing(o -> o.toString().toLowerCase())); + sourceRoot.parse((path, result) -> { + if (!path.toString().contains("target")) { + if (!result.isSuccessful()) { + results.put(path, result.getProblems()); + } + } + }); + writeResults(results, testResultsFileName); + } + + private void writeResults(TreeMap<Path, List<Problem>> results, String testResultsFileName) throws IOException { + Log.info("Writing results..."); + + Path testResults = CodeGenerationUtils.mavenModuleRoot(BulkParseTest.class).resolve(Paths.get("..", "javaparser-testing", "src", "test", "resources", "com", "github", "javaparser", "bulk_test_results")).normalize(); + testResults.toFile().mkdirs(); + testResults = testResults.resolve(testResultsFileName); + + int problemTotal = 0; + try (BufferedWriter writer = Files.newBufferedWriter(testResults)) { + for (Map.Entry<Path, List<Problem>> file : results.entrySet()) { + writer.write(file.getKey().toString().replace("\\", "/")); + writer.newLine(); + for (Problem problem : file.getValue()) { + writer.write(problem.getVerboseMessage()); + writer.newLine(); + problemTotal++; + } + writer.newLine(); + } + writer.write(f("%s problems in %s files", problemTotal, results.size())); + } + + Log.info("Results are in %s", testResults); + } +}
\ No newline at end of file |