InstanceStepConditionMatcher.java

  1. package org.jbehave.core.condition;

  2. import static org.apache.commons.lang3.Validate.isTrue;

  3. import java.util.Collection;
  4. import java.util.function.Function;
  5. import java.util.function.Predicate;
  6. import java.util.stream.Collectors;

  7. public class InstanceStepConditionMatcher implements StepConditionMatcher {

  8.     private final Collection<Predicate<Object>> conditions;

  9.     public InstanceStepConditionMatcher(Collection<Predicate<Object>> conditions) {

  10.         conditions.stream()
  11.                   .map(Predicate::getClass)
  12.                   .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
  13.                   .forEach((type, count) -> isTrue(count == 1, "Only one instance of %s condition is allowed", type));

  14.         this.conditions = conditions;
  15.     }

  16.     @Override
  17.     public boolean matches(Class<? extends Predicate<Object>> condition, Object value)
  18.             throws StepConditionMatchException {
  19.         return conditions.stream()
  20.                          .filter(c -> c.getClass().equals(condition))
  21.                          .findFirst()
  22.                          .orElseThrow(() -> new StepConditionMatchException(
  23.                                  String.format("Unable to find implementation for the %s condition", condition)))
  24.                          .test(value);
  25.     }
  26. }