
net.amygdalum.testrecorder.runtime.ArrayMatcher Maven / Gradle / Ivy
The newest version!
package net.amygdalum.testrecorder.runtime;
import static java.util.Arrays.asList;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.hamcrest.core.IsNull.nullValue;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.core.IsNull;
public class ArrayMatcher extends AbstractIterableMatcher {
private Class type;
private List> elements;
public ArrayMatcher(Class type) {
this.type = type;
this.elements = new ArrayList<>();
}
public ArrayMatcher element(T element) {
return element(match(element));
}
public ArrayMatcher element(Matcher element) {
elements.add(element);
return this;
}
private Matcher match(T element) {
if (element == null) {
return nullValue(type);
} else {
return equalTo(element);
}
}
@Override
protected Matcher bestMatcher() {
for (Matcher matcher : elements) {
if (matcher.getClass() != IsNull.class) {
return matcher;
}
}
return equalTo(null);
}
@Override
public void describeTo(Description description) {
description.appendText("containing ").appendValueList("[", ", ", "]", elements);
}
@Override
protected void describeMismatchSafely(T[] item, Description mismatchDescription) {
Matches matches = new Matches<>();
Iterator> elementIterator = elements.iterator();
Iterator extends T> itemIterator = asList(item).iterator();
while (elementIterator.hasNext() && itemIterator.hasNext()) {
Matcher matcher = elementIterator.next();
T element = itemIterator.next();
if (!matcher.matches(element)) {
matches.mismatch(matcher, element);
} else {
matches.match();
}
}
if (elementIterator.hasNext()) {
List> matchers = remainder(elementIterator);
matches.mismatch("missing " + matchers.size() + " elements " + toExpectedSet(matchers));
}
if (itemIterator.hasNext()) {
List items = remainder(itemIterator);
matches.mismatch("found " + items.size() + " elements surplus " + toFoundSet(items));
}
if (matches.containsMismatches()) {
mismatchDescription.appendText("mismatching elements ").appendDescriptionOf(matches);
}
}
@Override
protected boolean matchesSafely(T[] item) {
Iterator> elementIterator = elements.iterator();
Iterator extends T> itemIterator = asList(item).iterator();
while (elementIterator.hasNext() && itemIterator.hasNext()) {
Matcher matcher = elementIterator.next();
T element = itemIterator.next();
if (!matcher.matches(element)) {
return false;
}
}
return !elementIterator.hasNext()
&& !itemIterator.hasNext();
}
@SuppressWarnings("unchecked")
@SafeVarargs
public static ArrayMatcher arrayContaining(Class key, Object... elements) {
ArrayMatcher matcher = new ArrayMatcher<>(key);
for (Object element : elements) {
if (element instanceof Matcher) {
matcher.element((Matcher) element);
} else {
matcher.element(key.cast(element));
}
}
return matcher;
}
public static ArrayMatcher emptyArray() {
return new ArrayMatcher<>(null);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy