annotate bindings/as3/ext/asunit/textui/XMLResultPrinter.as @ 765:337e72088f76

Fix for some sample bugs a + b ? c : d does not do what I think it does. That bug mostly masked a thorough logic error in building the table of counts of possible sequences; there was too much cumulativeness. There apparently remain problems
author mas01cr
date Thu, 02 Jun 2011 16:31:35 +0000
parents 3a0b9700b3d2
children
rev   line source
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 '&lt;XMLResultPrinter/&gt;' 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