bodewig     01/02/01 07:56:47

  Modified:    src/main/org/apache/tools/ant/taskdefs/optional/junit
                        BatchTest.java Enumerations.java JUnitTask.java
                        JUnitTest.java XMLJUnitResultFormatter.java
  Log:
  Some additional enhancements to junit related classes.
  
  Submitted by: Stephane Bailliez <[EMAIL PROTECTED]>
  
  Revision  Changes    Path
  1.5       +109 -44   
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/BatchTest.java
  
  Index: BatchTest.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/BatchTest.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- BatchTest.java    2000/12/18 15:40:37     1.4
  +++ BatchTest.java    2001/02/01 15:56:39     1.5
  @@ -69,75 +69,140 @@
    * @author <a href="mailto:[EMAIL PROTECTED]">Jeff Martin</a>
    * @author <a href="mailto:[EMAIL PROTECTED]">Stefan Bodewig</a>
    * @author <a href="mailto:[EMAIL PROTECTED]">Stephane Bailliez</a>
  + *
  + * @see JUnitTest
    */
   public final class BatchTest extends BaseTest {
  +
  +    /** the reference to the project */
       private Project project;
   
  +    /** the list of filesets containing the testcase filename rules */
       private Vector filesets = new Vector();
   
  +    /**
  +     * create a new batchtest instance
  +     * @param project     the project it depends on.
  +     */
       public BatchTest(Project project){
           this.project = project;
       }
   
  +    /**
  +     * Add a new fileset instance to this batchtest. Whatever the fileset is,
  +     * only filename that are <tt>.java</tt> or <tt>.class</tt> will be
  +     * considered as 'candidates'.
  +     * @param     fs the new fileset containing the rules to get the 
testcases.
  +     */
       public void addFileSet(FileSet fs) {
           filesets.addElement(fs);
       }
   
  +    /**
  +     * return all <tt>JUnitTest</tt> instances obtain by applying the 
fileset rules.
  +     * @return  an enumeration of all elements of this batchtest that are
  +     * a <tt>JUnitTest</tt> instance.
  +     * @see addTestsTo(Vector)
  +     */
       public final Enumeration elements(){
  -        return new FileList();
  +        JUnitTest[] tests = createAllJUnitTest();
  +        return Enumerations.fromArray(tests);
       }
  -
  -    public class FileList implements Enumeration{
  -        private String files[]=null;
   
  -        private int i=0;
  -
  -        private FileList(){
  -            Vector v = new Vector();
  -            for (int j=0; j<filesets.size(); j++) {
  -                FileSet fs = (FileSet) filesets.elementAt(j);
  -                DirectoryScanner ds = fs.getDirectoryScanner(project);
  -                ds.scan();
  -                String[] f = ds.getIncludedFiles();
  -                for (int k=0; k<f.length; k++) {
  -                    if (f[k].endsWith(".java")) {
  -                        v.addElement(f[k].substring(0, f[k].length()-5));
  -                    } else if (f[k].endsWith(".class")) {
  -                        v.addElement(f[k].substring(0, f[k].length()-6));
  -                    }
  -                }
  -            }
  -
  -            files = new String[v.size()];
  -            v.copyInto(files);
  +    /**
  +     * Convenient method to merge the <tt>JUnitTest</tt>s of this batchtest
  +     * to a <tt>Vector</tt>.
  +     * @param v the vector to which should be added all individual tests of 
this
  +     * batch test.
  +     */
  +    final void addTestsTo(Vector v){
  +        JUnitTest[] tests = createAllJUnitTest();
  +        v.ensureCapacity( v.size() + tests.length);
  +        for (int i = 0; i < tests.length; i++) {
  +            v.addElement(tests[i]);
           }
  +    }
   
  -        public final boolean hasMoreElements(){
  -            if(i<files.length)return true;
  -            return false;
  +    /**
  +     * Create all <tt>JUnitTest</tt>s based on the filesets. Each instance
  +     * is configured to match this instance properties.
  +     * @return the array of all <tt>JUnitTest</tt>s that belongs to this 
batch.
  +     */
  +    private JUnitTest[] createAllJUnitTest(){
  +        String[] filenames = getFilenames();
  +        JUnitTest[] tests = new JUnitTest[filenames.length];
  +        for (int i = 0; i < tests.length; i++) {
  +            String classname = javaToClass(filenames[i]);
  +            tests[i] = createJUnitTest(classname);
           }
  +        return tests;
  +    }
   
  -        public final Object nextElement() throws NoSuchElementException{
  -            if(hasMoreElements()){
  -                JUnitTest test = new JUnitTest(javaToClass(files[i]));
  -                test.setHaltonerror(haltOnError);
  -                test.setHaltonfailure(haltOnFail);
  -                test.setFork(fork);
  -                test.setIf(ifProperty);
  -                test.setUnless(unlessProperty);
  -                test.setTodir(destDir);
  -                Enumeration list = formatters.elements();
  -                while (list.hasMoreElements()) {
  -                    test.addFormatter((FormatterElement)list.nextElement());
  +    /**
  +     * Iterate over all filesets and return the filename of all files
  +     * that end with <tt>.java</tt> or <tt>.class</tt>. This is to avoid
  +     * wrapping a <tt>JUnitTest</tt> over an xml file for example. A Testcase
  +     * is obviouslly a java file (compiled or not).
  +     * @return an array of filenames without their extension. As they should
  +     * normally be taken from their root, filenames should match their fully
  +     * qualified class name (If it is not the case it will fail when running 
the test).
  +     * For the class <tt>org/apache/Whatever.class</tt> it will return 
<tt>org/apache/Whatever</tt>.
  +     */
  +    private String[] getFilenames(){
  +        Vector v = new Vector();
  +        final int size = this.filesets.size();
  +        for (int j=0; j<size; j++) {
  +            FileSet fs = (FileSet) filesets.elementAt(j);
  +            DirectoryScanner ds = fs.getDirectoryScanner(project);
  +            ds.scan();
  +            String[] f = ds.getIncludedFiles();
  +            for (int k = 0; k < f.length; k++) {
  +                String pathname = f[k];
  +                if (pathname.endsWith(".java")) {
  +                    v.addElement(pathname.substring(0, 
pathname.length()-".java".length()));
  +                } else if (pathname.endsWith(".class")) {
  +                    v.addElement(pathname.substring(0, 
pathname.length()-".class".length()));
                   }
  -                i++;
  -                return test;
               }
  -            throw new NoSuchElementException();
           }
  +
  +        String[] files = new String[v.size()];
  +        v.copyInto(files);
  +        return files;
  +    }
   
  -        public final String javaToClass(String fileName){
  -            return fileName.replace(java.io.File.separatorChar, '.');
  +    /**
  +     * convenient method to convert a pathname without extension to a
  +     * fully qualified classname. For example <tt>org/apache/Whatever</tt> 
will
  +     * be converted to <tt>org.apache.Whatever</tt>
  +     * @param filename the filename to "convert" to a classname.
  +     * @return the classname matching the filename.
  +     */
  +    public final static String javaToClass(String filename){
  +        return filename.replace(File.separatorChar, '.');
  +    }
  +
  +    /**
  +     * Create a <tt>JUnitTest</tt> that has the same property as this
  +     * <tt>BatchTest</tt> instance.
  +     * @param classname the name of the class that should be run as a
  +     * <tt>JUnitTest</tt>. It must be a fully qualified name.
  +     * @return the <tt>JUnitTest</tt> over the given classname.
  +     */
  +    private JUnitTest createJUnitTest(String classname){
  +        JUnitTest test = new JUnitTest();
  +        test.setName(classname);
  +        test.setHaltonerror(this.haltOnError);
  +        test.setHaltonfailure(this.haltOnFail);
  +        test.setFork(this.fork);
  +        test.setIf(this.ifProperty);
  +        test.setUnless(this.unlessProperty);
  +        test.setTodir(this.destDir);
  +        Enumeration list = this.formatters.elements();
  +        while (list.hasMoreElements()) {
  +            test.addFormatter((FormatterElement)list.nextElement());
           }
  +        return test;
       }
  +
   }
  
  
  
  1.2       +96 -96    
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/Enumerations.java
  
  Index: Enumerations.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/Enumerations.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Enumerations.java 2001/01/30 17:01:30     1.1
  +++ Enumerations.java 2001/02/01 15:56:41     1.2
  @@ -64,29 +64,29 @@
    * @author <a href="mailto:[EMAIL PROTECTED]">Stephane Bailliez</a>
    */
   public final class Enumerations {
  -     
  -     private Enumerations(){
  -     }
  -
  -     /**
  -      * creates an enumeration from an array of objects.
  -      * @param       array   the array of object to enumerate.
  -      * @return the enumeration over the array of objects.
  -      */
  -     public static Enumeration fromArray(Object[] array){
  -             return new ArrayEnumeration(array);
  -     }
  -
  -     /**
  -     * creates an enumeration from an array of enumeration. The created 
enumeration
  -     * will sequentially enumerate over all elements of each enumeration and 
skip
  -     * <tt>null</tt> enumeration elements in the array.
  -     * @param        enums   the array of enumerations.
  -     * @return the enumeration over the array of enumerations.
  -      */
  -     public static Enumeration fromCompound(Enumeration[] enums){
  -             return new CompoundEnumeration(enums);
  -     }
  +        
  +        private Enumerations(){
  +        }
  +
  +        /**
  +         * creates an enumeration from an array of objects.
  +         * @param       array   the array of object to enumerate.
  +         * @return the enumeration over the array of objects.
  +         */
  +        public static Enumeration fromArray(Object[] array){
  +                return new ArrayEnumeration(array);
  +        }
  +
  +        /**
  +        * creates an enumeration from an array of enumeration. The created 
enumeration
  +        * will sequentially enumerate over all elements of each enumeration 
and skip
  +        * <tt>null</tt> enumeration elements in the array.
  +        * @param        enums   the array of enumerations.
  +        * @return the enumeration over the array of enumerations.
  +         */
  +        public static Enumeration fromCompound(Enumeration[] enums){
  +                return new CompoundEnumeration(enums);
  +        }
   
   }
   
  @@ -96,47 +96,47 @@
    * @author <a href="mailto:[EMAIL PROTECTED]">Stephane Bailliez</a>
    */
   class ArrayEnumeration implements Enumeration {
  -     
  -     /** object array */
  -     private Object[] array;
  -     
  -     /** current index */
  -     private int pos;
  -     
  -     /**
  -      * Initialize a new enumeration that wraps an array.
  -      * @param       array   the array of object to enumerate.
  -      */
  -     public ArrayEnumeration(Object[] array){
  -             this.array = array;
  -             this.pos = 0;
  -     }
  -     /**
  -      * Tests if this enumeration contains more elements.
  -      *
  -      * @return  <code>true</code> if and only if this enumeration object
  -      *           contains at least one more element to provide;
  -      *          <code>false</code> otherwise.
  -      */
  -     public boolean hasMoreElements() {
  -             return (pos < array.length);
  -     }
  -
  -     /**
  -      * Returns the next element of this enumeration if this enumeration
  -      * object has at least one more element to provide.
  -      *
  -      * @return     the next element of this enumeration.
  -      * @throws  NoSuchElementException  if no more elements exist.
  -      */
  -     public Object nextElement() throws NoSuchElementException {
  -             if (hasMoreElements()) {
  -                     Object o = array[pos];
  -                     pos++;
  -                     return o;
  -             }
  -             throw new NoSuchElementException();
  -     }
  +        
  +        /** object array */
  +        private Object[] array;
  +        
  +        /** current index */
  +        private int pos;
  +        
  +        /**
  +         * Initialize a new enumeration that wraps an array.
  +         * @param       array   the array of object to enumerate.
  +         */
  +        public ArrayEnumeration(Object[] array){
  +                this.array = array;
  +                this.pos = 0;
  +        }
  +        /**
  +         * Tests if this enumeration contains more elements.
  +         *
  +         * @return  <code>true</code> if and only if this enumeration object
  +         *           contains at least one more element to provide;
  +         *          <code>false</code> otherwise.
  +         */
  +        public boolean hasMoreElements() {
  +                return (pos < array.length);
  +        }
  +
  +        /**
  +         * Returns the next element of this enumeration if this enumeration
  +         * object has at least one more element to provide.
  +         *
  +         * @return     the next element of this enumeration.
  +         * @throws  NoSuchElementException  if no more elements exist.
  +         */
  +        public Object nextElement() throws NoSuchElementException {
  +                if (hasMoreElements()) {
  +                        Object o = array[pos];
  +                        pos++;
  +                        return o;
  +                }
  +                throw new NoSuchElementException();
  +        }
   }
   /**
    * Convenient enumeration over an array of enumeration. For example:
  @@ -170,46 +170,46 @@
    * @author <a href="mailto:[EMAIL PROTECTED]">Stephane Bailliez</a>
    */
    class CompoundEnumeration implements Enumeration {
  -     
  -     /** enumeration array */
  -     private Enumeration[] enumArray;
  -     
  -     /** index in the enums array */
  -     private int index = 0;
  +        
  +        /** enumeration array */
  +        private Enumeration[] enumArray;
  +        
  +        /** index in the enums array */
  +        private int index = 0;
   
       public CompoundEnumeration(Enumeration[] enumarray) {
  -             this.enumArray = enumarray;
  +                this.enumArray = enumarray;
       }
   
  -     /**
  -      * Tests if this enumeration contains more elements.
  -      *
  -      * @return  <code>true</code> if and only if this enumeration object
  -      *           contains at least one more element to provide;
  -      *          <code>false</code> otherwise.
  -      */
  +        /**
  +         * Tests if this enumeration contains more elements.
  +         *
  +         * @return  <code>true</code> if and only if this enumeration object
  +         *           contains at least one more element to provide;
  +         *          <code>false</code> otherwise.
  +         */
       public boolean hasMoreElements() {
  -             while (index < enumArray.length) {
  -                     if (enumArray[index] != null && 
enumArray[index].hasMoreElements()) {
  -                             return true;
  -                     }
  -                     index++;
  -             }
  -             return false;
  +                while (index < enumArray.length) {
  +                        if (enumArray[index] != null && 
enumArray[index].hasMoreElements()) {
  +                                return true;
  +                        }
  +                        index++;
  +                }
  +                return false;
       }
   
  -     /**
  -      * Returns the next element of this enumeration if this enumeration
  -      * object has at least one more element to provide.
  -      *
  -      * @return     the next element of this enumeration.
  -      * @throws  NoSuchElementException  if no more elements exist.
  -      */
  +        /**
  +         * Returns the next element of this enumeration if this enumeration
  +         * object has at least one more element to provide.
  +         *
  +         * @return     the next element of this enumeration.
  +         * @throws  NoSuchElementException  if no more elements exist.
  +         */
       public Object nextElement() throws NoSuchElementException {
  -             if ( hasMoreElements() ) {
  -                     return enumArray[index].nextElement();
  -             }
  -             throw new NoSuchElementException();
  +                if ( hasMoreElements() ) {
  +                        return enumArray[index].nextElement();
  +                }
  +                throw new NoSuchElementException();
       }
   }
   
  
  
  
  1.16      +9 -17     
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java
  
  Index: JUnitTask.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- JUnitTask.java    2001/01/30 17:01:30     1.15
  +++ JUnitTask.java    2001/02/01 15:56:41     1.16
  @@ -213,10 +213,7 @@
       public void addSysproperty(Environment.Variable sysp) {
           commandline.addSysproperty(sysp);
       }
  -
  -    /**
  -     * create a classpath to use for forked jvm
  -     */
  +    
       public Path createClasspath() {
           return commandline.createClasspath(project).createPath();
       }
  @@ -260,21 +257,17 @@
        */
       public void execute() throws BuildException {
           Enumeration list = getIndividualTests();
  -        try {
  -            while (list.hasMoreElements()) {
  -                JUnitTest test = (JUnitTest)list.nextElement();
  -                if ( test.shouldRun(project)) {
  -                    execute(test);
  -                }
  +        while (list.hasMoreElements()) {
  +            JUnitTest test = (JUnitTest)list.nextElement();
  +            if ( test.shouldRun(project)) {
  +                execute(test);
               }
  -        } finally {
  -            //@todo here we should run test aggregation (SBa)
           }
       }
   
       protected void execute(JUnitTest test) throws BuildException {
           // set the default values if not specified
  -        //@todo should be moved to the test class (?) (SBa)
  +        //@todo should be moved to the test class instead.
           if (test.getTodir() == null) {
               test.setTodir(project.resolveFile("."));
           }
  @@ -288,7 +281,7 @@
           boolean wasKilled = false;
           if (!test.getFork()) {
               exitValue = executeInVM(test);
  -        } else {                                
  +        } else {
               ExecuteWatchdog watchdog = createWatchdog();
               exitValue = executeAsForked(test, watchdog);
               // null watchdog means no timeout, you'd better not check with 
null
  @@ -459,10 +452,9 @@
   
       private FormatterElement[] mergeFormatters(JUnitTest test){
           Vector feVector = (Vector)formatters.clone();
  -        FormatterElement[] fes = test.getFormatters();
  -        FormatterElement[] feArray = new FormatterElement[feVector.size() + 
fes.length];
  +        test.addFormattersTo(feVector);
  +        FormatterElement[] feArray = new FormatterElement[feVector.size()];
           feVector.copyInto(feArray);
  -        System.arraycopy(fes, 0, feArray, feVector.size(), fes.length);
           return feArray;
       }
   
  
  
  
  1.5       +14 -1     
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTest.java
  
  Index: JUnitTest.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTest.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- JUnitTest.java    2000/12/18 15:40:37     1.4
  +++ JUnitTest.java    2001/02/01 15:56:42     1.5
  @@ -73,7 +73,10 @@
       
       /** the name of the result file */
       private String outfile = null;
  -    
  +
  +    // @todo this is duplicating TestResult information. Only the time is not
  +    // part of the result. So we'd better derive a new class from TestResult
  +    // and deal with it. (SB)
       private long runs, failures, errors;
       private long runTime;
   
  @@ -138,5 +141,15 @@
           FormatterElement[] fes = new FormatterElement[formatters.size()];
           formatters.copyInto(fes);
           return fes;
  +    }
  +
  +    /**
  +     * Convenient method to add formatters to a vector
  +     */
  +    void addFormattersTo(Vector v){
  +        final int count = formatters.size();
  +        for (int i = 0; i < count; i++){
  +            v.addElement( formatters.elementAt(i) );
  +        }
       }
   }
  
  
  
  1.6       +17 -16    
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLJUnitResultFormatter.java
  
  Index: XMLJUnitResultFormatter.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLJUnitResultFormatter.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- XMLJUnitResultFormatter.java      2001/01/29 16:04:37     1.5
  +++ XMLJUnitResultFormatter.java      2001/02/01 15:56:43     1.6
  @@ -74,7 +74,7 @@
    * @author <a href="mailto:[EMAIL PROTECTED]">Stefan Bodewig</a>
    */
   
  -public class XMLJUnitResultFormatter implements JUnitResultFormatter {
  +public class XMLJUnitResultFormatter implements JUnitResultFormatter, 
XMLConstants {
   
       private static DocumentBuilder getDocumentBuilder() {
           try {
  @@ -88,7 +88,8 @@
       /**
        * Formatter for timings.
        */
  -    private NumberFormat nf = NumberFormat.getInstance();
  +    private NumberFormat nf = NumberFormat.getInstance(Locale.US);
  +
       /**
        * The XML document.
        */
  @@ -121,19 +122,19 @@
        */
       public void startTestSuite(JUnitTest suite) {
           doc = getDocumentBuilder().newDocument();
  -        rootElement = doc.createElement("testsuite");
  -        rootElement.setAttribute("name", suite.getName());
  +        rootElement = doc.createElement(TESTSUITE);
  +        rootElement.setAttribute(ATTR_NAME, suite.getName());
       }
   
       /**
        * The whole testsuite ended.
        */
       public void endTestSuite(JUnitTest suite) throws BuildException {
  -        rootElement.setAttribute("tests", ""+suite.runCount());
  -        rootElement.setAttribute("failures", ""+suite.failureCount());
  -        rootElement.setAttribute("errors", ""+suite.errorCount());
  -        rootElement.setAttribute("time", 
  -                                 nf.format(suite.getRunTime()/1000.0)+" 
sec");
  +        rootElement.setAttribute(ATTR_TESTS, ""+suite.runCount());
  +        rootElement.setAttribute(ATTR_FAILURES, ""+suite.failureCount());
  +        rootElement.setAttribute(ATTR_ERRORS, ""+suite.errorCount());
  +        rootElement.setAttribute(ATTR_TIME,
  +                                 nf.format(suite.getRunTime()/1000.0));
           if (out != null) {
               Writer wri = null;
               try {
  @@ -162,8 +163,8 @@
        */
       public void startTest(Test t) {
           lastTestStart = System.currentTimeMillis();
  -        currentTest = doc.createElement("testcase");
  -        currentTest.setAttribute("name", ((TestCase) t).name());
  +        currentTest = doc.createElement(TESTCASE);
  +        currentTest.setAttribute(ATTR_NAME, ((TestCase) t).name());
           rootElement.appendChild(currentTest);
       }
   
  @@ -173,7 +174,7 @@
        * <p>A Test is finished.
        */
       public void endTest(Test test) {
  -        currentTest.setAttribute("time", 
  +        currentTest.setAttribute(ATTR_TIME,
                                    
nf.format((System.currentTimeMillis()-lastTestStart)
                                              / 1000.0));
       }
  @@ -184,7 +185,7 @@
        * <p>A Test failed.
        */
       public void addFailure(Test test, Throwable t) {
  -        formatError("failure", test, t);
  +        formatError(FAILURE, test, t);
       }
   
       /**
  @@ -202,7 +203,7 @@
        * <p>An error occured while running the test.
        */
       public void addError(Test test, Throwable t) {
  -        formatError("error", test, t);
  +        formatError(ERROR, test, t);
       }
   
       private void formatError(String type, Test test, Throwable t) {
  @@ -219,9 +220,9 @@
   
           String message = t.getMessage();
           if (message != null && message.length() > 0) {
  -            nested.setAttribute("message", t.getMessage());
  +            nested.setAttribute(ATTR_MESSAGE, t.getMessage());
           }
  -        nested.setAttribute("type", t.getClass().getName());
  +        nested.setAttribute(ATTR_TYPE, t.getClass().getName());
   
           StringWriter swr = new StringWriter();
           t.printStackTrace(new PrintWriter(swr, true));
  
  
  

Reply via email to