jaroslav@201: /** jaroslav@201: * Back 2 Browser Bytecode Translator jaroslav@201: * Copyright (C) 2012 Jaroslav Tulach jaroslav@201: * jaroslav@201: * This program is free software: you can redistribute it and/or modify jaroslav@201: * it under the terms of the GNU General Public License as published by jaroslav@201: * the Free Software Foundation, version 2 of the License. jaroslav@201: * jaroslav@201: * This program is distributed in the hope that it will be useful, jaroslav@201: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@201: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@201: * GNU General Public License for more details. jaroslav@201: * jaroslav@201: * You should have received a copy of the GNU General Public License jaroslav@201: * along with this program. Look for COPYING file in the top folder. jaroslav@201: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@201: */ jaroslav@201: package org.apidesign.vm4brwsr; jaroslav@201: jaroslav@201: import javax.script.ScriptContext; jaroslav@201: import javax.script.ScriptEngine; jaroslav@201: import javax.script.ScriptException; jaroslav@201: import org.testng.annotations.BeforeClass; jaroslav@201: import static org.testng.Assert.*; jaroslav@789: import org.testng.annotations.AfterClass; jaroslav@201: import org.testng.annotations.Test; jaroslav@201: jaroslav@201: /** Implements loading class by class. jaroslav@201: * jaroslav@201: * @author Jaroslav Tulach jaroslav@201: */ jaroslav@201: public class VMLazyTest { jaroslav@708: private static TestVM code; jaroslav@201: jaroslav@201: @BeforeClass jaroslav@789: public static void compileTheCode() throws Exception { jaroslav@201: StringBuilder sb = new StringBuilder(); jaroslav@277: sb.append("\nvar data = {};"); jaroslav@277: sb.append("\nfunction test(clazz, method) {"); jaroslav@277: sb.append("\n if (!data.bck2brwsr) data.bck2brwsr = bck2brwsr(function(name) { return loader.get(name); });"); jaroslav@277: sb.append("\n var c = data.bck2brwsr.loadClass(clazz);"); jaroslav@201: sb.append("\n return c[method]();"); jaroslav@201: sb.append("\n}"); jaroslav@201: jaroslav@507: sb.append("\nfunction checkKO() {"); jaroslav@507: sb.append("\n return ko !== null;"); jaroslav@507: sb.append("\n}"); jaroslav@277: jaroslav@201: ScriptEngine[] arr = { null }; jaroslav@708: code = TestVM.compileClass(sb, arr, Martin@594: new String[]{"org/apidesign/vm4brwsr/VM", "org/apidesign/vm4brwsr/StaticMethod"} jaroslav@201: ); jaroslav@298: arr[0].getContext().setAttribute("loader", new BytesLoader(), ScriptContext.ENGINE_SCOPE); jaroslav@201: } jaroslav@789: @AfterClass jaroslav@789: public static void releaseTheCode() { jaroslav@789: code = null; jaroslav@789: } jaroslav@201: jaroslav@201: @Test public void invokeStaticMethod() throws Exception { jaroslav@201: assertExec("Trying to get -1", "test", Double.valueOf(-1), jaroslav@277: StaticMethod.class.getName(), "minusOne__I" jaroslav@201: ); jaroslav@201: } jaroslav@214: jaroslav@214: @Test public void loadDependantClass() throws Exception { jaroslav@277: assertExec("Expecting zero", "test", Double.valueOf(0), jaroslav@277: InstanceSub.class.getName(), "recallDbl__D" jaroslav@214: ); jaroslav@214: } jaroslav@201: jaroslav@503: @Test public void loadClassWithAssociatedScript() throws Exception { jaroslav@503: assertExec("ko is defined", "test", true, jaroslav@503: Script.class.getName(), "checkNotNull__Z" jaroslav@503: ); jaroslav@507: jaroslav@507: Object res = code.invokeFunction("checkKO"); jaroslav@507: assertEquals(res, true, "KO is defined on a global level"); jaroslav@503: } jaroslav@503: jaroslav@201: private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception { jaroslav@201: Object ret = null; jaroslav@201: try { jaroslav@201: ret = code.invokeFunction(methodName, args); jaroslav@201: } catch (ScriptException ex) { jaroslav@708: fail("Execution failed in\n" + code.toString(), ex); jaroslav@201: } catch (NoSuchMethodException ex) { jaroslav@708: fail("Cannot find method in\n" + code.toString(), ex); jaroslav@201: } jaroslav@201: if (ret == null && expRes == null) { jaroslav@201: return; jaroslav@201: } jaroslav@1392: if (expRes instanceof Double && ret instanceof Number) { jaroslav@1392: ret = ((Number)ret).doubleValue(); jaroslav@1392: } jaroslav@201: if (expRes.equals(ret)) { jaroslav@201: return; jaroslav@201: } jaroslav@708: assertEquals(ret, expRes, msg + "was: " + ret + "\n" + code.toString()); jaroslav@201: } jaroslav@201: }