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 ActiveTestSuite() {
    }

    public ActiveTestSuite(Class theClass) {
        super(theClass);
    }

    public ActiveTestSuite(String name) {
        super (name);
    }

    public ActiveTestSuite(Class theClass, String name) {
        super(theClass, name);
    }

    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();
    }
}
