How to add a new annotation test using Junit
============================================
There are two ways to add new tests to annotation:
A. Add a new test by using golden files comparison:
--------------------------------------------------
1. make a new dir appserv-tests/deployment/annotation/<your new directory>
2. cp annotation/ejb/build.xml <your new directory>
3. modify ant project name in build.xml and test name under junit
4. create java files (ejbs, etc) for annotation testing in 
   <your new directory>/src
5. create a java files under devtests.util.AnnotationTest
    import devtests.deployment.util.AnnotationTest;
                                                                                
    public class InheritanceAnnotationTest extends AnnotationTest {
        public InheritanceAnnotationTest(String name) {
            super(name);
            // you may need override ModuleType type here
        }
    }
   Please make sure that the test class name is unique among these
   annotation test. In general, I will prepend directory name.
6. put golden files for ejb-jar.xml, webservices.xml,etc under
   <your new directory>/goldenfiles
7. update build.xml if necessary for classpath in targets: compile, test
8. update appserv-tests/deployment/annotation/build.xml to include your new test

B. Add a new test by testing explicit annotation info:
------------------------------------------------------
1. make a new dir appserv-tests/deployment/annotation/<your new directory>
2. cp annotation/webservice/build.xml <your new directory>
3. modify ant project name in build.xml
4. create java files (ejbs, etc) for annotation testing in 
   <your new directory>/src
5. create your new JUnit TestCase java class by
   i) subclassing devtests.deployment.util.AnnotationTest
   ii) include the following import statements:
	import junit.framework.Assert;
	import devtests.deployment.util.AnnotationTest;
   iii) put all testing codes in one or more public methods with no parameter
        method name starting with "test"
        If you want your class compare golden files in addition to your
	new tests, then please use a test name other than "testDescriptor".
	If you don't want your class compare golden files, then please
	have overrided the "testDescriptor" method.
   iv) Inside the testing method, one can invoke the test assertion by
       invoking static methods in Assert class.
       For instance,
		Assert.assertTrue(String errMsg, boolean condition);
		Assert.assertNull(String errMsg, Object obj);
		Assert.assertNotNull(String errMsg, Object obj);
		Assert.assertEquals(int expected, int actual);
	One find more details in junit javadoc.
6. update build.xml
   i) classpath in targets: compile, test
   ii) update the name attribute in test target to your new class:
	<test name ="<your new class"> 
7. update appserv-tests/deployment/annotation/build.xml to include your new test

How to run the test:
--------------------
1. *** Due to an issue in ant
	(http://ant.apache.org/faq.html#delegating-classloader),
   we need to set CLASSPATH explicitly to include junit.jar in your environment
   before running the test.
2. If you are using ant 1.5.4, then please also include xalan.jar version 2.0
   or later in your classpath.
3. cd appserv-tests/deployment/annotation/
4. ant

How to view the result:
-----------------------
A short summary can be found in results.html.
The detailed test results can be found in
	appserv-tests/deployment/annotation/report/html/index.html
