1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 package junitx.ddtunit;
38
39 import java.util.ArrayList;
40 import java.util.Iterator;
41 import java.util.List;
42 import java.util.ListIterator;
43 import java.util.Vector;
44
45 import junit.framework.AssertionFailedError;
46 import junit.framework.Protectable;
47 import junit.framework.Test;
48 import junit.framework.TestCase;
49 import junit.framework.TestFailure;
50 import junit.framework.TestListener;
51 import junit.framework.TestResult;
52 import junitx.ddtunit.util.DDTConfiguration;
53 import junitx.ddtunit.util.PrivilegedAccessor;
54
55
56
57
58
59
60
61 public class DDTTestResult extends TestResult {
62
63
64
65 protected List<TestFailure> fMethodTestFailures;
66
67
68
69
70 protected List<TestFailure> fMethodTestErrors;
71
72
73
74
75 protected int fRunMethodTests;
76
77
78
79
80 public DDTTestResult() {
81 super();
82 fMethodTestFailures = new ArrayList<TestFailure>();
83 fMethodTestErrors = new ArrayList<TestFailure>();
84 fRunMethodTests = 0;
85
86 if (DDTConfiguration.getInstance().isActiveRunMonitor()
87 && !this.cloneListeners().contains(DDTRunMonitor.getInstance())) {
88 this.addListener(DDTRunMonitor.getInstance());
89 }
90 }
91
92
93
94
95
96
97
98
99 public DDTTestResult(TestResult result) throws DDTException {
100 try {
101 PrivilegedAccessor.setFieldValue(this, "fErrors",
102 PrivilegedAccessor.getFieldValue(result, "fErrors"));
103 PrivilegedAccessor.setFieldValue(this, "fFailures",
104 PrivilegedAccessor.getFieldValue(result, "fFailures"));
105 PrivilegedAccessor.setFieldValue(this, "fListeners",
106 PrivilegedAccessor.getFieldValue(result, "fListeners"));
107 this.fRunTests = ((Integer) PrivilegedAccessor.getFieldValue(
108 result, "fRunTests")).intValue();
109 fMethodTestFailures = new Vector<TestFailure>();
110 fMethodTestErrors = new Vector<TestFailure>();
111 fRunMethodTests = 0;
112 } catch (Exception e) {
113 e.printStackTrace();
114 throw new DDTException(
115 "Error on transforming TestResult to DDTResult", e);
116 }
117
118 if (DDTConfiguration.getInstance().isActiveRunMonitor()
119 && !this.cloneListeners().contains(DDTRunMonitor.getInstance())) {
120 this.addListener(DDTRunMonitor.getInstance());
121 }
122 }
123
124
125
126
127
128
129
130
131
132 public TestResult copyContent(TestResult result) {
133 try {
134 PrivilegedAccessor.setFieldValue(result, "fErrors",
135 PrivilegedAccessor.getFieldValue(this, "fErrors"));
136 PrivilegedAccessor.setFieldValue(result, "fFailures",
137 PrivilegedAccessor.getFieldValue(this, "fFailures"));
138 PrivilegedAccessor.setFieldValue(result, "fListeners",
139 PrivilegedAccessor.getFieldValue(this, "fListeners"));
140 PrivilegedAccessor.setFieldValue(result, "fRunTests", new Integer(
141 this.fRunTests));
142 } catch (Exception e) {
143 e.printStackTrace();
144 throw new DDTException(
145 "Error on transforming TestResult to DDTResult", e);
146 }
147
148 return result;
149 }
150
151
152
153
154
155
156
157
158
159 TestResult createTestResult() throws DDTException {
160 TestResult result = new TestResult();
161
162 try {
163 PrivilegedAccessor.setFieldValue(result, "fError", this.fErrors);
164 PrivilegedAccessor.setFieldValue(result, "fFailures",
165 this.fFailures);
166 PrivilegedAccessor.setFieldValue(result, "fListeners",
167 this.fListeners);
168 PrivilegedAccessor.setFieldValue(result, "fRunTests", new Integer(
169 this.fRunTests));
170 } catch (Exception e) {
171 e.printStackTrace();
172 throw new DDTException(
173 "Error during conversion from DDTResult to TestResult");
174 }
175
176 return result;
177 }
178
179
180
181
182
183
184
185 protected void run(final TestCase test) {
186 startTest(test);
187
188 Protectable p = new Protectable() {
189 public void protect() throws Throwable {
190 test.runBare();
191 }
192 };
193
194 runProtected(test, p);
195
196 endTest(test);
197 }
198
199
200
201
202
203
204
205
206
207
208 public void runProtected(final Test test, Protectable protectedRunner) {
209 try {
210 protectedRunner.protect();
211 } catch (AssertionFailedError e) {
212 addFailure(test, e);
213 } catch (ThreadDeath e) {
214 throw e;
215 } catch (Throwable e) {
216 addError(test, e);
217 }
218 }
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233 public void addMethodTestError(Test test, String testName,
234 Throwable throwable) {
235 fMethodTestErrors.add(new DDTTestFailure(test, testName, throwable));
236
237 for (Iterator e = cloneListeners().listIterator(); e.hasNext();) {
238 TestListener listener = (TestListener) e.next();
239
240 if (DDTTestListener.class.isInstance(listener)) {
241 ((DDTTestListener) listener).addMethodTestError(test, testName,
242 throwable);
243 }
244 }
245 }
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260 public void addMethodTestFailure(Test test, String testName,
261 AssertionFailedError assertError) {
262 fMethodTestFailures
263 .add(new DDTTestFailure(test, testName, assertError));
264
265 for (Iterator e = cloneListeners().listIterator(); e.hasNext();) {
266 TestListener listener = (TestListener) e.next();
267
268 if (DDTTestListener.class.isInstance(listener)) {
269 ((DDTTestListener) listener).addMethodTestFailure(test,
270 testName, assertError);
271 }
272 }
273 }
274
275
276
277
278
279
280
281
282
283
284
285
286 public void endMethodTest(IDDTTestCase test, String methodName) {
287 for (Iterator e = cloneListeners().listIterator(); e.hasNext();) {
288 TestListener listener = (TestListener) e.next();
289
290 if (DDTTestListener.class.isInstance(listener)) {
291 ((DDTTestListener) listener).endMethodTest(test, methodName);
292 }
293 }
294 }
295
296
297
298
299
300
301
302
303
304
305
306
307 public void startMethodTest(IDDTTestCase test, String methodName) {
308 final int count = 1;
309
310 synchronized (this) {
311 fRunMethodTests += count;
312 }
313
314 for (Iterator e = cloneListeners().listIterator(); e.hasNext();) {
315 TestListener listener = (TestListener) e.next();
316
317 if (DDTTestListener.class.isInstance(listener)) {
318 ((DDTTestListener) listener).startMethodTest(test, methodName);
319 }
320 }
321 }
322
323
324
325
326
327
328 private synchronized List<TestListener> cloneListeners() {
329 List<TestListener> newListeners = new ArrayList<TestListener>();
330 try {
331 newListeners.addAll((List<TestListener>) PrivilegedAccessor
332 .getFieldValue(this, "fListeners"));
333 } catch (IllegalAccessException ex) {
334 throw new DDTSetUpException("Error preparing listeners", ex);
335 } catch (NoSuchFieldException ex) {
336 throw new DDTSetUpException("Error preparing listeners", ex);
337 }
338 return newListeners;
339 }
340
341
342
343
344 public int runMethodTestCount() {
345 return fRunMethodTests;
346 }
347
348
349
350
351 public int methodTestFailureCount() {
352 return fMethodTestFailures.size();
353 }
354
355
356
357
358 public int methodTestErrorCount() {
359 return fMethodTestErrors.size();
360 }
361
362 public ListIterator<TestFailure> methodTestFailures() {
363 ListIterator<TestFailure> iter = this.fMethodTestFailures
364 .listIterator();
365 return iter;
366 }
367
368 }