rt/vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 30 Oct 2013 17:15:23 +0100
changeset 1392 da9e5973e699
parent 789 bb7506513353
child 1787 ea12a3bb4b33
permissions -rw-r--r--
Adopting to JDK8's Nashorn differences. Most tests should now pass with Nashorn now.
jaroslav@201
     1
/**
jaroslav@201
     2
 * Back 2 Browser Bytecode Translator
jaroslav@201
     3
 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@201
     4
 *
jaroslav@201
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@201
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@201
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@201
     8
 *
jaroslav@201
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@201
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@201
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@201
    12
 * GNU General Public License for more details.
jaroslav@201
    13
 *
jaroslav@201
    14
 * You should have received a copy of the GNU General Public License
jaroslav@201
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@201
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@201
    17
 */
jaroslav@201
    18
package org.apidesign.vm4brwsr;
jaroslav@201
    19
jaroslav@201
    20
import javax.script.ScriptContext;
jaroslav@201
    21
import javax.script.ScriptEngine;
jaroslav@201
    22
import javax.script.ScriptException;
jaroslav@201
    23
import org.testng.annotations.BeforeClass;
jaroslav@201
    24
import static org.testng.Assert.*;
jaroslav@789
    25
import org.testng.annotations.AfterClass;
jaroslav@201
    26
import org.testng.annotations.Test;
jaroslav@201
    27
jaroslav@201
    28
/** Implements loading class by class.
jaroslav@201
    29
 *
jaroslav@201
    30
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@201
    31
 */
jaroslav@201
    32
public class VMLazyTest {
jaroslav@708
    33
    private static TestVM code;
jaroslav@201
    34
jaroslav@201
    35
    @BeforeClass
jaroslav@789
    36
    public static void compileTheCode() throws Exception {
jaroslav@201
    37
        StringBuilder sb = new StringBuilder();
jaroslav@277
    38
        sb.append("\nvar data = {};");
jaroslav@277
    39
        sb.append("\nfunction test(clazz, method) {");
jaroslav@277
    40
        sb.append("\n  if (!data.bck2brwsr) data.bck2brwsr = bck2brwsr(function(name) { return loader.get(name); });");
jaroslav@277
    41
        sb.append("\n  var c = data.bck2brwsr.loadClass(clazz);");
jaroslav@201
    42
        sb.append("\n  return c[method]();");
jaroslav@201
    43
        sb.append("\n}");
jaroslav@201
    44
        
jaroslav@507
    45
        sb.append("\nfunction checkKO() {");
jaroslav@507
    46
        sb.append("\n  return ko !== null;");
jaroslav@507
    47
        sb.append("\n}");
jaroslav@277
    48
       
jaroslav@201
    49
        ScriptEngine[] arr = { null };
jaroslav@708
    50
        code = TestVM.compileClass(sb, arr,
Martin@594
    51
            new String[]{"org/apidesign/vm4brwsr/VM", "org/apidesign/vm4brwsr/StaticMethod"}
jaroslav@201
    52
        );
jaroslav@298
    53
        arr[0].getContext().setAttribute("loader", new BytesLoader(), ScriptContext.ENGINE_SCOPE);
jaroslav@201
    54
    }
jaroslav@789
    55
    @AfterClass
jaroslav@789
    56
    public static void releaseTheCode() {
jaroslav@789
    57
        code = null;
jaroslav@789
    58
    }
jaroslav@201
    59
    
jaroslav@201
    60
    @Test public void invokeStaticMethod() throws Exception {
jaroslav@201
    61
        assertExec("Trying to get -1", "test", Double.valueOf(-1),
jaroslav@277
    62
            StaticMethod.class.getName(), "minusOne__I"
jaroslav@201
    63
        );
jaroslav@201
    64
    }
jaroslav@214
    65
jaroslav@214
    66
    @Test public void loadDependantClass() throws Exception {
jaroslav@277
    67
        assertExec("Expecting zero", "test", Double.valueOf(0),
jaroslav@277
    68
            InstanceSub.class.getName(), "recallDbl__D"
jaroslav@214
    69
        );
jaroslav@214
    70
    }
jaroslav@201
    71
jaroslav@503
    72
    @Test public void loadClassWithAssociatedScript() throws Exception {
jaroslav@503
    73
        assertExec("ko is defined", "test", true,
jaroslav@503
    74
            Script.class.getName(), "checkNotNull__Z"
jaroslav@503
    75
        );
jaroslav@507
    76
        
jaroslav@507
    77
        Object res = code.invokeFunction("checkKO");
jaroslav@507
    78
        assertEquals(res, true, "KO is defined on a global level");
jaroslav@503
    79
    }
jaroslav@503
    80
jaroslav@201
    81
    private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception {
jaroslav@201
    82
        Object ret = null;
jaroslav@201
    83
        try {
jaroslav@201
    84
            ret = code.invokeFunction(methodName, args);
jaroslav@201
    85
        } catch (ScriptException ex) {
jaroslav@708
    86
            fail("Execution failed in\n" + code.toString(), ex);
jaroslav@201
    87
        } catch (NoSuchMethodException ex) {
jaroslav@708
    88
            fail("Cannot find method in\n" + code.toString(), ex);
jaroslav@201
    89
        }
jaroslav@201
    90
        if (ret == null && expRes == null) {
jaroslav@201
    91
            return;
jaroslav@201
    92
        }
jaroslav@1392
    93
        if (expRes instanceof Double && ret instanceof Number) {
jaroslav@1392
    94
            ret = ((Number)ret).doubleValue();
jaroslav@1392
    95
        }
jaroslav@201
    96
        if (expRes.equals(ret)) {
jaroslav@201
    97
            return;
jaroslav@201
    98
        }
jaroslav@708
    99
        assertEquals(ret, expRes, msg + "was: " + ret + "\n" + code.toString());
jaroslav@201
   100
    }
jaroslav@201
   101
}