1
2
3
4
5 package mockit.internal.expectations.argumentMatching;
6
7 import edu.umd.cs.findbugs.annotations.NonNull;
8 import edu.umd.cs.findbugs.annotations.Nullable;
9
10 import java.lang.reflect.Array;
11
12 public class EqualityMatcher implements ArgumentMatcher<EqualityMatcher> {
13 @Nullable
14 final Object object;
15
16 EqualityMatcher(@Nullable Object equalArg) {
17 object = equalArg;
18 }
19
20 @Override
21 public final boolean same(@NonNull EqualityMatcher other) {
22 return object == other.object;
23 }
24
25 @Override
26 public boolean matches(@Nullable Object argValue) {
27 return areEqual(argValue, object);
28 }
29
30 @Override
31 public void writeMismatchPhrase(@NonNull ArgumentMismatch argumentMismatch) {
32 argumentMismatch.appendFormatted(object);
33 }
34
35 public static boolean areEqual(@Nullable Object o1, @Nullable Object o2) {
36 if (o1 == null) {
37 return o2 == null;
38 }
39
40 return o2 != null && (o1 == o2 || areEqualWhenNonNull(o1, o2));
41 }
42
43 public static boolean areEqualWhenNonNull(@NonNull Object o1, @NonNull Object o2) {
44 if (isArray(o1)) {
45 return isArray(o2) && areArraysEqual(o1, o2);
46 }
47
48 return o1.equals(o2);
49 }
50
51 private static boolean isArray(@NonNull Object o) {
52 return o.getClass().isArray();
53 }
54
55 private static boolean areArraysEqual(@NonNull Object array1, @NonNull Object array2) {
56 int length1 = Array.getLength(array1);
57
58 if (length1 != Array.getLength(array2)) {
59 return false;
60 }
61
62 for (int i = 0; i < length1; i++) {
63 Object value1 = Array.get(array1, i);
64 Object value2 = Array.get(array2, i);
65
66 if (!areEqual(value1, value2)) {
67 return false;
68 }
69 }
70
71 return true;
72 }
73 }