package org.apache.maven.surefire.testset;

/*
 * 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 junit.framework.TestCase;

import static org.apache.maven.surefire.testset.ResolvedTest.Type.CLASS;
import static org.apache.maven.surefire.testset.ResolvedTest.Type.METHOD;
import static org.apache.maven.surefire.testset.ResolvedTest.fromFullyQualifiedClass;

/**
 *
 */
public class ResolvedTestTest
    extends TestCase
{
    public void testEmptyClassRegex()
    {
        ResolvedTest test = new ResolvedTest( CLASS, "  ", true );
        assertNull( test.getTestClassPattern() );
        assertNull( test.getTestMethodPattern() );
        assertFalse( test.hasTestClassPattern() );
        assertFalse( test.hasTestMethodPattern() );
        assertTrue( test.isRegexTestClassPattern() );
        assertFalse( test.isRegexTestMethodPattern() );
        assertTrue( test.isEmpty() );
    }

    public void testEmptyMethodRegex()
    {
        ResolvedTest test = new ResolvedTest( METHOD, "  ", true );
        assertNull( test.getTestClassPattern() );
        assertNull( test.getTestMethodPattern() );
        assertFalse( test.hasTestClassPattern() );
        assertFalse( test.hasTestMethodPattern() );
        assertFalse( test.isRegexTestClassPattern() );
        assertTrue( test.isRegexTestMethodPattern() );
        assertTrue( test.isEmpty() );
    }

    public void testFromFullyQualifiedClass()
    {
        String classFileName = fromFullyQualifiedClass( "my.package.MyTest" );
        assertEquals( "my/package/MyTest", classFileName );

        classFileName = fromFullyQualifiedClass( "my.package.MyTest.class" );
        assertEquals( "my/package/MyTest.class", classFileName );

        classFileName = fromFullyQualifiedClass( "my/package/MyTest.class" );
        assertEquals( "my/package/MyTest.class", classFileName );

        classFileName = fromFullyQualifiedClass( "my/package/MyTest.*" );
        assertEquals( "my/package/MyTest.*", classFileName );

        classFileName = fromFullyQualifiedClass( "my.package.MyTest.*" );
        assertEquals( "my/package/MyTest.*", classFileName );
    }
}
