package com.crawljax.condition;
import java.util.concurrent.atomic.AtomicInteger;
import net.jcip.annotations.ThreadSafe;
import com.crawljax.browser.EmbeddedBrowser;
import com.google.common.base.Objects;
/**
* Condition that counts how many times a condition is specified and returns true iff the specified
* condition is satisfied less than the specified number.
*
* @author dannyroest@gmail.com (Danny Roest)
*/
@ThreadSafe
public class CountCondition implements Condition {
private final Condition condition;
private final AtomicInteger count = new AtomicInteger(0);
private final int maxCount;
/**
* @param maxCount
* number of times the condition can be satisfied.
* @param condition
* the condition.
*/
public CountCondition(int maxCount, Condition condition) {
this.maxCount = maxCount;
this.condition = condition;
}
/**
* Note: Check has a side effect (it increments a counter). Invoking it multiple times may
* result in a different answer.
*/
@Override
public boolean check(EmbeddedBrowser browser) {
if (condition.check(browser)) {
count.getAndIncrement();
}
return count.get() <= maxCount;
}
@Override
public String toString() {
return Objects.toStringHelper(this)
.add("condition", condition)
.add("maxCount", maxCount)
.toString();
}
/**
* Since "count" is a consequence of invoking "check", it is not included in the equality /
* hashCode computation.
*/
@Override
public int hashCode() {
return Objects.hashCode(getClass(), condition, maxCount);
}
/**
* Since "count" is a consequence of invoking "check", it is not included in the equality /
* hashCode computation.
*/
@Override
public boolean equals(Object object) {
if (object instanceof CountCondition) {
CountCondition that = (CountCondition) object;
return Objects.equal(this.condition, that.condition)
&& Objects.equal(this.maxCount, that.maxCount);
}
return false;
}
}