package org.trimou.engine.segment; import static org.junit.Assert.assertEquals; import java.util.Collections; import org.junit.Test; import org.trimou.AbstractEngineTest; import org.trimou.Hammer; import org.trimou.Mustache; import org.trimou.engine.parser.Template; import org.trimou.lambda.InputProcessingLambda; import org.trimou.lambda.Lambda; import org.trimou.lambda.SpecCompliantLambda; import org.trimou.util.ImmutableList; import org.trimou.util.ImmutableMap; import org.trimou.util.ImmutableSet; /** * * @author Martin Kouba */ public class SectionSegmentTest extends AbstractEngineTest { @Test public void testBoolean() { String templateContents = "{{#Boolean}}-{{/Boolean}}{{#boolean}}-{{/boolean}}!"; Mustache mustache = engine.compileMustache("boolean", templateContents); assertEquals("--!", mustache.render(ImmutableMap.<String, Object> of( "boolean", true, "Boolean", Boolean.TRUE, "true", "true"))); assertEquals("!", mustache.render(ImmutableMap.<String, Object> of( "boolean", false))); } @Test public void testIterable() { Mustache mustache = engine .compileMustache("iterable", "{{#numbers}}la{{iterIndex}}{{iterHasNext}}|{{/numbers}}"); assertEquals("", mustache.render(ImmutableMap.<String, Object> of( "numbers", Collections.emptyList()))); assertEquals("la1true|la2true|la3false|", mustache.render(ImmutableMap .<String, Object> of("numbers", ImmutableList.of(1, 2, 3)))); mustache = engine .compileMustache("iterable2", "{{#numbers}}la({{iter.index}},{{iter.position}}){{iter.hasNext}}{{#iter.hasNext}}|{{/iter.hasNext}}{{/numbers}}"); assertEquals("", mustache.render(ImmutableMap.<String, Object> of( "numbers", Collections.emptyList()))); assertEquals("la(1,0)true|la(2,1)true|la(3,2)false", mustache.render(ImmutableMap .<String, Object> of("numbers", ImmutableList.of(1, 2, 3)))); mustache = engine .compileMustache("iterable3", "{{#items}}{{name}}{{/items}}"); assertEquals("EdgarEdgar", mustache.render(ImmutableMap.<String, Object> of( "items", ImmutableSet.of(new Hammer(), new Hammer())))); } @Test public void testArray() { Mustache mustache = engine.compileMustache("array", "{{#numbers}}la{{iterIndex}}{{iterHasNext}}|{{/numbers}}"); assertEquals("", mustache.render(ImmutableMap.<String, Object> of( "numbers", new Integer[] {}))); assertEquals("la1true|la2true|la3false|", mustache.render(ImmutableMap .<String, Object> of("numbers", new Integer[] { 1, 2, 3 }))); mustache = engine.compileMustache("array2", "{{#numbers}}la{{iter.index}}{{iter.hasNext}}|{{/numbers}}"); assertEquals("", mustache.render(ImmutableMap.<String, Object> of( "numbers", new Integer[] {}))); assertEquals("la1true|la2true|la3false|", mustache.render(ImmutableMap .<String, Object> of("numbers", new Integer[] { 1, 2, 3 }))); } @Test public void testLambdas() { Lambda literal = new SpecCompliantLambda() { @Override public String invoke(String text) { return "prefix_" + text; } @Override public boolean isReturnValueInterpolated() { return false; } }; Lambda processed = new InputProcessingLambda() { @Override public String invoke(String text) { return "prefix_" + text; } @Override public boolean isReturnValueInterpolated() { return false; } }; String templateContents = "{{#lambda}}{{foo}}{{/lambda}}"; Mustache mustache = engine.compileMustache("lambda", templateContents); assertEquals("prefix_{{foo}}", mustache.render(ImmutableMap.of("foo", "Mine", "lambda", literal))); assertEquals("prefix_Mine", mustache.render(ImmutableMap.of("foo", "Mine", "lambda", processed))); } @Test public void testNestedContext() { String templateContents = "Hello {{#test}}{{name}}{{/test}}!"; Mustache mustache = engine.compileMustache("nested", templateContents); assertEquals("Hello Edgar!", mustache.render(ImmutableMap .<String, Object> of("test", new Hammer()))); assertEquals("Hello !", mustache.render(Collections.singletonMap("test", null))); } @Test public void testIterFirstAndLast() { Mustache mustache = engine.compileMustache("iter_first_last", "{{#this}}{{#iterIsFirst}}{{this}}|{{/iterIsFirst}}{{#iterIsLast}}{{this}}|{{/iterIsLast}}{{/this}}"); assertEquals("1|3|", mustache.render(new String[] { "1", "2", "3" })); mustache = engine.compileMustache("iter_first_last", "{{#this}}{{#iter.isFirst}}{{this}}|{{/iter.isFirst}}{{#iter.isLast}}{{this}}|{{/iter.isLast}}{{/this}}"); assertEquals("1|3|", mustache.render(new String[] { "1", "2", "3" })); } @Test public void testSegmentSize() { Template template = (Template) engine.compileMustache("foo", "{{foo}}bar\nbaz{{#qux}}lala{{/qux}}"); assertEquals(6, template.getRootSegment().getSegmentsSize(true)); } @Test public void testIterOddAndEven() { Mustache mustache = engine .compileMustache( "iter_odd_even", "{{#this}}{{#iter.isOdd}}ODD{{/iter.isOdd}}{{#iter.isEven}}EVEN{{/iter.isEven}}{{/this}}"); assertEquals("ODDEVENODD", mustache.render(new String[] { "1", "2", "3" })); } @Test public void testIterationIndexParity() { Mustache mustache = engine .compileMustache( "iter_index_parity", "{{#this}}{{indexParity}}{{/this}}"); assertEquals("oddevenodd", mustache.render(new String[] { "1", "2", "3" })); } }