boolivar/jdoc-test

View on GitHub
jdoc-junit-engine-commons/src/main/java/org/bool/jdoc/core/JdocSpecReader.java

Summary

Maintainability
A
0 mins
Test Coverage
package org.bool.jdoc.core;

import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
import org.junit.platform.engine.DiscoverySelector;
import org.junit.platform.engine.discovery.DirectorySelector;
import org.junit.platform.engine.discovery.FileSelector;

import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@AllArgsConstructor
public class JdocSpecReader {

    private final JavaFileParser parser;

    /**
     * Collect the specs from selected java files.
     * 
     * <pre><code lang="spock">
     * def "Parse file specified by FileSelector"() {
     *   given:
     *     def spec = new SpecSource()
     *     parser.parse(java.nio.file.Paths.get("File.java")) >> spec
     *   when:
     *     def specs = $target.readSpecs([org.junit.platform.engine.discovery.DiscoverySelectors.selectFile("File.java")])
     *   then:
     *     specs == [spec]
     * }
     * </code></pre>
     */
    public JdocSpecReader(String lang) {
        this(new JavaFileParser(lang));
    }

    public List<SpecSource> readSpecs(List<DiscoverySelector> selectors) {
        return selectors.stream()
                .flatMap(this::streamFiles).distinct()
                .map(parser::parse).collect(Collectors.toList());
    }

    @SneakyThrows
    private Stream<Path> streamFiles(DiscoverySelector selector) {
        if (selector instanceof DirectorySelector) {
            return Files.walk(((DirectorySelector) selector).getPath())
                    .filter(path -> path.getFileName().toString().endsWith(".java"));
        }
        if (selector instanceof FileSelector) {
            return Stream.of(((FileSelector) selector).getPath());
        }
        return Stream.empty();
    }
}