package org.apache.maven.plugin.surefire.runorder;

/*
 * 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.io.File;
import java.io.IOException;

import org.apache.maven.surefire.report.ReportEntry;

import static org.apache.maven.plugin.surefire.runorder.RunEntryStatisticsMap.fromFile;

/**
 * @author Kristian Rosenvold
 */
public class StatisticsReporter
{
    private final RunEntryStatisticsMap existing;

    private final RunEntryStatisticsMap newResults;

    private final File dataFile;

    public StatisticsReporter( File dataFile )
    {
        this( dataFile, fromFile( dataFile ), new RunEntryStatisticsMap() );
    }

    protected StatisticsReporter( File dataFile, RunEntryStatisticsMap existing, RunEntryStatisticsMap newResults )
    {
        this.dataFile = dataFile;
        this.existing = existing;
        this.newResults = newResults;
    }

    public synchronized void testSetCompleted()
    {
        try
        {
            newResults.serialize( dataFile );
        }
        catch ( IOException e )
        {
            throw new RuntimeException( e );
        }
    }

    public void testSucceeded( ReportEntry report )
    {
        newResults.add( existing.createNextGeneration( report ) );
    }

    public void testSkipped( ReportEntry report )
    {
        newResults.add( existing.createNextGeneration( report ) );
    }

    public void testError( ReportEntry report )
    {
        newResults.add( existing.createNextGenerationFailure( report ) );
    }

    public void testFailed( ReportEntry report )
    {
        newResults.add( existing.createNextGenerationFailure( report ) );
    }
}
