package net.thucydides.core.model;
import net.thucydides.core.PendingStepException;
import net.thucydides.core.steps.StepFailure;
import net.thucydides.core.steps.StepFailureException;
import net.thucydides.core.webdriver.WebdriverAssertionError;
import static net.thucydides.core.model.TestResult.*;
/**
* Determine whether a given type of exception should result in a failure or an error.
* Any exception that extends AssertionError is a FAILURE.
* Any exception that extends WebdriverAssertionError and has a cause that is an AssertionError is also a FAILURE.
* All other exceptions are an ERROR (except for StepFailureException as described below)
*
* Any exception that extends StepFailureException and has a cause that meets the above criteria is classed as above.
* All other exceptions are an ERROR
*/
public class FailureAnalysis {
// TODO: Finish (or not)
public TestResult resultFor(Class testFailureCause) {
if (isA(PendingStepException.class, testFailureCause)) {
return PENDING;
}
if (isFailure(testFailureCause.getName())) {
return FAILURE;
}
return ERROR;
}
public boolean isFailure(String testFailureCause) {
if (testFailureCause != null) {
try {
if (isA(AssertionError.class, Class.forName(testFailureCause))) {
return true;
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return false;
}
private boolean isA(Class<?> expectedClass, Class testFailureCause) {
while(testFailureCause != null) {
if (testFailureCause.equals(expectedClass)) {
return true;
}
testFailureCause = testFailureCause.getSuperclass();
}
return false;
}
public TestResult resultFor(Throwable testFailureCause) {
if (PendingStepException.class.isAssignableFrom(testFailureCause.getClass())) {
return PENDING;
} else if (isFailureError(testFailureCause)) {
return FAILURE;
} else if (failingStepException(testFailureCause)) {
return FAILURE;
} else {
return ERROR;
}
}
public TestResult resultFor(StepFailure stepFailure) {
if (stepFailure.getException() == null) {
return FAILURE;
} else {
return resultFor(stepFailure.getException());
}
}
private boolean failingStepException(Throwable testFailureCause) {
return ((StepFailureException.class.isAssignableFrom(testFailureCause.getClass()))
&& (testFailureCause.getCause() != null)
&& (isFailureError(testFailureCause.getCause())));
}
private boolean isFailureError(Throwable testFailureCause) {
Class<? extends Throwable> failureCauseClass = testFailureCause.getClass();
if(WebdriverAssertionError.class.isAssignableFrom(failureCauseClass)) {
return testFailureCause.getCause() == null || AssertionError.class.isAssignableFrom(testFailureCause.getCause().getClass());
}
return AssertionError.class.isAssignableFrom(failureCauseClass);
}
}