package org.trimou.engine.listener; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import org.junit.Before; import org.junit.Test; import org.trimou.AbstractEngineTest; import org.trimou.engine.MustacheEngineBuilder; import org.trimou.lambda.SpecCompliantLambda; /** * * @author Martin Kouba */ public class MustacheListenerTest extends AbstractEngineTest { @Override @Before public void buildEngine() { } @Test public void testListenersInvoked() { final List<String> parsed = new ArrayList<>(); final List<String> compiled = new ArrayList<>(); final List<String> renderingStarts = new ArrayList<>(); final List<String> renderingEnds = new ArrayList<>(); SpecCompliantLambda lambda = new SpecCompliantLambda() { @Override public String invoke(String text) { return "foo"; } }; MustacheListener listener1 = new AbstractMustacheListener() { @Override public void renderingStarted(MustacheRenderingEvent event) { renderingStarts.add(event.getMustacheName()); } @Override public void renderingFinished(MustacheRenderingEvent event) { renderingEnds.add(event.getMustacheName()); } @Override public void compilationFinished(MustacheCompilationEvent event) { compiled.add(event.getMustache().getName()); } }; MustacheListener listener2 = new AbstractMustacheListener() { @Override public void renderingStarted(MustacheRenderingEvent event) { renderingStarts.add(event.getMustacheName() + "2"); } @Override public void renderingFinished(MustacheRenderingEvent event) { renderingEnds.add(event.getMustacheName() + "2"); } @Override public void parsingStarted(MustacheParsingEvent event) { parsed.add(event.getMustacheName() + "2"); } }; assertEquals( "foo", MustacheEngineBuilder.newBuilder().addGlobalData("bar", lambda) .addMustacheListener(listener1) .addMustacheListener(listener2).build() .compileMustache("listeners", "{{bar}}").render(null)); // Template and lambda assertEquals(2, compiled.size()); assertEquals("listeners", compiled.get(0)); // The second is one-off lambda name assertEquals(2, renderingStarts.size()); assertEquals("listeners", renderingStarts.get(0)); assertEquals("listeners2", renderingStarts.get(1)); assertEquals(2, renderingEnds.size()); assertEquals("listeners2", renderingEnds.get(0)); assertEquals("listeners", renderingEnds.get(1)); assertEquals(2, parsed.size()); assertEquals("listeners2", parsed.get(0)); // The second is one-off lambda name } @Test public void testListenerThrowsUncheckedException() { final List<String> renderingStarts = new ArrayList<>(); final List<String> renderingEnds = new ArrayList<>(); final AtomicBoolean callbackInvoked = new AtomicBoolean(false); MustacheListener listener1 = new AbstractMustacheListener() { @Override public void renderingStarted(MustacheRenderingEvent event) { renderingStarts.add(event.getMustacheName()); } @Override public void renderingFinished(MustacheRenderingEvent event) { renderingEnds.add(event.getMustacheName()); } }; MustacheListener listener2 = new AbstractMustacheListener() { @Override public void renderingStarted(MustacheRenderingEvent event) { renderingStarts.add(event.getMustacheName() + "2"); event.registerReleaseCallback(() -> callbackInvoked.set(true)); } @Override public void renderingFinished(MustacheRenderingEvent event) { renderingEnds.add(event.getMustacheName() + "2"); throw new NullPointerException(); } }; try { MustacheEngineBuilder .newBuilder() .addMustacheListener(listener1) .addMustacheListener(listener2) .build() .compileMustache("listener_throws_unchecked_exception", " ") .render(null); fail("Rendering should fail"); } catch (NullPointerException e) { // Expected } assertEquals(2, renderingStarts.size()); assertEquals("listener_throws_unchecked_exception", renderingStarts.get(0)); assertEquals("listener_throws_unchecked_exception2", renderingStarts.get(1)); assertEquals(1, renderingEnds.size()); assertEquals("listener_throws_unchecked_exception2", renderingEnds.get(0)); assertTrue(callbackInvoked.get()); } }