package org.jtwig.integration.expression; import org.jtwig.JtwigModel; import org.jtwig.JtwigTemplate; import org.jtwig.functions.FunctionRequest; import org.jtwig.functions.JtwigFunction; import org.jtwig.functions.SimpleJtwigFunction; import org.jtwig.integration.AbstractIntegrationTest; import org.jtwig.value.WrappedCollection; import org.jtwig.value.convert.Converter; import org.junit.Test; import java.math.BigDecimal; import java.util.Iterator; import java.util.Map; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.jtwig.environment.EnvironmentConfigurationBuilder.configuration; public class CompositionTest extends AbstractIntegrationTest { @Test public void compose() throws Exception { String result = JtwigTemplate.inlineTemplate("{{ [1..10] | sum }}", configuration() .functions().add(sumFunction()).and().build()) .render(JtwigModel.newModel()); assertThat(result, is("55")); } @Test public void composeWithFunctionWithParenthesis() throws Exception { String result = JtwigTemplate.inlineTemplate("{{ [1..10] | sum() }}", configuration() .functions().add(sumFunction()).and().build()) .render(JtwigModel.newModel()); assertThat(result, is("55")); } @Test public void composeWithFunction() throws Exception { String result = JtwigTemplate.inlineTemplate("{{ 1 | plus(1) }}", configuration() .functions().add(plusFunction()).and().build()) .render(JtwigModel.newModel()); assertThat(result, is("2")); } private JtwigFunction plusFunction() { return new SimpleJtwigFunction() { @Override public String name() { return "plus"; } @Override public Object execute(FunctionRequest request) { return ((BigDecimal) request.get(0)).add(BigDecimal.ONE); } }; } private JtwigFunction sumFunction() { return new SimpleJtwigFunction() { @Override public String name() { return "sum"; } @Override public Object execute(FunctionRequest request) { BigDecimal result = BigDecimal.ZERO; Converter<WrappedCollection> collectionConverter = request.getEnvironment().getValueEnvironment().getCollectionConverter(); Converter<BigDecimal> numberConverter = request.getEnvironment().getValueEnvironment().getNumberConverter(); Object list = request.get(0); WrappedCollection collection = collectionConverter .convert(list).or(WrappedCollection.singleton(list)); Iterator<Map.Entry<String, Object>> iterator = collection.iterator(); while (iterator.hasNext()) { Map.Entry<String, Object> next = iterator.next(); BigDecimal number = numberConverter.convert(next.getValue()).orThrow(request.getPosition(), String.format("Cannot convert '%s' to number", next.getValue())); result = result.add(number); } return result; } }; } }