blob: b9f17c58573fae31f5a73c973a22c7783744b526 [file] [log] [blame]
/* Copyright (c) 2000-2006 hamcrest.org
*/
package org.hamcrest.core;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.Factory;
import org.hamcrest.BaseMatcher;
import java.lang.reflect.Array;
/**
* Is the value equal to another value, as tested by the
* {@link java.lang.Object#equals} invokedMethod?
*/
public class IsEqual<T> extends BaseMatcher<T> {
private final Object object;
public IsEqual(T equalArg) {
object = equalArg;
}
public boolean matches(Object arg) {
return areEqual(object, arg);
}
public void describeTo(Description description) {
description.appendValue(object);
}
private static boolean areEqual(Object o1, Object o2) {
if (o1 == null || o2 == null) {
return o1 == null && o2 == null;
} else if (isArray(o1)) {
return isArray(o2) && areArraysEqual(o1, o2);
} else {
return o1.equals(o2);
}
}
private static boolean areArraysEqual(Object o1, Object o2) {
return areArrayLengthsEqual(o1, o2)
&& areArrayElementsEqual(o1, o2);
}
private static boolean areArrayLengthsEqual(Object o1, Object o2) {
return Array.getLength(o1) == Array.getLength(o2);
}
private static boolean areArrayElementsEqual(Object o1, Object o2) {
for (int i = 0; i < Array.getLength(o1); i++) {
if (!areEqual(Array.get(o1, i), Array.get(o2, i))) return false;
}
return true;
}
private static boolean isArray(Object o) {
return o.getClass().isArray();
}
/**
* Is the value equal to another value, as tested by the
* {@link java.lang.Object#equals} invokedMethod?
*/
@Factory
public static <T> Matcher<T> equalTo(T operand) {
return new IsEqual<T>(operand);
}
}