package org.test4j.hamcrest.matcher.property.comparator;
import org.test4j.hamcrest.matcher.property.difference.Difference;
import org.test4j.hamcrest.matcher.property.reflection.ReflectionComparator;
/**
* A comparator that compares primitive types by value and not by type.
* You can for example compare a double with an integer value.
*/
public class IgnoreNumberComparator implements Comparator {
/**
* Returns true if both objects are not null and instances of Number or Character.
*
* @param left The left object
* @param right The right object
* @return True for Numbers and Charaters
*/
public boolean canCompare(Object left, Object right) {
if (left == null || right == null) {
return false;
}
if ((left instanceof Character || left instanceof Number) && (right instanceof Character || right instanceof Number)) {
return true;
}
return false;
}
/**
* Compares the two values by converting them to a double and comparing these double values.
*
* @param left The left Number or Character, not null
* @param right The right Number or Character, not null
* @param onlyFirstDifference True if only the first difference should be returned
* @param reflectionComparator The root comparator for inner comparisons, not null
* @return A difference if the values are different, null otherwise
*/
public Difference compare(Object left, Object right, boolean onlyFirstDifference, ReflectionComparator reflectionComparator) {
// check if right and left have same number value (including NaN and Infinity)
Double leftDouble = getDoubleValue(left);
Double rightDouble = getDoubleValue(right);
if (!leftDouble.equals(rightDouble)) {
return new Difference("Different primitive values", left, right);
}
return null;
}
/**
* Gets the double value for the given left Character or Number instance.
*
* @param object the Character or Number, not null
* @return the value as a Double (this way NaN and infinity can be compared)
*/
private Double getDoubleValue(Object object) {
if (object instanceof Number) {
return ((Number) object).doubleValue();
}
return (double) ((Character) object).charValue();
}
}