KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > junitx > util > DirectorySuiteBuilder


1 /*
2  * The JUnit-addons Software License, Version 1.0
3  * (based on the Apache Software License, Version 1.1)
4  *
5  * Copyright (c) 2002-2003 Vladimir R. Bossicard. All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright
15  * notice, this list of conditions and the following disclaimer in
16  * the documentation and/or other materials provided with the
17  * distribution.
18  *
19  * 3. The end-user documentation included with the redistribution, if
20  * any, must include the following acknowlegement:
21  * "This product includes software developed by Vladimir R.
22  * Bossicard as well as other contributors
23  * (http://junit-addons.sourceforge.net/)."
24  * Alternately, this acknowlegement may appear in the software itself,
25  * if and wherever such third-party acknowlegements normally appear.
26  *
27  * 4. The name "JUnit-addons" must not be used to endorse or promote
28  * products derived from this software without prior written
29  * permission. For written permission, please contact
30  * vbossica@users.sourceforge.net.
31  *
32  * 5. Products derived from this software may not be called "JUnit-addons"
33  * nor may "JUnit-addons" appear in their names without prior written
34  * permission of the project managers.
35  *
36  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
37  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
39  * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
40  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
43  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
44  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
45  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
46  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47  * SUCH DAMAGE.
48  * ======================================================================
49  *
50  * This software consists of voluntary contributions made by many
51  * individuals. For more information on the JUnit-addons Project, please
52  * see <http://junit-addons.sourceforge.net/>.
53  */

54
55 package junitx.util;
56
57 import junit.framework.Test;
58 import junit.framework.TestSuite;
59
60 import java.io.File JavaDoc;
61 import java.io.IOException JavaDoc;
62 import java.util.List JavaDoc;
63 import java.util.Vector JavaDoc;
64
65 /**
66  * Extracts the testcases from a directory. Use the <tt>TestFilter</tt> to
67  * specify the pattern of the classes to load.
68  *
69  * <h4>Example</h4>
70  *
71  * Returns a suite containing all classes matching the pattern "*Test.
72  * class" from the directory <tt>/home/project/myproject/tests</tt>:<p>
73  * <pre>
74  * DirectorySuiteBuilder builder = new DirectorySuiteBuilder();
75  * Test suite = builer.suite("/home/project/myproject/tests");
76  * </pre>
77  *
78  * Returns a suite containing all tests from files starting with "Sample" and
79  * ending with "Test".
80  *
81  * <tt>/home/project/myproject/tests</tt><p>
82  * <pre>
83  * DirectorySuiteBuilder builder = new DirectorySuiteBuilder();
84  * builder.setFilter(new TestFilter() {
85  *
86  * public boolean include(String classpath) {
87  * return super.include(classpath) &&
88  * SimpleTestFilter.getClassName(classpath).startsWith("Sample");
89  * }
90  *
91  * });
92  *
93  * Test suite = builder.suite("/home/project/myproject/tests");
94  * </pre>
95  *
96  * @version $Revision: 1.6 $ $Date: 2003/04/28 05:18:28 $
97  * @author <a HREF="mailto:vbossica@users.sourceforge.net">Vladimir R. Bossicard</a>
98  * @author <a HREF="mailto:pbnaidu@users.sourceforge.net">Naidu Purushotham</a>
99  */

100 public class DirectorySuiteBuilder
101         extends AbstractSuiteBuilder {
102
103     static final int SUFFIX_LENGTH = ".class".length();
104
105     /**
106      * Constructs an empty <tt>DirectorySuiteBuilder</tt> object.
107      */

108     public DirectorySuiteBuilder() {
109         this(null);
110     }
111     
112     /**
113      * Constructs an <tt>DirectorySuiteBuilder</tt> object with the given filter.
114      */

115     public DirectorySuiteBuilder(TestFilter filter) {
116         super(filter);
117     }
118     
119     /**
120      * Constructs a <tt>TestSuite</tt> by extracting all test classes from the
121      * given <tt>directory</tt>.
122      */

123     public Test suite(File JavaDoc directory)
124             throws Exception JavaDoc {
125         TestSuite suite = new TestSuite(directory.getName());
126
127         List JavaDoc classnames = browse(directory);
128         merge(classnames, suite);
129
130         return suite;
131     }
132
133     /**
134      * Constructs a <tt>TestSuite</tt> by extracting all test classes from the
135      * directory of the given <tt>directoryName</tt>.
136      */

137     public Test suite(String JavaDoc directoryName)
138             throws Exception JavaDoc {
139         File JavaDoc dir = new File JavaDoc(directoryName);
140         return suite(dir);
141     }
142
143     /**
144      * Returns the list of test classes contained in the <tt>directory</tt>.
145      * Method defined for testing only: no support guarantee.
146      *
147      * @see DirectorySuiteBuilder#isTestClass
148      */

149     protected List JavaDoc browse(File JavaDoc directory)
150             throws Exception JavaDoc {
151         List JavaDoc result = new Vector JavaDoc();
152
153         gatherFiles(directory, result);
154
155         return result;
156     }
157
158     private void gatherFiles(File JavaDoc root,
159                             List JavaDoc result)
160             throws IOException JavaDoc {
161         String JavaDoc path = root.getCanonicalPath();
162         gather(root, path.length() + 1, result);
163     }
164
165     private void gather(File JavaDoc root,
166                         int prefix,
167                         List JavaDoc result)
168             throws IOException JavaDoc {
169         File JavaDoc[] files = root.listFiles();
170         if (files == null) {
171             return;
172         }
173
174         for (int i = 0; i < files.length; i++) {
175             File JavaDoc file = files[i];
176             if (file.isDirectory()) {
177                 if (file.canRead()) {
178                     gather(file, prefix, result);
179                 }
180             } else {
181                 if (isTestClass(file.getPath())) {
182                     result.add(getClassName(file.getCanonicalPath().substring(prefix)));
183                 }
184             }
185         }
186     }
187
188     private String JavaDoc getClassName(String JavaDoc filename) {
189         return filename.replace(File.separatorChar, '.').substring(0, filename.length() - SUFFIX_LENGTH);
190     }
191
192 }
193
Popular Tags