package com.github.mustachejava; import static org.junit.Assert.*; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import java.util.HashMap; import org.junit.Test; public class PolymorphicClassTest { static class Value { public String getText() { return "ok"; } } static class A { public Value getValue() { return new Value(); } } static class B extends A { @Override public Value getValue() { return new Value(); } } String compile(String template, Object model) { final StringWriter buffer = new StringWriter(); factory.compile(template).execute(buffer, model); return buffer.toString(); } DefaultMustacheFactory factory = new DefaultMustacheFactory() { public Reader getReader(String resourceName) { return new StringReader(resourceName); } }; /** * Test for issue 97, java.lang.IllegalArgumentException: object is not an instance of declaring class */ @Test public void testPolyClass() throws IOException { HashMap<String, Object> model = new HashMap<>(); model.put("x", new B()); assertEquals("ok", compile("{{x.value.text}}", model)); model.put("x", new A()); assertEquals("ok", compile("{{x.value.text}}", model)); model.put("x", new B()); assertEquals("ok", compile("{{x.value.text}}", model)); } }