1 /* 2 * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @bug 6786688 8008164 27 * @summary HTML tables should have table summary, caption and table headers. 28 * @author Bhavesh Patel 29 * @library ../lib 30 * @modules jdk.javadoc 31 * @build JavadocTester 32 * @run main TestHtmlTableTags 33 */ 34 35 public class TestHtmlTableTags extends JavadocTester { 36 37 //Javadoc arguments. 38 private static final String[] ARGS = new String[] { 39 40 }; 41 42 43 public static void main(String... args) throws Exception { 44 TestHtmlTableTags tester = new TestHtmlTableTags(); 45 tester.runTests(); 46 } 47 48 @Test 49 void test() { 50 javadoc("-d", "out", 51 "-sourcepath", testSrc, 52 "-use", 53 "pkg1", "pkg2"); 54 checkExit(Exit.OK); 55 56 checkHtmlTableSummaries(); 57 checkHtmlTableCaptions(); 58 checkHtmlTableHeaders(); 59 } 60 61 /* 62 * Tests for validating summary for HTML tables 63 */ 64 void checkHtmlTableSummaries() { 65 //Package summary 66 checkOutput("pkg1/package-summary.html", true, 67 "<table class=\"typeSummary\" summary=\"Class Summary table, " 68 + "listing classes, and an explanation\">", 69 "<table class=\"typeSummary\" summary=\"Interface Summary table, " 70 + "listing interfaces, and an explanation\">"); 71 72 checkOutput("pkg2/package-summary.html", true, 73 "<table class=\"typeSummary\" summary=\"Enum Summary table, " 74 + "listing enums, and an explanation\">", 75 "<table class=\"typeSummary\" summary=\"Annotation Types Summary table, " 76 + "listing annotation types, and an explanation\">"); 77 78 // Class documentation 79 checkOutput("pkg1/C1.html", true, 80 "<table class=\"memberSummary\" summary=\"Field Summary table, listing fields, " 81 + "and an explanation\">", 82 "<table class=\"memberSummary\" summary=\"Method Summary table, listing methods, " 83 + "and an explanation\">"); 84 85 checkOutput("pkg2/C2.html", true, 86 "<table class=\"memberSummary\" summary=\"Nested Class Summary table, listing " 87 + "nested classes, and an explanation\">", 88 "<table class=\"memberSummary\" summary=\"Constructor Summary table, listing " 89 + "constructors, and an explanation\">"); 90 91 checkOutput("pkg2/C2.ModalExclusionType.html", true, 92 "<table class=\"memberSummary\" summary=\"Enum Constant Summary table, listing " 93 + "enum constants, and an explanation\">"); 94 95 checkOutput("pkg2/C3.html", true, 96 "<table class=\"memberSummary\" summary=\"Required Element Summary table, " 97 + "listing required elements, and an explanation\">"); 98 99 checkOutput("pkg2/C4.html", true, 100 "<table class=\"memberSummary\" summary=\"Optional Element Summary table, " 101 + "listing optional elements, and an explanation\">"); 102 103 // Class use documentation 104 checkOutput("pkg1/class-use/I1.html", true, 105 "<table class=\"useSummary\" summary=\"Use table, listing packages, and an explanation\">"); 106 107 checkOutput("pkg1/class-use/C1.html", true, 108 "<table class=\"useSummary\" summary=\"Use table, listing fields, and an explanation\">", 109 "<table class=\"useSummary\" summary=\"Use table, listing methods, and an explanation\">"); 110 111 checkOutput("pkg2/class-use/C2.html", true, 112 "<table class=\"useSummary\" summary=\"Use table, listing fields, and an explanation\">", 113 "<table class=\"useSummary\" summary=\"Use table, listing methods, and an explanation\">"); 114 115 checkOutput("pkg2/class-use/C2.ModalExclusionType.html", true, 116 "<table class=\"useSummary\" summary=\"Use table, listing packages, and an explanation\">"); 117 118 checkOutput("pkg2/class-use/C2.ModalExclusionType.html", true, 119 "<table class=\"useSummary\" summary=\"Use table, listing methods, and an explanation\">"); 120 121 // Package use documentation 122 checkOutput("pkg1/package-use.html", true, 123 "<table class=\"useSummary\" summary=\"Use table, listing packages, and an explanation\">", 124 "<table class=\"useSummary\" summary=\"Use table, listing classes, and an explanation\">"); 125 126 checkOutput("pkg2/package-use.html", true, 127 "<table class=\"useSummary\" summary=\"Use table, listing packages, and an explanation\">", 128 "<table class=\"useSummary\" summary=\"Use table, listing classes, and an explanation\">"); 129 130 // Deprecated 131 checkOutput("deprecated-list.html", true, 132 "<table class=\"deprecatedSummary\" summary=\"Deprecated Fields table, listing deprecated fields, " 133 + "and an explanation\">", 134 "<table class=\"deprecatedSummary\" summary=\"Deprecated Methods table, listing deprecated methods, " 135 + "and an explanation\">"); 136 137 // Constant values 138 checkOutput("constant-values.html", true, 139 "<table class=\"constantsSummary\" summary=\"Constant Field Values table, listing " 140 + "constant fields, and values\">"); 141 142 // Overview Summary 143 checkOutput("overview-summary.html", true, 144 "<table class=\"overviewSummary\" " 145 + "summary=\"Packages table, listing packages, and an explanation\">"); 146 } 147 148 /* 149 * Tests for validating caption for HTML tables 150 */ 151 void checkHtmlTableCaptions() { 152 //Package summary 153 checkOutput("pkg1/package-summary.html", true, 154 "<caption><span>Class Summary</span><span class=\"tabEnd\">" 155 + " </span></caption>", 156 "<caption><span>Interface Summary</span><span class=\"tabEnd\">" 157 + " </span></caption>"); 158 159 checkOutput("pkg2/package-summary.html", true, 160 "<caption><span>Enum Summary</span><span class=\"tabEnd\">" 161 + " </span></caption>", 162 "<caption><span>Annotation Types Summary</span><span class=\"tabEnd\">" 163 + " </span></caption>"); 164 165 // Class documentation 166 checkOutput("pkg1/C1.html", true, 167 "<caption><span>Fields</span><span class=\"tabEnd\"> </span></caption>", 168 "<caption><span id=\"t0\" class=\"activeTableTab\"><span>All " 169 + "Methods</span><span class=\"tabEnd\"> </span></span>" 170 + "<span id=\"t2\" class=\"tableTab\"><span><a href=\"javascript:show(2);\">" 171 + "Instance Methods</a></span><span class=\"tabEnd\"> </span></span>" 172 + "<span id=\"t4\" class=\"tableTab\"><span><a href=\"javascript:show(8);\">" 173 + "Concrete Methods</a></span><span class=\"tabEnd\"> </span></span>" 174 + "<span id=\"t6\" class=\"tableTab\"><span><a href=\"javascript:show(32);\">" 175 + "Deprecated Methods</a></span><span class=\"tabEnd\"> </span></span>" 176 + "</caption>"); 177 178 checkOutput("pkg2/C2.html", true, 179 "<caption><span>Nested Classes</span><span class=\"tabEnd\"> </span></caption>", 180 "<caption><span>Constructors</span><span class=\"tabEnd\"> </span></caption>"); 181 182 checkOutput("pkg2/C2.ModalExclusionType.html", true, 183 "<caption><span>Enum Constants</span><span class=\"tabEnd\"> </span></caption>"); 184 185 checkOutput("pkg2/C3.html", true, 186 "<caption><span>Required Elements</span><span class=\"tabEnd\"> " 187 + "</span></caption>"); 188 189 checkOutput("pkg2/C4.html", true, 190 "<caption><span>Optional Elements</span><span class=\"tabEnd\"> " 191 + "</span></caption>"); 192 193 // Class use documentation 194 checkOutput("pkg1/class-use/I1.html", true, 195 "<caption><span>Packages that use <a href=\"../../pkg1/I1.html\" " 196 + "title=\"interface in pkg1\">I1</a></span><span class=\"tabEnd\">" 197 + " </span></caption>"); 198 199 checkOutput("pkg1/class-use/C1.html", true, 200 "<caption><span>Fields in <a href=\"../../pkg2/package-summary.html\">" 201 + "pkg2</a> declared as <a href=\"../../pkg1/C1.html\" " 202 + "title=\"class in pkg1\">C1</a></span><span class=\"tabEnd\"> " 203 + "</span></caption>", 204 "<caption><span>Methods in <a href=\"../../pkg2/package-summary.html\">" 205 + "pkg2</a> that return <a href=\"../../pkg1/C1.html\" " 206 + "title=\"class in pkg1\">C1</a></span><span class=\"tabEnd\">" 207 + " </span></caption>"); 208 209 checkOutput("pkg2/class-use/C2.html", true, 210 "<caption><span>Fields in <a href=\"../../pkg1/package-summary.html\">" 211 + "pkg1</a> declared as <a href=\"../../pkg2/C2.html\" " 212 + "title=\"class in pkg2\">C2</a></span><span class=\"tabEnd\">" 213 + " </span></caption>", 214 "<caption><span>Methods in <a href=\"../../pkg1/package-summary.html\">" 215 + "pkg1</a> that return <a href=\"../../pkg2/C2.html\" " 216 + "title=\"class in pkg2\">C2</a></span><span class=\"tabEnd\">" 217 + " </span></caption>"); 218 219 checkOutput("pkg2/class-use/C2.ModalExclusionType.html", true, 220 "<caption><span>Methods in <a href=\"../../pkg2/package-summary.html\">" 221 + "pkg2</a> that return <a href=\"../../pkg2/C2.ModalExclusionType.html\" " 222 + "title=\"enum in pkg2\">C2.ModalExclusionType</a></span>" 223 + "<span class=\"tabEnd\"> </span></caption>"); 224 225 // Package use documentation 226 checkOutput("pkg1/package-use.html", true, 227 "<caption><span>Packages that use <a href=\"../pkg1/package-summary.html\">" 228 + "pkg1</a></span><span class=\"tabEnd\"> </span></caption>", 229 "<caption><span>Classes in <a href=\"../pkg1/package-summary.html\">" 230 + "pkg1</a> used by <a href=\"../pkg1/package-summary.html\">pkg1</a>" 231 + "</span><span class=\"tabEnd\"> </span></caption>"); 232 233 checkOutput("pkg2/package-use.html", true, 234 "<caption><span>Packages that use <a href=\"../pkg2/package-summary.html\">" 235 + "pkg2</a></span><span class=\"tabEnd\"> </span></caption>", 236 "<caption><span>Classes in <a href=\"../pkg2/package-summary.html\">" 237 + "pkg2</a> used by <a href=\"../pkg1/package-summary.html\">pkg1</a>" 238 + "</span><span class=\"tabEnd\"> </span></caption>"); 239 240 // Deprecated 241 checkOutput("deprecated-list.html", true, 242 "<caption><span>Deprecated Fields</span><span class=\"tabEnd\">" 243 + " </span></caption>", 244 "<caption><span>Deprecated Methods</span><span class=\"tabEnd\">" 245 + " </span></caption>"); 246 247 // Constant values 248 checkOutput("constant-values.html", true, 249 "<caption><span>pkg1.<a href=\"pkg1/C1.html\" title=\"class in pkg1\">" 250 + "C1</a></span><span class=\"tabEnd\"> </span></caption>"); 251 252 // Overview Summary 253 checkOutput("overview-summary.html", true, 254 "<caption><span>Packages</span><span class=\"tabEnd\"> </span></caption>"); 255 } 256 257 /* 258 * Test for validating headers for HTML tables 259 */ 260 void checkHtmlTableHeaders() { 261 //Package summary 262 checkOutput("pkg1/package-summary.html", true, 263 "<th class=\"colFirst\" scope=\"col\">" 264 + "Class</th>\n" 265 + "<th class=\"colLast\" scope=\"col\"" 266 + ">Description</th>", 267 "<th class=\"colFirst\" scope=\"col\">" 268 + "Interface</th>\n" 269 + "<th class=\"colLast\" scope=\"col\"" 270 + ">Description</th>"); 271 272 checkOutput("pkg2/package-summary.html", true, 273 "<th class=\"colFirst\" scope=\"col\">" 274 + "Enum</th>\n" 275 + "<th class=\"colLast\" scope=\"col\"" 276 + ">Description</th>", 277 "<th class=\"colFirst\" scope=\"col\">" 278 + "Annotation Type</th>\n" 279 + "<th class=\"colLast\"" 280 + " scope=\"col\">Description</th>"); 281 282 // Class documentation 283 checkOutput("pkg1/C1.html", true, 284 "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>\n" 285 + "<th class=\"colLast\" scope=\"col\">Field and Description</th>", 286 "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>\n" 287 + "<th class=\"colLast\" scope=\"col\">Method and Description</th>"); 288 289 checkOutput("pkg2/C2.html", true, 290 "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>\n" 291 + "<th class=\"colLast\" scope=\"col\">Class and Description</th>", 292 "<th class=\"colOne\" scope=\"col\">Constructor and Description</th>"); 293 294 checkOutput("pkg2/C2.ModalExclusionType.html", true, 295 "<th class=\"colOne\" scope=\"col\">Enum Constant and Description</th>"); 296 297 checkOutput("pkg2/C3.html", true, 298 "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>\n" 299 + "<th class=\"colLast\" scope=\"col\">Required Element and Description</th>"); 300 301 checkOutput("pkg2/C4.html", true, 302 "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>\n" 303 + "<th class=\"colLast\" scope=\"col\">Optional Element and Description</th>"); 304 305 // Class use documentation 306 checkOutput("pkg1/class-use/I1.html", true, 307 "<th class=\"colFirst\" scope=\"col\">Package</th>\n" 308 + "<th class=\"colLast\" scope=\"col\">Description</th>"); 309 310 checkOutput("pkg1/class-use/C1.html", true, 311 "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>\n" 312 + "<th class=\"colLast\" scope=\"col\">Field and Description</th>", 313 "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>\n" 314 + "<th class=\"colLast\" scope=\"col\">Method and Description</th>"); 315 316 checkOutput("pkg2/class-use/C2.html", true, 317 "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>\n" 318 + "<th class=\"colLast\" scope=\"col\">Field and Description</th>", 319 "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>\n" 320 + "<th class=\"colLast\" scope=\"col\">Method and Description</th>"); 321 322 checkOutput("pkg2/class-use/C2.ModalExclusionType.html", true, 323 "<th class=\"colFirst\" scope=\"col\">Package</th>\n" 324 + "<th class=\"colLast\" scope=\"col\">Description</th>", 325 "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>\n" 326 + "<th class=\"colLast\" scope=\"col\">Method and Description</th>"); 327 328 // Package use documentation 329 checkOutput("pkg1/package-use.html", true, 330 "<th class=\"colFirst\" scope=\"col\">Package</th>\n" 331 + "<th class=\"colLast\" scope=\"col\">Description</th>", 332 "<th class=\"colOne\" scope=\"col\">Class and Description</th>"); 333 334 checkOutput("pkg2/package-use.html", true, 335 "<th class=\"colFirst\" scope=\"col\">Package</th>\n" 336 + "<th class=\"colLast\" scope=\"col\">Description</th>", 337 "<th class=\"colOne\" scope=\"col\">Class and Description</th>"); 338 339 // Deprecated 340 checkOutput("deprecated-list.html", true, 341 "<th class=\"colOne\" scope=\"col\">Field and Description</th>", 342 "<th class=\"colOne\" scope=\"col\">Method and Description</th>"); 343 344 // Constant values 345 checkOutput("constant-values.html", true, 346 "<th class=\"colFirst\" scope=\"col\">" 347 + "Modifier and Type</th>\n" 348 + "<th" 349 + " scope=\"col\">Constant Field</th>\n" 350 + "<th class=\"colLast\" scope=\"col\">Value</th>"); 351 352 // Overview Summary 353 checkOutput("overview-summary.html", true, 354 "<th class=\"colFirst\" scope=\"col\">" 355 + "Package</th>\n" 356 + "<th class=\"colLast\" scope=\"col\"" 357 + ">Description</th>"); 358 } 359 }