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 org.junit.Test;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;

@SuppressWarnings( { "javadoc", "checkstyle:javadoctype" } )
/**
 * Inclusive test patters:<p>
 *
 * <table cellspacing=0 border=1>
 * <tr>
 * <td style=min-width:50px> test</td>
 * <td style=min-width:50px></td>
 * <td style=min-width:50px> pattern</td>
 * <td style=min-width:50px></td>
 * <td style=min-width:50px></td>
 * <td style=min-width:50px></td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>class</td>
 * <td style=min-width:50px>method</td>
 * <td style=min-width:50px>class</td>
 * <td style=min-width:50px>method</td>
 * <td style=min-width:50px>shouldRunAsInclusive</td>
 * <td style=min-width:50px></td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y (wildcard pattern)</td>
 * <td style=min-width:50px>testIncludes1</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y (suppose suite and custome filter)</td>
 * <td style=min-width:50px>testIncludes2</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y (suppose Suite)</td>
 * <td style=min-width:50px>testIncludes3</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y (suppose Suite)</td>
 * <td style=min-width:50px>testIncludes4</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y (wildcard pattern)</td>
 * <td style=min-width:50px>testIncludes5</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>match methods</td>
 * <td style=min-width:50px>testIncludes6</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y (due to Cucumber)</td>
 * <td style=min-width:50px>testIncludes7</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y (due to Cucumber)</td>
 * <td style=min-width:50px>testIncludes8</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y (wildcard pattern)</td>
 * <td style=min-width:50px>testIncludes9</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y (suppose suite and custome filter)</td>
 * <td style=min-width:50px>testIncludes10</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>match classes</td>
 * <td style=min-width:50px>testIncludes11</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>match classes</td>
 * <td style=min-width:50px>testIncludes12</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y (wildcard pattern)</td>
 * <td style=min-width:50px>testIncludes13</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>match methods</td>
 * <td style=min-width:50px>testIncludes14</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>match classes</td>
 * <td style=min-width:50px>testIncludes15</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>match all</td>
 * <td style=min-width:50px>testIncludes16</td>
 * </tr>
 * </table>
 * <p>
 * <p>
 * Exclusive test patters:<p>
 *
 * <table cellspacing=0 border=1>
 * <tr>
 * <td style=min-width:50px> test</td>
 * <td style=min-width:50px></td>
 * <td style=min-width:50px> pattern</td>
 * <td style=min-width:50px></td>
 * <td style=min-width:50px></td>
 * <td style=min-width:50px></td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>class</td>
 * <td style=min-width:50px>method</td>
 * <td style=min-width:50px>class</td>
 * <td style=min-width:50px>method</td>
 * <td style=min-width:50px>shouldRunAsExclusive</td>
 * <td style=min-width:50px></td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n (wildcard pattern)</td>
 * <td style=min-width:50px>testExcludes1</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n (suppose suite and custome filter)</td>
 * <td style=min-width:50px>testExcludes2</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n (suppose Suite)</td>
 * <td style=min-width:50px>testExcludes3</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n (suppose Suite)</td>
 * <td style=min-width:50px>testExcludes4</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n (wildcard pattern)</td>
 * <td style=min-width:50px>testExcludes5</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>match methods</td>
 * <td style=min-width:50px>testExcludes6</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n (due to Cucumber)</td>
 * <td style=min-width:50px>testExcludes7</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n (due to Cucumber)</td>
 * <td style=min-width:50px>testExcludes8</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n (wildcard pattern)</td>
 * <td style=min-width:50px>testExcludes9</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n (suppose suite and custome filter)</td>
 * <td style=min-width:50px>testExcludes10</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>match classes</td>
 * <td style=min-width:50px>testExcludes11</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n (cannot exclude in dir.scanner)</td>
 * <td style=min-width:50px>testExcludes12</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>n (wildcard pattern)</td>
 * <td style=min-width:50px>testExcludes13</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>match methods</td>
 * <td style=min-width:50px>testExcludes14</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>n</td>
 * <td style=min-width:50px>match classes</td>
 * <td style=min-width:50px>testExcludes15</td>
 * </tr>
 * <tr>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>y</td>
 * <td style=min-width:50px>match all</td>
 * <td style=min-width:50px>testExcludes16</td>
 * </tr>
 * </table>
 */
public class FundamentalFilterTest
{
    @Test
    public void testIncludes1()
    {
        ResolvedTest pattern = new ResolvedTest( (String) null, null, false );
        assertThat( pattern.matchAsInclusive( null, null ), is( true ) );
    }

    @Test
    public void testIncludes2()
    {
        ResolvedTest pattern = new ResolvedTest( (String) null, "method", false );
        assertThat( pattern.matchAsInclusive( null, null ), is( true ) );
    }

    @Test
    public void testIncludes3()
    {
        ResolvedTest pattern = new ResolvedTest( "Test", null, false );
        assertThat( pattern.matchAsInclusive( null, null ), is( true ) );
    }

    @Test
    public void testIncludes4()
    {
        ResolvedTest pattern = new ResolvedTest( "Test", "method", false );
        assertThat( pattern.matchAsInclusive( null, null ), is( true ) );
    }

    @Test
    public void testIncludes5()
    {
        ResolvedTest pattern = new ResolvedTest( (String) null, null, false );
        assertThat( pattern.matchAsInclusive( null, "method" ), is( true ) );
    }

    @Test
    public void testIncludes6()
    {
        ResolvedTest pattern = new ResolvedTest( (String) null, "method", false );
        assertThat( pattern.matchAsInclusive( null, "method" ), is( true ) );
        assertThat( pattern.matchAsInclusive( null, "otherMethod" ), is( false ) );
    }

    /**
     * Does not throw NPE due to Cucumber has test class NULL and test method NOT NULL.
     */
    @Test
    public void testIncludes7()
    {
        ResolvedTest pattern = new ResolvedTest( "Test", null, false );
        assertThat( pattern.matchAsInclusive( null, "method" ), is( true ) );
    }

    /**
     * Does not throw NPE due to Cucumber has test class NULL and test method NOT NULL.
     */
    @Test
    public void testIncludes8()
    {
        ResolvedTest pattern = new ResolvedTest( "Test", "method", false );
        assertThat( pattern.matchAsInclusive( null, "method" ), is( true ) );
        assertThat( pattern.matchAsInclusive( null, "otherMethod" ), is( true ) );
    }

    @Test
    public void testIncludes9()
    {
        ResolvedTest pattern = new ResolvedTest( (String) null, null, false );
        assertThat( pattern.matchAsInclusive( "Test.class", null ), is( true ) );
    }

    @Test
    public void testIncludes10()
    {
        ResolvedTest pattern = new ResolvedTest( (String) null, "method", false );
        assertThat( pattern.matchAsInclusive( "Test.class", null ), is( true ) );
    }

    @Test
    public void testIncludes11()
    {
        ResolvedTest pattern = new ResolvedTest( "Test", null, false );
        assertThat( pattern.matchAsInclusive( "Test.class", null ), is( true ) );
        assertThat( pattern.matchAsInclusive( "Other.class", null ), is( false ) );
    }

    @Test
    public void testIncludes12()
    {
        ResolvedTest pattern = new ResolvedTest( "Test", "method", false );
        assertThat( pattern.matchAsInclusive( "Test.class", null ), is( true ) );
        assertThat( pattern.matchAsInclusive( "Other.class", null ), is( false ) );
    }

    @Test
    public void testIncludes13()
    {
        ResolvedTest pattern = new ResolvedTest( (String) null, null, false );
        assertThat( pattern.matchAsInclusive( "Test.class", "method" ), is( true ) );
    }

    @Test
    public void testIncludes14()
    {
        ResolvedTest pattern = new ResolvedTest( (String) null, "method", false );
        assertThat( pattern.matchAsInclusive( "Test.class", "method" ), is( true ) );
        assertThat( pattern.matchAsInclusive( "Test.class", "otherMethod" ), is( false ) );
    }

    @Test
    public void testIncludes15()
    {
        ResolvedTest pattern = new ResolvedTest( "Test", null, false );
        assertThat( pattern.matchAsInclusive( "Test.class", "method" ), is( true ) );
        assertThat( pattern.matchAsInclusive( "Other.class", "method" ), is( false ) );
    }

    @Test
    public void testIncludes16()
    {
        ResolvedTest pattern = new ResolvedTest( "Test", "method", false );
        assertThat( pattern.matchAsInclusive( "Test.class", "method" ), is( true ) );
        assertThat( pattern.matchAsInclusive( "Test.class", "otherMethod" ), is( false ) );
        assertThat( pattern.matchAsInclusive( "Other.class", "method" ), is( false ) );
        assertThat( pattern.matchAsInclusive( "Other.class", "otherMethod" ), is( false ) );
    }

    @Test
    public void testExcludes1()
    {
        ResolvedTest pattern = new ResolvedTest( (String) null, null, false );
        assertThat( pattern.matchAsExclusive( null, null ), is( false ) );
    }

    @Test
    public void testExcludes2()
    {
        ResolvedTest pattern = new ResolvedTest( (String) null, "method", false );
        assertThat( pattern.matchAsExclusive( null, null ), is( false ) );
    }

    @Test
    public void testExcludes3()
    {
        ResolvedTest pattern = new ResolvedTest( "Test", null, false );
        assertThat( pattern.matchAsExclusive( null, null ), is( false ) );
    }

    @Test
    public void testExcludes4()
    {
        ResolvedTest pattern = new ResolvedTest( "Test", "method", false );
        assertThat( pattern.matchAsExclusive( null, null ), is( false ) );
    }

    @Test
    public void testExcludes5()
    {
        ResolvedTest pattern = new ResolvedTest( (String) null, null, false );
        assertThat( pattern.matchAsExclusive( null, "method" ), is( false ) );
    }

    @Test
    public void testExcludes6()
    {
        ResolvedTest pattern = new ResolvedTest( (String) null, "method", false );
        assertThat( pattern.matchAsExclusive( null, "method" ), is( true ) );
        assertThat( pattern.matchAsExclusive( null, "otherMethod" ), is( false ) );
    }

    /**
     * Does not throw NPE due to Cucumber has test class NULL and test method NOT NULL.
     */
    @Test
    public void testExcludes7()
    {
        ResolvedTest pattern = new ResolvedTest( "Test", null, false );
        assertThat( pattern.matchAsExclusive( null, "method" ), is( false ) );
    }

    /**
     * Does not throw NPE due to Cucumber has test class NULL and test method NOT NULL.
     */
    @Test
    public void testExcludes8()
    {
        ResolvedTest pattern = new ResolvedTest( "Test", "method", false );
        assertThat( pattern.matchAsExclusive( null, "method" ), is( false ) );
        assertThat( pattern.matchAsExclusive( null, "otherMethod" ), is( false ) );
    }

    @Test
    public void testExcludes9()
    {
        ResolvedTest pattern = new ResolvedTest( (String) null, null, false );
        assertThat( pattern.matchAsExclusive( "Test.class", null ), is( false ) );
    }

    @Test
    public void testExcludes10()
    {
        ResolvedTest pattern = new ResolvedTest( (String) null, "method", false );
        assertThat( pattern.matchAsExclusive( "Test.class", null ), is( false ) );
    }

    @Test
    public void testExcludes11()
    {
        ResolvedTest pattern = new ResolvedTest( "Test", null, false );
        assertThat( pattern.matchAsExclusive( "Test.class", null ), is( true ) );
        assertThat( pattern.matchAsExclusive( "Other.class", null ), is( false ) );
    }

    @Test
    public void testExcludes12()
    {
        ResolvedTest pattern = new ResolvedTest( "Test", "method", false );
        assertThat( pattern.matchAsExclusive( "Test.class", null ), is( false ) );
        assertThat( pattern.matchAsExclusive( "Other.class", null ), is( false ) );
    }

    @Test
    public void testExcludes13()
    {
        ResolvedTest pattern = new ResolvedTest( (String) null, null, false );
        assertThat( pattern.matchAsExclusive( "Test.class", "method" ), is( false ) );
    }

    @Test
    public void testExcludes14()
    {
        ResolvedTest pattern = new ResolvedTest( (String) null, "method", false );
        assertThat( pattern.matchAsExclusive( "Test.class", "method" ), is( true ) );
        assertThat( pattern.matchAsExclusive( "Test.class", "otherMethod" ), is( false ) );
    }

    @Test
    public void testExcludes15()
    {
        ResolvedTest pattern = new ResolvedTest( "Test", null, false );
        assertThat( pattern.matchAsExclusive( "Test.class", "method" ), is( true ) );
        assertThat( pattern.matchAsExclusive( "Other.class", "method" ), is( false ) );
    }

    @Test
    public void testExcludes16()
    {
        ResolvedTest pattern = new ResolvedTest( "Test", "method", false );
        assertThat( pattern.matchAsExclusive( "Test.class", "method" ), is( true ) );
        assertThat( pattern.matchAsExclusive( "Test.class", "otherMethod" ), is( false ) );
        assertThat( pattern.matchAsExclusive( "Other.class", "method" ), is( false ) );
        assertThat( pattern.matchAsExclusive( "Other.class", "otherMethod" ), is( false ) );
    }
}
