8006263: Supplementary test cases needed for doclint

Reviewed-by: mcimadamore
This commit is contained in:
Peter Jensen 2013-01-21 10:00:46 -08:00 committed by Jonathan Gibbons
parent 00ae27b2cf
commit 7967c92db0
16 changed files with 954 additions and 16 deletions

View file

@ -92,7 +92,7 @@ public class Checker extends DocTreeScanner<Void, Void> {
boolean foundInheritDoc = false; boolean foundInheritDoc = false;
boolean foundReturn = false; boolean foundReturn = false;
enum Flag { public enum Flag {
TABLE_HAS_CAPTION, TABLE_HAS_CAPTION,
HAS_ELEMENT, HAS_ELEMENT,
HAS_TEXT HAS_TEXT

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -122,7 +122,7 @@ public class DocLint implements Plugin {
if (javacFiles.isEmpty()) { if (javacFiles.isEmpty()) {
if (!needHelp) if (!needHelp)
System.out.println("no files given"); out.println("no files given");
} }
JavacTool tool = JavacTool.create(); JavacTool tool = JavacTool.create();
@ -179,11 +179,11 @@ public class DocLint implements Plugin {
} }
} else if (arg.equals(STATS)) { } else if (arg.equals(STATS)) {
env.messages.setStatsEnabled(true); env.messages.setStatsEnabled(true);
} else if (arg.matches("-bootclasspath") && i + 1 < args.length) { } else if (arg.equals("-bootclasspath") && i + 1 < args.length) {
javacBootClassPath = splitPath(args[++i]); javacBootClassPath = splitPath(args[++i]);
} else if (arg.matches("-classpath") && i + 1 < args.length) { } else if (arg.equals("-classpath") && i + 1 < args.length) {
javacClassPath = splitPath(args[++i]); javacClassPath = splitPath(args[++i]);
} else if (arg.matches("-sourcepath") && i + 1 < args.length) { } else if (arg.equals("-sourcepath") && i + 1 < args.length) {
javacSourcePath = splitPath(args[++i]); javacSourcePath = splitPath(args[++i]);
} else if (arg.equals(XMSGS_OPTION)) { } else if (arg.equals(XMSGS_OPTION)) {
env.messages.setOptions(null); env.messages.setOptions(null);
@ -234,6 +234,8 @@ public class DocLint implements Plugin {
out.println(" equivalent to -Xmsgs:all/protected, meaning that"); out.println(" equivalent to -Xmsgs:all/protected, meaning that");
out.println(" all messages are reported for protected and public"); out.println(" all messages are reported for protected and public");
out.println(" declarations only. "); out.println(" declarations only. ");
out.println(" -stats");
out.println(" Report statistics on the reported issues.");
out.println(" -h -help --help -usage -?"); out.println(" -h -help --help -usage -?");
out.println(" Show this message."); out.println(" Show this message.");
out.println(""); out.println("");
@ -247,7 +249,7 @@ public class DocLint implements Plugin {
List<File> splitPath(String path) { List<File> splitPath(String path) {
List<File> files = new ArrayList<File>(); List<File> files = new ArrayList<File>();
for (String f: path.split(File.separator)) { for (String f: path.split(File.pathSeparator)) {
if (f.length() > 0) if (f.length() > 0)
files.add(new File(f)); files.add(new File(f));
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -43,7 +43,7 @@ import java.util.Map;
* risk. This code and its internal interfaces are subject to change * risk. This code and its internal interfaces are subject to change
* or deletion without notice.</b></p> * or deletion without notice.</b></p>
*/ */
enum Entity { public enum Entity {
nbsp(160), nbsp(160),
iexcl(161), iexcl(161),
cent(162), cent(162),

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -273,7 +273,7 @@ public enum HtmlTag {
static final Map<String,Attr> index = new HashMap<String,Attr>(); static final Map<String,Attr> index = new HashMap<String,Attr>();
static { static {
for (Attr t: values()) { for (Attr t: values()) {
index.put(t.name().toLowerCase(), t); index.put(t.getText(), t);
} }
} }
} }
@ -346,7 +346,7 @@ public enum HtmlTag {
private static final Map<String,HtmlTag> index = new HashMap<String,HtmlTag>(); private static final Map<String,HtmlTag> index = new HashMap<String,HtmlTag>();
static { static {
for (HtmlTag t: values()) { for (HtmlTag t: values()) {
index.put(t.name().toLowerCase(), t); index.put(t.getText(), t);
} }
} }

View file

@ -0,0 +1,71 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 8006263
* @summary Supplementary test cases needed for doclint
*/
import com.sun.tools.doclint.Checker;
import com.sun.tools.doclint.Entity;
import com.sun.tools.doclint.HtmlTag;
import com.sun.tools.doclint.Messages;
import java.util.Objects;
public class CoverageExtras {
public static void main(String... args) {
new CoverageExtras().run();
}
void run() {
check(HtmlTag.A, HtmlTag.valueOf("A"), HtmlTag.values());
check(HtmlTag.Attr.ABBR, HtmlTag.Attr.valueOf("ABBR"), HtmlTag.Attr.values());
check(HtmlTag.AttrKind.INVALID, HtmlTag.AttrKind.valueOf("INVALID"), HtmlTag.AttrKind.values());
check(HtmlTag.BlockType.BLOCK, HtmlTag.BlockType.valueOf("BLOCK"), HtmlTag.BlockType.values());
check(HtmlTag.EndKind.NONE, HtmlTag.EndKind.valueOf("NONE"), HtmlTag.EndKind.values());
check(HtmlTag.Flag.EXPECT_CONTENT, HtmlTag.Flag.valueOf("EXPECT_CONTENT"), HtmlTag.Flag.values());
check(Checker.Flag.TABLE_HAS_CAPTION, Checker.Flag.valueOf("TABLE_HAS_CAPTION"), Checker.Flag.values());
check(Entity.nbsp, Entity.valueOf("nbsp"), Entity.values());
check(Messages.Group.ACCESSIBILITY, Messages.Group.valueOf("ACCESSIBILITY"), Messages.Group.values());
}
<T extends Enum<T>> void check(T expect, T value, T[] values) {
if (!Objects.equals(expect, value)) {
error("Mismatch: '" + expect + "', '" + value + "'");
}
if (!Objects.equals(expect, values[0])) {
error("Mismatch: '" + expect + "', '" + values[0] + "'");
}
}
void error(String msg) {
System.err.println("Error: " + msg);
errors++;
}
int errors;
}

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -26,6 +26,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import com.sun.tools.doclint.DocLint; import com.sun.tools.doclint.DocLint;
import com.sun.tools.doclint.DocLint.BadArgs;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
@ -45,6 +46,7 @@ public class DocLintTester {
public void run(String... args) throws Exception { public void run(String... args) throws Exception {
String testSrc = System.getProperty("test.src"); String testSrc = System.getProperty("test.src");
boolean badArgs = false;
File refFile = null; File refFile = null;
List<String> opts = new ArrayList<String>(); List<String> opts = new ArrayList<String>();
List<File> files = new ArrayList<File>(); List<File> files = new ArrayList<File>();
@ -52,19 +54,25 @@ public class DocLintTester {
String arg = args[i]; String arg = args[i];
if (arg.equals("-ref")) { if (arg.equals("-ref")) {
refFile = new File(testSrc, args[++i]); refFile = new File(testSrc, args[++i]);
} else if (arg.equals("-badargs")) {
badArgs = true;
} else if (arg.startsWith("-Xmsgs")) { } else if (arg.startsWith("-Xmsgs")) {
opts.add(arg); opts.add(arg);
} else if (arg.startsWith("-")) {
opts.add(arg);
if (i < args.length - 1 && !args[i+1].startsWith("-"))
opts.add(args[++i]);
} else } else
files.add(new File(testSrc, arg)); files.add(new File(testSrc, arg));
} }
check(opts, files, refFile); check(opts, files, badArgs, refFile);
if (errors > 0) if (errors > 0)
throw new Exception(errors + " errors occurred"); throw new Exception(errors + " errors occurred");
} }
void check(List<String> opts, List<File> files, File refFile) throws Exception { void check(List<String> opts, List<File> files, boolean expectBadArgs, File refFile) throws Exception {
List<String> args = new ArrayList<String>(); List<String> args = new ArrayList<String>();
args.addAll(opts); args.addAll(opts);
for (File file: files) for (File file: files)
@ -72,7 +80,14 @@ public class DocLintTester {
StringWriter sw = new StringWriter(); StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw); PrintWriter pw = new PrintWriter(sw);
new DocLint().run(pw, args.toArray(new String[args.size()])); try {
new DocLint().run(pw, args.toArray(new String[args.size()]));
if (expectBadArgs)
error("expected exception not thrown");
} catch (BadArgs e) {
if (!expectBadArgs)
error("unexpected exception caught: " + e);
}
pw.flush(); pw.flush();
String out = normalizeNewlines(removeFileNames(sw.toString())).trim(); String out = normalizeNewlines(removeFileNames(sw.toString())).trim();
if (out != null) if (out != null)

View file

@ -0,0 +1,317 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8006263
* @summary Supplementary test cases needed for doclint
* @library ..
* @build DocLintTester
* @run main DocLintTester -Xmsgs:-html EntitiesTest.java
* @run main DocLintTester -Xmsgs:html -ref EntitiesTest.out EntitiesTest.java
*/
/** */
class EntitiesTest {
/**
* &#32; &#x20;
* &#2126; &#x84e; &#x84E;
*/
void range_test() { }
/**
* &nbsp; &#160;
* &iexcl; &#161;
* &cent; &#162;
* &pound; &#163;
* &curren; &#164;
* &yen; &#165;
* &brvbar; &#166;
* &sect; &#167;
* &uml; &#168;
* &copy; &#169;
* &ordf; &#170;
* &laquo; &#171;
* &not; &#172;
* &shy; &#173;
* &reg; &#174;
* &macr; &#175;
* &deg; &#176;
* &plusmn; &#177;
* &sup2; &#178;
* &sup3; &#179;
* &acute; &#180;
* &micro; &#181;
* &para; &#182;
* &middot; &#183;
* &cedil; &#184;
* &sup1; &#185;
* &ordm; &#186;
* &raquo; &#187;
* &frac14; &#188;
* &frac12; &#189;
* &frac34; &#190;
* &iquest; &#191;
* &Agrave; &#192;
* &Aacute; &#193;
* &Acirc; &#194;
* &Atilde; &#195;
* &Auml; &#196;
* &Aring; &#197;
* &AElig; &#198;
* &Ccedil; &#199;
* &Egrave; &#200;
* &Eacute; &#201;
* &Ecirc; &#202;
* &Euml; &#203;
* &Igrave; &#204;
* &Iacute; &#205;
* &Icirc; &#206;
* &Iuml; &#207;
* &ETH; &#208;
* &Ntilde; &#209;
* &Ograve; &#210;
* &Oacute; &#211;
* &Ocirc; &#212;
* &Otilde; &#213;
* &Ouml; &#214;
* &times; &#215;
* &Oslash; &#216;
* &Ugrave; &#217;
* &Uacute; &#218;
* &Ucirc; &#219;
* &Uuml; &#220;
* &Yacute; &#221;
* &THORN; &#222;
* &szlig; &#223;
* &agrave; &#224;
* &aacute; &#225;
* &acirc; &#226;
* &atilde; &#227;
* &auml; &#228;
* &aring; &#229;
* &aelig; &#230;
* &ccedil; &#231;
* &egrave; &#232;
* &eacute; &#233;
* &ecirc; &#234;
* &euml; &#235;
* &igrave; &#236;
* &iacute; &#237;
* &icirc; &#238;
* &iuml; &#239;
* &eth; &#240;
* &ntilde; &#241;
* &ograve; &#242;
* &oacute; &#243;
* &ocirc; &#244;
* &otilde; &#245;
* &ouml; &#246;
* &divide; &#247;
* &oslash; &#248;
* &ugrave; &#249;
* &uacute; &#250;
* &ucirc; &#251;
* &uuml; &#252;
* &yacute; &#253;
* &thorn; &#254;
* &yuml; &#255;
* &fnof; &#402;
* &Alpha; &#913;
* &Beta; &#914;
* &Gamma; &#915;
* &Delta; &#916;
* &Epsilon; &#917;
* &Zeta; &#918;
* &Eta; &#919;
* &Theta; &#920;
* &Iota; &#921;
* &Kappa; &#922;
* &Lambda; &#923;
* &Mu; &#924;
* &Nu; &#925;
* &Xi; &#926;
* &Omicron; &#927;
* &Pi; &#928;
* &Rho; &#929;
* &Sigma; &#931;
* &Tau; &#932;
* &Upsilon; &#933;
* &Phi; &#934;
* &Chi; &#935;
* &Psi; &#936;
* &Omega; &#937;
* &alpha; &#945;
* &beta; &#946;
* &gamma; &#947;
* &delta; &#948;
* &epsilon; &#949;
* &zeta; &#950;
* &eta; &#951;
* &theta; &#952;
* &iota; &#953;
* &kappa; &#954;
* &lambda; &#955;
* &mu; &#956;
* &nu; &#957;
* &xi; &#958;
* &omicron; &#959;
* &pi; &#960;
* &rho; &#961;
* &sigmaf; &#962;
* &sigma; &#963;
* &tau; &#964;
* &upsilon; &#965;
* &phi; &#966;
* &chi; &#967;
* &psi; &#968;
* &omega; &#969;
* &thetasym; &#977;
* &upsih; &#978;
* &piv; &#982;
* &bull; &#8226;
* &hellip; &#8230;
* &prime; &#8242;
* &Prime; &#8243;
* &oline; &#8254;
* &frasl; &#8260;
* &weierp; &#8472;
* &image; &#8465;
* &real; &#8476;
* &trade; &#8482;
* &alefsym; &#8501;
* &larr; &#8592;
* &uarr; &#8593;
* &rarr; &#8594;
* &darr; &#8595;
* &harr; &#8596;
* &crarr; &#8629;
* &lArr; &#8656;
* &uArr; &#8657;
* &rArr; &#8658;
* &dArr; &#8659;
* &hArr; &#8660;
* &forall; &#8704;
* &part; &#8706;
* &exist; &#8707;
* &empty; &#8709;
* &nabla; &#8711;
* &isin; &#8712;
* &notin; &#8713;
* &ni; &#8715;
* &prod; &#8719;
* &sum; &#8721;
* &minus; &#8722;
* &lowast; &#8727;
* &radic; &#8730;
* &prop; &#8733;
* &infin; &#8734;
* &ang; &#8736;
* &and; &#8743;
* &or; &#8744;
* &cap; &#8745;
* &cup; &#8746;
* &_int; &#8747;
* &there4; &#8756;
* &sim; &#8764;
* &cong; &#8773;
* &asymp; &#8776;
* &ne; &#8800;
* &equiv; &#8801;
* &le; &#8804;
* &ge; &#8805;
* &sub; &#8834;
* &sup; &#8835;
* &nsub; &#8836;
* &sube; &#8838;
* &supe; &#8839;
* &oplus; &#8853;
* &otimes; &#8855;
* &perp; &#8869;
* &sdot; &#8901;
* &lceil; &#8968;
* &rceil; &#8969;
* &lfloor; &#8970;
* &rfloor; &#8971;
* &lang; &#9001;
* &rang; &#9002;
* &loz; &#9674;
* &spades; &#9824;
* &clubs; &#9827;
* &hearts; &#9829;
* &diams; &#9830;
* &quot; &#34;
* &amp; &#38;
* &lt; &#60;
* &gt; &#62;
* &OElig; &#338;
* &oelig; &#339;
* &Scaron; &#352;
* &scaron; &#353;
* &Yuml; &#376;
* &circ; &#710;
* &tilde; &#732;
* &ensp; &#8194;
* &emsp; &#8195;
* &thinsp; &#8201;
* &zwnj; &#8204;
* &zwj; &#8205;
* &lrm; &#8206;
* &rlm; &#8207;
* &ndash; &#8211;
* &mdash; &#8212;
* &lsquo; &#8216;
* &rsquo; &#8217;
* &sbquo; &#8218;
* &ldquo; &#8220;
* &rdquo; &#8221;
* &bdquo; &#8222;
* &dagger; &#8224;
* &Dagger; &#8225;
* &permil; &#8240;
* &lsaquo; &#8249;
* &rsaquo; &#8250;
* &euro; &#8364;
*/
void symbolic_entities() { }
/**
* &bad;
*/
void bad_name() { }
/**
* &#31;
* &#2127;
*/
void out_of_range() { }
/**
* &#8213;
* &#9003;
* &#xffff;
*/
void sparse_negative() { }
}

View file

@ -0,0 +1,19 @@
EntitiesTest.java:300: error: invalid entity &bad;
* &bad;
^
EntitiesTest.java:305: error: invalid entity &#31;
* &#31;
^
EntitiesTest.java:306: error: invalid entity &#2127;
* &#2127;
^
EntitiesTest.java:311: error: invalid entity &#8213;
* &#8213;
^
EntitiesTest.java:312: error: invalid entity &#9003;
* &#9003;
^
EntitiesTest.java:313: error: invalid entity &#xffff;
* &#xffff;
^
6 errors

View file

@ -0,0 +1,38 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8006263
* @summary Supplementary test cases needed for doclint
* @library ..
* @build DocLintTester
* @run main DocLintTester -ref HelpTest.out
* @run main DocLintTester -ref HelpTest.out -h
* @run main DocLintTester -ref HelpTest.out -help
* @run main DocLintTester -ref HelpTest.out --help
* @run main DocLintTester -ref HelpTest.out -usage
* @run main DocLintTester -ref HelpTest.out -?
*/

View file

@ -0,0 +1,43 @@
Usage:
doclint [options] source-files...
Options:
-Xmsgs
Same as -Xmsgs:all
-Xmsgs:values
Specify categories of issues to be checked, where 'values'
is a comma-separated list of any of the following:
reference show places where comments contain incorrect
references to Java source code elements
syntax show basic syntax errors within comments
html show issues with HTML tags and attributes
accessibility show issues for accessibility
missing show issues with missing documentation
all all of the above
Precede a value with '-' to negate it
Categories may be qualified by one of:
/public /protected /package /private
For positive categories (not beginning with '-')
the qualifier applies to that access level and above.
For negative categories (beginning with '-')
the qualifier applies to that access level and below.
If a qualifier is missing, the category applies to
all access levels.
For example, -Xmsgs:all,-syntax/private
This will enable all messages, except syntax errors
in the doc comments of private methods.
If no -Xmsgs options are provided, the default is
equivalent to -Xmsgs:all/protected, meaning that
all messages are reported for protected and public
declarations only.
-stats
Report statistics on the reported issues.
-h -help --help -usage -?
Show this message.
The following javac options are also supported
-bootclasspath, -classpath, -sourcepath, -Xmaxerrs, -Xmaxwarns
To run doclint on part of a project, put the compiled classes for your
project on the classpath (or bootclasspath), then specify the source files
to be checked on the command line.

View file

@ -0,0 +1,21 @@
/*
* @test /nodynamiccopyright/
* @bug 8006263
* @summary Supplementary test cases needed for doclint
* @library ..
* @build DocLintTester
* @run main DocLintTester -ref MaxDiagsTest.out -Xmaxerrs 2 -Xmaxwarns 2 MaxDiagsTest.java
* @run main DocLintTester -badargs -Xmaxerrs
* @run main DocLintTester -badargs -Xmaxwarns
* @run main DocLintTester -badargs -Xmaxerrs two -Xmaxwarns two MaxDiagsTest.java
*/
public class MaxDiagsTest {
/**
* &#0; &#0; &#0; &#0;
*/
public void errors() { }
/** 4 undocumented signature items */
public int warnings(int a1, int a2) throws Exception { return 0; }
}

View file

@ -0,0 +1,14 @@
MaxDiagsTest.java:13: warning: no comment
public class MaxDiagsTest {
^
MaxDiagsTest.java:15: error: invalid entity &#0;
* &#0; &#0; &#0; &#0;
^
MaxDiagsTest.java:15: error: invalid entity &#0;
* &#0; &#0; &#0; &#0;
^
MaxDiagsTest.java:20: warning: no @param for a1
public int warnings(int a1, int a2) throws Exception { return 0; }
^
2 errors
2 warnings

View file

@ -0,0 +1,136 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8006263
* @summary Supplementary test cases needed for doclint
*/
import com.sun.tools.doclint.DocLint;
import com.sun.tools.doclint.DocLint.BadArgs;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.regex.Pattern;
public class PathsTest {
public static void main(String... args) throws Exception {
new PathsTest().run();
}
void run() throws Exception {
String PS = File.pathSeparator;
writeFile("src1/p/A.java",
"package p; public class A { }");
compile("-d", "classes1", "src1/p/A.java");
writeFile("src2/q/B.java",
"package q; public class B extends p.A { }");
compile("-d", "classes2", "-classpath", "classes1", "src2/q/B.java");
writeFile("src/Test.java",
"/** &0; */ class Test extends q.B { }");
test("src/Test.java", "-sourcepath", "src1" + PS + "src2");
test("src/Test.java", "-classpath", "classes1" + PS + "classes2");
String sysBootClassPath = System.getProperty("sun.boot.class.path");
test("src/Test.java", "-bootclasspath",
sysBootClassPath + PS + "classes1" + PS + "classes2");
if (errors > 0)
throw new Exception(errors + " errors found");
}
Pattern pkgNotFound = Pattern.compile("package [a-z]+ does not exist");
Pattern badHtmlEntity = Pattern.compile("bad HTML entity");
void test(String file, String pathOpt, String path) throws BadArgs, IOException {
System.err.println("test " + pathOpt);
String out1 = doclint("-Xmsgs", file);
if (!pkgNotFound.matcher(out1).find())
error("message not found: " + pkgNotFound);
String out2 = doclint("-Xmsgs", pathOpt, path, file);
if (pkgNotFound.matcher(out2).find())
error("unexpected message found: " + pkgNotFound);
if (!badHtmlEntity.matcher(out1).find())
error("message not found: " + badHtmlEntity);
try {
doclint("-Xmsgs", pathOpt);
error("expected exception not thrown");
} catch (BadArgs e) {
System.err.println(e);
}
}
void compile(String... args) {
for (int i = 0; i < args.length; i++) {
if (args[i].equals("-d")) {
new File(args[++i]).mkdirs();
break;
}
}
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
int rc = com.sun.tools.javac.Main.compile(args, pw);
pw.close();
String out = sw.toString();
if (!out.isEmpty())
System.err.println(out);
if (rc != 0)
error("compilation failed: rc=" + rc);
}
String doclint(String... args) throws BadArgs, IOException {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
DocLint dl = new DocLint();
dl.run(pw, args);
pw.close();
String out = sw.toString();
if (!out.isEmpty())
System.err.println(out);
return out;
}
File writeFile(String path, String body) throws IOException {
File f = new File(path);
f.getParentFile().mkdirs();
try (FileWriter fw = new FileWriter(path)) {
fw.write(body);
}
return f;
}
void error(String msg) {
System.err.println("Error: " + msg);
errors++;
}
int errors;
}

View file

@ -0,0 +1,200 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8006263
* @summary Supplementary test cases needed for doclint
*/
import com.sun.source.util.JavacTask;
import com.sun.tools.doclint.DocLint;
import com.sun.tools.doclint.DocLint.BadArgs;
import com.sun.tools.javac.api.JavacTool;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URI;
import java.security.Permission;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
public class RunTest {
static class SimpleSecurityManager extends SecurityManager {
boolean allowExit = false;
@Override
public void checkExit(int status) {
if (!allowExit)
throw new SecurityException("System.exit(" + status + ")");
}
@Override
public void checkPermission(Permission perm) { }
}
public static void main(String... args) throws Exception {
// if no security manager already installed, install one to
// prevent System.exit
SimpleSecurityManager secmgr = null;
if (System.getSecurityManager() == null) {
System.setSecurityManager(secmgr = new SimpleSecurityManager() { });
}
try {
new RunTest().run();
} finally {
if (secmgr != null)
secmgr.allowExit = true;
}
}
void run() throws Exception {
testMain();
testRun();
testInit();
testArgsNoFiles();
if (errors > 0)
throw new Exception(errors + " errors found");
}
void testMain() {
System.err.println("test main(String[])");
testMain(true, "-help");
testMain(false, "-unknownOption");
}
void testMain(boolean expectOK, String... args) {
try {
DocLint.main(args);
if (!expectOK)
error("expected SecurityException (from System.exit) not thrown");
} catch (SecurityException e) {
System.err.println(e);
if (expectOK)
error("unexpected SecurityException caught");
}
}
void testRun() throws BadArgs, IOException {
System.err.println("test run(String[])");
DocLint dl = new DocLint();
String[] args = { "-help" };
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
PrintStream prev = System.out;
try {
System.setOut(ps);
dl.run(args);
} finally {
System.setOut(prev);
}
ps.close();
String stdout = baos.toString();
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
dl.run(pw, args);
pw.close();
String direct = sw.toString();
if (!stdout.equals(direct)) {
error("unexpected output");
System.err.println("EXPECT>>" + direct + "<<");
System.err.println("FOUND>>" + stdout + "<<");
}
}
void testInit() {
System.err.println("test init");
DocLint dl = new DocLint();
String name = dl.getName();
if (!Objects.equals(name, "doclint"))
error("unexpected result for DocLint.getName()");
List<? extends JavaFileObject> files =
Arrays.asList(createFile("Test.java", "/** &0; */ class Test{ }"));
String[] goodArgs = { "-Xmsgs" };
testInit(true, goodArgs, files);
String[] badArgs = { "-unknown" };
testInit(false, badArgs, files);
}
void testInit(boolean expectOK, String[] args, List<? extends JavaFileObject> files) {
JavacTool javac = JavacTool.create();
JavacTask task = javac.getTask(null, null, null, null, null, files);
try {
DocLint dl = new DocLint();
dl.init(task, args, true);
if (!expectOK)
error("expected IllegalArgumentException not thrown");
task.call();
} catch (IllegalArgumentException e) {
System.err.println(e);
if (expectOK)
error("unexpected IllegalArgumentException caught");
}
}
void testArgsNoFiles() throws BadArgs, IOException {
System.err.println("test args, no files");
DocLint dl = new DocLint();
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
dl.run(pw, "-Xmsgs");
pw.close();
String out = sw.toString();
String expect = "no files given";
if (!Objects.equals(out.trim(), expect)) {
error("unexpected output");
System.err.println("EXPECT>>" + expect + "<<");
System.err.println("FOUND>>" + out + "<<");
}
}
JavaFileObject createFile(String name, final String body) {
return new SimpleJavaFileObject(URI.create(name), JavaFileObject.Kind.SOURCE) {
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
return body;
}
};
}
void error(String msg) {
System.err.println("Error: " + msg);
errors++;
}
int errors;
}

View file

@ -0,0 +1,19 @@
/*
* @test /nodynamiccopyright/
* @bug 8006263
* @summary Supplementary test cases needed for doclint
* @library ..
* @build DocLintTester
* @run main DocLintTester -ref StatsTest.out -stats -Xmsgs:all StatsTest.java
*/
// warning: missing comment
public class StatsTest {
/**
* &#0; &#0; &#0; &#0;
*/
public void errors() { }
/** 4 undocumented signature items */
public int warnings(int a1, int a2) throws Exception { return 0; }
}

View file

@ -0,0 +1,43 @@
StatsTest.java:11: warning: no comment
public class StatsTest {
^
StatsTest.java:13: error: invalid entity &#0;
* &#0; &#0; &#0; &#0;
^
StatsTest.java:13: error: invalid entity &#0;
* &#0; &#0; &#0; &#0;
^
StatsTest.java:13: error: invalid entity &#0;
* &#0; &#0; &#0; &#0;
^
StatsTest.java:13: error: invalid entity &#0;
* &#0; &#0; &#0; &#0;
^
StatsTest.java:18: warning: no @param for a1
public int warnings(int a1, int a2) throws Exception { return 0; }
^
StatsTest.java:18: warning: no @param for a2
public int warnings(int a1, int a2) throws Exception { return 0; }
^
StatsTest.java:18: warning: no @return
public int warnings(int a1, int a2) throws Exception { return 0; }
^
StatsTest.java:18: warning: no @throws for java.lang.Exception
public int warnings(int a1, int a2) throws Exception { return 0; }
^
By group...
5: missing
4: html
By diagnostic kind...
5: warning
4: error
By message kind...
4: invalid entity &{0};
2: no @param for {0}
1: no @return
1: no @throws for {0}
1: no comment
4 errors
5 warnings