diff --git a/archunit/src/main/java/com/tngtech/archunit/base/DescribedPredicate.java b/archunit/src/main/java/com/tngtech/archunit/base/DescribedPredicate.java index 3f1c609577..8ce8d2ee04 100644 --- a/archunit/src/main/java/com/tngtech/archunit/base/DescribedPredicate.java +++ b/archunit/src/main/java/com/tngtech/archunit/base/DescribedPredicate.java @@ -51,6 +51,15 @@ public String getDescription() { return description; } + /** + * @return A {@link DescribedPredicate} that will return {@code true} whenever this predicate would return {@code false}, and vice versa. + */ + @Override + @PublicAPI(usage = ACCESS) + public DescribedPredicate negate() { + return new NotPredicate<>(this); + } + /** * Overwrites the description of this {@link DescribedPredicate}. E.g. * @@ -176,7 +185,7 @@ public static DescribedPredicate doNot(DescribedPredicate pred /** * @param predicate Any {@link DescribedPredicate} - * @return A predicate that will return {@code true} whenever the original predicate would return {@code false} and vice versa. + * @return A predicate that will return {@code true} whenever the original predicate would return {@code false}, and vice versa. * @param The type of object the {@link DescribedPredicate predicate} applies to */ @PublicAPI(usage = ACCESS) diff --git a/archunit/src/test/java/com/tngtech/archunit/base/DescribedPredicateTest.java b/archunit/src/test/java/com/tngtech/archunit/base/DescribedPredicateTest.java index d63cad89ac..15d6236b3d 100644 --- a/archunit/src/test/java/com/tngtech/archunit/base/DescribedPredicateTest.java +++ b/archunit/src/test/java/com/tngtech/archunit/base/DescribedPredicateTest.java @@ -200,19 +200,25 @@ public void describe_works() { @DataProvider public static Object[][] not_scenarios() { return $$( - $(new NotScenario("not") { + $(new NotScenario("not", ".negate") { + @Override + DescribedPredicate apply(DescribedPredicate input) { + return input.negate(); + } + }), + $(new NotScenario("not", "not") { @Override DescribedPredicate apply(DescribedPredicate input) { return not(input); } }), - $(new NotScenario("do not") { + $(new NotScenario("do not", "doNot") { @Override DescribedPredicate apply(DescribedPredicate input) { return doNot(input); } }), - $(new NotScenario("does not") { + $(new NotScenario("does not", "doesNot") { @Override DescribedPredicate apply(DescribedPredicate input) { return doesNot(input); @@ -279,16 +285,18 @@ private Function constant(int integer) { private abstract static class NotScenario { private final String expectedPrefix; + private final String methodName; - NotScenario(String expectedPrefix) { + NotScenario(String expectedPrefix, String methodName) { this.expectedPrefix = expectedPrefix; + this.methodName = methodName; } abstract DescribedPredicate apply(DescribedPredicate input); @Override public String toString() { - return expectedPrefix; + return expectedPrefix + " (via " + methodName + ")"; } }