package org.testory.plumbing.inject; import static java.lang.String.format; import static org.testory.plumbing.PlumbingException.check; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Random; import org.testory.plumbing.Maker; public class FinalMaker implements Maker { private FinalMaker() {} public static Maker finalMaker() { return new FinalMaker(); } public <T> T make(Class<T> type, String name) { check(type != null); check(name != null); if (type == Void.class) { return null; } else if (type == String.class) { return (T) name; } else if (type == Class.class) { return (T) SampleClass.class; } else if (type == Method.class) { return (T) SampleClass.class.getDeclaredMethods()[0]; } else if (type == Constructor.class) { return (T) SampleClass.class.getDeclaredConstructors()[0]; } else if (type == Field.class) { return (T) SampleClass.class.getDeclaredFields()[0]; } else if (Enum.class.isAssignableFrom(type)) { return (T) randomEnum((Class<? extends Enum<?>>) type, name); } throw new RuntimeException(format("cannot make %s of type %s", name, type.getName())); } @SuppressWarnings("unused") private static class SampleClass { public Object sampleField; public void sampleMethod() {} } private static Enum<?> randomEnum(Class<? extends Enum<?>> type, String name) { Random random = newRandom(name); Enum<?>[] constants = type.getEnumConstants(); return constants[random.nextInt(constants.length)]; } private static Random newRandom(String seed) { return new Random(new Random(seed.hashCode()).nextLong()); } }