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