View Javadoc
1   /*
2    * Copyright (c) 2006 JMockit developers
3    * This file is subject to the terms of the MIT license (see LICENSE.txt).
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  }