mas01mj@732: package asunit.textui { mas01mj@732: mas01mj@732: import asunit.errors.AssertionFailedError; mas01mj@732: import asunit.framework.Test; mas01mj@732: import asunit.framework.TestListener; mas01mj@732: import asunit.framework.TestResult; mas01mj@732: import flash.utils.setTimeout; mas01mj@732: import flash.utils.Dictionary; mas01mj@732: mas01mj@732: /** mas01mj@732: * The XMLResultPrinter is used to transform AsUnit test results mas01mj@732: * to JUnit-compatible XML content. mas01mj@732: * mas01mj@732: * This printer will send JUnit-compatible XML content to trace output. The XML content mas01mj@732: * will be enclosed by '<XMLResultPrinter/>' tags. mas01mj@732: * mas01mj@732: * @includeExample XMLResultPrinterExample.as mas01mj@732: * @includeExample XMLResultPrinterExample.xml mas01mj@732: **/ mas01mj@732: public class XMLResultPrinter extends ResultPrinter { mas01mj@732: mas01mj@732: protected var results:Dictionary; mas01mj@732: mas01mj@732: public function XMLResultPrinter() { mas01mj@732: results = new Dictionary(); mas01mj@732: } mas01mj@732: mas01mj@732: override public function startTest(test:Test):void { mas01mj@732: super.startTest(test); mas01mj@732: var result:TestListener = new XMLTestResult(test); mas01mj@732: results[test.getName()] = result; mas01mj@732: result.startTest(test); mas01mj@732: } mas01mj@732: mas01mj@732: override public function endTest(test:Test):void { mas01mj@732: super.endTest(test); mas01mj@732: results[test.getName()].endTest(test); mas01mj@732: } mas01mj@732: mas01mj@732: override public function startTestMethod(test:Test, methodName:String):void { mas01mj@732: super.startTestMethod(test, methodName); mas01mj@732: results[test.getName()].startTestMethod(test, methodName); mas01mj@732: } mas01mj@732: mas01mj@732: override public function endTestMethod(test:Test, methodName:String):void { mas01mj@732: super.endTestMethod(test, methodName); mas01mj@732: results[test.getName()].endTestMethod(test, methodName); mas01mj@732: } mas01mj@732: mas01mj@732: override public function addFailure(test:Test, t:AssertionFailedError):void { mas01mj@732: super.addFailure(test, t); mas01mj@732: results[test.getName()].addFailure(test, t); mas01mj@732: } mas01mj@732: mas01mj@732: override public function addError(test:Test, t:Error):void { mas01mj@732: super.addError(test, t); mas01mj@732: results[test.getName()].addError(test, t); mas01mj@732: } mas01mj@732: mas01mj@732: override public function printResult(result:TestResult, runTime:Number):void { mas01mj@732: super.printResult(result, runTime); mas01mj@732: trace(""); mas01mj@732: trace(""); mas01mj@732: trace(""); mas01mj@732: trace(""); mas01mj@732: var xmlTestResult:XMLTestResult; mas01mj@732: for each(xmlTestResult in results) { mas01mj@732: trace(xmlTestResult.toString()); mas01mj@732: } mas01mj@732: trace(""); mas01mj@732: trace(""); mas01mj@732: trace(""); mas01mj@732: } mas01mj@732: } mas01mj@732: } mas01mj@732: mas01mj@732: import asunit.framework.Test; mas01mj@732: import asunit.framework.TestFailure; mas01mj@732: import flash.utils.getQualifiedClassName; mas01mj@732: import flash.utils.getTimer; mas01mj@732: import asunit.framework.TestListener; mas01mj@732: import asunit.errors.AssertionFailedError; mas01mj@732: import asunit.framework.TestMethod; mas01mj@732: import flash.utils.Dictionary; mas01mj@732: mas01mj@732: class XMLTestResult implements TestListener { mas01mj@732: mas01mj@732: private var _duration:Number; mas01mj@732: private var start:Number; mas01mj@732: private var test:Test; mas01mj@732: private var testName:String; mas01mj@732: private var failureHash:Dictionary; mas01mj@732: private var failures:Array; mas01mj@732: private var errorHash:Dictionary; mas01mj@732: private var errors:Array; mas01mj@732: private var methodHash:Dictionary; mas01mj@732: private var methods:Array; mas01mj@732: mas01mj@732: public function XMLTestResult(test:Test) { mas01mj@732: this.test = test; mas01mj@732: testName = test.getName().split("::").join("."); mas01mj@732: failures = new Array(); mas01mj@732: errors = new Array(); mas01mj@732: methods = new Array(); mas01mj@732: mas01mj@732: failureHash = new Dictionary(); mas01mj@732: errorHash = new Dictionary(); mas01mj@732: methodHash = new Dictionary(); mas01mj@732: } mas01mj@732: mas01mj@732: public function startTest(test:Test):void { mas01mj@732: start = getTimer(); mas01mj@732: } mas01mj@732: mas01mj@732: public function run(test:Test):void { mas01mj@732: } mas01mj@732: mas01mj@732: public function addError(test:Test, t:Error):void { mas01mj@732: var failure:TestFailure = new TestFailure(test, t); mas01mj@732: errors.push(failure); mas01mj@732: errorHash[failure.failedMethod()] = failure; mas01mj@732: } mas01mj@732: mas01mj@732: public function addFailure(test:Test, t:AssertionFailedError):void { mas01mj@732: var failure:TestFailure = new TestFailure(test, t); mas01mj@732: failures.push(failure); mas01mj@732: failureHash[failure.failedMethod()] = failure; mas01mj@732: } mas01mj@732: mas01mj@732: public function startTestMethod(test:Test, methodName:String):void { mas01mj@732: var method:TestMethod = new TestMethod(test, methodName); mas01mj@732: methods.push(method); mas01mj@732: methodHash[method.getName()] = method; mas01mj@732: } mas01mj@732: mas01mj@732: public function endTestMethod(test:Test, methodName:String):void { mas01mj@732: methodHash[methodName].endTest(test); mas01mj@732: } mas01mj@732: mas01mj@732: public function endTest(test:Test):void { mas01mj@732: _duration = (getTimer() - start) * .001; mas01mj@732: } mas01mj@732: mas01mj@732: private function errorCount():int { mas01mj@732: return errors.length; mas01mj@732: } mas01mj@732: mas01mj@732: private function failureCount():int { mas01mj@732: return failures.length; mas01mj@732: } mas01mj@732: mas01mj@732: private function duration():Number { mas01mj@732: return _duration; mas01mj@732: } mas01mj@732: mas01mj@732: private function renderSuiteOpener():String { mas01mj@732: return "\n"; mas01mj@732: } mas01mj@732: mas01mj@732: private function renderTestOpener(methodName:String):String { mas01mj@732: return "\n"; mas01mj@732: } mas01mj@732: mas01mj@732: private function renderTestBody(method:String):String { mas01mj@732: if(errorHash[method]) { mas01mj@732: return renderError(errorHash[method]); mas01mj@732: } mas01mj@732: else if(failureHash[method]) { mas01mj@732: return renderFailure(failureHash[method]); mas01mj@732: } mas01mj@732: else { mas01mj@732: return ""; mas01mj@732: } mas01mj@732: } mas01mj@732: mas01mj@732: private function renderError(failure:TestFailure):String { mas01mj@732: return "\n"; mas01mj@732: } mas01mj@732: mas01mj@732: private function renderFailure(failure:TestFailure):String { mas01mj@732: return "\n"; mas01mj@732: } mas01mj@732: mas01mj@732: private function renderTestCloser():String { mas01mj@732: return '\n'; mas01mj@732: } mas01mj@732: mas01mj@732: private function renderSuiteCloser():String { mas01mj@732: return '\n'; mas01mj@732: } mas01mj@732: mas01mj@732: public function toString():String { mas01mj@732: var str:String = ''; mas01mj@732: str += renderSuiteOpener(); mas01mj@732: for(var name:String in methodHash) { mas01mj@732: str += renderTestOpener(name); mas01mj@732: str += renderTestBody(name); mas01mj@732: str += renderTestCloser(); mas01mj@732: } mas01mj@732: str += renderSuiteCloser(); mas01mj@732: return str; mas01mj@732: } mas01mj@732: } mas01mj@732: