package junit.extensions;

import junit.framework.* ;

/**
 * A TestSuite for active Tests. It runs each
 * test in a separate thread and waits until all
 * threads have terminated.
 * -- Aarhus Radisson Scandinavian Center 11th floor
 */
public class ActiveTestSuite extends TestSuite {
        private volatile int fActiveTestDeathCount;

        public void run(TestResult result) {
                fActiveTestDeathCount = 0;
                super.run(result);
                waitUntilFinished();
        }

        public void runTest( final Test test, final TestResult result) {
                Thread t = new Thread() {
                         public void run() {
                                 try {
                                         // inlined due to limitation in VA/Java 
                                         //ActiveTestSuite.super.runTest(test, result);
                                         test.run(result);
                                 } finally {
                                         ActiveTestSuite.this.runFinished(test);
                                 }
                         }
                 };
                t.start();
        }

        synchronized void waitUntilFinished() {
                while (fActiveTestDeathCount < testCount()) {
                        try {
                                wait();
                        } catch (InterruptedException e) {
                                return; // ignore
                        }
                }
        }

        synchronized public void runFinished(Test test) {
                fActiveTestDeathCount++;
                notifyAll();
        }
}