jaroslav@372: /** jaroslav@372: * Back 2 Browser Bytecode Translator jaroslav@372: * Copyright (C) 2012 Jaroslav Tulach jaroslav@372: * jaroslav@372: * This program is free software: you can redistribute it and/or modify jaroslav@372: * it under the terms of the GNU General Public License as published by jaroslav@372: * the Free Software Foundation, version 2 of the License. jaroslav@372: * jaroslav@372: * This program is distributed in the hope that it will be useful, jaroslav@372: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@372: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@372: * GNU General Public License for more details. jaroslav@372: * jaroslav@372: * You should have received a copy of the GNU General Public License jaroslav@372: * along with this program. Look for COPYING file in the top folder. jaroslav@372: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@372: */ jaroslav@372: package org.apidesign.bck2brwsr.vmtest.impl; jaroslav@372: jaroslav@372: import java.lang.reflect.Method; jaroslav@372: import java.util.Map; jaroslav@372: import java.util.WeakHashMap; jaroslav@372: import javax.script.Invocable; jaroslav@372: import org.apidesign.bck2brwsr.launcher.MethodInvocation; jaroslav@372: import org.testng.ITest; jaroslav@372: import org.testng.annotations.Test; jaroslav@372: jaroslav@372: /** jaroslav@372: * jaroslav@372: * @author Jaroslav Tulach jaroslav@372: */ jaroslav@372: public final class Bck2BrwsrCase implements ITest { jaroslav@372: private final Method m; jaroslav@372: private final Launchers l; jaroslav@372: private final int type; jaroslav@372: Object value; jaroslav@372: private Invocable code; jaroslav@372: private CharSequence codeSeq; jaroslav@372: private static final Map compiled = new WeakHashMap<>(); jaroslav@372: private Object inst; jaroslav@372: jaroslav@372: Bck2BrwsrCase(Method m, int type, Launchers l) { jaroslav@372: this.l = l; jaroslav@372: this.m = m; jaroslav@372: this.type = type; jaroslav@372: } jaroslav@372: jaroslav@372: @Test(groups = "run") jaroslav@372: public void executeCode() throws Throwable { jaroslav@372: if (type == 1) { jaroslav@372: MethodInvocation c = l.addMethod(m.getDeclaringClass(), m.getName(), false); jaroslav@372: value = c.toString(); jaroslav@372: } else if (type == 2) { jaroslav@372: MethodInvocation c = l.addMethod(m.getDeclaringClass(), m.getName(), true); jaroslav@372: value = c.toString(); jaroslav@372: } else { jaroslav@372: value = m.invoke(m.getDeclaringClass().newInstance()); jaroslav@372: } jaroslav@372: } jaroslav@372: jaroslav@372: @Override jaroslav@372: public String getTestName() { jaroslav@372: return m.getName() + "[" + typeName() + "]"; jaroslav@372: } jaroslav@372: jaroslav@372: final String typeName() { jaroslav@372: switch (type) { jaroslav@372: case 0: jaroslav@372: return "Java"; jaroslav@372: case 1: jaroslav@372: return "JavaScript"; jaroslav@372: case 2: jaroslav@372: return "Browser"; jaroslav@372: default: jaroslav@372: return "Unknown type " + type; jaroslav@372: } jaroslav@372: } jaroslav@372: jaroslav@372: private static String computeSignature(Method m) { jaroslav@372: StringBuilder sb = new StringBuilder(); jaroslav@372: appendType(sb, m.getReturnType()); jaroslav@372: for (Class c : m.getParameterTypes()) { jaroslav@372: appendType(sb, c); jaroslav@372: } jaroslav@372: return sb.toString(); jaroslav@372: } jaroslav@372: jaroslav@372: private static void appendType(StringBuilder sb, Class t) { jaroslav@372: if (t == null) { jaroslav@372: sb.append('V'); jaroslav@372: return; jaroslav@372: } jaroslav@372: if (t.isPrimitive()) { jaroslav@372: int ch = -1; jaroslav@372: if (t == int.class) { jaroslav@372: ch = 'I'; jaroslav@372: } jaroslav@372: if (t == short.class) { jaroslav@372: ch = 'S'; jaroslav@372: } jaroslav@372: if (t == byte.class) { jaroslav@372: ch = 'B'; jaroslav@372: } jaroslav@372: if (t == boolean.class) { jaroslav@372: ch = 'Z'; jaroslav@372: } jaroslav@372: if (t == long.class) { jaroslav@372: ch = 'J'; jaroslav@372: } jaroslav@372: if (t == float.class) { jaroslav@372: ch = 'F'; jaroslav@372: } jaroslav@372: if (t == double.class) { jaroslav@372: ch = 'D'; jaroslav@372: } jaroslav@372: assert ch != -1 : "Unknown primitive type " + t; jaroslav@372: sb.append((char) ch); jaroslav@372: return; jaroslav@372: } jaroslav@372: if (t.isArray()) { jaroslav@372: sb.append("_3"); jaroslav@372: appendType(sb, t.getComponentType()); jaroslav@372: return; jaroslav@372: } jaroslav@372: sb.append('L'); jaroslav@372: sb.append(t.getName().replace('.', '_')); jaroslav@372: sb.append("_2"); jaroslav@372: } jaroslav@372: jaroslav@372: }