mas01mj@732
|
1 package asunit.textui {
|
mas01mj@732
|
2
|
mas01mj@732
|
3 import asunit.errors.AssertionFailedError;
|
mas01mj@732
|
4 import asunit.framework.Test;
|
mas01mj@732
|
5 import asunit.framework.TestListener;
|
mas01mj@732
|
6 import asunit.framework.TestResult;
|
mas01mj@732
|
7 import flash.utils.setTimeout;
|
mas01mj@732
|
8 import flash.utils.Dictionary;
|
mas01mj@732
|
9
|
mas01mj@732
|
10 /**
|
mas01mj@732
|
11 * The <code>XMLResultPrinter</code> is used to transform AsUnit test results
|
mas01mj@732
|
12 * to JUnit-compatible XML content.
|
mas01mj@732
|
13 *
|
mas01mj@732
|
14 * This printer will send JUnit-compatible XML content to trace output. The XML content
|
mas01mj@732
|
15 * will be enclosed by '<XMLResultPrinter/>' tags.
|
mas01mj@732
|
16 *
|
mas01mj@732
|
17 * @includeExample XMLResultPrinterExample.as
|
mas01mj@732
|
18 * @includeExample XMLResultPrinterExample.xml
|
mas01mj@732
|
19 **/
|
mas01mj@732
|
20 public class XMLResultPrinter extends ResultPrinter {
|
mas01mj@732
|
21
|
mas01mj@732
|
22 protected var results:Dictionary;
|
mas01mj@732
|
23
|
mas01mj@732
|
24 public function XMLResultPrinter() {
|
mas01mj@732
|
25 results = new Dictionary();
|
mas01mj@732
|
26 }
|
mas01mj@732
|
27
|
mas01mj@732
|
28 override public function startTest(test:Test):void {
|
mas01mj@732
|
29 super.startTest(test);
|
mas01mj@732
|
30 var result:TestListener = new XMLTestResult(test);
|
mas01mj@732
|
31 results[test.getName()] = result;
|
mas01mj@732
|
32 result.startTest(test);
|
mas01mj@732
|
33 }
|
mas01mj@732
|
34
|
mas01mj@732
|
35 override public function endTest(test:Test):void {
|
mas01mj@732
|
36 super.endTest(test);
|
mas01mj@732
|
37 results[test.getName()].endTest(test);
|
mas01mj@732
|
38 }
|
mas01mj@732
|
39
|
mas01mj@732
|
40 override public function startTestMethod(test:Test, methodName:String):void {
|
mas01mj@732
|
41 super.startTestMethod(test, methodName);
|
mas01mj@732
|
42 results[test.getName()].startTestMethod(test, methodName);
|
mas01mj@732
|
43 }
|
mas01mj@732
|
44
|
mas01mj@732
|
45 override public function endTestMethod(test:Test, methodName:String):void {
|
mas01mj@732
|
46 super.endTestMethod(test, methodName);
|
mas01mj@732
|
47 results[test.getName()].endTestMethod(test, methodName);
|
mas01mj@732
|
48 }
|
mas01mj@732
|
49
|
mas01mj@732
|
50 override public function addFailure(test:Test, t:AssertionFailedError):void {
|
mas01mj@732
|
51 super.addFailure(test, t);
|
mas01mj@732
|
52 results[test.getName()].addFailure(test, t);
|
mas01mj@732
|
53 }
|
mas01mj@732
|
54
|
mas01mj@732
|
55 override public function addError(test:Test, t:Error):void {
|
mas01mj@732
|
56 super.addError(test, t);
|
mas01mj@732
|
57 results[test.getName()].addError(test, t);
|
mas01mj@732
|
58 }
|
mas01mj@732
|
59
|
mas01mj@732
|
60 override public function printResult(result:TestResult, runTime:Number):void {
|
mas01mj@732
|
61 super.printResult(result, runTime);
|
mas01mj@732
|
62 trace("<XMLResultPrinter>");
|
mas01mj@732
|
63 trace("<?xml version='1.0' encoding='UTF-8'?>");
|
mas01mj@732
|
64 trace("<testsuites>");
|
mas01mj@732
|
65 trace("<testsuite name='AllTests' errors='" + result.errorCount() + "' failures='" + result.failureCount() + "' tests='" + result.runCount() + "' time='" + elapsedTimeAsString(runTime) + "'>");
|
mas01mj@732
|
66 var xmlTestResult:XMLTestResult;
|
mas01mj@732
|
67 for each(xmlTestResult in results) {
|
mas01mj@732
|
68 trace(xmlTestResult.toString());
|
mas01mj@732
|
69 }
|
mas01mj@732
|
70 trace("</testsuite>");
|
mas01mj@732
|
71 trace("</testsuites>");
|
mas01mj@732
|
72 trace("</XMLResultPrinter>");
|
mas01mj@732
|
73 }
|
mas01mj@732
|
74 }
|
mas01mj@732
|
75 }
|
mas01mj@732
|
76
|
mas01mj@732
|
77 import asunit.framework.Test;
|
mas01mj@732
|
78 import asunit.framework.TestFailure;
|
mas01mj@732
|
79 import flash.utils.getQualifiedClassName;
|
mas01mj@732
|
80 import flash.utils.getTimer;
|
mas01mj@732
|
81 import asunit.framework.TestListener;
|
mas01mj@732
|
82 import asunit.errors.AssertionFailedError;
|
mas01mj@732
|
83 import asunit.framework.TestMethod;
|
mas01mj@732
|
84 import flash.utils.Dictionary;
|
mas01mj@732
|
85
|
mas01mj@732
|
86 class XMLTestResult implements TestListener {
|
mas01mj@732
|
87
|
mas01mj@732
|
88 private var _duration:Number;
|
mas01mj@732
|
89 private var start:Number;
|
mas01mj@732
|
90 private var test:Test;
|
mas01mj@732
|
91 private var testName:String;
|
mas01mj@732
|
92 private var failureHash:Dictionary;
|
mas01mj@732
|
93 private var failures:Array;
|
mas01mj@732
|
94 private var errorHash:Dictionary;
|
mas01mj@732
|
95 private var errors:Array;
|
mas01mj@732
|
96 private var methodHash:Dictionary;
|
mas01mj@732
|
97 private var methods:Array;
|
mas01mj@732
|
98
|
mas01mj@732
|
99 public function XMLTestResult(test:Test) {
|
mas01mj@732
|
100 this.test = test;
|
mas01mj@732
|
101 testName = test.getName().split("::").join(".");
|
mas01mj@732
|
102 failures = new Array();
|
mas01mj@732
|
103 errors = new Array();
|
mas01mj@732
|
104 methods = new Array();
|
mas01mj@732
|
105
|
mas01mj@732
|
106 failureHash = new Dictionary();
|
mas01mj@732
|
107 errorHash = new Dictionary();
|
mas01mj@732
|
108 methodHash = new Dictionary();
|
mas01mj@732
|
109 }
|
mas01mj@732
|
110
|
mas01mj@732
|
111 public function startTest(test:Test):void {
|
mas01mj@732
|
112 start = getTimer();
|
mas01mj@732
|
113 }
|
mas01mj@732
|
114
|
mas01mj@732
|
115 public function run(test:Test):void {
|
mas01mj@732
|
116 }
|
mas01mj@732
|
117
|
mas01mj@732
|
118 public function addError(test:Test, t:Error):void {
|
mas01mj@732
|
119 var failure:TestFailure = new TestFailure(test, t);
|
mas01mj@732
|
120 errors.push(failure);
|
mas01mj@732
|
121 errorHash[failure.failedMethod()] = failure;
|
mas01mj@732
|
122 }
|
mas01mj@732
|
123
|
mas01mj@732
|
124 public function addFailure(test:Test, t:AssertionFailedError):void {
|
mas01mj@732
|
125 var failure:TestFailure = new TestFailure(test, t);
|
mas01mj@732
|
126 failures.push(failure);
|
mas01mj@732
|
127 failureHash[failure.failedMethod()] = failure;
|
mas01mj@732
|
128 }
|
mas01mj@732
|
129
|
mas01mj@732
|
130 public function startTestMethod(test:Test, methodName:String):void {
|
mas01mj@732
|
131 var method:TestMethod = new TestMethod(test, methodName);
|
mas01mj@732
|
132 methods.push(method);
|
mas01mj@732
|
133 methodHash[method.getName()] = method;
|
mas01mj@732
|
134 }
|
mas01mj@732
|
135
|
mas01mj@732
|
136 public function endTestMethod(test:Test, methodName:String):void {
|
mas01mj@732
|
137 methodHash[methodName].endTest(test);
|
mas01mj@732
|
138 }
|
mas01mj@732
|
139
|
mas01mj@732
|
140 public function endTest(test:Test):void {
|
mas01mj@732
|
141 _duration = (getTimer() - start) * .001;
|
mas01mj@732
|
142 }
|
mas01mj@732
|
143
|
mas01mj@732
|
144 private function errorCount():int {
|
mas01mj@732
|
145 return errors.length;
|
mas01mj@732
|
146 }
|
mas01mj@732
|
147
|
mas01mj@732
|
148 private function failureCount():int {
|
mas01mj@732
|
149 return failures.length;
|
mas01mj@732
|
150 }
|
mas01mj@732
|
151
|
mas01mj@732
|
152 private function duration():Number {
|
mas01mj@732
|
153 return _duration;
|
mas01mj@732
|
154 }
|
mas01mj@732
|
155
|
mas01mj@732
|
156 private function renderSuiteOpener():String {
|
mas01mj@732
|
157 return "<testsuite name='" + testName + "' errors='" + errorCount() + "' failures='" + failureCount() + "' tests='" + methods.length + "' time='" + duration() + "'>\n";
|
mas01mj@732
|
158 }
|
mas01mj@732
|
159
|
mas01mj@732
|
160 private function renderTestOpener(methodName:String):String {
|
mas01mj@732
|
161 return "<testcase classname='" + testName + "' name='" + methodName + "' time='" + methodHash[methodName].duration() + "'>\n";
|
mas01mj@732
|
162 }
|
mas01mj@732
|
163
|
mas01mj@732
|
164 private function renderTestBody(method:String):String {
|
mas01mj@732
|
165 if(errorHash[method]) {
|
mas01mj@732
|
166 return renderError(errorHash[method]);
|
mas01mj@732
|
167 }
|
mas01mj@732
|
168 else if(failureHash[method]) {
|
mas01mj@732
|
169 return renderFailure(failureHash[method]);
|
mas01mj@732
|
170 }
|
mas01mj@732
|
171 else {
|
mas01mj@732
|
172 return "";
|
mas01mj@732
|
173 }
|
mas01mj@732
|
174 }
|
mas01mj@732
|
175
|
mas01mj@732
|
176 private function renderError(failure:TestFailure):String {
|
mas01mj@732
|
177 return "<error type='" + getQualifiedClassName(failure.thrownException()).split("::").join(".") + "'><![CDATA[\n" + failure.thrownException().getStackTrace() + "\n]]></error>\n";
|
mas01mj@732
|
178 }
|
mas01mj@732
|
179
|
mas01mj@732
|
180 private function renderFailure(failure:TestFailure):String {
|
mas01mj@732
|
181 return "<failure type='" + getQualifiedClassName(failure.thrownException()).split("::").join(".") + "'><![CDATA[\n" + failure.thrownException().getStackTrace() + "\n]]></failure>\n";
|
mas01mj@732
|
182 }
|
mas01mj@732
|
183
|
mas01mj@732
|
184 private function renderTestCloser():String {
|
mas01mj@732
|
185 return '</testcase>\n';
|
mas01mj@732
|
186 }
|
mas01mj@732
|
187
|
mas01mj@732
|
188 private function renderSuiteCloser():String {
|
mas01mj@732
|
189 return '</testsuite>\n';
|
mas01mj@732
|
190 }
|
mas01mj@732
|
191
|
mas01mj@732
|
192 public function toString():String {
|
mas01mj@732
|
193 var str:String = '';
|
mas01mj@732
|
194 str += renderSuiteOpener();
|
mas01mj@732
|
195 for(var name:String in methodHash) {
|
mas01mj@732
|
196 str += renderTestOpener(name);
|
mas01mj@732
|
197 str += renderTestBody(name);
|
mas01mj@732
|
198 str += renderTestCloser();
|
mas01mj@732
|
199 }
|
mas01mj@732
|
200 str += renderSuiteCloser();
|
mas01mj@732
|
201 return str;
|
mas01mj@732
|
202 }
|
mas01mj@732
|
203 }
|
mas01mj@732
|
204
|