package testng.utils;

/*
 * 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 org.apache.maven.surefire.testng.utils.MethodSelector;
import org.apache.maven.surefire.testset.TestListResolver;
import org.testng.IClass;
import org.testng.IRetryAnalyzer;
import org.testng.ITestClass;
import org.testng.ITestNGMethod;
import org.testng.internal.DefaultMethodSelectorContext;

import java.lang.reflect.Method;

/**
 *
 */
public class MethodSelectorTest
        extends TestCase
{
    public void testInclusionOfMethodFromBaseClass()
    {
        MethodSelector selector = new MethodSelector();
        DefaultMethodSelectorContext context = new DefaultMethodSelectorContext();
        ITestNGMethod testngMethod = new FakeTestNGMethod( ChildClassSample.class, "baseClassMethodToBeIncluded" );
        TestListResolver resolver =
                new TestListResolver( BaseClassSample.class.getName() + "#baseClassMethodToBeIncluded" );
        MethodSelector.setTestListResolver( resolver );
        boolean include = selector.includeMethod( context, testngMethod, true );
        assertTrue( include );
    }

    public void testNoInclusionOfMethodFromBaseClass()
    {
        MethodSelector selector = new MethodSelector();
        DefaultMethodSelectorContext context = new DefaultMethodSelectorContext();
        ITestNGMethod testngMethod = new FakeTestNGMethod( ChildClassSample.class, "baseClassMethodToBeIncluded" );
        TestListResolver resolver = new TestListResolver( BaseClassSample.class.getName() + "#nonExistedMethod" );
        MethodSelector.setTestListResolver( resolver );
        boolean include = selector.includeMethod( context, testngMethod, true );
        assertFalse( include );
    }

    public void testInclusionOfMethodFromSubClass()
    {
        MethodSelector selector = new MethodSelector();
        DefaultMethodSelectorContext context = new DefaultMethodSelectorContext();
        ITestNGMethod testngMethod = new FakeTestNGMethod( ChildClassSample.class, "subClassMethod" );
        TestListResolver resolver = new TestListResolver( ChildClassSample.class.getName() + "#sub*" );
        MethodSelector.setTestListResolver( resolver );
        boolean include = selector.includeMethod( context, testngMethod, true );
        assertTrue( include );
    }

    private static class FakeTestNGMethod
            implements ITestNGMethod
    {
        private final Class<?> clazz;
        private final String methodName;

        FakeTestNGMethod( Class<?> clazz, String methodName )
        {
            this.clazz = clazz;
            this.methodName = methodName;
        }

        @Override
        public Class getRealClass()
        {
            return clazz;
        }

        @Override
        public ITestClass getTestClass()
        {
            return null;
        }

        @Override
        public void setTestClass( ITestClass iTestClass )
        {

        }

        @Override
        public Method getMethod()
        {
            return null;
        }

        @Override
        public String getMethodName()
        {
            return methodName;
        }

        @Override
        public Object[] getInstances()
        {
            return new Object[0];
        }

        @Override
        public long[] getInstanceHashCodes()
        {
            return new long[0];
        }

        @Override
        public String[] getGroups()
        {
            return new String[0];
        }

        @Override
        public String[] getGroupsDependedUpon()
        {
            return new String[0];
        }

        @Override
        public String getMissingGroup()
        {
            return null;
        }

        @Override
        public void setMissingGroup( String s )
        {

        }

        @Override
        public String[] getBeforeGroups()
        {
            return new String[0];
        }

        @Override
        public String[] getAfterGroups()
        {
            return new String[0];
        }

        @Override
        public String[] getMethodsDependedUpon()
        {
            return new String[0];
        }

        @Override
        public void addMethodDependedUpon( String s )
        {

        }

        @Override
        public boolean isTest()
        {
            return false;
        }

        @Override
        public boolean isBeforeMethodConfiguration()
        {
            return false;
        }

        @Override
        public boolean isAfterMethodConfiguration()
        {
            return false;
        }

        @Override
        public boolean isBeforeClassConfiguration()
        {
            return false;
        }

        @Override
        public boolean isAfterClassConfiguration()
        {
            return false;
        }

        @Override
        public boolean isBeforeSuiteConfiguration()
        {
            return false;
        }

        @Override
        public boolean isAfterSuiteConfiguration()
        {
            return false;
        }

        @Override
        public boolean isBeforeTestConfiguration()
        {
            return false;
        }

        @Override
        public boolean isAfterTestConfiguration()
        {
            return false;
        }

        @Override
        public boolean isBeforeGroupsConfiguration()
        {
            return false;
        }

        @Override
        public boolean isAfterGroupsConfiguration()
        {
            return false;
        }

        @Override
        public long getTimeOut()
        {
            return 0;
        }

        @Override
        public int getInvocationCount()
        {
            return 0;
        }

        @Override
        public void setInvocationCount( int i )
        {

        }

        @Override
        public int getSuccessPercentage()
        {
            return 0;
        }

        @Override
        public String getId()
        {
            return null;
        }

        @Override
        public void setId( String s )
        {

        }

        @Override
        public long getDate()
        {
            return 0;
        }

        @Override
        public void setDate( long l )
        {

        }

        @Override
        public boolean canRunFromClass( IClass iClass )
        {
            return false;
        }

        @Override
        public boolean isAlwaysRun()
        {
            return false;
        }

        @Override
        public int getThreadPoolSize()
        {
            return 0;
        }

        @Override
        public void setThreadPoolSize( int i )
        {

        }

        @Override
        public String getDescription()
        {
            return null;
        }

        @Override
        public void incrementCurrentInvocationCount()
        {

        }

        @Override
        public int getCurrentInvocationCount()
        {
            return 0;
        }

        @Override
        public void setParameterInvocationCount( int i )
        {

        }

        @Override
        public int getParameterInvocationCount()
        {
            return 0;
        }

        @Override
        public ITestNGMethod clone()
        {
            try
            {
                return ( ITestNGMethod ) super.clone();
            }
            catch ( CloneNotSupportedException e )
            {
                throw new RuntimeException( e );
            }
        }

        @Override
        public IRetryAnalyzer getRetryAnalyzer()
        {
            return null;
        }

        @Override
        public void setRetryAnalyzer( IRetryAnalyzer iRetryAnalyzer )
        {

        }

        @Override
        public boolean skipFailedInvocations()
        {
            return false;
        }

        @Override
        public void setSkipFailedInvocations( boolean b )
        {

        }

        @Override
        public long getInvocationTimeOut()
        {
            return 0;
        }

        @Override
        public boolean ignoreMissingDependencies()
        {
            return false;
        }

        @Override
        public void setIgnoreMissingDependencies( boolean b )
        {

        }

        @Override
        public int compareTo( Object o )
        {
            return 0;
        }
    }
}
