1 /* 2 * Copyright (c) 2013, 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 8001457 8027477 8163113 27 * @author sogoel 28 * @summary Reflection api tests 29 * @modules jdk.compiler 30 * @build Helper 31 * @compile expectedFiles/ExpectedBase.java expectedFiles/ExpectedContainer.java 32 * @run main ReflectionTest 33 */ 34 import java.io.File; 35 import java.io.IOException; 36 import java.lang.annotation.Annotation; 37 import java.net.MalformedURLException; 38 import java.net.URL; 39 import java.net.URLClassLoader; 40 import java.util.ArrayList; 41 import java.util.Arrays; 42 import java.util.List; 43 44 import javax.tools.DiagnosticCollector; 45 import javax.tools.JavaFileObject; 46 47 import expectedFiles.ExpectedBase; 48 import expectedFiles.ExpectedContainer; 49 import java.util.Iterator; 50 import java.util.regex.Pattern; 51 52 /* 53 * Objective: 54 * Test the following 6 methods from java.lang.reflect.AnnotatedElement: 55 * - getAnnotation(Class<T>) 56 * - getAnnotations() 57 * - getDeclaredAnnotations() 58 * - getDeclaredAnnotation(Class<T>) // new method in JDK8 59 * - getAnnotationsByType(Class<T>) // new method in JDK8 60 * - getDeclaredAnnotationsByType(Class<T>) // new method in JDK8 61 * for multiple test cases, for example, BasicNonRepeatable case, BasicRepeatable case 62 * for each of the src types - class, method, field, package 63 * 64 * This test uses following three enums: 65 * 1. TestCase - Defines the ExpectedBase/ExpectedContainer values for each testCase 66 * - getTestFiles() - Creates list of JavaFileObjects for the primary 67 * src types (class, method, field, package) 68 * - Each testCase is a new scenario with a combination of @Repeatable 69 * relationship present/absent in conjunction with @Inherited. 70 * For eg: BasicNonRepeatable_Legacy - It is a pre-JDK8 way of writing a single 71 * annotation on a given srcType( class, method, field, package) 72 * BasicRepeatable - It is a JDK8 way of writing repeating annotations 73 * on a given srcType with a @Repeatable relationship 74 * defined between Foo and FooContainer. 75 * 76 * 2. SrcType - Defines templates used in creation of test src 77 * - Defines getExpectedBase() and getExpectedContainer() for primary src types 78 * 3. TestMethod - Defines getActualAnnoBase(), getActualAnnoContainer(), getExpectedAnnoBase(), 79 * and getExpectedAnnoContainer() for each of the 6 methods that are being tested 80 * in java.lang.reflect.AnnotatedElement 81 * 82 * Test execution flow: 83 * - Loop over each of the src types and each test cases 84 * - Creates test src for each flow, compile it, load the class object 85 * - Run all 6 methods on this class object 86 * - Get expected and actual annotations for each object and compare them. 87 * - Increment the error counter if the annotations don't match. 88 * 89 * The test fails if the number of errors is greater than 0. 90 */ 91 public class ReflectionTest { 92 93 static int errors = 0; 94 // Variables used in creating test src for a given testcase/testSrcType 95 static final String TESTPKG = "testpkg"; 96 static final String TESTMETHOD = "testMethod"; 97 static final String TESTFIELD = "testField"; 98 static final String PKGINFONAME = TESTPKG + ".package-info"; 99 static final String SUPERCLASS = "SuperClass"; 100 static final String TESTINTERFACE = "TestInterface"; 101 /* 102 * Set it to true to get more debug information 103 */ 104 static final boolean DEBUG = false; 105 static boolean CHECKORDERING; 106 107 public static void main(String args[]) throws Exception { 108 ReflectionTest test = new ReflectionTest(); 109 test.runTest(); 110 } 111 112 public void runTest() throws Exception { 113 114 ClassLoader parentClassLoader = getLoader(); 115 String className = ""; 116 Iterable<? extends JavaFileObject> files = null; 117 118 for (SrcType srcType : SrcType.getSrcTypes()) { 119 for (TestCase testCase : TestCase.values()) { 120 className = testCase + "_" + srcType; 121 debugPrint("*****************************************"); 122 System.out.println("Running Test for ClassName: " + className); 123 124 // @Inherited only applicable for class, exclude cases for 125 // package, method, field 126 if (testCase.name().contains("Inherited") 127 && (srcType != SrcType.CLASS)) { 128 continue; 129 } 130 131 // Get list of JavaFileObjects to be compiled 132 files = testCase.getTestFiles(srcType, className); 133 if (srcType == SrcType.PACKAGE) { 134 className = TESTPKG + "." + className; 135 } 136 DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>(); 137 138 // Compile the list of JavaFileObjects 139 try { 140 Helper.compileCode(diagnostics, files); 141 } catch (Exception ex) { 142 printTestSrc(files); 143 throw new RuntimeException( 144 "Exception when compiling class " + className, ex); 145 } 146 147 // Get Class object for the compiled class 148 Class<?> c = loadClass(className, parentClassLoader, Helper.destDir); 149 if (c != null) { 150 // For the loaded class object, compare expected and actual annotation values 151 // for each of the methods under test from java.lang.reflect.AnnotatedElement 152 153 154 // Ignoring following test cases since for now they are 155 // failing with ordering issues. 156 // @ignore 8025924: Several test cases in repeatingAnnotations/combo/ReflectionTest 157 // fail with ordering issues 158 List<String> orderingTestFailures = Arrays.asList( 159 "SingleOnSuperContainerOnSub_Inherited_Legacy", 160 "SingleOnSuperContainerAndSingleOnSub_Inherited_Legacy", 161 "ContainerAndSingleOnSuperSingleOnSub_Inherited_Legacy", 162 "SingleAnnoWithContainer", 163 "SingleOnSuperContainerAndSingleOnSub_Inherited", 164 "RepeatableOnSuperSingleOnSub_Inherited", 165 "SingleOnSuperRepeatableOnSub_Inherited", 166 "ContainerOnSuperSingleOnSub_Inherited", 167 "SingleOnSuperContainerOnSub_Inherited", 168 "ContainerAndSingleOnSuperSingleOnSub_Inherited"); 169 if (orderingTestFailures.contains(testCase.toString())) { 170 CHECKORDERING = false; 171 } else 172 CHECKORDERING = true; 173 174 checkAnnoValues(srcType, c); 175 } else { 176 error("Could not load className = " + c); 177 } 178 } 179 } 180 181 if (getNumErrors() > 0) { 182 System.err.println("Test failed with " + getNumErrors() + " errors"); 183 throw new RuntimeException(); 184 } 185 } 186 187 /* 188 * Each test case in this enum has the following: 189 * - Define each test case with its @ExpectedBase and @ExpectedContainer annotations 190 * - Override getTestFiles() that creates list of JavaFileObjects for each case 191 * based on the src type. 192 */ 193 enum TestCase { 194 BasicNonRepeatable_Legacy( 195 "@ExpectedBase(value=Foo.class, " 196 + "getAnnotationVal = \"@Foo(value=0)\", " 197 + "getAnnotationsVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\"}, " 198 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\"}, " 199 + "getDeclAnnoVal = \"@Foo(value=0)\", " 200 + "getAnnosArgs = {\"@Foo(value=0)\"}, " 201 + "getDeclAnnosArgs = {\"@Foo(value=0)\"}) ", 202 "@ExpectedContainer") { 203 204 @Override 205 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 206 String className) { 207 String anno = ""; 208 String replaceVal = ""; 209 String testSrc = ""; 210 String pkgInfoContents = ""; 211 String contents = ""; 212 213 JavaFileObject pkgFileObj = null; 214 JavaFileObject srcFileObj = null; 215 Iterable<? extends JavaFileObject> files = null; 216 217 String expectedVals = "\n" + getExpectedBase() + "\n" 218 + getExpectedContainer() + "\n"; 219 StringBuilder commonStmts = new StringBuilder(); 220 anno = Helper.ContentVars.BASEANNO.getVal(); 221 commonStmts.append(Helper.ContentVars.IMPORTEXPECTED.getVal()) 222 .append(Helper.ContentVars.IMPORTSTMTS.getVal()) 223 .append(Helper.ContentVars.RETENTIONRUNTIME.getVal()) 224 .append(Helper.ContentVars.BASE.getVal()); 225 switch (srcType) { 226 case PACKAGE: 227 /* 228 Sample package-info.java 229 @ExpectedBase 230 @ExpectedContainer 231 @Foo(0) 232 package testpkg; 233 234 @Retention(RetentionPolicy.RUNTIME) 235 @interface Foo {int value() default Integer.MAX_VALUE;} 236 237 Sample testSrc: 238 package testpkg; 239 class A {} 240 */ 241 testSrc = srcType.getTemplate().replace("#CN", className); 242 contents = testSrc; 243 srcFileObj = Helper.getFile(className, contents); 244 245 replaceVal = expectedVals + "\n" + anno; 246 pkgInfoContents = SrcType.PKGINFO.getTemplate() 247 .replace("#REPLACE1", replaceVal) 248 .replace("#REPLACE2", commonStmts); 249 pkgFileObj = Helper.getFile(PKGINFONAME, pkgInfoContents); 250 251 files = Arrays.asList(pkgFileObj, srcFileObj); 252 break; 253 default: 254 // class, method, field 255 /* 256 Sample testSrc for class 257 @Retention(RetentionPolicy.RUNTIME) 258 @interface Foo {int value() default Integer.MAX_VALUE;} 259 260 @ExpectedBase 261 @ExpectedContainer 262 @Foo(0) 263 class A {} 264 */ 265 replaceVal = expectedVals + anno; 266 testSrc = srcType.getTemplate().replace("#CN", className) 267 .replace("#REPLACE", replaceVal); 268 contents = commonStmts + testSrc; 269 srcFileObj = Helper.getFile(className, contents); 270 files = Arrays.asList(srcFileObj); 271 } 272 return files; 273 } 274 }, 275 SingleAnnoInherited_Legacy( 276 "@ExpectedBase(value=Foo.class, " 277 + "getAnnotationVal = \"@Foo(value=0)\", " 278 + "getAnnotationsVals = {\"@Foo(value=0)\", \"ExpectedBase\", \"ExpectedContainer\"}, " 279 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\"}, " 280 + "getDeclAnnoVal = \"NULL\", " 281 + "getAnnosArgs = {\"@Foo(value=0)\"}, " 282 + "getDeclAnnosArgs = {})", 283 "@ExpectedContainer") { 284 285 @Override 286 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 287 String className) { 288 String anno = ""; 289 String replaceVal = ""; 290 String contents = ""; 291 JavaFileObject srcFileObj = null; 292 Iterable<? extends JavaFileObject> files = null; 293 294 String expectedVals = "\n" + getExpectedBase() + "\n" 295 + getExpectedContainer() + "\n"; 296 StringBuilder commonStmts = new StringBuilder(); 297 298 /* 299 Sample testSrc: 300 @Retention(RetentionPolicy.RUNTIME) 301 @Inherited 302 @interface Foo {int value() default Integer.MAX_VALUE;} 303 304 @Foo(0) 305 class SuperClass { } 306 307 @ExpectedBase 308 @ExpectedContainer 309 class SubClass extends SuperClass {} 310 */ 311 312 // @Inherited only works for classes, no switch cases for 313 // method, field, package 314 anno = Helper.ContentVars.BASEANNO.getVal(); 315 commonStmts.append(Helper.ContentVars.IMPORTEXPECTED.getVal()) 316 .append(Helper.ContentVars.IMPORTSTMTS.getVal()) 317 .append(Helper.ContentVars.RETENTIONRUNTIME.getVal()) 318 .append(Helper.ContentVars.INHERITED.getVal()) 319 .append(Helper.ContentVars.BASE.getVal()); 320 321 if (srcType == SrcType.CLASS) { 322 // Contents for SuperClass 323 replaceVal = commonStmts + "\n" + anno; 324 String superClassContents = srcType.getTemplate() 325 .replace("#CN", SUPERCLASS).replace("#REPLACE", replaceVal); 326 327 // Contents for SubClass that extends SuperClass 328 replaceVal = expectedVals; 329 String subClassContents = SrcType.CLASSEXTENDS.getTemplate() 330 .replace("#CN", className).replace("#SN", SUPERCLASS) 331 .replace("#REPLACE", replaceVal); 332 333 contents = superClassContents + subClassContents; 334 srcFileObj = Helper.getFile(className, contents); 335 files = Arrays.asList(srcFileObj); 336 } 337 return files; 338 } 339 }, 340 InheritedAnnoOnInterface_Legacy( 341 "@ExpectedBase(value=Foo.class, " 342 + "getAnnotationVal = \"NULL\", " 343 + "getAnnotationsVals = {\"ExpectedBase\", \"ExpectedContainer\"}, " 344 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\"}," 345 + "getDeclAnnoVal = \"NULL\"," + "getAnnosArgs = {}," 346 + "getDeclAnnosArgs = {})", 347 "@ExpectedContainer") { 348 349 @Override 350 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 351 String className) { 352 String anno = ""; 353 String replaceVal = ""; 354 String contents = ""; 355 JavaFileObject srcFileObj = null; 356 Iterable<? extends JavaFileObject> files = null; 357 358 String expectedVals = "\n" + getExpectedBase() + "\n" 359 + getExpectedContainer() + "\n"; 360 StringBuilder commonStmts = new StringBuilder(); 361 362 /* 363 Sample test src: 364 @Retention(RetentionPolicy.RUNTIME) 365 @Inherited 366 @interface Foo {int value() default Integer.MAX_VALUE;} 367 368 @Foo(0) 369 interface TestInterface { } 370 371 @ExpectedBase 372 @ExpectedContainer 373 class A implements TestInterface {} 374 */ 375 anno = Helper.ContentVars.BASEANNO.getVal(); 376 commonStmts.append(Helper.ContentVars.IMPORTEXPECTED.getVal()) 377 .append(Helper.ContentVars.IMPORTSTMTS.getVal()) 378 .append(Helper.ContentVars.RETENTIONRUNTIME.getVal()) 379 .append(Helper.ContentVars.INHERITED.getVal()) 380 .append(Helper.ContentVars.BASE.getVal()); 381 382 if (srcType == SrcType.CLASS) { 383 // Contents for TestInterface 384 replaceVal = commonStmts + "\n" + anno; 385 String interfaceContents = SrcType.INTERFACE.getTemplate() 386 .replace("#IN", TESTINTERFACE) 387 .replace("#REPLACE", replaceVal); 388 389 // Contents for class implementing TestInterface 390 replaceVal = expectedVals; 391 String classContents = SrcType.INTERFACEIMPL.getTemplate() 392 .replace("#CN", className).replace("#IN", TESTINTERFACE) 393 .replace("#REPLACE", replaceVal); 394 395 contents = interfaceContents + classContents; 396 srcFileObj = Helper.getFile(className, contents); 397 files = Arrays.asList(srcFileObj); 398 } 399 return files; 400 } 401 }, 402 AnnoOnSuperAndSubClass_Inherited_Legacy( 403 "@ExpectedBase(value=Foo.class, " 404 + "getAnnotationVal = \"@Foo(value=2)\", " 405 + "getAnnotationsVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=2)\"}, " 406 + // override every annotation on superClass 407 "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=2)\"}, " 408 + // ignores inherited annotations 409 "getDeclAnnoVal = \"@Foo(value=2)\", " // ignores inherited 410 + "getAnnosArgs = {\"@Foo(value=2)\"}, " 411 + "getDeclAnnosArgs = { \"@Foo(value=2)\" })", // ignores inherited 412 "@ExpectedContainer(value=FooContainer.class, " 413 + "getAnnotationVal = \"NULL\", " 414 + "getAnnotationsVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=2)\"}, " 415 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=2)\"}, " 416 + // ignores inherited annotations 417 "getDeclAnnoVal = \"NULL\", " + // ignores inherited 418 "getAnnosArgs = {}, " + "getDeclAnnosArgs = {})") { // ignores inherited 419 420 @Override 421 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 422 String className) { 423 String anno = ""; 424 String replaceVal = ""; 425 String contents = ""; 426 JavaFileObject srcFileObj = null; 427 Iterable<? extends JavaFileObject> files = null; 428 429 String expectedVals = "\n" + getExpectedBase() + "\n" 430 + getExpectedContainer() + "\n"; 431 StringBuilder commonStmts = new StringBuilder(); 432 433 /* 434 Sample test src 435 @Retention(RetentionPolicy.RUNTIME) 436 @Inherited 437 @interface Foo {int value() default Integer.MAX_VALUE;} 438 439 @Inherited 440 @interface FooContainer { 441 Foo[] value(); 442 } 443 444 @Foo(1) 445 class SuperClass { } 446 447 @ExpectedBase 448 @ExpectedContainer 449 @Foo(2) 450 class SubClass extends SuperClass {} 451 */ 452 // @Inherited only works for classes, no switch cases for 453 // method, field, package 454 commonStmts.append(Helper.ContentVars.IMPORTEXPECTED.getVal()) 455 .append(Helper.ContentVars.IMPORTSTMTS.getVal()) 456 .append(Helper.ContentVars.RETENTIONRUNTIME.getVal()) 457 .append(Helper.ContentVars.INHERITED.getVal()) 458 .append(Helper.ContentVars.BASE.getVal()) 459 .append(Helper.ContentVars.INHERITED.getVal()) 460 .append(Helper.ContentVars.CONTAINER.getVal()); 461 462 if (srcType == SrcType.CLASS) { 463 // Contents for SuperClass 464 anno = "@Foo(1)"; 465 replaceVal = commonStmts + "\n" + anno; 466 String superClassContents = srcType.getTemplate() 467 .replace("#CN", SUPERCLASS).replace("#REPLACE", replaceVal); 468 469 // Contents for SubClass that extends SuperClass 470 anno = "@Foo(2)"; 471 replaceVal = expectedVals + "\n" + anno; 472 String subClassContents = SrcType.CLASSEXTENDS.getTemplate() 473 .replace("#CN", className).replace("#SN", SUPERCLASS) 474 .replace("#REPLACE", replaceVal); 475 476 contents = superClassContents + subClassContents; 477 srcFileObj = Helper.getFile(className, contents); 478 files = Arrays.asList(srcFileObj); 479 } 480 return files; 481 } 482 }, 483 BasicContainer_Legacy( 484 "@ExpectedBase(value = Foo.class, " 485 + "getAnnotationVal = \"NULL\"," 486 + "getAnnotationsVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 487 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 488 + "getDeclAnnoVal = \"NULL\", " + "getAnnosArgs = {}, " 489 + "getDeclAnnosArgs = {} )", 490 "@ExpectedContainer(value=FooContainer.class, " 491 + "getAnnotationVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", " 492 + "getAnnotationsVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 493 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 494 + "getDeclAnnoVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", " 495 + "getAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 496 + "getDeclAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"} )") { 497 498 @Override 499 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 500 String className) { 501 String anno = ""; 502 String replaceVal = ""; 503 String testSrc = ""; 504 String pkgInfoContents = ""; 505 String contents = ""; 506 507 JavaFileObject pkgFileObj = null; 508 JavaFileObject srcFileObj = null; 509 Iterable<? extends JavaFileObject> files = null; 510 511 String expectedVals = "\n" + getExpectedBase() + "\n" 512 + getExpectedContainer() + "\n"; 513 StringBuilder commonStmts = new StringBuilder(); 514 515 anno = Helper.ContentVars.LEGACYCONTAINER.getVal(); 516 commonStmts.append(Helper.ContentVars.IMPORTEXPECTED.getVal()) 517 .append(Helper.ContentVars.IMPORTSTMTS.getVal()) 518 .append(Helper.ContentVars.RETENTIONRUNTIME.getVal()) 519 .append(Helper.ContentVars.BASE.getVal()) 520 .append(Helper.ContentVars.RETENTIONRUNTIME.getVal()) 521 .append(Helper.ContentVars.CONTAINER.getVal()); 522 switch (srcType) { 523 case PACKAGE: 524 /* 525 Sample package-info.java 526 @ExpectedBase 527 @ExpectedContainer 528 @FooContainer(value = {@Foo(1), @Foo(2)}) 529 package testpkg; 530 531 @Retention(RetentionPolicy.RUNTIME) 532 @interface Foo {int value() default Integer.MAX_VALUE;} 533 534 @Retention(RetentionPolicy.RUNTIME) 535 @interface FooContainer { 536 Foo[] value(); 537 } 538 539 Sample testSrc: 540 package testpkg; 541 class A {} 542 */ 543 testSrc = srcType.getTemplate().replace("#CN", className); 544 contents = testSrc; 545 srcFileObj = Helper.getFile(className, contents); 546 547 replaceVal = "\n" + expectedVals + "\n" + anno; 548 pkgInfoContents = SrcType.PKGINFO.getTemplate() 549 .replace("#REPLACE1", replaceVal) 550 .replace("#REPLACE2", commonStmts); 551 pkgFileObj = Helper.getFile(PKGINFONAME, pkgInfoContents); 552 files = Arrays.asList(pkgFileObj, srcFileObj); 553 break; 554 default: 555 /* 556 Sample testSrc for class: 557 @Retention(RetentionPolicy.RUNTIME) 558 @Inherited 559 @interface Foo {int value() default Integer.MAX_VALUE;} 560 561 @Retention(RetentionPolicy.RUNTIME) 562 @Inherited 563 @interface FooContainer { 564 Foo[] value(); 565 } 566 567 @ExpectedBase 568 @ExpectedContainer 569 @FooContainer(value = {@Foo(1), @Foo(2)}) 570 class A {} 571 */ 572 replaceVal = expectedVals + anno; 573 testSrc = srcType.getTemplate().replace("#CN", className) 574 .replace("#REPLACE", replaceVal); 575 contents = commonStmts + testSrc; 576 srcFileObj = Helper.getFile(className, contents); 577 files = Arrays.asList(srcFileObj); 578 } 579 return files; 580 } 581 }, 582 SingleAndContainerOnSuper_Legacy( 583 "@ExpectedBase(value = Foo.class, " 584 + "getAnnotationVal = \"@Foo(value=0)\"," 585 + "getAnnotationsVals = {" 586 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 587 + "getDeclAnnosVals = {" 588 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 589 + "getDeclAnnoVal = \"@Foo(value=0)\", " 590 + "getAnnosArgs = {\"@Foo(value=0)\"}, " 591 + "getDeclAnnosArgs = {\"@Foo(value=0)\"} )", 592 "@ExpectedContainer(value=FooContainer.class, " 593 + "getAnnotationVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", " 594 + "getAnnotationsVals = {" 595 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 596 + "getDeclAnnosVals = {" 597 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 598 + "getDeclAnnoVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", " 599 + "getAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 600 + "getDeclAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"} )") { 601 602 @Override 603 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 604 String className) { 605 String anno = ""; 606 String replaceVal = ""; 607 String testSrc = ""; 608 String pkgInfoContents = ""; 609 String contents = ""; 610 611 JavaFileObject pkgFileObj = null; 612 JavaFileObject srcFileObj = null; 613 Iterable<? extends JavaFileObject> files = null; 614 615 String expectedVals = "\n" + getExpectedBase() + "\n" 616 + getExpectedContainer() + "\n"; 617 StringBuilder commonStmts = new StringBuilder(); 618 619 anno = Helper.ContentVars.BASEANNO.getVal() + 620 Helper.ContentVars.LEGACYCONTAINER.getVal(); 621 commonStmts.append(Helper.ContentVars.IMPORTEXPECTED.getVal()) 622 .append(Helper.ContentVars.IMPORTSTMTS.getVal()) 623 .append(Helper.ContentVars.RETENTIONRUNTIME.getVal()) 624 .append(Helper.ContentVars.BASE.getVal()) 625 .append(Helper.ContentVars.RETENTIONRUNTIME.getVal()) 626 .append(Helper.ContentVars.CONTAINER.getVal()); 627 switch (srcType) { 628 case PACKAGE: 629 /* 630 Sample package-info.java 631 @ExpectedBase 632 @ExpectedContainer 633 @Foo(0) 634 @FooContainer(value = {@Foo(1), @Foo(2)}) 635 package testpkg; 636 637 @Retention(RetentionPolicy.RUNTIME) 638 @interface Foo {int value() default Integer.MAX_VALUE;} 639 640 @Retention(RetentionPolicy.RUNTIME) 641 @interface FooContainer { 642 Foo[] value(); 643 } 644 645 Sample testSrc: 646 package testpkg; 647 class A {} 648 */ 649 testSrc = srcType.getTemplate().replace("#CN", className); 650 contents = testSrc; 651 652 srcFileObj = Helper.getFile(className, contents); 653 654 replaceVal = "\n" + expectedVals + "\n" + anno; 655 pkgInfoContents = SrcType.PKGINFO.getTemplate() 656 .replace("#REPLACE1", replaceVal) 657 .replace("#REPLACE2", commonStmts); 658 pkgFileObj = Helper.getFile(PKGINFONAME, pkgInfoContents); 659 files = Arrays.asList(pkgFileObj, srcFileObj); 660 break; 661 default: 662 /* 663 Sample testSrc for class: 664 @Retention(RetentionPolicy.RUNTIME) 665 @Inherited 666 @interface Foo {int value() default Integer.MAX_VALUE;} 667 668 @Retention(RetentionPolicy.RUNTIME) 669 @Inherited 670 @interface FooContainer { 671 Foo[] value(); 672 } 673 674 @ExpectedBase 675 @ExpectedContainer 676 @Foo(0) 677 @FooContainer(value = {@Foo(1), @Foo(2)}) 678 class A {} 679 */ 680 replaceVal = expectedVals + anno; 681 testSrc = srcType.getTemplate().replace("#CN", className) 682 .replace("#REPLACE", replaceVal); 683 contents = commonStmts + testSrc; 684 685 srcFileObj = Helper.getFile(className, contents); 686 files = Arrays.asList(srcFileObj); 687 } 688 return files; 689 } 690 }, 691 BasicContainer_Inherited_Legacy( 692 "@ExpectedBase(value = Foo.class, " 693 + "getAnnotationVal = \"NULL\"," 694 + "getAnnotationsVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 695 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\"}, " 696 + "getDeclAnnoVal = \"NULL\", " 697 + "getAnnosArgs = {}, " 698 + "getDeclAnnosArgs = {} )", 699 "@ExpectedContainer(value=FooContainer.class, " 700 + "getAnnotationVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", " 701 + "getAnnotationsVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 702 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\"}, " 703 + "getDeclAnnoVal = \"NULL\", " 704 + "getAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 705 + "getDeclAnnosArgs = {} )") { 706 707 @Override 708 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 709 String className) { 710 String anno = ""; 711 String replaceVal = ""; 712 String contents = ""; 713 JavaFileObject srcFileObj = null; 714 Iterable<? extends JavaFileObject> files = null; 715 716 String expectedVals = "\n" + getExpectedBase() + "\n" 717 + getExpectedContainer() + "\n"; 718 StringBuilder commonStmts = getCommonStmts(false); 719 720 /* 721 Sample testSrc: 722 @Retention(RetentionPolicy.RUNTIME) 723 @Inherited 724 @interface Foo {int value() default Integer.MAX_VALUE;} 725 726 @Retention(RetentionPolicy.RUNTIME) 727 @Inherited 728 @interface FooContainer { 729 Foo[] value(); 730 } 731 732 @FooContainer(value = {@Foo(1), @Foo(2)}) 733 class SuperClass { } 734 735 @ExpectedBase 736 @ExpectedContainer 737 class SubClass extends SuperClass {} 738 */ 739 // @Inherited only works for classes, no switch cases for 740 // method, field, package 741 742 if (srcType == SrcType.CLASS) { 743 // Contents for SuperClass 744 anno = Helper.ContentVars.LEGACYCONTAINER.getVal(); 745 replaceVal = commonStmts + "\n" + anno; 746 String superClassContents = srcType.getTemplate() 747 .replace("#CN", SUPERCLASS) 748 .replace("#REPLACE", replaceVal); 749 750 // Contents for SubClass that extends SuperClass 751 replaceVal = expectedVals; 752 String subClassContents = SrcType.CLASSEXTENDS.getTemplate() 753 .replace("#CN", className) 754 .replace("#SN", SUPERCLASS) 755 .replace("#REPLACE", replaceVal); 756 757 contents = superClassContents + subClassContents; 758 srcFileObj = Helper.getFile(className, contents); 759 files = Arrays.asList(srcFileObj); 760 } 761 return files; 762 } 763 }, 764 ContainerOnSuperSingleOnSub_Inherited_Legacy( 765 "@ExpectedBase(value=Foo.class, " 766 + "getAnnotationVal = \"@Foo(value=0)\", " 767 + "getAnnotationsVals = {" 768 + "\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", \"@Foo(value=0)\"}, " 769 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\"}," 770 + "getDeclAnnoVal = \"@Foo(value=0)\"," 771 + "getAnnosArgs = {\"@Foo(value=0)\"}," 772 + "getDeclAnnosArgs = {\"@Foo(value=0)\"})", 773 "@ExpectedContainer(value=FooContainer.class, " 774 + "getAnnotationVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", " 775 + "getAnnotationsVals = {" 776 + "\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", \"@Foo(value=0)\"}, " 777 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\"}," 778 + "getDeclAnnoVal = \"NULL\"," 779 + "getAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 780 + "getDeclAnnosArgs = {})") { 781 782 @Override 783 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 784 String className) { 785 String anno = ""; 786 String replaceVal = ""; 787 String contents = ""; 788 JavaFileObject srcFileObj = null; 789 Iterable<? extends JavaFileObject> files = null; 790 791 String expectedVals = "\n" + getExpectedBase() + "\n" 792 + getExpectedContainer() + "\n"; 793 StringBuilder commonStmts = getCommonStmts(false); 794 795 /* 796 Sample testSrc: 797 @Retention(RetentionPolicy.RUNTIME) 798 @Inherited 799 @interface Foo {int value() default Integer.MAX_VALUE;} 800 801 @Retention(RetentionPolicy.RUNTIME) 802 @Inherited 803 @interface FooContainer { 804 Foo[] value(); 805 } 806 807 @FooContainer(value = {@Foo(1), @Foo(2)}) 808 class SuperClass { } 809 810 @ExpectedBase 811 @ExpectedContainer 812 @Foo(0) 813 class SubClass extends SuperClass {} 814 */ 815 // @Inherited only works for classes, no switch cases for 816 // method, field, package 817 818 if (srcType == SrcType.CLASS) { 819 // Contents for SuperClass 820 anno = Helper.ContentVars.LEGACYCONTAINER.getVal(); 821 replaceVal = commonStmts + "\n" + anno; 822 String superClassContents = srcType.getTemplate() 823 .replace("#CN", SUPERCLASS) 824 .replace("#REPLACE", replaceVal); 825 826 // Contents for SubClass that extends SuperClass 827 anno = Helper.ContentVars.BASEANNO.getVal(); 828 replaceVal = expectedVals + "\n" + anno; 829 String subClassContents = SrcType.CLASSEXTENDS.getTemplate() 830 .replace("#CN", className) 831 .replace("#SN", SUPERCLASS) 832 .replace("#REPLACE", replaceVal); 833 834 contents = superClassContents + subClassContents; 835 srcFileObj = Helper.getFile(className, contents); 836 files = Arrays.asList(srcFileObj); 837 } 838 return files; 839 } 840 }, 841 // @ignore 8025924: Several test cases in repeatingAnnotations/combo/ReflectionTest 842 // fail with ordering issues 843 ContainerAndSingleOnSuperSingleOnSub_Inherited_Legacy( 844 "@ExpectedBase(value=Foo.class, " 845 + "getAnnotationVal = \"@Foo(value=0)\", " 846 + "getAnnotationsVals = {" 847 + "\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", \"@Foo(value=0)\"}, " 848 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\"}," 849 + "getDeclAnnoVal = \"@Foo(value=0)\"," 850 + "getAnnosArgs = {\"@Foo(value=0)\"}," 851 + "getDeclAnnosArgs = {\"@Foo(value=0)\"})", 852 "@ExpectedContainer(value=FooContainer.class, " 853 + "getAnnotationVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", " 854 + "getAnnotationsVals = {" 855 + "\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", \"@Foo(value=0)\"}, " 856 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\"}," 857 + "getDeclAnnoVal = \"NULL\"," 858 + "getAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 859 + "getDeclAnnosArgs = {})") { 860 861 @Override 862 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 863 String className) { 864 String anno = ""; 865 String replaceVal = ""; 866 String contents = ""; 867 JavaFileObject srcFileObj = null; 868 Iterable<? extends JavaFileObject> files = null; 869 870 String expectedVals = "\n" + getExpectedBase() + "\n" 871 + getExpectedContainer() + "\n"; 872 StringBuilder commonStmts = getCommonStmts(false); 873 874 /* 875 Sample testSrc: 876 @Retention(RetentionPolicy.RUNTIME) 877 @Inherited 878 @interface Foo {int value() default Integer.MAX_VALUE;} 879 880 @Retention(RetentionPolicy.RUNTIME) 881 @Inherited 882 @interface FooContainer { 883 Foo[] value(); 884 } 885 886 @FooContainer(value = {@Foo(1), @Foo(2)}) @Foo(3) 887 class SuperClass { } 888 889 @ExpectedBase 890 @ExpectedContainer 891 @Foo(0) 892 class SubClass extends SuperClass {} 893 */ 894 // @Inherited only works for classes, no switch cases for 895 // method, field, package 896 897 if (srcType == SrcType.CLASS) { 898 // Contents for SuperClass 899 anno = Helper.ContentVars.LEGACYCONTAINER.getVal() 900 + "@Foo(3)"; 901 replaceVal = commonStmts + "\n" + anno; 902 String superClassContents = srcType.getTemplate() 903 .replace("#CN", SUPERCLASS) 904 .replace("#REPLACE", replaceVal); 905 906 // Contents for SubClass that extends SuperClass 907 anno = Helper.ContentVars.BASEANNO.getVal(); 908 replaceVal = expectedVals + "\n" + anno; 909 String subClassContents = SrcType.CLASSEXTENDS.getTemplate() 910 .replace("#CN", className).replace("#SN", SUPERCLASS) 911 .replace("#REPLACE", replaceVal); 912 913 contents = superClassContents + subClassContents; 914 srcFileObj = Helper.getFile(className, contents); 915 files = Arrays.asList(srcFileObj); 916 } 917 return files; 918 } 919 }, 920 // @ignore 8025924: Several test cases in repeatingAnnotations/combo/ReflectionTest 921 // fail with ordering issues 922 SingleOnSuperContainerOnSub_Inherited_Legacy( 923 "@ExpectedBase(value=Foo.class, " 924 + "getAnnotationVal = \"@Foo(value=0)\", " 925 + "getAnnotationsVals = {" 926 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 927 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 928 + "getDeclAnnoVal = \"NULL\"," 929 + "getAnnosArgs = {\"@Foo(value=0)\"}," 930 + "getDeclAnnosArgs = {})", 931 "@ExpectedContainer(value=FooContainer.class, " 932 + "getAnnotationVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", " 933 + "getAnnotationsVals = {" 934 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 935 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 936 + "getDeclAnnoVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"," 937 + "getAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 938 + "getDeclAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"})") { 939 940 @Override 941 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 942 String className) { 943 String anno = ""; 944 String replaceVal = ""; 945 String contents = ""; 946 947 JavaFileObject srcFileObj = null; 948 Iterable<? extends JavaFileObject> files = null; 949 950 String expectedVals = "\n" + getExpectedBase() + "\n" 951 + getExpectedContainer() + "\n"; 952 StringBuilder commonStmts = getCommonStmts(false); 953 954 /* 955 Sample testSrc: 956 @Retention(RetentionPolicy.RUNTIME) 957 @Inherited 958 @interface Foo {int value() default Integer.MAX_VALUE;} 959 960 @Retention(RetentionPolicy.RUNTIME) 961 @Inherited 962 @interface FooContainer { 963 Foo[] value(); 964 } 965 966 @Foo(0) 967 class SuperClass { } 968 969 @ExpectedBase 970 @ExpectedContainer 971 @FooContainer(value = {@Foo(1), @Foo(2)}) 972 class SubClass extends SuperClass {} 973 */ 974 975 if (srcType == SrcType.CLASS) { 976 //Contents for SuperClass 977 anno = Helper.ContentVars.BASEANNO.getVal(); 978 replaceVal = commonStmts + "\n" + anno; 979 String superClassContents = srcType.getTemplate() 980 .replace("#CN", SUPERCLASS) 981 .replace("#REPLACE", replaceVal); 982 983 //Contents for SubClass that extends SuperClass 984 anno = Helper.ContentVars.LEGACYCONTAINER.getVal(); 985 replaceVal = expectedVals + "\n" + anno; 986 String subClassContents = SrcType.CLASSEXTENDS.getTemplate() 987 .replace("#CN", className).replace("#SN", SUPERCLASS) 988 .replace("#REPLACE", replaceVal); 989 990 contents = superClassContents + subClassContents; 991 srcFileObj = Helper.getFile(className, contents); 992 files = Arrays.asList(srcFileObj); 993 } 994 return files; 995 } 996 }, 997 // @ignore 8025924: Several test cases in repeatingAnnotations/combo/ReflectionTest 998 // fail with ordering issues 999 SingleOnSuperContainerAndSingleOnSub_Inherited_Legacy( 1000 "@ExpectedBase(value=Foo.class, " 1001 + "getAnnotationVal = \"@Foo(value=3)\", " 1002 + "getAnnotationsVals = {" 1003 + "\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", \"@Foo(value=3)\"}, " 1004 + "getDeclAnnosVals = {" 1005 + "\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", \"@Foo(value=3)\"}," 1006 + "getDeclAnnoVal = \"@Foo(value=3)\"," 1007 + "getAnnosArgs = {\"@Foo(value=3)\"}," 1008 + "getDeclAnnosArgs = {\"@Foo(value=3)\"})", 1009 "@ExpectedContainer(value=FooContainer.class, " 1010 + "getAnnotationVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", " 1011 + "getAnnotationsVals = {" 1012 + "\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", \"@Foo(value=3)\"}, " 1013 + "getDeclAnnosVals = {" 1014 + "\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", \"@Foo(value=3)\"}," 1015 + "getDeclAnnoVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"," 1016 + "getAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 1017 + "getDeclAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"})") { 1018 1019 @Override 1020 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 1021 String className) { 1022 String anno = ""; 1023 String replaceVal = ""; 1024 String contents = ""; 1025 1026 JavaFileObject srcFileObj = null; 1027 Iterable<? extends JavaFileObject> files = null; 1028 1029 String expectedVals = "\n" + getExpectedBase() + "\n" 1030 + getExpectedContainer() + "\n"; 1031 StringBuilder commonStmts = getCommonStmts(false); 1032 1033 /* 1034 Sample testSrc: 1035 @Retention(RetentionPolicy.RUNTIME) 1036 @Inherited 1037 @interface Foo {int value() default Integer.MAX_VALUE;} 1038 1039 @Retention(RetentionPolicy.RUNTIME) 1040 @Inherited 1041 @interface FooContainer { 1042 Foo[] value(); 1043 } 1044 1045 @Foo(0) 1046 class SuperClass { } 1047 1048 @ExpectedBase 1049 @ExpectedContainer 1050 @FooContainer(value = {@Foo(1), @Foo(2)}) @Foo(3) 1051 class SubClass extends SuperClass {} 1052 */ 1053 1054 if (srcType == SrcType.CLASS) { 1055 //Contents for SuperClass 1056 anno = Helper.ContentVars.BASEANNO.getVal(); 1057 replaceVal = commonStmts + "\n" + anno; 1058 String superClassContents = srcType.getTemplate() 1059 .replace("#CN", SUPERCLASS) 1060 .replace("#REPLACE", replaceVal); 1061 1062 //Contents for SubClass that extends SuperClass 1063 anno = Helper.ContentVars.LEGACYCONTAINER.getVal() 1064 + "@Foo(3)"; 1065 replaceVal = expectedVals + "\n" + anno; 1066 String subClassContents = SrcType.CLASSEXTENDS.getTemplate() 1067 .replace("#CN", className).replace("#SN", SUPERCLASS) 1068 .replace("#REPLACE", replaceVal); 1069 1070 contents = superClassContents + subClassContents; 1071 srcFileObj = Helper.getFile(className, contents); 1072 files = Arrays.asList(srcFileObj); 1073 } 1074 return files; 1075 } 1076 }, 1077 BasicRepeatable( 1078 "@ExpectedBase(value=Foo.class, " 1079 + "getAnnotationVal = \"NULL\", " 1080 + "getAnnotationsVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\" }, " 1081 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 1082 + "getDeclAnnoVal = \"NULL\"," 1083 + "getAnnosArgs = {\"@Foo(value=1)\", \"@Foo(value=2)\"}," 1084 + "getDeclAnnosArgs = {\"@Foo(value=1)\", \"@Foo(value=2)\"})", 1085 "@ExpectedContainer(value=FooContainer.class, " 1086 + "getAnnotationVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"," 1087 + "getAnnotationsVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 1088 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1089 + "getDeclAnnoVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"," 1090 + "getAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 1091 + "getDeclAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"} )") { 1092 1093 @Override 1094 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 1095 String className) { 1096 String anno = ""; 1097 String replaceVal = ""; 1098 String testSrc = ""; 1099 String pkgInfoContents = ""; 1100 String contents = ""; 1101 1102 JavaFileObject pkgFileObj = null; 1103 JavaFileObject srcFileObj = null; 1104 Iterable<? extends JavaFileObject> files = null; 1105 1106 String expectedVals = "\n" + getExpectedBase() + "\n" 1107 + getExpectedContainer() + "\n"; 1108 StringBuilder commonStmts = new StringBuilder(); 1109 1110 anno = Helper.ContentVars.REPEATABLEANNO.getVal(); 1111 commonStmts.append(Helper.ContentVars.IMPORTEXPECTED.getVal()) 1112 .append(Helper.ContentVars.IMPORTSTMTS.getVal()) 1113 .append(Helper.ContentVars.RETENTIONRUNTIME.getVal()) 1114 .append(Helper.ContentVars.REPEATABLE.getVal()) 1115 .append(Helper.ContentVars.BASE.getVal()) 1116 .append(Helper.ContentVars.RETENTIONRUNTIME.getVal()) 1117 .append(Helper.ContentVars.CONTAINER.getVal()); 1118 switch (srcType) { 1119 case PACKAGE: 1120 /* 1121 Sample package-info.java 1122 @ExpectedBase 1123 @ExpectedContainer 1124 @Foo(1) @Foo(2) 1125 package testpkg; 1126 1127 @Retention(RetentionPolicy.RUNTIME) 1128 @Repeatable(FooContainer.class) 1129 @interface Foo {int value() default Integer.MAX_VALUE;} 1130 1131 @Retention(RetentionPolicy.RUNTIME) 1132 @interface FooContainer { 1133 Foo[] value(); 1134 } 1135 1136 Sample testSrc: 1137 package testpkg; 1138 class A {} 1139 */ 1140 testSrc = srcType.getTemplate().replace("#CN", className); 1141 contents = testSrc; 1142 srcFileObj = Helper.getFile(className, contents); 1143 1144 replaceVal = expectedVals + "\n" + anno; 1145 pkgInfoContents = SrcType.PKGINFO.getTemplate() 1146 .replace("#REPLACE1", replaceVal) 1147 .replace("#REPLACE2", commonStmts); 1148 pkgFileObj = Helper.getFile(PKGINFONAME, pkgInfoContents); 1149 files = Arrays.asList(pkgFileObj, srcFileObj); 1150 break; 1151 default: 1152 /* 1153 Sample testSrc for class: 1154 @Retention(RetentionPolicy.RUNTIME) 1155 @Repeatable(FooContainer.class) 1156 @interface Foo {int value() default Integer.MAX_VALUE;} 1157 1158 @Retention(RetentionPolicy.RUNTIME) 1159 @interface FooContainer { 1160 Foo[] value(); 1161 } 1162 1163 @ExpectedBase 1164 @ExpectedContainer 1165 @Foo(1) @Foo(2) 1166 class A { } 1167 */ 1168 replaceVal = expectedVals + anno; 1169 testSrc = srcType.getTemplate().replace("#CN", className) 1170 .replace("#REPLACE", replaceVal); 1171 contents = commonStmts + testSrc; 1172 srcFileObj = Helper.getFile(className, contents); 1173 files = Arrays.asList(srcFileObj); 1174 } 1175 return files; 1176 } 1177 }, 1178 BasicContainerRepeatable( 1179 "@ExpectedBase(value=Foo.class, " 1180 + "getAnnotationVal = \"NULL\", " 1181 + "getAnnotationsVals = {" 1182 + "\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1183 + "getDeclAnnosVals = {" 1184 + "\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 1185 + "getDeclAnnoVal = \"NULL\"," 1186 + "getAnnosArgs = {\"@Foo(value=1)\", \"@Foo(value=2)\"}," 1187 + "getDeclAnnosArgs = {\"@Foo(value=1)\", \"@Foo(value=2)\"})", 1188 "@ExpectedContainer(value=FooContainer.class, " 1189 + "getAnnotationVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"," 1190 + "getAnnotationsVals = {" 1191 + "\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 1192 + "getDeclAnnosVals = {" 1193 + "\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1194 + "getDeclAnnoVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"," 1195 + "getAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 1196 + "getDeclAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"} )") { 1197 1198 @Override 1199 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 1200 String className) { 1201 String anno = ""; 1202 String replaceVal = ""; 1203 String testSrc = ""; 1204 String pkgInfoContents = ""; 1205 String contents = ""; 1206 1207 JavaFileObject pkgFileObj = null; 1208 JavaFileObject srcFileObj = null; 1209 Iterable<? extends JavaFileObject> files = null; 1210 1211 String expectedVals = "\n" + getExpectedBase() + "\n" 1212 + getExpectedContainer() + "\n"; 1213 StringBuilder commonStmts = new StringBuilder(); 1214 1215 anno = Helper.ContentVars.LEGACYCONTAINER.getVal(); 1216 commonStmts.append(Helper.ContentVars.IMPORTEXPECTED.getVal()) 1217 .append(Helper.ContentVars.IMPORTSTMTS.getVal()) 1218 .append(Helper.ContentVars.RETENTIONRUNTIME.getVal()) 1219 .append(Helper.ContentVars.REPEATABLE.getVal()) 1220 .append(Helper.ContentVars.BASE.getVal()) 1221 .append(Helper.ContentVars.RETENTIONRUNTIME.getVal()) 1222 .append(Helper.ContentVars.CONTAINER.getVal()); 1223 switch (srcType) { 1224 case PACKAGE: 1225 /* 1226 Sample package-info.java 1227 @ExpectedBase 1228 @ExpectedContainer 1229 @FooContainer(value = {@Foo(1), @Foo(2)}) 1230 package testpkg; 1231 1232 @Retention(RetentionPolicy.RUNTIME) 1233 @Repeatable(FooContainer.class) 1234 @interface Foo {int value() default Integer.MAX_VALUE;} 1235 1236 @Retention(RetentionPolicy.RUNTIME) 1237 @interface FooContainer { 1238 Foo[] value(); 1239 } 1240 1241 Sample testSrc: 1242 package testpkg; 1243 class A {} 1244 */ 1245 testSrc = srcType.getTemplate().replace("#CN", className); 1246 contents = testSrc; 1247 srcFileObj = Helper.getFile(className, contents); 1248 1249 replaceVal = expectedVals + "\n" + anno; 1250 pkgInfoContents = SrcType.PKGINFO.getTemplate() 1251 .replace("#REPLACE1", replaceVal) 1252 .replace("#REPLACE2", commonStmts); 1253 pkgFileObj = Helper.getFile(PKGINFONAME, pkgInfoContents); 1254 files = Arrays.asList(pkgFileObj, srcFileObj); 1255 break; 1256 default: 1257 /* 1258 Sample testSrc for class: 1259 @Retention(RetentionPolicy.RUNTIME) 1260 @Repeatable(FooContainer.class) 1261 @interface Foo {int value() default Integer.MAX_VALUE;} 1262 1263 @Retention(RetentionPolicy.RUNTIME) 1264 @interface FooContainer { 1265 Foo[] value(); 1266 } 1267 1268 @ExpectedBase 1269 @ExpectedContainer 1270 @FooContainer(value = {@Foo(1), @Foo(2)}) 1271 class A { } 1272 */ 1273 replaceVal = expectedVals + anno; 1274 testSrc = srcType.getTemplate().replace("#CN", className) 1275 .replace("#REPLACE", replaceVal); 1276 contents = commonStmts + testSrc; 1277 srcFileObj = Helper.getFile(className, contents); 1278 files = Arrays.asList(srcFileObj); 1279 } 1280 return files; 1281 } 1282 }, 1283 BasicContainerRepeatable_Inherited( 1284 "@ExpectedBase(value=Foo.class, " 1285 + "getAnnotationVal = \"NULL\", " 1286 + "getAnnotationsVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1287 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\"}, " 1288 + "getDeclAnnoVal = \"NULL\", " 1289 + "getAnnosArgs = {\"@Foo(value=1)\", \"@Foo(value=2)\"}, " 1290 + "getDeclAnnosArgs = {})", 1291 "@ExpectedContainer(value=FooContainer.class, " 1292 + "getAnnotationVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", " 1293 + "getAnnotationsVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1294 + "getDeclAnnosVals = { \"ExpectedBase\", \"ExpectedContainer\"}, " 1295 + "getDeclAnnoVal = \"NULL\", " 1296 + "getAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1297 + "getDeclAnnosArgs = {})") { 1298 1299 @Override 1300 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 1301 String className) { 1302 String anno = ""; 1303 String replaceVal = ""; 1304 String contents = ""; 1305 JavaFileObject srcFileObj = null; 1306 Iterable<? extends JavaFileObject> files = null; 1307 1308 String expectedVals = "\n" + getExpectedBase() + "\n" 1309 + getExpectedContainer() + "\n"; 1310 StringBuilder commonStmts = getCommonStmts(true); 1311 /* 1312 Sample testSrc: 1313 @Retention(RetentionPolicy.RUNTIME) 1314 @Inherited 1315 @Repeatable(FooContainer.class) 1316 @interface Foo {int value() default Integer.MAX_VALUE;} 1317 1318 @Retention(RetentionPolicy.RUNTIME) 1319 @Inherited 1320 @interface FooContainer { 1321 Foo[] value(); 1322 } 1323 1324 @FooContainer(value = {@Foo(1), @Foo(2)}) 1325 class SuperClass { } 1326 1327 @ExpectedBase 1328 @ExpectedContainer 1329 class SubClass extends SuperClass { } 1330 */ 1331 // @Inherited only works for classes, no switch cases for 1332 // method, field, package 1333 anno = Helper.ContentVars.LEGACYCONTAINER.getVal(); 1334 1335 if (srcType == SrcType.CLASS) { 1336 // Contents for SuperClass 1337 replaceVal = commonStmts + "\n" + anno; 1338 String superClassContents = srcType.getTemplate() 1339 .replace("#CN", SUPERCLASS) 1340 .replace("#REPLACE", replaceVal); 1341 1342 // Contents for SubClass that extends SuperClass 1343 replaceVal = expectedVals; 1344 String subClassContents = SrcType.CLASSEXTENDS.getTemplate() 1345 .replace("#CN", className) 1346 .replace("#SN", SUPERCLASS) 1347 .replace("#REPLACE", replaceVal); 1348 1349 contents = superClassContents + subClassContents; 1350 srcFileObj = Helper.getFile(className, contents); 1351 files = Arrays.asList(srcFileObj); 1352 } 1353 return files; 1354 } 1355 }, 1356 RepeatableAnnoInherited( 1357 "@ExpectedBase(value=Foo.class, " 1358 + "getAnnotationVal = \"NULL\", " 1359 + "getAnnotationsVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1360 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\"}, " 1361 + // ignores inherited annotations 1362 "getDeclAnnoVal = \"NULL\", " 1363 + // ignores inherited 1364 "getAnnosArgs = {\"@Foo(value=1)\", \"@Foo(value=2)\"}, " 1365 + "getDeclAnnosArgs = {})", // ignores inherited 1366 "@ExpectedContainer(value=FooContainer.class, " 1367 + "getAnnotationVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", " 1368 + "getAnnotationsVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1369 + "getDeclAnnosVals = { \"ExpectedBase\", \"ExpectedContainer\"}, " 1370 + // ignores inherited annotations 1371 "getDeclAnnoVal = \"NULL\", " 1372 + // ignores inherited 1373 "getAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1374 + "getDeclAnnosArgs = {})") { // ignores inherited 1375 1376 @Override 1377 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 1378 String className) { 1379 String anno = ""; 1380 String replaceVal = ""; 1381 String contents = ""; 1382 JavaFileObject srcFileObj = null; 1383 Iterable<? extends JavaFileObject> files = null; 1384 1385 String expectedVals = "\n" + getExpectedBase() + "\n" 1386 + getExpectedContainer() + "\n"; 1387 StringBuilder commonStmts = getCommonStmts(true); 1388 /* 1389 Sample testSrc: 1390 @Retention(RetentionPolicy.RUNTIME) 1391 @Inherited 1392 @Repeatable(FooContainer.class) 1393 @interface Foo {int value() default Integer.MAX_VALUE;} 1394 1395 @Retention(RetentionPolicy.RUNTIME) 1396 @Inherited 1397 @interface FooContainer { 1398 Foo[] value(); 1399 } 1400 1401 @Foo(1) @Foo(2) 1402 class SuperClass { } 1403 1404 @ExpectedBase 1405 @ExpectedContainer 1406 class SubClass extends SuperClass { } 1407 */ 1408 // @Inherited only works for classes, no switch cases for 1409 // method, field, package 1410 anno = Helper.ContentVars.REPEATABLEANNO.getVal(); 1411 1412 if (srcType == SrcType.CLASS) { 1413 // Contents for SuperClass 1414 replaceVal = commonStmts + "\n" + anno; 1415 String superClassContents = srcType.getTemplate() 1416 .replace("#CN", SUPERCLASS) 1417 .replace("#REPLACE", replaceVal); 1418 1419 // Contents for SubClass that extends SuperClass 1420 replaceVal = expectedVals; 1421 String subClassContents = SrcType.CLASSEXTENDS.getTemplate() 1422 .replace("#CN", className) 1423 .replace("#SN", SUPERCLASS) 1424 .replace("#REPLACE", replaceVal); 1425 1426 contents = superClassContents + subClassContents; 1427 srcFileObj = Helper.getFile(className, contents); 1428 files = Arrays.asList(srcFileObj); 1429 } 1430 return files; 1431 } 1432 }, 1433 // @ignore 8025924: Several test cases in repeatingAnnotations/combo/ReflectionTest 1434 // fail with ordering issues 1435 SingleAnnoWithContainer( 1436 "@ExpectedBase(value=Foo.class, " 1437 + "getAnnotationVal = \"@Foo(value=0)\", " 1438 + "getAnnotationsVals = {" 1439 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 1440 + "getDeclAnnosVals = {" 1441 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 1442 + "getDeclAnnoVal = \"@Foo(value=0)\"," 1443 + "getAnnosArgs = {\"@Foo(value=0)\", \"@Foo(value=1)\", \"@Foo(value=2)\"}," 1444 + "getDeclAnnosArgs = {\"@Foo(value=0)\", \"@Foo(value=1)\",\"@Foo(value=2)\"})", 1445 "@ExpectedContainer(value=FooContainer.class, " 1446 + "getAnnotationVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", " 1447 + "getAnnotationsVals = {" 1448 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 1449 + "getDeclAnnosVals = {" 1450 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1451 + "getDeclAnnoVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"," 1452 + "getDeclAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 1453 + "getAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"})") { 1454 1455 @Override 1456 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 1457 String className) { 1458 String anno = ""; 1459 String replaceVal = ""; 1460 String testSrc = ""; 1461 String pkgInfoContents = ""; 1462 String contents = ""; 1463 1464 JavaFileObject pkgFileObj = null; 1465 JavaFileObject srcFileObj = null; 1466 Iterable<? extends JavaFileObject> files = null; 1467 1468 String expectedVals = "\n" + getExpectedBase() + "\n" 1469 + getExpectedContainer() + "\n"; 1470 StringBuilder commonStmts = new StringBuilder(); 1471 1472 anno = Helper.ContentVars.BASEANNO.getVal() + " " 1473 + Helper.ContentVars.LEGACYCONTAINER.getVal(); 1474 commonStmts.append(Helper.ContentVars.IMPORTEXPECTED.getVal()) 1475 .append(Helper.ContentVars.IMPORTSTMTS.getVal()) 1476 .append(Helper.ContentVars.RETENTIONRUNTIME.getVal()) 1477 .append(Helper.ContentVars.REPEATABLE.getVal()) 1478 .append(Helper.ContentVars.BASE.getVal()) 1479 .append(Helper.ContentVars.RETENTIONRUNTIME.getVal()) 1480 .append(Helper.ContentVars.CONTAINER.getVal()); 1481 switch (srcType) { 1482 case PACKAGE: 1483 /* 1484 Sample package-info.java 1485 @ExpectedBase 1486 @ExpectedContainer 1487 @Foo(0) @FooContainer(value = {@Foo(1), @Foo(2)}) 1488 package testpkg; 1489 1490 @Retention(RetentionPolicy.RUNTIME) 1491 @Repeatable(FooContainer.class) 1492 @interface Foo {int value() default Integer.MAX_VALUE;} 1493 1494 @Retention(RetentionPolicy.RUNTIME) 1495 @interface FooContainer { 1496 Foo[] value(); 1497 } 1498 1499 Sample testSrc: 1500 package testpkg; 1501 class A {} 1502 */ 1503 testSrc = srcType.getTemplate().replace("#CN", className); 1504 contents = testSrc; 1505 srcFileObj = Helper.getFile(className, contents); 1506 1507 replaceVal = expectedVals + "\n" + anno; 1508 pkgInfoContents = SrcType.PKGINFO.getTemplate() 1509 .replace("#REPLACE1", replaceVal) 1510 .replace("#REPLACE2", commonStmts); 1511 pkgFileObj = Helper.getFile(PKGINFONAME, pkgInfoContents); 1512 files = Arrays.asList(pkgFileObj, srcFileObj); 1513 break; 1514 default: 1515 /* 1516 Sample testSrc: 1517 @Retention(RetentionPolicy.RUNTIME) 1518 @Inherited 1519 @Repeatable(FooContainer.class) 1520 @interface Foo {int value() default Integer.MAX_VALUE;} 1521 1522 @Retention(RetentionPolicy.RUNTIME) 1523 @Inherited 1524 @interface FooContainer { 1525 Foo[] value(); 1526 } 1527 1528 @ExpectedBase 1529 @ExpectedContainer 1530 @Foo(0) @FooContainer(value = {@Foo(1), @Foo(2)}) 1531 class A { } 1532 */ 1533 replaceVal = expectedVals + anno; 1534 testSrc = srcType.getTemplate() 1535 .replace("#CN", className) 1536 .replace("#REPLACE", replaceVal); 1537 contents = commonStmts + testSrc; 1538 srcFileObj = Helper.getFile(className, contents); 1539 files = Arrays.asList(srcFileObj); 1540 } 1541 return files; 1542 } 1543 }, 1544 AnnoOnSuperAndSubClass_Inherited( 1545 "@ExpectedBase(value=Foo.class, " 1546 + "getAnnotationVal = \"@Foo(value=1)\", " 1547 + "getAnnotationsVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=1)\" }, " 1548 + // override every annotation on superClass 1549 "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=1)\"}, " 1550 + // ignores inherited annotations 1551 "getDeclAnnoVal = \"@Foo(value=1)\", " // ignores inherited 1552 + "getAnnosArgs = {\"@Foo(value=1)\"}, " 1553 + "getDeclAnnosArgs = { \"@Foo(value=1)\" })", // ignores inherited 1554 "@ExpectedContainer(value=FooContainer.class, " 1555 + "getAnnotationVal = \"NULL\", " 1556 + "getAnnotationsVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=1)\" }, " 1557 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=1)\"}, " 1558 + // ignores inherited annotations 1559 "getDeclAnnoVal = \"NULL\", " + // ignores inherited 1560 "getAnnosArgs = {}, " + "getDeclAnnosArgs = {})") { 1561 1562 @Override 1563 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 1564 String className) { 1565 String anno = ""; 1566 String replaceVal = ""; 1567 String contents = ""; 1568 JavaFileObject srcFileObj = null; 1569 Iterable<? extends JavaFileObject> files = null; 1570 1571 String expectedVals = "\n" + getExpectedBase() + "\n" 1572 + getExpectedContainer() + "\n"; 1573 StringBuilder commonStmts = getCommonStmts(true); 1574 1575 /* 1576 Sample testSrc: 1577 @Retention(RetentionPolicy.RUNTIME) 1578 @Inherited 1579 @Repeatable(FooContainer.class) 1580 @interface Foo {int value() default Integer.MAX_VALUE;} 1581 1582 @Retention(RetentionPolicy.RUNTIME) 1583 @Inherited 1584 @interface FooContainer { 1585 Foo[] value(); 1586 } 1587 1588 @Foo(0) 1589 class SuperClass { } 1590 1591 @ExpectedBase 1592 @ExpectedContainer 1593 @Foo(1) 1594 class SubClass extends SuperClass { } 1595 */ 1596 // @Inherited only works for classes, no switch cases for 1597 // method, field, package 1598 1599 if (srcType == SrcType.CLASS) { 1600 // Contents for SuperClass 1601 anno = Helper.ContentVars.BASEANNO.getVal(); 1602 replaceVal = commonStmts + "\n" + anno; 1603 String superClassContents = srcType.getTemplate() 1604 .replace("#CN", SUPERCLASS) 1605 .replace("#REPLACE", replaceVal); 1606 1607 // Contents for SubClass that extends SuperClass 1608 replaceVal = expectedVals + "\n" + "@Foo(1)"; 1609 String subClassContents = SrcType.CLASSEXTENDS.getTemplate() 1610 .replace("#CN", className) 1611 .replace("#SN", SUPERCLASS) 1612 .replace("#REPLACE", replaceVal); 1613 1614 contents = superClassContents + subClassContents; 1615 srcFileObj = Helper.getFile(className, contents); 1616 files = Arrays.asList(srcFileObj); 1617 } 1618 return files; 1619 } 1620 }, 1621 // @ignore 8025924: Several test cases in repeatingAnnotations/combo/ReflectionTest 1622 // fail with ordering issues 1623 RepeatableOnSuperSingleOnSub_Inherited( 1624 "@ExpectedBase(value=Foo.class, " 1625 + "getAnnotationVal = \"@Foo(value=3)\", " 1626 + "getAnnotationsVals = {" 1627 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=3)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1628 + //override every annotation on superClass 1629 "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=3)\"}, " 1630 + // ignores inherited annotations 1631 "getDeclAnnoVal = \"@Foo(value=3)\", " // ignores inherited 1632 + "getAnnosArgs = {\"@Foo(value=3)\"}, " 1633 + "getDeclAnnosArgs = { \"@Foo(value=3)\" })", // ignores inherited 1634 "@ExpectedContainer(value=FooContainer.class, " 1635 + "getAnnotationVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", " 1636 + "getAnnotationsVals = {" 1637 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=3)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1638 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=3)\"}, " 1639 + // ignores inherited annotations 1640 "getDeclAnnoVal = \"NULL\", " 1641 + "getAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1642 + "getDeclAnnosArgs = {}) // ignores inherited ") { 1643 1644 @Override 1645 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 1646 String className) { 1647 String anno = ""; 1648 String replaceVal = ""; 1649 String contents = ""; 1650 JavaFileObject srcFileObj = null; 1651 Iterable<? extends JavaFileObject> files = null; 1652 1653 String expectedVals = "\n" + getExpectedBase() + "\n" 1654 + getExpectedContainer() + "\n"; 1655 StringBuilder commonStmts = getCommonStmts(true); 1656 1657 /* 1658 Sample testSrc: 1659 @Retention(RetentionPolicy.RUNTIME) 1660 @Inherited 1661 @Repeatable(FooContainer.class) 1662 @interface Foo {int value() default Integer.MAX_VALUE;} 1663 1664 @Retention(RetentionPolicy.RUNTIME) 1665 @Inherited 1666 @interface FooContainer { 1667 Foo[] value(); 1668 } 1669 1670 @Foo(1) @Foo(2) 1671 class SuperClass { } 1672 1673 @ExpectedBase 1674 @ExpectedContainer 1675 @Foo(3) 1676 class SubClass extends SuperClass { } 1677 */ 1678 //@Inherited only works for classes, no switch cases for method, field, package 1679 if (srcType == SrcType.CLASS) { 1680 //Contents for SuperClass 1681 anno = Helper.ContentVars.REPEATABLEANNO.getVal(); 1682 replaceVal = commonStmts + "\n" + anno; 1683 String superClassContents = srcType.getTemplate() 1684 .replace("#CN", SUPERCLASS) 1685 .replace("#REPLACE", replaceVal); 1686 1687 //Contents for SubClass that extends SuperClass 1688 anno = "@Foo(3)"; 1689 replaceVal = expectedVals + "\n" + anno; 1690 String subClassContents = SrcType.CLASSEXTENDS.getTemplate() 1691 .replace("#CN", className) 1692 .replace("#SN", SUPERCLASS) 1693 .replace("#REPLACE", replaceVal); 1694 contents = superClassContents + subClassContents; 1695 srcFileObj = Helper.getFile(className, contents); 1696 files = Arrays.asList(srcFileObj); 1697 } 1698 return files; 1699 } 1700 }, 1701 // @ignore 8025924: Several test cases in repeatingAnnotations/combo/ReflectionTest 1702 // fail with ordering issues 1703 SingleOnSuperRepeatableOnSub_Inherited( 1704 "@ExpectedBase(value=Foo.class, " 1705 + "getAnnotationVal = \"@Foo(value=0)\", " 1706 + "getAnnotationsVals = {" 1707 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1708 + //override every annotation on superClass 1709 "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1710 + // ignores inherited annotations 1711 "getDeclAnnoVal = \"NULL\","// ignores inherited 1712 + "getAnnosArgs = {\"@Foo(value=1)\", \"@Foo(value=2)\"}, " 1713 + "getDeclAnnosArgs = { \"@Foo(value=1)\", \"@Foo(value=2)\"})", 1714 "@ExpectedContainer(value=FooContainer.class, " 1715 + "getAnnotationVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", " 1716 + "getAnnotationsVals = {" 1717 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1718 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1719 + // ignores inherited annotations 1720 "getDeclAnnoVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", "// ignores inherited 1721 + "getAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1722 + "getDeclAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"})") { 1723 1724 @Override 1725 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 1726 String className) { 1727 String anno = ""; 1728 String replaceVal = ""; 1729 String contents = ""; 1730 JavaFileObject srcFileObj = null; 1731 Iterable<? extends JavaFileObject> files = null; 1732 1733 String expectedVals = "\n" + getExpectedBase() + "\n" 1734 + getExpectedContainer() + "\n"; 1735 StringBuilder commonStmts = getCommonStmts(true); 1736 1737 /* 1738 Sample testSrc: 1739 @Retention(RetentionPolicy.RUNTIME) 1740 @Inherited 1741 @Repeatable(FooContainer.class) 1742 @interface Foo {int value() default Integer.MAX_VALUE;} 1743 1744 @Retention(RetentionPolicy.RUNTIME) 1745 @Inherited 1746 @interface FooContainer { 1747 Foo[] value(); 1748 } 1749 1750 @Foo(0) 1751 class SuperClass { } 1752 1753 @ExpectedBase 1754 @ExpectedContainer 1755 @Foo(1) @Foo(2) 1756 class SubClass extends SuperClass { } 1757 */ 1758 //@Inherited only works for classes, no switch cases for method, field, package 1759 if (srcType == SrcType.CLASS) { 1760 //Contents for SuperClass 1761 anno = Helper.ContentVars.BASEANNO.getVal(); 1762 replaceVal = commonStmts + "\n" + anno; 1763 String superClassContents = srcType.getTemplate() 1764 .replace("#CN", SUPERCLASS) 1765 .replace("#REPLACE", replaceVal); 1766 1767 //Contents for SubClass that extends SuperClass 1768 anno = Helper.ContentVars.REPEATABLEANNO.getVal(); 1769 replaceVal = expectedVals + "\n" + anno; 1770 String subClassContents = SrcType.CLASSEXTENDS.getTemplate() 1771 .replace("#CN", className) 1772 .replace("#SN", SUPERCLASS) 1773 .replace("#REPLACE", replaceVal); 1774 1775 contents = superClassContents + subClassContents; 1776 srcFileObj = Helper.getFile(className, contents); 1777 files = Arrays.asList(srcFileObj); 1778 } 1779 return files; 1780 } 1781 }, 1782 // @ignore 8025924: Several test cases in repeatingAnnotations/combo/ReflectionTest 1783 // fail with ordering issues 1784 ContainerOnSuperSingleOnSub_Inherited( 1785 "@ExpectedBase(value=Foo.class, " 1786 + "getAnnotationVal = \"@Foo(value=0)\", " 1787 + "getAnnotationsVals = {" 1788 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1789 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\"}," 1790 + "getDeclAnnoVal = \"@Foo(value=0)\"," 1791 + "getAnnosArgs = {\"@Foo(value=0)\"}," 1792 + "getDeclAnnosArgs = {\"@Foo(value=0)\"})", 1793 "@ExpectedContainer(value=FooContainer.class, " 1794 + "getAnnotationVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", " 1795 + "getAnnotationsVals = {" 1796 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1797 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\"}," 1798 + "getDeclAnnoVal = \"NULL\"," 1799 + "getAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 1800 + "getDeclAnnosArgs = {})") { 1801 1802 @Override 1803 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 1804 String className) { 1805 String anno = ""; 1806 String replaceVal = ""; 1807 String contents = ""; 1808 JavaFileObject srcFileObj = null; 1809 Iterable<? extends JavaFileObject> files = null; 1810 1811 String expectedVals = "\n" + getExpectedBase() + "\n" 1812 + getExpectedContainer() + "\n"; 1813 StringBuilder commonStmts = getCommonStmts(true); 1814 1815 /* 1816 Sample testSrc: 1817 @Retention(RetentionPolicy.RUNTIME) 1818 @Inherited 1819 @Repeatable(FooContainer.class) 1820 @interface Foo {int value() default Integer.MAX_VALUE;} 1821 1822 @Retention(RetentionPolicy.RUNTIME) 1823 @Inherited 1824 @interface FooContainer { 1825 Foo[] value(); 1826 } 1827 1828 @FooContainer(value = {@Foo(1), @Foo(2)}) 1829 class SuperClass { } 1830 1831 @ExpectedBase 1832 @ExpectedContainer 1833 @Foo(0) 1834 class SubClass extends SuperClass { } 1835 */ 1836 //@Inherited only works for classes, no switch cases for method, field, package 1837 if (srcType == SrcType.CLASS) { 1838 //Contents for SuperClass 1839 anno = Helper.ContentVars.LEGACYCONTAINER.getVal(); 1840 replaceVal = commonStmts + "\n" + anno; 1841 String superClassContents = srcType.getTemplate() 1842 .replace("#CN", SUPERCLASS) 1843 .replace("#REPLACE", replaceVal); 1844 1845 //Contents for SubClass that extends SuperClass 1846 anno = Helper.ContentVars.BASEANNO.getVal(); 1847 replaceVal = expectedVals + "\n" + anno; 1848 String subClassContents = SrcType.CLASSEXTENDS.getTemplate() 1849 .replace("#CN", className) 1850 .replace("#SN", SUPERCLASS) 1851 .replace("#REPLACE", replaceVal); 1852 1853 contents = superClassContents + subClassContents; 1854 srcFileObj = Helper.getFile(className, contents); 1855 files = Arrays.asList(srcFileObj); 1856 } 1857 return files; 1858 } 1859 }, 1860 // @ignore 8025924: Several test cases in repeatingAnnotations/combo/ReflectionTest 1861 // fail with ordering issues 1862 SingleOnSuperContainerOnSub_Inherited( 1863 "@ExpectedBase(value=Foo.class, " 1864 + "getAnnotationVal = \"@Foo(value=0)\", " 1865 + "getAnnotationsVals = {" 1866 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1867 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 1868 + "getDeclAnnoVal = \"NULL\"," 1869 + "getAnnosArgs = {\"@Foo(value=1)\", \"@Foo(value=2)\"}," 1870 + "getDeclAnnosArgs = {\"@Foo(value=1)\", \"@Foo(value=2)\"})", 1871 "@ExpectedContainer(value=FooContainer.class, " 1872 + "getAnnotationVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", " 1873 + "getAnnotationsVals = {" 1874 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 1875 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 1876 + "getDeclAnnoVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"," 1877 + "getAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 1878 + "getDeclAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"})") { 1879 1880 @Override 1881 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 1882 String className) { 1883 String anno = ""; 1884 String replaceVal = ""; 1885 String contents = ""; 1886 JavaFileObject srcFileObj = null; 1887 Iterable<? extends JavaFileObject> files = null; 1888 1889 String expectedVals = "\n" + getExpectedBase() + "\n" 1890 + getExpectedContainer() + "\n"; 1891 StringBuilder commonStmts = getCommonStmts(true); 1892 1893 /* 1894 Sample testSrc: 1895 @Retention(RetentionPolicy.RUNTIME) 1896 @Inherited 1897 @Repeatable(FooContainer.class) 1898 @interface Foo {int value() default Integer.MAX_VALUE;} 1899 1900 @Retention(RetentionPolicy.RUNTIME) 1901 @Inherited 1902 @interface FooContainer { 1903 Foo[] value(); 1904 } 1905 1906 @Foo(0) 1907 class SuperClass { } 1908 1909 @ExpectedBase 1910 @ExpectedContainer 1911 @FooContainer(value = {@Foo(1), @Foo(2)}) 1912 class SubClass extends SuperClass { } 1913 */ 1914 //@Inherited only works for classes, no switch cases for method, field, package 1915 if (srcType == SrcType.CLASS) { 1916 //Contents for SuperClass 1917 anno = Helper.ContentVars.BASEANNO.getVal(); 1918 replaceVal = commonStmts + "\n" + anno; 1919 String superClassContents = srcType.getTemplate() 1920 .replace("#CN", SUPERCLASS) 1921 .replace("#REPLACE", replaceVal); 1922 1923 //Contents for SubClass that extends SuperClass 1924 anno = Helper.ContentVars.LEGACYCONTAINER.getVal(); 1925 replaceVal = expectedVals + "\n" + anno; 1926 String subClassContents = SrcType.CLASSEXTENDS.getTemplate() 1927 .replace("#CN", className) 1928 .replace("#SN", SUPERCLASS) 1929 .replace("#REPLACE", replaceVal); 1930 1931 contents = superClassContents + subClassContents; 1932 srcFileObj = Helper.getFile(className, contents); 1933 files = Arrays.asList(srcFileObj); 1934 } 1935 return files; 1936 } 1937 }, 1938 // @ignore 8025924: Several test cases in repeatingAnnotations/combo/ReflectionTest 1939 // fail with ordering issues 1940 SingleOnSuperContainerAndSingleOnSub_Inherited( 1941 "@ExpectedBase(value=Foo.class, " 1942 + "getAnnotationVal = \"@Foo(value=3)\", " 1943 + "getAnnotationsVals = {" 1944 + "\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", \"@Foo(value=3)\"}, " 1945 + "getDeclAnnosVals = {" 1946 + "\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", \"@Foo(value=3)\"}," 1947 + "getDeclAnnoVal = \"@Foo(value=3)\"," 1948 + "getAnnosArgs = {\"@Foo(value=1)\", \"@Foo(value=2)\", \"@Foo(value=3)\"}," 1949 + "getDeclAnnosArgs = {\"@Foo(value=1)\", \"@Foo(value=2)\", \"@Foo(value=3)\"})", 1950 "@ExpectedContainer(value=FooContainer.class, " 1951 + "getAnnotationVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", " 1952 + "getAnnotationsVals = {" 1953 + "\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", \"@Foo(value=3)\"}, " 1954 + "getDeclAnnosVals = {" 1955 + "\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", \"@Foo(value=3)\"}," 1956 + "getDeclAnnoVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"," 1957 + "getAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 1958 + "getDeclAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"})") { 1959 1960 @Override 1961 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 1962 String className) { 1963 String anno = ""; 1964 String replaceVal = ""; 1965 String contents = ""; 1966 JavaFileObject srcFileObj = null; 1967 Iterable<? extends JavaFileObject> files = null; 1968 String expectedVals = "\n" + getExpectedBase() + "\n" 1969 + getExpectedContainer() + "\n"; 1970 StringBuilder commonStmts = getCommonStmts(true); 1971 1972 /* 1973 Sample testSrc: 1974 @Retention(RetentionPolicy.RUNTIME) 1975 @Inherited 1976 @interface Foo {int value() default Integer.MAX_VALUE;} 1977 1978 @Retention(RetentionPolicy.RUNTIME) 1979 @Inherited 1980 @Repeatable(FooContainer.class) 1981 @interface FooContainer { 1982 Foo[] value(); 1983 } 1984 1985 @Foo(0) 1986 class SuperClass { } 1987 1988 @ExpectedBase 1989 @ExpectedContainer 1990 @FooContainer(value = {@Foo(1), @Foo(2)}) @Foo(3) 1991 class SubClass extends SuperClass {} 1992 */ 1993 1994 if (srcType == SrcType.CLASS) { 1995 //Contents for SuperClass 1996 anno = Helper.ContentVars.BASEANNO.getVal(); 1997 replaceVal = commonStmts + "\n" + anno; 1998 String superClassContents = srcType.getTemplate() 1999 .replace("#CN", SUPERCLASS) 2000 .replace("#REPLACE", replaceVal); 2001 2002 //Contents for SubClass that extends SuperClass 2003 anno = Helper.ContentVars.LEGACYCONTAINER.getVal() 2004 + "@Foo(3)"; 2005 replaceVal = expectedVals + "\n" + anno; 2006 String subClassContents = SrcType.CLASSEXTENDS.getTemplate() 2007 .replace("#CN", className) 2008 .replace("#SN", SUPERCLASS) 2009 .replace("#REPLACE", replaceVal); 2010 2011 contents = superClassContents + subClassContents; 2012 srcFileObj = Helper.getFile(className, contents); 2013 files = Arrays.asList(srcFileObj); 2014 } 2015 return files; 2016 } 2017 }, 2018 // @ignore 8025924: Several test cases in repeatingAnnotations/combo/ReflectionTest 2019 // fail with ordering issues 2020 ContainerAndSingleOnSuperSingleOnSub_Inherited( 2021 "@ExpectedBase(value=Foo.class, " 2022 + "getAnnotationVal = \"@Foo(value=0)\", " 2023 + "getAnnotationsVals = {" 2024 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 2025 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\"}," 2026 + "getDeclAnnoVal = \"@Foo(value=0)\"," 2027 + "getAnnosArgs = {\"@Foo(value=0)\"}," 2028 + "getDeclAnnosArgs = {\"@Foo(value=0)\"})", 2029 "@ExpectedContainer(value=FooContainer.class, " 2030 + "getAnnotationVal = \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\", " 2031 + "getAnnotationsVals = {" 2032 + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}, " 2033 + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\"}," 2034 + "getDeclAnnoVal = \"NULL\"," 2035 + "getAnnosArgs = {\"@FooContainer(value={@Foo(value=1), @Foo(value=2)})\"}," 2036 + "getDeclAnnosArgs = {})") { 2037 2038 @Override 2039 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 2040 String className) { 2041 String anno = ""; 2042 String replaceVal = ""; 2043 String contents = ""; 2044 JavaFileObject srcFileObj = null; 2045 Iterable<? extends JavaFileObject> files = null; 2046 2047 String expectedVals = "\n" + getExpectedBase() + "\n" 2048 + getExpectedContainer() + "\n"; 2049 StringBuilder commonStmts = getCommonStmts(true); 2050 2051 /* 2052 Sample testSrc: 2053 @Retention(RetentionPolicy.RUNTIME) 2054 @Inherited 2055 @Repeatable(FooContainer.class) 2056 @interface Foo {int value() default Integer.MAX_VALUE;} 2057 2058 @Retention(RetentionPolicy.RUNTIME) 2059 @Inherited 2060 @interface FooContainer { 2061 Foo[] value(); 2062 } 2063 2064 @FooContainer(value = {@Foo(1), @Foo(2)}) 2065 @Foo(3) 2066 class SuperClass { } 2067 2068 @ExpectedBase 2069 @ExpectedContainer 2070 @Foo(0) 2071 class SubClass extends SuperClass { } 2072 */ 2073 2074 //@Inherited only works for classes, no switch cases for method, field, package 2075 if (srcType == SrcType.CLASS) { 2076 //Contents for SuperClass 2077 anno = Helper.ContentVars.LEGACYCONTAINER.getVal() 2078 + "@Foo(3)" ; 2079 replaceVal = commonStmts + "\n" + anno; 2080 String superClassContents = srcType.getTemplate() 2081 .replace("#CN", SUPERCLASS) 2082 .replace("#REPLACE", replaceVal); 2083 2084 //Contents for SubClass that extends SuperClass 2085 anno = Helper.ContentVars.BASEANNO.getVal(); 2086 replaceVal = expectedVals + "\n" + anno; 2087 String subClassContents = SrcType.CLASSEXTENDS.getTemplate() 2088 .replace("#CN", className) 2089 .replace("#SN", SUPERCLASS) 2090 .replace("#REPLACE", replaceVal); 2091 2092 contents = superClassContents + subClassContents; 2093 srcFileObj = Helper.getFile(className, contents); 2094 files = Arrays.asList(srcFileObj); 2095 } 2096 return files; 2097 } 2098 }; 2099 2100 private String expectedBase, expectedContainer; 2101 2102 private TestCase(String expectedBase, String expectedContainer) { 2103 this.expectedBase = expectedBase; 2104 this.expectedContainer = expectedContainer; 2105 } 2106 2107 public String getExpectedBase() { 2108 return expectedBase; 2109 } 2110 2111 public String getExpectedContainer() { 2112 return expectedContainer; 2113 } 2114 2115 // Each enum element should override this method 2116 public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, 2117 String className) { 2118 return null; 2119 } 2120 } 2121 2122 /* 2123 * Each srctype has its template defined used for test src generation 2124 * Primary src types: class, method, field, package define 2125 * getExpectedBase() and getExpectedContainer() 2126 */ 2127 enum SrcType { 2128 2129 CLASS("\n#REPLACE\nclass #CN { } ") { 2130 2131 @Override 2132 public ExpectedBase getExpectedBase(Class<?> c) { 2133 return c.getAnnotation(ExpectedBase.class); 2134 } 2135 2136 @Override 2137 public ExpectedContainer getExpectedContainer(Class<?> c) { 2138 return c.getAnnotation(ExpectedContainer.class); 2139 } 2140 }, 2141 METHOD("class #CN {\n" + " " + "#REPLACE\n" + " void " 2142 + TESTMETHOD + "() {} \n" + "}\n") { 2143 2144 @Override 2145 public ExpectedBase getExpectedBase(Class<?> c) { 2146 ExpectedBase ret = null; 2147 try { 2148 ret = c.getDeclaredMethod(TESTMETHOD).getAnnotation( 2149 ExpectedBase.class); 2150 } catch (NoSuchMethodException nme) { 2151 error("Could not get " + TESTMETHOD + " for className " 2152 + c.getName() + " Exception:\n" + nme); 2153 } 2154 return ret; 2155 } 2156 2157 @Override 2158 public ExpectedContainer getExpectedContainer(Class<?> c) { 2159 ExpectedContainer ret = null; 2160 try { 2161 ret = c.getDeclaredMethod(TESTMETHOD).getAnnotation( 2162 ExpectedContainer.class); 2163 } catch (NoSuchMethodException nme) { 2164 error("Could not get " + TESTMETHOD + " for className " 2165 + c.getName() + " Exception:\n" + nme); 2166 } 2167 return ret; 2168 2169 } 2170 }, 2171 FIELD("class #CN {\n" + " " + "#REPLACE\n" + " int " + TESTFIELD 2172 + " = 0; \n" + "}\n") { 2173 2174 @Override 2175 public ExpectedBase getExpectedBase(Class<?> c) { 2176 ExpectedBase ret = null; 2177 try { 2178 ret = c.getDeclaredField(TESTFIELD).getAnnotation( 2179 ExpectedBase.class); 2180 } catch (NoSuchFieldException nme) { 2181 error("Could not get " + TESTFIELD + " for className " 2182 + c.getName() + " Exception:\n" + nme); 2183 } 2184 return ret; 2185 } 2186 2187 @Override 2188 public ExpectedContainer getExpectedContainer(Class<?> c) { 2189 ExpectedContainer ret = null; 2190 try { 2191 ret = c.getDeclaredField(TESTFIELD).getAnnotation( 2192 ExpectedContainer.class); 2193 } catch (NoSuchFieldException nme) { 2194 error("Could not get " + TESTFIELD + " for className " 2195 + c.getName() + " Exception:\n" + nme); 2196 } 2197 return ret; 2198 2199 } 2200 }, 2201 PACKAGE("package " + TESTPKG + "; \n" + "class #CN {}") { 2202 2203 @Override 2204 public ExpectedBase getExpectedBase(Class<?> c) { 2205 return c.getPackage().getAnnotation(ExpectedBase.class); 2206 } 2207 2208 @Override 2209 public ExpectedContainer getExpectedContainer(Class<?> c) { 2210 return c.getPackage().getAnnotation(ExpectedContainer.class); 2211 } 2212 }, 2213 PKGINFO("#REPLACE1\npackage " + TESTPKG + "; \n" + "#REPLACE2"), 2214 INTERFACE("#REPLACE\ninterface #IN { } "), 2215 INTERFACEIMPL("#REPLACE\nclass #CN implements #IN {}"), 2216 CLASSEXTENDS("#REPLACE\nclass #CN extends #SN {}"); 2217 String template; 2218 2219 private SrcType(String template) { 2220 this.template = template; 2221 } 2222 2223 public String getTemplate() { 2224 return template; 2225 } 2226 2227 // Elements should override 2228 public ExpectedBase getExpectedBase(Class<?> c) { 2229 return null; 2230 } 2231 2232 public ExpectedContainer getExpectedContainer(Class<?> c) { 2233 return null; 2234 } 2235 2236 /* 2237 * Returns only primary src types ; 2238 */ 2239 public static SrcType[] getSrcTypes() { 2240 return new SrcType[]{CLASS, PACKAGE, METHOD, FIELD}; 2241 } 2242 } 2243 2244 /* 2245 * Each enum constant is one of the 6 methods from AnnotatedElement interface 2246 * that needs to be tested. 2247 * Each enum constant overrides these 4 methods: 2248 * - getActualAnnoBase(SrcType srcType, Class<?> c) 2249 * - getActualAnnoContainer(SrcType srcType, Class<?> c) 2250 * - getExpectedAnnoBase(SrcType srcType, Class<?> c) 2251 * - getExpectedAnnoContainer(SrcType srcType, Class<?> c) 2252 */ 2253 enum TestMethod { 2254 2255 GET_ANNO("getAnnotation") { 2256 2257 @Override 2258 public Annotation[] getActualAnnoBase(SrcType srcType, Class<?> c) { 2259 Annotation[] actualAnno = new Annotation[1]; 2260 switch (srcType) { 2261 case CLASS: 2262 actualAnno[0] = c.getAnnotation(srcType.getExpectedBase(c).value()); 2263 break; 2264 case PACKAGE: 2265 actualAnno[0] = c.getPackage().getAnnotation( 2266 srcType.getExpectedBase(c).value()); 2267 break; 2268 case METHOD: 2269 try { 2270 actualAnno[0] = c.getDeclaredMethod(TESTMETHOD).getAnnotation( 2271 srcType.getExpectedBase(c).value()); 2272 } catch (NoSuchMethodException nme) { 2273 error("Could not get " + TESTMETHOD 2274 + " for className = " + c.getName() 2275 + "Exception = " + nme); 2276 } 2277 break; 2278 case FIELD: 2279 try { 2280 actualAnno[0] = c.getDeclaredField(TESTFIELD).getAnnotation( 2281 srcType.getExpectedBase(c).value()); 2282 } catch (NoSuchFieldException nfe) { 2283 error("Could not get " + TESTFIELD 2284 + " for className = " + c.getName() 2285 + "Exception = " + nfe); 2286 } 2287 break; 2288 } 2289 return actualAnno; 2290 } 2291 2292 @Override 2293 public Annotation[] getActualAnnoContainer(SrcType srcType, 2294 Class<?> c) { 2295 Annotation[] actualAnno = new Annotation[1]; 2296 switch (srcType) { 2297 case CLASS: 2298 actualAnno[0] = c.getAnnotation(srcType.getExpectedContainer(c).value()); 2299 break; 2300 case PACKAGE: 2301 actualAnno[0] = c.getPackage().getAnnotation( 2302 srcType.getExpectedContainer(c).value()); 2303 break; 2304 case METHOD: 2305 try { 2306 actualAnno[0] = c.getDeclaredMethod(TESTMETHOD).getAnnotation( 2307 srcType.getExpectedContainer(c).value()); 2308 } catch (NoSuchMethodException nme) { 2309 error("Could not get " + TESTMETHOD 2310 + " for className = " + c.getName() 2311 + "Exception = " + nme); 2312 } 2313 break; 2314 case FIELD: 2315 try { 2316 actualAnno[0] = c.getDeclaredField(TESTFIELD).getAnnotation( 2317 srcType.getExpectedContainer(c).value()); 2318 } catch (NoSuchFieldException nfe) { 2319 error("Could not get " + TESTFIELD 2320 + " for className = " + c.getName() 2321 + "Exception = " + nfe); 2322 } 2323 break; 2324 } 2325 return actualAnno; 2326 } 2327 2328 @Override 2329 public String[] getExpectedAnnoBase(SrcType srcType, Class<?> c) { 2330 String[] expAnno = {srcType.getExpectedBase(c).getAnnotationVal()}; 2331 return expAnno; 2332 } 2333 2334 @Override 2335 public String[] getExpectedAnnoContainer(SrcType srcType, Class<?> c) { 2336 String[] expAnno = {srcType.getExpectedContainer(c).getAnnotationVal()}; 2337 return expAnno; 2338 } 2339 }, 2340 GET_ANNOS("getAnnotations") { 2341 2342 @Override 2343 public Annotation[] getActualAnnoBase(SrcType srcType, Class<?> c) { 2344 Annotation[] actualAnnos = null; 2345 switch (srcType) { 2346 case CLASS: 2347 actualAnnos = c.getAnnotations(); 2348 break; 2349 case PACKAGE: 2350 actualAnnos = c.getPackage().getAnnotations(); 2351 break; 2352 case METHOD: 2353 try { 2354 actualAnnos = c.getDeclaredMethod(TESTMETHOD).getAnnotations(); 2355 } catch (NoSuchMethodException nme) { 2356 error("Could not get " + TESTMETHOD 2357 + " for className = " + c.getName() 2358 + "Exception = " + nme); 2359 } 2360 break; 2361 case FIELD: 2362 try { 2363 actualAnnos = c.getDeclaredField(TESTFIELD).getAnnotations(); 2364 } catch (NoSuchFieldException nfe) { 2365 error("Could not get " + TESTFIELD 2366 + " for className = " + c.getName() 2367 + "Exception = " + nfe); 2368 } 2369 break; 2370 } 2371 return actualAnnos; 2372 } 2373 2374 @Override 2375 public Annotation[] getActualAnnoContainer(SrcType srcType, 2376 Class<?> c) { 2377 Annotation[] actualAnnos = null; 2378 switch (srcType) { 2379 case CLASS: 2380 actualAnnos = c.getAnnotations(); 2381 break; 2382 case PACKAGE: 2383 actualAnnos = c.getPackage().getAnnotations(); 2384 break; 2385 case METHOD: 2386 try { 2387 actualAnnos = c.getDeclaredMethod(TESTMETHOD).getAnnotations(); 2388 } catch (NoSuchMethodException nme) { 2389 error("Could not get " + TESTMETHOD 2390 + " for className = " + c.getName() 2391 + "Exception = " + nme); 2392 } 2393 break; 2394 case FIELD: 2395 try { 2396 actualAnnos = c.getDeclaredField(TESTFIELD).getAnnotations(); 2397 } catch (NoSuchFieldException nfe) { 2398 error("Could not get " + TESTFIELD 2399 + " for className = " + c.getName() 2400 + "Exception = " + nfe); 2401 } 2402 break; 2403 } 2404 return actualAnnos; 2405 } 2406 2407 @Override 2408 public String[] getExpectedAnnoBase(SrcType srcType, Class<?> c) { 2409 return srcType.getExpectedBase(c).getAnnotationsVals(); 2410 } 2411 2412 @Override 2413 public String[] getExpectedAnnoContainer(SrcType srcType, Class<?> c) { 2414 return srcType.getExpectedContainer(c).getAnnotationsVals(); 2415 } 2416 }, 2417 GET_DECL_ANNOS("getDeclaredAnnotations") { 2418 2419 @Override 2420 public Annotation[] getActualAnnoBase(SrcType srcType, Class<?> c) { 2421 Annotation[] actualDeclAnnos = null; 2422 switch (srcType) { 2423 case CLASS: 2424 actualDeclAnnos = c.getDeclaredAnnotations(); 2425 break; 2426 case PACKAGE: 2427 actualDeclAnnos = c.getPackage().getDeclaredAnnotations(); 2428 break; 2429 case METHOD: 2430 try { 2431 actualDeclAnnos = c.getDeclaredMethod(TESTMETHOD) 2432 .getDeclaredAnnotations(); 2433 } catch (NoSuchMethodException nme) { 2434 error("Could not get " + TESTMETHOD 2435 + " for className = " + c.getName() 2436 + "Exception = " + nme); 2437 } 2438 break; 2439 case FIELD: 2440 try { 2441 actualDeclAnnos = c.getDeclaredField(TESTFIELD) 2442 .getDeclaredAnnotations(); 2443 } catch (NoSuchFieldException nfe) { 2444 error("Could not get " + TESTFIELD 2445 + " for className = " + c.getName() 2446 + "Exception = " + nfe); 2447 } 2448 break; 2449 } 2450 return actualDeclAnnos; 2451 } 2452 2453 @Override 2454 public Annotation[] getActualAnnoContainer(SrcType srcType, 2455 Class<?> c) { 2456 Annotation[] actualDeclAnnos = null; 2457 switch (srcType) { 2458 case CLASS: 2459 actualDeclAnnos = c.getDeclaredAnnotations(); 2460 break; 2461 case PACKAGE: 2462 actualDeclAnnos = c.getPackage().getDeclaredAnnotations(); 2463 break; 2464 case METHOD: 2465 try { 2466 actualDeclAnnos = c.getDeclaredMethod(TESTMETHOD) 2467 .getDeclaredAnnotations(); 2468 } catch (NoSuchMethodException nme) { 2469 error("Could not get " + TESTMETHOD 2470 + " for className = " + c.getName() 2471 + "Exception = " + nme); 2472 } 2473 break; 2474 case FIELD: 2475 try { 2476 actualDeclAnnos = c.getDeclaredField(TESTFIELD) 2477 .getDeclaredAnnotations(); 2478 } catch (NoSuchFieldException nfe) { 2479 error("Could not get " + TESTFIELD 2480 + " for className = " + c.getName() 2481 + "Exception = " + nfe); 2482 } 2483 break; 2484 } 2485 return actualDeclAnnos; 2486 } 2487 2488 @Override 2489 public String[] getExpectedAnnoBase(SrcType srcType, Class<?> c) { 2490 return srcType.getExpectedBase(c).getDeclAnnosVals(); 2491 } 2492 2493 @Override 2494 public String[] getExpectedAnnoContainer(SrcType srcType, Class<?> c) { 2495 return srcType.getExpectedContainer(c).getDeclAnnosVals(); 2496 } 2497 }, 2498 GET_DECL_ANNO("getDeclaredAnnotation") { 2499 2500 @Override 2501 public Annotation[] getActualAnnoBase(SrcType srcType, Class<?> c) { 2502 Annotation[] actualDeclAnno = new Annotation[1]; 2503 switch (srcType) { 2504 case CLASS: 2505 actualDeclAnno[0] = c.getDeclaredAnnotation( 2506 srcType.getExpectedBase(c).value()); 2507 break; 2508 case PACKAGE: 2509 actualDeclAnno[0] = c.getPackage().getDeclaredAnnotation( 2510 srcType.getExpectedBase(c).value()); 2511 break; 2512 case METHOD: 2513 try { 2514 actualDeclAnno[0] = c.getDeclaredMethod(TESTMETHOD) 2515 .getDeclaredAnnotation( 2516 srcType.getExpectedBase(c).value()); 2517 } catch (NoSuchMethodException nme) { 2518 error("Could not get " + TESTMETHOD 2519 + " for className = " + c.getName() 2520 + "Exception = " + nme); 2521 } 2522 break; 2523 case FIELD: 2524 try { 2525 actualDeclAnno[0] = c.getDeclaredField(TESTFIELD) 2526 .getDeclaredAnnotation( 2527 srcType.getExpectedBase(c).value()); 2528 } catch (NoSuchFieldException nfe) { 2529 error("Could not get " + TESTFIELD 2530 + " for className = " + c.getName() 2531 + "Exception = " + nfe); 2532 } 2533 break; 2534 } 2535 return actualDeclAnno; 2536 } 2537 2538 @Override 2539 public Annotation[] getActualAnnoContainer(SrcType srcType, 2540 Class<?> c) { 2541 Annotation[] actualDeclAnno = new Annotation[1]; 2542 switch (srcType) { 2543 case CLASS: 2544 actualDeclAnno[0] = c.getDeclaredAnnotation( 2545 srcType.getExpectedContainer(c).value()); 2546 break; 2547 case PACKAGE: 2548 actualDeclAnno[0] = c.getPackage().getDeclaredAnnotation( 2549 srcType.getExpectedContainer(c).value()); 2550 break; 2551 case METHOD: 2552 try { 2553 actualDeclAnno[0] = c.getDeclaredMethod(TESTMETHOD) 2554 .getDeclaredAnnotation( 2555 srcType.getExpectedContainer(c).value()); 2556 } catch (NoSuchMethodException nme) { 2557 error("Could not get " + TESTMETHOD 2558 + " for className = " + c.getName() 2559 + "Exception = " + nme); 2560 } 2561 break; 2562 case FIELD: 2563 try { 2564 actualDeclAnno[0] = c.getDeclaredField(TESTFIELD) 2565 .getDeclaredAnnotation( 2566 srcType.getExpectedContainer(c).value()); 2567 } catch (NoSuchFieldException nfe) { 2568 error("Could not get " + TESTFIELD 2569 + " for className = " + c.getName() 2570 + "Exception = " + nfe); 2571 } 2572 break; 2573 } 2574 return actualDeclAnno; 2575 } 2576 2577 @Override 2578 public String[] getExpectedAnnoBase(SrcType srcType, Class<?> c) { 2579 String[] expAnno = {srcType.getExpectedBase(c).getDeclAnnoVal()}; 2580 return expAnno; 2581 } 2582 2583 @Override 2584 public String[] getExpectedAnnoContainer(SrcType srcType, Class<?> c) { 2585 String[] expAnno = {srcType.getExpectedContainer(c).getDeclAnnoVal()}; 2586 return expAnno; 2587 } 2588 }, // new 2589 GET_ANNOS_ARG("getAnnotationsArg") { 2590 2591 @Override 2592 public Annotation[] getActualAnnoBase(SrcType srcType, Class<?> c) { 2593 Annotation[] actualAnnoArgs = null; 2594 switch (srcType) { 2595 case CLASS: 2596 actualAnnoArgs = c.getAnnotationsByType(srcType.getExpectedBase(c).value()); 2597 break; 2598 case PACKAGE: 2599 actualAnnoArgs = c.getPackage().getAnnotationsByType( 2600 srcType.getExpectedBase(c).value()); 2601 break; 2602 case METHOD: 2603 try { 2604 actualAnnoArgs = c.getDeclaredMethod(TESTMETHOD) 2605 .getAnnotationsByType( 2606 srcType.getExpectedBase(c).value()); 2607 } catch (NoSuchMethodException nme) { 2608 error("Could not get " + TESTMETHOD 2609 + " for className = " + c.getName() 2610 + "Exception = " + nme); 2611 } 2612 break; 2613 case FIELD: 2614 try { 2615 actualAnnoArgs = c.getDeclaredField(TESTFIELD) 2616 .getAnnotationsByType( 2617 srcType.getExpectedBase(c).value()); 2618 } catch (NoSuchFieldException nfe) { 2619 error("Could not get " + TESTFIELD 2620 + " for className = " + c.getName() 2621 + "Exception = " + nfe); 2622 } 2623 break; 2624 } 2625 return actualAnnoArgs; 2626 } 2627 2628 @Override 2629 public Annotation[] getActualAnnoContainer(SrcType srcType, 2630 Class<?> c) { 2631 Annotation[] actualAnnoArgs = null; 2632 switch (srcType) { 2633 case CLASS: 2634 actualAnnoArgs = c.getAnnotationsByType(srcType.getExpectedContainer(c).value()); 2635 break; 2636 case PACKAGE: 2637 actualAnnoArgs = c.getPackage().getAnnotationsByType( 2638 srcType.getExpectedContainer(c).value()); 2639 break; 2640 case METHOD: 2641 try { 2642 actualAnnoArgs = c.getDeclaredMethod(TESTMETHOD) 2643 .getAnnotationsByType( 2644 srcType.getExpectedContainer(c).value()); 2645 } catch (NoSuchMethodException nme) { 2646 error("Could not get " + TESTMETHOD 2647 + " for className = " + c.getName() 2648 + "Exception = " + nme); 2649 } 2650 break; 2651 case FIELD: 2652 try { 2653 actualAnnoArgs = c.getDeclaredField(TESTFIELD) 2654 .getAnnotationsByType( 2655 srcType.getExpectedContainer(c).value()); 2656 } catch (NoSuchFieldException nfe) { 2657 error("Could not get " + TESTFIELD 2658 + " for className = " + c.getName() 2659 + "Exception = " + nfe); 2660 } 2661 break; 2662 } 2663 return actualAnnoArgs; 2664 } 2665 2666 @Override 2667 public String[] getExpectedAnnoBase(SrcType srcType, Class<?> c) { 2668 return srcType.getExpectedBase(c).getAnnosArgs(); 2669 } 2670 2671 @Override 2672 public String[] getExpectedAnnoContainer(SrcType srcType, Class<?> c) { 2673 return srcType.getExpectedContainer(c).getAnnosArgs(); 2674 } 2675 }, // new 2676 GET_DECL_ANNOS_ARG("getDeclAnnosArg") { 2677 2678 @Override 2679 public Annotation[] getActualAnnoBase(SrcType srcType, Class<?> c) { 2680 Annotation[] actualDeclAnnosArgs = null; 2681 switch (srcType) { 2682 case CLASS: 2683 actualDeclAnnosArgs = c.getDeclaredAnnotationsByType( 2684 srcType.getExpectedBase(c).value()); 2685 break; 2686 case PACKAGE: 2687 actualDeclAnnosArgs = c.getPackage().getDeclaredAnnotationsByType( 2688 srcType.getExpectedBase(c).value()); 2689 break; 2690 case METHOD: 2691 try { 2692 actualDeclAnnosArgs = c.getDeclaredMethod(TESTMETHOD) 2693 .getDeclaredAnnotationsByType( 2694 srcType.getExpectedBase(c).value()); 2695 } catch (NoSuchMethodException nme) { 2696 error("Could not get " + TESTMETHOD 2697 + " for className = " + c.getName() 2698 + "Exception = " + nme); 2699 } 2700 break; 2701 case FIELD: 2702 try { 2703 actualDeclAnnosArgs = c.getDeclaredField(TESTFIELD) 2704 .getDeclaredAnnotationsByType( 2705 srcType.getExpectedBase(c).value()); 2706 } catch (NoSuchFieldException nfe) { 2707 error("Could not get " + TESTFIELD 2708 + " for className = " + c.getName() 2709 + "Exception = " + nfe); 2710 } 2711 break; 2712 } 2713 return actualDeclAnnosArgs; 2714 } 2715 2716 @Override 2717 public Annotation[] getActualAnnoContainer(SrcType srcType, 2718 Class<?> c) { 2719 Annotation[] actualDeclAnnosArgs = null; 2720 switch (srcType) { 2721 case CLASS: 2722 actualDeclAnnosArgs = c.getDeclaredAnnotationsByType( 2723 srcType.getExpectedContainer(c).value()); 2724 break; 2725 case PACKAGE: 2726 actualDeclAnnosArgs = c.getPackage().getDeclaredAnnotationsByType( 2727 srcType.getExpectedContainer(c).value()); 2728 break; 2729 case METHOD: 2730 try { 2731 actualDeclAnnosArgs = c.getDeclaredMethod(TESTMETHOD) 2732 .getDeclaredAnnotationsByType( 2733 srcType.getExpectedContainer(c).value()); 2734 } catch (NoSuchMethodException nme) { 2735 error("Could not get " + TESTMETHOD 2736 + " for className = " + c.getName() 2737 + "Exception = " + nme); 2738 } 2739 break; 2740 case FIELD: 2741 try { 2742 actualDeclAnnosArgs = c.getDeclaredField(TESTFIELD) 2743 .getDeclaredAnnotationsByType( 2744 srcType.getExpectedContainer(c).value()); 2745 } catch (NoSuchFieldException nfe) { 2746 error("Could not get " + TESTFIELD 2747 + " for className = " + c.getName() 2748 + "Exception = " + nfe); 2749 } 2750 break; 2751 } 2752 return actualDeclAnnosArgs; 2753 } 2754 2755 @Override 2756 public String[] getExpectedAnnoBase(SrcType srcType, Class<?> c) { 2757 return srcType.getExpectedBase(c).getDeclAnnosArgs(); 2758 } 2759 2760 @Override 2761 public String[] getExpectedAnnoContainer(SrcType srcType, Class<?> c) { 2762 return srcType.getExpectedContainer(c).getDeclAnnosArgs(); 2763 } 2764 }; // new 2765 String name; 2766 2767 private TestMethod(String name) { 2768 this.name = name; 2769 } 2770 2771 public Annotation[] getActualAnnoBase(SrcType srcType, Class<?> c) { 2772 return null; 2773 } 2774 2775 public Annotation[] getActualAnnoContainer(SrcType srcType, Class<?> c) { 2776 return null; 2777 } 2778 2779 public String[] getExpectedAnnoBase(SrcType srcType, Class<?> c) { 2780 return null; 2781 } 2782 2783 public String[] getExpectedAnnoContainer(SrcType srcType, Class<?> c) { 2784 return null; 2785 } 2786 } 2787 2788 /* 2789 * For a given srcType and class object, compare expectedBase and actualBase 2790 * annotations as well as expectedContainer and actualContainer annotations. 2791 * 2792 * Return true if both comparisons are true else return false. 2793 * 2794 */ 2795 protected static void checkAnnoValues(SrcType srcType, Class<?> c) { 2796 2797 // Load @ExpectedBase and @ExpectedContainer 2798 ExpectedBase eb = srcType.getExpectedBase(c); 2799 ExpectedContainer ec = srcType.getExpectedContainer(c); 2800 if (eb == null) { 2801 error("Did not find ExpectedBase Annotation, Test will exit"); 2802 throw new RuntimeException(); 2803 } 2804 if (ec == null) { 2805 error("Did not find ExpectedContainer Annotation, Test will exit"); 2806 throw new RuntimeException(); 2807 } 2808 2809 for (TestMethod testMethod : TestMethod.values()) { 2810 debugPrint("---------------------------------------------"); 2811 debugPrint("Test method = " + testMethod); 2812 boolean isBasePass = true; 2813 boolean isConPass = true; 2814 // ExpectedBase = Annotation, no annotation is defined, skip comparison 2815 if (!eb.value().getSimpleName().equalsIgnoreCase("Annotation")) { 2816 isBasePass = compareAnnotations( 2817 testMethod.getActualAnnoBase(srcType, c), 2818 testMethod.getExpectedAnnoBase(srcType, c)); 2819 } 2820 2821 // ExpectedContainer = Annotation, no annotation is defined, skip comparison 2822 if (!ec.value().getSimpleName().equalsIgnoreCase("Annotation")) { 2823 isConPass = compareAnnotations( 2824 testMethod.getActualAnnoContainer(srcType, c), 2825 testMethod.getExpectedAnnoContainer(srcType, c)); 2826 } 2827 if (isBasePass && isConPass) { 2828 debugPrint("Testcase passed for " + testMethod + 2829 " for className = " + c.getName()); 2830 } else { 2831 debugPrint("Testcase failed for " + testMethod + 2832 " for className = " + c.getName()); 2833 } 2834 } 2835 } 2836 2837 // Annotation comparison: Length should be same and all expected values 2838 // should be present in actualAnno[]. 2839 private static boolean compareAnnotations(Annotation[] actualAnnos, 2840 String[] expectedAnnos) { 2841 boolean compOrder = false; 2842 2843 // Length is different 2844 if (actualAnnos.length != expectedAnnos.length) { 2845 error("Length not same, Actual length = " + actualAnnos.length 2846 + " Expected length = " + expectedAnnos.length); 2847 printArrContents(actualAnnos); 2848 printArrContents(expectedAnnos); 2849 return false; 2850 } else { 2851 int i = 0; 2852 // Length is same and 0 2853 if (actualAnnos.length == 0) { 2854 // Expected/actual lengths already checked for 2855 // equality; no more checks do to 2856 return true; 2857 } 2858 // Expected annotation should be NULL 2859 if (actualAnnos[0] == null) { 2860 if (expectedAnnos[0].equals("NULL")) { 2861 debugPrint("Arr values are NULL as expected"); 2862 return true; 2863 } else { 2864 error("Array values are not NULL"); 2865 printArrContents(actualAnnos); 2866 printArrContents(expectedAnnos); 2867 return false; 2868 } 2869 } 2870 // Lengths are same, compare array contents 2871 String[] actualArr = new String[actualAnnos.length]; 2872 for (Annotation a : actualAnnos) { 2873 if (a.annotationType().getSimpleName().contains("Expected")) 2874 actualArr[i++] = a.annotationType().getSimpleName(); 2875 else if (a.annotationType().getName().contains(TESTPKG)) { 2876 String replaced = a.toString().replaceAll(Pattern.quote("testpkg."),""); 2877 actualArr[i++] = replaced; 2878 } else 2879 actualArr[i++] = a.toString(); 2880 } 2881 List<String> actualList = new ArrayList<String>(Arrays.asList(actualArr)); 2882 List<String> expectedList = new ArrayList<String>(Arrays.asList(expectedAnnos)); 2883 if (!actualList.containsAll(expectedList)) { 2884 error("Array values are not same"); 2885 printArrContents(actualAnnos); 2886 printArrContents(expectedAnnos); 2887 return false; 2888 } else { 2889 debugPrint("Arr values are same as expected"); 2890 if (CHECKORDERING) { 2891 debugPrint("Checking if annotation ordering is as expected.."); 2892 compOrder = compareOrdering(actualList, expectedList); 2893 if (compOrder) 2894 debugPrint("Arr values ordering is as expected"); 2895 else 2896 error("Arr values ordering is not as expected! actual values: " 2897 + actualList + " expected values: " + expectedList); 2898 } else 2899 compOrder = true; 2900 } 2901 } 2902 return compOrder; 2903 } 2904 2905 // Annotation ordering comparison 2906 private static boolean compareOrdering(List<String> actualList, List<String> expectedList) { 2907 boolean order = true; 2908 // Discarding Expected* annotations before comparison of ordering 2909 actualList = iterateList(actualList); 2910 expectedList = iterateList(expectedList); 2911 // Length is different 2912 if (actualList.size() != expectedList.size()) { 2913 error("Length not same, Actual list length = " + actualList.size() 2914 + " Expected list length = " + expectedList.size()); 2915 return false; 2916 } else { 2917 if (actualList.isEmpty() && expectedList.isEmpty()) { 2918 return true; 2919 } 2920 boolean tmp = true; 2921 for (int i = 0; i < actualList.size(); i++) { 2922 // Checking ordering 2923 if (order) { 2924 if (!actualList.get(i).equals(expectedList.get(i))) { 2925 tmp = false; 2926 debugPrint("Odering is false"); 2927 debugPrint("actualList values: " + actualList 2928 + " expectedList values: " + expectedList); 2929 } 2930 } 2931 } 2932 order = tmp; 2933 } 2934 return order; 2935 } 2936 2937 private static List<String> iterateList(List<String> list) { 2938 Iterator<String> iter = list.iterator(); 2939 while (iter.hasNext()) { 2940 String anno = iter.next(); 2941 if (anno.contains("Expected")) { 2942 iter.remove(); 2943 } 2944 } 2945 return list; 2946 } 2947 2948 private static void printArrContents(Annotation[] actualAnnos) { 2949 System.out.print("Actual Arr Values: "); 2950 for (Annotation a : actualAnnos) { 2951 if (a != null && a.annotationType() != null) { 2952 System.out.print("[" + a.toString() + "]"); 2953 } else { 2954 System.out.println("[null]"); 2955 } 2956 } 2957 System.out.println(); 2958 } 2959 2960 private static void printArrContents(String[] expectedAnnos) { 2961 System.out.print("Expected Arr Values: "); 2962 for (String s : expectedAnnos) { 2963 System.out.print("[" + s + "]"); 2964 } 2965 System.out.println(); 2966 } 2967 2968 private ClassLoader getLoader() { 2969 return getClass().getClassLoader(); 2970 } 2971 2972 private static Class<?> loadClass(String className, ClassLoader parentClassLoader, File... destDirs) { 2973 try { 2974 List<URL> list = new ArrayList<>(); 2975 for (File f : destDirs) { 2976 list.add(new URL("file:" + f.toString().replace("\\", "/") + "/")); 2977 } 2978 return Class.forName(className, true, new URLClassLoader( 2979 list.toArray(new URL[list.size()]), parentClassLoader)); 2980 } catch (ClassNotFoundException | MalformedURLException e) { 2981 throw new RuntimeException("Error loading class " + className, e); 2982 } 2983 } 2984 2985 private static void printTestSrc(Iterable<? extends JavaFileObject> files) { 2986 for (JavaFileObject f : files) { 2987 System.out.println("Test file " + f.getName() + ":"); 2988 try { 2989 System.out.println("" + f.getCharContent(true)); 2990 } catch (IOException e) { 2991 throw new RuntimeException( 2992 "Exception when printing test src contents for class " + 2993 f.getName(), e); 2994 } 2995 } 2996 2997 } 2998 2999 public static StringBuilder getCommonStmts(boolean isRepeatable) { 3000 StringBuilder sb = new StringBuilder(); 3001 3002 sb.append(Helper.ContentVars.IMPORTEXPECTED.getVal()) 3003 .append(Helper.ContentVars.IMPORTSTMTS.getVal()) 3004 .append(Helper.ContentVars.RETENTIONRUNTIME.getVal()) 3005 .append(Helper.ContentVars.INHERITED.getVal()); 3006 if(isRepeatable) { 3007 sb.append(Helper.ContentVars.REPEATABLE.getVal()); 3008 } 3009 sb.append(Helper.ContentVars.BASE.getVal()) 3010 .append(Helper.ContentVars.RETENTIONRUNTIME.getVal()) 3011 .append(Helper.ContentVars.INHERITED.getVal()) 3012 .append(Helper.ContentVars.CONTAINER.getVal()); 3013 return sb; 3014 } 3015 3016 private static int getNumErrors() { 3017 return errors; 3018 } 3019 3020 private static void error(String msg) { 3021 System.out.println("error: " + msg); 3022 errors++; 3023 } 3024 3025 private static void debugPrint(String string) { 3026 if(DEBUG) 3027 System.out.println(string); 3028 } 3029 }