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