package net.thucydides.core.matchers; import ch.lambdaj.function.convert.Converter; import org.hamcrest.Matcher; import java.util.Collection; import java.util.List; import static ch.lambdaj.Lambda.convert; import static java.util.Collections.min; import static net.thucydides.core.matchers.dates.BeanFields.fieldValueIn; class MinFieldValueMatcher implements BeanCollectionMatcher { private final String fieldName; private final Matcher<? extends Comparable> valueMatcher; public MinFieldValueMatcher(String fieldName, Matcher<? extends Comparable> valueMatcher) { this.fieldName = fieldName; this.valueMatcher = valueMatcher; } public <T> boolean matches(Collection<T> elements) { List<Comparable> fieldValues = convert(elements, toComparable()); return valueMatcher.matches(min(fieldValues)); } private <T> Converter<T, Comparable> toComparable() { return new Converter<T, Comparable>() { @Override public Comparable convert(T bean) { return (Comparable) fieldValueIn(bean).forField(fieldName); } }; } @Override public String toString() { return "the minimum " + fieldName + " " + valueMatcher.toString(); } @Override public boolean matches(Object target) { return matches( (Collection) target); } }