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.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 }