mas01mj@732: package asunit.framework { mas01mj@732: import asunit.util.ArrayIterator; mas01mj@732: import asunit.util.Iterator; mas01mj@732: mas01mj@732: import flash.display.DisplayObjectContainer; mas01mj@732: import flash.events.Event; mas01mj@732: mas01mj@732: /** mas01mj@732: * A TestSuite is a Composite of Tests. mas01mj@732: * mas01mj@732: * @see Test mas01mj@732: * @see TestCase mas01mj@732: * mas01mj@732: * @includeExample TestSuiteExample.as mas01mj@732: */ mas01mj@732: public class TestSuite extends TestCase implements Test { mas01mj@732: private var fTests:Array = new Array(); mas01mj@732: private var testsCompleteCount:Number = 0; mas01mj@732: private var iterator:ArrayIterator; mas01mj@732: private var isRunning:Boolean; mas01mj@732: mas01mj@732: public function TestSuite() { mas01mj@732: super(); mas01mj@732: fTests = new Array(); mas01mj@732: } mas01mj@732: mas01mj@732: protected override function setTestMethods(methodNodes:XMLList):void { mas01mj@732: testMethods = new Array(); mas01mj@732: } mas01mj@732: mas01mj@732: /** mas01mj@732: * Adds a test instance to the suite. mas01mj@732: */ mas01mj@732: public function addTest(test:Test):void { mas01mj@732: if (!test.getIsComplete()) mas01mj@732: fTests.push(test); mas01mj@732: } mas01mj@732: mas01mj@732: /** mas01mj@732: * Counts the number of tests that will be run by this Suite. mas01mj@732: */ mas01mj@732: public override function countTestCases():int { mas01mj@732: var count:int; mas01mj@732: for each(var test:TestCase in fTests) { mas01mj@732: count = count + test.countTestCases(); mas01mj@732: } mas01mj@732: return count; mas01mj@732: } mas01mj@732: mas01mj@732: /** mas01mj@732: * Runs the tests and collects their result in a TestResult. mas01mj@732: */ mas01mj@732: public override function run():void { mas01mj@732: var result:TestListener = getResult(); mas01mj@732: var test:Test; mas01mj@732: var itr:Iterator = getIterator(); mas01mj@732: while(itr.hasNext()) { mas01mj@732: isRunning = true; mas01mj@732: test = Test(itr.next()); mas01mj@732: test.setResult(result); mas01mj@732: test.addEventListener(Event.COMPLETE, testCompleteHandler); mas01mj@732: test.run(); mas01mj@732: if(!test.getIsComplete()) { mas01mj@732: isRunning = false; mas01mj@732: break; mas01mj@732: } mas01mj@732: } mas01mj@732: } mas01mj@732: mas01mj@732: private function getIterator():ArrayIterator { mas01mj@732: if(iterator == null) { mas01mj@732: iterator = new ArrayIterator(fTests); mas01mj@732: } mas01mj@732: return iterator; mas01mj@732: } mas01mj@732: mas01mj@732: private function testCompleteHandler(event:Event):void { mas01mj@732: if(!isRunning) { mas01mj@732: run(); mas01mj@732: } mas01mj@732: if(++testsCompleteCount >= testCount()) { mas01mj@732: dispatchEvent(new Event(Event.COMPLETE)); mas01mj@732: } mas01mj@732: } mas01mj@732: mas01mj@732: /** mas01mj@732: * Returns the number of tests in this suite mas01mj@732: */ mas01mj@732: public function testCount():int { mas01mj@732: return fTests.length; mas01mj@732: } mas01mj@732: mas01mj@732: public override function toString():String { mas01mj@732: return getName(); mas01mj@732: } mas01mj@732: mas01mj@732: public override function getIsComplete():Boolean { mas01mj@732: for each(var test:TestCase in fTests) { mas01mj@732: if(!test.getIsComplete()) { mas01mj@732: return false; mas01mj@732: } mas01mj@732: } mas01mj@732: return true; mas01mj@732: } mas01mj@732: mas01mj@732: public override function setContext(context:DisplayObjectContainer):void { mas01mj@732: super.setContext(context); mas01mj@732: for each(var test:Test in fTests) { mas01mj@732: test.setContext(context); mas01mj@732: } mas01mj@732: } mas01mj@732: } mas01mj@732: }