package org.testory.plumbing.inject;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
import static org.testory.plumbing.inject.FinalMaker.finalMaker;
import static org.testory.plumbing.inject.TestingMakers.assertFairDistribution;
import static org.testory.plumbing.inject.TestingMakers.population;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.testory.plumbing.Maker;
public class TestFinalMaker {
private String name, otherName;
private int count;
private Constructor<?> constructor;
private Class<?> clazz, otherClazz;
private Field field;
private Method method;
private Maker maker;
@Before
public void before() {
maker = finalMaker();
name = "name";
otherName = "otherName";
count = 50000;
}
@Test
public void enums_are_fairly_distributed_among_all_elements() {
List<TestEnum> population = population(count, maker, TestEnum.class, name);
assertFairDistribution(TestEnum.values().length, population);
}
private static enum TestEnum {
a, b, c, d, e, f, g, h, i, j
}
@Test
public void strings_are_unique() {
List<String> population = population(count, maker, String.class, name);
assertFairDistribution(count, population);
}
@Test
public void class_is_always_the_same() {
clazz = maker.make(Class.class, name);
otherClazz = maker.make(Class.class, otherName);
assertSame(clazz, otherClazz);
}
@Test
public void method_is_declared_in_sample_class() {
method = maker.make(Method.class, name);
clazz = maker.make(Class.class, otherName);
assertSame(method.getDeclaringClass(), clazz);
}
@Test
public void constructor_is_declared_in_sample_class() {
constructor = maker.make(Constructor.class, name);
clazz = maker.make(Class.class, otherName);
assertSame(constructor.getDeclaringClass(), clazz);
}
@Test
public void field_is_declared_in_sample_class() {
field = maker.make(Field.class, name);
clazz = maker.make(Class.class, otherName);
assertSame(field.getDeclaringClass(), clazz);
}
@Test
public void fails_for_unknown_type() {
try {
maker.make(Object.class, name);
fail();
} catch (RuntimeException e) {}
}
@Test
public void fails_for_array_of_unknown_type() {
try {
maker.make(Object[].class, name);
fail();
} catch (RuntimeException e) {}
}
}