View Javadoc
1   /*
2    * MIT License
3    * Copyright (c) 2006-2025 JMockit developers
4    * See LICENSE file for full license text.
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  }