package com.crawljax.condition;
import java.util.Arrays;
import net.jcip.annotations.Immutable;
import com.crawljax.browser.EmbeddedBrowser;
import com.google.common.base.Objects;
/**
* Logic operations for conditions.
*/
@Immutable
public final class Logic {
/**
* @param condition
* the condition.
* @return the condition negated.
*/
public static Condition not(final Condition condition) {
return new Not(condition);
}
/**
* @param conditions
* the conditions.
* @return AND of conditions
*/
public static Condition and(final Condition... conditions) {
return new And(conditions);
}
/**
* @param conditions
* the conditions.
* @return OR conditions
*/
public static Condition or(final Condition... conditions) {
return new Or(conditions);
}
/**
* @param conditions
* the conditions.
* @return NAND conditions
*/
public static Condition nand(final Condition... conditions) {
return not(and(conditions));
}
private Logic() {
}
private static class Not implements Condition {
private Condition condition;
public Not(Condition c) {
condition = c;
}
@Override
public boolean check(EmbeddedBrowser browser) {
return !condition.check(browser);
}
@Override
public String toString() {
return Objects.toStringHelper(this)
.add("condition", condition)
.toString();
}
@Override
public int hashCode() {
return Objects.hashCode(getClass(), condition);
}
@Override
public boolean equals(Object object) {
if (object instanceof Not) {
Not that = (Not) object;
return Objects.equal(this.condition, that.condition);
}
return false;
}
}
private static class And implements Condition {
private Condition[] conditions;
public And(Condition... cs) {
conditions = cs;
}
@Override
public boolean check(EmbeddedBrowser browser) {
for (Condition condition : conditions) {
if (!condition.check(browser)) {
return false;
}
}
return true;
}
@Override
public String toString() {
return Objects.toStringHelper(this)
.add("condition", Arrays.deepToString(conditions))
.toString();
}
@Override
public int hashCode() {
int args = Objects.hashCode((Object[]) conditions);
return Objects.hashCode(getClass(), args);
}
@Override
public boolean equals(Object object) {
if (object instanceof And) {
And that = (And) object;
return Arrays.equals(this.conditions, that.conditions);
}
return false;
}
}
private static class Or implements Condition {
private Condition[] conditions;
public Or(Condition... cs) {
conditions = cs;
}
@Override
public boolean check(EmbeddedBrowser browser) {
for (Condition condition : conditions) {
if (condition.check(browser)) {
return true;
}
}
return false;
}
@Override
public String toString() {
return Objects.toStringHelper(this)
.add("condition", Arrays.deepToString(conditions))
.toString();
}
@Override
public int hashCode() {
int args = Objects.hashCode((Object[]) conditions);
return Objects.hashCode(getClass(), args);
}
@Override
public boolean equals(Object object) {
if (object instanceof Or) {
Or that = (Or) object;
return Arrays.equals(this.conditions, that.conditions);
}
return false;
}
}
}