http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-api/src/main/java/org/apache/maven/surefire/testset/TestListResolver.java
----------------------------------------------------------------------
diff --git 
a/surefire-api/src/main/java/org/apache/maven/surefire/testset/TestListResolver.java
 
b/surefire-api/src/main/java/org/apache/maven/surefire/testset/TestListResolver.java
index 374d1a4..cd38118 100644
--- 
a/surefire-api/src/main/java/org/apache/maven/surefire/testset/TestListResolver.java
+++ 
b/surefire-api/src/main/java/org/apache/maven/surefire/testset/TestListResolver.java
@@ -20,111 +20,173 @@ package org.apache.maven.surefire.testset;
  */
 
 import org.apache.maven.shared.utils.StringUtils;
+import org.apache.maven.shared.utils.io.SelectorUtils;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashSet;
-import java.util.IdentityHashMap;
 import java.util.LinkedHashSet;
-import java.util.Map;
 import java.util.Set;
 
+import static java.util.Collections.singleton;
+import static java.util.Collections.emptySet;
+
 /**
  * Resolved multi pattern filter e.g. 
-Dtest=MyTest#test,!AnotherTest#otherTest into an object model
  * composed of included and excluded tests.<br/>
- * The methods {@link #shouldRun(Class, String)} are filters easily used in 
JUnit filter or TestNG.
+ * The methods {@link #shouldRun(String, String)} are filters easily used in 
JUnit filter or TestNG.
  * This class is independent of JUnit and TestNG API.<br/>
- * This class is accessed by Java Reflection API in {@link 
org.apache.maven.surefire.booter.SurefireReflector}
+ * It is accessed by Java Reflection API in {@link 
org.apache.maven.surefire.booter.SurefireReflector}
  * using specific ClassLoader.
  */
 public class TestListResolver
+    implements GenericTestPattern<TestListResolver, ResolvedTest, String, 
String>
 {
     private static final String JAVA_CLASS_FILE_EXTENSION = ".class";
 
-    private final String parameterTest;
+    private static final Set<ResolvedTest> EMPTY_TEST_PATTERNS = emptySet();
+
+    private static final Set<String> EMPTY_SPECIFIC_TESTS = emptySet();
 
-    private final Set<ResolvedTest> includedFilters;
+    private final Set<ResolvedTest> includedPatterns;
 
-    private final Set<ResolvedTest> excludedFilters;
+    private final Set<ResolvedTest> excludedPatterns;
 
     private final Set<String> specificClasses;
 
-    public TestListResolver( String parameterTest )
+    private final boolean hasIncludedMethodPatterns;
+
+    private final boolean hasExcludedMethodPatterns;
+
+    public TestListResolver( Collection<String> tests )
     {
-        Set<ResolvedTest> includedFilters = new LinkedHashSet<ResolvedTest>( 0 
);
-        Set<ResolvedTest> excludedFilters = new LinkedHashSet<ResolvedTest>( 0 
);
-        Set<String> specificClasses = new LinkedHashSet<String>( 0 );
-        if ( StringUtils.isNotBlank( parameterTest ) )
+        final IncludedExcludedPatterns patterns = new 
IncludedExcludedPatterns();
+        final Set<ResolvedTest> includedFilters = new 
LinkedHashSet<ResolvedTest>( 0 );
+        final Set<ResolvedTest> excludedFilters = new 
LinkedHashSet<ResolvedTest>( 0 );
+        final Set<String> specificClasses = new LinkedHashSet<String>( 0 );
+
+        for ( final String csvTests : tests )
         {
-            final Map<Class<?>, String> classConversion = new 
IdentityHashMap<Class<?>, String>( 512 );
-            for ( String request : StringUtils.split( parameterTest, "," ) )
+            if ( StringUtils.isNotBlank( csvTests ) )
             {
-                request = request.trim();
-                if ( request.length() != 0 && !request.equals( "!" ) )
+                for ( String request : StringUtils.split( csvTests, "," ) )
                 {
-                    final int indexOfMethodSeparator = request.indexOf( '#' );
-                    if ( indexOfMethodSeparator == -1 )
-                    {
-                        String classPattern = removeExclamationMark( request );
-                        boolean isExcluded = classPattern.length() < 
request.length();
-                        ResolvedTest test = new ResolvedTest( classPattern, 
null, classConversion );
-                        if ( !test.isEmpty() )
-                        {
-                            updatedFilters( isExcluded, test, includedFilters, 
excludedFilters );
-                        }
-                    }
-                    else
+                    request = request.trim();
+                    if ( request.length() != 0 && !request.equals( "!" ) )
                     {
-                        String className = request.substring( 0, 
indexOfMethodSeparator );
-                        String methodNames = request.substring( 1 + 
indexOfMethodSeparator );
-                        for ( String methodName : StringUtils.split( 
methodNames, "+" ) )
-                        {
-                            String classPattern = removeExclamationMark( 
className );
-                            boolean isExcluded = classPattern.length() < 
className.length();
-                            ResolvedTest test = new ResolvedTest( 
classPattern, methodName, classConversion );
-                            if ( !test.isEmpty() )
-                            {
-                                updatedFilters( isExcluded, test, 
includedFilters, excludedFilters );
-                            }
-                        }
+                        resolveTestRequest( request, patterns, 
includedFilters, excludedFilters );
                     }
                 }
             }
+        }
 
-            for ( ResolvedTest test : includedFilters )
-            {
-                populateSpecificClasses( specificClasses, test );
-            }
+        for ( ResolvedTest test : includedFilters )
+        {
+            populateSpecificClasses( specificClasses, test );
+        }
 
-            for ( ResolvedTest test : excludedFilters )
-            {
-                populateSpecificClasses( specificClasses, test );
-            }
+        for ( ResolvedTest test : excludedFilters )
+        {
+            populateSpecificClasses( specificClasses, test );
         }
-        this.parameterTest = StringUtils.isBlank( parameterTest ) ? null : 
parameterTest;
+
         this.specificClasses = Collections.unmodifiableSet( specificClasses );
-        this.includedFilters = Collections.unmodifiableSet( includedFilters );
-        this.excludedFilters = Collections.unmodifiableSet( excludedFilters );
+        this.includedPatterns = Collections.unmodifiableSet( includedFilters );
+        this.excludedPatterns = Collections.unmodifiableSet( excludedFilters );
+        this.hasIncludedMethodPatterns = patterns.hasIncludedMethodPatterns;
+        this.hasExcludedMethodPatterns = patterns.hasExcludedMethodPatterns;
+    }
+
+    public TestListResolver( String csvTests )
+    {
+        this( csvTests == null ? Collections.<String>emptySet() : singleton( 
csvTests ) );
+    }
+
+    public TestListResolver( Collection<String> included, Collection<String> 
excluded )
+    {
+        this( mergeIncludedAndExcludedTests( included, excluded ) );
     }
 
-    private TestListResolver( String parameterTest, Set<ResolvedTest> 
includedFilters,
-                              Set<ResolvedTest> excludedFilters )
+    /**
+     * Used only in method filter.
+     */
+    private TestListResolver( boolean hasIncludedMethodPatterns, boolean 
hasExcludedMethodPatterns,
+                              Set<String> specificClasses, Set<ResolvedTest> 
includedPatterns,
+                              Set<ResolvedTest> excludedPatterns )
     {
-        this.includedFilters = includedFilters;
-        this.excludedFilters = excludedFilters;
-        this.specificClasses = null;
-        this.parameterTest = parameterTest;
+        this.includedPatterns = includedPatterns;
+        this.excludedPatterns = excludedPatterns;
+        this.specificClasses = specificClasses;
+        this.hasIncludedMethodPatterns = hasIncludedMethodPatterns;
+        this.hasExcludedMethodPatterns = hasExcludedMethodPatterns;
     }
 
-    public TestListResolver onlyMethodFilters()
+    public boolean hasIncludedMethodPatterns()
     {
-        return new TestListResolver( getPluginParameterTest(), 
selectMethodFilters( getIncludedFilters() ),
-                                     selectMethodFilters( getExcludedFilters() 
) );
+        return hasIncludedMethodPatterns;
+    }
+
+    public boolean hasExcludedMethodPatterns()
+    {
+        return hasExcludedMethodPatterns;
+    }
+
+    public boolean hasMethodPatterns()
+    {
+        return hasIncludedMethodPatterns() || hasExcludedMethodPatterns();
+    }
+
+    /**
+     * Method filter.
+     */
+    public TestListResolver createMethodFilters()
+    {
+        boolean hasMethodPatterns = hasMethodPatterns();
+        Set<ResolvedTest> inc = hasMethodPatterns ? getIncludedPatterns() : 
EMPTY_TEST_PATTERNS;
+        Set<ResolvedTest> exc = hasMethodPatterns ? getExcludedPatterns() : 
EMPTY_TEST_PATTERNS;
+        Set<String> specificClasses = hasMethodPatterns ? 
getTestSpecificClasses() : EMPTY_SPECIFIC_TESTS;
+        return new TestListResolver( hasIncludedMethodPatterns(), 
hasExcludedMethodPatterns(), specificClasses,
+                                     inc, exc );
+    }
+
+    public TestListResolver createClassFilters()
+    {
+        return hasMethodPatterns() ? new TestListResolver( "" ) : this;
+    }
+
+    public TestFilter<String, String> and( final TestListResolver another )
+    {
+        return new TestFilter<String, String>()
+        {
+            public boolean shouldRun( String testClass, String methodName )
+            {
+                return TestListResolver.this.shouldRun( testClass, methodName )
+                    && another.shouldRun( testClass, methodName );
+            }
+        };
+    }
+
+    public TestFilter<String, String> or( final TestListResolver another )
+    {
+        return new TestFilter<String, String>()
+        {
+            public boolean shouldRun( String testClass, String methodName )
+            {
+                return TestListResolver.this.shouldRun( testClass, methodName )
+                    || another.shouldRun( testClass, methodName );
+            }
+        };
     }
 
     public boolean shouldRun( Class<?> testClass, String methodName )
     {
-        if ( isEmpty() || testClass == null && methodName == null )
+        String clsFile = testClass == null ? null : 
testClass.getName().replace( '.', '/' ) + JAVA_CLASS_FILE_EXTENSION;
+        return shouldRun( clsFile, methodName );
+    }
+
+    public boolean shouldRun( String testClassFile, String methodName )
+    {
+        if ( isEmpty() || StringUtils.isBlank( testClassFile ) && 
StringUtils.isBlank( methodName ) )
         {
             return true;
         }
@@ -132,15 +194,15 @@ public class TestListResolver
         {
             boolean shouldRun = false;
 
-            if ( includedFilters.isEmpty() )
+            if ( getIncludedPatterns().isEmpty() )
             {
                 shouldRun = true;
             }
             else
             {
-                for ( ResolvedTest filter : includedFilters )
+                for ( ResolvedTest filter : getIncludedPatterns() )
                 {
-                    if ( filter.shouldRun( testClass, methodName ) )
+                    if ( filter.shouldRun( testClassFile, methodName ) )
                     {
                         shouldRun = true;
                         break;
@@ -150,9 +212,9 @@ public class TestListResolver
 
             if ( shouldRun )
             {
-                for ( ResolvedTest filter : excludedFilters )
+                for ( ResolvedTest filter : getExcludedPatterns() )
                 {
-                    if ( filter.shouldRun( testClass, methodName ) )
+                    if ( filter.shouldRun( testClassFile, methodName ) )
                     {
                         shouldRun = false;
                         break;
@@ -165,22 +227,24 @@ public class TestListResolver
 
     public boolean isEmpty()
     {
-        return getIncludedFilters().isEmpty() && 
getIncludedFilters().isEmpty();
+        return getIncludedPatterns().isEmpty() && 
getExcludedPatterns().isEmpty();
     }
 
     public String getPluginParameterTest()
     {
-        return parameterTest;
+        String aggregatedTest = aggregatedTest( "", getIncludedPatterns() );
+        aggregatedTest += aggregatedTest( "!", getExcludedPatterns() );
+        return aggregatedTest.length() == 0 ? null : aggregatedTest;
     }
 
-    public Set<ResolvedTest> getIncludedFilters()
+    public Set<ResolvedTest> getIncludedPatterns()
     {
-        return includedFilters;
+        return includedPatterns;
     }
 
-    public Set<ResolvedTest> getExcludedFilters()
+    public Set<ResolvedTest> getExcludedPatterns()
     {
-        return excludedFilters;
+        return excludedPatterns;
     }
 
     public Set<String> getTestSpecificClasses()
@@ -202,34 +266,37 @@ public class TestListResolver
 
         TestListResolver that = (TestListResolver) o;
 
-        return getIncludedFilters().equals( that.getIncludedFilters() )
-            && getExcludedFilters().equals( that.getExcludedFilters() );
+        return getIncludedPatterns().equals( that.getIncludedPatterns() )
+            && getExcludedPatterns().equals( that.getExcludedPatterns() );
 
     }
 
     @Override
     public int hashCode()
     {
-        int result = getIncludedFilters().hashCode();
-        result = 31 * result + getExcludedFilters().hashCode();
+        int result = getIncludedPatterns().hashCode();
+        result = 31 * result + getExcludedPatterns().hashCode();
         return result;
     }
 
-    private static String removeExclamationMark( String s )
+    static String removeExclamationMark( String s )
     {
         return s.length() != 0 && s.charAt( 0 ) == '!' ? s.substring( 1 ) : s;
     }
 
-    private static void updatedFilters( boolean isExcluded, ResolvedTest test, 
Collection<ResolvedTest> includedFilters,
+    private static void updatedFilters( boolean isExcluded, ResolvedTest test, 
IncludedExcludedPatterns patterns,
+                                        Collection<ResolvedTest> 
includedFilters,
                                         Collection<ResolvedTest> 
excludedFilters )
     {
         if ( isExcluded )
         {
             excludedFilters.add( test );
+            patterns.hasExcludedMethodPatterns |= test.hasTestMethodPattern();
         }
         else
         {
             includedFilters.add( test );
+            patterns.hasIncludedMethodPatterns |= test.hasTestMethodPattern();
         }
     }
 
@@ -246,16 +313,155 @@ public class TestListResolver
         }
     }
 
-    private static Set<ResolvedTest> selectMethodFilters( 
Collection<ResolvedTest> filters )
+    private static String aggregatedTest( String testPrefix, Set<ResolvedTest> 
tests )
+    {
+        String aggregatedTest = "";
+        for ( ResolvedTest test : tests )
+        {
+            String readableTest = test.toString();
+            if ( aggregatedTest.length() != 0 && readableTest != null )
+            {
+                aggregatedTest += ",";
+            }
+            aggregatedTest += testPrefix + readableTest;
+        }
+        return aggregatedTest;
+    }
+
+    private static Collection<String> mergeIncludedAndExcludedTests( 
Collection<String> included,
+                                                                     
Collection<String> excluded )
+    {
+        ArrayList<String> incExc = new ArrayList<String>( included );
+        incExc.removeAll( Collections.<String>singleton( null ) );
+        for ( String exc : excluded )
+        {
+            if ( exc != null )
+            {
+                exc = exc.trim();
+                if ( exc.length() != 0 )
+                {
+                    if ( exc.contains( "!" ) )
+                    {
+                        throw new IllegalArgumentException( "Exclamation mark 
not expected in 'exclusion': " + exc );
+                    }
+                    exc = exc.replace( ",", ",!" );
+                    if ( !exc.startsWith( "!" ) )
+                    {
+                        exc = "!" + exc;
+                    }
+                    incExc.add( exc );
+                }
+            }
+        }
+        return incExc;
+    }
+
+    static boolean isRegexPrefixedPattern( String pattern )
     {
-        Set<ResolvedTest> selectedFilters = new HashSet<ResolvedTest>( 
filters.size() );
-        for ( ResolvedTest filter : filters )
+        int indexOfRegex = pattern.indexOf( SelectorUtils.REGEX_HANDLER_PREFIX 
);
+        int prefixLength = SelectorUtils.REGEX_HANDLER_PREFIX.length();
+        if ( indexOfRegex != -1 )
         {
-            if ( filter.getTestMethodPattern() != null )
+            if ( indexOfRegex != 0
+                || !pattern.endsWith( SelectorUtils.PATTERN_HANDLER_SUFFIX )
+                || pattern.indexOf( SelectorUtils.REGEX_HANDLER_PREFIX, 
prefixLength ) != -1 )
             {
-                selectedFilters.add( filter );
+                String msg = "Illegal test|includes|excludes regex '%s'. 
Expected %%regex[class#method] "
+                    + "or !%%regex[class#method] " + "with optional class or 
#method.";
+                throw new IllegalArgumentException( String.format( msg, 
pattern ) );
             }
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    }
+
+    static String[] unwrapRegex( String regex )
+    {
+        regex = regex.trim();
+        int from = SelectorUtils.REGEX_HANDLER_PREFIX.length();
+        int to = regex.length() - 
SelectorUtils.PATTERN_HANDLER_SUFFIX.length();
+        return unwrap( regex.substring( from, to ) );
+    }
+
+    static String[] unwrap( String request )
+    {
+        String[] classAndMethod = new String[] { "", "" };
+        int indexOfHash = request.indexOf( '#' );
+        if ( indexOfHash == -1 )
+        {
+            classAndMethod[0] = request.trim();
+        }
+        else
+        {
+            classAndMethod[0] = request.substring( 0, indexOfHash ).trim();
+            classAndMethod[1] = request.substring( 1 + indexOfHash ).trim();
+        }
+        return classAndMethod;
+    }
+
+    static void nonRegexClassAndMethods( String clazz, String methods, boolean 
isExcluded,
+                         IncludedExcludedPatterns patterns,
+                         Collection<ResolvedTest> includedFilters, 
Collection<ResolvedTest> excludedFilters )
+    {
+        for ( String method : StringUtils.split( methods, "+" ) )
+        {
+            method = method.trim();
+            ResolvedTest test = new ResolvedTest( clazz, method, false );
+            if ( !test.isEmpty() )
+            {
+                updatedFilters( isExcluded, test, patterns, includedFilters, 
excludedFilters );
+            }
+        }
+    }
+
+    /**
+     * Requires trimmed <code>request</code> been not equal to "!".
+     */
+    static void resolveTestRequest( String request, IncludedExcludedPatterns 
patterns,
+                                    Collection<ResolvedTest> includedFilters, 
Collection<ResolvedTest> excludedFilters )
+    {
+        final boolean isExcluded = request.startsWith( "!" );
+        ResolvedTest test = null;
+        request = removeExclamationMark( request );
+        if ( isRegexPrefixedPattern( request ) )
+        {
+            final String[] unwrapped = unwrapRegex( request );
+            final boolean hasClass = unwrapped[0].length() != 0;
+            final boolean hasMethod = unwrapped[1].length() != 0;
+            if ( hasClass && hasMethod )
+            {
+                test = new ResolvedTest( unwrapped[0], unwrapped[1], true );
+            }
+            else if ( hasClass )
+            {
+                test = new ResolvedTest( ResolvedTest.Type.CLASS, 
unwrapped[0], true );
+            }
+            else if ( hasMethod )
+            {
+                test = new ResolvedTest( ResolvedTest.Type.METHOD, 
unwrapped[1], true );
+            }
+        }
+        else
+        {
+            final int indexOfMethodSeparator = request.indexOf( '#' );
+            if ( indexOfMethodSeparator == -1 )
+            {
+                test = new ResolvedTest( ResolvedTest.Type.CLASS, request, 
false );
+            }
+            else
+            {
+                String clazz = request.substring( 0, indexOfMethodSeparator );
+                String methods = request.substring( 1 + indexOfMethodSeparator 
);
+                nonRegexClassAndMethods( clazz, methods, isExcluded, patterns, 
includedFilters, excludedFilters );
+            }
+        }
+
+        if ( test != null && !test.isEmpty() )
+        {
+            updatedFilters( isExcluded, test, patterns, includedFilters, 
excludedFilters );
         }
-        return selectedFilters;
     }
 }

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-api/src/test/java/org/apache/maven/surefire/testset/ResolvedTestTest.java
----------------------------------------------------------------------
diff --git 
a/surefire-api/src/test/java/org/apache/maven/surefire/testset/ResolvedTestTest.java
 
b/surefire-api/src/test/java/org/apache/maven/surefire/testset/ResolvedTestTest.java
new file mode 100644
index 0000000..783209a
--- /dev/null
+++ 
b/surefire-api/src/test/java/org/apache/maven/surefire/testset/ResolvedTestTest.java
@@ -0,0 +1,49 @@
+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;
+
+public class ResolvedTestTest
+    extends TestCase
+{
+    public void testEmptyClassRegex()
+    {
+        ResolvedTest test = new ResolvedTest( ResolvedTest.Type.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( ResolvedTest.Type.METHOD, "  ", 
true );
+        assertNull( test.getTestClassPattern() );
+        assertNull( test.getTestMethodPattern() );
+        assertFalse( test.hasTestClassPattern() );
+        assertFalse( test.hasTestMethodPattern() );
+        assertFalse( test.isRegexTestClassPattern() );
+        assertTrue( test.isRegexTestMethodPattern() );
+        assertTrue( test.isEmpty() );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-api/src/test/java/org/apache/maven/surefire/testset/TestListResolverTest.java
----------------------------------------------------------------------
diff --git 
a/surefire-api/src/test/java/org/apache/maven/surefire/testset/TestListResolverTest.java
 
b/surefire-api/src/test/java/org/apache/maven/surefire/testset/TestListResolverTest.java
new file mode 100644
index 0000000..e34e080
--- /dev/null
+++ 
b/surefire-api/src/test/java/org/apache/maven/surefire/testset/TestListResolverTest.java
@@ -0,0 +1,302 @@
+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 java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+
+public class TestListResolverTest
+    extends TestCase
+{
+    public void testRegexSanity1()
+    {
+        try
+        {
+            TestListResolver.isRegexPrefixedPattern( "#%regex[]" );
+            fail( "#%regex[]" );
+        }
+        catch ( IllegalArgumentException e )
+        {
+            // expected in junit 3.x
+        }
+    }
+
+    public void testRegexSanity2()
+    {
+        try
+        {
+            TestListResolver.isRegexPrefixedPattern( "%regex[]#" );
+            fail( "%regex[]#" );
+        }
+        catch ( IllegalArgumentException e )
+        {
+            // expected in junit 3.x
+        }
+    }
+
+    public void testRegexSanity3()
+    {
+        try
+        {
+            TestListResolver.isRegexPrefixedPattern( "%regex[]%regex[]" );
+            fail( "%regex[]%regex[]" );
+        }
+        catch ( IllegalArgumentException e )
+        {
+            // expected in junit 3.x
+        }
+    }
+
+    public void testRemoveExclamationMark()
+    {
+        String pattern = TestListResolver.removeExclamationMark( "!%regex[]" );
+        assertEquals( "%regex[]", pattern );
+        pattern = TestListResolver.removeExclamationMark( "%regex[]" );
+        assertEquals( "%regex[]", pattern );
+    }
+
+    public void testUnwrapped()
+    {
+        String[] classAndMethod = TestListResolver.unwrap( " MyTest " );
+        assertEquals( "MyTest", classAndMethod[0] );
+        assertEquals( "", classAndMethod[1] );
+        classAndMethod = TestListResolver.unwrap( " # test " );
+        assertEquals( "", classAndMethod[0] );
+        assertEquals( "test", classAndMethod[1] );
+        classAndMethod = TestListResolver.unwrap( " MyTest # test " );
+        assertEquals( "MyTest", classAndMethod[0] );
+        assertEquals( "test", classAndMethod[1] );
+    }
+
+    public void testUnwrappedRegex()
+    {
+        String[] classAndMethod = TestListResolver.unwrapRegex( "%regex[ 
.*.MyTest.class ]" );
+        assertEquals( ".*.MyTest.class", classAndMethod[0] );
+        assertEquals( "", classAndMethod[1] );
+        classAndMethod = TestListResolver.unwrapRegex( "%regex[ # 
myMethod|secondTest ]" );
+        assertEquals( "", classAndMethod[0] );
+        assertEquals( "myMethod|secondTest", classAndMethod[1] );
+        classAndMethod = TestListResolver.unwrapRegex( "%regex[ 
.*.MyTest.class # myMethod|secondTest ]" );
+        assertEquals( ".*.MyTest.class", classAndMethod[0] );
+        assertEquals( "myMethod|secondTest", classAndMethod[1] );
+    }
+
+    public void testMakeRegex()
+    {
+        String regex = ResolvedTest.wrapRegex( ".*.MyTest.class" );
+        assertEquals( "%regex[.*.MyTest.class]", regex );
+    }
+
+    public void testNonRegexClassAndMethod()
+    {
+        Collection<ResolvedTest> includedFilters = new 
ArrayList<ResolvedTest>();
+        Collection<ResolvedTest> excludedFilters = new 
ArrayList<ResolvedTest>();
+        IncludedExcludedPatterns includedExcludedPatterns = new 
IncludedExcludedPatterns();
+        TestListResolver.nonRegexClassAndMethods( "MyTest", "myTest", false, 
includedExcludedPatterns, includedFilters,
+                                                  excludedFilters );
+        assertTrue( includedExcludedPatterns.hasIncludedMethodPatterns );
+        assertFalse( includedExcludedPatterns.hasExcludedMethodPatterns );
+        assertFalse( includedFilters.isEmpty() );
+        assertTrue( excludedFilters.isEmpty() );
+        assertEquals( 1, includedFilters.size() );
+        ResolvedTest test = includedFilters.iterator().next();
+        assertFalse( test.isEmpty() );
+        assertFalse( test.isRegexTestClassPattern() );
+        assertFalse( test.isRegexTestMethodPattern() );
+        assertTrue( test.hasTestClassPattern() );
+        assertTrue( test.hasTestMethodPattern() );
+        assertEquals( "**/MyTest", test.getTestClassPattern() );
+        assertEquals( "myTest", test.getTestMethodPattern() );
+        assertTrue( test.shouldRun( "MyTest", "myTest" ) );
+        assertFalse( test.shouldRun( "MyTest", "otherTest" ) );
+    }
+
+    public void testNonRegexClassAndMethods()
+    {
+        Collection<ResolvedTest> includedFilters = new 
ArrayList<ResolvedTest>();
+        Collection<ResolvedTest> excludedFilters = new 
ArrayList<ResolvedTest>();
+        IncludedExcludedPatterns includedExcludedPatterns = new 
IncludedExcludedPatterns();
+        TestListResolver.nonRegexClassAndMethods( "MyTest.class", 
"first*+second*", false, includedExcludedPatterns,
+                                                  includedFilters, 
excludedFilters );
+        assertTrue( includedExcludedPatterns.hasIncludedMethodPatterns );
+        assertFalse( includedExcludedPatterns.hasExcludedMethodPatterns );
+        assertFalse( includedFilters.isEmpty() );
+        assertTrue( excludedFilters.isEmpty() );
+        assertEquals( 2, includedFilters.size() );
+        Iterator<ResolvedTest> tests = includedFilters.iterator();
+        ResolvedTest first = tests.next();
+        assertFalse( first.isEmpty() );
+        assertFalse( first.isRegexTestClassPattern() );
+        assertFalse( first.isRegexTestMethodPattern() );
+        assertTrue( first.hasTestClassPattern() );
+        assertTrue( first.hasTestMethodPattern() );
+        assertEquals( "**/MyTest.class", first.getTestClassPattern() );
+        assertEquals( "first*", first.getTestMethodPattern() );
+        assertTrue( first.shouldRun( "your/pkg/MyTest.class", "firstTest" ) );
+        ResolvedTest second = tests.next();
+        assertFalse( second.isEmpty() );
+        assertFalse( second.isRegexTestClassPattern() );
+        assertFalse( second.isRegexTestMethodPattern() );
+        assertTrue( second.hasTestClassPattern() );
+        assertTrue( second.hasTestMethodPattern() );
+        assertEquals( "**/MyTest.class", second.getTestClassPattern() );
+        assertEquals( "second*", second.getTestMethodPattern() );
+        assertTrue( second.shouldRun( "your/pkg/MyTest.class", "secondTest" ) 
);
+        assertFalse( second.shouldRun( "your/pkg/MyTest.class", "thirdTest" ) 
);
+    }
+
+    public void testNegativeNonRegexClassAndMethod()
+    {
+        Collection<ResolvedTest> includedFilters = new 
ArrayList<ResolvedTest>();
+        Collection<ResolvedTest> excludedFilters = new 
ArrayList<ResolvedTest>();
+        IncludedExcludedPatterns includedExcludedPatterns = new 
IncludedExcludedPatterns();
+        TestListResolver.nonRegexClassAndMethods( "MyTest", "myTest", true, 
includedExcludedPatterns, includedFilters,
+                                                  excludedFilters );
+        assertFalse( includedExcludedPatterns.hasIncludedMethodPatterns );
+        assertTrue( includedExcludedPatterns.hasExcludedMethodPatterns );
+        assertTrue( includedFilters.isEmpty() );
+        assertEquals( 1, excludedFilters.size() );
+        ResolvedTest test = excludedFilters.iterator().next();
+        assertFalse( test.isEmpty() );
+        assertFalse( test.isRegexTestClassPattern() );
+        assertFalse( test.isRegexTestMethodPattern() );
+        assertTrue( test.hasTestClassPattern() );
+        assertTrue( test.hasTestMethodPattern() );
+        assertEquals( "**/MyTest", test.getTestClassPattern() );
+        assertEquals( "myTest", test.getTestMethodPattern() );
+        // ResolvedTest should not care about isExcluded. This attribute is 
handled by TestListResolver.
+        assertTrue( test.shouldRun( "MyTest", "myTest" ) );
+        assertFalse( test.shouldRun( "MyTest", "otherTest" ) );
+        assertFalse( test.shouldRun( "pkg/OtherTest.class", "myTest" ) );
+    }
+
+    public void testResolveTestRequest()
+    {
+        Collection<ResolvedTest> includedFilters = new 
ArrayList<ResolvedTest>();
+        Collection<ResolvedTest> excludedFilters = new 
ArrayList<ResolvedTest>();
+        IncludedExcludedPatterns includedExcludedPatterns = new 
IncludedExcludedPatterns();
+        TestListResolver.resolveTestRequest( 
"!%regex[.*.MyTest.class#myTest]", includedExcludedPatterns,
+                                             includedFilters, excludedFilters 
);
+        assertFalse( includedExcludedPatterns.hasIncludedMethodPatterns );
+        assertTrue( includedExcludedPatterns.hasExcludedMethodPatterns );
+        assertTrue( includedFilters.isEmpty() );
+        assertFalse( excludedFilters.isEmpty() );
+        assertEquals( 1, excludedFilters.size() );
+        ResolvedTest test = excludedFilters.iterator().next();
+        // ResolvedTest should not care about isExcluded. This attribute is 
handled by TestListResolver.
+        assertTrue( test.shouldRun( "pkg/MyTest.class", "myTest" ) );
+        assertFalse( test.shouldRun( "pkg/MyTest.class", "otherTest" ) );
+        assertFalse( test.shouldRun( "pkg/OtherTest.class", "myTest" ) );
+    }
+
+    public void testShouldNotRunExcludedMethods()
+    {
+        TestListResolver resolver = new TestListResolver( "!#*Fail*, 
!%regex[#.*One], !#testSuccessThree" );
+        assertTrue( resolver.shouldRun( "pkg/MyTest.class", null ) );
+    }
+
+    public void testShouldNotRunIncludedMethods()
+    {
+        TestListResolver resolver = new TestListResolver( "#*Fail*, 
%regex[#.*One], #testSuccessThree" );
+        assertFalse( resolver.shouldRun( "pkg/MyTest.class", null ) );
+    }
+
+    public void testShouldRunAny()
+    {
+        TestListResolver resolver = new TestListResolver( "" );
+        assertTrue( resolver.shouldRun( "pkg/MyTest.class", null ) );
+
+        resolver = new TestListResolver( Collections.<String>emptySet() );
+        assertTrue( resolver.shouldRun( "pkg/MyTest.class", null ) );
+    }
+
+    public void testClassFilter()
+    {
+        TestListResolver resolver = new TestListResolver( "#test" );
+        assertTrue( resolver.createClassFilters().shouldRun( 
"pkg/MyTest.class", null ) );
+
+        resolver = new TestListResolver( "!#test" );
+        assertTrue( resolver.createClassFilters().shouldRun( 
"pkg/MyTest.class", null ) );
+
+        resolver = new TestListResolver( "SomeOtherClass" );
+        assertFalse( resolver.createClassFilters().shouldRun( 
"pkg/MyTest.class", null ) );
+    }
+
+    public void testBrokenPatternThrowsException()
+    {
+        Collection<String> included = Collections.emptySet();
+        Collection<String> excluded = Arrays.asList( "BasicTest, !**/TestTwo, 
**/TestThree.java" );
+        try
+        {
+            new TestListResolver( included, excluded );
+            fail( "Expected: IllegalArgumentException" );
+        } catch ( IllegalArgumentException e )
+        {
+            // JUnit 3.x style
+            assertEquals( "Exclamation mark not expected in 'exclusion': 
BasicTest, !**/TestTwo, **/TestThree.java",
+                          e.getLocalizedMessage() );
+        }
+    }
+
+    public void testMultipleExcludedClassesOnly()
+    {
+        Collection<String> included = Collections.emptySet();
+        Collection<String> excluded = Arrays.asList( "BasicTest, **/TestTwo, 
**/TestThree.java" );
+        TestListResolver resolver = new TestListResolver( included, excluded );
+        assertFalse( resolver.shouldRun( "jiras/surefire745/BasicTest.class", 
null ) );
+        assertFalse( resolver.shouldRun( "jiras/surefire745/TestTwo.class", 
null ) );
+        assertFalse( resolver.shouldRun( "jiras/surefire745/TestThree.class", 
null ) );
+        assertTrue( resolver.shouldRun( "jiras/surefire745/TestFour.class", 
null ) );
+    }
+
+    public void testMultipleExcludedClasses()
+    {
+        Collection<String> included = Arrays.asList( "**/Test*.java, 
**/*Test.java, **/*TestCase.java" );
+        Collection<String> excluded = Arrays.asList( "BasicTest, **/TestTwo, 
**/TestThree.java" );
+        TestListResolver resolver = new TestListResolver( included, excluded );
+        assertFalse( resolver.shouldRun( "jiras/surefire745/BasicTest.class", 
null ) );
+        assertFalse( resolver.shouldRun( "jiras/surefire745/TestTwo.class", 
null ) );
+        assertFalse( resolver.shouldRun( "jiras/surefire745/TestThree.class", 
null ) );
+        assertTrue( resolver.shouldRun( "jiras/surefire745/TestFour.class", 
null ) );
+    }
+
+    public void testMultipleExcludedClassesWithNoSpecificTests()
+    {
+        Collection<String> included = Arrays.asList( "**/Test*.java, 
**/*Test.java, **/*TestCase.java" );
+        Collection<String> excluded = Arrays.asList( "BasicTest, **/TestTwo, 
**/TestThree.java" );
+
+        TestListResolver includedAndExcludedTests = new TestListResolver( 
included, excluded );
+        TestListResolver includedExcludedClasses = 
includedAndExcludedTests.createClassFilters();
+
+        TestListResolver specificTests = new TestListResolver( "" );
+        TestListResolver specificClasses = specificTests.createClassFilters();
+
+        TestFilter<String, String> filter = includedExcludedClasses.and( 
specificClasses );
+
+        assertFalse( filter.shouldRun( "jiras/surefire745/BasicTest.class", 
null ) );
+        assertFalse( filter.shouldRun( "jiras/surefire745/TestTwo.class", null 
) );
+        assertFalse( filter.shouldRun( "jiras/surefire745/TestThree.class", 
null ) );
+        assertTrue( filter.shouldRun( "jiras/surefire745/TestFour.class", null 
) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java
----------------------------------------------------------------------
diff --git 
a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java
 
b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java
index d46304c..ed29602 100644
--- 
a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java
+++ 
b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java
@@ -84,7 +84,7 @@ public class ForkedBooter
                 classpathConfiguration.isEnableAssertions() );
             startupConfiguration.writeSurefireTestClasspathProperty();
 
-            Object testSet;
+            final Object testSet;
             if ( forkedTestSet != null )
             {
                 testSet = forkedTestSet.getDecodedValue( 
Thread.currentThread().getContextClassLoader() );

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java
----------------------------------------------------------------------
diff --git 
a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java
 
b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java
index 8081988..f5d96c5 100644
--- 
a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java
+++ 
b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java
@@ -80,11 +80,6 @@ public class ProviderFactory
         }
         finally
         {
-            System.out.println( "TIBOR providerConfiguration: " + 
providerConfiguration );
-            System.out.println( "TIBOR 
providerConfiguration.getTestSuiteDefinition(): "
-                                    + 
providerConfiguration.getTestSuiteDefinition() );
-            System.out.println( "TIBOR 
providerConfiguration.getTestSuiteDefinition().getTestListResolver(): "
-                                    + 
providerConfiguration.getTestSuiteDefinition().getTestListResolver() );
             if ( restoreStreams && System.getSecurityManager() == null )
             {
                 System.setOut( orgSystemOut );
@@ -93,7 +88,6 @@ public class ProviderFactory
         }
     }
 
-
     public SurefireProvider createProvider( boolean isInsideFork )
     {
         final Thread currentThread = Thread.currentThread();

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-integration-tests/pom.xml
----------------------------------------------------------------------
diff --git a/surefire-integration-tests/pom.xml 
b/surefire-integration-tests/pom.xml
index 6361c50..8990d47 100644
--- a/surefire-integration-tests/pom.xml
+++ b/surefire-integration-tests/pom.xml
@@ -101,9 +101,7 @@
           <forkMode>never</forkMode>
           <argLine>-Xmx512m -XX:MaxPermSize=356m</argLine>
           <includes>
-            
<!--<include>org/apache/**/TestMultipleMethodPatternsIT.java</include>-->
-            <include>org/apache/**/JUnit47ParallelIT.java</include>
-            <!--include>org/apache/**/*IT*.java</include-->
+            <include>org/apache/**/*IT*.java</include>
           </includes>
           <!-- Pass current surefire version to the main suite so that it -->
           <!-- can forward to all integration test projects. SUREFIRE-513 -->

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/AbstractTestMultipleMethodPatterns.java
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/AbstractTestMultipleMethodPatterns.java
 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/AbstractTestMultipleMethodPatterns.java
new file mode 100644
index 0000000..cf91ef9
--- /dev/null
+++ 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/AbstractTestMultipleMethodPatterns.java
@@ -0,0 +1,466 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.its.fixture.Settings;
+import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
+import org.apache.maven.surefire.its.fixture.SurefireLauncher;
+import org.junit.Test;
+
+import static org.apache.maven.surefire.its.fixture.TestFramework.*;
+import static org.apache.maven.surefire.its.fixture.Configuration.*;
+import static org.hamcrest.core.AnyOf.anyOf;
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assume.assumeThat;
+
+/**
+ * Test project using multiple method patterns, including wildcards in class 
and method names.
+ */
+public abstract class AbstractTestMultipleMethodPatterns
+    extends SurefireJUnit4IntegrationTestCase
+{
+    protected abstract Settings getSettings();
+
+    protected abstract SurefireLauncher unpack();
+
+    protected SurefireLauncher prepare( String tests )
+    {
+        SurefireLauncher launcher = unpack().addGoal( "-P " + 
getSettings().profile() );
+        String[] includedExcluded = splitIncludesExcludes( tests );
+        switch ( getSettings().getConfiguration() ) {
+            case TEST:
+                launcher.setTestToRun( tests );
+                break;
+            case INCLUDES:
+                launcher.sysProp( "included", tests );
+                break;
+            case INCLUDES_EXCLUDES:
+                launcher.sysProp( "included", includedExcluded[0] );
+                launcher.sysProp( "excluded", includedExcluded[1] );
+                break;
+            default:
+                throw new IllegalArgumentException( "Unsupported configuration 
" + getSettings().getConfiguration() );
+        }
+        return launcher;
+    }
+
+    private String[] splitIncludesExcludes( String patterns )
+    {
+        String included = "";
+        String excluded = "";
+        for ( String pattern : patterns.split( "," ) )
+        {
+            pattern = pattern.trim();
+            if ( pattern.startsWith( "!" ) )
+            {
+                excluded += pattern.substring( 1 );
+                excluded += ", ";
+            }
+            else
+            {
+                included += pattern;
+                included += ", ";
+            }
+        }
+        return new String[]{ included, excluded.endsWith( ", " ) ? 
excluded.substring( 0, excluded.length() - 2 ) : excluded };
+    }
+
+    @Test
+    public void simpleNameTest()
+        throws Exception
+    {
+        prepare( "TestTwo" )
+            .executeTest()
+            .verifyErrorFree( 2 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.TestTwo#testSuccessOne" )
+            .verifyTextInLog( "jiras.surefire745.TestTwo#testSuccessTwo" );
+    }
+
+    @Test
+    public void simpleNameTestAsParallel()
+        throws Exception
+    {
+        assumeThat( getSettings().getFramework(), anyOf( is( JUNIT47 ), is( 
TestNG ) ) );
+        prepare( "TestTwo" )
+            .parallel( "classes" )
+            .useUnlimitedThreads()
+            .executeTest()
+            .verifyErrorFree( 2 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.TestTwo#testSuccessOne" )
+            .verifyTextInLog( "jiras.surefire745.TestTwo#testSuccessTwo" );
+    }
+
+    @Test
+    public void simpleNameTestWithJavaExt()
+        throws Exception
+    {
+        prepare( "TestTwo.java" )
+            .executeTest()
+            .verifyErrorFree( 2 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.TestTwo#testSuccessOne" )
+            .verifyTextInLog( "jiras.surefire745.TestTwo#testSuccessTwo" );
+    }
+
+    @Test
+    public void simpleNameTestWithWildcardPkg()
+        throws Exception
+    {
+        prepare( "**/TestTwo" )
+            .executeTest()
+            .verifyErrorFree( 2 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.TestTwo#testSuccessOne" )
+            .verifyTextInLog( "jiras.surefire745.TestTwo#testSuccessTwo" );
+    }
+
+    @Test
+    public void simpleNameTestWithJavaExtWildcardPkg()
+        throws Exception
+    {
+        prepare( "**/TestTwo.java" )
+            .executeTest()
+            .verifyErrorFree( 2 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.TestTwo#testSuccessOne" )
+            .verifyTextInLog( "jiras.surefire745.TestTwo#testSuccessTwo" );
+    }
+
+    @Test
+    public void fullyQualifiedTest()
+        throws Exception
+    {
+        prepare( "jiras/surefire745/TestTwo.java" )
+            .executeTest()
+            .verifyErrorFree( 2 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.TestTwo#testSuccessOne" )
+            .verifyTextInLog( "jiras.surefire745.TestTwo#testSuccessTwo" );
+    }
+
+    @Test
+    public void shouldMatchSimpleClassNameAndMethod()
+        throws Exception
+    {
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        prepare( "BasicTest#testSuccessTwo" )
+            .executeTest()
+            .verifyErrorFree( 1 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.BasicTest#testSuccessTwo" );
+    }
+
+    @Test
+    public void shouldMatchSimpleClassNameAndMethodWithJavaExt()
+        throws Exception
+    {
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        prepare( "BasicTest.java#testSuccessTwo" )
+            .executeTest()
+            .verifyErrorFree( 1 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.BasicTest#testSuccessTwo" );
+    }
+
+    @Test
+    public void shouldMatchSimpleClassNameAndMethodWithWildcardPkg()
+        throws Exception
+    {
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        prepare( "**/BasicTest#testSuccessTwo" )
+            .executeTest()
+            .verifyErrorFree( 1 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.BasicTest#testSuccessTwo" );
+    }
+
+    @Test
+    public void shouldMatchSimpleClassNameAndMethodWithJavaExtWildcardPkg()
+        throws Exception
+    {
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        prepare( "**/BasicTest.java#testSuccessTwo" )
+            .executeTest()
+            .verifyErrorFree( 1 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.BasicTest#testSuccessTwo" );
+    }
+
+    @Test
+    public void shouldMatchWildcardPackageAndClassAndMethod()
+        throws Exception
+    {
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        prepare( "jiras/**/BasicTest#testSuccessTwo" )
+            .executeTest()
+            .verifyErrorFree( 1 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.BasicTest#testSuccessTwo" );
+    }
+
+    @Test
+    public void regexClass()
+        throws Exception
+    {
+        prepare( "%regex[.*.TestTwo.*]" )
+            .executeTest()
+            .verifyErrorFree( 2 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.TestTwo#testSuccessOne" )
+            .verifyTextInLog( "jiras.surefire745.TestTwo#testSuccessTwo" );
+    }
+
+    @Test
+    public void testSuccessTwo()
+        throws Exception
+    {
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        prepare( "#testSuccessTwo" )
+            .maven().debugLogging()
+            .executeTest()
+            .verifyErrorFree( 5 )
+            .verifyErrorFreeLog();
+    }
+
+    @Test
+    public void testRegexSuccessTwo()
+        throws Exception
+    {
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        prepare( "%regex[#testSuccessTwo]" )
+            .executeTest()
+            .verifyErrorFree( 5 )
+            .verifyErrorFreeLog();
+    }
+
+    @Test
+    public void regexClassAndMethod()
+        throws Exception
+    {
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        prepare( "%regex[.*.BasicTest.*#testSuccessTwo]" )
+            .executeTest()
+            .verifyErrorFree( 1 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.BasicTest#testSuccessTwo" );
+    }
+
+    @Test
+    public void shouldMatchExactClassAndMethodWildcard()
+        throws Exception
+    {
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        prepare( "BasicTest#test*One" )
+            .executeTest()
+            .verifyErrorFree( 1 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.BasicTest#testSuccessOne" );
+    }
+
+    @Test
+    public void shouldMatchExactClassAndMethodsWildcard()
+        throws Exception
+    {
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        prepare( "BasicTest#testSuccess*" )
+            .executeTest()
+            .verifyErrorFree( 2 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.BasicTest#testSuccessOne" )
+            .verifyTextInLog( "jiras.surefire745.BasicTest#testSuccessTwo" );
+    }
+
+    @Test
+    public void shouldMatchExactClassAndMethodCharacters()
+        throws Exception
+    {
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        prepare( "BasicTest#test???????One" )
+            .executeTest()
+            .verifyErrorFree( 1 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.BasicTest#testSuccessOne" );
+    }
+
+    @Test
+    public void shouldMatchExactClassAndMethodsPostfix()
+        throws Exception
+    {
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        prepare( "TestFive#testSuccess???" )
+            .executeTest()
+            .verifyErrorFree( 2 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.TestFive#testSuccessOne" )
+            .verifyTextInLog( "jiras.surefire745.TestFive#testSuccessTwo" );
+    }
+
+    @Test
+    public void shouldMatchExactClassAndMethodPostfix()
+        throws Exception
+    {
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        prepare( "TestFive#testSuccess?????" )
+            .executeTest()
+            .verifyErrorFree( 1 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.TestFive#testSuccessThree" );
+    }
+
+    @Test
+    public void shouldMatchExactClassAndMultipleMethods()
+        throws Exception
+    {
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        prepare( "TestFive#testSuccessOne+testSuccessThree" )
+            .executeTest()
+            .verifyErrorFree( 2 )
+            .verifyErrorFreeLog()
+            .verifyTextInLog( "jiras.surefire745.TestFive#testSuccessOne" )
+            .verifyTextInLog( "jiras.surefire745.TestFive#testSuccessThree" );
+    }
+
+    @Test
+    public void shouldMatchMultiplePatterns()
+        throws Exception
+    {
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        String test = 
"jiras/surefire745/BasicTest#testSuccessOne+testSuccessTwo"//2
+            + ',' + "jiras/**/TestTwo"//2
+            + ',' + "jiras/surefire745/TestThree#testSuccess*"//2
+            + ',' + "TestFour#testSuccess???"//2
+            + ',' + "jiras/surefire745/*Five#test*One";//1
+
+        prepare( test )
+            .executeTest()
+            .verifyErrorFree( 9 )
+            .verifyErrorFreeLog();
+    }
+
+    @Test
+    public void shouldMatchMultiplePatternsAsParallel()
+        throws Exception
+    {
+        assumeThat( getSettings().getFramework(), anyOf( is( JUNIT47 ), is( 
TestNG ) ) );
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        String test = 
"jiras/surefire745/BasicTest#testSuccessOne+testSuccessTwo"//2
+            + ',' + "jiras/**/TestTwo"//2
+            + ',' + "jiras/surefire745/TestThree#testSuccess*"//2
+            + ',' + "TestFour#testSuccess???"//2
+            + ',' + "jiras/surefire745/*Five#test*One";//1
+
+        prepare( test )
+            .parallel( "classes" )
+            .useUnlimitedThreads()
+            .executeTest()
+            .verifyErrorFree( 9 )
+            .verifyErrorFreeLog();
+    }
+
+    @Test
+    public void shouldMatchMultiplePatternsComplex()
+        throws Exception
+    {
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        String test = "**/BasicTest#testSuccessOne+testSuccessTwo"//2
+            + ',' + "jiras/**/TestTwo"//2
+            + ',' + "?????/surefire745/TestThree#testSuccess*"//2
+            + ',' + "jiras/surefire745/TestFour.java#testSuccess???"//2
+            + ',' + "jiras/surefire745/*Five#test*One";//1
+
+        prepare( test )
+            .executeTest()
+            .verifyErrorFree( 9 )
+            .verifyErrorFreeLog();
+    }
+
+    @Test
+    public void shouldMatchMultiplePatternsComplexAsParallel()
+        throws Exception
+    {
+        assumeThat( getSettings().getFramework(), anyOf( is( JUNIT47 ), is( 
TestNG ) ) );
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        String test = "**/BasicTest#testSuccessOne+testSuccessTwo"//2
+            + ',' + "jiras/**/TestTwo"//2
+            + ',' + "?????/surefire745/TestThree#testSuccess*"//2
+            + ',' + "jiras/surefire745/TestFour.java#testSuccess???"//2
+            + ',' + "jiras/surefire745/*Five#test*One";//1
+
+        prepare( test )
+            .parallel( "classes" )
+            .useUnlimitedThreads()
+            .executeTest()
+            .verifyErrorFree( 9 )
+            .verifyErrorFreeLog();
+    }
+
+    @Test
+    public void shouldNotRunExcludedClasses()
+    {
+        prepare( "!BasicTest, !**/TestTwo, !**/TestThree.java" )
+            .executeTest()
+            .verifyErrorFree( 6 )
+            .verifyErrorFreeLog();
+    }
+
+    @Test
+    public void shouldNotRunExcludedClassesIfIncluded()
+    {
+        prepare( "TestF*.java, !**/TestFour.java" )
+            .executeTest()
+            .verifyErrorFree( 3 )
+            .verifyErrorFreeLog();
+    }
+
+    @Test
+    public void shouldNotRunExcludedMethods()
+    {
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        prepare( "!#*Fail*, !%regex[#.*One], !#testSuccessThree" )
+            .executeTest()
+            .verifyErrorFree( 5 )
+            .verifyErrorFreeLog();
+    }
+
+    @Test
+    public void shouldNotRunExcludedClassesAndMethods()
+    {
+        assumeThat( getSettings().getConfiguration(), is( TEST ) );
+        prepare( "!#*Fail*, !TestFour#testSuccessTwo" )
+            .executeTest()
+            .verifyErrorFree( 11 )
+            .verifyErrorFreeLog();
+    }
+
+    @Test
+    public void negativeTest()
+    {
+        assumeThat( getSettings().getConfiguration(), anyOf( is( INCLUDES ), 
is( INCLUDES_EXCLUDES ),
+                                                             is( INCLUDES_FILE 
), is( INCLUDES_EXCLUDES_FILE ) ) );
+        String pattern = "TestFive#testSuccessOne+testSuccessThree";
+        prepare( pattern )
+            .failNever()
+            .executeTest()
+            .verifyTextInLog( "Method filter prohibited in 
includes|excludes|includesFile|excludesFile parameter: "
+                                  + pattern );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/TestMultipleMethodPatternsIT.java
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/TestMultipleMethodPatternsIT.java
 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/TestMultipleMethodPatternsIT.java
index 5284ea1..d490ce5 100644
--- 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/TestMultipleMethodPatternsIT.java
+++ 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/TestMultipleMethodPatternsIT.java
@@ -19,157 +19,49 @@ package org.apache.maven.surefire.its;
  * under the License.
  */
 
-import org.apache.maven.surefire.its.fixture.OutputValidator;
-import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
+import org.apache.maven.surefire.its.fixture.Settings;
 import org.apache.maven.surefire.its.fixture.SurefireLauncher;
-import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 
+import java.util.Arrays;
 
 /**
- * Test project using multiple method patterns, including wildcards in class 
and method names.
+ * JUnit test project using multiple method patterns, including wildcards in 
class and method names.
  */
+@RunWith( Parameterized.class )
 public class TestMultipleMethodPatternsIT
-    extends SurefireJUnit4IntegrationTestCase
+    extends AbstractTestMultipleMethodPatterns
 {
+    private final Settings settings;
 
-    private static final String RUNNING_WITH_JUNIT48 = "parallel='none', 
perCoreThreadCount=true, threadCount=0";
-
-    /*public OutputValidator multipleMethod( String projectName )
-        throws Exception
-    {
-        return unpack( projectName 
).executeTest().verifyErrorFreeLog().assertTestSuiteResults( 7, 0, 0, 0 );
-    }*/
-
-    public SurefireLauncher multipleMethod( String projectName )
-        throws Exception
-    {
-        return unpack( projectName );
-    }
-
-
-    /*@Test
-    public void testJunit48()
-        throws Exception
-    {
-        multipleMethod( "junit48-multiple-method-patterns" ).verifyTextInLog( 
RUNNING_WITH_JUNIT48 );
-    }*/
-
-    @Test
-    public void shouldMatchExactClassAndMethod()
-        throws Exception
-    {
-        multipleMethod( "junit48-multiple-method-patterns" )
-            .setTestToRun( "BasicTest#testSuccessTwo" )
-            .executeTest()
-            .verifyErrorFree( 1 )
-            .verifyErrorFreeLog()
-            .verifyTextInLog( "jiras.surefire745.BasicTest#testSuccessTwo" );
-    }
-
-    @Test
-    public void shouldMatchWildcardPackageAndExactClassAndMethod()
-        throws Exception
-    {
-        multipleMethod( "junit48-multiple-method-patterns" )
-            .setTestToRun( "jiras.**.BasicTest#testSuccessTwo" )
-            .executeTest()
-            .verifyErrorFree( 1 )
-            .verifyErrorFreeLog()
-            .verifyTextInLog( "jiras.surefire745.BasicTest#testSuccessTwo" );
-    }
-
-    @Test
-    public void shouldMatchExactClassAndMethodWildcard()
-        throws Exception
+    public TestMultipleMethodPatternsIT( Settings settings )
     {
-        multipleMethod( "junit48-multiple-method-patterns" )
-            .maven()
-            .addGoal( "-e" ).addGoal( "-X" )
-            .debugLogging().sysProp( "test", "BasicTest#test*One" )
-            .executeTest()
-            .verifyErrorFree( 1 )
-            .verifyErrorFreeLog()
-            .verifyTextInLog( "jiras.surefire745.BasicTest#testSuccessOne" );
+        this.settings = settings;
     }
 
-    @Test
-    public void shouldMatchExactClassAndMethodsWildcard()
-        throws Exception
+    @Parameterized.Parameters
+    public static Iterable<Object[]> data()
     {
-        multipleMethod( "junit48-multiple-method-patterns" )
-            .setTestToRun( "BasicTest#testSuccess*" )
-            .executeTest()
-            .verifyErrorFree( 2 )
-            .verifyErrorFreeLog()
-            .verifyTextInLog( "jiras.surefire745.BasicTest#testSuccessOne" )
-            .verifyTextInLog( "jiras.surefire745.BasicTest#testSuccessTwo" );
+        return Arrays.asList( new Object[][]{
+            { Settings.JUNIT4_TEST },
+            { Settings.JUNIT47_TEST },
+            { Settings.JUNIT4_INCLUDES },
+            { Settings.JUNIT47_INCLUDES },
+            { Settings.JUNIT4_INCLUDES_EXCLUDES },
+            { Settings.JUNIT47_INCLUDES_EXCLUDES }
+        } );
     }
 
-    @Test
-    public void shouldMatchExactClassAndMethodCharacters()
-        throws Exception
+    @Override
+    protected Settings getSettings()
     {
-        multipleMethod( "junit48-multiple-method-patterns" )
-            .setTestToRun( "BasicTest#test???????One" )
-            .executeTest()
-            .verifyErrorFree( 1 )
-            .verifyErrorFreeLog()
-            .verifyTextInLog( "jiras.surefire745.BasicTest#testSuccessOne" );
+        return settings;
     }
 
-    @Test
-    public void shouldMatchExactClassAndMethodsPostfix()
-        throws Exception
+    @Override
+    protected SurefireLauncher unpack()
     {
-        multipleMethod( "junit48-multiple-method-patterns" )
-            .setTestToRun( "TestFive#testSuccess???" )
-            .executeTest()
-            .verifyErrorFree( 2 )
-            .verifyErrorFreeLog()
-            .verifyTextInLog( "jiras.surefire745.TestFive#testSuccessOne" )
-            .verifyTextInLog( "jiras.surefire745.TestFive#testSuccessTwo" );
+        return unpack( "junit48-multiple-method-patterns", "_" + 
settings.path() );
     }
-
-    @Test
-    public void shouldMatchExactClassAndMethodPostfix()
-        throws Exception
-    {
-        multipleMethod( "junit48-multiple-method-patterns" )
-            .setTestToRun( "TestFive#testSuccess?????" )
-            .executeTest()
-            .verifyErrorFree( 1 )
-            .verifyErrorFreeLog()
-            .verifyTextInLog( "jiras.surefire745.TestFive#testSuccessThree" );
-    }
-
-    @Test
-    public void shouldMatchExactClassAndMultipleMethods()
-        throws Exception
-    {
-        multipleMethod( "junit48-multiple-method-patterns" )
-            .setTestToRun( "TestFive#testSuccessOne+testSuccessThree" )
-            .executeTest()
-            .verifyErrorFree( 2 )
-            .verifyErrorFreeLog()
-            .verifyTextInLog( "jiras.surefire745.TestFive#testSuccessOne" )
-            .verifyTextInLog( "jiras.surefire745.TestFive#testSuccessThree" );
-    }
-
-    @Test
-    public void shouldMatchMultiplePatterns()
-        throws Exception
-    {
-        String test = 
"jiras.surefire745.BasicTest#testSuccessOne+testSuccessTwo"//2
-                + ',' + "jiras.**.TestTwo"//2
-                + ',' + "jiras.surefire745.TestThree#testSuccess*"//2
-                + ',' + "jiras.surefire745.TestFour#testSuccess???"//2
-                + ',' + "jiras.surefire745.*Five#test*One";//1
-
-        multipleMethod( "junit48-multiple-method-patterns" )
-            .setTestToRun( test )
-            .executeTest()
-            .verifyErrorFree( 9 )
-            .verifyErrorFreeLog();
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/TestMultipleMethodPatternsTestNGIT.java
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/TestMultipleMethodPatternsTestNGIT.java
 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/TestMultipleMethodPatternsTestNGIT.java
new file mode 100644
index 0000000..2de3670
--- /dev/null
+++ 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/TestMultipleMethodPatternsTestNGIT.java
@@ -0,0 +1,64 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.its.fixture.Settings;
+import org.apache.maven.surefire.its.fixture.SurefireLauncher;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.Arrays;
+
+/**
+ * TestNG test project using multiple method patterns, including wildcards in 
class and method names.
+ */
+@RunWith( Parameterized.class )
+public class TestMultipleMethodPatternsTestNGIT
+    extends AbstractTestMultipleMethodPatterns
+{
+    private final Settings settings;
+
+    public TestMultipleMethodPatternsTestNGIT( Settings settings )
+    {
+        this.settings = settings;
+    }
+
+    @Parameterized.Parameters
+    public static Iterable<Object[]> data()
+    {
+        return Arrays.asList( new Object[][]{
+            { Settings.TestNG_TEST },
+            { Settings.TestNG_INCLUDES },
+            { Settings.TestNG_INCLUDES_EXCLUDES }
+        } );
+    }
+
+    @Override
+    protected Settings getSettings()
+    {
+        return settings;
+    }
+
+    @Override
+    protected SurefireLauncher unpack()
+    {
+        return unpack( "testng-multiple-method-patterns", "_" + 
settings.path() );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/Configuration.java
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/Configuration.java
 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/Configuration.java
new file mode 100644
index 0000000..dcd8184
--- /dev/null
+++ 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/Configuration.java
@@ -0,0 +1,29 @@
+package org.apache.maven.surefire.its.fixture;
+
+/*
+ * 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.
+ */
+
+/**
+ * @author <a href="mailto:tibordig...@apache.org";>Tibor Digana (tibor17)</a>
+ * @since 2.19
+ */
+public enum Configuration
+{
+    TEST, INCLUDES, INCLUDES_FILE, INCLUDES_EXCLUDES, INCLUDES_EXCLUDES_FILE
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/Settings.java
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/Settings.java
 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/Settings.java
new file mode 100644
index 0000000..28013fb
--- /dev/null
+++ 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/Settings.java
@@ -0,0 +1,72 @@
+package org.apache.maven.surefire.its.fixture;
+
+/*
+ * 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.
+ */
+
+/**
+ * @author <a href="mailto:tibordig...@apache.org";>Tibor Digana (tibor17)</a>
+ * @since 2.19
+ */
+public enum Settings
+{
+    JUNIT4_TEST( TestFramework.JUNIT4, Configuration.TEST ),
+    JUNIT47_TEST( TestFramework.JUNIT47, Configuration.TEST ),
+    JUNIT4_INCLUDES( TestFramework.JUNIT4, Configuration.INCLUDES ),
+    JUNIT47_INCLUDES( TestFramework.JUNIT47, Configuration.INCLUDES ),
+    JUNIT4_INCLUDES_EXCLUDES( TestFramework.JUNIT4, 
Configuration.INCLUDES_EXCLUDES ),
+    JUNIT47_INCLUDES_EXCLUDES( TestFramework.JUNIT47, 
Configuration.INCLUDES_EXCLUDES ),
+    JUNIT4_INCLUDES_FILE( TestFramework.JUNIT4, Configuration.INCLUDES_FILE ),
+    JUNIT47_INCLUDES_FILE( TestFramework.JUNIT47, Configuration.INCLUDES_FILE 
),
+    JUNIT4_INCLUDES_EXCLUDES_FILE( TestFramework.JUNIT4, 
Configuration.INCLUDES_EXCLUDES_FILE ),
+    JUNIT47_INCLUDES_EXCLUDES_FILE( TestFramework.JUNIT47, 
Configuration.INCLUDES_EXCLUDES_FILE ),
+    TestNG_TEST( TestFramework.TestNG, Configuration.TEST ),
+    TestNG_INCLUDES( TestFramework.TestNG, Configuration.INCLUDES ),
+    TestNG_INCLUDES_EXCLUDES( TestFramework.TestNG, 
Configuration.INCLUDES_EXCLUDES ),
+    TestNG_INCLUDES_FILE( TestFramework.TestNG, Configuration.INCLUDES_FILE ),
+    TestNG_INCLUDES_EXCLUDES_FILE( TestFramework.TestNG, 
Configuration.INCLUDES_EXCLUDES_FILE );
+
+    private final TestFramework framework;
+    private final Configuration configuration;
+
+    Settings( TestFramework framework, Configuration configuration )
+    {
+        this.framework = framework;
+        this.configuration = configuration;
+    }
+
+    public String path()
+    {
+        return name().replace( '_', '-' ).toLowerCase();
+    }
+
+    public String profile()
+    {
+        return path();
+    }
+
+    public TestFramework getFramework()
+    {
+        return framework;
+    }
+
+    public Configuration getConfiguration()
+    {
+        return configuration;
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/SurefireJUnit4IntegrationTestCase.java
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/SurefireJUnit4IntegrationTestCase.java
 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/SurefireJUnit4IntegrationTestCase.java
index 599d916..ff49392 100644
--- 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/SurefireJUnit4IntegrationTestCase.java
+++ 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/SurefireJUnit4IntegrationTestCase.java
@@ -38,8 +38,12 @@ public abstract class SurefireJUnit4IntegrationTestCase
 
     public SurefireLauncher unpack( String sourceName )
     {
-        MavenLauncher mavenLauncher = new MavenLauncher( this.getClass(), 
sourceName, "" );
-        return new SurefireLauncher( mavenLauncher );
+        return unpack( getClass(), sourceName, "" );
+    }
+
+    public SurefireLauncher unpack( String sourceName, String suffix )
+    {
+        return unpack( getClass(), sourceName, suffix );
     }
 
     public static SurefireLauncher unpack( Class testClass, String sourceName, 
String suffix )

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/TestFramework.java
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/TestFramework.java
 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/TestFramework.java
new file mode 100644
index 0000000..c544347
--- /dev/null
+++ 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/TestFramework.java
@@ -0,0 +1,29 @@
+package org.apache.maven.surefire.its.fixture;
+
+/*
+ * 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.
+ */
+
+/**
+ * @author <a href="mailto:tibordig...@apache.org";>Tibor Digana (tibor17)</a>
+ * @since 2.19
+ */
+public enum TestFramework
+{
+    JUNIT4, JUNIT47, TestNG
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire847AdditionalFailureIT.java
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire847AdditionalFailureIT.java
 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire847AdditionalFailureIT.java
index f267ee8..eaecc90 100755
--- 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire847AdditionalFailureIT.java
+++ 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire847AdditionalFailureIT.java
@@ -28,6 +28,6 @@ public class Surefire847AdditionalFailureIT
     public void testJUnitRunCategoryAB()
     {
         unpack( "surefire-847-testngfail" ).setTestToRun(
-            "org.codehaus.SomePassedTest" ).executeTest().verifyErrorFreeLog();
+            "org/codehaus/SomePassedTest" ).executeTest().verifyErrorFreeLog();
     }
 }

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-integration-tests/src/test/resources/junit44-multiple-methods/pom.xml
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/resources/junit44-multiple-methods/pom.xml
 
b/surefire-integration-tests/src/test/resources/junit44-multiple-methods/pom.xml
index ea40f37..101dad1 100644
--- 
a/surefire-integration-tests/src/test/resources/junit44-multiple-methods/pom.xml
+++ 
b/surefire-integration-tests/src/test/resources/junit44-multiple-methods/pom.xml
@@ -23,11 +23,22 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
   <modelVersion>4.0.0</modelVersion>
 
+  <parent>
+    <groupId>org.apache.maven.surefire</groupId>
+    <artifactId>it-parent</artifactId>
+    <version>1.0</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
   <groupId>org.apache.maven.plugins.surefire</groupId>
   <artifactId>junit4</artifactId>
   <version>1.0-SNAPSHOT</version>
   <name>Test for JUnit 4</name>
 
+  <!--
+  This is using junit 4.0 provider.
+  Same test in junit48-multiple-methods is used with different provider junit 
4.7.
+  -->
 
   <properties>
     <junitVersion>4.4</junitVersion>
@@ -55,9 +66,8 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
-        <version>${surefire.version}</version>
         <configuration>
-          
<test>junit4.BasicTest#testSuccessOne+testFailOne,junit4.TestThree#testSuccessTwo</test>
+          
<test>junit4/BasicTest#testSuccessOne+testFailOne,junit4/TestThree#testSuccessTwo</test>
         </configuration>
       </plugin>
     </plugins>

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-integration-tests/src/test/resources/junit48-multiple-method-patterns/pom.xml
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/resources/junit48-multiple-method-patterns/pom.xml
 
b/surefire-integration-tests/src/test/resources/junit48-multiple-method-patterns/pom.xml
index f5ee204..00ebfa5 100644
--- 
a/surefire-integration-tests/src/test/resources/junit48-multiple-method-patterns/pom.xml
+++ 
b/surefire-integration-tests/src/test/resources/junit48-multiple-method-patterns/pom.xml
@@ -29,9 +29,14 @@
     <relativePath>../pom.xml</relativePath>
   </parent>
   <groupId>org.apache.maven.plugins.surefire</groupId>
-  <artifactId>jiras-surefire-745</artifactId>
+  <artifactId>jiras-surefire-745-junit</artifactId>
   <version>1.0</version>
 
+  <properties>
+    <included/>
+    <excluded/>
+  </properties>
+
   <dependencies>
     <dependency>
       <groupId>junit</groupId>
@@ -54,20 +59,145 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <!--<test>
-          
iras.surefire745.BasicTest#testSuccessOne+testSuccessTwo,iras.surefire745.TestThree#testSuccess*,iras.surefire745.TestFour#testSuccess???,iras.surefire745.*Five#test*One
-          </test>-->
-        </configuration>
-        <dependencies>
-          <dependency>
-            <groupId>org.apache.maven.surefire</groupId>
-            <artifactId>surefire-junit47</artifactId>
-            <version>${surefire.version}</version>
-          </dependency>
-        </dependencies>
       </plugin>
     </plugins>
   </build>
 
+  <profiles>
+    <profile>
+      <id>junit4-test</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <dependencies>
+              <dependency>
+                <groupId>org.apache.maven.surefire</groupId>
+                <artifactId>surefire-junit4</artifactId>
+                <version>${surefire.version}</version>
+              </dependency>
+            </dependencies>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>junit47-test</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <dependencies>
+              <dependency>
+                <groupId>org.apache.maven.surefire</groupId>
+                <artifactId>surefire-junit47</artifactId>
+                <version>${surefire.version}</version>
+              </dependency>
+            </dependencies>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>junit4-includes</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+              <includes>
+                <include>${included}</include>
+              </includes>
+            </configuration>
+            <dependencies>
+              <dependency>
+                <groupId>org.apache.maven.surefire</groupId>
+                <artifactId>surefire-junit4</artifactId>
+                <version>${surefire.version}</version>
+              </dependency>
+            </dependencies>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>junit47-includes</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+              <includes>
+                <include>${included}</include>
+              </includes>
+            </configuration>
+            <dependencies>
+              <dependency>
+                <groupId>org.apache.maven.surefire</groupId>
+                <artifactId>surefire-junit47</artifactId>
+                <version>${surefire.version}</version>
+              </dependency>
+            </dependencies>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>junit4-includes-excludes</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+              <includes>
+                <include>${included}</include>
+              </includes>
+              <excludes>
+                <exclude>${excluded}</exclude>
+              </excludes>
+            </configuration>
+            <dependencies>
+              <dependency>
+                <groupId>org.apache.maven.surefire</groupId>
+                <artifactId>surefire-junit4</artifactId>
+                <version>${surefire.version}</version>
+              </dependency>
+            </dependencies>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>junit47-includes-excludes</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+              <includes>
+                <include>${included}</include>
+              </includes>
+              <excludes>
+                <exclude>${excluded}</exclude>
+              </excludes>
+            </configuration>
+            <dependencies>
+              <dependency>
+                <groupId>org.apache.maven.surefire</groupId>
+                <artifactId>surefire-junit47</artifactId>
+                <version>${surefire.version}</version>
+              </dependency>
+            </dependencies>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
 </project>

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-integration-tests/src/test/resources/junit48-multiple-methods/pom.xml
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/resources/junit48-multiple-methods/pom.xml
 
b/surefire-integration-tests/src/test/resources/junit48-multiple-methods/pom.xml
index df8a981..635acb7 100644
--- 
a/surefire-integration-tests/src/test/resources/junit48-multiple-methods/pom.xml
+++ 
b/surefire-integration-tests/src/test/resources/junit48-multiple-methods/pom.xml
@@ -23,6 +23,13 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
   <modelVersion>4.0.0</modelVersion>
 
+  <parent>
+    <groupId>org.apache.maven.surefire</groupId>
+    <artifactId>it-parent</artifactId>
+    <version>1.0</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
   <groupId>org.apache.maven.plugins.surefire</groupId>
   <artifactId>junit4</artifactId>
   <version>1.0-SNAPSHOT</version>
@@ -55,9 +62,8 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
-        <version>${surefire.version}</version>
         <configuration>
-          
<test>junit4.BasicTest#testSuccessOne+testFailOne,junit4.TestThree#testSuccessTwo</test>
+          
<test>junit4/BasicTest#testSuccessOne+testFailOne,junit4/TestThree#testSuccessTwo</test>
         </configuration>
         <dependencies>
           <dependency>

Reply via email to