Mercurial > hg > audiodb
diff bindings/as3/ext/asunit/framework/AsynchronousTestCase.as @ 732:3a0b9700b3d2
* Initial AS3 commit
author | mas01mj |
---|---|
date | Tue, 14 Sep 2010 16:47:10 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bindings/as3/ext/asunit/framework/AsynchronousTestCase.as Tue Sep 14 16:47:10 2010 +0000 @@ -0,0 +1,161 @@ +package asunit.framework { + + import asunit.errors.AbstractError; + + import flash.errors.IllegalOperationError; + import flash.events.*; + import flash.net.URLLoader; + import flash.utils.getTimer; + + /** + * Extend this class if you have a TestCase that requires the + * asynchronous load of external data. + */ + public class AsynchronousTestCase extends TestCase implements Test { + + protected static const DEFAULT_REMOTE_TIMEOUT:int = 30000; + private static const INVALID_TIME:int = -1; + + private var _ioErrorExpected:Boolean; + private var _remoteDuration:int; + private var _remoteStartTime:int; + private var _remoteTimeout:int; + private var _securityErrorExpected:Boolean; + + public function AsynchronousTestCase(testMethod:String = null) { + super(testMethod); + _remoteStartTime = INVALID_TIME; + + // set defaults for user-configurable properties: + _remoteTimeout = DEFAULT_REMOTE_TIMEOUT; + _ioErrorExpected = false; + _securityErrorExpected = false; + } + + public function get remoteDuration():int { + return _remoteDuration; + } + + public function remoteDurationIsValid():Boolean { + return _remoteDuration != INVALID_TIME; + } + + // see testRemoteDuration() below + public function set remoteTimeout(ms:int):void { + _remoteTimeout = ms; + } + + public function set ioErrorExpected(yn:Boolean):void { + _ioErrorExpected = yn; + } + + public function set securityErrorExpected(yn:Boolean):void { + _securityErrorExpected = yn; + } + + // use this method in overriding run() if you are using a URLLoader: + protected function configureListeners(loader:URLLoader):void { + loader.addEventListener(Event.COMPLETE, completeHandler); + loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler); + loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); + loader.addEventListener(Event.OPEN, openHandler); + loader.addEventListener(ProgressEvent.PROGRESS, progressHandler); + loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); + } + + // in a subclass, you should override this method and call super.run() at the end + public override function run():void { + if ((this as Object).constructor == AsynchronousTestCase) + { + throw new AbstractError("run() method must be overridden in class derived from AsynchronousTestCase"); + } + + startRemoteDuration(); + } + + private final function startRemoteDuration():void { + _remoteStartTime = getTimer(); + } + + private final function setRemoteDuration():void { + if (_remoteStartTime == INVALID_TIME) { + // I guess you overrode run() in a subclass without calling super.run() + _remoteDuration = INVALID_TIME; + } + else { + _remoteDuration = getTimer() - _remoteStartTime; + } + } + + protected final function completeHandler(event:Event):void { + setRemoteDuration(); + setDataSource(event); + // call super.run() to execute test methods: + runTests(); + } + + // override this method to put a copy of the data into a member reference + protected function setDataSource(event:Event):void { + throw new AbstractError("setDataSource must be overridden in class derived from AsynchronousTestCase"); + } + + // this method gives derived classes access to TestCase.run() + protected final function runTests():void { + super.run(); + } + + // TODO: add support for failing status events... + protected function httpStatusHandler(event:HTTPStatusEvent):void { + // I believe this is useless except in AIR. + } + + protected final function ioErrorHandler(event:IOErrorEvent):void { + result.startTest(this); + if (_ioErrorExpected == false) + { + // access is authorized and we didn't get in: log the error + result.addError(this, new IllegalOperationError(event.text)); + } + setRemoteDuration(); + testRemoteDuration(); + dispatchEvent(new Event(Event.COMPLETE)); + } + + protected function openHandler(event:Event):void { + } + + protected function progressHandler(event:ProgressEvent):void { + } + + protected final function securityErrorHandler(event:SecurityErrorEvent):void { + result.startTest(this); + if (_securityErrorExpected == false) + { + // access is authorized and we didn't get in: log the error + result.addError(this, new IllegalOperationError(event.text)); + } + setRemoteDuration(); + testRemoteDuration(); + dispatchEvent(new Event(Event.COMPLETE)); + } + + public function testRemoteDuration():void { + if (!remoteDurationIsValid()) + { + return; + } + if (_remoteDuration > _remoteTimeout) + { + result.addError(this, new IllegalOperationError("remote communication took too long: " + _remoteDuration/1000 + " seconds.\n" + this.toString())); + } + } + + public function testUnauthorizedAccess():void { + if (_securityErrorExpected || _ioErrorExpected) + { + fail("unauthorized access permitted (expected no access)\n" + this.toString()); + } + } + + } +} \ No newline at end of file