package br.com.six2six.fixturefactory.function; import java.util.Arrays; import java.util.List; import br.com.six2six.fixturefactory.Fixture; import br.com.six2six.fixturefactory.ObjectFactory; import br.com.six2six.fixturefactory.processor.Processor; public class FixtureFunction implements AtomicFunction, RelationFunction { private Class<?> clazz; private List<String> labels; private Integer quantity; public FixtureFunction(Class<?> clazz, String label) { this.clazz = clazz; this.labels = Arrays.asList(label); } public FixtureFunction(Class<?> clazz, String label, Integer quantity) { this(clazz, Arrays.asList(label), quantity); } public FixtureFunction(Class<?> clazz, List<String> labels, Integer quantity) { this.clazz = clazz; this.labels = labels; this.quantity = quantity; } @Override public <T> T generateValue() { return generate(Fixture.from(clazz)); } @Override public <T> T generateValue(Processor processor) { return generate(Fixture.from(clazz).uses(processor)); } @Override public <T> T generateValue(Object owner) { return generate(new ObjectFactory(Fixture.of(clazz), owner)); } @Override public <T> T generateValue(Object owner, Processor processor) { return generate(Fixture.from(clazz).uses(processor)); } @SuppressWarnings("unchecked") private <T> T generate(ObjectFactory objectFactory) { if(quantity != null) { return gimmeWithQuantity(objectFactory); } else { return (T) objectFactory.gimme(getLabel()); } } @SuppressWarnings("unchecked") private <T> T gimmeWithQuantity(ObjectFactory objectFactory) { if(labels.size() == 1) { return (T) objectFactory.gimme(quantity, getLabel()); } else { return (T) objectFactory.gimme(quantity, labels); } } private String getLabel() { return labels.get(0); } }