/*
 * JBoss, Home of Professional Open Source
 * Copyright 2007, Red Hat Middleware LLC, and individual contributors
 * as indicated by the @author tags.
 * See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 * This copyrighted material is made available to anyone wishing to use,
 * modify, copy, or redistribute it subject to the terms and conditions
 * of the GNU Lesser General Public License, v. 2.1.
 * This program is distributed in the hope that it will be useful, but WITHOUT A
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
 * You should have received a copy of the GNU Lesser General Public License,
 * v.2.1 along with this distribution; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA  02110-1301, USA.
 *
 * (C) 2005-2006,
 * @author JBoss Inc.
 */
package com.jboss.transaction.wstf.interop;


import junit.framework.Test;
import junit.framework.TestSuite;

/**
 * Interop testsuite to initialise the participant uri on addition.
 * @author kevin
 */
public class InteropTestSuite extends TestSuite
{
    /**
     * The participant URI for this test.
     */
    private final String participantURI ;
    /**
     * The test timeout.
     */
    private final long testTimeout ;
    /**
     * The asynchronous test flag.
     */
    private final boolean asyncTest ;
    
    /**
     * Construct an empty test suite with the specified participant URI.
     * @param testTimeout The test timeout.
     * @param participantURI The participant URI.
     */
    public InteropTestSuite(final String participantURI, final long testTimeout, final boolean asyncTest)
    {
        super() ;
        this.participantURI = participantURI ;
        this.testTimeout = testTimeout ;
        this.asyncTest = asyncTest ;
    }
    
    /**
     * Construct an empty test suite with the specified participant URI and name.
     * @param participantURI The participant URI.
     * @param testTimeout The test timeout.
     * @param name The name of the test suite.
     */
    public InteropTestSuite(final String participantURI, final long testTimeout, final boolean asyncTest, final String name)
    {
        super(name) ;
        this.participantURI = participantURI ;
        this.testTimeout = testTimeout ;
        this.asyncTest = asyncTest ;
    }

    /**
     * Constructs a TestSuite from the given class using the specified participant URI.
     * @param participantURI The participant URI.
     * @param testTimeout The test timeout.
     * @param clazz The class containing the tests.
     */
    public InteropTestSuite(final String participantURI, final long testTimeout, final boolean asyncTest, final Class clazz)
    {
        super(clazz) ;
        this.participantURI = participantURI ;
        this.testTimeout = testTimeout ;
        this.asyncTest = asyncTest ;
        final int numTests = countTestCases() ;
        for(int count = 0 ; count < numTests ; count++)
        {
            initialiseTest(testAt(count)) ;
        }
    }
    
    /**
     * Constructs a TestSuite from the given class using the specified participant URI and name.
     * @param participantURI The participant URI.
     * @param testTimeout The test timeout.
     * @param clazz The class containing the tests.
     * @param name The name of the test suite.
     */
    public InteropTestSuite(final String participantURI, final long testTimeout, final boolean asyncTest, final Class clazz, final String name)
    {
        super(clazz, name) ;
        this.participantURI = participantURI ;
        this.testTimeout = testTimeout ;
        this.asyncTest = asyncTest ;
    }

    /**
     * Add a test to the test suite.
     * @param test The test to add.
     */
    public void addTest(final Test test)
    {
        initialiseTest(test) ;
        super.addTest(test) ;
    }
    
    /**
     * Perform initialisation on the test.
     * @param test The test to initialise.
     */
    private void initialiseTest(final Test test)
    {
        if (test instanceof InteropTestCase)
        {
            final InteropTestCase interopTestCase = (InteropTestCase)test ;
            interopTestCase.setParticipantURI(participantURI) ;
            interopTestCase.setTestTimeout(testTimeout) ;
            interopTestCase.setAsyncTest(asyncTest) ;
        }
    }
}
