Skip to content

Commit

Permalink
#12 - Added methods that accepts/rejects predicate to WhereObject class
Browse files Browse the repository at this point in the history
  • Loading branch information
avegera committed Jul 11, 2024
1 parent 42a9068 commit 72dfd0f
Show file tree
Hide file tree
Showing 3 changed files with 120 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package io.github.avegera.predicate4j.api;

import java.util.function.Predicate;

public interface WhereObject<T, R> {

RichPredicate<T> isEqualTo(R value);
Expand All @@ -13,4 +15,8 @@ public interface WhereObject<T, R> {
RichPredicate<T> notInstanceOf(Class<?> clazz);

RichPredicate<T> notNull();

RichPredicate<T> accepts(Predicate<R> predicate);

RichPredicate<T> rejects(Predicate<R> predicate);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import java.util.function.Function;
import java.util.function.Predicate;

import static io.github.avegera.predicate4j.Predicates.alwaysTrue;

public class WhereObjectImpl<T, R> implements WhereObject<T, R> {

private final Function<T, R> mapper;
Expand Down Expand Up @@ -53,6 +55,16 @@ public RichPredicate<T> notNull() {
return getPredicate(Predicates.notNull());
}

@Override
public RichPredicate<T> accepts(Predicate<R> predicate) {
return getPredicate(predicate);
}

@Override
public RichPredicate<T> rejects(Predicate<R> predicate) {
return getPredicate(predicate == null ? alwaysTrue() : predicate.negate());
}

protected RichPredicate<T> getPredicate(Predicate<R> predicate) {
Predicate<T> currentPredicate = getPredicateWithMapper(mapper, predicate);
if (previousPredicate == null) {
Expand All @@ -62,6 +74,6 @@ protected RichPredicate<T> getPredicate(Predicate<R> predicate) {
}

private Predicate<T> getPredicateWithMapper(Function<T, R> mapper, Predicate<R> predicate) {
return object -> object != null && predicate.test(mapper.apply(object));
return object -> object != null && predicate != null && predicate.test(mapper.apply(object));
}
}
101 changes: 101 additions & 0 deletions src/test/java/io/github/avegera/predicate4j/WhereTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.function.Predicate;

import static io.github.avegera.predicate4j.Where.where;
Expand Down Expand Up @@ -281,6 +282,106 @@ void mappedValueIsInstanceOfProvidedClass() {
}
}
}

@Nested
@DisplayName(".accepts(predicate)")
class Accepts {

@Nested
@DisplayName("returns true when")
class ReturnsTrueWhen {

@Test
@DisplayName("predicate accepts the mapped value")
void predicateAcceptsMappedValue() {
Predicate<User> predicate = where(User::id).accepts(id -> id == TEST_ID_1);
assertThat(predicate).accepts(new User(TEST_ID_1));
}

@Test
@DisplayName("predicate accepts null value")
void predicateAcceptsNullValue() {
Predicate<User> predicate = where(User::id).accepts(Objects::isNull);
assertThat(predicate).accepts(new User(null));
}
}

@Nested
@DisplayName("returns false when")
class ReturnsFalseWhen {

@Test
@DisplayName("predicate does not accept the mapped value")
void predicateDoesNotAcceptMappedValue() {
Predicate<User> predicate = where(User::id).accepts(id -> id == TEST_ID_1);
assertThat(predicate).rejects(new User(TEST_ID_2));
}

@Test
@DisplayName("predicate does not accept non-null value")
void predicateDoesNotAcceptNonNullValue() {
Predicate<User> predicate = where(User::id).accepts(Objects::isNull);
assertThat(predicate).rejects(new User(TEST_ID_1));
}

@Test
@DisplayName("predicate is null")
void predicateIsNull() {
Predicate<User> predicate = where(User::id).accepts(null);
assertThat(predicate).rejects(new User(TEST_ID_1));
}
}
}

@Nested
@DisplayName(".rejects(predicate)")
class Rejects {

@Nested
@DisplayName("returns true when")
class ReturnsTrueWhen {

@Test
@DisplayName("predicate rejects the mapped value")
void predicateRejectsMappedValue() {
Predicate<User> predicate = where(User::id).rejects(id -> id != TEST_ID_1);
assertThat(predicate).accepts(new User(TEST_ID_1));
}

@Test
@DisplayName("predicate rejects null value")
void predicateRejectsNullValue() {
Predicate<User> predicate = where(User::id).rejects(Objects::nonNull);
assertThat(predicate).accepts(new User(null));
}

@Test
@DisplayName("predicate is null")
void predicateIsNull() {
Predicate<User> predicate = where(User::id).rejects(null);
assertThat(predicate).accepts(new User(TEST_ID_1));
}
}

@Nested
@DisplayName("returns false when")
class ReturnsFalseWhen {

@Test
@DisplayName("predicate does not reject the mapped value")
void predicateDoesNotRejectMappedValue() {
Predicate<User> predicate = where(User::id).rejects(id -> id != TEST_ID_1);
assertThat(predicate).rejects(new User(TEST_ID_2));
}

@Test
@DisplayName("predicate does not reject non-null value")
void predicateDoesNotRejectNonNullValue() {
Predicate<User> predicate = where(User::id).rejects(Objects::nonNull);
assertThat(predicate).rejects(new User(TEST_ID_1));
}
}
}
}

@Nested
Expand Down

0 comments on commit 72dfd0f

Please sign in to comment.