1 /* 2 * Copyright (c) 2017, 2018, 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 8178067 8192007 8182765 27 * @summary tests the module's services, such as provides and uses 28 * @modules jdk.javadoc/jdk.javadoc.internal.api 29 * jdk.javadoc/jdk.javadoc.internal.tool 30 * jdk.compiler/com.sun.tools.javac.api 31 * jdk.compiler/com.sun.tools.javac.main 32 * @library ../lib /tools/lib 33 * @build toolbox.ToolBox toolbox.ModuleBuilder JavadocTester 34 * @run main TestModuleServices 35 */ 36 37 import java.nio.file.Files; 38 import java.nio.file.Path; 39 import java.nio.file.Paths; 40 41 import toolbox.*; 42 43 public class TestModuleServices extends JavadocTester { 44 45 public final ToolBox tb; main(String... args)46 public static void main(String... args) throws Exception { 47 TestModuleServices tester = new TestModuleServices(); 48 tester.runTests(m -> new Object[] { Paths.get(m.getName()) }); 49 } 50 TestModuleServices()51 public TestModuleServices() { 52 tb = new ToolBox(); 53 } 54 55 @Test checkModuleServicesDescription(Path base)56 public void checkModuleServicesDescription(Path base) throws Exception { 57 Path src = Files.createDirectories(base.resolve("src")); 58 ModuleBuilder mb = new ModuleBuilder(tb, "moduleService") 59 .comment("This module exports a package containing the declaration of a service type.") 60 .exports("pkgService") 61 .classes("/**A Package that has a service.*/ package pkgService;") 62 .classes("package pkgService; /**A service Interface for service providers.*/ " 63 + "public interface Service {\n" 64 + " /**\n" 65 + " * A test method for the service.\n" 66 + " */\n" 67 + " void testMethod1();\n" 68 + " /**\n" 69 + " * Another test method for the service.\n" 70 + " */\n" 71 + " void testMethod2();\n" 72 + "}"); 73 mb.write(src); 74 mb = new ModuleBuilder(tb, "moduleServiceProvider") 75 .comment("This module provides an implementation of a service.\n" + 76 "@provides pkgService.Service Provides a service whose name is ServiceProvider.") 77 .requires("moduleService") 78 .provides("pkgService.Service", "pkgServiceProvider.ServiceProvider") 79 .classes("/**A Package that has a service provider.*/ package pkgServiceProvider;") 80 .classes("package pkgServiceProvider;\n" 81 + "public class ServiceProvider implements pkgService.Service {\n" 82 + " /**\n" 83 + " * {@inheritDoc}\n" 84 + " */\n" 85 + " public void testMethod1() {}\n" 86 + " /**\n" 87 + " * This is an internal implementation so the documentation will not be seen.\n" 88 + " */\n" 89 + " public void testMethod2() {}\n" 90 + "}"); 91 mb.write(src); 92 mb = new ModuleBuilder(tb, "moduleServiceUser") 93 .comment("This module uses a service defined in another module.\n" 94 + "@uses pkgService.Service If no other provider is found, a default internal implementation will be used.") 95 .requires("moduleService") 96 .uses("pkgService.Service") 97 .classes("/**A Package that has a service user.*/ package pkgServiceUser;") 98 .classes("package pkgServiceUser;\n" 99 + "/**\n" 100 + " * A service user class.\n" 101 + " */\n" 102 + "public class ServiceUser {\n" 103 + "}"); 104 mb.write(src); 105 mb = new ModuleBuilder(tb, "moduleServiceUserNoDescription") 106 .comment("This is another module that uses a service defined in another module.\n" 107 + "@uses pkgService.Service") 108 .requires("moduleService") 109 .uses("pkgService.Service") 110 .classes("/**A Package that has a service user with no description.*/ package pkgServiceUserNoDescription;") 111 .classes("package pkgServiceUserNoDescription;\n" 112 + "/**\n" 113 + " * A service user class.\n" 114 + " */\n" 115 + "public class ServiceUserNoDescription {\n" 116 + "}"); 117 mb.write(src); 118 119 javadoc("-d", base.resolve("out").toString(), 120 "-quiet", 121 "-noindex", 122 "--module-source-path", src.toString(), 123 "--module", "moduleService,moduleServiceProvider,moduleServiceUser,moduleServiceUserNoDescription", 124 "pkgService", "moduleServiceProvider/pkgServiceProvider", "moduleServiceUser/pkgServiceUser", 125 "moduleServiceUserNoDescription/pkgServiceUserNoDescription"); 126 checkExit(Exit.OK); 127 128 checkOutput("moduleServiceProvider/module-summary.html", true, 129 "<tr class=\"altColor\">\n" 130 + "<th class=\"colFirst\" scope=\"row\"><a href=\"../moduleService/pkgService/Service.html\" " 131 + "title=\"interface in pkgService\">Service</a></th>\n" 132 + "<td class=\"colLast\">\n" 133 + "<div class=\"block\">Provides a service whose name is ServiceProvider.</div>\n" 134 + "</td>\n" 135 + "</tr>"); 136 checkOutput("moduleServiceUser/module-summary.html", true, 137 "<tr class=\"altColor\">\n" 138 + "<th class=\"colFirst\" scope=\"row\"><a href=\"../moduleService/pkgService/Service.html\" title=\"interface in pkgService\">Service</a></th>\n" 139 + "<td class=\"colLast\">\n" 140 + "<div class=\"block\">If no other provider is found, a default internal implementation will be used.</div>\n" 141 + "</td>\n" 142 + "</tr>"); 143 checkOutput("moduleServiceUserNoDescription/module-summary.html", true, 144 "<tr class=\"altColor\">\n" 145 + "<th class=\"colFirst\" scope=\"row\"><a href=\"../moduleService/pkgService/Service.html\" title=\"interface in pkgService\">Service</a></th>\n" 146 + "<td class=\"colLast\">\n" 147 + "<div class=\"block\">A service Interface for service providers.</div>\n" 148 + "</td>\n" 149 + "</tr>"); 150 checkOutput("moduleServiceProvider/module-summary.html", false, 151 "A service Interface for service providers."); 152 checkOutput("moduleServiceUser/module-summary.html", false, 153 "A service Interface for service providers."); 154 } 155 156 @Test checkUsesNoApiTagModuleModeDefault(Path base)157 public void checkUsesNoApiTagModuleModeDefault(Path base) throws Exception { 158 ModuleBuilder mb = new ModuleBuilder(tb, "m") 159 .comment("module m.\n@provides p1.A abc") // bogus tag 160 .uses("p1.A") 161 .uses("p1.B") 162 .exports("p1") 163 .classes("package p1; public class A {}") 164 .classes("package p1; public class B {}"); 165 mb.write(base); 166 167 javadoc("-d", base.toString() + "/out", 168 "-quiet", 169 "--module-source-path", base.toString(), 170 "--module", "m"); 171 checkExit(Exit.OK); 172 173 checkOutput("m/module-summary.html", false, 174 "<h3>Services</h3>"); 175 } 176 177 @Test checkUsesNoApiTagModuleModeAll(Path base)178 public void checkUsesNoApiTagModuleModeAll(Path base) throws Exception { 179 ModuleBuilder mb = new ModuleBuilder(tb, "m") 180 .uses("p1.A") 181 .uses("p1.B") 182 .exports("p1") 183 .classes("package p1; public class A {}") 184 .classes("package p1; public class B {}"); 185 mb.write(base); 186 187 javadoc("-d", base.toString() + "/out", 188 "-quiet", 189 "--show-module-contents", "all", 190 "--module-source-path", base.toString(), 191 "--module", "m"); 192 checkExit(Exit.OK); 193 194 checkOutput("m/module-summary.html", true, 195 "<h3>Services</h3>"); 196 197 checkOutput("m/module-summary.html", true, 198 "<table class=\"usesSummary\">\n" + 199 "<caption><span>Uses</span><span class=\"tabEnd\"> </span></caption>\n" + 200 "<tr>\n" + 201 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" + 202 "<th class=\"colLast\" scope=\"col\">Description</th>\n" + 203 "</tr>\n" + 204 "<tbody>\n" + 205 "<tr class=\"altColor\">\n" + 206 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"class in p1\">A</a></th>\n" + 207 "<td class=\"colLast\"> </td>\n" + 208 "</tr>\n" + 209 "<tr class=\"rowColor\">\n" + 210 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/B.html\" title=\"class in p1\">B</a></th>\n" + 211 "<td class=\"colLast\"> </td>\n" + 212 "</tr>\n" + 213 "</tbody>\n" + 214 "</table>\n"); 215 216 javadoc("-d", base.toString() + "/out-html4", 217 "-html4", 218 "-quiet", 219 "--show-module-contents", "all", 220 "--module-source-path", base.toString(), 221 "--module", "m"); 222 checkExit(Exit.OK); 223 224 checkOutput("m/module-summary.html", true, 225 "<table class=\"usesSummary\" summary=\"Uses table, listing types, and an explanation\">\n" + 226 "<caption><span>Uses</span><span class=\"tabEnd\"> </span></caption>\n" + 227 "<tr>\n" + 228 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" + 229 "<th class=\"colLast\" scope=\"col\">Description</th>\n" + 230 "</tr>\n" + 231 "<tbody>\n" + 232 "<tr class=\"altColor\">\n" + 233 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"class in p1\">A</a></th>\n" + 234 "<td class=\"colLast\"> </td>\n" + 235 "</tr>\n" + 236 "<tr class=\"rowColor\">\n" + 237 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/B.html\" title=\"class in p1\">B</a></th>\n" + 238 "<td class=\"colLast\"> </td>\n" + 239 "</tr>\n" + 240 "</tbody>\n" + 241 "</table>\n"); 242 } 243 244 @Test checkUsesWithApiTagModuleModeDefault(Path base)245 public void checkUsesWithApiTagModuleModeDefault(Path base) throws Exception { 246 ModuleBuilder mb = new ModuleBuilder(tb, "m") 247 .comment("module m.\n@uses p1.A") 248 .uses("p1.A") 249 .uses("p1.B") 250 .exports("p1") 251 .classes("package p1; public class A {}") 252 .classes("package p1; public class B {}"); 253 mb.write(base); 254 255 javadoc("-d", base.toString() + "/out", 256 "-quiet", 257 "--module-source-path", base.toString(), 258 "--module", "m"); 259 checkExit(Exit.OK); 260 261 checkOutput("m/module-summary.html", true, 262 "<h3>Services</h3>"); 263 264 checkOutput("m/module-summary.html", true, 265 "<table class=\"usesSummary\">\n" + 266 "<caption><span>Uses</span><span class=\"tabEnd\"> </span></caption>\n" + 267 "<tr>\n" + 268 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" + 269 "<th class=\"colLast\" scope=\"col\">Description</th>\n" + 270 "</tr>\n" + 271 "<tbody>\n" + 272 "<tr class=\"altColor\">\n" + 273 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"class in p1\">A</a></th>\n" + 274 "<td class=\"colLast\"> </td>\n" + 275 "</tr>\n" + 276 "</tbody>\n" + 277 "</table>\n"); 278 279 javadoc("-d", base.toString() + "/out-html4", 280 "-html4", 281 "-quiet", 282 "--module-source-path", base.toString(), 283 "--module", "m"); 284 checkExit(Exit.OK); 285 286 checkOutput("m/module-summary.html", true, 287 "<table class=\"usesSummary\" summary=\"Uses table, listing types, and an explanation\">\n" + 288 "<caption><span>Uses</span><span class=\"tabEnd\"> </span></caption>\n" + 289 "<tr>\n" + 290 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" + 291 "<th class=\"colLast\" scope=\"col\">Description</th>\n" + 292 "</tr>\n" + 293 "<tbody>\n" + 294 "<tr class=\"altColor\">\n" + 295 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"class in p1\">A</a></th>\n" + 296 "<td class=\"colLast\"> </td>\n" + 297 "</tr>\n" + 298 "</tbody>\n" + 299 "</table>\n"); 300 } 301 302 @Test checkProvidesNoApiTagModuleModeDefault(Path base)303 public void checkProvidesNoApiTagModuleModeDefault(Path base) throws Exception { 304 ModuleBuilder mb = new ModuleBuilder(tb, "m") 305 .comment("module m.\n@uses p1.A") 306 .provides("p1.A", "p1.B") 307 .exports("p1") 308 .classes("package p1; public interface A {}") 309 .classes("package p1; public class B implements A {}") 310 .provides("p2.A", "p2.B") 311 .exports("p2") 312 .classes("package p2; public interface A {}") 313 .classes("package p2; public class B implements A {}"); 314 mb.write(base); 315 316 javadoc("-d", base.toString() + "/out", 317 "-quiet", 318 "--module-source-path", base.toString(), 319 "--module", "m"); 320 321 checkExit(Exit.OK); 322 323 checkOutput("m/module-summary.html", false, 324 "<h3>Services</h3>"); 325 } 326 327 @Test checkProvidesNoApiTagModuleModeAll(Path base)328 public void checkProvidesNoApiTagModuleModeAll(Path base) throws Exception { 329 ModuleBuilder mb = new ModuleBuilder(tb, "m") 330 .comment("module m.\n@uses p1.A") // bogus uses tag 331 .provides("p1.A", "p1.B") 332 .exports("p1") 333 .classes("package p1; public interface A {}") 334 .classes("package p1; public class B implements A {}") 335 .provides("p2.A", "p2.B") 336 .exports("p2") 337 .classes("package p2; public interface A {}") 338 .classes("package p2; public class B implements A {}"); 339 mb.write(base); 340 341 javadoc("-d", base.toString() + "/out", 342 "-quiet", 343 "--show-module-contents", "all", 344 "--module-source-path", base.toString(), 345 "--module", "m"); 346 347 checkExit(Exit.OK); 348 349 checkOutput("m/module-summary.html", true, 350 "<h3>Services</h3>"); 351 352 checkOutput("m/module-summary.html", true, 353 "<table class=\"providesSummary\">\n" + 354 "<caption><span>Provides</span><span class=\"tabEnd\"> </span></caption>\n" + 355 "<tr>\n" + 356 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" + 357 "<th class=\"colLast\" scope=\"col\">Description</th>\n" + 358 "</tr>\n" + 359 "<tbody>\n" + 360 "<tr class=\"altColor\">\n" + 361 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"interface in p1\">A</a></th>\n" + 362 "<td class=\"colLast\"> <br>(<span class=\"implementationLabel\">Implementation(s):</span> <a href=\"p1/B.html\" title=\"class in p1\">B</a>)</td>\n" + 363 "</tr>\n" + 364 "<tr class=\"rowColor\">\n" + 365 "<th class=\"colFirst\" scope=\"row\"><a href=\"p2/A.html\" title=\"interface in p2\">A</a></th>\n" + 366 "<td class=\"colLast\"> <br>(<span class=\"implementationLabel\">Implementation(s):</span> <a href=\"p2/B.html\" title=\"class in p2\">B</a>)</td>\n" + 367 "</tr>\n" + 368 "</tbody>\n"); 369 370 javadoc("-d", base.toString() + "/out-html4", 371 "-html4", 372 "-quiet", 373 "--show-module-contents", "all", 374 "--module-source-path", base.toString(), 375 "--module", "m"); 376 377 checkExit(Exit.OK); 378 379 checkOutput("m/module-summary.html", true, 380 "<table class=\"providesSummary\" summary=\"Provides table, listing types, and an explanation\">\n" + 381 "<caption><span>Provides</span><span class=\"tabEnd\"> </span></caption>\n" + 382 "<tr>\n" + 383 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" + 384 "<th class=\"colLast\" scope=\"col\">Description</th>\n" + 385 "</tr>\n" + 386 "<tbody>\n" + 387 "<tr class=\"altColor\">\n" + 388 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"interface in p1\">A</a></th>\n" + 389 "<td class=\"colLast\"> <br>(<span class=\"implementationLabel\">Implementation(s):</span> <a href=\"p1/B.html\" title=\"class in p1\">B</a>)</td>\n" + 390 "</tr>\n" + 391 "<tr class=\"rowColor\">\n" + 392 "<th class=\"colFirst\" scope=\"row\"><a href=\"p2/A.html\" title=\"interface in p2\">A</a></th>\n" + 393 "<td class=\"colLast\"> <br>(<span class=\"implementationLabel\">Implementation(s):</span> <a href=\"p2/B.html\" title=\"class in p2\">B</a>)</td>\n" + 394 "</tr>\n" + 395 "</tbody>\n"); 396 } 397 398 @Test checkProvidesWithApiTagModuleModeDefault(Path base)399 public void checkProvidesWithApiTagModuleModeDefault(Path base) throws Exception { 400 ModuleBuilder mb = new ModuleBuilder(tb, "m") 401 .comment("module m.\n@provides p1.A abc") 402 .provides("p1.A", "p1.B") 403 .exports("p1") 404 .classes("package p1; public interface A {}") 405 .classes("package p1; public class B implements A {}") 406 .provides("p2.A", "p2.B") 407 .exports("p2") 408 .classes("package p2; public interface A {}") 409 .classes("package p2; public class B implements A {}"); 410 mb.write(base); 411 412 javadoc("-d", base.toString() + "/out", 413 "-quiet", 414 "--module-source-path", base.toString(), 415 "--module", "m"); 416 417 checkExit(Exit.OK); 418 419 checkOutput("m/module-summary.html", true, 420 "<h3>Services</h3>"); 421 422 checkOutput("m/module-summary.html", true, 423 "<table class=\"providesSummary\">\n" + 424 "<caption><span>Provides</span><span class=\"tabEnd\"> </span></caption>\n" + 425 "<tr>\n" + 426 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" + 427 "<th class=\"colLast\" scope=\"col\">Description</th>\n" + 428 "</tr>\n" + 429 "<tbody>\n" + 430 "<tr class=\"altColor\">\n" + 431 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"interface in p1\">A</a></th>\n" + 432 "<td class=\"colLast\">\n" + 433 "<div class=\"block\">abc</div>\n</td>\n" + 434 "</tr>\n" + 435 "</tbody>\n" + 436 "</table>\n"); 437 438 javadoc("-d", base.toString() + "/out-html4", 439 "-html4", 440 "-quiet", 441 "--module-source-path", base.toString(), 442 "--module", "m"); 443 444 checkExit(Exit.OK); 445 446 checkOutput("m/module-summary.html", true, 447 "<table class=\"providesSummary\" summary=\"Provides table, listing types, and an explanation\">\n" + 448 "<caption><span>Provides</span><span class=\"tabEnd\"> </span></caption>\n" + 449 "<tr>\n" + 450 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" + 451 "<th class=\"colLast\" scope=\"col\">Description</th>\n" + 452 "</tr>\n" + 453 "<tbody>\n" + 454 "<tr class=\"altColor\">\n" + 455 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"interface in p1\">A</a></th>\n" + 456 "<td class=\"colLast\">\n" + 457 "<div class=\"block\">abc</div>\n</td>\n" + 458 "</tr>\n" + 459 "</tbody>\n" + 460 "</table>\n"); 461 } 462 463 @Test checkUsesProvidesWithApiTagsModeDefault(Path base)464 public void checkUsesProvidesWithApiTagsModeDefault(Path base) throws Exception { 465 ModuleBuilder mb = new ModuleBuilder(tb, "m") 466 .comment("module m.\n@provides p1.A abc\n@uses p2.B def") 467 .provides("p1.A", "p1.B") 468 .exports("p1") 469 .classes("package p1; public interface A {}") 470 .classes("package p1; public class B implements A {}") 471 .provides("p2.A", "p2.B") 472 .uses("p2.B") 473 .exports("p2") 474 .classes("package p2; public interface A {}") 475 .classes("package p2; public class B implements A {}"); 476 mb.write(base); 477 478 javadoc("-d", base.toString() + "/out", 479 "-quiet", 480 "--module-source-path", base.toString(), 481 "--module", "m"); 482 483 checkExit(Exit.OK); 484 485 checkOutput("m/module-summary.html", true, 486 "<h3>Services</h3>"); 487 488 checkOutput("m/module-summary.html", true, 489 "<table class=\"providesSummary\">\n" + 490 "<caption><span>Provides</span><span class=\"tabEnd\"> </span></caption>\n" + 491 "<tr>\n" + 492 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" + 493 "<th class=\"colLast\" scope=\"col\">Description</th>\n" + 494 "</tr>\n" + 495 "<tbody>\n" + 496 "<tr class=\"altColor\">\n" + 497 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"interface in p1\">A</a></th>\n" + 498 "<td class=\"colLast\">\n" + 499 "<div class=\"block\">abc</div>\n</td>\n" + 500 "</tr>\n" + 501 "</tbody>\n" + 502 "</table>", 503 "<table class=\"usesSummary\">\n" + 504 "<caption><span>Uses</span><span class=\"tabEnd\"> </span></caption>\n" + 505 "<tr>\n" + 506 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" + 507 "<th class=\"colLast\" scope=\"col\">Description</th>\n" + 508 "</tr>\n" + 509 "<tbody>\n" + 510 "<tr class=\"altColor\">\n" + 511 "<th class=\"colFirst\" scope=\"row\"><a href=\"p2/B.html\" title=\"class in p2\">B</a></th>\n" + 512 "<td class=\"colLast\">\n" + 513 "<div class=\"block\">def</div>\n</td>\n" + 514 "</tr>\n" + 515 "</tbody>\n" + 516 "</table>\n"); 517 518 javadoc("-d", base.toString() + "/out-html4", 519 "-html4", 520 "-quiet", 521 "--module-source-path", base.toString(), 522 "--module", "m"); 523 524 checkExit(Exit.OK); 525 526 checkOutput("m/module-summary.html", true, 527 "<table class=\"providesSummary\" summary=\"Provides table, listing types, and an explanation\">\n" + 528 "<caption><span>Provides</span><span class=\"tabEnd\"> </span></caption>\n" + 529 "<tr>\n" + 530 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" + 531 "<th class=\"colLast\" scope=\"col\">Description</th>\n" + 532 "</tr>\n" + 533 "<tbody>\n" + 534 "<tr class=\"altColor\">\n" + 535 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"interface in p1\">A</a></th>\n" + 536 "<td class=\"colLast\">\n" + 537 "<div class=\"block\">abc</div>\n</td>\n" + 538 "</tr>\n" + 539 "</tbody>\n" + 540 "</table>", 541 "<table class=\"usesSummary\" summary=\"Uses table, listing types, and an explanation\">\n" + 542 "<caption><span>Uses</span><span class=\"tabEnd\"> </span></caption>\n" + 543 "<tr>\n" + 544 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" + 545 "<th class=\"colLast\" scope=\"col\">Description</th>\n" + 546 "</tr>\n" + 547 "<tbody>\n" + 548 "<tr class=\"altColor\">\n" + 549 "<th class=\"colFirst\" scope=\"row\"><a href=\"p2/B.html\" title=\"class in p2\">B</a></th>\n" + 550 "<td class=\"colLast\">\n" + 551 "<div class=\"block\">def</div>\n</td>\n" + 552 "</tr>\n" + 553 "</tbody>\n" + 554 "</table>\n"); 555 } 556 557 } 558