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