• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package org.junit.internal;
2 
3 import java.lang.reflect.Array;
4 
5 import org.junit.Assert;
6 
7 /**
8  * Defines criteria for finding two items "equal enough". Concrete subclasses
9  * may demand exact equality, or, for example, equality within a given delta.
10  */
11 public abstract class ComparisonCriteria {
12 	/**
13 	 * Asserts that two arrays are equal, according to the criteria defined by
14 	 * the concrete subclass. If they are not, an {@link AssertionError} is
15 	 * thrown with the given message. If <code>expecteds</code> and
16 	 * <code>actuals</code> are <code>null</code>, they are considered equal.
17 	 *
18 	 * @param message
19 	 *            the identifying message for the {@link AssertionError} (
20 	 *            <code>null</code> okay)
21 	 * @param expecteds
22 	 *            Object array or array of arrays (multi-dimensional array) with
23 	 *            expected values.
24 	 * @param actuals
25 	 *            Object array or array of arrays (multi-dimensional array) with
26 	 *            actual values
27 	 */
arrayEquals(String message, Object expecteds, Object actuals)28 	public void arrayEquals(String message, Object expecteds, Object actuals)
29 			throws ArrayComparisonFailure {
30 		if (expecteds == actuals)
31 			return;
32 		String header= message == null ? "" : message + ": ";
33 
34 		int expectedsLength= assertArraysAreSameLength(expecteds,
35 				actuals, header);
36 
37 		for (int i= 0; i < expectedsLength; i++) {
38 			Object expected= Array.get(expecteds, i);
39 			Object actual= Array.get(actuals, i);
40 
41 			if (isArray(expected) && isArray(actual)) {
42 				try {
43 					arrayEquals(message, expected, actual);
44 				} catch (ArrayComparisonFailure e) {
45 					e.addDimension(i);
46 					throw e;
47 				}
48 			} else
49 				try {
50 					assertElementsEqual(expected, actual);
51 				} catch (AssertionError e) {
52 					throw new ArrayComparisonFailure(header, e, i);
53 				}
54 		}
55 	}
56 
isArray(Object expected)57 	private boolean isArray(Object expected) {
58 		return expected != null && expected.getClass().isArray();
59 	}
60 
assertArraysAreSameLength(Object expecteds, Object actuals, String header)61 	private int assertArraysAreSameLength(Object expecteds,
62 			Object actuals, String header) {
63 		if (expecteds == null)
64 			Assert.fail(header + "expected array was null");
65 		if (actuals == null)
66 			Assert.fail(header + "actual array was null");
67 		int actualsLength= Array.getLength(actuals);
68 		int expectedsLength= Array.getLength(expecteds);
69 		if (actualsLength != expectedsLength)
70 			Assert.fail(header + "array lengths differed, expected.length="
71 					+ expectedsLength + " actual.length=" + actualsLength);
72 		return expectedsLength;
73 	}
74 
assertElementsEqual(Object expected, Object actual)75 	protected abstract void assertElementsEqual(Object expected, Object actual);
76 }
77