package org.apache.maven.surefire.junit;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.apache.maven.surefire.common.junit3.JUnit3Reflector;
import org.apache.maven.surefire.api.report.RunListener;
import org.apache.maven.surefire.api.testset.TestSetFailedException;

/**
 * JUnit3 test set
 *
 */
public final class JUnitTestSet
    implements SurefireTestSet
{
    private final Class testClass;

    private final JUnit3Reflector reflector;

    public JUnitTestSet( Class testClass, JUnit3Reflector reflector )
    {
        if ( testClass == null )
        {
            throw new NullPointerException( "testClass is null" );
        }

        this.testClass = testClass;
        this.reflector = reflector;

        // ----------------------------------------------------------------------
        // Strategy for executing JUnit tests
        //
        // o look for the suite method and if that is present execute that method
        //   to get the test object.
        //
        // o look for test classes that are assignable from TestCase
        //
        // o look for test classes that only implement the Test interface
        // ----------------------------------------------------------------------

        // The interface implemented by the dynamic proxy (TestListener), happens to be
        // the same as the param types of TestResult.addTestListener
    }


    @Override
    public void execute( RunListener reporter, ClassLoader loader )
        throws TestSetFailedException
    {
        Class testClass = getTestClass();

        try
        {
            Object testObject = reflector.constructTestObject( testClass );
            final Method runMethod;

            if ( reflector.getTestInterface().isAssignableFrom( testObject.getClass() ) )
            {
                runMethod = reflector.getTestInterfaceRunMethod();
            }
            else
            {
                runMethod = reflector.getRunMethod( testClass );
            }

            Object instanceOfTestResult = reflector.getTestResultClass().newInstance();

            TestListenerInvocationHandler invocationHandler = new TestListenerInvocationHandler( reporter );

            Object testListener =
                Proxy.newProxyInstance( loader, reflector.getInterfacesImplementedByDynamicProxy(), invocationHandler );

            Object[] addTestListenerParams = { testListener };

            reflector.getAddListenerMethod().invoke( instanceOfTestResult, addTestListenerParams );

            Object[] runParams = { instanceOfTestResult };

            runMethod.invoke( testObject, runParams );
        }
        catch ( InvocationTargetException e )
        {
            throw new TestSetFailedException( testClass.getName(), e.getTargetException() );
        }
        catch ( NoSuchMethodException e )
        {
            throw new TestSetFailedException( "Class is not a JUnit TestCase", e );
        }
        catch ( ReflectiveOperationException e )
        {
            throw new TestSetFailedException( testClass.getName(), e );
        }
    }

    @Override
    public String getName()
    {
        return testClass.getName();
    }

    private Class getTestClass()
    {
        return testClass;
    }
}
