1e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/* 2e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Copyright (c) 2007 Mockito contributors 3e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * This program is made available under the terms of the MIT License. 4e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */ 5e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpackage org.mockito.internal.util; 6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.HashMap; 8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.Map; 9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson@SuppressWarnings("unchecked") 11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class Primitives { 12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson private static Map<Class<?>, Class<?>> primitiveTypes = new HashMap<Class<?>, Class<?>>(); 14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson private static Map<Class<?>, Object> primitiveOrWrapperDefaultValues = new HashMap<Class<?>, Object>(); 15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson /** 18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Returns the primitive type of the given class. 19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <p/> 20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * The passed class can be any class : <code>boolean.class</code>, <code>Integer.class</code> 21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * in witch case this method will return <code>boolean.class</code>, even <code>SomeObject.class</code> 22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * in which case <code>null</code> will be returned. 23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * 24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * @param clazz The class from which primitive type has to be retrieved 25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * @param <T> The type 26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * @return The primitive type if relevant, otherwise <code>null</code> 27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */ 28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson public static <T> Class<T> primitiveTypeOf(Class<T> clazz) { 29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson if (clazz.isPrimitive()) { 30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson return clazz; 31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson return (Class<T>) primitiveTypes.get(clazz); 33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson /** 36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Indicates if the given class is primitive type or a primitive wrapper. 37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * 38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * @param type The type to check 39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * @return <code>true</code> if primitive or wrapper, <code>false</code> otherwise. 40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */ 41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson public static boolean isPrimitiveOrWrapper(Class<?> type) { 42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson return primitiveOrWrapperDefaultValues.containsKey(type); 43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson /** 46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Returns the boxed default value for a primitive or a primitive wrapper. 47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * 48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * @param primitiveOrWrapperType The type to lookup the default value 49e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * @return The boxed default values as defined in Java Language Specification, 50e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <code>null</code> if the type is neither a primitive nor a wrapper 51e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */ 52e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson public static <T> T defaultValueForPrimitiveOrWrapper(Class<T> primitiveOrWrapperType) { 53e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson return (T) primitiveOrWrapperDefaultValues.get(primitiveOrWrapperType); 54e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 55e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 56e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 57e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson static { 58e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveTypes.put(Boolean.class, Boolean.TYPE); 59e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveTypes.put(Character.class, Character.TYPE); 60e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveTypes.put(Byte.class, Byte.TYPE); 61e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveTypes.put(Short.class, Short.TYPE); 62e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveTypes.put(Integer.class, Integer.TYPE); 63e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveTypes.put(Long.class, Long.TYPE); 64e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveTypes.put(Float.class, Float.TYPE); 65e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveTypes.put(Double.class, Double.TYPE); 66e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 67e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 68e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson static { 69e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveOrWrapperDefaultValues.put(Boolean.class, false); 70e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveOrWrapperDefaultValues.put(Character.class, '\u0000'); 71e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveOrWrapperDefaultValues.put(Byte.class, (byte) 0); 72e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveOrWrapperDefaultValues.put(Short.class, (short) 0); 73e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveOrWrapperDefaultValues.put(Integer.class, 0); 74e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveOrWrapperDefaultValues.put(Long.class, 0L); 75e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveOrWrapperDefaultValues.put(Float.class, 0F); 76e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveOrWrapperDefaultValues.put(Double.class, 0D); 77e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 78e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveOrWrapperDefaultValues.put(boolean.class, false); 79e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveOrWrapperDefaultValues.put(char.class, '\u0000'); 80e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveOrWrapperDefaultValues.put(byte.class, (byte) 0); 81e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveOrWrapperDefaultValues.put(short.class, (short) 0); 82e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveOrWrapperDefaultValues.put(int.class, 0); 83e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveOrWrapperDefaultValues.put(long.class, 0L); 84e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveOrWrapperDefaultValues.put(float.class, 0F); 85e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson primitiveOrWrapperDefaultValues.put(double.class, 0D); 86e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 87e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}