package net.dossot.jbound.exercise;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Currency;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author David Dossot (david@dossot.net)
*/
final class Data
{
private static final Map<Class<?>, Object[]> TEST_DATA = new HashMap<Class<?>, Object[]>();
static
{
TEST_DATA.put(Object.class, new Object[]{null});
TEST_DATA.put(Class.class, new Class<?>[]{null});
TEST_DATA.put(boolean.class, new Object[]{true, false});
TEST_DATA.put(byte.class, new Object[]{Byte.MIN_VALUE, Byte.MAX_VALUE});
TEST_DATA.put(char.class, new Object[]{Character.MIN_VALUE, Character.MAX_VALUE});
TEST_DATA.put(double.class, new Object[]{Double.MIN_VALUE, Double.MAX_VALUE});
TEST_DATA.put(float.class, new Object[]{Float.MIN_VALUE, Float.MAX_VALUE});
TEST_DATA.put(int.class, new Object[]{Integer.MIN_VALUE, Integer.MAX_VALUE});
TEST_DATA.put(long.class, new Object[]{Long.MIN_VALUE, Long.MAX_VALUE});
TEST_DATA.put(short.class, new Object[]{Short.MIN_VALUE, Short.MAX_VALUE});
TEST_DATA.put(BigInteger.class, new BigInteger[]{null, BigInteger.ZERO});
TEST_DATA.put(BigDecimal.class, new BigDecimal[]{null, BigDecimal.ZERO});
TEST_DATA.put(String.class, new String[]{null, "", " "});
TEST_DATA.put(Date.class, new Date[]{null, new Date(Long.MIN_VALUE), new Date(Long.MAX_VALUE)});
TEST_DATA.put(Currency.class, new Currency[]{null});
TEST_DATA.put(RoundingMode.class, new RoundingMode[]{null, RoundingMode.UNNECESSARY});
final Calendar minCalendar = Calendar.getInstance();
minCalendar.setTimeInMillis(Long.MIN_VALUE);
final Calendar maxCalendar = Calendar.getInstance();
maxCalendar.setTimeInMillis(Long.MAX_VALUE);
TEST_DATA.put(Calendar.class, new Calendar[]{null, minCalendar, maxCalendar});
TEST_DATA.put(Timestamp.class, new Timestamp[]{null, new Timestamp(minCalendar.getTimeInMillis()),
new Timestamp(maxCalendar.getTimeInMillis())});
TEST_DATA.put(List.class, new List<?>[]{null, Collections.EMPTY_LIST});
TEST_DATA.put(Set.class, new Set<?>[]{null, Collections.EMPTY_SET});
TEST_DATA.put(Map.class, new Map<?, ?>[]{null, Collections.EMPTY_MAP});
TEST_DATA.put(Collection.class, TEST_DATA.get(List.class));
final Map<Class<?>, Object[]> wrappedTestData = new HashMap<>();
for (final Map.Entry<Class<?>, Object[]> testValueEntry : TEST_DATA.entrySet())
{
final Class<?> testClass = testValueEntry.getKey();
if (testClass.isPrimitive())
{
final Class<?> wrapperClass = getWrapperClassFor(testClass);
if (wrapperClass != null)
{
final Object testValues = testValueEntry.getValue();
final int testValuesCount = Array.getLength(testValues);
final Object[] wrappedTestValues = new Object[1 + testValuesCount];
wrappedTestValues[0] = null;
try
{
final Constructor<?> constructor = wrapperClass.getConstructor(testClass);
for (int i = 0; i < testValuesCount; i++)
{
wrappedTestValues[1 + i] = constructor.newInstance(Array.get(testValues, i));
}
}
catch (final Exception e)
{
Support.handleInternalException(e);
}
wrappedTestData.put(wrapperClass, wrappedTestValues);
}
}
}
TEST_DATA.putAll(wrappedTestData);
}
private Data()
{
throw new UnsupportedOperationException();
}
static Object[] getTestDataFor(final Class<?> targetClass)
{
final Object[] testValues = TEST_DATA.get(targetClass);
if ((testValues == null) && (targetClass.getName().startsWith("java")))
{
System.err.println(targetClass + " is not fully supported, please report to JBound team.");
}
return testValues != null ? testValues : TEST_DATA.get(Object.class);
}
private static Class<?> getWrapperClassFor(final Class<?> primitiveClass)
{
if (primitiveClass.equals(boolean.class))
{
return Boolean.class;
}
if (primitiveClass.equals(byte.class))
{
return Byte.class;
}
if (primitiveClass.equals(char.class))
{
return Character.class;
}
if (primitiveClass.equals(double.class))
{
return Double.class;
}
if (primitiveClass.equals(float.class))
{
return Float.class;
}
if (primitiveClass.equals(int.class))
{
return Integer.class;
}
if (primitiveClass.equals(long.class))
{
return Long.class;
}
if (primitiveClass.equals(short.class))
{
return Short.class;
}
return null;
}
}