package com.github.mustachejava; import com.github.mustachejavabenchmarks.Tweet; import org.junit.BeforeClass; import org.junit.Test; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import java.io.*; import java.util.ArrayList; import java.util.List; import static org.junit.Assert.assertEquals; /** * Created by sam on 3/11/15. */ public class JavascriptObjectHandlerTest { private static ScriptEngine se; @BeforeClass public static void setup() { ScriptEngineManager sem = new ScriptEngineManager(); se = sem.getEngineByName("nashorn"); } @Test public void testSimple() throws ScriptException, IOException { MustacheFactory mf = new DefaultMustacheFactory(); Mustache m = mf.compile(new StringReader("{{name}}"), "test"); StringWriter sw = new StringWriter(); Object eval = se.eval("var name = \"sam\"; this;"); m.execute(sw, eval).close(); assertEquals("sam", sw.toString()); } @Test public void testFunction() throws ScriptException, IOException { DefaultMustacheFactory mf = new DefaultMustacheFactory(); mf.setObjectHandler(new JavascriptObjectHandler()); Mustache m = mf.compile(new StringReader("{{#f}}name{{/f}}{{value}}"), "test"); StringWriter sw = new StringWriter(); Object eval = se.eval("var name = \"sam\"; " + "var value = function() { return 'pullara'; };" + "function f(s) { return '{{' + s + '}}'; };" + "this;"); m.execute(sw, eval).close(); assertEquals("sampullara", sw.toString()); } @Test public void testTweet() throws IOException, ScriptException { File file = new File("src/test/resources"); File root = new File(file, "simple.html").exists() ? file : new File("../src/test/resources"); DefaultMustacheFactory mf = new DefaultMustacheFactory(root); mf.setObjectHandler(new JavascriptObjectHandler()); InputStream json = getClass().getClassLoader().getResourceAsStream("hogan.json"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] bytes = new byte[1024]; int read; while ((read = json.read(bytes)) != -1) { baos.write(bytes, 0, read); } Object scope = se.eval("var tweet = " + new String(baos.toByteArray()) + "; " + "var tweets = []; for (var i = 0; i < 50; i++) { tweets.push(tweet); };" + "this;"); StringWriter sw = new StringWriter(); Mustache m = mf.compile("timeline.mustache"); m.execute(sw, scope).close(); StringWriter sw2 = new StringWriter(); final List<Tweet> list = new ArrayList<Tweet>(); for (int i = 0; i < 50 ; i++) { list.add(new Tweet()); } m.execute(sw2, new Object() { List tweets = list; }).close(); assertEquals(sw2.toString(), sw.toString()); } }