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