vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 11 Oct 2012 10:43:17 -0700
changeset 103 e8438996d406
parent 99 67e892757752
child 106 346633cd13d6
permissions -rw-r--r--
Less compilation during test execution
jaroslav@0
     1
/*
jaroslav@0
     2
Java 4 Browser Bytecode Translator
jaroslav@0
     3
Copyright (C) 2012-2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@0
     4
jaroslav@0
     5
This program is free software: you can redistribute it and/or modify
jaroslav@0
     6
it under the terms of the GNU General Public License as published by
jaroslav@0
     7
the Free Software Foundation, version 2 of the License.
jaroslav@0
     8
jaroslav@0
     9
This program is distributed in the hope that it will be useful,
jaroslav@0
    10
but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@0
    11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@0
    12
GNU General Public License for more details.
jaroslav@0
    13
jaroslav@0
    14
You should have received a copy of the GNU General Public License
jaroslav@0
    15
along with this program. Look for COPYING file in the top folder.
jaroslav@0
    16
If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@0
    17
*/
jaroslav@22
    18
package org.apidesign.vm4brwsr;
jaroslav@0
    19
jaroslav@0
    20
import java.io.IOException;
jaroslav@0
    21
import javax.script.Invocable;
jaroslav@0
    22
import javax.script.ScriptEngine;
jaroslav@0
    23
import javax.script.ScriptEngineManager;
jaroslav@0
    24
import javax.script.ScriptException;
jaroslav@0
    25
import static org.testng.Assert.*;
jaroslav@103
    26
import org.testng.annotations.BeforeClass;
jaroslav@0
    27
import org.testng.annotations.Test;
jaroslav@0
    28
jaroslav@0
    29
/** Checks the basic behavior of the translator.
jaroslav@0
    30
 *
jaroslav@0
    31
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@0
    32
 */
jaroslav@0
    33
public class StaticMethodTest {
jaroslav@0
    34
    @Test public void threePlusFour() throws Exception {
jaroslav@2
    35
        assertExec(
jaroslav@2
    36
            "Should be seven", 
jaroslav@22
    37
            "org_apidesign_vm4brwsr_StaticMethod_sumIII", 
jaroslav@2
    38
            Double.valueOf(7), 
jaroslav@2
    39
            3, 4
jaroslav@2
    40
        );
jaroslav@0
    41
    }
jaroslav@0
    42
jaroslav@1
    43
    @Test public void powerOfThree() throws Exception {
jaroslav@2
    44
        assertExec(
jaroslav@2
    45
            "Should be nine", 
jaroslav@22
    46
            "org_apidesign_vm4brwsr_StaticMethod_powerFF", 
jaroslav@2
    47
            Double.valueOf(9),
jaroslav@2
    48
            3.0f
jaroslav@2
    49
        );
jaroslav@1
    50
    }
jaroslav@1
    51
jaroslav@48
    52
    @Test public void minusOne() throws Exception {
jaroslav@48
    53
        assertExec(
jaroslav@48
    54
            "Should be minus one", 
jaroslav@48
    55
            "org_apidesign_vm4brwsr_StaticMethod_minusOneI", 
jaroslav@48
    56
            Double.valueOf(-1)
jaroslav@48
    57
        );
jaroslav@48
    58
    }
jaroslav@48
    59
jaroslav@2
    60
    @Test public void doubleWithoutLong() throws Exception {
jaroslav@2
    61
        assertExec(
jaroslav@2
    62
            "Should be two",
jaroslav@22
    63
            "org_apidesign_vm4brwsr_StaticMethod_minusDDJ", 
jaroslav@2
    64
            Double.valueOf(2),
jaroslav@2
    65
            3.0d, 1l
jaroslav@2
    66
        );
jaroslav@2
    67
    }
jaroslav@3
    68
jaroslav@3
    69
    @Test public void divAndRound() throws Exception {
jaroslav@3
    70
        assertExec(
jaroslav@3
    71
            "Should be rounded to one",
jaroslav@22
    72
            "org_apidesign_vm4brwsr_StaticMethod_divIBD", 
jaroslav@3
    73
            Double.valueOf(1),
jaroslav@3
    74
            3, 3.75
jaroslav@3
    75
        );
jaroslav@3
    76
    }
jaroslav@3
    77
    @Test public void mixedMethodFourParams() throws Exception {
jaroslav@3
    78
        assertExec(
jaroslav@3
    79
            "Should be two",
jaroslav@22
    80
            "org_apidesign_vm4brwsr_StaticMethod_mixIIJBD", 
jaroslav@3
    81
            Double.valueOf(20),
jaroslav@3
    82
            2, 10l, 5, 2.0
jaroslav@3
    83
        );
jaroslav@3
    84
    }
jaroslav@4
    85
    @Test public void factRec() throws Exception {
jaroslav@4
    86
        assertExec(
jaroslav@4
    87
            "Factorial of 5 is 120",
jaroslav@22
    88
            "org_apidesign_vm4brwsr_StaticMethod_factRecJI", 
jaroslav@4
    89
            Double.valueOf(120),
jaroslav@4
    90
            5
jaroslav@4
    91
        );
jaroslav@4
    92
    }
jaroslav@5
    93
    @Test public void factIter() throws Exception {
jaroslav@5
    94
        assertExec(
jaroslav@5
    95
            "Factorial of 5 is 120",
jaroslav@22
    96
            "org_apidesign_vm4brwsr_StaticMethod_factIterJI", 
jaroslav@5
    97
            Double.valueOf(120),
jaroslav@5
    98
            5
jaroslav@5
    99
        );
jaroslav@5
   100
    }
jaroslav@2
   101
    
jaroslav@6
   102
    @Test public void xor() throws Exception {
jaroslav@6
   103
        assertExec(
jaroslav@6
   104
            "Xor is 4",
jaroslav@22
   105
            "org_apidesign_vm4brwsr_StaticMethod_xorJIJ",
jaroslav@6
   106
            Double.valueOf(4),
jaroslav@6
   107
            7,
jaroslav@6
   108
            3
jaroslav@6
   109
        );
jaroslav@6
   110
    }
jaroslav@6
   111
    
jaroslav@7
   112
    @Test public void or() throws Exception {
jaroslav@7
   113
        assertExec(
jaroslav@7
   114
            "Or will be 7",
jaroslav@22
   115
            "org_apidesign_vm4brwsr_StaticMethod_orOrAndJZII",
jaroslav@7
   116
            Double.valueOf(7),
jaroslav@7
   117
            true,
jaroslav@7
   118
            4,
jaroslav@7
   119
            3
jaroslav@7
   120
        );
jaroslav@7
   121
    }
jaroslav@46
   122
    @Test public void nullCheck() throws Exception {
jaroslav@46
   123
        assertExec(
jaroslav@46
   124
            "Returns nothing",
jaroslav@46
   125
            "org_apidesign_vm4brwsr_StaticMethod_noneLjava_lang_ObjectII",
jaroslav@46
   126
            null, 1, 3
jaroslav@46
   127
        );
jaroslav@46
   128
    }
jaroslav@7
   129
    @Test public void and() throws Exception {
jaroslav@7
   130
        assertExec(
jaroslav@7
   131
            "And will be 3",
jaroslav@22
   132
            "org_apidesign_vm4brwsr_StaticMethod_orOrAndJZII",
jaroslav@7
   133
            Double.valueOf(3),
jaroslav@7
   134
            false,
jaroslav@7
   135
            7,
jaroslav@7
   136
            3
jaroslav@7
   137
        );
jaroslav@7
   138
    }
jaroslav@9
   139
    @Test public void inc4() throws Exception {
jaroslav@9
   140
        assertExec(
jaroslav@9
   141
            "It will be 4",
jaroslav@22
   142
            "org_apidesign_vm4brwsr_StaticMethod_inc4I",
jaroslav@9
   143
            Double.valueOf(4)
jaroslav@9
   144
        );
jaroslav@9
   145
    }
jaroslav@7
   146
    
jaroslav@93
   147
    @Test public void shiftLeftInJava() throws Exception {
jaroslav@93
   148
        int res = StaticMethod.shiftLeft(1, 8);
jaroslav@93
   149
        assertEquals(res, 256);
jaroslav@93
   150
    }
jaroslav@93
   151
jaroslav@93
   152
    @Test public void shiftLeftInJS() throws Exception {
jaroslav@93
   153
        assertExec(
jaroslav@93
   154
            "Setting 9th bit",
jaroslav@93
   155
            "org_apidesign_vm4brwsr_StaticMethod_shiftLeftIII",
jaroslav@93
   156
            Double.valueOf(256),
jaroslav@93
   157
            1, 8
jaroslav@93
   158
        );
jaroslav@93
   159
    }
jaroslav@93
   160
jaroslav@93
   161
    @Test public void shiftRightInJava() throws Exception {
jaroslav@93
   162
        int res = StaticMethod.shiftArithmRight(-8, 3, true);
jaroslav@93
   163
        assertEquals(res, -1);
jaroslav@93
   164
    }
jaroslav@93
   165
jaroslav@93
   166
    @Test public void shiftRightInJS() throws Exception {
jaroslav@93
   167
        assertExec(
jaroslav@93
   168
            "Get -1",
jaroslav@93
   169
            "org_apidesign_vm4brwsr_StaticMethod_shiftArithmRightIIIZ",
jaroslav@93
   170
            Double.valueOf(-1),
jaroslav@93
   171
            -8, 3, true
jaroslav@93
   172
        );
jaroslav@93
   173
    }
jaroslav@93
   174
    @Test public void unsignedShiftRightInJava() throws Exception {
jaroslav@93
   175
        int res = StaticMethod.shiftArithmRight(8, 3, false);
jaroslav@93
   176
        assertEquals(res, 1);
jaroslav@93
   177
    }
jaroslav@93
   178
jaroslav@93
   179
    @Test public void unsignedShiftRightInJS() throws Exception {
jaroslav@93
   180
        assertExec(
jaroslav@93
   181
            "Get -1",
jaroslav@93
   182
            "org_apidesign_vm4brwsr_StaticMethod_shiftArithmRightIIIZ",
jaroslav@93
   183
            Double.valueOf(1),
jaroslav@93
   184
            8, 3, false
jaroslav@93
   185
        );
jaroslav@93
   186
    }
jaroslav@93
   187
    
jaroslav@94
   188
    @Test public void javaScriptBody() throws Exception {
jaroslav@94
   189
        assertExec(
jaroslav@94
   190
            "JavaScript string",
jaroslav@99
   191
            "org_apidesign_vm4brwsr_StaticMethod_i2sLjava_lang_StringII",
jaroslav@94
   192
            "333",
jaroslav@99
   193
            330, 3
jaroslav@94
   194
        );
jaroslav@94
   195
    }
jaroslav@94
   196
    
jaroslav@103
   197
    private static CharSequence codeSeq;
jaroslav@103
   198
    private static Invocable code;
jaroslav@103
   199
    
jaroslav@103
   200
    @BeforeClass 
jaroslav@103
   201
    public void compileTheCode() throws Exception {
jaroslav@103
   202
        StringBuilder sb = new StringBuilder();
jaroslav@103
   203
        code = compileClass(sb, "org/apidesign/vm4brwsr/StaticMethod");
jaroslav@103
   204
        codeSeq = sb;
jaroslav@103
   205
    }
jaroslav@103
   206
    
jaroslav@103
   207
    
jaroslav@2
   208
    private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception {
jaroslav@2
   209
        StringBuilder sb = new StringBuilder();
jaroslav@2
   210
        
jaroslav@2
   211
        Object ret = null;
jaroslav@2
   212
        try {
jaroslav@103
   213
            ret = code.invokeFunction(methodName, args);
jaroslav@5
   214
        } catch (ScriptException ex) {
jaroslav@103
   215
            fail("Execution failed in\n" + codeSeq, ex);
jaroslav@2
   216
        } catch (NoSuchMethodException ex) {
jaroslav@103
   217
            fail("Cannot find method in\n" + codeSeq, ex);
jaroslav@2
   218
        }
jaroslav@2
   219
        if (ret == null && expRes == null) {
jaroslav@2
   220
            return;
jaroslav@2
   221
        }
jaroslav@46
   222
        if (expRes != null && expRes.equals(ret)) {
jaroslav@2
   223
            return;
jaroslav@2
   224
        }
jaroslav@103
   225
        assertEquals(ret, expRes, msg + "was: " + ret + "\n" + codeSeq);
jaroslav@2
   226
        
jaroslav@2
   227
    }
jaroslav@2
   228
jaroslav@13
   229
    static Invocable compileClass(StringBuilder sb, String... names) throws ScriptException, IOException {
jaroslav@19
   230
        if (sb == null) {
jaroslav@19
   231
            sb = new StringBuilder();
jaroslav@19
   232
        }
jaroslav@29
   233
        GenJS.compile(sb, names);
jaroslav@0
   234
        ScriptEngineManager sem = new ScriptEngineManager();
jaroslav@0
   235
        ScriptEngine js = sem.getEngineByExtension("js");
jaroslav@0
   236
        try {
jaroslav@0
   237
            Object res = js.eval(sb.toString());
jaroslav@0
   238
            assertTrue(js instanceof Invocable, "It is invocable object: " + res);
jaroslav@0
   239
            return (Invocable)js;
jaroslav@0
   240
        } catch (ScriptException ex) {
jaroslav@0
   241
            fail("Could not compile:\n" + sb, ex);
jaroslav@0
   242
            return null;
jaroslav@0
   243
        }
jaroslav@0
   244
    }
jaroslav@0
   245
}