package org.apache.maven.surefire.junitcore;

/*
 * 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 org.apache.maven.surefire.common.junit4.Notifier;
import org.apache.maven.surefire.testset.TestSetFailedException;
import org.junit.runner.Result;
import org.junit.runner.Runner;
import org.junit.runner.notification.RunListener;

/**
 * JUnitCore solves bugs in original junit class {@link org.junit.runner.JUnitCore}.<p>
 * The notifier method {@link org.junit.runner.notification.RunNotifier#fireTestRunFinished}
 * is called anyway in finally block.
 *
 * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
 * @since 2.19
 * @see <a href="https://github.com/junit-team/junit/issues/1186">JUnit issue 1186</a>
 */
class JUnitCore
{
    private final Notifier notifier;

    JUnitCore( Notifier notifier )
    {
        this.notifier = notifier;
    }

    Result run( Runner runner )
        throws TestSetFailedException
    {
        Result result = new Result();
        RunListener listener = result.createListener();
        notifier.addFirstListener( listener );
        try
        {
            notifier.fireTestRunStarted( runner.getDescription() );
            runner.run( notifier );
        }
        catch ( Throwable e )
        {
            afterException( e );
        }
        finally
        {
            notifier.fireTestRunFinished( result );
            notifier.removeListener( listener );
            afterFinished();
        }
        return result;
    }

    protected void afterException( Throwable e )
        throws TestSetFailedException
    {
        throw new TestSetFailedException( e );
    }

    protected void afterFinished()
    {
    }
}
