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 2017/08/03 14:37:59 UTC

[09/17] maven-surefire git commit: Move provider classes to maven surefire package

Move provider classes to maven surefire package


Project: http://git-wip-us.apache.org/repos/asf/maven-surefire/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven-surefire/commit/4b8c1a47
Tree: http://git-wip-us.apache.org/repos/asf/maven-surefire/tree/4b8c1a47
Diff: http://git-wip-us.apache.org/repos/asf/maven-surefire/diff/4b8c1a47

Branch: refs/heads/junit5
Commit: 4b8c1a47ab348e16f3f9ec0938d8312cb7546f4c
Parents: 78229d5
Author: Benedikt Ritter <br...@apache.org>
Authored: Mon Feb 6 19:14:53 2017 +0100
Committer: Benedikt Ritter <br...@apache.org>
Committed: Mon Jun 12 08:18:35 2017 +0200

----------------------------------------------------------------------
 .../surefire/junit5/JUnitPlatformProvider.java  | 202 ++++++++++++
 .../surefire/junit5/RunListenerAdapter.java     | 148 +++++++++
 .../surefire/junit5/TestPlanScannerFilter.java  |  64 ++++
 .../provider/JUnitPlatformProvider.java         | 202 ------------
 .../surefire/provider/RunListenerAdapter.java   | 148 ---------
 .../provider/TestPlanScannerFilter.java         |  64 ----
 ....maven.surefire.providerapi.SurefireProvider |   2 +-
 .../junit5/JUnitPlatformProviderTests.java      | 325 +++++++++++++++++++
 .../junit5/RunListenerAdapterTests.java         | 262 +++++++++++++++
 .../junit5/TestPlanScannerFilterTests.java      | 190 +++++++++++
 .../provider/JUnitPlatformProviderTests.java    | 325 -------------------
 .../provider/RunListenerAdapterTests.java       | 263 ---------------
 .../provider/TestPlanScannerFilterTests.java    | 190 -----------
 13 files changed, 1192 insertions(+), 1193 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/4b8c1a47/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/JUnitPlatformProvider.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/JUnitPlatformProvider.java b/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/JUnitPlatformProvider.java
new file mode 100644
index 0000000..ee93165
--- /dev/null
+++ b/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/JUnitPlatformProvider.java
@@ -0,0 +1,202 @@
+package org.apache.maven.surefire.junit5;
+
+/*
+ * 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.providerapi.AbstractProvider;
+import org.apache.maven.surefire.providerapi.ProviderParameters;
+import org.apache.maven.surefire.report.ReporterException;
+import org.apache.maven.surefire.report.ReporterFactory;
+import org.apache.maven.surefire.report.RunListener;
+import org.apache.maven.surefire.report.SimpleReportEntry;
+import org.apache.maven.surefire.suite.RunResult;
+import org.apache.maven.surefire.testset.TestSetFailedException;
+import org.apache.maven.surefire.util.TestsToRun;
+import org.junit.platform.engine.Filter;
+import org.junit.platform.launcher.Launcher;
+import org.junit.platform.launcher.LauncherDiscoveryRequest;
+import org.junit.platform.launcher.TagFilter;
+import org.junit.platform.launcher.core.LauncherFactory;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass;
+import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.request;
+
+/**
+ * @since 1.0
+ */
+public class JUnitPlatformProvider
+    extends AbstractProvider
+{
+
+    // Parameter names processed to determine which @Tags should be executed.
+    static final String EXCLUDE_GROUPS = "excludedGroups";
+
+    static final String EXCLUDE_TAGS = "excludeTags";
+
+    static final String INCLUDE_GROUPS = "groups";
+
+    static final String INCLUDE_TAGS = "includeTags";
+
+    static final String EXCEPTION_MESSAGE_BOTH_NOT_ALLOWED = "The " + INCLUDE_GROUPS + " and " + INCLUDE_TAGS
+            + " parameters (or the " + EXCLUDE_GROUPS + " and " + EXCLUDE_TAGS + " parameters) are synonyms - "
+            + "only one of each is allowed (though neither is required).";
+
+    private final ProviderParameters parameters;
+
+    private final Launcher launcher;
+
+    final Filter<?>[] includeAndExcludeFilters;
+
+    public JUnitPlatformProvider( ProviderParameters parameters )
+    {
+        this( parameters, LauncherFactory.create() );
+    }
+
+    JUnitPlatformProvider( ProviderParameters parameters, Launcher launcher )
+    {
+        this.parameters = parameters;
+        this.launcher = launcher;
+        this.includeAndExcludeFilters = getIncludeAndExcludeFilters();
+        Logger.getLogger( "org.junit" ).setLevel( Level.WARNING );
+    }
+
+    @Override
+    public Iterable<Class<?>> getSuites()
+    {
+        return scanClasspath();
+    }
+
+    @Override
+    public RunResult invoke( Object forkTestSet )
+            throws TestSetFailedException, ReporterException, InvocationTargetException
+    {
+        if ( forkTestSet instanceof TestsToRun )
+        {
+            return invokeAllTests( (TestsToRun) forkTestSet );
+        }
+        else if ( forkTestSet instanceof Class )
+        {
+            return invokeAllTests( TestsToRun.fromClass( (Class<?>) forkTestSet ) );
+        }
+        else if ( forkTestSet == null )
+        {
+            return invokeAllTests( scanClasspath() );
+        }
+        else
+        {
+            throw new IllegalArgumentException( "Unexpected value of forkTestSet: " + forkTestSet );
+        }
+    }
+
+    private TestsToRun scanClasspath()
+    {
+        TestsToRun scannedClasses = parameters.getScanResult().applyFilter(
+            new TestPlanScannerFilter( launcher, includeAndExcludeFilters ), parameters.getTestClassLoader() );
+        return parameters.getRunOrderCalculator().orderTestClasses( scannedClasses );
+    }
+
+    private RunResult invokeAllTests( TestsToRun testsToRun )
+    {
+        RunResult runResult;
+        ReporterFactory reporterFactory = parameters.getReporterFactory();
+        try
+        {
+            RunListener runListener = reporterFactory.createReporter();
+            launcher.registerTestExecutionListeners( new RunListenerAdapter( runListener ) );
+
+            for ( Class<?> testClass : testsToRun )
+            {
+                invokeSingleClass( testClass, runListener );
+            }
+        }
+        finally
+        {
+            runResult = reporterFactory.close();
+        }
+        return runResult;
+    }
+
+    private void invokeSingleClass( Class<?> testClass, RunListener runListener )
+    {
+        SimpleReportEntry classEntry = new SimpleReportEntry( getClass().getName(), testClass.getName() );
+        runListener.testSetStarting( classEntry );
+
+        LauncherDiscoveryRequest discoveryRequest = request().selectors( selectClass( testClass ) ).filters(
+            includeAndExcludeFilters ).build();
+        launcher.execute( discoveryRequest );
+
+        runListener.testSetCompleted( classEntry );
+    }
+
+    private Filter<?>[] getIncludeAndExcludeFilters()
+    {
+        List<Filter<?>> filters = new ArrayList<>();
+
+        Optional<List<String>> includes = getGroupsOrTags( getPropertiesList( INCLUDE_GROUPS ),
+            getPropertiesList( INCLUDE_TAGS ) );
+        includes.map( TagFilter::includeTags ).ifPresent( filters::add );
+
+        Optional<List<String>> excludes = getGroupsOrTags( getPropertiesList( EXCLUDE_GROUPS ),
+            getPropertiesList( EXCLUDE_TAGS ) );
+        excludes.map( TagFilter::excludeTags ).ifPresent( filters::add );
+
+        return filters.toArray( new Filter<?>[filters.size()] );
+    }
+
+    private Optional<List<String>> getPropertiesList( String key )
+    {
+        List<String> compoundProperties = null;
+        String property = parameters.getProviderProperties().get( key );
+        if ( property != null )
+        {
+            compoundProperties = Arrays.asList( property.split( "[, ]+" ) );
+        }
+        return Optional.ofNullable( compoundProperties );
+    }
+
+    private Optional<List<String>> getGroupsOrTags( Optional<List<String>> groups, Optional<List<String>> tags )
+    {
+        Optional<List<String>> elements = Optional.empty();
+
+        if ( groups.isPresent() && tags.isPresent() )
+        {
+            throw new IllegalStateException( EXCEPTION_MESSAGE_BOTH_NOT_ALLOWED );
+        }
+
+        if ( groups.isPresent() )
+        {
+            elements = groups;
+        }
+        else if ( tags.isPresent() )
+        {
+            elements = tags;
+        }
+
+        return elements;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/4b8c1a47/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/RunListenerAdapter.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/RunListenerAdapter.java b/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/RunListenerAdapter.java
new file mode 100644
index 0000000..8e1a2e2
--- /dev/null
+++ b/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/RunListenerAdapter.java
@@ -0,0 +1,148 @@
+package org.apache.maven.surefire.junit5;
+
+/*
+ * 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 static org.apache.maven.surefire.report.SimpleReportEntry.ignored;
+import static org.junit.platform.engine.TestExecutionResult.Status.ABORTED;
+import static org.junit.platform.engine.TestExecutionResult.Status.FAILED;
+
+import java.util.Optional;
+
+import org.apache.maven.surefire.report.PojoStackTraceWriter;
+import org.apache.maven.surefire.report.RunListener;
+import org.apache.maven.surefire.report.SimpleReportEntry;
+import org.apache.maven.surefire.report.StackTraceWriter;
+import org.junit.platform.engine.TestExecutionResult;
+import org.junit.platform.engine.TestSource;
+import org.junit.platform.engine.support.descriptor.ClassSource;
+import org.junit.platform.engine.support.descriptor.MethodSource;
+import org.junit.platform.launcher.TestExecutionListener;
+import org.junit.platform.launcher.TestIdentifier;
+import org.junit.platform.launcher.TestPlan;
+
+/**
+ * @since 1.0
+ */
+final class RunListenerAdapter
+    implements TestExecutionListener
+{
+
+    private final RunListener runListener;
+
+    private Optional<TestPlan> testPlan = Optional.empty();
+
+    public RunListenerAdapter( RunListener runListener )
+    {
+        this.runListener = runListener;
+    }
+
+    @Override
+    public void testPlanExecutionStarted( TestPlan testPlan )
+    {
+        this.testPlan = Optional.of( testPlan );
+    }
+
+    @Override
+    public void testPlanExecutionFinished( TestPlan testPlan )
+    {
+        this.testPlan = Optional.empty();
+    }
+
+    @Override
+    public void executionStarted( TestIdentifier testIdentifier )
+    {
+        if ( testIdentifier.isTest() )
+        {
+            runListener.testStarting( createReportEntry( testIdentifier, Optional.empty() ) );
+        }
+    }
+
+    @Override
+    public void executionSkipped( TestIdentifier testIdentifier, String reason )
+    {
+        String source = getClassName( testIdentifier ).orElseGet( () -> parentDisplayName( testIdentifier ) );
+        runListener.testSkipped( ignored( source, testIdentifier.getDisplayName(), reason ) );
+    }
+
+    @Override
+    public void executionFinished( TestIdentifier testIdentifier, TestExecutionResult testExecutionResult )
+    {
+        if ( testExecutionResult.getStatus() == ABORTED )
+        {
+            runListener.testAssumptionFailure( createReportEntry( testIdentifier,
+                    testExecutionResult.getThrowable() ) );
+        }
+        else if ( testExecutionResult.getStatus() == FAILED )
+        {
+            runListener.testFailed( createReportEntry( testIdentifier, testExecutionResult.getThrowable() ) );
+        }
+        else if ( testIdentifier.isTest() )
+        {
+            runListener.testSucceeded( createReportEntry( testIdentifier, Optional.empty() ) );
+        }
+    }
+
+    private SimpleReportEntry createReportEntry( TestIdentifier testIdentifier, Optional<Throwable> throwable )
+    {
+        Optional<String> className = getClassName( testIdentifier );
+        if ( className.isPresent() )
+        {
+            StackTraceWriter traceWriter = new PojoStackTraceWriter( className.get(),
+                getMethodName( testIdentifier ).orElse( "" ), throwable.orElse( null ) );
+            return new SimpleReportEntry( className.get(), testIdentifier.getDisplayName(), traceWriter, (Integer) null );
+        }
+        else
+        {
+            return new SimpleReportEntry( parentDisplayName( testIdentifier ), testIdentifier.getDisplayName(), (Integer) null );
+        }
+    }
+
+    private Optional<String> getClassName( TestIdentifier testIdentifier )
+    {
+        TestSource testSource = testIdentifier.getSource().orElse( null );
+        if ( testSource instanceof ClassSource )
+        {
+            return Optional.of( ( (ClassSource) testSource ).getJavaClass().getName() );
+        }
+        if ( testSource instanceof MethodSource )
+        {
+            return Optional.of( ( (MethodSource) testSource ).getClassName() );
+        }
+        return Optional.empty();
+    }
+
+    private Optional<String> getMethodName( TestIdentifier testIdentifier )
+    {
+        TestSource testSource = testIdentifier.getSource().orElse( null );
+        if ( testSource instanceof MethodSource )
+        {
+            return Optional.of( ( (MethodSource) testSource ).getMethodName() );
+        }
+        return Optional.empty();
+    }
+
+    private String parentDisplayName( TestIdentifier testIdentifier )
+    {
+        return testPlan
+            .flatMap( plan -> plan.getParent( testIdentifier ) )
+            .map( TestIdentifier::getDisplayName )
+            .orElseGet( testIdentifier::getUniqueId );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/4b8c1a47/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/TestPlanScannerFilter.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/TestPlanScannerFilter.java b/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/TestPlanScannerFilter.java
new file mode 100644
index 0000000..123c58d
--- /dev/null
+++ b/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/TestPlanScannerFilter.java
@@ -0,0 +1,64 @@
+package org.apache.maven.surefire.junit5;
+
+/*
+ * 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 static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass;
+import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.request;
+
+import java.util.function.Predicate;
+
+import org.apache.maven.surefire.util.ScannerFilter;
+import org.junit.platform.engine.Filter;
+import org.junit.platform.launcher.Launcher;
+import org.junit.platform.launcher.LauncherDiscoveryRequest;
+import org.junit.platform.launcher.TestIdentifier;
+import org.junit.platform.launcher.TestPlan;
+
+/**
+ * @since 1.0
+ */
+final class TestPlanScannerFilter
+    implements ScannerFilter
+{
+
+    private static final Predicate<TestIdentifier> HAS_TESTS = testIdentifier -> testIdentifier.isTest()
+            || testIdentifier.isContainer();
+
+    private final Launcher launcher;
+
+    private final Filter<?>[] includeAndExcludeFilters;
+
+    public TestPlanScannerFilter( Launcher launcher, Filter<?>[] includeAndExcludeFilters )
+    {
+        this.launcher = launcher;
+        this.includeAndExcludeFilters = includeAndExcludeFilters;
+    }
+
+    @Override
+    @SuppressWarnings( "rawtypes" )
+    public boolean accept( Class testClass )
+    {
+        LauncherDiscoveryRequest discoveryRequest = request().selectors( selectClass( testClass ) ).filters(
+            includeAndExcludeFilters ).build();
+        TestPlan testPlan = launcher.discover( discoveryRequest );
+        return testPlan.countTestIdentifiers( HAS_TESTS ) > 0;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/4b8c1a47/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/JUnitPlatformProvider.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/JUnitPlatformProvider.java b/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/JUnitPlatformProvider.java
deleted file mode 100644
index 3ee8acb..0000000
--- a/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/JUnitPlatformProvider.java
+++ /dev/null
@@ -1,202 +0,0 @@
-package org.junit.platform.surefire.provider;
-
-/*
- * 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.providerapi.AbstractProvider;
-import org.apache.maven.surefire.providerapi.ProviderParameters;
-import org.apache.maven.surefire.report.ReporterException;
-import org.apache.maven.surefire.report.ReporterFactory;
-import org.apache.maven.surefire.report.RunListener;
-import org.apache.maven.surefire.report.SimpleReportEntry;
-import org.apache.maven.surefire.suite.RunResult;
-import org.apache.maven.surefire.testset.TestSetFailedException;
-import org.apache.maven.surefire.util.TestsToRun;
-import org.junit.platform.engine.Filter;
-import org.junit.platform.launcher.Launcher;
-import org.junit.platform.launcher.LauncherDiscoveryRequest;
-import org.junit.platform.launcher.TagFilter;
-import org.junit.platform.launcher.core.LauncherFactory;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Optional;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass;
-import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.request;
-
-/**
- * @since 1.0
- */
-public class JUnitPlatformProvider
-    extends AbstractProvider
-{
-
-    // Parameter names processed to determine which @Tags should be executed.
-    static final String EXCLUDE_GROUPS = "excludedGroups";
-
-    static final String EXCLUDE_TAGS = "excludeTags";
-
-    static final String INCLUDE_GROUPS = "groups";
-
-    static final String INCLUDE_TAGS = "includeTags";
-
-    static final String EXCEPTION_MESSAGE_BOTH_NOT_ALLOWED = "The " + INCLUDE_GROUPS + " and " + INCLUDE_TAGS
-            + " parameters (or the " + EXCLUDE_GROUPS + " and " + EXCLUDE_TAGS + " parameters) are synonyms - "
-            + "only one of each is allowed (though neither is required).";
-
-    private final ProviderParameters parameters;
-
-    private final Launcher launcher;
-
-    final Filter<?>[] includeAndExcludeFilters;
-
-    public JUnitPlatformProvider( ProviderParameters parameters )
-    {
-        this( parameters, LauncherFactory.create() );
-    }
-
-    JUnitPlatformProvider( ProviderParameters parameters, Launcher launcher )
-    {
-        this.parameters = parameters;
-        this.launcher = launcher;
-        this.includeAndExcludeFilters = getIncludeAndExcludeFilters();
-        Logger.getLogger( "org.junit" ).setLevel( Level.WARNING );
-    }
-
-    @Override
-    public Iterable<Class<?>> getSuites()
-    {
-        return scanClasspath();
-    }
-
-    @Override
-    public RunResult invoke( Object forkTestSet )
-            throws TestSetFailedException, ReporterException, InvocationTargetException
-    {
-        if ( forkTestSet instanceof TestsToRun )
-        {
-            return invokeAllTests( (TestsToRun) forkTestSet );
-        }
-        else if ( forkTestSet instanceof Class )
-        {
-            return invokeAllTests( TestsToRun.fromClass( (Class<?>) forkTestSet ) );
-        }
-        else if ( forkTestSet == null )
-        {
-            return invokeAllTests( scanClasspath() );
-        }
-        else
-        {
-            throw new IllegalArgumentException( "Unexpected value of forkTestSet: " + forkTestSet );
-        }
-    }
-
-    private TestsToRun scanClasspath()
-    {
-        TestsToRun scannedClasses = parameters.getScanResult().applyFilter(
-            new TestPlanScannerFilter( launcher, includeAndExcludeFilters ), parameters.getTestClassLoader() );
-        return parameters.getRunOrderCalculator().orderTestClasses( scannedClasses );
-    }
-
-    private RunResult invokeAllTests( TestsToRun testsToRun )
-    {
-        RunResult runResult;
-        ReporterFactory reporterFactory = parameters.getReporterFactory();
-        try
-        {
-            RunListener runListener = reporterFactory.createReporter();
-            launcher.registerTestExecutionListeners( new RunListenerAdapter( runListener ) );
-
-            for ( Class<?> testClass : testsToRun )
-            {
-                invokeSingleClass( testClass, runListener );
-            }
-        }
-        finally
-        {
-            runResult = reporterFactory.close();
-        }
-        return runResult;
-    }
-
-    private void invokeSingleClass( Class<?> testClass, RunListener runListener )
-    {
-        SimpleReportEntry classEntry = new SimpleReportEntry( getClass().getName(), testClass.getName() );
-        runListener.testSetStarting( classEntry );
-
-        LauncherDiscoveryRequest discoveryRequest = request().selectors( selectClass( testClass ) ).filters(
-            includeAndExcludeFilters ).build();
-        launcher.execute( discoveryRequest );
-
-        runListener.testSetCompleted( classEntry );
-    }
-
-    private Filter<?>[] getIncludeAndExcludeFilters()
-    {
-        List<Filter<?>> filters = new ArrayList<>();
-
-        Optional<List<String>> includes = getGroupsOrTags( getPropertiesList( INCLUDE_GROUPS ),
-            getPropertiesList( INCLUDE_TAGS ) );
-        includes.map( TagFilter::includeTags ).ifPresent( filters::add );
-
-        Optional<List<String>> excludes = getGroupsOrTags( getPropertiesList( EXCLUDE_GROUPS ),
-            getPropertiesList( EXCLUDE_TAGS ) );
-        excludes.map( TagFilter::excludeTags ).ifPresent( filters::add );
-
-        return filters.toArray( new Filter<?>[filters.size()] );
-    }
-
-    private Optional<List<String>> getPropertiesList( String key )
-    {
-        List<String> compoundProperties = null;
-        String property = parameters.getProviderProperties().get( key );
-        if ( property != null )
-        {
-            compoundProperties = Arrays.asList( property.split( "[, ]+" ) );
-        }
-        return Optional.ofNullable( compoundProperties );
-    }
-
-    private Optional<List<String>> getGroupsOrTags( Optional<List<String>> groups, Optional<List<String>> tags )
-    {
-        Optional<List<String>> elements = Optional.empty();
-
-        if ( groups.isPresent() && tags.isPresent() )
-        {
-            throw new IllegalStateException( EXCEPTION_MESSAGE_BOTH_NOT_ALLOWED );
-        }
-
-        if ( groups.isPresent() )
-        {
-            elements = groups;
-        }
-        else if ( tags.isPresent() )
-        {
-            elements = tags;
-        }
-
-        return elements;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/4b8c1a47/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/RunListenerAdapter.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/RunListenerAdapter.java b/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/RunListenerAdapter.java
deleted file mode 100644
index 6319a14..0000000
--- a/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/RunListenerAdapter.java
+++ /dev/null
@@ -1,148 +0,0 @@
-package org.junit.platform.surefire.provider;
-
-/*
- * 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 static org.apache.maven.surefire.report.SimpleReportEntry.ignored;
-import static org.junit.platform.engine.TestExecutionResult.Status.ABORTED;
-import static org.junit.platform.engine.TestExecutionResult.Status.FAILED;
-
-import java.util.Optional;
-
-import org.apache.maven.surefire.report.PojoStackTraceWriter;
-import org.apache.maven.surefire.report.RunListener;
-import org.apache.maven.surefire.report.SimpleReportEntry;
-import org.apache.maven.surefire.report.StackTraceWriter;
-import org.junit.platform.engine.TestExecutionResult;
-import org.junit.platform.engine.TestSource;
-import org.junit.platform.engine.support.descriptor.ClassSource;
-import org.junit.platform.engine.support.descriptor.MethodSource;
-import org.junit.platform.launcher.TestExecutionListener;
-import org.junit.platform.launcher.TestIdentifier;
-import org.junit.platform.launcher.TestPlan;
-
-/**
- * @since 1.0
- */
-final class RunListenerAdapter
-    implements TestExecutionListener
-{
-
-    private final RunListener runListener;
-
-    private Optional<TestPlan> testPlan = Optional.empty();
-
-    public RunListenerAdapter( RunListener runListener )
-    {
-        this.runListener = runListener;
-    }
-
-    @Override
-    public void testPlanExecutionStarted( TestPlan testPlan )
-    {
-        this.testPlan = Optional.of( testPlan );
-    }
-
-    @Override
-    public void testPlanExecutionFinished( TestPlan testPlan )
-    {
-        this.testPlan = Optional.empty();
-    }
-
-    @Override
-    public void executionStarted( TestIdentifier testIdentifier )
-    {
-        if ( testIdentifier.isTest() )
-        {
-            runListener.testStarting( createReportEntry( testIdentifier, Optional.empty() ) );
-        }
-    }
-
-    @Override
-    public void executionSkipped( TestIdentifier testIdentifier, String reason )
-    {
-        String source = getClassName( testIdentifier ).orElseGet( () -> parentDisplayName( testIdentifier ) );
-        runListener.testSkipped( ignored( source, testIdentifier.getDisplayName(), reason ) );
-    }
-
-    @Override
-    public void executionFinished( TestIdentifier testIdentifier, TestExecutionResult testExecutionResult )
-    {
-        if ( testExecutionResult.getStatus() == ABORTED )
-        {
-            runListener.testAssumptionFailure( createReportEntry( testIdentifier,
-                    testExecutionResult.getThrowable() ) );
-        }
-        else if ( testExecutionResult.getStatus() == FAILED )
-        {
-            runListener.testFailed( createReportEntry( testIdentifier, testExecutionResult.getThrowable() ) );
-        }
-        else if ( testIdentifier.isTest() )
-        {
-            runListener.testSucceeded( createReportEntry( testIdentifier, Optional.empty() ) );
-        }
-    }
-
-    private SimpleReportEntry createReportEntry( TestIdentifier testIdentifier, Optional<Throwable> throwable )
-    {
-        Optional<String> className = getClassName( testIdentifier );
-        if ( className.isPresent() )
-        {
-            StackTraceWriter traceWriter = new PojoStackTraceWriter( className.get(),
-                getMethodName( testIdentifier ).orElse( "" ), throwable.orElse( null ) );
-            return new SimpleReportEntry( className.get(), testIdentifier.getDisplayName(), traceWriter, (Integer) null );
-        }
-        else
-        {
-            return new SimpleReportEntry( parentDisplayName( testIdentifier ), testIdentifier.getDisplayName(), (Integer) null );
-        }
-    }
-
-    private Optional<String> getClassName( TestIdentifier testIdentifier )
-    {
-        TestSource testSource = testIdentifier.getSource().orElse( null );
-        if ( testSource instanceof ClassSource )
-        {
-            return Optional.of( ( (ClassSource) testSource ).getJavaClass().getName() );
-        }
-        if ( testSource instanceof MethodSource )
-        {
-            return Optional.of( ( (MethodSource) testSource ).getClassName() );
-        }
-        return Optional.empty();
-    }
-
-    private Optional<String> getMethodName( TestIdentifier testIdentifier )
-    {
-        TestSource testSource = testIdentifier.getSource().orElse( null );
-        if ( testSource instanceof MethodSource )
-        {
-            return Optional.of( ( (MethodSource) testSource ).getMethodName() );
-        }
-        return Optional.empty();
-    }
-
-    private String parentDisplayName( TestIdentifier testIdentifier )
-    {
-        return testPlan
-            .flatMap( plan -> plan.getParent( testIdentifier ) )
-            .map( TestIdentifier::getDisplayName )
-            .orElseGet( testIdentifier::getUniqueId );
-    }
-}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/4b8c1a47/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/TestPlanScannerFilter.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/TestPlanScannerFilter.java b/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/TestPlanScannerFilter.java
deleted file mode 100644
index 12edea0..0000000
--- a/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/TestPlanScannerFilter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.junit.platform.surefire.provider;
-
-/*
- * 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 static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass;
-import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.request;
-
-import java.util.function.Predicate;
-
-import org.apache.maven.surefire.util.ScannerFilter;
-import org.junit.platform.engine.Filter;
-import org.junit.platform.launcher.Launcher;
-import org.junit.platform.launcher.LauncherDiscoveryRequest;
-import org.junit.platform.launcher.TestIdentifier;
-import org.junit.platform.launcher.TestPlan;
-
-/**
- * @since 1.0
- */
-final class TestPlanScannerFilter
-    implements ScannerFilter
-{
-
-    private static final Predicate<TestIdentifier> HAS_TESTS = testIdentifier -> testIdentifier.isTest()
-            || testIdentifier.isContainer();
-
-    private final Launcher launcher;
-
-    private final Filter<?>[] includeAndExcludeFilters;
-
-    public TestPlanScannerFilter( Launcher launcher, Filter<?>[] includeAndExcludeFilters )
-    {
-        this.launcher = launcher;
-        this.includeAndExcludeFilters = includeAndExcludeFilters;
-    }
-
-    @Override
-    @SuppressWarnings( "rawtypes" )
-    public boolean accept( Class testClass )
-    {
-        LauncherDiscoveryRequest discoveryRequest = request().selectors( selectClass( testClass ) ).filters(
-            includeAndExcludeFilters ).build();
-        TestPlan testPlan = launcher.discover( discoveryRequest );
-        return testPlan.countTestIdentifiers( HAS_TESTS ) > 0;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/4b8c1a47/surefire-providers/surefire-junit5/src/main/resources/META-INF/services/org.apache.maven.surefire.providerapi.SurefireProvider
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit5/src/main/resources/META-INF/services/org.apache.maven.surefire.providerapi.SurefireProvider b/surefire-providers/surefire-junit5/src/main/resources/META-INF/services/org.apache.maven.surefire.providerapi.SurefireProvider
index bb76525..44861d6 100644
--- a/surefire-providers/surefire-junit5/src/main/resources/META-INF/services/org.apache.maven.surefire.providerapi.SurefireProvider
+++ b/surefire-providers/surefire-junit5/src/main/resources/META-INF/services/org.apache.maven.surefire.providerapi.SurefireProvider
@@ -1 +1 @@
-org.junit.platform.surefire.provider.JUnitPlatformProvider
+org.apache.maven.surefire.junit5.JUnitPlatformProvider

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/4b8c1a47/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/JUnitPlatformProviderTests.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/JUnitPlatformProviderTests.java b/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/JUnitPlatformProviderTests.java
new file mode 100644
index 0000000..cce0755
--- /dev/null
+++ b/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/JUnitPlatformProviderTests.java
@@ -0,0 +1,325 @@
+package org.apache.maven.surefire.junit5;
+
+/*
+ * 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 static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assumptions.assumeTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.surefire.providerapi.ProviderParameters;
+import org.apache.maven.surefire.report.ReporterFactory;
+import org.apache.maven.surefire.report.RunListener;
+import org.apache.maven.surefire.util.RunOrderCalculator;
+import org.apache.maven.surefire.util.ScanResult;
+import org.apache.maven.surefire.util.TestsToRun;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.junit.platform.commons.util.PreconditionViolationException;
+import org.junit.platform.launcher.Launcher;
+import org.junit.platform.launcher.TestPlan;
+import org.junit.platform.launcher.core.LauncherFactory;
+import org.junit.platform.launcher.listeners.SummaryGeneratingListener;
+import org.junit.platform.launcher.listeners.TestExecutionSummary;
+
+/**
+ * Unit tests for {@link JUnitPlatformProvider}.
+ *
+ * @since 1.0
+ */
+class JUnitPlatformProviderTests
+{
+
+    @Test
+    void getSuitesReturnsScannedClasses()
+        throws Exception
+    {
+        ProviderParameters providerParameters = providerParametersMock( TestClass1.class, TestClass2.class );
+        JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters );
+
+        assertThat( provider.getSuites() ).containsOnly( TestClass1.class, TestClass2.class );
+    }
+
+    @Test
+    void invokeThrowsForWrongForkTestSet()
+        throws Exception
+    {
+        ProviderParameters providerParameters = providerParametersMock( Integer.class );
+        JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters );
+
+        assertThrows( IllegalArgumentException.class, () -> provider.invoke( "wrong forkTestSet" ) );
+    }
+
+    @Test
+    void allGivenTestsToRunAreInvoked()
+        throws Exception
+    {
+        Launcher launcher = LauncherFactory.create();
+        JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParametersMock(), launcher );
+
+        TestPlanSummaryListener executionListener = new TestPlanSummaryListener();
+        launcher.registerTestExecutionListeners( executionListener );
+
+        TestsToRun testsToRun = newTestsToRun( TestClass1.class, TestClass2.class );
+        provider.invoke( testsToRun );
+
+        assertThat( executionListener.summaries ).hasSize( 2 );
+        TestClass1.verifyExecutionSummary( executionListener.summaries.get( 0 ) );
+        TestClass2.verifyExecutionSummary( executionListener.summaries.get( 1 ) );
+    }
+
+    @Test
+    void singleTestClassIsInvoked()
+        throws Exception
+    {
+        Launcher launcher = LauncherFactory.create();
+        JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParametersMock(), launcher );
+
+        TestPlanSummaryListener executionListener = new TestPlanSummaryListener();
+        launcher.registerTestExecutionListeners( executionListener );
+
+        provider.invoke( TestClass1.class );
+
+        assertThat( executionListener.summaries ).hasSize( 1 );
+        TestClass1.verifyExecutionSummary( executionListener.summaries.get( 0 ) );
+    }
+
+    @Test
+    void allDiscoveredTestsAreInvokedForNullArgument()
+        throws Exception
+    {
+        ProviderParameters providerParameters = providerParametersMock( TestClass1.class, TestClass2.class );
+        Launcher launcher = LauncherFactory.create();
+        JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters, launcher );
+
+        TestPlanSummaryListener executionListener = new TestPlanSummaryListener();
+        launcher.registerTestExecutionListeners( executionListener );
+
+        provider.invoke( null );
+
+        assertThat( executionListener.summaries ).hasSize( 2 );
+        TestClass1.verifyExecutionSummary( executionListener.summaries.get( 0 ) );
+        TestClass2.verifyExecutionSummary( executionListener.summaries.get( 1 ) );
+    }
+
+    @Test
+    void bothGroupsAndIncludeTagsThrowsException()
+    {
+        Map<String, String> properties = new HashMap<>();
+        properties.put( JUnitPlatformProvider.INCLUDE_GROUPS, "groupOne, groupTwo" );
+        properties.put( JUnitPlatformProvider.INCLUDE_TAGS, "tagOne, tagTwo" );
+        verifyPreconditionViolationException( properties );
+    }
+
+    @Test
+    void bothExcludedGroupsAndExcludeTagsThrowsException() {
+        Map<String, String> properties = new HashMap<>();
+        properties.put(JUnitPlatformProvider.EXCLUDE_GROUPS, "groupOne, groupTwo");
+        properties.put(JUnitPlatformProvider.EXCLUDE_TAGS, "tagOne, tagTwo");
+        verifyPreconditionViolationException(properties);
+    }
+
+    @Test
+    void onlyGroupsIsDeclared()
+        throws Exception
+    {
+        Map<String, String> properties = new HashMap<>();
+        properties.put( JUnitPlatformProvider.INCLUDE_GROUPS, "groupOne, groupTwo" );
+
+        ProviderParameters providerParameters = providerParametersMock( TestClass1.class );
+        when( providerParameters.getProviderProperties() ).thenReturn( properties );
+
+        JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters );
+
+        assertEquals( 1, provider.includeAndExcludeFilters.length );
+    }
+
+    @Test
+    void onlyExcludeTagsIsDeclared()
+        throws Exception
+    {
+        Map<String, String> properties = new HashMap<>();
+        properties.put( JUnitPlatformProvider.EXCLUDE_TAGS, "tagOne, tagTwo" );
+
+        ProviderParameters providerParameters = providerParametersMock( TestClass1.class );
+        when( providerParameters.getProviderProperties() ).thenReturn( properties );
+
+        JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters );
+
+        assertEquals( 1, provider.includeAndExcludeFilters.length );
+    }
+
+    @Test
+    void bothIncludeAndExcludeAreAllowed()
+        throws Exception
+    {
+        Map<String, String> properties = new HashMap<>();
+        properties.put( JUnitPlatformProvider.INCLUDE_TAGS, "tagOne, tagTwo" );
+        properties.put( JUnitPlatformProvider.EXCLUDE_TAGS, "tagThree, tagFour" );
+
+        ProviderParameters providerParameters = providerParametersMock( TestClass1.class );
+        when( providerParameters.getProviderProperties() ).thenReturn( properties );
+
+        JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters );
+
+        assertEquals( 2, provider.includeAndExcludeFilters.length );
+    }
+
+    @Test
+    void noFiltersAreCreatedIfNoPropertiesAreDeclared()
+        throws Exception
+    {
+        ProviderParameters providerParameters = providerParametersMock( TestClass1.class );
+
+        JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters );
+
+        assertEquals( 0, provider.includeAndExcludeFilters.length );
+    }
+
+    private void verifyPreconditionViolationException( Map<String, String> properties )
+    {
+        ProviderParameters providerParameters = providerParametersMock( TestClass1.class );
+        when( providerParameters.getProviderProperties() ).thenReturn( properties );
+
+        Throwable throwable = assertThrows( PreconditionViolationException.class, () ->
+                new JUnitPlatformProvider(providerParameters) );
+
+        assertEquals( JUnitPlatformProvider.EXCEPTION_MESSAGE_BOTH_NOT_ALLOWED, throwable.getMessage() );
+    }
+
+    private static ProviderParameters providerParametersMock( Class<?>... testClasses )
+    {
+        TestsToRun testsToRun = newTestsToRun( testClasses );
+
+        ScanResult scanResult = mock( ScanResult.class );
+        when( scanResult.applyFilter( any(), any() ) ).thenReturn( testsToRun );
+
+        RunOrderCalculator runOrderCalculator = mock( RunOrderCalculator.class );
+        when( runOrderCalculator.orderTestClasses( any() ) ).thenReturn( testsToRun );
+
+        ReporterFactory reporterFactory = mock( ReporterFactory.class );
+        RunListener runListener = mock( RunListener.class );
+        when( reporterFactory.createReporter() ).thenReturn( runListener );
+
+        ProviderParameters providerParameters = mock( ProviderParameters.class );
+        when( providerParameters.getScanResult() ).thenReturn( scanResult );
+        when( providerParameters.getRunOrderCalculator() ).thenReturn( runOrderCalculator );
+        when( providerParameters.getReporterFactory() ).thenReturn( reporterFactory );
+
+        return providerParameters;
+    }
+
+    private static TestsToRun newTestsToRun( Class<?>... testClasses )
+    {
+        List<Class<?>> classesList = Arrays.asList( testClasses );
+        return new TestsToRun( new LinkedHashSet<>( classesList ) );
+    }
+
+    private class TestPlanSummaryListener
+        extends SummaryGeneratingListener
+    {
+
+        final List<TestExecutionSummary> summaries = new ArrayList<>();
+
+        @Override
+        public void testPlanExecutionFinished( TestPlan testPlan )
+        {
+            super.testPlanExecutionFinished( testPlan );
+            summaries.add( getSummary() );
+        }
+    }
+
+    private static class TestClass1
+    {
+
+        @Test
+        void test1()
+        {
+        }
+
+        @Test
+        void test2()
+        {
+        }
+
+        @Disabled
+        @Test
+        void test3()
+        {
+        }
+
+        @Test
+        void test4()
+        {
+            throw new RuntimeException();
+        }
+
+        static void verifyExecutionSummary( TestExecutionSummary summary )
+        {
+            assertEquals( 4, summary.getTestsFoundCount() );
+            assertEquals( 3, summary.getTestsStartedCount() );
+            assertEquals( 2, summary.getTestsSucceededCount() );
+            assertEquals( 1, summary.getTestsSkippedCount() );
+            assertEquals( 0, summary.getTestsAbortedCount() );
+            assertEquals( 1, summary.getTestsFailedCount() );
+        }
+    }
+
+    private static class TestClass2
+    {
+
+        @Test
+        void test1()
+        {
+        }
+
+        @Test
+        void test2()
+        {
+            throw new RuntimeException();
+        }
+
+        @Test
+        void test3()
+        {
+            assumeTrue( false );
+        }
+
+        static void verifyExecutionSummary( TestExecutionSummary summary )
+        {
+            assertEquals( 3, summary.getTestsFoundCount() );
+            assertEquals( 3, summary.getTestsStartedCount() );
+            assertEquals( 1, summary.getTestsSucceededCount() );
+            assertEquals( 0, summary.getTestsSkippedCount() );
+            assertEquals( 1, summary.getTestsAbortedCount() );
+            assertEquals( 1, summary.getTestsFailedCount() );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/4b8c1a47/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/RunListenerAdapterTests.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/RunListenerAdapterTests.java b/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/RunListenerAdapterTests.java
new file mode 100644
index 0000000..5518b29
--- /dev/null
+++ b/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/RunListenerAdapterTests.java
@@ -0,0 +1,262 @@
+package org.apache.maven.surefire.junit5;
+
+/*
+ * 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 static java.util.Collections.singletonList;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Optional;
+
+import org.apache.maven.surefire.report.ReportEntry;
+import org.apache.maven.surefire.report.RunListener;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.engine.descriptor.ClassTestDescriptor;
+import org.junit.jupiter.engine.descriptor.MethodTestDescriptor;
+import org.junit.platform.engine.TestDescriptor;
+import org.junit.platform.engine.TestExecutionResult;
+import org.junit.platform.engine.UniqueId;
+import org.junit.platform.engine.support.descriptor.EngineDescriptor;
+import org.junit.platform.launcher.TestIdentifier;
+import org.junit.platform.launcher.TestPlan;
+import org.mockito.ArgumentCaptor;
+
+/**
+ * Unit tests for {@link RunListenerAdapter}.
+ *
+ * @since 1.0
+ */
+class RunListenerAdapterTests
+{
+
+    private RunListener listener;
+
+    private RunListenerAdapter adapter;
+
+    @BeforeEach
+    public void setUp()
+    {
+        listener = mock( RunListener.class );
+        adapter = new RunListenerAdapter( listener );
+    }
+
+    @Test
+    void notifiedWithCorrectNamesWhenMethodExecutionStarted()
+        throws Exception
+    {
+        ArgumentCaptor<ReportEntry> entryCaptor = ArgumentCaptor.forClass( ReportEntry.class );
+
+        adapter.executionStarted( newMethodIdentifier() );
+        verify( listener ).testStarting( entryCaptor.capture() );
+
+        ReportEntry entry = entryCaptor.getValue();
+        assertEquals( MY_TEST_METHOD_NAME + "()", entry.getName() );
+        assertEquals( MyTestClass.class.getName(), entry.getSourceName() );
+        assertNotNull( entry.getStackTraceWriter() );
+    }
+
+    @Test
+    void notNotifiedWhenClassExecutionStarted()
+        throws Exception
+    {
+        adapter.executionStarted( newClassIdentifier() );
+        verify( listener, never() ).testStarting( any() );
+    }
+
+    @Test
+    void notNotifiedWhenEngineExecutionStarted()
+        throws Exception
+    {
+        adapter.executionStarted( newEngineIdentifier() );
+        verify( listener, never() ).testStarting( any() );
+    }
+
+    @Test
+    void notifiedWhenMethodExecutionSkipped()
+        throws Exception
+    {
+        adapter.executionSkipped( newMethodIdentifier(), "test" );
+        verify( listener ).testSkipped( any() );
+    }
+
+    @Test
+    void notifiedWithCorrectNamesWhenClassExecutionSkipped()
+        throws Exception
+    {
+        ArgumentCaptor<ReportEntry> entryCaptor = ArgumentCaptor.forClass( ReportEntry.class );
+
+        adapter.executionSkipped( newClassIdentifier(), "test" );
+        verify( listener ).testSkipped( entryCaptor.capture() );
+
+        ReportEntry entry = entryCaptor.getValue();
+        assertTrue( MyTestClass.class.getTypeName().contains( entry.getName() ) );
+        assertEquals( MyTestClass.class.getName(), entry.getSourceName() );
+    }
+
+    @Test
+    void notifiedWhenEngineExecutionSkipped()
+        throws Exception
+    {
+        adapter.executionSkipped( newEngineIdentifier(), "test" );
+        verify( listener ).testSkipped( any() );
+    }
+
+    @Test
+    void notifiedWhenMethodExecutionAborted()
+        throws Exception
+    {
+        adapter.executionFinished( newMethodIdentifier(), TestExecutionResult.aborted( null ) );
+        verify( listener ).testAssumptionFailure( any() );
+    }
+
+    @Test
+    void notifiedWhenClassExecutionAborted()
+        throws Exception
+    {
+        adapter.executionFinished( newClassIdentifier(), TestExecutionResult.aborted( null ) );
+        verify( listener ).testAssumptionFailure( any() );
+    }
+
+    @Test
+    void notifiedWhenMethodExecutionFailed()
+        throws Exception
+    {
+        adapter.executionFinished( newMethodIdentifier(), TestExecutionResult.failed( new RuntimeException() ) );
+        verify( listener ).testFailed( any() );
+    }
+
+    @Test
+    void notifiedWithCorrectNamesWhenClassExecutionFailed()
+        throws Exception
+    {
+        ArgumentCaptor<ReportEntry> entryCaptor = ArgumentCaptor.forClass( ReportEntry.class );
+
+        adapter.executionFinished( newClassIdentifier(), TestExecutionResult.failed( new RuntimeException() ) );
+        verify( listener ).testFailed( entryCaptor.capture() );
+
+        ReportEntry entry = entryCaptor.getValue();
+        assertEquals( MyTestClass.class.getName(), entry.getSourceName() );
+        assertNotNull( entry.getStackTraceWriter() );
+    }
+
+    @Test
+    void notifiedWhenMethodExecutionSucceeded()
+        throws Exception
+    {
+        adapter.executionFinished( newMethodIdentifier(), TestExecutionResult.successful() );
+        verify( listener ).testSucceeded( any() );
+    }
+
+    @Test
+    void notNotifiedWhenClassExecutionSucceeded()
+        throws Exception
+    {
+        adapter.executionFinished( newClassIdentifier(), TestExecutionResult.successful() );
+        verify( listener, never() ).testSucceeded( any() );
+    }
+
+    @Test
+    void notifiedWithParentDisplayNameWhenTestClassUnknown()
+        throws Exception
+    {
+        // Set up a test plan
+        TestPlan plan = TestPlan.from( singletonList( new EngineDescriptor( newId(), "Luke's Plan" ) ) );
+        adapter.testPlanExecutionStarted( plan );
+
+        // Use the test plan to set up child with parent.
+        final String parentDisplay = "I am your father";
+        TestIdentifier child = newSourcelessIdentifierWithParent( plan, parentDisplay );
+        adapter.executionStarted( child );
+
+        // Check that the adapter has informed Surefire that the test has been invoked,
+        // with the parent name as source (since the test case itself had no source).
+        ArgumentCaptor<ReportEntry> entryCaptor = ArgumentCaptor.forClass( ReportEntry.class );
+        verify( listener ).testStarting( entryCaptor.capture() );
+        assertEquals( parentDisplay, entryCaptor.getValue().getSourceName() );
+    }
+
+    private static TestIdentifier newMethodIdentifier()
+        throws Exception
+    {
+        TestDescriptor testDescriptor = new MethodTestDescriptor( newId(), MyTestClass.class,
+            MyTestClass.class.getDeclaredMethod( MY_TEST_METHOD_NAME ) );
+        return TestIdentifier.from( testDescriptor );
+    }
+
+    private static TestIdentifier newClassIdentifier()
+    {
+        TestDescriptor testDescriptor = new ClassTestDescriptor( newId(), MyTestClass.class );
+        return TestIdentifier.from( testDescriptor );
+    }
+
+    private static TestIdentifier newSourcelessIdentifierWithParent( TestPlan testPlan, String parentDisplay )
+    {
+        // A parent test identifier with a name.
+        TestDescriptor parent = mock( TestDescriptor.class );
+        when( parent.getUniqueId() ).thenReturn( newId() );
+        when( parent.getDisplayName() ).thenReturn( parentDisplay );
+        TestIdentifier parentId = TestIdentifier.from( parent );
+
+        // The (child) test case that is to be executed as part of a test plan.
+        TestDescriptor child = mock( TestDescriptor.class );
+        when( child.getUniqueId() ).thenReturn( newId() );
+        when( child.isTest() ).thenReturn( true );
+
+        // Ensure the child source is null yet that there is a parent -- the special case to be tested.
+        when( child.getSource() ).thenReturn( Optional.empty() );
+        when( child.getParent() ).thenReturn( Optional.of(parent) );
+        TestIdentifier childId = TestIdentifier.from( child );
+
+        testPlan.add( childId );
+        testPlan.add( parentId );
+
+        return childId;
+    }
+
+    private static TestIdentifier newEngineIdentifier()
+    {
+        TestDescriptor testDescriptor = new EngineDescriptor( newId(), "engine" );
+        return TestIdentifier.from( testDescriptor );
+    }
+
+    private static UniqueId newId()
+    {
+        return UniqueId.forEngine( "engine" );
+    }
+
+    private static final String MY_TEST_METHOD_NAME = "myTestMethod";
+
+    private static class MyTestClass {
+
+        @Test
+        void myTestMethod()
+        {
+        }
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/4b8c1a47/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/TestPlanScannerFilterTests.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/TestPlanScannerFilterTests.java b/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/TestPlanScannerFilterTests.java
new file mode 100644
index 0000000..aa52b78
--- /dev/null
+++ b/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/TestPlanScannerFilterTests.java
@@ -0,0 +1,190 @@
+package org.apache.maven.surefire.junit5;
+
+/*
+ * 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 static java.util.Collections.emptyList;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.List;
+import java.util.stream.Stream;
+
+import org.junit.jupiter.api.DynamicTest;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestFactory;
+import org.junit.platform.engine.Filter;
+import org.junit.platform.launcher.core.LauncherFactory;
+
+/**
+ * Unit tests for {@link TestPlanScannerFilter}.
+ *
+ * @since 1.0
+ */
+public class TestPlanScannerFilterTests
+{
+
+    @Test
+    void emptyClassAccepted()
+    {
+        assertTrue( newFilter().accept( EmptyClass.class ), "accepts empty class because it is a container" );
+    }
+
+    @Test
+    void classWithNoTestMethodsIsAccepted()
+    {
+        assertTrue( newFilter().accept( ClassWithMethods.class ),
+            "accepts class with no @Test methods because it is a container" );
+    }
+
+    @Test
+    void classWithTestMethodsIsAccepted()
+    {
+        assertTrue( newFilter().accept( ClassWithTestMethods.class ) );
+    }
+
+    @Test
+    void classWithNestedTestClassIsAccepted()
+    {
+        assertTrue( newFilter().accept( ClassWithNestedTestClass.class ) );
+    }
+
+    @Test
+    void classWithDeeplyNestedTestClassIsAccepted()
+    {
+        assertTrue( newFilter().accept( ClassWithDeeplyNestedTestClass.class ) );
+    }
+
+    @Test
+    void classWithTestFactoryIsAccepted()
+    {
+        assertTrue( newFilter().accept( ClassWithTestFactory.class ) );
+    }
+
+    @Test
+    void classWithNestedTestFactoryIsAccepted()
+    {
+        assertTrue( newFilter().accept( ClassWithNestedTestFactory.class ) );
+    }
+
+    private TestPlanScannerFilter newFilter()
+    {
+        return new TestPlanScannerFilter( LauncherFactory.create(), new Filter<?>[0] );
+    }
+
+    private static class EmptyClass
+    {
+    }
+
+    @SuppressWarnings("unused")
+    private static class ClassWithMethods
+    {
+
+        void method1()
+        {
+        }
+
+        void method2()
+        {
+        }
+    }
+
+    private static class ClassWithTestMethods
+    {
+
+        @Test
+        void test1()
+        {
+        }
+
+        @Test
+        public void test2()
+        {
+        }
+    }
+
+    private static class ClassWithNestedTestClass
+    {
+
+        @SuppressWarnings("unused")
+        void method()
+        {
+        }
+
+        @Nested
+        class TestClass
+        {
+
+            @Test
+            void test1()
+            {
+            }
+        }
+    }
+
+    private static class ClassWithDeeplyNestedTestClass
+    {
+
+        @Nested
+        class Level1
+        {
+
+            @Nested
+            class Level2
+            {
+
+                @Nested
+                class TestClass
+                {
+
+                    @Test
+                    void test1()
+                    {
+                    }
+                }
+            }
+        }
+    }
+
+    private static class ClassWithTestFactory
+    {
+
+        @TestFactory
+        Stream<DynamicTest> tests()
+        {
+            return Stream.empty();
+        }
+    }
+
+    private static class ClassWithNestedTestFactory
+    {
+
+        @Nested
+        class TestClass
+        {
+
+            @TestFactory
+            List<DynamicTest> tests()
+            {
+                return emptyList();
+            }
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/4b8c1a47/surefire-providers/surefire-junit5/src/test/java/org/junit/platform/surefire/provider/JUnitPlatformProviderTests.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit5/src/test/java/org/junit/platform/surefire/provider/JUnitPlatformProviderTests.java b/surefire-providers/surefire-junit5/src/test/java/org/junit/platform/surefire/provider/JUnitPlatformProviderTests.java
deleted file mode 100644
index 9cc054d..0000000
--- a/surefire-providers/surefire-junit5/src/test/java/org/junit/platform/surefire/provider/JUnitPlatformProviderTests.java
+++ /dev/null
@@ -1,325 +0,0 @@
-package org.junit.platform.surefire.provider;
-
-/*
- * 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 static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assumptions.assumeTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.maven.surefire.providerapi.ProviderParameters;
-import org.apache.maven.surefire.report.ReporterFactory;
-import org.apache.maven.surefire.report.RunListener;
-import org.apache.maven.surefire.util.RunOrderCalculator;
-import org.apache.maven.surefire.util.ScanResult;
-import org.apache.maven.surefire.util.TestsToRun;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-import org.junit.platform.commons.util.PreconditionViolationException;
-import org.junit.platform.launcher.Launcher;
-import org.junit.platform.launcher.TestPlan;
-import org.junit.platform.launcher.core.LauncherFactory;
-import org.junit.platform.launcher.listeners.SummaryGeneratingListener;
-import org.junit.platform.launcher.listeners.TestExecutionSummary;
-
-/**
- * Unit tests for {@link JUnitPlatformProvider}.
- *
- * @since 1.0
- */
-class JUnitPlatformProviderTests
-{
-
-    @Test
-    void getSuitesReturnsScannedClasses()
-        throws Exception
-    {
-        ProviderParameters providerParameters = providerParametersMock( TestClass1.class, TestClass2.class );
-        JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters );
-
-        assertThat( provider.getSuites() ).containsOnly( TestClass1.class, TestClass2.class );
-    }
-
-    @Test
-    void invokeThrowsForWrongForkTestSet()
-        throws Exception
-    {
-        ProviderParameters providerParameters = providerParametersMock( Integer.class );
-        JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters );
-
-        assertThrows( IllegalArgumentException.class, () -> provider.invoke( "wrong forkTestSet" ) );
-    }
-
-    @Test
-    void allGivenTestsToRunAreInvoked()
-        throws Exception
-    {
-        Launcher launcher = LauncherFactory.create();
-        JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParametersMock(), launcher );
-
-        TestPlanSummaryListener executionListener = new TestPlanSummaryListener();
-        launcher.registerTestExecutionListeners( executionListener );
-
-        TestsToRun testsToRun = newTestsToRun( TestClass1.class, TestClass2.class );
-        provider.invoke( testsToRun );
-
-        assertThat( executionListener.summaries ).hasSize( 2 );
-        TestClass1.verifyExecutionSummary( executionListener.summaries.get( 0 ) );
-        TestClass2.verifyExecutionSummary( executionListener.summaries.get( 1 ) );
-    }
-
-    @Test
-    void singleTestClassIsInvoked()
-        throws Exception
-    {
-        Launcher launcher = LauncherFactory.create();
-        JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParametersMock(), launcher );
-
-        TestPlanSummaryListener executionListener = new TestPlanSummaryListener();
-        launcher.registerTestExecutionListeners( executionListener );
-
-        provider.invoke( TestClass1.class );
-
-        assertThat( executionListener.summaries ).hasSize( 1 );
-        TestClass1.verifyExecutionSummary( executionListener.summaries.get( 0 ) );
-    }
-
-    @Test
-    void allDiscoveredTestsAreInvokedForNullArgument()
-        throws Exception
-    {
-        ProviderParameters providerParameters = providerParametersMock( TestClass1.class, TestClass2.class );
-        Launcher launcher = LauncherFactory.create();
-        JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters, launcher );
-
-        TestPlanSummaryListener executionListener = new TestPlanSummaryListener();
-        launcher.registerTestExecutionListeners( executionListener );
-
-        provider.invoke( null );
-
-        assertThat( executionListener.summaries ).hasSize( 2 );
-        TestClass1.verifyExecutionSummary( executionListener.summaries.get( 0 ) );
-        TestClass2.verifyExecutionSummary( executionListener.summaries.get( 1 ) );
-    }
-
-    @Test
-    void bothGroupsAndIncludeTagsThrowsException()
-    {
-        Map<String, String> properties = new HashMap<>();
-        properties.put( JUnitPlatformProvider.INCLUDE_GROUPS, "groupOne, groupTwo" );
-        properties.put( JUnitPlatformProvider.INCLUDE_TAGS, "tagOne, tagTwo" );
-        verifyPreconditionViolationException( properties );
-    }
-
-    @Test
-    void bothExcludedGroupsAndExcludeTagsThrowsException() {
-        Map<String, String> properties = new HashMap<>();
-        properties.put(JUnitPlatformProvider.EXCLUDE_GROUPS, "groupOne, groupTwo");
-        properties.put(JUnitPlatformProvider.EXCLUDE_TAGS, "tagOne, tagTwo");
-        verifyPreconditionViolationException(properties);
-    }
-
-    @Test
-    void onlyGroupsIsDeclared()
-        throws Exception
-    {
-        Map<String, String> properties = new HashMap<>();
-        properties.put( JUnitPlatformProvider.INCLUDE_GROUPS, "groupOne, groupTwo" );
-
-        ProviderParameters providerParameters = providerParametersMock( TestClass1.class );
-        when( providerParameters.getProviderProperties() ).thenReturn( properties );
-
-        JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters );
-
-        assertEquals( 1, provider.includeAndExcludeFilters.length );
-    }
-
-    @Test
-    void onlyExcludeTagsIsDeclared()
-        throws Exception
-    {
-        Map<String, String> properties = new HashMap<>();
-        properties.put( JUnitPlatformProvider.EXCLUDE_TAGS, "tagOne, tagTwo" );
-
-        ProviderParameters providerParameters = providerParametersMock( TestClass1.class );
-        when( providerParameters.getProviderProperties() ).thenReturn( properties );
-
-        JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters );
-
-        assertEquals( 1, provider.includeAndExcludeFilters.length );
-    }
-
-    @Test
-    void bothIncludeAndExcludeAreAllowed()
-        throws Exception
-    {
-        Map<String, String> properties = new HashMap<>();
-        properties.put( JUnitPlatformProvider.INCLUDE_TAGS, "tagOne, tagTwo" );
-        properties.put( JUnitPlatformProvider.EXCLUDE_TAGS, "tagThree, tagFour" );
-
-        ProviderParameters providerParameters = providerParametersMock( TestClass1.class );
-        when( providerParameters.getProviderProperties() ).thenReturn( properties );
-
-        JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters );
-
-        assertEquals( 2, provider.includeAndExcludeFilters.length );
-    }
-
-    @Test
-    void noFiltersAreCreatedIfNoPropertiesAreDeclared()
-        throws Exception
-    {
-        ProviderParameters providerParameters = providerParametersMock( TestClass1.class );
-
-        JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters );
-
-        assertEquals( 0, provider.includeAndExcludeFilters.length );
-    }
-
-    private void verifyPreconditionViolationException( Map<String, String> properties )
-    {
-        ProviderParameters providerParameters = providerParametersMock( TestClass1.class );
-        when( providerParameters.getProviderProperties() ).thenReturn( properties );
-
-        Throwable throwable = assertThrows( PreconditionViolationException.class, () ->
-                new JUnitPlatformProvider(providerParameters) );
-
-        assertEquals( JUnitPlatformProvider.EXCEPTION_MESSAGE_BOTH_NOT_ALLOWED, throwable.getMessage() );
-    }
-
-    private static ProviderParameters providerParametersMock( Class<?>... testClasses )
-    {
-        TestsToRun testsToRun = newTestsToRun( testClasses );
-
-        ScanResult scanResult = mock( ScanResult.class );
-        when( scanResult.applyFilter( any(), any() ) ).thenReturn( testsToRun );
-
-        RunOrderCalculator runOrderCalculator = mock( RunOrderCalculator.class );
-        when( runOrderCalculator.orderTestClasses( any() ) ).thenReturn( testsToRun );
-
-        ReporterFactory reporterFactory = mock( ReporterFactory.class );
-        RunListener runListener = mock( RunListener.class );
-        when( reporterFactory.createReporter() ).thenReturn( runListener );
-
-        ProviderParameters providerParameters = mock( ProviderParameters.class );
-        when( providerParameters.getScanResult() ).thenReturn( scanResult );
-        when( providerParameters.getRunOrderCalculator() ).thenReturn( runOrderCalculator );
-        when( providerParameters.getReporterFactory() ).thenReturn( reporterFactory );
-
-        return providerParameters;
-    }
-
-    private static TestsToRun newTestsToRun( Class<?>... testClasses )
-    {
-        List<Class<?>> classesList = Arrays.asList( testClasses );
-        return new TestsToRun( new LinkedHashSet<>( classesList ) );
-    }
-
-    private class TestPlanSummaryListener
-        extends SummaryGeneratingListener
-    {
-
-        final List<TestExecutionSummary> summaries = new ArrayList<>();
-
-        @Override
-        public void testPlanExecutionFinished( TestPlan testPlan )
-        {
-            super.testPlanExecutionFinished( testPlan );
-            summaries.add( getSummary() );
-        }
-    }
-
-    private static class TestClass1
-    {
-
-        @Test
-        void test1()
-        {
-        }
-
-        @Test
-        void test2()
-        {
-        }
-
-        @Disabled
-        @Test
-        void test3()
-        {
-        }
-
-        @Test
-        void test4()
-        {
-            throw new RuntimeException();
-        }
-
-        static void verifyExecutionSummary( TestExecutionSummary summary )
-        {
-            assertEquals( 4, summary.getTestsFoundCount() );
-            assertEquals( 3, summary.getTestsStartedCount() );
-            assertEquals( 2, summary.getTestsSucceededCount() );
-            assertEquals( 1, summary.getTestsSkippedCount() );
-            assertEquals( 0, summary.getTestsAbortedCount() );
-            assertEquals( 1, summary.getTestsFailedCount() );
-        }
-    }
-
-    private static class TestClass2
-    {
-
-        @Test
-        void test1()
-        {
-        }
-
-        @Test
-        void test2()
-        {
-            throw new RuntimeException();
-        }
-
-        @Test
-        void test3()
-        {
-            assumeTrue( false );
-        }
-
-        static void verifyExecutionSummary( TestExecutionSummary summary )
-        {
-            assertEquals( 3, summary.getTestsFoundCount() );
-            assertEquals( 3, summary.getTestsStartedCount() );
-            assertEquals( 1, summary.getTestsSucceededCount() );
-            assertEquals( 0, summary.getTestsSkippedCount() );
-            assertEquals( 1, summary.getTestsAbortedCount() );
-            assertEquals( 1, summary.getTestsFailedCount() );
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/4b8c1a47/surefire-providers/surefire-junit5/src/test/java/org/junit/platform/surefire/provider/RunListenerAdapterTests.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit5/src/test/java/org/junit/platform/surefire/provider/RunListenerAdapterTests.java b/surefire-providers/surefire-junit5/src/test/java/org/junit/platform/surefire/provider/RunListenerAdapterTests.java
deleted file mode 100644
index e841b53..0000000
--- a/surefire-providers/surefire-junit5/src/test/java/org/junit/platform/surefire/provider/RunListenerAdapterTests.java
+++ /dev/null
@@ -1,263 +0,0 @@
-package org.junit.platform.surefire.provider;
-
-/*
- * 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 static java.util.Collections.singletonList;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import java.util.Collections;
-import java.util.Optional;
-
-import org.apache.maven.surefire.report.ReportEntry;
-import org.apache.maven.surefire.report.RunListener;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.engine.descriptor.ClassTestDescriptor;
-import org.junit.jupiter.engine.descriptor.MethodTestDescriptor;
-import org.junit.platform.engine.TestDescriptor;
-import org.junit.platform.engine.TestExecutionResult;
-import org.junit.platform.engine.UniqueId;
-import org.junit.platform.engine.support.descriptor.EngineDescriptor;
-import org.junit.platform.launcher.TestIdentifier;
-import org.junit.platform.launcher.TestPlan;
-import org.mockito.ArgumentCaptor;
-
-/**
- * Unit tests for {@link RunListenerAdapter}.
- *
- * @since 1.0
- */
-class RunListenerAdapterTests
-{
-
-    private RunListener listener;
-
-    private RunListenerAdapter adapter;
-
-    @BeforeEach
-    public void setUp()
-    {
-        listener = mock( RunListener.class );
-        adapter = new RunListenerAdapter( listener );
-    }
-
-    @Test
-    void notifiedWithCorrectNamesWhenMethodExecutionStarted()
-        throws Exception
-    {
-        ArgumentCaptor<ReportEntry> entryCaptor = ArgumentCaptor.forClass( ReportEntry.class );
-
-        adapter.executionStarted( newMethodIdentifier() );
-        verify( listener ).testStarting( entryCaptor.capture() );
-
-        ReportEntry entry = entryCaptor.getValue();
-        assertEquals( MY_TEST_METHOD_NAME + "()", entry.getName() );
-        assertEquals( MyTestClass.class.getName(), entry.getSourceName() );
-        assertNotNull( entry.getStackTraceWriter() );
-    }
-
-    @Test
-    void notNotifiedWhenClassExecutionStarted()
-        throws Exception
-    {
-        adapter.executionStarted( newClassIdentifier() );
-        verify( listener, never() ).testStarting( any() );
-    }
-
-    @Test
-    void notNotifiedWhenEngineExecutionStarted()
-        throws Exception
-    {
-        adapter.executionStarted( newEngineIdentifier() );
-        verify( listener, never() ).testStarting( any() );
-    }
-
-    @Test
-    void notifiedWhenMethodExecutionSkipped()
-        throws Exception
-    {
-        adapter.executionSkipped( newMethodIdentifier(), "test" );
-        verify( listener ).testSkipped( any() );
-    }
-
-    @Test
-    void notifiedWithCorrectNamesWhenClassExecutionSkipped()
-        throws Exception
-    {
-        ArgumentCaptor<ReportEntry> entryCaptor = ArgumentCaptor.forClass( ReportEntry.class );
-
-        adapter.executionSkipped( newClassIdentifier(), "test" );
-        verify( listener ).testSkipped( entryCaptor.capture() );
-
-        ReportEntry entry = entryCaptor.getValue();
-        assertTrue( MyTestClass.class.getTypeName().contains( entry.getName() ) );
-        assertEquals( MyTestClass.class.getName(), entry.getSourceName() );
-    }
-
-    @Test
-    void notifiedWhenEngineExecutionSkipped()
-        throws Exception
-    {
-        adapter.executionSkipped( newEngineIdentifier(), "test" );
-        verify( listener ).testSkipped( any() );
-    }
-
-    @Test
-    void notifiedWhenMethodExecutionAborted()
-        throws Exception
-    {
-        adapter.executionFinished( newMethodIdentifier(), TestExecutionResult.aborted( null ) );
-        verify( listener ).testAssumptionFailure( any() );
-    }
-
-    @Test
-    void notifiedWhenClassExecutionAborted()
-        throws Exception
-    {
-        adapter.executionFinished( newClassIdentifier(), TestExecutionResult.aborted( null ) );
-        verify( listener ).testAssumptionFailure( any() );
-    }
-
-    @Test
-    void notifiedWhenMethodExecutionFailed()
-        throws Exception
-    {
-        adapter.executionFinished( newMethodIdentifier(), TestExecutionResult.failed( new RuntimeException() ) );
-        verify( listener ).testFailed( any() );
-    }
-
-    @Test
-    void notifiedWithCorrectNamesWhenClassExecutionFailed()
-        throws Exception
-    {
-        ArgumentCaptor<ReportEntry> entryCaptor = ArgumentCaptor.forClass( ReportEntry.class );
-
-        adapter.executionFinished( newClassIdentifier(), TestExecutionResult.failed( new RuntimeException() ) );
-        verify( listener ).testFailed( entryCaptor.capture() );
-
-        ReportEntry entry = entryCaptor.getValue();
-        assertEquals( MyTestClass.class.getName(), entry.getSourceName() );
-        assertNotNull( entry.getStackTraceWriter() );
-    }
-
-    @Test
-    void notifiedWhenMethodExecutionSucceeded()
-        throws Exception
-    {
-        adapter.executionFinished( newMethodIdentifier(), TestExecutionResult.successful() );
-        verify( listener ).testSucceeded( any() );
-    }
-
-    @Test
-    void notNotifiedWhenClassExecutionSucceeded()
-        throws Exception
-    {
-        adapter.executionFinished( newClassIdentifier(), TestExecutionResult.successful() );
-        verify( listener, never() ).testSucceeded( any() );
-    }
-
-    @Test
-    void notifiedWithParentDisplayNameWhenTestClassUnknown()
-        throws Exception
-    {
-        // Set up a test plan
-        TestPlan plan = TestPlan.from( singletonList( new EngineDescriptor( newId(), "Luke's Plan" ) ) );
-        adapter.testPlanExecutionStarted( plan );
-
-        // Use the test plan to set up child with parent.
-        final String parentDisplay = "I am your father";
-        TestIdentifier child = newSourcelessIdentifierWithParent( plan, parentDisplay );
-        adapter.executionStarted( child );
-
-        // Check that the adapter has informed Surefire that the test has been invoked,
-        // with the parent name as source (since the test case itself had no source).
-        ArgumentCaptor<ReportEntry> entryCaptor = ArgumentCaptor.forClass( ReportEntry.class );
-        verify( listener ).testStarting( entryCaptor.capture() );
-        assertEquals( parentDisplay, entryCaptor.getValue().getSourceName() );
-    }
-
-    private static TestIdentifier newMethodIdentifier()
-        throws Exception
-    {
-        TestDescriptor testDescriptor = new MethodTestDescriptor( newId(), MyTestClass.class,
-            MyTestClass.class.getDeclaredMethod( MY_TEST_METHOD_NAME ) );
-        return TestIdentifier.from( testDescriptor );
-    }
-
-    private static TestIdentifier newClassIdentifier()
-    {
-        TestDescriptor testDescriptor = new ClassTestDescriptor( newId(), MyTestClass.class );
-        return TestIdentifier.from( testDescriptor );
-    }
-
-    private static TestIdentifier newSourcelessIdentifierWithParent( TestPlan testPlan, String parentDisplay )
-    {
-        // A parent test identifier with a name.
-        TestDescriptor parent = mock( TestDescriptor.class );
-        when( parent.getUniqueId() ).thenReturn( newId() );
-        when( parent.getDisplayName() ).thenReturn( parentDisplay );
-        TestIdentifier parentId = TestIdentifier.from( parent );
-
-        // The (child) test case that is to be executed as part of a test plan.
-        TestDescriptor child = mock( TestDescriptor.class );
-        when( child.getUniqueId() ).thenReturn( newId() );
-        when( child.isTest() ).thenReturn( true );
-
-        // Ensure the child source is null yet that there is a parent -- the special case to be tested.
-        when( child.getSource() ).thenReturn( Optional.empty() );
-        when( child.getParent() ).thenReturn( Optional.of(parent) );
-        TestIdentifier childId = TestIdentifier.from( child );
-
-        testPlan.add( childId );
-        testPlan.add( parentId );
-
-        return childId;
-    }
-
-    private static TestIdentifier newEngineIdentifier()
-    {
-        TestDescriptor testDescriptor = new EngineDescriptor( newId(), "engine" );
-        return TestIdentifier.from( testDescriptor );
-    }
-
-    private static UniqueId newId()
-    {
-        return UniqueId.forEngine( "engine" );
-    }
-
-    private static final String MY_TEST_METHOD_NAME = "myTestMethod";
-
-    private static class MyTestClass {
-
-        @Test
-        void myTestMethod()
-        {
-        }
-
-    }
-
-}