package org.test4j.hamcrest.matcher.array;
import java.util.Collection;
import ext.test4j.hamcrest.BaseMatcher;
import ext.test4j.hamcrest.Description;
import org.test4j.tools.commons.ArrayHelper;
public class SizeOrLengthMatcher extends BaseMatcher<Collection<?>> {
private int size;
private SizeOrLengthMatcherType type;
public SizeOrLengthMatcher(int size, SizeOrLengthMatcherType type) {
this.size = size;
this.type = type;
}
int actualSize = 0;
public boolean matches(Object actual) {
if (actual == null) {
return false;
}
actualSize = ArrayHelper.sizeOf(actual);
switch (type) {
case EQ:
return actualSize == size;
case GT:
return actualSize > size;
case GE:
return actualSize >= size;
case LT:
return actualSize < size;
case LE:
return actualSize <= size;
default:
return actualSize != size;
}
}
public void describeTo(Description description) {
description.appendText(String.format(type.description(), size));
description.appendText(", but actual size is[" + actualSize + "].");
}
public static enum SizeOrLengthMatcherType {
EQ {
@Override
public String description() {
return "size of collection or array must equal to %d";
}
},
GT {
@Override
public String description() {
return "size of collection or array must be greater then %d";
}
},
GE {
@Override
public String description() {
return "size of collection or array must equal to or greater then %d";
}
},
LT {
@Override
public String description() {
return "size of collection or array must be less then %d";
}
},
LE {
@Override
public String description() {
return "size of collection or array must equal to or less then %d";
}
},
NE {
@Override
public String description() {
return "size of collection or array must not equal to %d";
}
};
public abstract String description();
}
}