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: }