jaroslav@1170: /** jaroslav@1170: * Back 2 Browser Bytecode Translator jaroslav@1170: * Copyright (C) 2012 Jaroslav Tulach jaroslav@1170: * jaroslav@1170: * This program is free software: you can redistribute it and/or modify jaroslav@1170: * it under the terms of the GNU General Public License as published by jaroslav@1170: * the Free Software Foundation, version 2 of the License. jaroslav@1170: * jaroslav@1170: * This program is distributed in the hope that it will be useful, jaroslav@1170: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@1170: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@1170: * GNU General Public License for more details. jaroslav@1170: * jaroslav@1170: * You should have received a copy of the GNU General Public License jaroslav@1170: * along with this program. Look for COPYING file in the top folder. jaroslav@1170: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@1170: */ jaroslav@1170: package org.apidesign.bck2brwsr.launcher.fximpl; jaroslav@1170: jaroslav@1170: import java.lang.reflect.InvocationTargetException; jaroslav@1170: import java.lang.reflect.Method; jaroslav@1170: import java.net.URL; jaroslav@1170: import javax.script.Invocable; jaroslav@1170: import javax.script.ScriptEngine; jaroslav@1170: import javax.script.ScriptEngineManager; jaroslav@1170: import javax.script.ScriptException; jaroslav@1170: import static org.testng.Assert.*; jaroslav@1170: import org.testng.annotations.BeforeClass; jaroslav@1170: import org.testng.annotations.Test; jaroslav@1170: jaroslav@1170: /** jaroslav@1170: * jaroslav@1170: * @author Jaroslav Tulach jaroslav@1170: */ jaroslav@1170: public class JsClassLoaderTest { jaroslav@1170: private static ClassLoader loader; jaroslav@1170: private static Class methodClass; jaroslav@1170: jaroslav@1170: public JsClassLoaderTest() { jaroslav@1170: } jaroslav@1170: jaroslav@1170: @BeforeClass jaroslav@1170: public static void setUpClass() throws Exception { jaroslav@1170: ScriptEngineManager sem = new ScriptEngineManager(); jaroslav@1170: final ScriptEngine eng = sem.getEngineByMimeType("text/javascript"); jaroslav@1170: jaroslav@1170: URL my = JsClassLoaderTest.class.getProtectionDomain().getCodeSource().getLocation(); jaroslav@1170: ClassLoader parent = JsClassLoaderTest.class.getClassLoader().getParent(); jaroslav@1170: loader = new JsClassLoader(new URL[] { my }, parent) { jaroslav@1170: @Override jaroslav@1170: protected JsClassLoader.Fn defineFn(String code, String... names) { jaroslav@1170: StringBuilder sb = new StringBuilder(); jaroslav@1170: sb.append("(function() {"); jaroslav@1170: sb.append("var r = {};"); jaroslav@1170: sb.append("r.fn = function("); jaroslav@1170: String sep = ""; jaroslav@1170: for (String n : names) { jaroslav@1170: sb.append(sep); jaroslav@1170: sb.append(n); jaroslav@1170: sep = ", "; jaroslav@1170: } jaroslav@1170: sb.append(") {"); jaroslav@1170: sb.append(code); jaroslav@1170: sb.append("};"); jaroslav@1170: sb.append("return r;"); jaroslav@1170: sb.append("})()"); jaroslav@1170: try { jaroslav@1170: final Object val = eng.eval(sb.toString()); jaroslav@1170: return new JsClassLoader.Fn() { jaroslav@1170: @Override jaroslav@1170: public Object invoke(Object... args) throws Exception { jaroslav@1170: Invocable inv = (Invocable)eng; jaroslav@1170: return inv.invokeMethod(val, "fn", args); jaroslav@1170: } jaroslav@1170: }; jaroslav@1170: } catch (ScriptException ex) { jaroslav@1170: throw new LinkageError("Can't parse: " + sb, ex); jaroslav@1170: } jaroslav@1170: } jaroslav@1170: }; jaroslav@1170: jaroslav@1170: methodClass = loader.loadClass(JsMethods.class.getName()); jaroslav@1170: } jaroslav@1170: jaroslav@1170: @Test public void noParamMethod() throws Throwable { jaroslav@1170: Method plus = methodClass.getMethod("fortyTwo"); jaroslav@1170: try { jaroslav@1170: final Object val = plus.invoke(null); jaroslav@1170: assertTrue(val instanceof Number, "A number returned " + val); jaroslav@1170: assertEquals(((Number)val).intValue(), 42); jaroslav@1170: } catch (InvocationTargetException ex) { jaroslav@1170: throw ex.getTargetException(); jaroslav@1170: } jaroslav@1170: } jaroslav@1170: /* jaroslav@1170: @Test public void testExecuteScript() throws Throwable { jaroslav@1170: Method plus = methodClass.getMethod("plus", int.class, int.class); jaroslav@1170: try { jaroslav@1170: assertEquals(plus.invoke(null, 10, 20), 30); jaroslav@1170: } catch (InvocationTargetException ex) { jaroslav@1170: throw ex.getTargetException(); jaroslav@1170: } jaroslav@1170: } jaroslav@1170: */ jaroslav@1170: jaroslav@1170: }