/*******************************************************************************
 * Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Oracle - initial API and implementation from Oracle TopLink
 ******************************************************************************/  
package org.eclipse.persistence.testing.framework;


/**
 * <b>Purpose</b>:Wraps any existing test, allowing for tests within tests within ...
 * <p>
 * <b>Responsibilities</b>:Wraps an existing test, and executes that test
 * within its own test() method.
 * <p>Ideal for running any test under a different session configuration.
 * <p>If the wrapped test fails, the error message will take the context it was
 * running under into consideration.
 * <p>If the wrapping test fails, the wrapped test will never get executed,
 * meaning a particular instance can be executed once with no wrapped test to
 * test a particular setup, and again to test behavior under a particular setup.
 *
 * @author Stephen McRitchie
 * @since 10 to test flashback feature under different session configurations.
 */
public class TestAdapter extends TestCase {
    public TestCase wrappedTest;
    protected boolean wrappedTestPassed = true;

    public TestAdapter(TestCase wrappedTest) {
        super();
        this.wrappedTest = wrappedTest;
        setName(super.getName() + ":" + wrappedTest.getName());
        setContainer(wrappedTest.getContainer());
        //setDescription("Using TimeAwareSession: " + wrappedTest.getDescription());
    }

    protected void setup() throws Throwable {
        super.setup();
    }

    public void reset() throws Throwable {
        super.reset();
    }

    protected void test() throws Throwable {
        try {
            if (wrappedTest != null) {
                wrappedTest.execute(getExecutor());
            }
        } catch (Throwable e) {
            setTestResult(wrappedTest.getTestResult());
            wrappedTest.getTestResult().setName(getName());
            // This is needed to avoid a NPE on the indentation string.
            wrappedTest.getTestResult().testCase = this;
            throw e;
        }
    }

    protected void verify() {
    }
}
