package org.marketcetera.core.position.impl;
import org.hamcrest.Description;
import org.hamcrest.Factory;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
/**
* Borrowed from Hamcrest 1.2RC3
*/
public class OrderingComparison<T extends Comparable<T>> extends TypeSafeMatcher<T> {
private final T value;
private final int minCompare, maxCompare;
private OrderingComparison(T value, int minCompare, int maxCompare) {
this.value = value;
this.minCompare = minCompare;
this.maxCompare = maxCompare;
}
@Override
public boolean matchesSafely(T other) {
int compare = Integer.signum(value.compareTo(other));
return minCompare <= compare && compare <= maxCompare;
}
public void describeMismatchSafely(T item, Description mismatchDescription) {
mismatchDescription.appendValue(value) .appendText(" was ")
.appendText(comparison(value.compareTo(item))).appendText(" ").appendValue(item);
};
public void describeTo(Description description) {
description.appendText("a value ").appendText(comparison(minCompare));
if (minCompare != maxCompare) {
description.appendText(" or ").appendText(comparison(maxCompare));
}
description.appendText(" ").appendValue(value);
}
private String comparison(int compare) {
if (compare > 0) {
return "less than";
}
else if (compare == 0) {
return "equal to ";
}
else {
return "greater than";
}
}
/**
* Is value = expected?
*/
@Factory
public static <T extends Comparable<T>> Matcher<? super T> comparesEqualTo(T value) {
return new OrderingComparison<T>(value, 0, 0);
}
/**
* Is value > expected?
*/
@Factory
public static <T extends Comparable<T>> Matcher<? super T> greaterThan(T value) {
return new OrderingComparison<T>(value, -1, -1);
}
/**
* Is value >= expected?
*/
@Factory
public static <T extends Comparable<T>> Matcher<? super T> greaterThanOrEqualTo(T value) {
return new OrderingComparison<T>(value, -1, 0);
}
/**
* Is value < expected?
*/
@Factory
public static <T extends Comparable<T>> Matcher<? super T> lessThan(T value) {
return new OrderingComparison<T>(value, 1, 1);
}
/**
* Is value <= expected?
*/
@Factory
public static <T extends Comparable<T>> Matcher<? super T> lessThanOrEqualTo(T value) {
return new OrderingComparison<T>(value, 0, 1);
}
}