/* * Copyright (c) 2015, 2016, 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 8131019 8169561 * @summary Test JavadocFormatter * @library /tools/lib * @modules jdk.compiler/jdk.internal.shellsupport.doc * @run testng JavadocFormatterTest */ import java.util.Objects; import jdk.internal.shellsupport.doc.JavadocFormatter; import org.testng.annotations.Test; @Test public class JavadocFormatterTest { private static final String CODE_RESET = "\033[0m"; private static final String CODE_HIGHLIGHT = "\033[1m"; private static final String CODE_UNDERLINE = "\033[4m"; public void testReflow() { String actual; String expected; actual = new JavadocFormatter(25, true).formatJavadoc( "test", "1234 1234\n1234\n1234 12345 123456789012345678901234567890 1234 1234\n1234 {@code 1234} 1234 1234\n1234 1234 123456 123456\n<b>123456</b>\n123456 123456 {@link String string} 1"); expected = CODE_HIGHLIGHT + "test" + CODE_RESET + "\n" + "1234 1234 1234 1234 12345\n" + "123456789012345678901234567890\n" + "1234 1234 1234 1234 1234\n" + "1234 1234 1234 123456\n" + "123456 123456 123456\n" + "123456 string 1\n"; if (!Objects.equals(actual, expected)) { throw new AssertionError("Incorrect output: " + actual); } actual = new JavadocFormatter(66, true).formatJavadoc("test", "@param <T> 51234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + "@param <E> 61234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + "@param shortName 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 " + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 \n" + "@param aVeryLongName1234567890123456789012345678901234567890 " + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 " + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 " + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 \n"); expected = CODE_HIGHLIGHT + "test" + CODE_RESET + "\n" + "\n" + CODE_UNDERLINE + "Type Parameters:" + CODE_RESET + "\n" + "T - 51234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + "E - 61234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + "\n" + CODE_UNDERLINE + "Parameters:" + CODE_RESET + "\n" + "shortName - 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234\n" + "aVeryLongName1234567890123456789012345678901234567890 - \n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n"; if (!Objects.equals(actual, expected)) { throw new AssertionError("Incorrect output: " + actual); } actual = new JavadocFormatter(66, true).formatJavadoc("test", "@throws ShortExcp 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 " + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 \n" + "@throws aVeryLongException1234567890123456789012345678901234567890 " + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 " + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 " + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 \n"); expected = CODE_HIGHLIGHT + "test" + CODE_RESET + "\n" + "\n" + CODE_UNDERLINE + "Thrown Exceptions:" + CODE_RESET + "\n" + "ShortExcp - 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234\n" + "aVeryLongException1234567890123456789012345678901234567890 - \n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n"; if (!Objects.equals(actual, expected)) { throw new AssertionError("Incorrect output: " + actual); } actual = new JavadocFormatter(66, true).formatJavadoc("test", "@return 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 " + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 \n"); expected = CODE_HIGHLIGHT + "test" + CODE_RESET + "\n" + "\n" + CODE_UNDERLINE + "Returns:" + CODE_RESET + "\n" + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + "1234 1234 1234 1234 1234 1234 1234 1234 1234\n"; if (!Objects.equals(actual, expected)) { throw new AssertionError("Incorrect output: " + actual); } //handling of <p>, <pre>: actual = new JavadocFormatter(66, true).formatJavadoc("test", "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 " + "1234 1234 1234 1234 1234 <p>1234 1234 <p>1234 1234 1234 1234 1234 " + "1234 1234 1234 1234 1234 1234 1234 1234 <p>1234 1234 1234 1234 " + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 \n" + "<blockquote><pre>\n" + "for (String data : content) {\n" + " System.err.println(data);\n" + "}\n" + "</pre></blockquote>\n"); expected = CODE_HIGHLIGHT + "test" + CODE_RESET + "\n" + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + "1234 1234 1234 1234\n" + "1234 1234\n" + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + "1234 1234 1234\n" + " for (String data : content) {\n" + " System.err.println(data);\n" + " }\n" + " \n"; if (!Objects.equals(actual, expected)) { throw new AssertionError("Incorrect output: " + actual); } //list handling: actual = new JavadocFormatter(66, true).formatJavadoc("test", "<ul>" + " <li>A 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234</li>" + " <li>B 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234" + " <li>C 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234<ol>" + " <li>D 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234</li>" + " <li>E 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234<ul>" + " <li>F 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234<ol>" + " <li>G 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234" + " </ol>" + " </ul>" + " </OL>" + " <LI><p>H 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 <p>1234 1234 1234 1234 1234 1234 1234<ul>" + " <li>I 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234" + " </ul>" + "</ul> followup" + "<dl>" + "<dt>Term1</dt>" + "<dd>A 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234</dd>" + "<dt>Term2" + "<dd>B 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234" + "<dt>Term3" + "<dd>C 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234" + "</dl>" + "<dl>" + "<dt>TermUnfinished" + "</dl> followup"); expected = CODE_HIGHLIGHT + "test" + CODE_RESET + "\n" + " * A 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234\n" + " * B 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234\n" + " * C 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234\n" + " 1. D 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234\n" + " 2. E 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234\n" + " * F 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234\n" + " 1. G 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234\n" + " * H 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234\n" + " * I 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234\n" + "followup\n" + CODE_HIGHLIGHT + "Term1" + CODE_RESET + "\n" + " A 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234\n" + CODE_HIGHLIGHT + "Term2" + CODE_RESET + "\n" + " B 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234\n" + CODE_HIGHLIGHT + "Term3" + CODE_RESET + "\n" + " C 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234\n" + CODE_HIGHLIGHT + "TermUnfinished" + CODE_RESET + "\n" + "followup\n"; if (!Objects.equals(actual, expected)) { throw new AssertionError("Incorrect output: " + actual); } //sections: actual = new JavadocFormatter(66, true).formatJavadoc("test", "text 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 " + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 " + "<h3>1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234</h3>" + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 " + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234"); expected = CODE_HIGHLIGHT + "test" + CODE_RESET + "\n" + "text 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + "1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + "\n" + CODE_UNDERLINE + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + "1234 1234 1234 1234 1234" + CODE_RESET + "\n" + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + "1234 1234 1234 1234 1234 1234 1234 1234\n"; if (!Objects.equals(actual, expected)) { throw new AssertionError("Incorrect output: " + actual); } //table: actual = new JavadocFormatter(66, true).formatJavadoc("test", "<table>" + "<tr>" + "<th>A 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234</th>" + "<th>B 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234</th>" + "<th>C 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234</th>" + "</tr>" + "<tr>" + "<td>A 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234</td> \n" + "<td>B 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234" + "<td>C 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234" + "<tr>" + "<td>A 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234</td>" + "<td>B 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234</td>" + "<td>C 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234</td>" + "</tr>" + "<tr>" + "<td>1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234</td>" + "<td>1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234</td>" + "</table>"); expected = CODE_HIGHLIGHT + "test" + CODE_RESET + "\n" + "----------------------------------------------------------------\n" + "| " + CODE_HIGHLIGHT + "A 1234 1234 1234" + CODE_RESET + " | " + CODE_HIGHLIGHT + "B 1234 1234 1234" + CODE_RESET + " | " + CODE_HIGHLIGHT + "C 1234 1234 1234" + CODE_RESET + " |\n" + "| " + CODE_HIGHLIGHT + "1234 1234 1234" + CODE_RESET + " | " + CODE_HIGHLIGHT + "1234 1234 1234" + CODE_RESET + " | " + CODE_HIGHLIGHT + "1234 1234 1234" + CODE_RESET + " |\n" + "| " + CODE_HIGHLIGHT + "1234 1234 1234" + CODE_RESET + " | " + CODE_HIGHLIGHT + "1234 1234 1234" + CODE_RESET + " | " + CODE_HIGHLIGHT + "1234 1234 1234" + CODE_RESET + " |\n" + "| " + CODE_HIGHLIGHT + "1234 1234 1234" + CODE_RESET + " | " + CODE_HIGHLIGHT + "1234 1234 1234" + CODE_RESET + " | " + CODE_HIGHLIGHT + "1234 1234 1234" + CODE_RESET + " |\n" + "| " + CODE_HIGHLIGHT + "1234 1234 1234" + CODE_RESET + " | " + CODE_HIGHLIGHT + "1234 1234 1234" + CODE_RESET + " | " + CODE_HIGHLIGHT + "1234 1234 1234" + CODE_RESET + " |\n" + "| " + CODE_HIGHLIGHT + "1234 1234" + CODE_RESET + " | " + CODE_HIGHLIGHT + "1234 1234" + CODE_RESET + " | " + CODE_HIGHLIGHT + "1234 1234" + CODE_RESET + " |\n" + "----------------------------------------------------------------\n" + "| A 1234 1234 1234 | B 1234 1234 1234 | C 1234 1234 1234 |\n" + "| 1234 1234 1234 | 1234 1234 1234 | 1234 1234 1234 |\n" + "| 1234 1234 1234 | 1234 1234 1234 | 1234 1234 1234 |\n" + "| 1234 1234 1234 | 1234 1234 1234 | 1234 1234 1234 |\n" + "| 1234 1234 1234 | 1234 1234 1234 | 1234 1234 1234 |\n" + "| 1234 1234 | 1234 1234 | 1234 1234 |\n" + "----------------------------------------------------------------\n" + "| A 1234 1234 1234 | B 1234 1234 1234 | C 1234 1234 1234 |\n" + "| 1234 1234 1234 | 1234 1234 1234 | 1234 1234 1234 |\n" + "| 1234 1234 1234 | 1234 1234 1234 | 1234 1234 1234 |\n" + "| 1234 1234 1234 | 1234 1234 1234 | 1234 1234 1234 |\n" + "| 1234 1234 1234 | 1234 1234 1234 | 1234 1234 1234 |\n" + "| 1234 1234 | 1234 1234 | 1234 1234 |\n" + "----------------------------------------------------------------\n" + "| 1234 1234 1234 | 1234 1234 1234 |\n" + "| 1234 1234 1234 | 1234 1234 1234 |\n" + "| 1234 1234 1234 | 1234 1234 1234 |\n" + "| 1234 1234 1234 | 1234 1234 1234 |\n" + "| 1234 1234 1234 | 1234 1234 1234 |\n" + "| 1234 1234 | 1234 1234 |\n" + "-------------------------------------------\n"; if (!Objects.equals(actual, expected)) { throw new AssertionError("Incorrect output: " + actual); } //no escape sequences: actual = new JavadocFormatter(66, false).formatJavadoc("test", "@param shortName 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 " + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 \n" + "@param aVeryLongName1234567890123456789012345678901234567890 " + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 " + "1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 " + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 \n"); expected = "test\n" + "\n" + "Parameters:\n" + "shortName - 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234\n" + "aVeryLongName1234567890123456789012345678901234567890 - \n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n" + " 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 1234\n"; if (!Objects.equals(actual, expected)) { throw new AssertionError("Incorrect output: " + actual); } //null javadoc: actual = new JavadocFormatter(66, true).formatJavadoc("test", null); expected = CODE_HIGHLIGHT + "test" + CODE_RESET + "\n"; if (!Objects.equals(actual, expected)) { throw new AssertionError("Incorrect output: " + actual); } //stray tags: for (String tag : new String[] {"li", "ol", "h3", "table", "tr", "td", "dl", "dt", "dd"}) { for (boolean closing : new boolean[] {false, true}) { actual = new JavadocFormatter(66, true).formatJavadoc("test", "<" + (closing ? "/" : "") + tag + ">text"); if (!actual.contains("text")) { throw new AssertionError("Incorrect output: " + actual); } } } //entities: actual = new JavadocFormatter(66, false).formatJavadoc("test", "α < A B > &broken; � �\n"); expected = "test\n" + "\u03b1 < A B > &broken; � �\n"; if (!Objects.equals(actual, expected)) { throw new AssertionError("Incorrect output: " + actual); } //img: actual = new JavadocFormatter(66, true).formatJavadoc("test", "1234 <img src='any.png' alt='text'/> 1234"); expected = CODE_HIGHLIGHT + "test" + CODE_RESET + "\n" + "1234 text 1234\n"; if (!Objects.equals(actual, expected)) { throw new AssertionError("Incorrect output: " + actual); } //unknown HTML tag: actual = new JavadocFormatter(66, false).formatJavadoc("test", "1234 <unknown any any>1234</unknown> 1234"); expected = "test\n" + "1234 1234 1234\n"; if (!Objects.equals(actual, expected)) { throw new AssertionError("Incorrect output: " + actual); } } }