FilterOptions.java revision 3595:81692f730015
1/* 2 * Copyright (c) 2016, 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 8159305 27 * @summary Tests elements filtering options 28 * @modules 29 * jdk.javadoc/jdk.javadoc.internal.api 30 * jdk.javadoc/jdk.javadoc.internal.doclets.standard 31 * jdk.javadoc/jdk.javadoc.internal.tool 32 * jdk.compiler/com.sun.tools.javac.api 33 * jdk.compiler/com.sun.tools.javac.main 34 * @library /tools/lib 35 * @build toolbox.ToolBox toolbox.TestRunner 36 * @run main FilterOptions 37 */ 38 39import java.io.IOException; 40import java.nio.file.Path; 41import java.nio.file.Paths; 42 43import toolbox.*; 44 45public class FilterOptions extends ModuleTestBase { 46 47 private static final String NL = System.getProperty("line.separator"); 48 private static final String INDENT = " "; 49 50 // the sources are shared, so create it once 51 private final String src; 52 53 public static void main(String... args) throws Exception { 54 new FilterOptions().runTests(); 55 } 56 57 FilterOptions() throws IOException { 58 this.src = createSources(Paths.get(".").resolve("src")); 59 } 60 61 @Test 62 public void testDefault(Path base) throws Exception { 63 execTask("-modulesourcepath", src, "--module", "m1"); 64 65 checkModulesSpecified("m1"); 66 checkModulesIncluded("m1"); 67 checkPackagesIncluded("pub"); 68 checkTypesIncluded("pub.A", "pub.A.ProtectedNested", "pub.A.PublicNested"); 69 } 70 71 @Test 72 public void testModuleModeApi(Path base) throws Exception { 73 execTask("-modulesourcepath", src, 74 "--module", "m1", "--show-module-contents:api"); 75 76 checkModuleMode("API"); 77 } 78 79 @Test 80 public void testModuleModeAll(Path base) throws Exception { 81 execTask("-modulesourcepath", src, 82 "--module", "m1", "--show-module-contents:all"); 83 84 checkModuleMode("ALL"); 85 } 86 87 @Test 88 public void testShowPackagesExported(Path base) throws Exception { 89 execTask("-modulesourcepath", src, 90 "--module", "m1", 91 "--show-packages:exported"); // default 92 93 checkModulesSpecified("m1"); 94 checkModulesIncluded("m1"); 95 checkPackagesIncluded("pub"); 96 checkTypesIncluded("pub.A", "pub.A.ProtectedNested", "pub.A.PublicNested"); 97 } 98 99 @Test 100 public void testShowPackagesAll(Path base) throws Exception { 101 execTask("-modulesourcepath", src, 102 "--module", "m1", 103 "--show-packages:all"); 104 checkModulesSpecified("m1"); 105 checkModulesIncluded("m1"); 106 checkPackagesIncluded("pub", "pro"); 107 108 checkTypesIncluded("pub.A", "pub.A.ProtectedNested", "pub.A.PublicNested", 109 "pro.A", "pro.A.ProtectedNested", "pro.A.PublicNested"); 110 } 111 112 @Test 113 public void testShowTypesPrivate(Path base) throws Exception { 114 execTask("-modulesourcepath", src, 115 "--module", "m1", 116 "--show-types:private"); 117 118 checkModulesSpecified("m1"); 119 checkModulesIncluded("m1"); 120 checkPackagesIncluded("pub"); 121 122 checkTypesIncluded("pub.A", "pub.A.PrivateNested", "pub.A.Nested", "pub.A.ProtectedNested", 123 "pub.A.PublicNested", 124 "pub.B", "pub.B.PrivateNested", "pub.B.Nested", "pub.B.ProtectedNested", 125 "pub.B.PublicNested"); 126 127 } 128 129 @Test 130 public void testShowTypesPackage(Path base) throws Exception { 131 execTask("-modulesourcepath", src, 132 "--module", "m1", 133 "--show-types:package"); 134 135 checkModulesSpecified("m1"); 136 checkModulesIncluded("m1"); 137 checkPackagesIncluded("pub"); 138 139 checkTypesIncluded("pub.A", "pub.A.Nested", "pub.A.ProtectedNested", "pub.A.PublicNested", 140 "pub.B", "pub.B.Nested", "pub.B.ProtectedNested", "pub.B.PublicNested"); 141 142 checkTypesNotIncluded(".*private.*"); 143 } 144 145 @Test 146 public void testShowTypesProtected(Path base) throws Exception { 147 execTask("-modulesourcepath", src, 148 "--module", "m1", 149 "--show-types:protected"); 150 151 checkModulesSpecified("m1"); 152 checkModulesIncluded("m1"); 153 checkPackagesIncluded("pub"); 154 155 checkTypesIncluded("pub.A", "pub.A.ProtectedNested", "pub.A.PublicNested"); 156 157 checkTypesNotIncluded("pub.A.Nested", "pub.A.PrivateNested", "pub.B.Nested", 158 "pub.B.PrivateNested", "pub.B.ProtectedNested", 159 "pub.B.PublicNested"); 160 } 161 162 @Test 163 public void testShowTypesPublic(Path base) throws Exception { 164 execTask("-modulesourcepath", src, 165 "--module", "m1", 166 "--show-types:public"); 167 168 checkModulesSpecified("m1"); 169 checkModulesIncluded("m1"); 170 checkPackagesIncluded("pub"); 171 172 checkTypesIncluded("pub.A", "pub.A.PublicNested"); 173 checkTypesNotIncluded("pub.A.Nested", 174 "pub.A.ProtectedNested", "pub.A.PrivateNested", 175 "pub.B.Nested", "pub.B.ProtectedNested", "pub.B.PrivateNested", 176 "pub.B.PublicNested"); 177 } 178 179 @Test 180 public void testShowMembersPrivate(Path base) throws Exception { 181 execTask("-modulesourcepath", src, 182 "--module", "m1", 183 "--show-members:private"); 184 185 checkMembers(Visibility.PRIVATE); 186 } 187 188 @Test 189 public void testShowMembersPackage(Path base) throws Exception { 190 execTask("-modulesourcepath", src, 191 "--module", "m1", 192 "--show-members:package"); 193 194 checkMembers(Visibility.PACKAGE); 195 } 196 197 @Test 198 public void testShowMembersProtected(Path base) throws Exception { 199 execTask("-modulesourcepath", src, 200 "--module", "m1", 201 "--show-members:protected"); 202 203 checkMembers(Visibility.PROTECTED); 204 } 205 206 @Test 207 public void testShowMembersPublic(Path base) throws Exception { 208 execTask("-modulesourcepath", src, 209 "--module", "m1", 210 "--show-members:public"); 211 212 checkMembers(Visibility.PUBLIC); 213 } 214 215 @Test 216 public void testLegacyPublic(Path base) throws Exception { 217 execTask("-modulesourcepath", src, 218 "--module", "m1", 219 "-public"); 220 221 checkModuleMode("API"); 222 checkModulesSpecified("m1"); 223 checkModulesIncluded("m1"); 224 checkPackagesIncluded("pub"); 225 checkTypesIncluded("pub.A", "pub.A.PublicNested"); 226 227 checkMembers(Visibility.PUBLIC); 228 } 229 230 @Test 231 public void testLegacyDefault(Path base) throws Exception { 232 execTask("-modulesourcepath", src, 233 "--module", "m1"); 234 235 checkModuleMode("API"); 236 checkModulesSpecified("m1"); 237 checkModulesIncluded("m1"); 238 checkPackagesIncluded("pub"); 239 checkTypesIncluded("pub.A", "pub.A.ProtectedNested", "pub.A.PublicNested"); 240 241 checkMembers(Visibility.PROTECTED); 242 } 243 244 @Test 245 public void testLegacyProtected(Path base) throws Exception { 246 execTask("-modulesourcepath", src, 247 "--module", "m1", 248 "-protected"); 249 250 checkModuleMode("API"); 251 checkModulesSpecified("m1"); 252 checkModulesIncluded("m1"); 253 checkPackagesIncluded("pub"); 254 checkTypesIncluded("pub.A", "pub.A.ProtectedNested", "pub.A.PublicNested"); 255 256 checkMembers(Visibility.PROTECTED); 257 } 258 259 @Test 260 public void testLegacyPackage(Path base) throws Exception { 261 execTask("-modulesourcepath", src, 262 "--module", "m1", 263 "-package"); 264 265 checkModuleMode("ALL"); 266 checkModulesSpecified("m1"); 267 checkModulesIncluded("m1"); 268 checkPackagesIncluded("pub"); 269 checkPackagesIncluded("pro"); 270 checkTypesIncluded("pub.B", "pub.B.Nested", "pub.B.ProtectedNested", "pub.B.PublicNested", 271 "pub.A", "pub.A.Nested", "pub.A.ProtectedNested", "pub.A.PublicNested", 272 "pro.B", "pro.B.Nested", "pro.B.ProtectedNested", "pro.B.PublicNested", 273 "pro.A", "pro.A.Nested", "pro.A.ProtectedNested", "pro.A.PublicNested"); 274 275 checkMembers(Visibility.PACKAGE); 276 } 277 278 @Test 279 public void testLegacyPrivate(Path base) throws Exception { 280 execTask("-modulesourcepath", src, 281 "--module", "m1", 282 "-private"); 283 284 checkModuleMode("ALL"); 285 checkModulesSpecified("m1"); 286 checkModulesIncluded("m1"); 287 checkPackagesIncluded("pub"); 288 checkPackagesIncluded("pro"); 289 checkTypesIncluded("pub.B", "pub.B.PrivateNested", "pub.B.Nested", "pub.B.ProtectedNested", 290 "pub.B.PublicNested", 291 "pub.A", "pub.A.PrivateNested", "pub.A.Nested", "pub.A.ProtectedNested", 292 "pub.A.PublicNested", 293 "pro.B", "pro.B.PrivateNested", "pro.B.Nested", "pro.B.ProtectedNested", 294 "pro.B.PublicNested", 295 "pro.A", "pro.A.PrivateNested", "pro.A.Nested", "pro.A.ProtectedNested", 296 "pro.A.PublicNested"); 297 298 checkMembers(Visibility.PRIVATE); 299 } 300 301 private static enum Visibility { 302 PRIVATE, PACKAGE, PROTECTED, PUBLIC; 303 } 304 305 void checkMembers(Visibility v) throws Exception { 306 checkMembersPresence(v); 307 checkMembersAbsence(v); 308 } 309 310 void checkMembersPresence(Visibility v) throws Exception { 311 switch (v) { 312 case PRIVATE: 313 checkMembersSelected("pub.A.privateFieldA", 314 "pub.A.PublicNested.privateFieldPublicNested", 315 "pub.A.ProtectedNested.privateFieldProtectedNested"); 316 317 case PACKAGE: 318 checkMembersSelected("pub.A.FieldA", 319 "pub.A.PublicNested.FieldPublicNested", 320 "pub.A.ProtectedNested.FieldProtectedNested"); 321 322 case PROTECTED: 323 checkMembersSelected("pub.A.<init>", 324 "pub.A.protectedFieldA", 325 "pub.A.PublicNested.protectedFieldPublicNested", 326 "pub.A.ProtectedNested.<init>", 327 "pub.A.ProtectedNested.protectedFieldProtectedNested", 328 "pub.A.ProtectedNested.publicFieldProtectedNested"); 329 330 case PUBLIC: 331 checkMembersSelected("pub.A.publicFieldA", 332 "pub.A.PublicNested.<init>", 333 "pub.A.PublicNested.publicFieldPublicNested"); 334 335 break; 336 } 337 } 338 339 void checkMembersAbsence(Visibility v) throws Exception { 340 switch (v) { 341 case PUBLIC: 342 checkMembersNotSelected("pub.A.protectedFieldA", 343 "pub.A.PublicNested.protectedFieldPublicNested", 344 "pub.A.ProtectedNested.<init>", 345 "pub.A.ProtectedNested.protectedFieldProtectedNested"); 346 347 case PROTECTED: 348 checkMembersNotSelected("pub.A.FieldA", 349 "pub.A.PublicNested.FieldPublicNested", 350 "pub.A.ProtectedNested.FieldProtectedNested"); 351 352 case PACKAGE: 353 checkMembersNotSelected("pub.A.privateFieldA", 354 "pub.A.PublicNested.privateFieldPublicNested", 355 "pub.A.ProtectedNested.privateFieldProtectedNested"); 356 357 case PRIVATE: 358 break; 359 } 360 } 361 362 String createSources(Path src) throws IOException { 363 ModuleBuilder mb1 = new ModuleBuilder(tb, "m1"); 364 mb1.comment("The first module.") 365 .classes(createClass("pub", "A", true)) 366 .classes(createClass("pub", "B", false)) 367 .classes(createClass("pro", "A", true)) 368 .classes(createClass("pro", "B", false)) 369 .exports("pub") 370 .write(src); 371 return src.toString(); 372 } 373 374 String createClass(String pkg, String name, boolean isPublic) { 375 StringBuilder sb = new StringBuilder("package ") 376 .append(pkg) 377 .append("; ") 378 .append(NL); 379 sb.append(" /** Klass ") 380 .append(name) 381 .append(" */") 382 .append(NL); 383 sb.append(isPublic ? "public " : " ") 384 .append("class ") 385 .append(name) 386 .append(" {") 387 .append(NL); 388 389 sb.append(createMembers(INDENT, name)); 390 sb.append(createNestedClass(INDENT, "PublicNested", name, "public")); 391 sb.append(createNestedClass(INDENT, "ProtectedNested", name, "protected")); 392 sb.append(createNestedClass(INDENT, "Nested", name, "")); 393 sb.append(createNestedClass(INDENT, "PrivateNested", name, "private")); 394 395 return sb.append("}").toString(); 396 } 397 398 StringBuilder createNestedClass(String indent, String name, String enclosing, String visibility) { 399 return new StringBuilder() 400 .append(indent).append(" /** Klass ").append(name).append(" */").append(NL) 401 .append(indent).append(visibility).append(" class ").append(name).append(" {").append(NL) 402 .append(createMembers(indent + INDENT, name)).append(indent).append("}").append(NL); 403 } 404 405 StringBuilder createMembers(String indent, String enclosing) { 406 return new StringBuilder() 407 .append(indent).append(createMember(enclosing, "public")) 408 .append(indent).append(createMember(enclosing, "protected")) 409 .append(indent).append(createMember(enclosing, "")) 410 .append(indent).append(createMember(enclosing, "private")) 411 .append(NL); 412 } 413 414 StringBuilder createMember(String enclosingClass, String visibility) { 415 return new StringBuilder() 416 .append("/** a ") 417 .append(visibility) 418 .append("Field in ") 419 .append(enclosingClass) 420 .append(" */ ") 421 .append(visibility) 422 .append(" String ") 423 .append(visibility) 424 .append("Field") 425 .append(enclosingClass) 426 .append(";") 427 .append(NL); 428 } 429} 430