/* * Copyright 2015-2017 the original author or authors. * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which * accompanies this distribution and is available at * * http://www.eclipse.org/legal/epl-v10.html */ package org.junit.platform.console.tasks; import static org.junit.platform.engine.discovery.ClassNameFilter.excludeClassNamePatterns; import static org.junit.platform.engine.discovery.ClassNameFilter.includeClassNamePatterns; import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClasspathRoots; import static org.junit.platform.engine.discovery.PackageNameFilter.excludePackageNames; import static org.junit.platform.engine.discovery.PackageNameFilter.includePackageNames; import static org.junit.platform.launcher.EngineFilter.excludeEngines; import static org.junit.platform.launcher.EngineFilter.includeEngines; import static org.junit.platform.launcher.TagFilter.excludeTags; import static org.junit.platform.launcher.TagFilter.includeTags; import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.request; import java.nio.file.Path; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import org.junit.platform.commons.util.Preconditions; import org.junit.platform.commons.util.ReflectionUtils; import org.junit.platform.console.options.CommandLineOptions; import org.junit.platform.engine.DiscoverySelector; import org.junit.platform.engine.discovery.ClasspathRootSelector; import org.junit.platform.engine.discovery.DiscoverySelectors; import org.junit.platform.launcher.LauncherDiscoveryRequest; import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder; /** * @since 1.0 */ class DiscoveryRequestCreator { LauncherDiscoveryRequest toDiscoveryRequest(CommandLineOptions options) { LauncherDiscoveryRequestBuilder requestBuilder = request(); requestBuilder.selectors(createDiscoverySelectors(options)); addFilters(requestBuilder, options); return requestBuilder.build(); } private List<? extends DiscoverySelector> createDiscoverySelectors(CommandLineOptions options) { if (options.isScanClasspath()) { Preconditions.condition(!options.hasExplicitSelectors(), "Scanning the classpath and using explicit selectors at the same time is not supported"); return createClasspathRootSelectors(options); } return createExplicitDiscoverySelectors(options); } private List<ClasspathRootSelector> createClasspathRootSelectors(CommandLineOptions options) { Set<Path> classpathRoots = determineClasspathRoots(options); return selectClasspathRoots(classpathRoots); } private Set<Path> determineClasspathRoots(CommandLineOptions options) { if (options.getSelectedClasspathEntries().isEmpty()) { Set<Path> rootDirs = new LinkedHashSet<>(ReflectionUtils.getAllClasspathRootDirectories()); rootDirs.addAll(options.getAdditionalClasspathEntries()); return rootDirs; } return new LinkedHashSet<>(options.getSelectedClasspathEntries()); } private List<DiscoverySelector> createExplicitDiscoverySelectors(CommandLineOptions options) { List<DiscoverySelector> selectors = new LinkedList<>(); options.getSelectedUris().stream().map(DiscoverySelectors::selectUri).forEach(selectors::add); options.getSelectedFiles().stream().map(DiscoverySelectors::selectFile).forEach(selectors::add); options.getSelectedDirectories().stream().map(DiscoverySelectors::selectDirectory).forEach(selectors::add); options.getSelectedPackages().stream().map(DiscoverySelectors::selectPackage).forEach(selectors::add); options.getSelectedClasses().stream().map(DiscoverySelectors::selectClass).forEach(selectors::add); options.getSelectedMethods().stream().map(DiscoverySelectors::selectMethod).forEach(selectors::add); options.getSelectedClasspathResources().stream().map(DiscoverySelectors::selectClasspathResource).forEach( selectors::add); Preconditions.notEmpty(selectors, "No arguments were supplied to the ConsoleLauncher"); return selectors; } private void addFilters(LauncherDiscoveryRequestBuilder requestBuilder, CommandLineOptions options) { requestBuilder.filters(includeClassNamePatterns(options.getIncludedClassNamePatterns().toArray(new String[0]))); if (!options.getExcludedClassNamePatterns().isEmpty()) { requestBuilder.filters( excludeClassNamePatterns(options.getExcludedClassNamePatterns().toArray(new String[0]))); } if (!options.getIncludedPackages().isEmpty()) { requestBuilder.filters(includePackageNames(options.getIncludedPackages())); } if (!options.getExcludedPackages().isEmpty()) { requestBuilder.filters(excludePackageNames(options.getExcludedPackages())); } if (!options.getIncludedTags().isEmpty()) { requestBuilder.filters(includeTags(options.getIncludedTags())); } if (!options.getExcludedTags().isEmpty()) { requestBuilder.filters(excludeTags(options.getExcludedTags())); } if (!options.getIncludedEngines().isEmpty()) { requestBuilder.filters(includeEngines(options.getIncludedEngines())); } if (!options.getExcludedEngines().isEmpty()) { requestBuilder.filters(excludeEngines(options.getExcludedEngines())); } } }