package asunit.framework { import asunit.errors.AssertionFailedError; import asunit.errors.InstanceNotFoundError; import flash.errors.IllegalOperationError; import flash.events.EventDispatcher; /** * A TestResult collects the results of executing * a test case. It is an instance of the Collecting Parameter pattern. * The test framework distinguishes between failures and errors. * A failure is anticipated and checked for with assertions. Errors are * unanticipated problems like an ArrayIndexOutOfBoundsException. * * @see Test */ public class TestResult { protected var fFailures:Array; protected var fErrors:Array; protected var fListeners:Array; protected var fRunTests:int; private var fStop:Boolean; public function TestResult() { fFailures = new Array(); fErrors = new Array(); fListeners = new Array(); fRunTests = 0; fStop = false; } /** * Adds an error to the list of errors. The passed in exception * caused the error. */ public function addError(test:Test, t:Error):void { fErrors.push(new TestFailure(test, t)); var len:uint = fListeners.length; var item:TestListener; for(var i:uint; i < len; i++) { item = TestListener(fListeners[i]); item.addError(test, t); } } /** * Adds a failure to the list of failures. The passed in exception * caused the failure. */ public function addFailure(test:Test, t:AssertionFailedError):void { fFailures.push(new TestFailure(test, t)); var len:uint = fListeners.length; var item:TestListener; for(var i:uint; i < len; i++) { item = TestListener(fListeners[i]); item.addFailure(test, t); } } /** * Registers a TestListener */ public function addListener(listener:TestListener):void { fListeners.push(listener); } /** * Unregisters a TestListener */ public function removeListener(listener:TestListener):void { var len:uint = fListeners.length; for(var i:uint; i < len; i++) { if(fListeners[i] == listener) { fListeners.splice(i, 1); return; } } throw new InstanceNotFoundError("removeListener called without listener in list"); } /** * Gets the number of detected errors. */ public function errorCount():int { return fErrors.length; } /** * Returns an Enumeration for the errors */ public function errors():Array { return fErrors; } /** * Gets the number of detected failures. */ public function failureCount():int { return fFailures.length; } /** * Returns an Enumeration for the failures */ public function failures():Array { return fFailures; } /** * Runs a TestCase. */ public function run(test:TestCase):void { startTest(test); test.runBare(); } /** * Gets the number of run tests. */ public function runCount():int { return fRunTests; } /** * Checks whether the test run should stop */ public function shouldStop():Boolean { return fStop; } /** * Informs the result that a test will be started. */ public function startTest(test:Test):void { var count:int = test.countTestCases(); fRunTests += count; var len:uint = fListeners.length; var item:TestListener; for(var i:uint; i < len; i++) { item = TestListener(fListeners[i]); item.startTest(test); } } /** * Informs the result that a test was completed. */ public function endTest(test:Test):void { var len:uint = fListeners.length; var item:TestListener; for(var i:uint; i < len; i++) { item = TestListener(fListeners[i]); item.endTest(test); } } /** * Marks that the test run should stop. */ public function stop():void { fStop = true; } /** * Returns whether the entire test was successful or not. */ public function wasSuccessful():Boolean { return failureCount() == 0 && errorCount() == 0; } } }