package org.ocpsoft.rewrite.annotation;
import static org.junit.Assert.assertEquals;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Test;
import org.ocpsoft.rewrite.annotation.api.ClassContext;
import org.ocpsoft.rewrite.annotation.api.HandlerChain;
import org.ocpsoft.rewrite.annotation.context.ClassContextImpl;
import org.ocpsoft.rewrite.annotation.spi.AnnotationHandler;
import org.ocpsoft.rewrite.config.ConfigurationBuilder;
public class HandlerChainImplTest
{
@Test
public void testNoHandlers()
{
List<String> log = new ArrayList<String>();
HandlerChainImpl chain = new HandlerChainImpl(
null, TestAnnotationHandler.class, Collections.<AnnotationHandler<Annotation>> emptyList());
chain.proceed();
assertEquals(0, log.size());
}
@Test
public void testOneHandler()
{
List<String> log = new ArrayList<String>();
HandlerChainImpl chain = new HandlerChainImpl(null, TestAnnotationHandler.class, Arrays.asList(
new TestAnnotationHandler("Handler", log)
));
chain.proceed();
assertEquals(Arrays.asList(
"Before: Handler",
"After: Handler"
), log);
}
@Test
public void testTwoHandlers()
{
List<String> log = new ArrayList<String>();
HandlerChainImpl chain = new HandlerChainImpl(new ClassContextImpl(ConfigurationBuilder.begin(),
TestAnnotationHandler.class), TestAnnotationHandler.class, Arrays.asList(
new TestAnnotationHandler("First", log),
new TestAnnotationHandler("Second", log)
));
chain.proceed();
assertEquals(Arrays.asList(
"Before: First",
"Before: Second",
"After: Second",
"After: First"
), log);
}
@MockAnno
private static class TestAnnotationHandler implements AnnotationHandler<MockAnno>
{
private final String name;
private final List<String> log;
public TestAnnotationHandler(String name, List<String> log)
{
this.name = name;
this.log = log;
}
@Override
public int priority()
{
return 0;
}
@Override
public Class<MockAnno> handles()
{
return MockAnno.class;
}
@Override
public void process(ClassContext context, MockAnno annotation, HandlerChain chain)
{
log.add("Before: " + name);
chain.proceed();
log.add("After: " + name);
}
}
}