You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ti...@apache.org on 2015/03/26 01:15:56 UTC

[14/19] maven-surefire git commit: [SUREFIRE] completed commit 889caca

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/pom.xml
----------------------------------------------------------------------
diff --git a/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/pom.xml b/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/pom.xml
new file mode 100644
index 0000000..f1a554b
--- /dev/null
+++ b/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/pom.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         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>jiras-surefire-745-testng</artifactId>
+  <version>1.0</version>
+
+  <properties>
+    <included/>
+    <excluded/>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.testng</groupId>
+      <artifactId>testng</artifactId>
+      <version>5.7</version>
+      <classifier>jdk15</classifier>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+  <profiles>
+    <profile>
+      <id>testng-test</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>testng-includes</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+              <includes>
+                <include>${included}</include>
+              </includes>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>testng-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>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
+</project>

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/BasicTest.java
----------------------------------------------------------------------
diff --git a/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/BasicTest.java b/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/BasicTest.java
new file mode 100644
index 0000000..3e2728e
--- /dev/null
+++ b/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/BasicTest.java
@@ -0,0 +1,47 @@
+package jiras.surefire745;
+
+
+/*
+ * 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.testng.annotations.*;
+import static org.testng.Assert.*;
+
+public class BasicTest
+{
+
+    @Test
+    public void testSuccessOne()
+    {
+        System.out.println( getClass() + "#testSuccessOne" );
+    }
+
+    @Test
+    public void testSuccessTwo()
+    {
+        System.out.println( getClass() + "#testSuccessTwo" );
+    }
+
+    @Test
+    public void testFailure()
+    {
+        System.out.println( getClass() + "#testFailure" );
+        fail( );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/TestFive.java
----------------------------------------------------------------------
diff --git a/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/TestFive.java b/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/TestFive.java
new file mode 100644
index 0000000..d11ef5d
--- /dev/null
+++ b/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/TestFive.java
@@ -0,0 +1,44 @@
+package jiras.surefire745;
+
+/*
+ * 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.testng.annotations.*;
+
+public class TestFive
+{
+
+    @Test
+    public void testSuccessOne()
+    {
+        System.out.println( getClass() + "#testSuccessOne" );
+    }
+
+    @Test
+    public void testSuccessTwo()
+    {
+        System.out.println( getClass() + "#testSuccessTwo" );
+    }
+
+    @Test
+    public void testSuccessThree()
+    {
+        System.out.println( getClass() + "#testSuccessThree" );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/TestFour.java
----------------------------------------------------------------------
diff --git a/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/TestFour.java b/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/TestFour.java
new file mode 100644
index 0000000..0b1b6c6
--- /dev/null
+++ b/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/TestFour.java
@@ -0,0 +1,44 @@
+package jiras.surefire745;
+
+/*
+ * 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.testng.annotations.*;
+
+public class TestFour
+{
+
+    @Test
+    public void testSuccessOne()
+    {
+        System.out.println( getClass() + "#testSuccessOne" );
+    }
+
+    @Test
+    public void testSuccessTwo()
+    {
+        System.out.println( getClass() + "#testSuccessTwo" );
+    }
+
+    @Test
+    public void testSuccessThree()
+    {
+        System.out.println( getClass() + "#testSuccessThree" );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/TestThree.java
----------------------------------------------------------------------
diff --git a/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/TestThree.java b/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/TestThree.java
new file mode 100644
index 0000000..0d290dc
--- /dev/null
+++ b/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/TestThree.java
@@ -0,0 +1,46 @@
+package jiras.surefire745;
+
+/*
+ * 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.testng.annotations.*;
+import static org.testng.Assert.*;
+
+public class TestThree
+{
+
+    @Test
+    public void testSuccessOne()
+    {
+        System.out.println( getClass() + "#testSuccessOne" );
+    }
+
+    @Test
+    public void testSuccessTwo()
+    {
+        System.out.println( getClass() + "#testSuccessTwo" );
+    }
+
+    @Test
+    public void testFailOne()
+    {
+        System.out.println( getClass() + "#testFailOne" );
+        fail();
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/TestTwo.java
----------------------------------------------------------------------
diff --git a/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/TestTwo.java b/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/TestTwo.java
new file mode 100644
index 0000000..4e1b56d
--- /dev/null
+++ b/surefire-integration-tests/src/test/resources/testng-multiple-method-patterns/src/test/java/jiras/surefire745/TestTwo.java
@@ -0,0 +1,38 @@
+package jiras.surefire745;
+
+/*
+ * 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.testng.annotations.*;
+
+public class TestTwo
+{
+
+    @Test
+    public void testSuccessOne()
+    {
+        System.out.println( getClass() + "#testSuccessOne" );
+    }
+
+    @Test
+    public void testSuccessTwo()
+    {
+        System.out.println( getClass() + "#testSuccessTwo" );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/MethodFilter.java
----------------------------------------------------------------------
diff --git a/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/MethodFilter.java b/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/MethodFilter.java
index 61d08ce..1af5679 100644
--- a/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/MethodFilter.java
+++ b/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/MethodFilter.java
@@ -41,11 +41,11 @@ final class MethodFilter
     {
         Collection<Filter> includedFilters = new LinkedHashSet<Filter>();
         Collection<Filter> excludedFilters = new LinkedHashSet<Filter>();
-        for ( ResolvedTest test : testResolver.getIncludedFilters() )
+        for ( ResolvedTest test : testResolver.getIncludedPatterns() )
         {
             includedFilters.add( new RequestedTest( test ) );
         }
-        for ( ResolvedTest test : testResolver.getExcludedFilters() )
+        for ( ResolvedTest test : testResolver.getExcludedPatterns() )
         {
             excludedFilters.add( new RequestedTest( test ) );
         }
@@ -63,11 +63,6 @@ final class MethodFilter
         {
             return combinedFilter.shouldRun( description );
         }
-        else if ( combinedFilter.shouldRun( description ) )
-        {
-            //pribudlo - daj do JUnit4Provider
-            return true;
-        }
         else
         {
             for ( Description o : description.getChildren() )

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/RequestedTest.java
----------------------------------------------------------------------
diff --git a/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/RequestedTest.java b/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/RequestedTest.java
index 3862ff0..567db26 100644
--- a/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/RequestedTest.java
+++ b/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/RequestedTest.java
@@ -26,6 +26,8 @@ import org.junit.runner.manipulation.Filter;
 final class RequestedTest
     extends Filter
 {
+    private static final String CLASS_FILE_EXTENSION = ".class";
+
     private final ResolvedTest test;
 
     RequestedTest( ResolvedTest test )
@@ -38,7 +40,7 @@ final class RequestedTest
     {
         Class<?> realTestClass = description.getTestClass();
         String methodName = description.getMethodName();
-        return realTestClass == null && methodName == null || test.shouldRun( realTestClass, methodName );
+        return realTestClass == null && methodName == null || test.shouldRun( classFile( realTestClass ), methodName );
     }
 
     @Override
@@ -65,4 +67,9 @@ final class RequestedTest
     {
         return test.hashCode();
     }
+
+    private String classFile( Class<?> realTestClass )
+    {
+        return realTestClass.getName().replace( '.', '/' ) + CLASS_FILE_EXTENSION;
+    }
 }

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/FilterFactoryTest.java
----------------------------------------------------------------------
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/FilterFactoryTest.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/FilterFactoryTest.java
index 91a00e3..07280af 100644
--- a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/FilterFactoryTest.java
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/FilterFactoryTest.java
@@ -19,31 +19,27 @@ package org.apache.maven.surefire.common.junit48;
  * under the License.
  */
 
-import junit.framework.TestCase;
+import org.apache.maven.shared.utils.io.MatchPatterns;
+import org.apache.maven.surefire.common.junit48.tests.pt.PT;
+import org.apache.maven.surefire.testset.ResolvedTest;
+import org.apache.maven.surefire.testset.TestListResolver;
 import org.junit.Test;
-import org.junit.internal.builders.AllDefaultPossibilitiesBuilder;
-import org.junit.runner.Computer;
 import org.junit.runner.Description;
 import org.junit.runner.JUnitCore;
 import org.junit.runner.Request;
 import org.junit.runner.Result;
 import org.junit.runner.RunWith;
-import org.junit.runner.Runner;
 import org.junit.runner.manipulation.Filter;
-import org.junit.runner.manipulation.NoTestsRemainException;
-import org.junit.runners.Suite;
-import org.junit.runners.model.InitializationError;
-import org.junit.runners.model.RunnerBuilder;
 
-import java.util.ArrayList;
+import java.io.File;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.List;
 
+import static org.junit.runner.Description.createSuiteDescription;
 import static org.junit.runner.Description.createTestDescription;
+import static org.junit.Assert.*;
 
 public class FilterFactoryTest
-    extends TestCase
 {
     @RunWith( org.junit.runners.Suite.class )
     @org.junit.runners.Suite.SuiteClasses( { FirstClass.class, SecondClass.class } )
@@ -57,19 +53,19 @@ public class FilterFactoryTest
         @Test
         public void testMethod()
         {
-            System.out.println( "FirstClass#testMethod" );
+            //System.out.println( "FirstClass#testMethod" );
         }
 
         @Test
         public void secondTestMethod()
         {
-            System.out.println( "FirstClass#secondTestMethod" );
+            //System.out.println( "FirstClass#secondTestMethod" );
         }
 
         @Test
         public void otherMethod()
         {
-            System.out.println( "FirstClass#otherMethod" );
+            //System.out.println( "FirstClass#otherMethod" );
         }
     }
 
@@ -78,13 +74,13 @@ public class FilterFactoryTest
         @Test
         public void testMethod()
         {
-            System.out.println( "SecondClass#testMethod" );
+            //System.out.println( "SecondClass#testMethod" );
         }
 
         @Test
         public void secondTestMethod()
         {
-            System.out.println( "SecondClass#secondTestMethod" );
+            //System.out.println( "SecondClass#secondTestMethod" );
         }
     }
 
@@ -93,13 +89,13 @@ public class FilterFactoryTest
         @Test
         public void testMethod()
         {
-            System.out.println( "ThirdClass#testMethod" );
+            //System.out.println( "ThirdClass#testMethod" );
         }
 
         @Test
         public void secondTestMethod()
         {
-            System.out.println( "ThirdClass#secondTestMethod" );
+            //System.out.println( "ThirdClass#secondTestMethod" );
         }
     }
 
@@ -114,15 +110,121 @@ public class FilterFactoryTest
     private static final Description secondTestMethodInSecondClass =
         createTestDescription( SecondClass.class, "secondTestMethod" );
 
-    private static final String firstClassName = FirstClass.class.getName();
+    private static final String firstClassName = FirstClass.class.getName().replace( '.', '/' );
 
-    private static final String secondClassName = SecondClass.class.getName();
+    private static final String secondClassName = SecondClass.class.getName().replace( '.', '/' );
+
+    private static final String firstClassRegex = FirstClass.class.getName().replace( "$", "\\$" );
+
+    private static final String secondClassRegex = SecondClass.class.getName().replace( "$", "\\$" );
 
     private Filter createMethodFilter( String requestString )
     {
         return new FilterFactory( getClass().getClassLoader() ).createMethodFilter( requestString );
     }
 
+    @Test
+    public void testSanity()
+    {
+        ResolvedTest test = new ResolvedTest( ResolvedTest.Type.CLASS, "  \t \n   ", true );
+        assertNull( test.getTestClassPattern() );
+        assertNull( test.getTestMethodPattern() );
+        assertFalse( test.hasTestClassPattern() );
+        assertFalse( test.hasTestMethodPattern() );
+        assertTrue( test.isEmpty() );
+        assertTrue( test.isRegexTestClassPattern() );
+        assertFalse( test.isRegexTestMethodPattern() );
+        test = new ResolvedTest( ResolvedTest.Type.METHOD, "   \n  \t   ", true );
+        assertNull( test.getTestClassPattern() );
+        assertNull( test.getTestMethodPattern() );
+        assertFalse( test.hasTestClassPattern() );
+        assertFalse( test.hasTestMethodPattern() );
+        assertTrue( test.isEmpty() );
+        assertFalse( test.isRegexTestClassPattern() );
+        assertTrue( test.isRegexTestMethodPattern() );
+        test = new ResolvedTest( ResolvedTest.Type.METHOD, "  \n   ", false );
+        assertNull( test.getTestClassPattern() );
+        assertNull( test.getTestMethodPattern() );
+        assertFalse( test.hasTestClassPattern() );
+        assertFalse( test.hasTestMethodPattern() );
+        assertTrue( test.isEmpty() );
+        assertFalse( test.isRegexTestClassPattern() );
+        assertFalse( test.isRegexTestMethodPattern() );
+        test = new ResolvedTest( "  \n  \t ", "  \n  \t ", false );
+        assertNull( test.getTestClassPattern() );
+        assertNull( test.getTestMethodPattern() );
+        assertFalse( test.hasTestClassPattern() );
+        assertFalse( test.hasTestMethodPattern() );
+        assertTrue( test.isEmpty() );
+        assertFalse( test.isRegexTestClassPattern() );
+        assertFalse( test.isRegexTestMethodPattern() );
+    }
+
+    @Test
+    public void testNegativeIllegalRegex()
+    {
+        try {
+            new TestListResolver( "#%regex[.*.Test.class]" );
+        }
+        catch ( IllegalArgumentException e )
+        {
+            // expected in junit 3.x
+        }
+    }
+
+    @Test
+    public void testNegativeIllegalRegex2()
+    {
+        try {
+            new TestListResolver( "%regex[.*.Test.class]#" );
+        }
+        catch ( IllegalArgumentException e )
+        {
+            // expected in junit 3.x
+        }
+    }
+
+    @Test
+    public void testNegativeEmptyRegex()
+    {
+        TestListResolver resolver = new TestListResolver( "%regex[ ]" );
+        assertTrue( resolver.getExcludedPatterns().isEmpty() );
+        assertTrue( resolver.getIncludedPatterns().isEmpty() );
+        assertTrue( resolver.isEmpty() );
+        assertNull( resolver.getPluginParameterTest() );
+        assertFalse( resolver.hasExcludedMethodPatterns() );
+        assertFalse( resolver.hasIncludedMethodPatterns() );
+        assertFalse( resolver.hasMethodPatterns() );
+    }
+
+    @Test
+    public void testNegativeEmptyRegexWithHash()
+    {
+        TestListResolver resolver = new TestListResolver( "%regex[# ]" );
+        assertTrue( resolver.getExcludedPatterns().isEmpty() );
+        assertTrue( resolver.getIncludedPatterns().isEmpty() );
+        assertTrue( resolver.isEmpty() );
+        assertNull( resolver.getPluginParameterTest() );
+        assertFalse( resolver.hasExcludedMethodPatterns() );
+        assertFalse( resolver.hasIncludedMethodPatterns() );
+        assertFalse( resolver.hasMethodPatterns() );
+    }
+
+    @Test
+    public void testNegativeRegexWithEmptyMethod()
+    {
+        TestListResolver resolver = new TestListResolver( "%regex[.*.Test.class# ]" );
+        assertFalse( resolver.isEmpty() );
+        assertTrue( resolver.getExcludedPatterns().isEmpty() );
+        assertFalse( resolver.getIncludedPatterns().isEmpty() );
+        assertEquals( 1, resolver.getIncludedPatterns().size() );
+        assertEquals( "%regex[.*.Test.class]", resolver.getPluginParameterTest() );
+        assertFalse( resolver.hasExcludedMethodPatterns() );
+        assertFalse( resolver.hasIncludedMethodPatterns() );
+        assertFalse( resolver.hasMethodPatterns() );
+    }
+
+    @Test
     public void testBackwardsCompatibilityNullMethodFilter()
     {
         Filter filter = createMethodFilter( null );
@@ -134,6 +236,7 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testBackwardsCompatibilityEmptyMethodFilter()
     {
         Filter filter = createMethodFilter( "" );
@@ -145,6 +248,7 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testBackwardsCompatibilityBlankMethodFilter()
     {
         Filter filter = createMethodFilter( "    \n" );
@@ -156,8 +260,9 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testBackwardsCompatibilityTestParameterClass() {
-        Filter filter = createMethodFilter( FirstClass.class.getName() );
+        Filter filter = createMethodFilter( firstClassName );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class ).filterWith( filter ) );
         assertTrue( result.wasSuccessful() );
@@ -166,8 +271,9 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testBackwardsCompatibilityTestParameterJavaClass() {
-        Filter filter = createMethodFilter( FirstClass.class.getName() + ".java" );
+        Filter filter = createMethodFilter( firstClassName + ".java" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class ).filterWith( filter ) );
         assertTrue( result.wasSuccessful() );
@@ -176,8 +282,9 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testBackwardsCompatibilityTestParameterMethod1() {
-        Filter filter = createMethodFilter( FirstClass.class.getName().replace( '.', '/' ) + ".java#testMethod"  );
+        Filter filter = createMethodFilter( firstClassName + ".java#testMethod"  );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class ).filterWith( filter ) );
         assertTrue( result.wasSuccessful() );
@@ -186,8 +293,9 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testBackwardsCompatibilityTestParameterMethod2() {
-        Filter filter = createMethodFilter( FirstClass.class.getName().replace( '.', '/' ) + "#testMethod"  );
+        Filter filter = createMethodFilter( firstClassName + "#testMethod"  );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class ).filterWith( filter ) );
         assertTrue( result.wasSuccessful() );
@@ -196,8 +304,9 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testBackwardsCompatibilityTestParameterMethod3() {
-        Filter filter = createMethodFilter( FirstClass.class.getName() + "#testMethod"  );
+        Filter filter = createMethodFilter( firstClassName + "#testMethod"  );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class ).filterWith( filter ) );
         assertTrue( result.wasSuccessful() );
@@ -206,8 +315,10 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testRegexWithWildcard() {
-        Filter filter = createMethodFilter( "%regex[" + FirstClass.class.getName() + ".*]" );
+        Filter filter =
+            createMethodFilter( "%regex[" + firstClassRegex + ".*]" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class ).filterWith( filter ) );
         assertTrue( result.wasSuccessful() );
@@ -216,8 +327,10 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testRegexWithWildcardClass() {
-        Filter filter = createMethodFilter( "%regex[" + FirstClass.class.getName() + ".*.class]" );
+        Filter filter =
+            createMethodFilter( "%regex[" + firstClassRegex + ".*.class]" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class ).filterWith( filter ) );
         assertTrue( result.wasSuccessful() );
@@ -226,8 +339,9 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testRegexWithExactClass() {
-        Filter filter = createMethodFilter( "%regex[" + FirstClass.class.getName() + ".class]" );
+        Filter filter = createMethodFilter( "%regex[" + firstClassRegex + ".class]" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class ).filterWith( filter ) );
         assertTrue( result.wasSuccessful() );
@@ -236,16 +350,20 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testRegexWithWildcardJavaClassNegativeTest() {
-        Filter filter = createMethodFilter( "%regex[" + FirstClass.class.getName().replace( '.', '/' ) + ".*.java]" );
+        Filter filter = createMethodFilter( "%regex[" + firstClassRegex + ".*.class]" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class ).filterWith( filter ) );
-        assertFalse( result.wasSuccessful() );
+        assertTrue( result.wasSuccessful() );
+        assertEquals( 3, result.getRunCount() );
+        assertEquals( 0, result.getFailureCount() );
+        assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testRegexWithTwoClasses() {
-        Filter filter = createMethodFilter( "%regex[" + FirstClass.class.getName() + ".*"
-                                                + "|" + SecondClass.class.getName() + ".*]" );
+        Filter filter = createMethodFilter( "%regex[" + firstClassRegex + ".*|" + secondClassRegex + ".*]" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -255,9 +373,9 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testRegexWithTwoClassesComplement() {
-        Filter filter = createMethodFilter( "!%regex[" + FirstClass.class.getName() + ".*"
-                                                + "|" + SecondClass.class.getName() + ".*]" );
+        Filter filter = createMethodFilter( "!%regex[" + firstClassRegex + ".*|" + secondClassRegex + ".*]" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -267,9 +385,10 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testRegexWithTwoClassesAndOneMethod() {
-        Filter filter = createMethodFilter( "%regex[" + FirstClass.class.getName() + ".*"
-                                                + "|" + SecondClass.class.getName() + ".*]#otherMethod" );
+        Filter filter =
+            createMethodFilter( "%regex[" + firstClassRegex + ".*|" + secondClassRegex + ".* # otherMethod]" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -279,9 +398,10 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testRegexWithTwoClassesAndOneMethodComplement() {
-        Filter filter = createMethodFilter( "!%regex[" + FirstClass.class.getName() + ".*"
-                                                + "|" + SecondClass.class.getName() + ".*]#otherMethod" );
+        Filter filter =
+            createMethodFilter( "!%regex[" + firstClassRegex + ".*|" + secondClassRegex + ".*# otherMethod]" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -291,33 +411,9 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testRegexWithTwoClassesAndWildcardMethod() {
-        Filter filter = createMethodFilter( "%regex[" + FirstClass.class.getName() + ".*"
-                                                + "|" + SecondClass.class.getName() + ".*]#test*" );
-        JUnitCore core = new JUnitCore();
-        Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
-                                      .filterWith( filter ) );
-        assertTrue( result.wasSuccessful() );
-        assertEquals( 2, result.getRunCount() );
-        assertEquals( 0, result.getFailureCount() );
-        assertEquals( 0, result.getIgnoreCount() );
-    }
-
-    public void testRegexWithTwoClassesAndWildcardMethodComplement() {
-        Filter filter = createMethodFilter( "!%regex[" + FirstClass.class.getName() + ".*"
-                                                + "|" + SecondClass.class.getName() + ".*]#test*" );
-        JUnitCore core = new JUnitCore();
-        Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
-                                      .filterWith( filter ) );
-        assertTrue( result.wasSuccessful() );
-        assertEquals( 5, result.getRunCount() );
-        assertEquals( 0, result.getFailureCount() );
-        assertEquals( 0, result.getIgnoreCount() );
-    }
-
-    public void testRegexWithTwoClassesAndRegexMethod() {
-        Filter filter = createMethodFilter( "%regex[" + FirstClass.class.getName() + ".*"
-                                                + "|" + SecondClass.class.getName() + ".*]#%regex[test.*]" );
+        Filter filter = createMethodFilter( "%regex[" + firstClassRegex + ".*|" + secondClassRegex + ".*#test.* ]" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -327,9 +423,9 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testRegexWithTwoClassesAndRegexMethodComplement() {
-        Filter filter = createMethodFilter( "!%regex[" + FirstClass.class.getName() + ".*"
-                                                + "|" + SecondClass.class.getName() + ".*]#%regex[test.*]" );
+        Filter filter = createMethodFilter( "!%regex[" + firstClassRegex + ".*|" + secondClassRegex + ".*#test.*]" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -339,9 +435,10 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testRegexWithTwoClassesAndRegexMethods() {
-        Filter filter = createMethodFilter( "%regex[" + FirstClass.class.getName() + ".*"
-                                                + "|" + SecondClass.class.getName() + ".*]#%regex[test.*|other.*]" );
+        Filter filter =
+            createMethodFilter( "%regex[ " + firstClassRegex + ".*|" + secondClassRegex + ".* # test.*|other.* ]" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -351,35 +448,10 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testRegexWithTwoClassesAndRegexMethodsComplement() {
-        Filter filter = createMethodFilter( "!%regex[" + FirstClass.class.getName() + ".*"
-                                                + "|" + SecondClass.class.getName() + ".*]#%regex[test.*|other.*]" );
-        JUnitCore core = new JUnitCore();
-        Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
-                                      .filterWith( filter ) );
-        assertTrue( result.wasSuccessful() );
-        assertEquals( 4, result.getRunCount() );
-        assertEquals( 0, result.getFailureCount() );
-        assertEquals( 0, result.getIgnoreCount() );
-    }
-
-    public void testRegexWithTwoClassesAndMultipleRegexMethods() {
-        Filter filter = createMethodFilter( "%regex[" + FirstClass.class.getName() + ".*"
-                                                + "|" + SecondClass.class.getName() + ".*]"
-                                                + "#%regex[test.*]+%regex[other.*]" );
-        JUnitCore core = new JUnitCore();
-        Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
-                                      .filterWith( filter ) );
-        assertTrue( result.wasSuccessful() );
-        assertEquals( 3, result.getRunCount() );
-        assertEquals( 0, result.getFailureCount() );
-        assertEquals( 0, result.getIgnoreCount() );
-    }
-
-    public void testRegexWithTwoClassesAndMultipleRegexMethodsComplement() {
-        Filter filter = createMethodFilter( "!%regex[" + FirstClass.class.getName() + ".*"
-                                                + "|" + SecondClass.class.getName() + ".*]"
-                                                + "#%regex[test.*]+%regex[other.*]" );
+        Filter filter =
+            createMethodFilter( "!%regex[" + firstClassRegex + ".*|" + secondClassRegex + ".* # test.*|other.* ]" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -389,9 +461,10 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testMultipleRegexClasses() {
-        Filter filter = createMethodFilter( "%regex[" + FirstClass.class.getName() + ".*],"
-                                                + "%regex[" + SecondClass.class.getName() + ".*]" );
+        Filter filter =
+            createMethodFilter( "%regex[" + firstClassRegex + ".*], %regex[" + secondClassRegex + ".*]" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -401,9 +474,10 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testMultipleRegexClassesComplement() {
-        Filter filter = createMethodFilter( "!%regex[" + FirstClass.class.getName() + ".*],"
-                                                + "!%regex[" + SecondClass.class.getName() + ".*]" );
+        Filter filter =
+            createMethodFilter( "!%regex[" + firstClassRegex + ".*] , !%regex[" + secondClassRegex + ".*]" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -413,8 +487,9 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testMultipleClasses() {
-        Filter filter = createMethodFilter( FirstClass.class.getName() + "," + SecondClass.class.getName() );
+        Filter filter = createMethodFilter( firstClassName + "," + secondClassName );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -424,9 +499,9 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testMultipleClassesMethods() {
-        Filter filter = createMethodFilter( FirstClass.class.getName() + "#other*,"
-                                                + SecondClass.class.getName() + "#*TestMethod" );
+        Filter filter = createMethodFilter( firstClassName + "#other*," + secondClassName + "#*TestMethod" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -436,9 +511,10 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testMultipleClassesAndMultipleMethodsWithWildcards() {
-        Filter filter = createMethodFilter( FirstClass.class.getName() + "#other*+second*Method,"
-                                                + SecondClass.class.getName() + "#*TestMethod" );
+        Filter filter = createMethodFilter( firstClassName + "#other*+second*Method,"
+                                                + secondClassName + "#*TestMethod" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -448,9 +524,10 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testMultipleClassesAndMultipleMethodsWithRegex() {
-        Filter filter = createMethodFilter( FirstClass.class.getName() + "#%regex[other.*|second.*Method],"
-                                                + SecondClass.class.getName() + "#%regex[.*TestMethod]" );
+        Filter filter = createMethodFilter( "%regex[" + firstClassRegex + ".class#other.*|second.*Method],"
+                                                + "%regex[" + secondClassRegex + ".class#.*TestMethod]" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -460,9 +537,10 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testMultipleClassesAndMultipleMethodsMix() {
-        Filter filter = createMethodFilter( FirstClass.class.getName() + "#%regex[other.*|second.*Method],"
-                                                + SecondClass.class.getName() + "#*TestMethod" );
+        Filter filter = createMethodFilter( "%regex[" + firstClassRegex + ".class # other.*|second.*Method],"
+                                                + secondClassName + "#*TestMethod" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -472,9 +550,10 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testMultipleClassesAndMultipleMethods() {
-        Filter filter = createMethodFilter( FirstClass.class.getName() + "#other*+secondTestMethod,"
-                                                + SecondClass.class.getName() + "#*TestMethod" );
+        Filter filter = createMethodFilter( firstClassName + "#other*+secondTestMethod,"
+                                                + secondClassName + "#*TestMethod" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -484,8 +563,9 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testMultipleClassesComplement() {
-        Filter filter = createMethodFilter( "!" + FirstClass.class.getName() + ",!" + SecondClass.class.getName() );
+        Filter filter = createMethodFilter( "!" + firstClassName + ",!" + secondClassName );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -495,9 +575,11 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testMultipleRegexClassesMethods() {
-        Filter filter = createMethodFilter( "%regex[" + FirstClass.class.getName() + ".*]#%regex[test.*]+%regex[other.*],"
-                                                + "%regex[" + SecondClass.class.getName() + ".*]#%regex[second.*]" );
+        Filter filter =
+            createMethodFilter( "%regex[" + firstClassRegex + ".* # test.*|other.*],"
+                                    + "%regex[" + secondClassRegex + ".*#second.*]" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -507,9 +589,11 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testMultipleRegexClassesMethodsComplement() {
-        Filter filter = createMethodFilter( "!%regex[" + FirstClass.class.getName() + ".*]#%regex[test.*]+%regex[other.*],"
-                                                + "!%regex[" + SecondClass.class.getName() + ".*]#%regex[second.*]" );
+        Filter filter =
+            createMethodFilter( "!%regex[" + firstClassRegex + ".* # test.*|other.*],"
+                                    + "!%regex[" + secondClassRegex + ".*#second.*]" );
         JUnitCore core = new JUnitCore();
         Result result = core.run( Request.classes( FirstClass.class, SecondClass.class, ThirdClass.class )
                                       .filterWith( filter ) );
@@ -519,12 +603,14 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testShouldMatchExactMethodName()
     {
         Filter exactFilter = createMethodFilter( "#testMethod" );
         assertTrue( "exact match on name should run", exactFilter.shouldRun( testMethod ) );
     }
 
+    @Test
     public void testShouldMatchExactMethodNameComplement()
     {
         Filter exactFilter = createMethodFilter( "!#testMethod" );
@@ -532,26 +618,59 @@ public class FilterFactoryTest
         assertTrue( "should run other than testMethod", exactFilter.shouldRun( secondTestMethod ) );
         assertFalse( "should not run testMethod", exactFilter.shouldRun( testMethodInSecondClass ) );
         assertTrue( "should run other than testMethod", exactFilter.shouldRun( secondTestMethodInSecondClass ) );
+
+        exactFilter = createMethodFilter( "!FilterFactoryTest$FirstClass#testMethod" );
+        assertFalse( "should not run testMethod", exactFilter.shouldRun( testMethod ) );
+        assertTrue( "should run other than testMethod", exactFilter.shouldRun( secondTestMethod ) );
+        assertTrue( "should not run testMethod", exactFilter.shouldRun( testMethodInSecondClass ) );
+        assertTrue( "should run other than testMethod", exactFilter.shouldRun( secondTestMethodInSecondClass ) );
+
+        exactFilter =
+            createMethodFilter( "!FilterFactoryTest$FirstClass#testMethod, !FilterFactoryTest$SecondClass#testMethod" );
+        assertFalse( "should not run testMethod", exactFilter.shouldRun( testMethod ) );
+        assertTrue( "should run other than testMethod", exactFilter.shouldRun( secondTestMethod ) );
+        assertFalse( "should not run testMethod", exactFilter.shouldRun( testMethodInSecondClass ) );
+        assertTrue( "should run other than testMethod", exactFilter.shouldRun( secondTestMethodInSecondClass ) );
     }
 
+    @Test
     public void testShouldMatchExactMethodNameWithHash()
     {
-        Filter exactFilter = createMethodFilter( "#testMethod" );
+        final Filter exactFilter = createMethodFilter( "#testMethod" );
         assertTrue( "exact match on name should run", exactFilter.shouldRun( testMethod ) );
     }
 
+    @Test
+    public void testShouldNotNonExistingMethod()
+    {
+        String sourceFile = "pkg" + File.separator + "XMyTest.class";
+        assertFalse( new TestListResolver( "#testMethod" ).shouldRun( sourceFile, null ) );
+    }
+
+    @Test
+    public void testShouldNotRunDifferentMethods()
+    {
+        final Filter exactFilter = createMethodFilter( "#testMethod" );
+        Description testCase = createSuiteDescription( FirstClass.class );
+        testCase.addChild( otherMethod );
+        assertFalse( "exact match test case", exactFilter.shouldRun( testCase ) );
+    }
+
+    @Test
     public void testShouldNotRunExactMethodWithoutClass()
     {
         Filter exactFilter = createMethodFilter( "#testMethod" );
         assertFalse( "should run containing matching method", exactFilter.shouldRun( secondTestMethod ) );
     }
 
+    @Test
     public void testShouldNotMatchExactOnOtherMethod()
     {
         Filter exactFilter = createMethodFilter( "#testMethod" );
         assertFalse( "should not run other methods", exactFilter.shouldRun( otherMethod ) );
     }
 
+    @Test
     public void testShouldMatchWildCardsInMethodName()
     {
         Filter starAtEnd = createMethodFilter( "#test*" );
@@ -576,12 +695,14 @@ public class FilterFactoryTest
         assertTrue( "match containing star and question mark should run", starAndQuestion.shouldRun( testMethod ) );
     }
 
+    @Test
     public void testShouldMatchExactClassAndMethod()
     {
         Filter exactFilter = createMethodFilter( firstClassName + "#testMethod" );
         assertTrue( "exact match on name should run", exactFilter.shouldRun( testMethod ) );
     }
 
+    @Test
     public void testShouldMatchSimpleClassNameWithMethod()
     {
         Filter exactFilter = createMethodFilter( "FilterFactoryTest$FirstClass#testMethod" );
@@ -589,6 +710,25 @@ public class FilterFactoryTest
         assertFalse( "other method should not match", exactFilter.shouldRun( otherMethod ) );
     }
 
+    @Test
+    public void testShouldMatchNestedClassAsRegexWithMethod()
+    {
+        Filter exactFilter =
+            createMethodFilter( "%regex[.*.common.junit48.FilterFactoryTest\\$FirstClass.class#testMethod]" );
+        assertTrue( "exact match on name should run", exactFilter.shouldRun( testMethod ) );
+        assertFalse( "other method should not match", exactFilter.shouldRun( otherMethod ) );
+    }
+
+    @Test
+    public void testShouldMatchNestedCanonicalClassAsRegexWithMethod()
+    {
+        Filter exactFilter =
+            createMethodFilter( "%regex[.*.common.junit48.FilterFactoryTest.FirstClass.class#testMethod]" );
+        assertTrue( "exact match on name should run", exactFilter.shouldRun( testMethod ) );
+        assertFalse( "other method should not match", exactFilter.shouldRun( otherMethod ) );
+    }
+
+    @Test
     public void testShouldMatchClassNameWithWildcardAndMethod()
     {
         Filter exactFilter = createMethodFilter( "*First*#testMethod" );
@@ -596,6 +736,7 @@ public class FilterFactoryTest
         assertFalse( "other method should not match", exactFilter.shouldRun( otherMethod ) );
     }
 
+    @Test
     public void testShouldMatchClassNameWithWildcardCompletely()
     {
         Filter exactFilter = createMethodFilter( "First*#testMethod" );
@@ -603,6 +744,7 @@ public class FilterFactoryTest
         assertFalse( "other method should not match", exactFilter.shouldRun( otherMethod ) );
     }
 
+    @Test
     public void testShouldMatchMultipleMethodsSeparatedByComma()
     {
         Filter exactFilter = createMethodFilter( firstClassName + "#testMethod,#secondTestMethod" );
@@ -614,9 +756,10 @@ public class FilterFactoryTest
         assertFalse( "other method should not match", exactFilter.shouldRun( otherMethod ) );
     }
 
+    @Test
     public void testShouldMatchMultipleMethodsInSameClassSeparatedByPlus()
     {
-        Filter exactFilter = createMethodFilter( FirstClass.class.getName() + "#testMethod+secondTestMethod" );
+        Filter exactFilter = createMethodFilter( firstClassName + "#testMethod+secondTestMethod" );
 
         assertTrue( "exact match on name should run", exactFilter.shouldRun( testMethod ) );
         assertTrue( "exact match on name should run", exactFilter.shouldRun( secondTestMethod ) );
@@ -627,6 +770,7 @@ public class FilterFactoryTest
         assertFalse( "other method should not match", exactFilter.shouldRun( otherMethod ) );
     }
 
+    @Test
     public void testShouldRunCompleteClassWhenSeparatedByCommaWithoutHash()
     {
         Filter exactFilter = createMethodFilter( firstClassName + "#testMethod," + secondClassName );
@@ -640,6 +784,7 @@ public class FilterFactoryTest
         assertTrue( "should run complete second class", exactFilter.shouldRun( secondTestMethodInSecondClass ) );
     }
 
+    @Test
     public void testShouldRunSuitesContainingExactMethodName()
     {
         Description suite = Description.createSuiteDescription( Suite.class );
@@ -650,6 +795,7 @@ public class FilterFactoryTest
         assertTrue( "should run suites containing matching method", exactFilter.shouldRun( suite ) );
     }
 
+    @Test
     public void testShouldSkipSuitesNotContainingExactMethodName()
     {
         Filter exactFilter = createMethodFilter( "#otherMethod" );
@@ -661,6 +807,7 @@ public class FilterFactoryTest
         assertFalse( "should not run suites containing no matches", exactFilter.shouldRun( suite ) );
     }
 
+    @Test
     public void testSingleMethodWithJUnitCoreSuite()
     {
         Filter filter = createMethodFilter( "#testMethod" );
@@ -672,67 +819,44 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
-    /*public void testSuiteAggregator()
-        throws InitializationError
+    @Test
+    public void testShouldNotRunNonExistingMethodJUnitCoreSuite()
     {
+        Filter filter = createMethodFilter( "#nonExisting" );
+        JUnitCore core = new JUnitCore();
+        Result result = core.run( Request.classes( Suite.class ).filterWith( filter ) );
+        assertFalse( result.wasSuccessful() );
+        assertEquals( 1, result.getRunCount() );//running the Suite
+        assertEquals( 1, result.getFailureCount() );
+        assertEquals( 0, result.getIgnoreCount() );
+    }
 
-        class FilteringRequest
-            extends Request
-        {
-            private Runner filteredRunner;
-
-            public FilteringRequest( Request req, Filter filter )
-            {
-                try
-                {
-                    Runner runner = req.getRunner();
-                    filter.apply( runner );
-                    filteredRunner = runner;
-                }
-                catch ( NoTestsRemainException e )
-                {
-                    filteredRunner = null;
-                }
-            }
-
-            @Override
-            public Runner getRunner()
-            {
-                return filteredRunner;
-            }
-        }
+    @Test
+    public void testShouldRunNonExistingMethodJUnitCoreSuite()
+    {
+        Filter filter = createMethodFilter( "!#nonExisting" );
+        JUnitCore core = new JUnitCore();
+        Result result = core.run( Request.classes( Suite.class ).filterWith( filter ) );
+        assertTrue( result.wasSuccessful() );
+        assertEquals( 5, result.getRunCount() );
+        assertEquals( 0, result.getFailureCount() );
+        assertEquals( 0, result.getIgnoreCount() );
+    }
 
-        Request req = Request.classes( new Computer()
-        {
-            private final List<Runner> runners = new ArrayList<Runner>();
-
-            @Override
-            public Runner getSuite( RunnerBuilder builder, Class<?>[] classes )
-                throws InitializationError
-            {
-                super.getSuite( builder, classes );
-                return new org.junit.runners.Suite( (Class<?>) null, runners ) {};
-            }
-
-            @Override
-            protected Runner getRunner( RunnerBuilder builder, Class<?> testClass )
-                throws Throwable
-            {
-                Runner runner = new org.junit.runners.Suite( (Class<?>) null, Arrays.asList( super.getRunner( builder, testClass ) ) ) {};
-                runners.add( runner );
-                return runner;
-            }
-        }, Suite.class );
-        Filter filter = createMethodFilter( "FilterFactoryTest$Suite" );
-        Request request = new FilteringRequest( req, filter );
-        JUnitCore core = new JUnitCore();
-        Result result = core.run( request );
+    @Test
+    public void testClassAndMethodJUnitCoreSuite()
+    {
+        Filter filter = createMethodFilter( "FilterFactoryTest$FirstClass#testMethod" );
+        JUnitCore core = new JUnitCore();
+        Result result = core.run( Request.classes( Suite.class, FirstClass.class, SecondClass.class )
+                                      .filterWith( filter ) );
         assertTrue( result.wasSuccessful() );
         assertEquals( 2, result.getRunCount() );
         assertEquals( 0, result.getFailureCount() );
         assertEquals( 0, result.getIgnoreCount() );
-    }*/
+    }
 
+    @Test
     public void testSingleMethodWithJUnitCoreFirstClass()
     {
         Filter filter = createMethodFilter( "#testMethod" );
@@ -744,6 +868,7 @@ public class FilterFactoryTest
         assertEquals( 0, result.getIgnoreCount() );
     }
 
+    @Test
     public void testWithJUnitCoreFirstClassAndSingleMethod()
     {
         Filter filter = createMethodFilter( "FilterFactoryTest$FirstClass#testMethod" );
@@ -754,4 +879,126 @@ public class FilterFactoryTest
         assertEquals( 0, result.getFailureCount() );
         assertEquals( 0, result.getIgnoreCount() );
     }
+
+    @Test
+    public void testShouldRunSuite()
+    {
+        TestListResolver filter = new TestListResolver( "Su?te" );
+        filter = filter.createMethodFilters();
+        JUnitCore core = new JUnitCore();
+        Result result = core.run( Request.classes( Suite.class ).filterWith( new MethodFilter( filter ) ) );
+        assertTrue( result.wasSuccessful() );
+        assertEquals( 5, result.getRunCount() );
+        assertEquals( 0, result.getFailureCount() );
+        assertEquals( 0, result.getIgnoreCount() );
+    }
+
+    @Test
+    public void testShouldRunParameterized()
+    {
+        TestListResolver filter =
+            new TestListResolver( "#testAA[?]+testB?[?], "
+                                      + "PT#testC*, "
+                                      + "!PT.java#testCY[?],"
+                                      + "%regex[.*.tests.pt.PT.class#w.*|x.*T.*]" );
+        filter = filter.createMethodFilters();
+        JUnitCore core = new JUnitCore();
+        Result result = core.run( Request.classes( PT.class ).filterWith( new MethodFilter( filter ) ) );
+        assertTrue( result.wasSuccessful() );
+        assertEquals( 12, result.getRunCount() );
+        assertEquals( 0, result.getFailureCount() );
+        assertEquals( 0, result.getIgnoreCount() );
+    }
+
+    @Test
+    public void testShouldRunParameterizedWithPlusDelimiter()
+    {
+        // Running parameterized tests: w12T34, x12T34 and x12T35.
+        // Two parameters "x" and "y" in the test case PT.java change the method descriptions to the following ones:
+        // w12T34[0], w12T34[1]
+        // x12T34[0], x12T34[1]
+        // x12T35[0], x12T35[1]
+        TestListResolver filter =
+            new TestListResolver( "%regex[.*.PT.* # w.*|x(\\d+)T(\\d+)\\[(\\d+)\\]]" );
+        filter = filter.createMethodFilters();
+        JUnitCore core = new JUnitCore();
+        Result result = core.run( Request.classes( PT.class ).filterWith( new MethodFilter( filter ) ) );
+        assertTrue( result.wasSuccessful() );
+        assertEquals( 6, result.getRunCount() );
+        assertEquals( 0, result.getFailureCount() );
+        assertEquals( 0, result.getIgnoreCount() );
+    }
+
+    @Test
+    public void testTestListResolver()
+    {
+        assertFalse( new TestListResolver( "b/ATest.java" ).shouldRun( "tests/a/ATest.class", null ) );
+        assertFalse( new TestListResolver( "b/Test.java" ).shouldRun( "a/ATest.class", null ) );
+        assertTrue( new TestListResolver( "ATest.java" ).shouldRun( "tests/a/ATest.class", null ) );
+        assertTrue( new TestListResolver( "a/ATest.java" ).shouldRun( "a/ATest.class", null ) );
+        assertTrue( new TestListResolver( "**/ATest.java" ).shouldRun( "a/ATest.class", null ) );
+        Class<?> testsATest = org.apache.maven.surefire.common.junit48.tests.ATest.class;
+        Class<?> aTest = org.apache.maven.surefire.common.junit48.tests.a.ATest.class;
+        assertFalse( new TestListResolver( "b/ATest.java" ).shouldRun( testsATest, null ) );
+        assertFalse( new TestListResolver( "b/ATest.java" ).shouldRun( aTest, null ) );
+        assertTrue( new TestListResolver( "ATest.java" ).shouldRun( testsATest, null ) );
+        assertTrue( new TestListResolver( "a/ATest.java" ).shouldRun( aTest, null ) );
+        assertTrue( new TestListResolver( "**/ATest.java" ).shouldRun( aTest, null ) );
+    }
+
+    @Test
+    public void testMatchPatterns()
+    {
+        String sourceFile = "pkg" + File.separator + "MyTest.class";
+        boolean matchPattern =
+            MatchPatterns.from( "**" + File.separator + "MyTest.class" ).matches( sourceFile, true );
+        assertTrue( matchPattern );
+
+        matchPattern = MatchPatterns.from( "MyTest.class" ).matches( sourceFile, true );
+        assertFalse( matchPattern );
+
+        matchPattern = MatchPatterns.from( "MyTest.class" ).matches( "MyTest.class", true );
+        assertTrue( matchPattern );
+
+        matchPattern = MatchPatterns.from( "**" + File.separator + "MyTest.class" ).matches( "MyTest.class", true );
+        assertTrue( matchPattern );
+    }
+
+    @Test
+    public void testNegativePatternOnPackageLessClass()
+    {
+        String sourceFile = "pkg" + File.separator + "XMyTest.class";
+        assertFalse( new TestListResolver( "**/MyTest.java" ).shouldRun( sourceFile, null ) );
+        assertFalse( new TestListResolver( "MyTest.java" ).shouldRun( sourceFile, null ) );
+        assertFalse( new TestListResolver( "MyTest.java" ).shouldRun( "XMyTest.class", null ) );
+        assertFalse( new TestListResolver( "**/MyTest.java" ).shouldRun( "XMyTest.class", null ) );
+    }
+
+    @Test
+    public void testPatternOnPackageLessClass()
+    {
+        String sourceFile = "pkg" + File.separator + "MyTest.class";
+        assertTrue( new TestListResolver( "**/MyTest.java" ).shouldRun( sourceFile, null ) );
+        assertTrue( new TestListResolver( "MyTest.java" ).shouldRun( sourceFile, null ) );
+        assertTrue( new TestListResolver( "MyTest.java" ).shouldRun( "MyTest.class", null ) );
+        assertTrue( new TestListResolver( "**/MyTest.java" ).shouldRun( "MyTest.class", null ) );
+    }
+
+    @Test
+    public void testIncludesExcludes()
+    {
+        Collection<String> inc = Arrays.asList( "**/NotIncludedByDefault.java", "**/*Test.java" );
+        Collection<String> exc = Arrays.asList( "**/DontRunTest.*" );
+        TestListResolver resolver = new TestListResolver( inc, exc );
+        assertFalse( resolver.shouldRun( "org/test/DontRunTest.class", null ) );
+        assertTrue( resolver.shouldRun( "org/test/DefaultTest.class", null ) );
+        assertTrue( resolver.shouldRun( "org/test/NotIncludedByDefault.class", null ) );
+    }
+
+    @Test
+    public void testSimple()
+    {
+        TestListResolver resolver = new TestListResolver( "NotIncludedByDefault" );
+        assertTrue( resolver.shouldRun( "org/test/NotIncludedByDefault.class", null ) );
+    }
 }

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/ATest.java
----------------------------------------------------------------------
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/ATest.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/ATest.java
new file mode 100644
index 0000000..59cc2eb
--- /dev/null
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/ATest.java
@@ -0,0 +1,23 @@
+package org.apache.maven.surefire.common.junit48.tests;
+
+/*
+ * 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.
+ */
+public class ATest
+{
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/a/ATest.java
----------------------------------------------------------------------
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/a/ATest.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/a/ATest.java
new file mode 100644
index 0000000..333ffe8
--- /dev/null
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/a/ATest.java
@@ -0,0 +1,23 @@
+package org.apache.maven.surefire.common.junit48.tests.a;
+
+/*
+ * 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.
+ */
+public class ATest
+{
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/pt/PT.java
----------------------------------------------------------------------
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/pt/PT.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/pt/PT.java
new file mode 100644
index 0000000..d16153b
--- /dev/null
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/pt/PT.java
@@ -0,0 +1,86 @@
+package org.apache.maven.surefire.common.junit48.tests.pt;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.Arrays;
+
+@RunWith( Parameterized.class )
+public class PT
+{
+
+    public PT( String x )
+    {
+    }
+
+    @Parameterized.Parameters
+    public static Iterable<Object[]> data()
+    {
+        return Arrays.asList( new Object[][]{ { "x" }, { "y" } } );
+    }
+
+    @Test
+    public void testAA()
+    {
+    }
+
+    @Test
+    public void testB5()
+    {
+    }
+
+    @Test
+    public void testCX()
+    {
+    }
+
+    @Test
+    public void testCY()
+    {
+    }
+
+    @Test
+    public void w12T34()
+    {
+    }
+
+    @Test
+    public void x12T34()
+    {
+    }
+
+    @Test
+    public void x12T35()
+    {
+    }
+
+    @Test
+    public void x12t36()
+    {
+    }
+
+    @Test
+    public void y12t34()
+    {
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java b/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java
index 9957d1e..f30f895 100644
--- a/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java
+++ b/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java
@@ -164,7 +164,8 @@ public class JUnit4Provider
     {
         JUnitTestFailureListener failureListener = new JUnitTestFailureListener();
         listeners.addListener( failureListener );
-        execute( clazz, listeners, testResolver.isEmpty() ? null : new TestResolverFilter() );
+        boolean hasMethodFilter = testResolver != null && testResolver.hasMethodPatterns();
+        execute( clazz, listeners, hasMethodFilter ? new TestResolverFilter() : null );
 
         // Rerun failing tests if rerunFailingTestsCount is larger than 0
         if ( rerunFailingTestsCount > 0 )
@@ -288,10 +289,11 @@ public class JUnit4Provider
     private final class TestResolverFilter
         implements Filter
     {
+        private final TestListResolver methodFilter = JUnit4Provider.this.testResolver.createMethodFilters();
 
         public boolean shouldRun( Class<?> testClass, Method testMethod )
         {
-            return testResolver.shouldRun( testClass, testMethod.getName() );
+            return methodFilter.shouldRun( testClass, testMethod.getName() );
         }
     }
 

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java
index 9cf8e34..3276b4e 100644
--- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java
+++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java
@@ -70,11 +70,11 @@ public class JUnitCoreProvider
 
     private TestsToRun testsToRun;
 
-    private JUnit48Reflector jUnit48Reflector;
+    private final JUnit48Reflector jUnit48Reflector;
 
-    private RunOrderCalculator runOrderCalculator;
+    private final RunOrderCalculator runOrderCalculator;
 
-    private TestListResolver testResolver;
+    private final TestListResolver testResolver;
 
     public JUnitCoreProvider( ProviderParameters providerParameters )
     {
@@ -84,23 +84,10 @@ public class JUnitCoreProvider
         runOrderCalculator = providerParameters.getRunOrderCalculator();
         jUnitCoreParameters = new JUnitCoreParameters( providerParameters.getProviderProperties() );
         scannerFilter = new JUnit48TestChecker( testClassLoader );
-        System.out.println( "TIBOR providerParameters=" + providerParameters );
-        System.out.println( "TIBOR providerParameters.getTestRequest()=" + providerParameters.getTestRequest() );
-        System.out.println( "TIBOR providerParameters.getTestRequest().getTestListResolver().getPluginParameterTest()="
-                                + providerParameters.getTestRequest().getTestListResolver().getPluginParameterTest() );
-        System.out.println( "TIBOR includes: "
-                                + providerParameters.getTestRequest().getTestListResolver().getIncludedFilters() );
-        System.out.println( "TIBOR excludes: "
-                                + providerParameters.getTestRequest().getTestListResolver().getExcludedFilters() );
-        System.out.println( "TIBOR includes: "
-                                + providerParameters.getTestRequest().getTestListResolver().getIncludedFilters()
-            .iterator().next() );
         testResolver = providerParameters.getTestRequest().getTestListResolver();
         rerunFailingTestsCount = providerParameters.getTestRequest().getRerunFailingTestsCount();
-
-        customRunListeners =
-            JUnit4RunListenerFactory.createCustomListeners(
-                providerParameters.getProviderProperties().getProperty( "listener" ) );
+        customRunListeners = JUnit4RunListenerFactory.createCustomListeners(
+            providerParameters.getProviderProperties().getProperty( "listener" ) );
         jUnit48Reflector = new JUnit48Reflector( testClassLoader );
     }
 
@@ -211,8 +198,9 @@ public class JUnitCoreProvider
     {
         final FilterFactory factory = new FilterFactory( testClassLoader );
         Filter groupFilter = factory.createGroupFilter( providerParameters.getProviderProperties() );
-        boolean onlyGroups = testResolver.isEmpty();
-        return onlyGroups ? groupFilter : factory.and( groupFilter, factory.createMethodFilter( testResolver ) );
+        TestListResolver methodFilter = createMethodFilter();
+        boolean onlyGroups = methodFilter == null || methodFilter.isEmpty();
+        return onlyGroups ? groupFilter : factory.and( groupFilter, factory.createMethodFilter( methodFilter ) );
     }
 
     private TestsToRun scanClassPath()
@@ -220,4 +208,9 @@ public class JUnitCoreProvider
         TestsToRun scanned = scanResult.applyFilter( scannerFilter, testClassLoader );
         return runOrderCalculator.orderTestClasses( scanned );
     }
+
+    private TestListResolver createMethodFilter()
+    {
+        return testResolver == null ? null : testResolver.createMethodFilters();
+    }
 }

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-providers/surefire-testng-utils/src/main/java/org/apache/maven/surefire/testng/utils/MethodSelector.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-testng-utils/src/main/java/org/apache/maven/surefire/testng/utils/MethodSelector.java b/surefire-providers/surefire-testng-utils/src/main/java/org/apache/maven/surefire/testng/utils/MethodSelector.java
index bfbc495..cdb53f0 100644
--- a/surefire-providers/surefire-testng-utils/src/main/java/org/apache/maven/surefire/testng/utils/MethodSelector.java
+++ b/surefire-providers/surefire-testng-utils/src/main/java/org/apache/maven/surefire/testng/utils/MethodSelector.java
@@ -36,7 +36,6 @@ import org.testng.ITestNGMethod;
 public class MethodSelector
     implements IMethodSelector
 {
-
     private static TestListResolver testListResolver = null;
 
     public void setTestMethods( List arg0 )
@@ -51,7 +50,6 @@ public class MethodSelector
             || testngMethod.isAfterGroupsConfiguration() || testngMethod.isAfterMethodConfiguration()
             || testngMethod.isAfterSuiteConfiguration() || testngMethod.isAfterTestConfiguration()
             || shouldRun( testngMethod );
-
     }
 
     public static void setTestListResolver( TestListResolver testListResolver )
@@ -62,6 +60,7 @@ public class MethodSelector
     private static boolean shouldRun( ITestNGMethod test )
     {
         TestListResolver resolver = MethodSelector.testListResolver;
-        return resolver != null && resolver.shouldRun( test.getRealClass(), test.getMethodName() );
+        boolean hasTestResolver = resolver != null && !resolver.isEmpty();
+        return hasTestResolver && resolver.shouldRun( test.getRealClass(), test.getMethodName() );
     }
 }

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java b/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java
index d7f6678..32511bf 100644
--- a/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java
+++ b/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java
@@ -67,7 +67,7 @@ public class TestNGDirectoryTestSuite
 
     private final ScanResult scanResult;
 
-    private final TestListResolver testListResolver;
+    private final TestListResolver methodFilter;
 
     private final RunOrderCalculator runOrderCalculator;
 
@@ -78,7 +78,7 @@ public class TestNGDirectoryTestSuite
     private Class<? extends Annotation> junitTestAnnotation;
 
     public TestNGDirectoryTestSuite( String testSourceDirectory, Properties confOptions, File reportsDirectory,
-                                     TestListResolver testListResolver, RunOrderCalculator runOrderCalculator,
+                                     TestListResolver methodFilter, RunOrderCalculator runOrderCalculator,
                                      ScanResult scanResult )
     {
 
@@ -89,7 +89,7 @@ public class TestNGDirectoryTestSuite
         this.testSourceDirectory = testSourceDirectory;
         this.reportsDirectory = reportsDirectory;
         this.scanResult = scanResult;
-        this.testListResolver = testListResolver;
+        this.methodFilter = methodFilter;
         this.junitTestClass = findJUnitTestClass();
         this.junitRunWithAnnotation = findJUnitRunWithAnnotation();
         this.junitTestAnnotation = findJUnitTestAnnotation();
@@ -128,7 +128,7 @@ public class TestNGDirectoryTestSuite
         final Map optionsToUse = isJUnitTest( testClass ) ? junitOptions : options;
 
         TestNGExecutor.run( new Class[]{ testClass }, testSourceDirectory, optionsToUse, reporter, this,
-                            reportsDirectory, testListResolver );
+                            reportsDirectory, methodFilter );
 
         finishTestSuite( reporter, this );
     }
@@ -204,14 +204,14 @@ public class TestNGDirectoryTestSuite
         Class[] testClasses = testNgTestClasses.toArray( new Class[testNgTestClasses.size()] );
 
         TestNGExecutor.run( testClasses, this.testSourceDirectory, options, reporterManager, this,
-                            testNgReportsDirectory, testListResolver );
+                            testNgReportsDirectory, methodFilter );
 
         if ( junitTestClasses.size() > 0 )
         {
             testClasses = junitTestClasses.toArray( new Class[junitTestClasses.size()] );
 
             TestNGExecutor.run( testClasses, testSourceDirectory, junitOptions, reporterManager, this,
-                                junitReportsDirectory, testListResolver );
+                                junitReportsDirectory, methodFilter );
         }
 
         finishTestSuite( reporterManager, this );
@@ -281,7 +281,7 @@ public class TestNGDirectoryTestSuite
         startTestSuite( reporter, this );
 
         TestNGExecutor.run( new Class[] { testSet.getTestClass() }, this.testSourceDirectory, this.options, reporter,
-                            this, reportsDirectory, testListResolver );
+                            this, reportsDirectory, methodFilter );
 
         finishTestSuite( reporter, this );
     }

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/866a535b/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java b/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java
index e50d643..fcabbc7 100644
--- a/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java
+++ b/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java
@@ -65,7 +65,7 @@ public class TestNGExecutor
     }
 
     public static void run( Class[] testClasses, String testSourceDirectory, Map options, RunListener reportManager,
-                            TestNgTestSuite suite, File reportsDirectory, TestListResolver testListResolver )
+                            TestNgTestSuite suite, File reportsDirectory, TestListResolver methodFilter )
         throws TestSetFailedException
     {
         TestNG testng = new TestNG( true );
@@ -74,7 +74,7 @@ public class TestNGExecutor
         System.out.println( "Configuring TestNG with: " + configurator.getClass().getSimpleName() );
 
         XmlMethodSelector groupMatchingSelector = createGroupMatchingSelector( options );
-        XmlMethodSelector methodNameFilteringSelector = createMethodNameFilteringSelector( testListResolver );
+        XmlMethodSelector methodNameFilteringSelector = createMethodNameFilteringSelector( methodFilter );
 
         Map<String, SuiteAndNamedTests> suitesNames = new HashMap<String, SuiteAndNamedTests>();
 
@@ -176,10 +176,10 @@ public class TestNGExecutor
     }
 
     @SuppressWarnings( "checkstyle:magicnumber" )
-    private static XmlMethodSelector createMethodNameFilteringSelector( TestListResolver testListResolver )
+    private static XmlMethodSelector createMethodNameFilteringSelector( TestListResolver methodFilter )
         throws TestSetFailedException
     {
-        if ( testListResolver != null && !testListResolver.isEmpty() )
+        if ( methodFilter != null && !methodFilter.isEmpty() )
         {
             // the class is available in the testClassPath
             String clazzName = "org.apache.maven.surefire.testng.utils.MethodSelector";
@@ -187,7 +187,7 @@ public class TestNGExecutor
             {
                 Class<?> clazz = Class.forName( clazzName );
                 Method method = clazz.getMethod( "setTestListResolver", TestListResolver.class );
-                method.invoke( null, testListResolver );
+                method.invoke( null, methodFilter );
             }
             catch ( Exception e )
             {