package org.trimou.engine.resolver;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.trimou.AbstractTest;
import org.trimou.engine.MustacheEngine;
import org.trimou.engine.MustacheEngineBuilder;
import org.trimou.engine.priority.Priorities;
import org.trimou.util.ImmutableMap;
import org.trimou.util.Strings;
/**
*
* @author Martin Kouba
*/
public class MapCustomKeyResolverTest extends AbstractTest {
@Test
public void testCustomKey() {
MustacheEngine engine = MustacheEngineBuilder.newBuilder()
// Resolve integer keys
.addResolver(
new MapCustomKeyResolver(
Priorities
.rightAfter(ThisResolver.THIS_RESOLVER_PRIORITY)) {
@Override
protected boolean matches(String name) {
return Strings.containsOnlyDigits(name);
}
@Override
protected Object convert(String name) {
return Integer.valueOf(name);
}
}).build();
Map<Integer, String> dataMap = new HashMap<>();
dataMap.put(1, "Hello");
dataMap.put(2, "there");
assertEquals(
"Hello there!",
engine.compileMustache("map_custom_key_resolver",
"{{#data}}{{1}}{{3}} {{2}}{{/data}}!").render(
ImmutableMap.of("data", dataMap)));
}
@Test
public void testEnumKey() {
MustacheEngine engine = MustacheEngineBuilder.newBuilder()
.addResolver(new EnumKeyResolver()).build();
Map<EnumKey, String> dataMap = new HashMap<>();
dataMap.put(EnumKey.ONE, "Hello");
dataMap.put(EnumKey.TWO, "there");
assertEquals(
"Hello there!",
engine.compileMustache("map_enum_key_resolver",
"{{#data}}{{ONE}} {{TWO}}{{/data}}!").render(
ImmutableMap.of("data", dataMap)));
}
private enum EnumKey {
ONE,
TWO, ;
}
private static class EnumKeyResolver extends MapCustomKeyResolver {
public EnumKeyResolver() {
super(Priorities.rightAfter(ThisResolver.THIS_RESOLVER_PRIORITY));
}
private static List<String> keys;
static {
keys = new ArrayList<>(EnumKey.values().length);
for (EnumKey key : EnumKey.values()) {
keys.add(key.toString());
}
}
@Override
protected boolean matches(String name) {
return keys.contains(name);
}
@Override
protected Object convert(String name) {
return EnumKey.valueOf(name);
}
}
}