/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockitoutil;
import org.assertj.core.api.Assertions;
import org.assertj.core.api.Condition;
import org.assertj.core.description.Description;
import org.assertj.core.description.TextDescription;
import org.hamcrest.CoreMatchers;
import java.lang.reflect.Method;
import java.util.Arrays;
@SuppressWarnings("unchecked")
public class Conditions {
public static Condition<Throwable> onlyThoseClassesInStackTrace(final String... classes) {
return new Condition<Throwable>() {
@Override
public boolean matches(Throwable traceElements) {
StackTraceElement[] trace = traceElements.getStackTrace();
Assertions.assertThat(trace.length)
.describedAs("Number of classes does not match.\nExpected: %s\nGot: %s",
Arrays.toString(classes),
Arrays.toString(traceElements.getStackTrace()))
.isEqualTo(classes.length);
for (int i = 0; i < trace.length; i++) {
Assertions.assertThat(trace[i].getClassName()).isEqualTo(classes[i]);
}
return true;
}
};
}
public static Condition<StackTraceElement[]> onlyThoseClasses(final String... classes) {
return new Condition<StackTraceElement[]>() {
@Override
public boolean matches(StackTraceElement[] traceElements) {
Assertions.assertThat(traceElements.length)
.describedAs("Number of classes does not match.\nExpected: %s\nGot: %s",
Arrays.toString(classes),
Arrays.toString(traceElements))
.isEqualTo(classes.length);
for (int i = 0; i < traceElements.length; i++) {
Assertions.assertThat(traceElements[i].getClassName()).isEqualTo(classes[i]);
}
return true;
}
};
}
public static Condition<Throwable> firstMethodInStackTrace(final String method) {
return methodInStackTraceAt(0, method);
}
public static Condition<Throwable> methodInStackTraceAt(final int stackTraceIndex, final String method) {
return new Condition<Throwable>() {
private String actualMethodAtIndex;
@Override
public boolean matches(Throwable throwable) {
actualMethodAtIndex = throwable.getStackTrace()[stackTraceIndex].getMethodName();
return actualMethodAtIndex.equals(method);
}
@Override
public Description description() {
return new TextDescription("Method at index: %d\nexpected to be: %s\nbut is: %s", stackTraceIndex, method, actualMethodAtIndex);
}
};
}
public static Condition<Object> bridgeMethod(final String methodName) {
return new Condition<Object>() {
public boolean matches(Object o) {
Class<?> clazz = null;
if (o instanceof Class) {
clazz = (Class<?>) o;
} else {
clazz = o.getClass();
}
for (Method m : clazz.getMethods()) {
if (m.isBridge() && m.getName().equals(methodName)) {
return true;
}
}
Assertions.fail("Bridge method [" + methodName + "]\nnot found in:\n" + o);
return false;
}
};
}
public static org.hamcrest.Matcher<Object> clazz(Class<?> type) {
return CoreMatchers.instanceOf(type);
}
public static Condition<Throwable> methodsInStackTrace(final String... methods) {
return new Condition<Throwable>() {
public boolean matches(Throwable value) {
StackTraceElement[] trace = value.getStackTrace();
for (int i = 0; i < methods.length; i++) {
Assertions.assertThat(trace[i].getMethodName()).describedAs("Expected methods[%d] to be in the stack trace.", i).isEqualTo(methods[i]);
}
return true;
}
};
}
}