package org.trimou.handlebars;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.trimou.AbstractTest;
import org.trimou.ArchiveType;
import org.trimou.Hammer;
import org.trimou.MustacheExceptionAssert;
import org.trimou.engine.MustacheEngine;
import org.trimou.engine.MustacheEngineBuilder;
import org.trimou.engine.MustacheTagInfo;
import org.trimou.engine.interpolation.NoOpMissingValueHandler;
import org.trimou.exception.MustacheProblem;
import org.trimou.util.ImmutableList;
import org.trimou.util.ImmutableMap;
/**
*
* @author Martin Kouba
*/
public class InvokeHelperTest extends AbstractTest {
@Test
public void testHelper() {
final MustacheEngine engine = MustacheEngineBuilder.newBuilder()
.registerHelpers(HelpersBuilder.empty().addInvoke().build())
.build();
List<String> list = ImmutableList.of("foo", "bar", "baz");
Map<String, Object> data = ImmutableMap.of("string", "foo", "list",
list);
assertEquals("oo", engine
.compileMustache("invoke_01", "{{invoke 1 m='substring'}}")
.render("foo"));
assertEquals("bar",
engine.compileMustache("invoke_02", "{{invoke 1 m='get'}}")
.render(list));
assertEquals("FOOBARBAZ",
engine.compileMustache("invoke_03",
"{{#invoke 'list' m='get'}}{{#each this}}{{toUpperCase}}{{/each}}{{/invoke}}")
.render(data));
assertEquals("3", engine
.compileMustache("invoke_04", "{{invoke on=list m='size'}}")
.render(data));
assertEquals(
"false", engine
.compileMustache("invoke_05",
"{{invoke on=list method='isEmpty'}}")
.render(data));
assertEquals("boo",
engine.compileMustache("invoke_06",
"{{invoke 'f' 'b' on='foo' m='replace'}}")
.render(null));
assertEquals("2",
engine.compileMustache("invoke_07",
"{{#invoke ':' on='foo:bar' m='split'}}{{this.length}}{{/invoke}}")
.render(null));
}
@Test
public void testStaticMethod() {
final MustacheEngine engine = MustacheEngineBuilder.newBuilder()
.registerHelpers(HelpersBuilder.empty().addInvoke().build())
.build();
List<String> list = new ArrayList<>();
list.add("foo");
list.add("bar");
list.add("baz");
assertEquals("bazbarfoo",
engine.compileMustache("invoke_static_01",
"{{invoke this class='java.util.Collections' m='reverse'}}{{#each this}}{{this}}{{/each}}")
.render(list));
assertEquals("war",
engine.compileMustache("invoke_static_02",
"{{#invoke 'WAR' class='org.trimou.ArchiveType' m='valueOf'}}{{suffix}}{{/invoke}}")
.render(null));
assertEquals("1",
engine.compileMustache("invoke_static_03",
"{{#invoke 'MILLISECONDS' class='java.util.concurrent.TimeUnit' m='valueOf'}}{{invoke 1000l m='toSeconds'}}{{/invoke}}")
.render(null));
assertEquals("war",
engine.compileMustache("invoke_static_04",
"{{#invoke 'WAR' class=this m='valueOf'}}{{suffix}}{{/invoke}}")
.render(ArchiveType.class));
}
@Test
public void testDefaultMethodName() {
MustacheEngine engine = MustacheEngineBuilder.newBuilder()
.registerHelpers(HelpersBuilder.empty()
.add("substring", InvokeHelper.of("substring"))
.build())
.build();
assertEquals("345", engine
.compileMustache("invoke_defmethodname_01", "{{substring 3}}")
.render("012345"));
assertEquals("lo", engine
.compileMustache("invoke_defmethodname_01", "{{substring 3 on='hello' m='whatever'}}")
.render(null));
}
@Test
public void testValidation() {
MustacheExceptionAssert
.expect(MustacheProblem.COMPILE_HELPER_VALIDATION_FAILURE)
.check(() -> MustacheEngineBuilder.newBuilder()
.registerHelpers(
HelpersBuilder.empty().addInvoke().build())
.build().compileMustache("invoke_validation_01",
"{{invoke 'foo' on=this}}"));
}
@Test
public void testMissingValueHandler() {
MustacheEngine engine = MustacheEngineBuilder.newBuilder()
.setMissingValueHandler(new NoOpMissingValueHandler() {
@Override
public Object handle(MustacheTagInfo tagInfo) {
return "foo";
}
}).registerHelpers(HelpersBuilder.empty().addInvoke().build())
.build();
assertEquals("foo", engine
.compileMustache("invoke_missing_01", "{{invoke m='getNull'}}")
.render(new Hammer()));
}
@Test
public void testRenderingErrors() {
final MustacheEngine engine = MustacheEngineBuilder.newBuilder()
.registerHelpers(HelpersBuilder.empty().addInvoke().build())
.build();
MustacheExceptionAssert
.expect(MustacheProblem.RENDER_HELPER_INVALID_OPTIONS)
.check(() -> engine.compileMustache("invoke_method_not_found",
"{{invoke m='foo'}}").render("bar"));
MustacheExceptionAssert
.expect(MustacheProblem.RENDER_HELPER_INVALID_OPTIONS)
.check(() -> engine
.compileMustache("invoke_method_ambiguous",
"{{invoke 'name' 5L class='java.lang.Long' m='getLong'}}")
.render("bar"));
}
}