package org.apache.maven.surefire.its;

/*
 * 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.plugins.surefire.report.ReportTestSuite;
import org.apache.maven.surefire.its.fixture.OutputValidator;
import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
import org.junit.Test;

import static org.apache.maven.surefire.its.fixture.HelperAssertions.extractReports;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.hamcrest.Matchers.lessThan;

/**
 * Test reported runtime
 *
 * @author Kristian Rosenvold
 */
public class XmlReporterRunTimeIT
    extends SurefireJUnit4IntegrationTestCase
{
    @Test
    public void testForkModeAlways()
        throws Exception
    {
        // just generate .surefire-<hash> in order to apply runOrder
        unpack( "/runorder-parallel" )
            .executeTest()
            .verifyErrorFree( 9 );

        // now assert test results match expected values
        OutputValidator outputValidator = unpack( "/runorder-parallel" )
            .executeTest()
            .verifyErrorFree( 9 );

        for ( ReportTestSuite report : extractReports( outputValidator.getBaseDir() ) )
        {
            if ( "runorder.parallel.Test1".equals( report.getFullClassName() ) )
            {
                // should be 6f but because of having Windows sleep discrepancy it is 5.95f
                assertThat( "runorder.parallel.Test1 report.getTimeElapsed found:" + report.getTimeElapsed(),
                            report.getTimeElapsed(), allOf( greaterThanOrEqualTo( 5.95f ), lessThan( 7f ) ) );
            }
            else if ( "runorder.parallel.Test2".equals( report.getFullClassName() ) )
            {
                // should be 5f but because of having Windows sleep discrepancy it is 4.95f
                assertThat( "runorder.parallel.Test2 report.getTimeElapsed found:" + report.getTimeElapsed(),
                            report.getTimeElapsed(), allOf( greaterThanOrEqualTo( 4.95f ), lessThan( 6f ) ) );
            }
            else
            {
                System.out.println( "report = " + report );
            }
        }
    }
}
