package org.fluentlenium.core.conditions; import org.fluentlenium.core.FluentDriver; import org.fluentlenium.core.domain.FluentWebElement; import java.util.List; import java.util.function.Predicate; /** * Conditions for list of elements, matching when at least one element of the list matches. */ public class AtLeastOneElementConditions extends AbstractFluentListConditions { /** * Creates a new condition. * * @param elements underlying elements */ public AtLeastOneElementConditions(List<? extends FluentWebElement> elements) { super(elements); } @Override public AtLeastOneElementConditions not() { AtLeastOneElementConditions negatedConditions = new AtLeastOneElementConditions(getElements()); negatedConditions.setNegation(!isNegation()); return negatedConditions; } @Override public boolean verify(Predicate<FluentWebElement> predicate, boolean defaultValue) { if (isNegation()) { predicate = predicate.negate(); defaultValue = !defaultValue; } return buildAtLeastOnePredicate(predicate, defaultValue).test(null); } /** * Build predicate for this condition. * * @param predicate predicate * @param defaultValue default value if elements list is empty. * @return predicate */ protected Predicate<FluentDriver> buildAtLeastOnePredicate(Predicate<FluentWebElement> predicate, boolean defaultValue) { Predicate<FluentDriver> untilPredicate = fluent -> { if (!getElements().isEmpty()) { for (FluentWebElement element : getElements()) { if (predicate.test(element)) { return true; } } return false; } return defaultValue; }; return untilPredicate; } }