package dbfit.test.matchers;
import dbfit.environment.ParamDescriptor;
import dbfit.util.Direction;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeDiagnosingMatcher;
import org.hamcrest.Description;
import org.hamcrest.Factory;
import org.hamcrest.core.IsEqual;
import static org.hamcrest.Matchers.*;
import java.util.List;
import java.util.ArrayList;
import static java.util.Arrays.asList;
public class IsParameter extends TypeSafeDiagnosingMatcher<ParamDescriptor> {
private final Matcher matcher;
public IsParameter(String name, Direction direction, String type) {
matcher = new IsEqual<List>(asList(name, direction, type));
}
public IsParameter(ParamDescriptor p) {
this(p.name, p.direction, p.type);
}
@Override
public boolean matchesSafely(ParamDescriptor param,
Description mismatchDescription) {
if (!matcher.matches(asList(param.name, param.direction, param.type))) {
matcher.describeMismatch(param, mismatchDescription);
return false;
}
return true;
}
@Override
public void describeTo(Description describtion) {
describtion.appendDescriptionOf(matcher);
}
@Factory
public static IsParameter hasReturnType(String type) {
return new IsParameter("", Direction.RETURN_VALUE, type);
}
@Factory
public static Matcher<Iterable<? extends ParamDescriptor>> containsParameters(
List<ParamDescriptor> expectedParameters) {
List<Matcher<? super ParamDescriptor>> matchers = new ArrayList<>();
for (ParamDescriptor param: expectedParameters) {
matchers.add(new IsParameter(param));
}
return contains(matchers);
}
@Factory
public static Matcher<Iterable<? extends ParamDescriptor>> containsParameters(
ParamDescriptor... expectedParameters) {
return containsParameters(asList(expectedParameters));
}
}