boolivar/jdoc-test

View on GitHub
jdoc-spock/src/main/java/org/bool/jdoc/spock/DiscoveryRequestMapper.java

Summary

Maintainability
A
40 mins
Test Coverage
package org.bool.jdoc.spock;

import org.bool.jdoc.core.DiscoveryRequest;
import org.bool.jdoc.core.JdocSpecReader;
import org.bool.jdoc.core.SpecSource;

import lombok.AllArgsConstructor;
import org.junit.platform.engine.DiscoverySelector;
import org.junit.platform.engine.EngineDiscoveryRequest;
import org.junit.platform.engine.discovery.DiscoverySelectors;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static org.bool.jdoc.spock.ConfigParams.*;

@AllArgsConstructor
public class DiscoveryRequestMapper {

    private final JdocSpecReader specReader;

    public DiscoveryRequestMapper() {
        this(new JdocSpecReader("spock"));
    }

    /**
     * Maps jdoc engine discovery request to spock engine discovery request.
     * 
     * <pre><code lang="spock">
     * def "file selector mapping"() {
     *   given:
     *     def params = Mock(org.junit.platform.engine.ConfigurationParameters)
     *     def specClassMapper = Mock(SpecClassMapper)
     *     def selectors = [DiscoverySelectors.selectFile("File.java")]
     *     def request = DiscoveryRequest.builder().selectors(selectors).params(params).build()
     *     def spec = new SpecSource()
     *
     *     params.get(ConfigParams.TEST_DIRS.key) >> Optional.empty()
     *     params.get(ConfigParams.TEST_FILES.key) >> Optional.empty()
     *     specReader.readSpecs(selectors) >> [spec]
     *     specClassMapper.toTestSpecClasses(spec) >> [getClass()]
     *   when:
     *     def result = $target.toSpockDiscoveryRequest(request, specClassMapper)
     *   then:
     *     result.params == params
     *     result.getSelectorsByType(DiscoverySelector.class).size() == 1
     *     result.getSelectorsByType(DiscoverySelector.class).get(0).javaClass == getClass()
     * }
     * </code></pre>
     */
    public EngineDiscoveryRequest toSpockDiscoveryRequest(EngineDiscoveryRequest request, SpecClassMapper specClassMapper) {
        List<SpecSource> specs = specReader.readSpecs(streamSelectors(request).collect(Collectors.toList()));
        List<DiscoverySelector> selectors = specs.stream()
                .flatMap(spec -> specClassMapper.toTestSpecClasses(spec).stream())
                .map(DiscoverySelectors::selectClass)
                .collect(Collectors.toList());
        return DiscoveryRequest.builder()
                .selectors(selectors)
                .params(request.getConfigurationParameters())
                .listener(request.getDiscoveryListener())
                .build();
    }

    private Stream<DiscoverySelector> streamSelectors(EngineDiscoveryRequest request) {
        return Stream.concat(
                request.getSelectorsByType(DiscoverySelector.class).stream(),
                Stream.concat(
                        TEST_DIRS.get(request.getConfigurationParameters()).stream().map(DiscoverySelectors::selectDirectory),
                        TEST_FILES.get(request.getConfigurationParameters()).stream().map(DiscoverySelectors::selectFile)
                )
        );
    }
}