blob: 3b6967dced902b4f4e7319a0ad5aeca94d0789a9 [file] [log] [blame]
package org.hamcrest.number;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
import static java.lang.Math.abs;
/**
* Is the value a number equal to a value within some range of
* acceptable error?
*/
public class IsCloseTo extends TypeSafeMatcher<Double> {
private final double delta;
private final double value;
public IsCloseTo(double value, double error) {
this.delta = error;
this.value = value;
}
@Override
public boolean matchesSafely(Double item) {
return actualDelta(item) <= 0.0;
}
@Override
public void describeMismatchSafely(Double item, Description mismatchDescription) {
mismatchDescription.appendValue(item)
.appendText(" differed by ")
.appendValue(actualDelta(item))
.appendText(" more than delta ")
.appendValue(delta);
}
@Override
public void describeTo(Description description) {
description.appendText("a numeric value within ")
.appendValue(delta)
.appendText(" of ")
.appendValue(value);
}
private double actualDelta(Double item) {
return abs(item - value) - delta;
}
/**
* Creates a matcher of {@link Double}s that matches when an examined double is equal
* to the specified <code>operand</code>, within a range of +/- <code>error</code>.
* For example:
* <pre>assertThat(1.03, is(closeTo(1.0, 0.03)))</pre>
*
* @param operand
* the expected value of matching doubles
* @param error
* the delta (+/-) within which matches will be allowed
*/
public static Matcher<Double> closeTo(double operand, double error) {
return new IsCloseTo(operand, error);
}
}