package org.marketcetera.util.test; import org.apache.commons.lang.math.NumberUtils; import static org.junit.Assert.*; /** * Assertions for equality (and hash code generation). * * @author tlerios@marketcetera.com * @since 1.0.0 * @version $Id: EqualityAssert.java 16154 2012-07-14 16:34:05Z colin $ */ /* $License$ */ public final class EqualityAssert { // CLASS METHODS. /** * Asserts that the given target object implements equality * correctly. If the assertion does not hold, the {@link * AssertionError} thrown starts with the given message, which may * be null if no such custom message prefix is desired. * * @param message The message. * @param o The target object. * @param oEqual Another object that is equal to (but not the same * as) the target object. * @param osUnequal Objects that are all unequal to the target * object. It may be null or contain null elements. */ public static void assertEquality (String message, Object o, Object oEqual, Object... osUnequal) { String content=null; if (!o.equals(o)) { content="'"+o+"' unequal to self"; //$NON-NLS-1$ //$NON-NLS-2$ } else if (!o.equals(oEqual)) { content="'"+o+"' unequal to '"+ //$NON-NLS-1$ //$NON-NLS-2$ oEqual+"'"; //$NON-NLS-1$ } else if (!oEqual.equals(o)) { content="'"+oEqual+"' unequal to '"+ //$NON-NLS-1$ //$NON-NLS-2$ o+"'"; //$NON-NLS-1$ } else if (oEqual==o) { content="'"+oEqual+"' same as '"+ //$NON-NLS-1$ //$NON-NLS-2$ o+"'"; //$NON-NLS-1$ } else if (osUnequal!=null) { for (Object oUnequal:osUnequal) { if (o.equals(oUnequal)) { content="'"+o+"' equal to '"+ //$NON-NLS-1$ //$NON-NLS-2$ oUnequal+"'"; //$NON-NLS-1$ break; } if ((oUnequal!=null) && (oUnequal.equals(o))) { content="'"+oUnequal+ //$NON-NLS-1$ "' equal to '"+o+"'"; //$NON-NLS-1$ //$NON-NLS-2$ break; } } } if (content==null) { if (o.equals(null)) { content="'"+o+"' equal to null"; //$NON-NLS-1$ //$NON-NLS-2$ } else if (o.equals(NumberUtils.INTEGER_ZERO)) { content="'"+o+"' equal to zero"; //$NON-NLS-1$ //$NON-NLS-2$ } else if (o.hashCode()!=oEqual.hashCode()) { content="'"+o+ //$NON-NLS-1$ "' hash code unequal to copy's '"+ //$NON-NLS-1$ oEqual+"'"; //$NON-NLS-1$ } } if (content==null) { return; } if (message!=null) { content=message+" "+content; //$NON-NLS-1$ } fail(content); } /** * Asserts that the given target object implements equality * correctly. * * @param o The target object. * @param oEqual Another object that is equal to (but not the same * as) the target object. * @param osUnequal Objects that are all unequal to the target * object. It may be null or contain null elements. */ public static void assertEquality (Object o, Object oEqual, Object... osUnequal) { assertEquality(null,o,oEqual,osUnequal); } /** * Asserts that the given target object implements equality * correctly. If the assertion does not hold, the {@link * AssertionError} thrown starts with the given message, which may * be null if no such custom message prefix is desired. * * @param message The message. * @param o The target object. * @param equalIndex The index in the collection below for another * object that is equal to (but not the same as) the target * object; all other collection items are unequal to the target * object. * @param osOther A nonempty collection of objects. */ public static void assertEquality (String message, Object o, int equalIndex, Object... osOther) { Object oEqual=null; Object[] osUnequal=new Object[osOther.length-1]; int j=0; for (int i=0;i<osOther.length;i++) { if (i==equalIndex) { oEqual=osOther[i]; } else { osUnequal[j++]=osOther[i]; } } assertEquality(message,o,oEqual,osUnequal); } /** * Asserts that the given target object implements equality * correctly. * * @param o The target object. * @param equalIndex The index in the collection below for another * object that is equal to (but not the same as) the target * object; all other collection items are unequal to the target * object. * @param osOther A nonempty collection of objects. */ public static void assertEquality (Object o, int equalIndex, Object... osOther) { assertEquality(null,o,equalIndex,osOther); } // CONSTRUCTOR. /** * Constructor. It is private so that no instances can be created. */ private EqualityAssert() {} }