1 package org.testng.internal.junit;
2 
3 import org.testng.AssertJUnit;
4 
5 import java.lang.reflect.Array;
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             AssertJUnit.fail(header + "expected array was null");
65         if (actuals == null)
66             AssertJUnit.fail(header + "actual array was null");
67         int actualsLength= Array.getLength(actuals);
68         int expectedsLength= Array.getLength(expecteds);
69         if (actualsLength != expectedsLength)
70             AssertJUnit.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