Skip to content

Commit

Permalink
#19 - Refactored list size predicates
Browse files Browse the repository at this point in the history
  • Loading branch information
avegera committed Jul 25, 2024
1 parent 28f7939 commit 04e693e
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,9 @@ public interface WhereList<T, R> extends WhereObject<T, List<R>> {

RichPredicate<T> notEmpty();

RichPredicate<T> hasSize(int size);

RichPredicate<T> notHaveSize(int size);

RichPredicate<T> contains(R element);

RichPredicate<T> notContains(R element);

WhereNumber<T, Integer> size();
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import io.github.avegera.predicate4j.Predicates;
import io.github.avegera.predicate4j.api.RichPredicate;
import io.github.avegera.predicate4j.api.WhereList;
import io.github.avegera.predicate4j.api.WhereNumber;

import java.util.List;
import java.util.function.Function;
Expand All @@ -28,22 +29,21 @@ public RichPredicate<T> notEmpty() {
}

@Override
public RichPredicate<T> hasSize(int size) {
return getPredicate(Predicates.hasSize(size));
public RichPredicate<T> contains(R element) {
return getPredicate(Predicates.containsElement(element));
}

@Override
public RichPredicate<T> notHaveSize(int size) {
return getPredicate(Predicates.notHaveSize(size));
public RichPredicate<T> notContains(R element) {
return getPredicate(Predicates.notContainsElement(element));
}

@Override
public RichPredicate<T> contains(R element) {
return getPredicate(Predicates.containsElement(element));
public WhereNumber<T, Integer> size() {
return new WhereNumberImpl<>(this::getSize, previousPredicate);
}

@Override
public RichPredicate<T> notContains(R element) {
return getPredicate(Predicates.notContainsElement(element));
private Integer getSize(T object) {
return getInt(object, List::size);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,14 @@ protected RichPredicate<T> getPredicate(Predicate<R> predicate) {
return new RichPredicateImpl<>(previousPredicate.and(currentPredicate));
}

protected Integer getInt(T object, Function<R, Integer> intFunction) {
if (mapper == null) {
return null;
}
R result = mapper.apply(object);
return result != null ? intFunction.apply(result) : 0;
}

private Predicate<T> getPredicateWithMapper(Function<T, R> mapper, Predicate<R> predicate) {
return object -> object != null && predicate != null && predicate.test(mapper.apply(object));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,6 @@ public WhereNumber<T, Integer> length() {
}

private Integer getLength(T object) {
if (mapper == null) {
return null;
}
String string = mapper.apply(object);
return string != null ? string.length() : 0;
return getInt(object, String::length);
}
}
32 changes: 16 additions & 16 deletions src/test/java/io/github/avegera/predicate4j/WhereTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -1218,8 +1218,8 @@ void mappedListIsEmpty() {
}

@Nested
@DisplayName(".hasSize(size)")
class HasSize {
@DisplayName(".size().isEqualTo(size)")
class SizeIsEqualTo {

@Nested
@DisplayName("returns true when")
Expand All @@ -1228,21 +1228,21 @@ class ReturnsTrueWhen {
@Test
@DisplayName("mapped list has the specified size")
void mappedListHasSpecifiedSize() {
Predicate<Customer> predicate = where().list(Customer::roles).hasSize(2);
Predicate<Customer> predicate = where().list(Customer::roles).size().isEqualTo(2);
assertThat(predicate).accepts(new Customer(asList("Admin", "User"), null));
}

@Test
@DisplayName("mapped list is empty and specified size is zero")
void mappedListIsEmptyAndSpecifiedSizeIsZero() {
Predicate<Customer> predicate = where().list(Customer::roles).hasSize(0);
Predicate<Customer> predicate = where().list(Customer::roles).size().isEqualTo(0);
assertThat(predicate).accepts(new Customer(new ArrayList<>(), null));
}

@Test
@DisplayName("mapped list is null and specified size is zero")
void mappedListIsNullAndSpecifiedSizeIsZero() {
Predicate<Customer> predicate = where().list(Customer::roles).hasSize(0);
Predicate<Customer> predicate = where().list(Customer::roles).size().isEqualTo(0);
assertThat(predicate).accepts(new Customer(new ArrayList<>(), null));
}
}
Expand All @@ -1254,29 +1254,29 @@ class ReturnsFalseWhen {
@Test
@DisplayName("mapped list has a different size than specified")
void mappedListHasDifferentSize() {
Predicate<Customer> predicate = where().list(Customer::roles).hasSize(3);
Predicate<Customer> predicate = where().list(Customer::roles).size().isEqualTo(3);
assertThat(predicate).rejects(new Customer(asList("Admin", "User"), null));
}

@Test
@DisplayName("mapped list is empty and size is not zero")
void mappedListIsEmptyAndSizeIsNotZero() {
Predicate<Customer> predicate = where().list(Customer::roles).hasSize(1);
Predicate<Customer> predicate = where().list(Customer::roles).size().isEqualTo(1);
assertThat(predicate).rejects(new Customer(new ArrayList<>(), null));
}

@Test
@DisplayName("mapped list is null and size is not zero")
void mappedListIsNullAndSizeIsNotZero() {
Predicate<Customer> predicate = where().list(Customer::roles).hasSize(2);
Predicate<Customer> predicate = where().list(Customer::roles).size().isEqualTo(2);
assertThat(predicate).rejects(new Customer(null, null));
}
}
}

@Nested
@DisplayName(".notHaveSize(size)")
class NotHaveSize {
@DisplayName(".size().notEqualTo(size)")
class SizeNotEqualTo {

@Nested
@DisplayName("returns true when")
Expand All @@ -1285,21 +1285,21 @@ class ReturnsTrueWhen {
@Test
@DisplayName("mapped list does not have the specified size")
void mappedListDoesNotHaveSpecifiedSize() {
Predicate<Customer> predicate = where().list(Customer::roles).notHaveSize(3);
Predicate<Customer> predicate = where().list(Customer::roles).size().notEqualTo(3);
assertThat(predicate).accepts(new Customer(asList("Admin", "User"), null));
}

@Test
@DisplayName("mapped list is null and specified size is not zero")
void mappedListIsNullAndSpecifiedSizeIsNotZero() {
Predicate<Customer> predicate = where().list(Customer::roles).notHaveSize(2);
Predicate<Customer> predicate = where().list(Customer::roles).size().notEqualTo(2);
assertThat(predicate).accepts(new Customer(null, null));
}

@Test
@DisplayName("mapped list is empty and size is not zero")
void mappedListIsEmptyAndSizeIsNotZero() {
Predicate<Customer> predicate = where().list(Customer::roles).notHaveSize(1);
Predicate<Customer> predicate = where().list(Customer::roles).size().notEqualTo(1);
assertThat(predicate).accepts(new Customer(new ArrayList<>(), null));
}
}
Expand All @@ -1311,21 +1311,21 @@ class ReturnsFalseWhen {
@Test
@DisplayName("mapped list has the specified size")
void mappedListHasSpecifiedSize() {
Predicate<Customer> predicate = where().list(Customer::roles).notHaveSize(2);
Predicate<Customer> predicate = where().list(Customer::roles).size().notEqualTo(2);
assertThat(predicate).rejects(new Customer(asList("Admin", "User"), null));
}

@Test
@DisplayName("mapped list is empty and specified size is zero")
void mappedListIsEmptyAndSpecifiedSizeIsZero() {
Predicate<Customer> predicate = where().list(Customer::roles).notHaveSize(0);
Predicate<Customer> predicate = where().list(Customer::roles).size().notEqualTo(0);
assertThat(predicate).rejects(new Customer(new ArrayList<>(), null));
}

@Test
@DisplayName("mapped list is null and specified size is zero")
void mappedListIsNullAndSpecifiedSizeIsZero() {
Predicate<Customer> predicate = where().list(Customer::roles).notHaveSize(0);
Predicate<Customer> predicate = where().list(Customer::roles).size().notEqualTo(0);
assertThat(predicate).rejects(new Customer(new ArrayList<>(), null));
}
}
Expand Down

0 comments on commit 04e693e

Please sign in to comment.