package org.apache.maven.plugin.failsafe;

/*
 * 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.plugin.failsafe.util.FailsafeSummaryXmlUtils;
import org.apache.maven.surefire.suite.RunResult;
import org.junit.Test;

import java.io.File;

import static org.fest.assertions.Assertions.assertThat;

/**
 *
 */
public class MarshallerUnmarshallerTest
{
    @Test
    public void shouldUnmarshallExistingXmlFile() throws Exception
    {
        File xml = new File( "target/test-classes/org/apache/maven/plugin/failsafe/failsafe-summary.xml" );
        RunResult summary = FailsafeSummaryXmlUtils.toRunResult( xml );

        assertThat( summary.getCompletedCount() )
                .isEqualTo( 7 );

        assertThat( summary.getErrors() )
                .isEqualTo( 1 );

        assertThat( summary.getFailures() )
                .isEqualTo( 2 );

        assertThat( summary.getSkipped() )
                .isEqualTo( 3 );

        assertThat( summary.getFailure() )
                .contains( "There was an error in the forked processtest "
                                   + "subsystem#no method RuntimeException Hi There!"
                );

        assertThat( summary.getFailure() )
                .contains( "There was an error in the forked processtest "
                                   + "subsystem#no method RuntimeException Hi There! $&>>"
                                   + "\n\tat org.apache.maven.plugin.surefire.booterclient.ForkStarter"
                                   + ".awaitResultsDone(ForkStarter.java:489)"
                );
    }

    @Test
    public void shouldMarshallAndUnmarshallSameXml() throws Exception
    {
        RunResult expected =
                new RunResult( 7, 1, 2, 3, 2,
                                     "There was an error in the forked processtest "
                                             + "subsystem#no method RuntimeException Hi There! $&>>"
                                             + "\n\tat org.apache.maven.plugin.surefire.booterclient.ForkStarter"
                                             + ".awaitResultsDone(ForkStarter.java:489)", true );

        File xml = File.createTempFile( "failsafe-summary", ".xml" );
        FailsafeSummaryXmlUtils.writeSummary( expected, xml, false );

        RunResult actual = FailsafeSummaryXmlUtils.toRunResult( xml );

        assertThat( actual.getFailures() )
                .isEqualTo( expected.getFailures() );

        assertThat( actual.isTimeout() )
                .isEqualTo( expected.isTimeout() );

        assertThat( actual.getCompletedCount() )
                .isEqualTo( expected.getCompletedCount() );

        assertThat( actual.getErrors() )
                .isEqualTo( expected.getErrors() );

        assertThat( actual.getFailures() )
                .isEqualTo( expected.getFailures() );

        assertThat( actual.getSkipped() )
                .isEqualTo( expected.getSkipped() );

        assertThat( actual.getFailure() )
                .isEqualTo( expected.getFailure() );
    }
}
