RFR: JDK-8273154: Provide a JavadocTester method for non-overlapping, unordered output matching [v2]

Jonathan Gibbons jjg at openjdk.java.net
Wed Oct 20 00:14:20 UTC 2021


On Fri, 1 Oct 2021 12:04:53 GMT, Pavel Rappo <prappo at openjdk.org> wrote:

> Unrelated to this PR. Every time I see these lines in JavadocTester, I cannot help thinking that we could use more specific APIs:
> 
> ```
>     public static final String FS = System.getProperty("file.separator");
>     public static final String PS = System.getProperty("path.separator");
>     public static final String NL = System.getProperty("line.separator");
>     public static final String thisRelease = System.getProperty("java.specification.version");
> ```
> 
> The above lines can be translated into:
> 
> ```
>     public static final String FS = java.io.File.separator;
>     public static final String PS = java.io.File.pathSeparator;
>     public static final String NL = System.lineSeparator();
>     public static final String thisRelease = String.valueOf(Runtime.version().feature());
> ```
> 
> I note that neither `PS` nor `thisRelease` seem to be currently used.

I dislike importing `File`, to help catch accidental use of `File` when `Path` would be better.
You may be right that `PS` and `thisRelease` may not be used, but I'd prefer to leave them in, just in case.

> test/langtools/jdk/javadoc/lib/javadoc/tester/JavadocTester.java line 923:
> 
>> 921:      * Configuration can be done with a series of chained method calls.
>> 922:      * Checks can be specified as either literal strings or regular expressions.
>> 923:      */
> 
> Suggestion:
> 
>     /**
>      * A flexible tool for checking the content of generated files and output streams.
>      *
>      * Configure with a series of chained method calls, specifying target strings
>      * as either literal strings or regular expressions.
>      */

I prefer to keep `checker` instead of `tool`.   I'll consider the others.

> test/langtools/jdk/javadoc/lib/javadoc/tester/JavadocTester.java line 938:
> 
>> 936:                 return new Range(start, end);
>> 937:             }
>> 938:             boolean overlaps(Range other) {
> 
> The `overlaps` method seems unused.

That sounds surprising; I'll check.

> test/langtools/jdk/javadoc/lib/javadoc/tester/JavadocTester.java line 953:
> 
>> 951:          * @param file the file
>> 952:          */
>> 953:         public OutputChecker(String file) {
> 
> Given JDK-8274172, consider using java.nio.file.Path instead of String here. Using Path for files and String for target strings reduces potential for confusion.

I'll investigate, but IIRC there is broad precedent for using `String file` to simplify the call site, avoiding boilerplate `Path.of`.

> test/langtools/jdk/javadoc/lib/javadoc/tester/JavadocTester.java line 1030:
> 
>> 1028:                         .map(s -> "    " + toShortString(s))
>> 1029:                         .collect(Collectors.joining("\n")));
>> 1030:                 return this;
> 
> Shouldn't we print lines using the platform line separator?
> 
> Suggestion:
> 
>             if (name == null) {
>                 out.println("Skipping checks for:" + System.lineSeparator()
>                         + Stream.of(strings)
>                         .map(s -> "    " + toShortString(s))
>                         .collect(Collectors.joining(System.lineSeparator())));
>                 return this;
> 
> Alternatively, we could println individual lines:
> Suggestion:
> 
>             if (name == null) {
>                 out.println("Skipping checks for:");
>                 for (String s : strings) {
>                     out.println("    " + toShortString(s));
>                 }
>                 return this;
>             }

Will consider

> test/langtools/jdk/javadoc/lib/javadoc/tester/JavadocTester.java line 1063:
> 
>> 1061:          * Checks that there are no duplicate lines in the content.
>> 1062:          */
>> 1063:         public OutputChecker checkUnique() {
> 
> checkUnique seems to be neither used nor tested. As far as I can see, it was like that before this PR. Consider removing this method.

I'll check when/why it was added.  It must have been added for a reason.

> test/langtools/jdk/javadoc/lib/javadoc/tester/JavadocTester.java line 1076:
> 
>> 1074:          *                if {@code false}, lines that do not match the pattern will be checked
>> 1075:          */
>> 1076:         public OutputChecker checkUnique(String pattern, boolean select ) {
> 
> Suggestion:
> 
>         public OutputChecker checkUnique(String pattern, boolean select) {

oops

> test/langtools/jdk/javadoc/lib/javadoc/tester/JavadocTester.java line 1079:
> 
>> 1077:             checking("checkUnique");
>> 1078:             Pattern filter = Pattern.compile(pattern);
>> 1079:             Matcher m = filter.matcher("");
> 
> A reusable matcher; nice.

Yeah, not sure it makes much difference, compared to allocating new ones.

> test/langtools/jdk/javadoc/lib/javadoc/tester/JavadocTester.java line 1167:
> 
>> 1165:          *
>> 1166:          * @param finder a function to find the next occurrence of an item starting at a given position
>> 1167:          * @param kind   the kind of the item ({@code "text"} or {@code "pattern:} to include in messages
> 
> Suggestion:
> 
>          * @param kind   the kind of the item ({@code "text"} or {@code "pattern"}) to include in messages

oops

> test/langtools/jdk/javadoc/lib/javadoc/tester/JavadocTester.java line 1227:
> 
>> 1225: 
>> 1226:         private int getLineNumber(int pos) {
>> 1227:             Pattern p = Pattern.compile("\\R");
> 
> \R is a Unicode linebreak sequence, which includes more than \n and \r\n. Can \R give us a spurious line, in particular when analysing HTML output?

It seems better to be more tolerant than pedantic in this case.

-------------

PR: https://git.openjdk.java.net/jdk/pull/5743


More information about the javadoc-dev mailing list