package de.bechte.junit.runners.validation;
import org.junit.runners.model.TestClass;
import java.util.ArrayList;
import java.util.List;
/**
* The {@link BooleanValidator}s allow to group {@link TestClassValidator}s with boolean algebra. All violations are
* reported in the {@link List} of errors.
*/
public abstract class BooleanValidator implements TestClassValidator {
public static BooleanValidator AND(final TestClassValidator... validators) {
return new AndValidator(validators);
}
public static BooleanValidator OR(final TestClassValidator... validators) {
return new OrValidator(validators);
}
protected final TestClassValidator[] validators;
private BooleanValidator(final TestClassValidator[] validators) {
this.validators = validators == null ? new TestClassValidator[0] : validators;
}
private static class AndValidator extends BooleanValidator {
public AndValidator(TestClassValidator[] validators) {
super(validators);
}
public void validate(final TestClass testClass, final List<Throwable> errors) {
for (final TestClassValidator validator : validators)
validator.validate(testClass, errors);
}
}
private static class OrValidator extends BooleanValidator {
public OrValidator(final TestClassValidator[] validators) {
super(validators);
}
public void validate(final TestClass testClass, final List<Throwable> errors) {
final List<Throwable> tempErrors = new ArrayList<Throwable>();
final List<Throwable> currentErrors = new ArrayList<Throwable>();
for (final TestClassValidator validator : validators) {
currentErrors.clear();
validator.validate(testClass, currentErrors);
if (!currentErrors.isEmpty()) {
tempErrors.addAll(currentErrors);
} else {
tempErrors.clear();
break;
}
}
errors.addAll(tempErrors);
}
}
}