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

/*
 * 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.api.report.ReportEntry;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.apache.maven.surefire.shared.utils.logging.MessageUtils.buffer;
import static org.fest.assertions.Assertions.assertThat;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;

/**
 * tests for {@link TestSetStats}.
 */
@RunWith( PowerMockRunner.class )
@PowerMockIgnore( { "org.jacoco.agent.rt.*", "com.vladium.emma.rt.*" } )
public class TestSetStatsTest
{
    @Mock
    private ReportEntry reportEntry;

    @Test
    public void shouldConcatenateWithTestGroup()
    {
        when( reportEntry.getNameWithGroup() )
                .thenReturn( "pkg.MyTest (my group)" );
        String actual = TestSetStats.concatenateWithTestGroup( buffer(), reportEntry, false );
        verify( reportEntry, times( 1 ) ).getNameWithGroup();
        verifyNoMoreInteractions( reportEntry );
        String expected = buffer().a( "pkg." ).strong( "MyTest (my group)" ).toString();
        assertThat( actual )
                .isEqualTo( expected );
    }

    @Test
    public void shouldConcatenateWithJUnit5TestGroup()
    {
        when( reportEntry.getReportNameWithGroup() )
                .thenReturn( "pkg.MyTest (my group)" );
        String actual = TestSetStats.concatenateWithTestGroup( buffer(), reportEntry, true );
        verify( reportEntry, times( 1 ) ).getReportNameWithGroup();
        verifyNoMoreInteractions( reportEntry );
        String expected = buffer().strong( "pkg.MyTest (my group)" ).toString();
        assertThat( actual )
                .isEqualTo( expected );
    }
}
