1   // Copyright (c) 2003, Chad Woolley, All rights reserved.
2   
3   package org.virtualmock.test.suite;
4   
5   import java.lang.reflect.InvocationTargetException;
6   import java.lang.reflect.Method;
7   import java.util.ArrayList;
8   import java.util.Iterator;
9   import junit.framework.Test;
10  import junit.framework.TestCase;
11  import junit.framework.TestSuite;
12  import org.virtualmock.VMFactoryTest;
13  import org.virtualmock.VMTest;
14  import org.virtualmock.aspect.AspectUtilsTest;
15  import org.virtualmock.aspect.aspectwerkz.AspectwerkzAspectUtilsTest;
16  import org.virtualmock.call.CallManagerTest;
17  import org.virtualmock.call.CallQueueTest;
18  import org.virtualmock.call.CallTest;
19  import org.virtualmock.call.InvokedCallQueueTest;
20  import org.virtualmock.call.InvokedCallTest;
21  import org.virtualmock.call.RecordedCallQueueTest;
22  import org.virtualmock.call.RecordedCallTest;
23  import org.virtualmock.call.SignatureTest;
24  import org.virtualmock.resource.ResourceManagerTest;
25  import org.virtualmock.configuration.ConfigDigesterTest;
26  import org.virtualmock.configuration.VMConfigTest;
27  import org.virtualmock.matcher.AlwaysMatcherTest;
28  import org.virtualmock.matcher.EqualsMatcherTest;
29  import org.virtualmock.rule.AllRecordedCallsMustBeInvokedRuleTest;
30  import org.virtualmock.rule.RuleManagerTest;
31  import org.virtualmock.util.PrimitiveUtilsTest;
32  import org.virtualmock.util.ToolboxTest;
33  import org.virtualmock.verify.VerificationManagerTest;
34  
35  
36  /***
37   * Runs all tests
38   *
39   * @author Chad Woolley
40   * @version $Revision: 1.5 $
41   */
42  public class UnitTests extends TestCase {
43      private static boolean addTestSuite = false;
44  
45      /***
46       * Creates a new AllTests object.
47       *
48       * @param testName the TestName
49       */
50      public UnitTests(String testName) {
51          super(testName);
52      }
53  
54      /***
55       * "true" causes <code>suite.addTest(MyTest.suite());</code> to be invoked,
56       * false causes <code>suite.addTestSuite(MyTest.class);</code> to be
57       * invoked.
58       *
59       * @param newAddTestSuite determines whether or not to add a test as a
60       *        suite.
61       */
62      public static void setAddTestSuite(boolean newAddTestSuite) {
63          addTestSuite = newAddTestSuite;
64      }
65  
66      /***
67       * Accessor
68       *
69       * @return addTestSuite
70       */
71      public static boolean isAddTestSuite() {
72          return addTestSuite;
73      }
74  
75      /***
76       * Add a test to the suite
77       *
78       * @param suite DOCUMENT ME! (Constructor Parameter)
79       * @param testCaseClass DOCUMENT ME! (Constructor Parameter)
80       *
81       * @throws RuntimeException DOCUMENT ME! (Constructor Exception)
82       */
83      public static void addTestToSuite(TestSuite suite, Class testCaseClass) {
84          if (isAddTestSuite()) {
85              Method method = null;
86  
87              try {
88                  method = testCaseClass.getMethod("suite", new Class[0]);
89              } catch (NoSuchMethodException e) {
90                  throw new RuntimeException(e.getMessage());
91              }
92  
93              Test test = null;
94  
95              try {
96                  test = (Test) method.invoke(method, new Object[0]);
97              } catch (InvocationTargetException e) {
98                  throw new RuntimeException(e.getMessage());
99              } catch (IllegalAccessException e) {
100                 throw new RuntimeException(e.getMessage());
101             }
102 
103             suite.addTest(test);
104         } else {
105             suite.addTestSuite(testCaseClass);
106         }
107     }
108 
109     /***
110      * Main method
111      *
112      * @param args command line args
113      */
114     public static void main(String[] args) {
115         junit.textui.TestRunner.run(suite());
116     }
117 
118     /***
119      * Performs the logic of the suite
120      *
121      * @return the test suite
122      *
123      * @todo Make this use reflection to dynamically find all tests.  Tried
124      *       directory tree util from JUnit-addons, but couldn't get it to
125      *       work...
126      * @todo Add suite() method for AspectwerkzAspectUtils class
127      */
128     public static Test performSuite() {
129         TestSuite suite = new TestSuite("All tests");
130 
131         suite.addTestSuite(AspectwerkzAspectUtilsTest.class);
132 
133         // uncomment this line to demonstrate bug with Hansel + aspectwerkz
134         // offline mode
135         // suite.addTest(AlwaysMatcherTest.suite());
136         ArrayList testCaseClasses = new ArrayList();
137 
138         testCaseClasses.add(AllRecordedCallsMustBeInvokedRuleTest.class);
139         testCaseClasses.add(AlwaysMatcherTest.class);
140         testCaseClasses.add(AspectUtilsTest.class);
141         testCaseClasses.add(CallManagerTest.class);
142         testCaseClasses.add(CallQueueTest.class);
143         testCaseClasses.add(CallTest.class);
144         // testCaseClasses.add(ConfigDigesterTest.class);
145         testCaseClasses.add(PrimitiveUtilsTest.class);
146         testCaseClasses.add(EqualsMatcherTest.class);
147         testCaseClasses.add(InvokedCallQueueTest.class);
148         testCaseClasses.add(InvokedCallTest.class);
149         testCaseClasses.add(RecordedCallQueueTest.class);
150         testCaseClasses.add(RecordedCallTest.class);
151         testCaseClasses.add(ResourceManagerTest.class);
152         testCaseClasses.add(RuleManagerTest.class);
153         testCaseClasses.add(SignatureTest.class);
154         testCaseClasses.add(ToolboxTest.class);
155         testCaseClasses.add(VerificationManagerTest.class);
156         testCaseClasses.add(VMConfigTest.class);
157         testCaseClasses.add(VMFactoryTest.class);
158         testCaseClasses.add(VMTest.class);
159 
160         Iterator iterator = testCaseClasses.iterator();
161 
162         while (iterator.hasNext()) {
163             Class testCaseClass = (Class) iterator.next();
164             addTestToSuite(suite, testCaseClass);
165         }
166 
167         return suite;
168     }
169 
170     /***
171      * Suite method
172      *
173      * @return the test suite
174      */
175     public static Test suite() {
176         return performSuite();
177     }
178 }