package br.com.six2six.fixturefactory.transformer;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import br.com.six2six.fixturefactory.transformer.Transformer;
import br.com.six2six.fixturefactory.transformer.TransformerChain;
public class TransformerChainTest {
@Test
public void shouldUseFirstTransformer() {
TransformerChain transformerChain = new TransformerChain(new FirstTransformer());
assertEquals("A1", transformerChain.transform("A", String.class));
}
@Test
public void shouldUseSecondTransformer() {
TransformerChain transformerChain = new TransformerChain(new FirstTransformer());
transformerChain.add(new SecondTransformer());
assertEquals("B2", transformerChain.transform("B", String.class));
}
@Test
public void shouldUseBothTransformersInOrderOfInclusion() {
TransformerChain transformerChain = new TransformerChain(new FirstTransformer());
transformerChain.add(new SecondTransformer());
assertEquals("AB12", transformerChain.transform("AB", String.class));
}
@Test
public void shouldNotUseAnyOfTheTransformers() {
TransformerChain transformerChain = new TransformerChain(new FirstTransformer());
transformerChain.add(new SecondTransformer());
assertEquals("C", transformerChain.transform("C", String.class));
}
}
class FirstTransformer implements Transformer {
@SuppressWarnings("unchecked")
public <T> T transform(Object value, Class<T> type) {
return (T) value.toString().concat("1");
}
public boolean accepts(Object value, Class<?> type) {
return ((String) value).contains("A") && String.class == type;
}
}
class SecondTransformer implements Transformer {
@SuppressWarnings("unchecked")
public <T> T transform(Object value, Class<T> type) {
return (T) value.toString().concat("2");
}
public boolean accepts(Object value, Class<?> type) {
return ((String) value).contains("B") && String.class == type;
}
}