package org.trimou.engine.context; 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 java.util.concurrent.atomic.AtomicReference; import org.junit.Test; import org.trimou.AbstractTest; import org.trimou.engine.MustacheEngine; import org.trimou.engine.MustacheEngineBuilder; import org.trimou.engine.interpolation.ThrowingExceptionMissingValueHandler; import org.trimou.engine.resolver.AbstractResolver; import org.trimou.engine.resolver.ResolutionContext; import org.trimou.engine.resolver.Resolver; import org.trimou.exception.MustacheException; import org.trimou.exception.MustacheProblem; /** * * @author Martin Kouba */ public class ValueWrapperTest extends AbstractTest { @Test public void testReleaseCallbackInvoked() { final AtomicBoolean callbackInvoked = new AtomicBoolean(false); MustacheEngine engine = MustacheEngineBuilder .newBuilder() .addResolver( new AbstractResolver( Resolver.DEFAULT_PRIORITY + 100) { @Override public Object resolve(Object contextObject, String name, ResolutionContext context) { if ("bar".equals(name)) { context.registerReleaseCallback(() -> callbackInvoked.set(true)); return "foo"; } else { return null; } } }).build(); assertEquals("foo", engine.compileMustache("release_callback_invoked1", "{{bar}}") .render(null)); assertTrue(callbackInvoked.get()); callbackInvoked.set(false); assertEquals( "", engine.compileMustache("release_callback_invoked2", "{{bar.qux}}").render(null)); assertTrue(callbackInvoked.get()); } @Test public void testReleaseCallbackInvokedEvenIfRenderingFails() { final AtomicBoolean callbackInvoked = new AtomicBoolean(false); MustacheEngine engine = MustacheEngineBuilder .newBuilder() .setMissingValueHandler( new ThrowingExceptionMissingValueHandler()) .addResolver( new AbstractResolver( Resolver.DEFAULT_PRIORITY + 100) { @Override public Object resolve(Object contextObject, String name, ResolutionContext context) { context.registerReleaseCallback(() -> callbackInvoked.set(true)); return null; } }).build(); try { engine.compileMustache("release_callback_invoked_rendering_fails", "{{cannotmatch}}").render(null); fail("Rendering should fail"); } catch (MustacheException e) { if (!MustacheProblem.RENDER_NO_VALUE.equals(e.getCode())) { fail("Unexpected problem"); } } assertTrue(callbackInvoked.get()); } @Test public void testReleaseCallbackFails() { final AtomicBoolean callbackInvoked = new AtomicBoolean(false); MustacheEngine engine = MustacheEngineBuilder .newBuilder() .addResolver( new AbstractResolver( Resolver.DEFAULT_PRIORITY + 100) { @Override public Object resolve(Object contextObject, String name, ResolutionContext context) { context.registerReleaseCallback(() -> { throw new NullPointerException(); }); context.registerReleaseCallback(() -> callbackInvoked.set(true)); return null; } }).build(); assertEquals( "", engine.compileMustache("release_callback_fails", "{{cannotmatch}}").render(null)); assertTrue(callbackInvoked.get()); } @Test public void testGetKey() { final AtomicReference<String> key = new AtomicReference<>(); MustacheEngineBuilder .newBuilder() .omitServiceLoaderConfigurationExtensions() .addResolver( new AbstractResolver( 1) { @Override public Object resolve(Object contextObject, String name, ResolutionContext context) { key.set(context.getKey()); return null; } }).build().compileMustache("getkey", "{{my.key.foo}}") .render(null); assertEquals("my.key.foo", key.get()); } @Test public void testGetKeyPartIndex() { final List<Integer> indexes = new ArrayList<>(); MustacheEngineBuilder .newBuilder() .omitServiceLoaderConfigurationExtensions() .addResolver(new AbstractResolver(1) { @Override public Object resolve(Object contextObject, String name, ResolutionContext context) { indexes.add(context.getKeyPartIndex()); return "OK"; } }).build().compileMustache("getkeypartindex", "{{my.key.foo}}") .render(null); assertEquals(3L, indexes.size()); assertEquals(Integer.valueOf(0), indexes.get(0)); assertEquals(Integer.valueOf(1), indexes.get(1)); assertEquals(Integer.valueOf(2), indexes.get(2)); } }