Skip to content

Commit

Permalink
Move combine methods for DiscoveryFilters to interface and document them
Browse files Browse the repository at this point in the history
  • Loading branch information
marcphilipp committed Jan 21, 2016
1 parent 4ceddca commit 6ba1422
Show file tree
Hide file tree
Showing 4 changed files with 118 additions and 96 deletions.
@@ -0,0 +1,55 @@
/*
* Copyright 2015-2016 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.gen5.engine;

import static java.lang.String.format;
import static java.util.stream.Collectors.joining;
import static org.junit.gen5.engine.FilterResult.included;

import java.util.Collection;

/**
* Combines a collection of {@link DiscoveryFilter DiscoveryFilters} into a new
* filter that will include elements if and only if all of the filters in the
* specified collection include it.
*/
class CombinedDiscoveryFilter<T> implements DiscoveryFilter<T> {

@SuppressWarnings("rawtypes")
private static final DiscoveryFilter ALWAYS_INCLUDED_DISCOVERY_FILTER = obj -> included("Always included");

@SuppressWarnings("unchecked")
static <T> DiscoveryFilter<T> alwaysIncluded() {
return ALWAYS_INCLUDED_DISCOVERY_FILTER;
}

private final Collection<DiscoveryFilter<T>> filters;

public CombinedDiscoveryFilter(Collection<DiscoveryFilter<T>> filters) {
this.filters = filters;
}

@Override
public FilterResult filter(T element) {
// @formatter:off
return filters.stream()
.map(filter -> filter.filter(element))
.filter(FilterResult::excluded)
.findFirst()
.orElse(FilterResult.included("Element was included by all filters."));
// @formatter:on
}

@Override
public String toString() {
return filters.stream().map(Object::toString).map(value -> format("(%s)", value)).collect(joining(" and "));
}
}
Expand Up @@ -10,14 +10,62 @@


package org.junit.gen5.engine; package org.junit.gen5.engine;


import static java.util.Arrays.asList;
import static org.junit.gen5.commons.util.CollectionUtils.getOnlyElement;
import static org.junit.gen5.engine.CombinedDiscoveryFilter.alwaysIncluded;

import java.util.Collection;

/** /**
* A {@code DiscoveryFilter} filters particular tests during test discovery. * Filters particular tests during test discovery.
* These filters need to be applied by the {@link TestEngine} during test *
* <p>These filters need to be applied by the {@link TestEngine} during test
* discovery. * discovery.
* *
* @since 5.0 * @since 5.0
* @see EngineDiscoveryRequest * @see EngineDiscoveryRequest
* @see TestEngine * @see TestEngine
*/ */
public interface DiscoveryFilter<T> extends GenericFilter<T> { public interface DiscoveryFilter<T> extends GenericFilter<T> {

/**
* Combines an array of {@code DiscoveryFilters} into a new filter that will
* include elements if and only if all of the filters in the specified array
* include it.
*
* <p>If the array is {@code null} or empty, the returned filter will
* include all elements it is asked to filter.
*
* <p>If the length of the array is 1, this method will return the filter
* contained in the array.
*/
@SafeVarargs
public static <T> DiscoveryFilter<T> combine(DiscoveryFilter<T>... filters) {
if (filters == null) {
return alwaysIncluded();
}
return combine(asList(filters));
}

/**
* Combines a collection of {@code DiscoveryFilters} into a new filter that
* will include elements if and only if all of the filters in the specified
* collection include it.
*
* <p>If the collection is {@code null} or empty, the returned filter will
* include all elements it is asked to filter.
*
* <p>If the size of the collection is 1, this method will return the filter
* contained in the collection.
*/
public static <T> DiscoveryFilter<T> combine(Collection<DiscoveryFilter<T>> filters) {
if (filters == null || filters.isEmpty()) {
return alwaysIncluded();
}
if (filters.size() == 1) {
return getOnlyElement(filters);
}
return new CombinedDiscoveryFilter<>(filters);
}

} }

This file was deleted.

Expand Up @@ -8,24 +8,29 @@
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
*/ */


package org.junit.gen5.engine.discovery; package org.junit.gen5.engine;


import static org.junit.gen5.api.Assertions.*; import static org.junit.gen5.api.Assertions.assertEquals;
import static org.junit.gen5.engine.FilterResult.*; import static org.junit.gen5.api.Assertions.assertFalse;
import static org.junit.gen5.api.Assertions.assertSame;
import static org.junit.gen5.api.Assertions.assertTrue;
import static org.junit.gen5.engine.FilterResult.excluded;
import static org.junit.gen5.engine.FilterResult.included;


import java.util.StringJoiner; import java.util.StringJoiner;


import org.junit.gen5.api.Test; import org.junit.gen5.api.Test;
import org.junit.gen5.engine.DiscoveryFilter; import org.junit.gen5.engine.DiscoveryFilter;
import org.junit.gen5.engine.discovery.ClassFilter;
import org.junit.gen5.launcher.DiscoveryFilterMock; import org.junit.gen5.launcher.DiscoveryFilterMock;


public class CommonFilterTests { class DiscoveryFilterTests {


@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Test @Test
void allOfWithoutFilter() { void allOfWithoutFilter() {
DiscoveryFilter<Object>[] noFilters = new DiscoveryFilter[0]; DiscoveryFilter<Object>[] noFilters = new DiscoveryFilter[0];
DiscoveryFilter<Object> combinedFilter = CommonFilter.combine(noFilters); DiscoveryFilter<Object> combinedFilter = DiscoveryFilter.combine(noFilters);


assertTrue(combinedFilter.filter(String.class).included()); assertTrue(combinedFilter.filter(String.class).included());
assertTrue(combinedFilter.filter(Object.class).included()); assertTrue(combinedFilter.filter(Object.class).included());
Expand All @@ -34,7 +39,7 @@ void allOfWithoutFilter() {
@Test @Test
void allOfWithSingleFilter() { void allOfWithSingleFilter() {
DiscoveryFilter<Class<?>> singleFilter = ClassFilter.byNamePattern(".*ring.*"); DiscoveryFilter<Class<?>> singleFilter = ClassFilter.byNamePattern(".*ring.*");
DiscoveryFilter<Class<?>> combined = CommonFilter.combine(singleFilter); DiscoveryFilter<Class<?>> combined = DiscoveryFilter.combine(singleFilter);
assertSame(singleFilter, combined); assertSame(singleFilter, combined);
} }


Expand All @@ -43,7 +48,7 @@ void allOfWithMultipleFiltersIsConjunction() {
DiscoveryFilter<Class<?>> firstFilter = ClassFilter.byNamePattern(".*ring.*"); DiscoveryFilter<Class<?>> firstFilter = ClassFilter.byNamePattern(".*ring.*");
DiscoveryFilter<Class<?>> secondFilter = ClassFilter.byNamePattern(".*Join.*"); DiscoveryFilter<Class<?>> secondFilter = ClassFilter.byNamePattern(".*Join.*");


DiscoveryFilter<Class<?>> combined = CommonFilter.combine(firstFilter, secondFilter); DiscoveryFilter<Class<?>> combined = DiscoveryFilter.combine(firstFilter, secondFilter);


assertFalse(combined.filter(String.class).included()); assertFalse(combined.filter(String.class).included());
assertTrue(combined.filter(StringJoiner.class).included()); assertTrue(combined.filter(StringJoiner.class).included());
Expand All @@ -54,7 +59,7 @@ void allOfWithMultipleFiltersHasReadableDescription() {
DiscoveryFilter<Object> firstFilter = new DiscoveryFilterMock(o -> excluded("wrong"), () -> "1st"); DiscoveryFilter<Object> firstFilter = new DiscoveryFilterMock(o -> excluded("wrong"), () -> "1st");
DiscoveryFilter<Object> secondFilter = new DiscoveryFilterMock(o -> included("right"), () -> "2nd"); DiscoveryFilter<Object> secondFilter = new DiscoveryFilterMock(o -> included("right"), () -> "2nd");


DiscoveryFilter<Object> combined = CommonFilter.combine(firstFilter, secondFilter); DiscoveryFilter<Object> combined = DiscoveryFilter.combine(firstFilter, secondFilter);


assertFalse(combined.filter(String.class).included()); assertFalse(combined.filter(String.class).included());
assertEquals("(1st) and (2nd)", combined.toString()); assertEquals("(1st) and (2nd)", combined.toString());
Expand Down

0 comments on commit 6ba1422

Please sign in to comment.