1 /*
2  * Copyright (c) 2007 Mockito contributors
3  * This program is made available under the terms of the MIT License.
4  */
5 
6 package org.mockito.internal.matchers;
7 
8 import java.lang.reflect.Array;
9 import java.util.Arrays;
10 
11 import org.hamcrest.Description;
12 
13 public class ArrayEquals extends Equals {
14 
15     private static final long serialVersionUID = -7167812844261087583L;
16 
ArrayEquals(Object wanted)17     public ArrayEquals(Object wanted) {
18         super(wanted);
19     }
20 
matches(Object actual)21     public boolean matches(Object actual) {
22         Object wanted = getWanted();
23         if (wanted == null || actual == null) {
24             return super.matches(actual);
25         } else if (wanted instanceof boolean[] && actual instanceof boolean[]) {
26             return Arrays.equals((boolean[]) wanted, (boolean[]) actual);
27         } else if (wanted instanceof byte[] && actual instanceof byte[]) {
28             return Arrays.equals((byte[]) wanted, (byte[]) actual);
29         } else if (wanted instanceof char[] && actual instanceof char[]) {
30             return Arrays.equals((char[]) wanted, (char[]) actual);
31         } else if (wanted instanceof double[] && actual instanceof double[]) {
32             return Arrays.equals((double[]) wanted, (double[]) actual);
33         } else if (wanted instanceof float[] && actual instanceof float[]) {
34             return Arrays.equals((float[]) wanted, (float[]) actual);
35         } else if (wanted instanceof int[] && actual instanceof int[]) {
36             return Arrays.equals((int[]) wanted, (int[]) actual);
37         } else if (wanted instanceof long[] && actual instanceof long[]) {
38             return Arrays.equals((long[]) wanted, (long[]) actual);
39         } else if (wanted instanceof short[] && actual instanceof short[]) {
40             return Arrays.equals((short[]) wanted, (short[]) actual);
41         } else if (wanted instanceof Object[] && actual instanceof Object[]) {
42             return Arrays.equals((Object[]) wanted, (Object[]) actual);
43         }
44         return false;
45     }
46 
describeTo(Description description)47     public void describeTo(Description description) {
48         if (getWanted() != null && getWanted().getClass().isArray()) {
49             appendArray(createObjectArray(getWanted()), description);
50         } else {
51             super.describeTo(description);
52         }
53     }
54 
appendArray(Object[] array, Description description)55     private void appendArray(Object[] array, Description description) {
56         description.appendText("[");
57         for (int i = 0; i < array.length; i++) {
58             new Equals(array[i]).describeTo(description);
59             if (i != array.length - 1) {
60                 description.appendText(", ");
61             }
62         }
63         description.appendText("]");
64     }
65 
createObjectArray(Object array)66     public static Object[] createObjectArray(Object array) {
67         if (array instanceof Object[]) {
68             return (Object[]) array;
69         }
70         Object[] result = new Object[Array.getLength(array)];
71         for (int i = 0; i < Array.getLength(array); i++) {
72             result[i] = Array.get(array, i);
73         }
74         return result;
75     }
76 }
77