From 6ba1422a7d6e12903e8eff055b5ec45d8a590657 Mon Sep 17 00:00:00 2001 From: Marc Philipp Date: Thu, 21 Jan 2016 20:38:48 +0100 Subject: [PATCH] Move combine methods for DiscoveryFilters to interface and document them --- .../gen5/engine/CombinedDiscoveryFilter.java | 55 ++++++++++++ .../junit/gen5/engine/DiscoveryFilter.java | 52 ++++++++++- .../gen5/engine/discovery/CommonFilter.java | 86 ------------------- ...erTests.java => DiscoveryFilterTests.java} | 21 +++-- 4 files changed, 118 insertions(+), 96 deletions(-) create mode 100644 junit-engine-api/src/main/java/org/junit/gen5/engine/CombinedDiscoveryFilter.java delete mode 100644 junit-engine-api/src/main/java/org/junit/gen5/engine/discovery/CommonFilter.java rename junit-tests/src/test/java/org/junit/gen5/engine/{discovery/CommonFilterTests.java => DiscoveryFilterTests.java} (67%) diff --git a/junit-engine-api/src/main/java/org/junit/gen5/engine/CombinedDiscoveryFilter.java b/junit-engine-api/src/main/java/org/junit/gen5/engine/CombinedDiscoveryFilter.java new file mode 100644 index 00000000000..71cdabcd87b --- /dev/null +++ b/junit-engine-api/src/main/java/org/junit/gen5/engine/CombinedDiscoveryFilter.java @@ -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 implements DiscoveryFilter { + + @SuppressWarnings("rawtypes") + private static final DiscoveryFilter ALWAYS_INCLUDED_DISCOVERY_FILTER = obj -> included("Always included"); + + @SuppressWarnings("unchecked") + static DiscoveryFilter alwaysIncluded() { + return ALWAYS_INCLUDED_DISCOVERY_FILTER; + } + + private final Collection> filters; + + public CombinedDiscoveryFilter(Collection> 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 ")); + } +} diff --git a/junit-engine-api/src/main/java/org/junit/gen5/engine/DiscoveryFilter.java b/junit-engine-api/src/main/java/org/junit/gen5/engine/DiscoveryFilter.java index 17df634959f..20ddb96b68c 100644 --- a/junit-engine-api/src/main/java/org/junit/gen5/engine/DiscoveryFilter.java +++ b/junit-engine-api/src/main/java/org/junit/gen5/engine/DiscoveryFilter.java @@ -10,9 +10,16 @@ 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. - * These filters need to be applied by the {@link TestEngine} during test + * Filters particular tests during test discovery. + * + *

These filters need to be applied by the {@link TestEngine} during test * discovery. * * @since 5.0 @@ -20,4 +27,45 @@ * @see TestEngine */ public interface DiscoveryFilter extends GenericFilter { + + /** + * 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. + * + *

If the array is {@code null} or empty, the returned filter will + * include all elements it is asked to filter. + * + *

If the length of the array is 1, this method will return the filter + * contained in the array. + */ + @SafeVarargs + public static DiscoveryFilter combine(DiscoveryFilter... 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. + * + *

If the collection is {@code null} or empty, the returned filter will + * include all elements it is asked to filter. + * + *

If the size of the collection is 1, this method will return the filter + * contained in the collection. + */ + public static DiscoveryFilter combine(Collection> filters) { + if (filters == null || filters.isEmpty()) { + return alwaysIncluded(); + } + if (filters.size() == 1) { + return getOnlyElement(filters); + } + return new CombinedDiscoveryFilter<>(filters); + } + } diff --git a/junit-engine-api/src/main/java/org/junit/gen5/engine/discovery/CommonFilter.java b/junit-engine-api/src/main/java/org/junit/gen5/engine/discovery/CommonFilter.java deleted file mode 100644 index 8fe7ad1f970..00000000000 --- a/junit-engine-api/src/main/java/org/junit/gen5/engine/discovery/CommonFilter.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * 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.discovery; - -import static java.lang.String.format; -import static java.util.Arrays.asList; -import static java.util.stream.Collectors.joining; - -import java.util.Collection; - -import org.junit.gen5.engine.DiscoveryFilter; -import org.junit.gen5.engine.EngineDiscoveryRequest; -import org.junit.gen5.engine.FilterResult; - -/** - * A collection of common builders for {@link EngineDiscoveryRequest} elements. - * - * @since 5.0 - */ -class CommonFilter { - - @SuppressWarnings("rawtypes") - private static final DiscoveryFilter ALWAYS_INCLUDED_DISCOVERY_FILTER = (obj) -> FilterResult.included( - "Always included"); - - @SafeVarargs - public static DiscoveryFilter combine(DiscoveryFilter... filters) { - if (filters == null) { - return alwaysIncluded(); - } - else { - return combine(asList(filters)); - } - } - - public static DiscoveryFilter combine(Collection> filters) { - if (filters == null || filters.isEmpty()) { - return alwaysIncluded(); - } - else if (filters.size() == 1) { - return filters.iterator().next(); - } - else { - return new AndAllDiscoveryFilter<>(filters); - } - } - - @SuppressWarnings("unchecked") - private static DiscoveryFilter alwaysIncluded() { - return ALWAYS_INCLUDED_DISCOVERY_FILTER; - } - - private static class AndAllDiscoveryFilter implements DiscoveryFilter { - - private final Collection> filters; - - public AndAllDiscoveryFilter(Collection> filters) { - this.filters = filters; - } - - @Override - public FilterResult filter(T element) { - // @formatter:off - return this.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 this.filters.stream().map(Object::toString).map(s -> format("(%s)", s)).collect(joining(" and ")); - } - } - -} diff --git a/junit-tests/src/test/java/org/junit/gen5/engine/discovery/CommonFilterTests.java b/junit-tests/src/test/java/org/junit/gen5/engine/DiscoveryFilterTests.java similarity index 67% rename from junit-tests/src/test/java/org/junit/gen5/engine/discovery/CommonFilterTests.java rename to junit-tests/src/test/java/org/junit/gen5/engine/DiscoveryFilterTests.java index 6b173539c60..2cc3dd41477 100644 --- a/junit-tests/src/test/java/org/junit/gen5/engine/discovery/CommonFilterTests.java +++ b/junit-tests/src/test/java/org/junit/gen5/engine/DiscoveryFilterTests.java @@ -8,24 +8,29 @@ * 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.engine.FilterResult.*; +import static org.junit.gen5.api.Assertions.assertEquals; +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 org.junit.gen5.api.Test; import org.junit.gen5.engine.DiscoveryFilter; +import org.junit.gen5.engine.discovery.ClassFilter; import org.junit.gen5.launcher.DiscoveryFilterMock; -public class CommonFilterTests { +class DiscoveryFilterTests { @SuppressWarnings("unchecked") @Test void allOfWithoutFilter() { DiscoveryFilter[] noFilters = new DiscoveryFilter[0]; - DiscoveryFilter combinedFilter = CommonFilter.combine(noFilters); + DiscoveryFilter combinedFilter = DiscoveryFilter.combine(noFilters); assertTrue(combinedFilter.filter(String.class).included()); assertTrue(combinedFilter.filter(Object.class).included()); @@ -34,7 +39,7 @@ void allOfWithoutFilter() { @Test void allOfWithSingleFilter() { DiscoveryFilter> singleFilter = ClassFilter.byNamePattern(".*ring.*"); - DiscoveryFilter> combined = CommonFilter.combine(singleFilter); + DiscoveryFilter> combined = DiscoveryFilter.combine(singleFilter); assertSame(singleFilter, combined); } @@ -43,7 +48,7 @@ void allOfWithMultipleFiltersIsConjunction() { DiscoveryFilter> firstFilter = ClassFilter.byNamePattern(".*ring.*"); DiscoveryFilter> secondFilter = ClassFilter.byNamePattern(".*Join.*"); - DiscoveryFilter> combined = CommonFilter.combine(firstFilter, secondFilter); + DiscoveryFilter> combined = DiscoveryFilter.combine(firstFilter, secondFilter); assertFalse(combined.filter(String.class).included()); assertTrue(combined.filter(StringJoiner.class).included()); @@ -54,7 +59,7 @@ void allOfWithMultipleFiltersHasReadableDescription() { DiscoveryFilter firstFilter = new DiscoveryFilterMock(o -> excluded("wrong"), () -> "1st"); DiscoveryFilter secondFilter = new DiscoveryFilterMock(o -> included("right"), () -> "2nd"); - DiscoveryFilter combined = CommonFilter.combine(firstFilter, secondFilter); + DiscoveryFilter combined = DiscoveryFilter.combine(firstFilter, secondFilter); assertFalse(combined.filter(String.class).included()); assertEquals("(1st) and (2nd)", combined.toString());