blob: a954156077265a8af4056e28445151aabbc31d89 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2019, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Red Hat Inc. - copied from ModuleCompilationTests and used for Javadoc
*******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.DirectoryNotEmptyException;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.jdt.core.tests.util.Util;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import junit.framework.AssertionFailedError;
import junit.framework.Test;
public class JavadocTestForModule extends AbstractBatchCompilerTest {
static {
// TESTS_NAMES = new String[] { "testBug549855a" };
// TESTS_NUMBERS = new int[] { 1 };
// TESTS_RANGE = new int[] { 298, -1 };
}
public JavadocTestForModule(String name) {
super(name);
}
public static Test suite() {
return buildMinimalComplianceTestSuite(testClass(), F_9);
}
public static Class<?> testClass() {
return JavadocTestForModule.class;
}
protected void writeFileCollecting(List<String> collectedFiles, String directoryName, String fileName, String source) {
writeFile(directoryName, fileName, source);
collectedFiles.add(directoryName+File.separator+fileName);
}
protected void writeFile(String directoryName, String fileName, String source) {
File directory = new File(directoryName);
if (!directory.exists()) {
if (!directory.mkdirs()) {
System.out.println("Could not create " + directoryName);
return;
}
}
String filePath = directory.getAbsolutePath() + File.separator + fileName;
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(filePath));
writer.write(source);
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
return;
}
}
class Runner extends AbstractRegressionTest.Runner {
StringBuffer commandLine = new StringBuffer();
String outputDir = OUTPUT_DIR + File.separator + "javac";
List<String> fileNames = new ArrayList<>();
/** will replace any -8, -9 ... option for javac */
String javacVersionOptions;
Runner() {
this.javacTestOptions = JavacTestOptions.DEFAULT;
this.expectedOutputString = "";
this.expectedErrorString = "";
}
/** Create a source file and add the filename to the compiler command line. */
void createFile(String directoryName, String fileName, String source) {
writeFileCollecting(this.fileNames, directoryName, fileName, source);
}
Set<String> runConformModuleTest() {
if (!this.fileNames.isEmpty()) {
this.shouldFlushOutputDirectory = false;
if (this.testFiles == null)
this.testFiles = new String[0];
for (String fileName : this.fileNames) {
this.commandLine.append(" \"").append(fileName).append("\"");
}
}
String commandLineString = this.commandLine.toString();
String javacCommandLine = adjustForJavac(commandLineString, this.javacVersionOptions);
return JavadocTestForModule.this.runConformModuleTest(this.testFiles, commandLineString,
this.expectedOutputString, this.expectedErrorString,
this.shouldFlushOutputDirectory, this.outputDir,
this.javacTestOptions, javacCommandLine);
}
}
void runConformModuleTest(List<String> testFileNames, StringBuffer commandLine,
String expectedFailureOutOutputString, String expectedFailureErrOutputString,
boolean shouldFlushOutputDirectory)
{
runConformModuleTest(testFileNames, commandLine,
expectedFailureOutOutputString, expectedFailureErrOutputString, shouldFlushOutputDirectory, OUTPUT_DIR + File.separator + "javac");
}
void runConformModuleTest(List<String> testFileNames, StringBuffer commandLine,
String expectedFailureOutOutputString, String expectedFailureErrOutputString,
boolean shouldFlushOutputDirectory, String output)
{
for (String file : testFileNames)
commandLine.append(" \"").append(file).append("\"");
runConformModuleTest(new String[0], commandLine.toString(),
expectedFailureOutOutputString, expectedFailureErrOutputString, shouldFlushOutputDirectory,
output, JavacTestOptions.DEFAULT, null);
}
Set<String> runConformModuleTest(String[] testFiles, String commandLine,
String expectedFailureOutOutputString, String expectedFailureErrOutputString,
boolean shouldFlushOutputDirectory)
{
return runConformModuleTest(testFiles, commandLine, expectedFailureErrOutputString, expectedFailureErrOutputString,
shouldFlushOutputDirectory, OUTPUT_DIR, JavacTestOptions.DEFAULT, null);
}
Set<String> runConformModuleTest(String[] testFiles, String commandLine,
String expectedFailureOutOutputString, String expectedFailureErrOutputString,
boolean shouldFlushOutputDirectory, String output, JavacTestOptions options, String javacCommandLine)
{
this.runConformTest(testFiles, commandLine, expectedFailureOutOutputString, expectedFailureErrOutputString, shouldFlushOutputDirectory);
if (RUN_JAVAC) {
File outputDir = new File(output);
final Set<String> outFiles = new HashSet<>();
walkOutFiles(output, outFiles, true);
String[] testFileNames = new String[testFiles.length/2];
for (int i = 0; i < testFileNames.length; i++) {
testFileNames[i] = testFiles[i*2];
}
if (javacCommandLine == null) {
javacCommandLine = adjustForJavac(commandLine, null);
}
for (JavacCompiler javacCompiler : javacCompilers) {
if (javacCompiler.compliance < ClassFileConstants.JDK9)
continue;
if (options.skip(javacCompiler)) {
System.err.println("Skip testing javac in "+testName());
continue;
}
StringBuffer log = new StringBuffer();
try {
long compileResult = javacCompiler.compile(
outputDir, /* directory */
javacCommandLine /* options */,
testFileNames /* source file names */,
log,
false); // don't repeat filenames on the command line
if (compileResult != 0) {
System.err.println("Previous error was from "+testName());
fail("Unexpected error from javac");
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
throw new AssertionFailedError(e.getMessage());
}
final Set<String> expectedFiles = new HashSet<>(outFiles);
walkOutFiles(output, expectedFiles, false);
for (String missingFile : expectedFiles)
System.err.println("Missing output file from javac: "+missingFile);
}
return outFiles;
}
return null;
}
void runNegativeModuleTest(List<String> testFileNames, StringBuffer commandLine,
String expectedFailureOutOutputString, String expectedFailureErrOutputString,
boolean shouldFlushOutputDirectory, String javacErrorMatch) {
runNegativeModuleTest(testFileNames, commandLine, expectedFailureOutOutputString,
expectedFailureErrOutputString, shouldFlushOutputDirectory, javacErrorMatch, OUTPUT_DIR + File.separator + "javac");
}
void runNegativeModuleTest(List<String> testFileNames, StringBuffer commandLine,
String expectedFailureOutOutputString, String expectedFailureErrOutputString,
boolean shouldFlushOutputDirectory, String javacErrorMatch, String output)
{
runNegativeModuleTest(testFileNames, commandLine, expectedFailureOutOutputString, expectedFailureErrOutputString,
shouldFlushOutputDirectory, javacErrorMatch, output, JavacTestOptions.DEFAULT);
}
void runNegativeModuleTest(List<String> testFileNames, StringBuffer commandLine,
String expectedFailureOutOutputString, String expectedFailureErrOutputString,
boolean shouldFlushOutputDirectory, String javacErrorMatch, String output, JavacTestOptions options)
{
for (String file : testFileNames)
commandLine.append(" \"").append(file).append("\"");
runNegativeModuleTest(new String[0], commandLine.toString(),
expectedFailureOutOutputString, expectedFailureErrOutputString, shouldFlushOutputDirectory, javacErrorMatch, output,
options);
}
void runNegativeModuleTest(String[] testFiles, String commandLine,
String expectedFailureOutOutputString, String expectedFailureErrOutputString,
boolean shouldFlushOutputDirectory, String javacErrorMatch) {
runNegativeModuleTest(testFiles, commandLine, expectedFailureOutOutputString, expectedFailureErrOutputString,
shouldFlushOutputDirectory, javacErrorMatch, OUTPUT_DIR, JavacTestOptions.DEFAULT);
}
void runNegativeModuleTest(String[] testFiles, String commandLine,
String expectedFailureOutOutputString, String expectedFailureErrOutputString,
boolean shouldFlushOutputDirectory, String javacErrorMatch, String output, JavacTestOptions options)
{
this.runNegativeTest(testFiles, commandLine, expectedFailureOutOutputString, expectedFailureErrOutputString, shouldFlushOutputDirectory);
if (RUN_JAVAC) {
String[] testFileNames = new String[testFiles.length/2];
for (int i = 0; i < testFileNames.length; i++) {
testFileNames[i] = testFiles[i*2];
}
File outputDir = new File(OUTPUT_DIR);
final Set<String> outFiles = new HashSet<>();
walkOutFiles(output, outFiles, true);
for (JavacCompiler javacCompiler : javacCompilers) {
if (javacCompiler.compliance < ClassFileConstants.JDK9)
continue;
JavacTestOptions.Excuse excuse = options.excuseFor(javacCompiler);
commandLine = adjustForJavac(commandLine, null);
StringBuffer log = new StringBuffer();
int mismatch = 0;
try {
long compileResult = javacCompiler.compile(
outputDir, /* directory */
commandLine /* options */,
testFileNames /* source file names */,
log);
if (compileResult == 0) {
mismatch = JavacTestOptions.MismatchType.EclipseErrorsJavacNone;
javacErrorMatch = expectedFailureErrOutputString;
System.err.println("Previous error was from "+testName());
} else if (!log.toString().contains(javacErrorMatch)) {
mismatch = JavacTestOptions.MismatchType.CompileErrorMismatch;
System.err.println(testName()+": Error match " + javacErrorMatch + " not found in \n"+log.toString());
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
throw new AssertionFailedError(e.getMessage());
}
handleMismatch(javacCompiler, testName(), testFiles, javacErrorMatch,
"", "", log, "", "",
excuse, mismatch);
final Set<String> expectedFiles = new HashSet<>(outFiles);
walkOutFiles(output, expectedFiles, false);
for (String missingFile : expectedFiles)
System.err.println("Missing output file from javac: "+missingFile);
}
}
}
/**
* @param commandLine command line arguments as used for ecj
* @param versionOptions if non-null use this to replace any ecj-specific -8, -9 etc. arg.
* If ecj-specific arg is not found, append anyway
* @return commandLine adjusted for javac
*/
String adjustForJavac(String commandLine, String versionOptions) {
String[] tokens = commandLine.split(" ");
StringBuffer buf = new StringBuffer();
boolean skipNext = false;
for (int i = 0; i < tokens.length; i++) {
if (skipNext) {
skipNext = false;
continue;
}
if (tokens[i].trim().equals("-9")) {
if (versionOptions == null)
buf.append(' ').append(" --release 9 ");
continue;
}
if (tokens[i].trim().equals("-8")) {
if (versionOptions == null)
buf.append(' ').append(" --release 8 ");
continue;
}
if (tokens[i].startsWith("-warn") || tokens[i].startsWith("-err") || tokens[i].startsWith("-info")) {
if (tokens[i].contains("exports") && !tokens[i].contains("-exports"))
buf.append(" -Xlint:exports ");
continue;
}
if (tokens[i].trim().equals("-classNames")) {
skipNext = true;
continue;
}
if (tokens[i].trim().equals("-enableJavadoc")) {
buf.append(" -Xdoclint:all ");
continue;
}
buf.append(tokens[i]).append(' ');
}
if (versionOptions != null) {
buf.append(versionOptions);
}
return buf.toString();
}
private void walkOutFiles(final String outputLocation, final Set<String> fileNames, boolean add) {
if (!(new File(outputLocation)).exists())
return;
try {
Files.walkFileTree(FileSystems.getDefault().getPath(outputLocation), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
if (file.toString().endsWith(".class")) {
if (add) {
fileNames.add(file.toString());
} else {
if (!fileNames.remove(file.toString()))
System.err.println("Unexpected output file from javac: "+file.toString());
}
Files.delete(file);
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
if (!dir.toString().equals(outputLocation)) {
try {
Files.delete(dir);
} catch (DirectoryNotEmptyException ex) {
// expected
}
}
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
e.printStackTrace();
throw new AssertionFailedError(e.getMessage());
}
}
public void testBug549855a() {
File outputDirectory = new File(OUTPUT_DIR);
Util.flushDirectoryContent(outputDirectory);
String out = "bin";
String directory = OUTPUT_DIR + File.separator + "src";
String moduleLoc = directory + File.separator + "mod.one";
List<String> files = new ArrayList<>();
writeFileCollecting(files, moduleLoc, "module-info.java",
"/**\n" +
" */\n" +
"module mod.one { \n" +
" exports p;\n" +
" provides p.I1 with p.P1;\n" +
" uses java.util.Currency;\n" +
"}");
writeFileCollecting(files, moduleLoc + File.separator + "p", "I1.java",
"package p;\n" +
"/**\n" +
" * interface I1\n" +
" */\n" +
"public interface I1 {\n" +
" /**\n" +
" * Method foo\n" +
" * @return int\n" +
" */\n" +
" public int foo();\n" +
"}");
writeFileCollecting(files, moduleLoc + File.separator + "p", "P1.java",
"package p;\n" +
"/**\n" +
" * class P1\n" +
" */\n" +
"public class P1 implements I1 {\n" +
" @Override\n" +
" public int foo() { return 0; }\n" +
"}");
StringBuilder buffer = new StringBuilder();
buffer.append("-d " + OUTPUT_DIR + File.separator + out )
.append(" -9 ")
.append(" -enableJavadoc ")
.append(" -err:allJavadoc ")
.append(" -classpath \"")
.append(Util.getJavaClassLibsAsString())
.append("\" ")
.append(" -warn:-unused")
.append(" --module-source-path " + "\"" + directory + "\" ")
.append(moduleLoc + File.separator + "module-info.java ")
.append(moduleLoc + File.separator + "p" + File.separator + "I1.java ")
.append(moduleLoc + File.separator + "p" + File.separator + "P1.java");
runNegativeModuleTest(
new String[0],
buffer.toString(),
"",
"----------\n" +
"1. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/mod.one/module-info.java (at line 5)\n" +
" provides p.I1 with p.P1;\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Javadoc: Missing provides tag\n" +
"----------\n" +
"2. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/mod.one/module-info.java (at line 6)\n" +
" uses java.util.Currency;\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Javadoc: Missing uses tag\n" +
"----------\n" +
"2 problems (2 errors)\n",
false,
"missing tags",
OUTPUT_DIR,
JavacTestOptions.JavacHasABug.NoWarningForMissingJavadocTag);
}
public void testBug549855b() {
File outputDirectory = new File(OUTPUT_DIR);
Util.flushDirectoryContent(outputDirectory);
String out = "bin";
String directory = OUTPUT_DIR + File.separator + "src";
String moduleLoc = directory + File.separator + "mod.one";
List<String> files = new ArrayList<>();
writeFileCollecting(files, moduleLoc, "module-info.java",
"/**\n" +
" @provides p.I\n" +
" @uses java.util.Currenc\n" +
" */\n" +
"module mod.one { \n" +
" exports p;\n" +
" provides p.I1 with p.P1;\n" +
" uses java.util.Currency;\n" +
"}");
writeFileCollecting(files, moduleLoc + File.separator + "p", "I1.java",
"package p;\n" +
"/**\n" +
" * interface I1\n" +
" */\n" +
"public interface I1 {\n" +
" /**\n" +
" * Method foo\n" +
" * @return int\n" +
" */\n" +
" public int foo();\n" +
"}");
writeFileCollecting(files, moduleLoc + File.separator + "p", "P1.java",
"package p;\n" +
"/**\n" +
" * class P1\n" +
" */\n" +
"public class P1 implements I1 {\n" +
" @Override\n" +
" public int foo() { return 0; }\n" +
"}");
StringBuilder buffer = new StringBuilder();
buffer.append("-d " + OUTPUT_DIR + File.separator + out )
.append(" -9 ")
.append(" -enableJavadoc ")
.append(" -err:allJavadoc ")
.append(" -classpath \"")
.append(Util.getJavaClassLibsAsString())
.append("\" ")
.append(" -warn:-unused")
.append(" --module-source-path " + "\"" + directory + "\" ")
.append(moduleLoc + File.separator + "module-info.java ")
.append(moduleLoc + File.separator + "p" + File.separator + "I1.java ")
.append(moduleLoc + File.separator + "p" + File.separator + "P1.java");
runNegativeModuleTest(
new String[0],
buffer.toString(),
"",
"----------\n" +
"1. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/mod.one/module-info.java (at line 7)\n" +
" provides p.I1 with p.P1;\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Javadoc: Missing provides tag\n" +
"----------\n" +
"2. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/mod.one/module-info.java (at line 8)\n" +
" uses java.util.Currency;\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Javadoc: Missing uses tag\n" +
"----------\n" +
"2 problems (2 errors)\n",
false,
"service-type not found");
}
public void testBug549855c() {
File outputDirectory = new File(OUTPUT_DIR);
Util.flushDirectoryContent(outputDirectory);
String out = "bin";
String directory = OUTPUT_DIR + File.separator + "src";
String moduleLoc = directory + File.separator + "mod.one";
List<String> files = new ArrayList<>();
writeFileCollecting(files, moduleLoc, "module-info.java",
"/**\n" +
" @provides p.I1\n" +
" @uses java.util.Currency\n" +
" @provides p.I1\n" +
" @uses java.util.Currency\n" +
" */\n" +
"module mod.one { \n" +
" exports p;\n" +
" provides p.I1 with p.P1;\n" +
" uses java.util.Currency;\n" +
"}");
writeFileCollecting(files, moduleLoc + File.separator + "p", "I1.java",
"package p;\n" +
"/**\n" +
" * interface I1\n" +
" */\n" +
"public interface I1 {\n" +
" /**\n" +
" * Method foo\n" +
" * @return int\n" +
" */\n" +
" public int foo();\n" +
"}");
writeFileCollecting(files, moduleLoc + File.separator + "p", "P1.java",
"package p;\n" +
"/**\n" +
" * class P1\n" +
" */\n" +
"public class P1 implements I1 {\n" +
" @Override\n" +
" public int foo() { return 0; }\n" +
"}");
StringBuilder buffer = new StringBuilder();
buffer.append("-d " + OUTPUT_DIR + File.separator + out )
.append(" -9 ")
.append(" -enableJavadoc ")
.append(" -err:allJavadoc ")
.append(" -classpath \"")
.append(Util.getJavaClassLibsAsString())
.append("\" ")
.append(" -warn:-unused")
.append(" --module-source-path " + "\"" + directory + "\" ")
.append(moduleLoc + File.separator + "module-info.java ")
.append(moduleLoc + File.separator + "p" + File.separator + "I1.java ")
.append(moduleLoc + File.separator + "p" + File.separator + "P1.java");
runNegativeModuleTest(
new String[0],
buffer.toString(),
"",
"----------\n" +
"1. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/mod.one/module-info.java (at line 4)\n" +
" @provides p.I1\n" +
" ^^^^\n" +
"Javadoc: Duplicate provides tag\n" +
"----------\n" +
"2. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/mod.one/module-info.java (at line 5)\n" +
" @uses java.util.Currency\n" +
" ^^^^^^^^^^^^^^^^^^\n" +
"Javadoc: Duplicate uses tag\n" +
"----------\n" +
"2 problems (2 errors)\n",
false,
"duplicate tags",
OUTPUT_DIR,
JavacTestOptions.JavacHasABug.NoWarningForDuplicateJavadocTag);
}
public void testBug549855d() {
File outputDirectory = new File(OUTPUT_DIR);
Util.flushDirectoryContent(outputDirectory);
String out = "bin";
String directory = OUTPUT_DIR + File.separator + "src";
String moduleLoc = directory + File.separator + "mod.one";
List<String> files = new ArrayList<>();
writeFileCollecting(files, moduleLoc, "module-info.java",
"/**\n" +
" @provides p.I1\n" +
" @uses java.util.Currency\n" +
" */\n" +
"module mod.one { \n" +
" exports p;\n" +
" provides p.I1 with p.P1;\n" +
" uses java.util.Currency;\n" +
"}");
writeFileCollecting(files, moduleLoc + File.separator + "p", "I1.java",
"package p;\n" +
"/**\n" +
" * interface I1\n" +
" */\n" +
"public interface I1 {\n" +
" /**\n" +
" * Method foo\n" +
" * @return int\n" +
" */\n" +
" public int foo();\n" +
"}");
writeFileCollecting(files, moduleLoc + File.separator + "p", "P1.java",
"package p;\n" +
"/**\n" +
" * class P1\n" +
" */\n" +
"public class P1 implements I1 {\n" +
" @Override\n" +
" public int foo() { return 0; }\n" +
"}");
StringBuffer buffer = new StringBuffer();
buffer.append("-d " + OUTPUT_DIR + File.separator + out )
.append(" -9 ")
.append(" -enableJavadoc ")
.append(" -err:allJavadoc ")
.append(" -classpath \"")
.append(Util.getJavaClassLibsAsString())
.append("\" ")
.append(" -warn:-unused")
.append(" --module-source-path " + "\"" + directory + "\" ");
runConformModuleTest(files, buffer, "", "", false);
}
public void testBug549855e() {
File outputDirectory = new File(OUTPUT_DIR);
Util.flushDirectoryContent(outputDirectory);
String out = "bin";
String directory = OUTPUT_DIR + File.separator + "src";
String moduleLoc = directory + File.separator + "mod.one";
List<String> files = new ArrayList<>();
writeFileCollecting(files, moduleLoc, "module-info.java",
"/**\n" +
" @provides p.I1\n" +
" */\n" +
"module mod.one { \n" +
" exports p;\n" +
" provides p.I1 with p.P1;\n" +
" uses java.util.Currency;\n" +
"}");
writeFileCollecting(files, moduleLoc + File.separator + "p", "I1.java",
"package p;\n" +
"/**\n" +
" * interface I1\n" +
" */\n" +
"public interface I1 {\n" +
" /**\n" +
" * Method foo\n" +
" * @return int\n" +
" */\n" +
" public int foo();\n" +
"}");
writeFileCollecting(files, moduleLoc + File.separator + "p", "P1.java",
"package p;\n" +
"/**\n" +
" * class P1\n" +
" */\n" +
"public class P1 implements I1 {\n" +
" @Override\n" +
" public int foo() { return 0; }\n" +
"}");
StringBuilder buffer = new StringBuilder();
buffer.append("-d " + OUTPUT_DIR + File.separator + out )
.append(" -9 ")
.append(" -enableJavadoc ")
.append(" -err:allJavadoc ")
.append(" -classpath \"")
.append(Util.getJavaClassLibsAsString())
.append("\" ")
.append(" -warn:-unused")
.append(" --module-source-path " + "\"" + directory + "\" ")
.append(moduleLoc + File.separator + "module-info.java ")
.append(moduleLoc + File.separator + "p" + File.separator + "I1.java ")
.append(moduleLoc + File.separator + "p" + File.separator + "P1.java");
runNegativeModuleTest(
new String[0],
buffer.toString(),
"",
"----------\n" +
"1. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/mod.one/module-info.java (at line 7)\n" +
" uses java.util.Currency;\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Javadoc: Missing uses tag\n" +
"----------\n" +
"1 problem (1 error)\n",
false,
"missing tags",
OUTPUT_DIR,
JavacTestOptions.JavacHasABug.NoWarningForMissingJavadocTag);
}
public void testBug549855f() {
File outputDirectory = new File(OUTPUT_DIR);
Util.flushDirectoryContent(outputDirectory);
String out = "bin";
String directory = OUTPUT_DIR + File.separator + "src";
String moduleLoc = directory + File.separator + "mod.one";
List<String> files = new ArrayList<>();
writeFileCollecting(files, moduleLoc, "module-info.java",
"/**\n" +
" @uses java.util.Currency\n" +
" */\n" +
"module mod.one { \n" +
" exports p;\n" +
" provides p.I1 with p.P1;\n" +
" uses java.util.Currency;\n" +
"}");
writeFileCollecting(files, moduleLoc + File.separator + "p", "I1.java",
"package p;\n" +
"/**\n" +
" * interface I1\n" +
" */\n" +
"public interface I1 {\n" +
" /**\n" +
" * Method foo\n" +
" * @return int\n" +
" */\n" +
" public int foo();\n" +
"}");
writeFileCollecting(files, moduleLoc + File.separator + "p", "P1.java",
"package p;\n" +
"/**\n" +
" * class P1\n" +
" */\n" +
"public class P1 implements I1 {\n" +
" @Override\n" +
" public int foo() { return 0; }\n" +
"}");
StringBuilder buffer = new StringBuilder();
buffer.append("-d " + OUTPUT_DIR + File.separator + out )
.append(" -9 ")
.append(" -enableJavadoc ")
.append(" -err:allJavadoc ")
.append(" -classpath \"")
.append(Util.getJavaClassLibsAsString())
.append("\" ")
.append(" -warn:-unused")
.append(" --module-source-path " + "\"" + directory + "\" ")
.append(moduleLoc + File.separator + "module-info.java ")
.append(moduleLoc + File.separator + "p" + File.separator + "I1.java ")
.append(moduleLoc + File.separator + "p" + File.separator + "P1.java");
runNegativeModuleTest(
new String[0],
buffer.toString(),
"",
"----------\n" +
"1. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/mod.one/module-info.java (at line 6)\n" +
" provides p.I1 with p.P1;\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Javadoc: Missing provides tag\n" +
"----------\n" +
"1 problem (1 error)\n",
false,
"missing tags",
OUTPUT_DIR,
JavacTestOptions.JavacHasABug.NoWarningForMissingJavadocTag);
}
public void testBug549855g() {
File outputDirectory = new File(OUTPUT_DIR);
Util.flushDirectoryContent(outputDirectory);
String out = "bin";
String directory = OUTPUT_DIR + File.separator + "src";
String moduleLoc = directory + File.separator + "mod.one";
List<String> files = new ArrayList<>();
writeFileCollecting(files, moduleLoc, "module-info.java",
"/**\n" +
" */\n" +
"module mod.one { \n" +
" exports p;\n" +
" provides p.I1 with p.P1;\n" +
" uses java.util.Currency;\n" +
"}");
writeFileCollecting(files, moduleLoc + File.separator + "p", "I1.java",
"package p;\n" +
"/**\n" +
" * interface I1\n" +
" */\n" +
"public interface I1 {\n" +
" /**\n" +
" * Method foo\n" +
" * @return int\n" +
" */\n" +
" public int foo();\n" +
"}");
writeFileCollecting(files, moduleLoc + File.separator + "p", "P1.java",
"package p;\n" +
"/**\n" +
" * class P1\n" +
" */\n" +
"public class P1 implements I1 {\n" +
" @Override\n" +
" public int foo() { return 0; }\n" +
"}");
StringBuilder buffer = new StringBuilder();
buffer.append("-d " + OUTPUT_DIR + File.separator + out )
.append(" -9 ")
.append(" -enableJavadoc ")
.append(" -err:allJavadoc ")
.append(" -classpath \"")
.append(Util.getJavaClassLibsAsString())
.append("\" ")
.append(" -warn:-unused")
.append(" --module-source-path " + "\"" + directory + "\" ")
.append(moduleLoc + File.separator + "module-info.java ")
.append(moduleLoc + File.separator + "p" + File.separator + "I1.java ")
.append(moduleLoc + File.separator + "p" + File.separator + "P1.java");
runNegativeModuleTest(
new String[0],
buffer.toString(),
"",
"----------\n" +
"1. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/mod.one/module-info.java (at line 5)\n" +
" provides p.I1 with p.P1;\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Javadoc: Missing provides tag\n" +
"----------\n" +
"2. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/mod.one/module-info.java (at line 6)\n" +
" uses java.util.Currency;\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Javadoc: Missing uses tag\n" +
"----------\n" +
"2 problems (2 errors)\n",
false,
"missing tags",
OUTPUT_DIR,
JavacTestOptions.JavacHasABug.NoWarningForMissingJavadocTag);
}
public void testBug549855h() {
File outputDirectory = new File(OUTPUT_DIR);
Util.flushDirectoryContent(outputDirectory);
String out = "bin";
String directory = OUTPUT_DIR + File.separator + "src";
String moduleLoc = directory + File.separator + "mod.one";
List<String> files = new ArrayList<>();
writeFileCollecting(files, moduleLoc, "module-info.java",
"/**\n" +
" * @provides p.I\n" +
" * @uses java.util.Currenc\n" +
" */\n" +
"module mod.one { \n" +
" exports p;\n" +
" provides p.I1 with p.P1;\n" +
" uses java.util.Currency;\n" +
"}");
writeFileCollecting(files, moduleLoc + File.separator + "p", "I1.java",
"package p;\n" +
"/**\n" +
" * interface I1\n" +
" */\n" +
"public interface I1 {\n" +
" /**\n" +
" * Method foo\n" +
" * @return int\n" +
" */\n" +
" public int foo();\n" +
"}");
writeFileCollecting(files, moduleLoc + File.separator + "p", "P1.java",
"package p;\n" +
"/**\n" +
" * class P1\n" +
" */\n" +
"public class P1 implements I1 {\n" +
" @Override\n" +
" public int foo() { return 0; }\n" +
"}");
StringBuilder buffer = new StringBuilder();
buffer.append("-d " + OUTPUT_DIR + File.separator + out )
.append(" -9 ")
.append(" -enableJavadoc ")
.append(" -err:allJavadoc ")
.append(" -classpath \"")
.append(Util.getJavaClassLibsAsString())
.append("\" ")
.append(" -warn:-unused")
.append(" --module-source-path " + "\"" + directory + "\" ")
.append(moduleLoc + File.separator + "module-info.java ")
.append(moduleLoc + File.separator + "p" + File.separator + "I1.java ")
.append(moduleLoc + File.separator + "p" + File.separator + "P1.java");
runNegativeModuleTest(
new String[0],
buffer.toString(),
"",
"----------\n" +
"1. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/mod.one/module-info.java (at line 7)\n" +
" provides p.I1 with p.P1;\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Javadoc: Missing provides tag\n" +
"----------\n" +
"2. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/mod.one/module-info.java (at line 8)\n" +
" uses java.util.Currency;\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Javadoc: Missing uses tag\n" +
"----------\n" +
"2 problems (2 errors)\n",
false,
"reference not found");
}
public void testBug549855i() {
File outputDirectory = new File(OUTPUT_DIR);
Util.flushDirectoryContent(outputDirectory);
String out = "bin";
String directory = OUTPUT_DIR + File.separator + "src";
String moduleLoc = directory + File.separator + "mod.one";
List<String> files = new ArrayList<>();
writeFileCollecting(files, moduleLoc, "module-info.java",
"module mod.one {\n" +
"}");
StringBuilder buffer = new StringBuilder();
buffer.append("-d " + OUTPUT_DIR + File.separator + out )
.append(" -9 ")
.append(" -enableJavadoc ")
.append(" -err:allJavadoc ")
.append(" -classpath \"")
.append(Util.getJavaClassLibsAsString())
.append("\" ")
.append(" -warn:-unused")
.append(" --module-source-path " + "\"" + directory + "\" ")
.append(moduleLoc + File.separator + "module-info.java ");
runNegativeModuleTest(
new String[0],
buffer.toString(),
"",
"----------\n" +
"1. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/mod.one/module-info.java (at line 1)\n" +
" module mod.one {\n" +
" ^^^^^^^^^^^^^^^\n" +
"Javadoc: Missing comment for module declaration\n" +
"----------\n" +
"1 problem (1 error)\n",
false,
"no comment");
}
public void testBug562960() {
File outputDirectory = new File(OUTPUT_DIR);
Util.flushDirectoryContent(outputDirectory);
String out = "bin";
String directory = OUTPUT_DIR + File.separator + "src";
String options =
"-d " + OUTPUT_DIR + File.separator + out +
" -9 " +
" -enableJavadoc " +
" -err:allJavadoc " +
" -classpath \"" + Util.getJavaClassLibsAsString() + "\" " +
directory + File.separator + "Test.java";
runNegativeModuleTest(
new String[] {
"src/Test.java",
"/**\n" +
" * {@link sun.security.ssl.X509TrustManagerImpl}\n" +
" */\n" +
"public class Test {}\n"
},
options,
"",
"----------\n" +
"1. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/Test.java (at line 2)\n" +
" * {@link sun.security.ssl.X509TrustManagerImpl}\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Javadoc: The type sun.security.ssl.X509TrustManagerImpl is not accessible\n" +
"----------\n" +
"1 problem (1 error)\n",
false,
"reference not found");
}
}