001: /* Copyright (C) 2004 - 2007 db4objects Inc. http://www.db4o.com
002:
003: This file is part of the db4o open source object database.
004:
005: db4o is free software; you can redistribute it and/or modify it under
006: the terms of version 2 of the GNU General Public License as published
007: by the Free Software Foundation and as clarified by db4objects' GPL
008: interpretation policy, available at
009: http://www.db4o.com/about/company/legalpolicies/gplinterpretation/
010: Alternatively you can write to db4objects, Inc., 1900 S Norfolk Street,
011: Suite 350, San Mateo, CA 94403, USA.
012:
013: db4o is distributed in the hope that it will be useful, but WITHOUT ANY
014: WARRANTY; without even the implied warranty of MERCHANTABILITY or
015: FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
016: for more details.
017:
018: You should have received a copy of the GNU General Public License along
019: with this program; if not, write to the Free Software Foundation, Inc.,
020: 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
021: package db4ounit;
022:
023: import java.lang.reflect.Method;
024: import java.util.Vector;
025:
026: public class ReflectionTestSuiteBuilder implements TestSuiteBuilder {
027:
028: private Class[] _classes;
029:
030: public ReflectionTestSuiteBuilder(Class clazz) {
031: if (null == clazz)
032: throw new IllegalArgumentException("clazz");
033: _classes = new Class[] { clazz };
034: }
035:
036: public ReflectionTestSuiteBuilder(Class[] classes) {
037: if (null == classes)
038: throw new IllegalArgumentException("classes");
039: _classes = classes;
040: }
041:
042: public TestSuite build() {
043: return (1 == _classes.length) ? fromClass(_classes[0])
044: : fromClasses(_classes);
045: }
046:
047: protected TestSuite fromClasses(Class[] classes) {
048: Vector suites = new Vector(classes.length);
049: for (int i = 0; i < classes.length; i++) {
050: TestSuite suite = fromClass(classes[i]);
051: if (suite.getTests().length > 0) {
052: suites.addElement(suite);
053: }
054: }
055: return new TestSuite(toTestArray(suites));
056: }
057:
058: protected TestSuite fromClass(Class clazz) {
059: if (!isApplicable(clazz)) {
060: TestPlatform.emitWarning("DISABLED: " + clazz.getName());
061: return new TestSuite(new Test[0]);
062: }
063: if (TestSuiteBuilder.class.isAssignableFrom(clazz)) {
064: return ((TestSuiteBuilder) newInstance(clazz)).build();
065: }
066: if (Test.class.isAssignableFrom(clazz)) {
067: return new TestSuite(clazz.getName(),
068: new Test[] { (Test) newInstance(clazz) });
069: }
070: if (!(TestCase.class.isAssignableFrom(clazz))) {
071: throw new IllegalArgumentException("" + clazz
072: + " is not marked as " + TestCase.class);
073: }
074: return fromMethods(clazz);
075: }
076:
077: protected boolean isApplicable(Class clazz) {
078: return clazz != null; // just removing the 'parameter not used' warning
079: }
080:
081: private TestSuite fromMethods(Class clazz) {
082: Vector tests = new Vector();
083: Method[] methods = clazz.getMethods();
084: for (int i = 0; i < methods.length; i++) {
085: Object instance = newInstance(clazz);
086: Method method = methods[i];
087: if (!isTestMethod(method)) {
088: emitWarningOnIgnoredTestMethod(instance, method);
089: continue;
090: }
091: tests.addElement(createTest(instance, method));
092: }
093: return new TestSuite(clazz.getName(), toTestArray(tests));
094: }
095:
096: private void emitWarningOnIgnoredTestMethod(Object subject,
097: Method method) {
098: if (!startsWithIgnoreCase(method.getName(), "_test")) {
099: return;
100: }
101: TestPlatform.emitWarning("IGNORED: "
102: + createTest(subject, method).getLabel());
103: }
104:
105: protected boolean isTestMethod(Method method) {
106: return hasTestPrefix(method) && TestPlatform.isPublic(method)
107: && !TestPlatform.isStatic(method)
108: && !TestPlatform.hasParameters(method);
109: }
110:
111: private boolean hasTestPrefix(Method method) {
112: return startsWithIgnoreCase(method.getName(), "test");
113: }
114:
115: protected boolean startsWithIgnoreCase(final String s,
116: final String prefix) {
117: return s.toUpperCase().startsWith(prefix.toUpperCase());
118: }
119:
120: private static Test[] toTestArray(Vector tests) {
121: Test[] array = new Test[tests.size()];
122: tests.copyInto(array);
123: return array;
124: }
125:
126: protected Object newInstance(Class clazz) {
127: try {
128: return clazz.newInstance();
129: } catch (Exception e) {
130: throw new TestException(e);
131: }
132: }
133:
134: protected Test createTest(Object instance, Method method) {
135: return new TestMethod(instance, method);
136: }
137: }
|