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.util.IdentityHashMap;
12  import java.util.Map;
13  
14  public final class ClassMatcher implements ArgumentMatcher<ClassMatcher> {
15      private static final Map<Class<?>, ClassMatcher> PRIMITIVE_MATCHERS;
16      static {
17          PRIMITIVE_MATCHERS = new IdentityHashMap<>(16);
18  
19          PRIMITIVE_MATCHERS.put(Boolean.class, new ClassMatcher(Boolean.class));
20          PRIMITIVE_MATCHERS.put(Character.class, new ClassMatcher(Character.class));
21          PRIMITIVE_MATCHERS.put(Byte.class, new ClassMatcher(Byte.class));
22          PRIMITIVE_MATCHERS.put(Short.class, new ClassMatcher(Short.class));
23          PRIMITIVE_MATCHERS.put(Integer.class, new ClassMatcher(Integer.class));
24          PRIMITIVE_MATCHERS.put(Float.class, new ClassMatcher(Float.class));
25          PRIMITIVE_MATCHERS.put(Long.class, new ClassMatcher(Long.class));
26          PRIMITIVE_MATCHERS.put(Double.class, new ClassMatcher(Double.class));
27  
28          PRIMITIVE_MATCHERS.put(boolean.class, new ClassMatcher(boolean.class, Boolean.class));
29          PRIMITIVE_MATCHERS.put(char.class, new ClassMatcher(char.class, Character.class));
30          PRIMITIVE_MATCHERS.put(byte.class, new ClassMatcher(byte.class, Byte.class));
31          PRIMITIVE_MATCHERS.put(short.class, new ClassMatcher(short.class, Short.class));
32          PRIMITIVE_MATCHERS.put(int.class, new ClassMatcher(int.class, Integer.class));
33          PRIMITIVE_MATCHERS.put(float.class, new ClassMatcher(float.class, Float.class));
34          PRIMITIVE_MATCHERS.put(long.class, new ClassMatcher(long.class, Long.class));
35          PRIMITIVE_MATCHERS.put(double.class, new ClassMatcher(double.class, Double.class));
36      }
37  
38      @NonNull
39      public static ClassMatcher create(@NonNull Class<?> expectedClass) {
40          ClassMatcher matcher = PRIMITIVE_MATCHERS.get(expectedClass);
41  
42          if (matcher == null) {
43              matcher = new ClassMatcher(expectedClass);
44          }
45  
46          return matcher;
47      }
48  
49      @NonNull
50      private final String nameOfExpectedClass;
51      @NonNull
52      private final Class<?> matchableClass;
53  
54      private ClassMatcher(@NonNull Class<?> expectedClass) {
55          nameOfExpectedClass = expectedClass.getName();
56          matchableClass = expectedClass;
57      }
58  
59      private ClassMatcher(@NonNull Class<?> primitiveClass, @NonNull Class<?> primitiveWrapperClass) {
60          nameOfExpectedClass = primitiveClass.getName();
61          matchableClass = primitiveWrapperClass;
62      }
63  
64      @Override
65      public boolean same(@NonNull ClassMatcher other) {
66          return matchableClass == other.matchableClass;
67      }
68  
69      @Override
70      public boolean matches(@Nullable Object argValue) {
71          return matchableClass.isInstance(argValue);
72      }
73  
74      @Override
75      public void writeMismatchPhrase(@NonNull ArgumentMismatch argumentMismatch) {
76          argumentMismatch.append("an instance of ").append(nameOfExpectedClass);
77      }
78  }