rt/vm8/src/test/java/org/apidesign/bck2brwsr/vm8/LambdasTest.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sun, 14 Sep 2014 19:27:44 +0200
changeset 1692 2f800fdc371e
parent 1680 3b553acbd931
child 1787 ea12a3bb4b33
permissions -rw-r--r--
Adding necessary fake classes to allow Javac to compile lamda expressions against our emulation library.
jaroslav@1639
     1
/**
jaroslav@1639
     2
 * Back 2 Browser Bytecode Translator
jaroslav@1639
     3
 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@1639
     4
 *
jaroslav@1639
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@1639
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@1639
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@1639
     8
 *
jaroslav@1639
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@1639
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@1639
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@1639
    12
 * GNU General Public License for more details.
jaroslav@1639
    13
 *
jaroslav@1639
    14
 * You should have received a copy of the GNU General Public License
jaroslav@1639
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@1639
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@1639
    17
 */
jaroslav@1639
    18
package org.apidesign.bck2brwsr.vm8;
jaroslav@1639
    19
jaroslav@1692
    20
import java.util.ArrayList;
jaroslav@1692
    21
import java.util.Arrays;
jaroslav@1692
    22
import java.util.List;
jaroslav@1692
    23
import java.util.concurrent.Callable;
jaroslav@1680
    24
import org.apidesign.bck2brwsr.vmtest.Compare;
jaroslav@1680
    25
import org.apidesign.bck2brwsr.vmtest.VMTest;
jaroslav@1680
    26
import org.testng.annotations.Factory;
jaroslav@1639
    27
jaroslav@1639
    28
/**
jaroslav@1639
    29
 *
jaroslav@1639
    30
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@1639
    31
 */
jaroslav@1692
    32
public class LambdasTest extends LambdasSuper {
jaroslav@1680
    33
    @Compare public String StringverifyJSTime() throws Exception {
jaroslav@1680
    34
        return Lambdas.compound();
jaroslav@1639
    35
    }
jaroslav@1692
    36
jaroslav@1692
    37
    @Compare
jaroslav@1692
    38
    public int canCallLambda() {
jaroslav@1692
    39
        int[] arr = {0};
jaroslav@1692
    40
        Runnable incr = () -> {
jaroslav@1692
    41
            arr[0]++;
jaroslav@1692
    42
        };
jaroslav@1692
    43
        incr.run();
jaroslav@1692
    44
        return arr[0];
jaroslav@1692
    45
    }
jaroslav@1692
    46
jaroslav@1692
    47
    @Compare
jaroslav@1692
    48
    public String lambdaReturnsString() throws Exception {
jaroslav@1692
    49
        Callable<String> lambda = () -> "Hello World!";
jaroslav@1692
    50
        return lambda.call();
jaroslav@1692
    51
    }
jaroslav@1692
    52
jaroslav@1692
    53
    private interface Convertor<P, R> {
jaroslav@1692
    54
jaroslav@1692
    55
        public R convert(P value);
jaroslav@1692
    56
    }
jaroslav@1692
    57
jaroslav@1692
    58
    @Compare
jaroslav@1692
    59
    public int convertToLength() {
jaroslav@1692
    60
        Convertor<String, Integer> lambda = (String s) -> s.getBytes().length;
jaroslav@1692
    61
        return lambda.convert("buu");
jaroslav@1692
    62
    }
jaroslav@1692
    63
jaroslav@1692
    64
    private int meaningOfWorld = 0;
jaroslav@1692
    65
jaroslav@1692
    66
    @Compare
jaroslav@1692
    67
    public int accessToInstanceVar() {
jaroslav@1692
    68
        Runnable lambda = () -> {
jaroslav@1692
    69
            meaningOfWorld = 42;
jaroslav@1692
    70
        };
jaroslav@1692
    71
        lambda.run();
jaroslav@1692
    72
        return meaningOfWorld;
jaroslav@1692
    73
    }
jaroslav@1692
    74
jaroslav@1692
    75
    @Compare
jaroslav@1692
    76
    public int localMeaningOfWorld() {
jaroslav@1692
    77
        int[] meansOfWorld = new int[1];
jaroslav@1692
    78
        Runnable lambda = () -> {
jaroslav@1692
    79
            meansOfWorld[0] = 42;
jaroslav@1692
    80
        };
jaroslav@1692
    81
        lambda.run();
jaroslav@1692
    82
        return meansOfWorld[0];
jaroslav@1692
    83
    }
jaroslav@1692
    84
jaroslav@1692
    85
    @Compare
jaroslav@1692
    86
    public int useLocalVars() throws Exception {
jaroslav@1692
    87
        boolean bool = true;
jaroslav@1692
    88
        byte b = 2;
jaroslav@1692
    89
        short s = 3;
jaroslav@1692
    90
        int i = 4;
jaroslav@1692
    91
        long l = 5;
jaroslav@1692
    92
        float f = 6;
jaroslav@1692
    93
        double d = 7;
jaroslav@1692
    94
        char c = 8;
jaroslav@1692
    95
        Callable<Integer> lambda = () -> (int) ((bool ? 1 : 0) + b + s + i + l + f + d + c);
jaroslav@1692
    96
        return lambda.call();
jaroslav@1692
    97
    }
jaroslav@1692
    98
jaroslav@1692
    99
    @Compare
jaroslav@1692
   100
    public String callVirtualMethod() throws Exception {
jaroslav@1692
   101
        String foo = "foo";
jaroslav@1692
   102
        Callable<String> ref = foo::toUpperCase;
jaroslav@1692
   103
        return ref.call();
jaroslav@1692
   104
    }
jaroslav@1692
   105
jaroslav@1692
   106
    @Compare
jaroslav@1692
   107
    public int callInterfaceMethod() throws Exception {
jaroslav@1692
   108
        List<String> foos = Arrays.asList("foo");
jaroslav@1692
   109
        Callable<Integer> ref = foos::size;
jaroslav@1692
   110
        return ref.call();
jaroslav@1692
   111
    }
jaroslav@1692
   112
jaroslav@1692
   113
    @Compare
jaroslav@1692
   114
    public long callStaticMethod() throws Exception {
jaroslav@1692
   115
        long expected = System.currentTimeMillis();
jaroslav@1692
   116
        Callable<Long> ref = System::currentTimeMillis;
jaroslav@1692
   117
        return ref.call() & ~0xffff;
jaroslav@1692
   118
    }
jaroslav@1692
   119
jaroslav@1692
   120
    @Compare
jaroslav@1692
   121
    public String callConstructor() throws Exception {
jaroslav@1692
   122
        Callable<List<String>> ref = ArrayList<String>::new;
jaroslav@1692
   123
        return ref.call().toString();
jaroslav@1692
   124
    }
jaroslav@1692
   125
jaroslav@1692
   126
    @Compare
jaroslav@1692
   127
    public String superMethodOverridenByThis() throws Exception {
jaroslav@1692
   128
        Callable<String> ref = super::inheritedMethod;
jaroslav@1692
   129
        return ref.call();
jaroslav@1692
   130
    }
jaroslav@1692
   131
jaroslav@1692
   132
    @Override
jaroslav@1692
   133
    String inheritedMethod() {
jaroslav@1692
   134
        return "overridden version";
jaroslav@1692
   135
    }
jaroslav@1692
   136
jaroslav@1692
   137
    @Compare
jaroslav@1692
   138
    public String referencePrivateClassMethod() throws Exception {
jaroslav@1692
   139
        StringBuilder sb = new StringBuilder();
jaroslav@1692
   140
jaroslav@1692
   141
        Callable<String> ref1 = LambdasTest::privateClassMethod;
jaroslav@1692
   142
        sb.append(ref1.call());
jaroslav@1692
   143
jaroslav@1692
   144
        Callable<String> ref2 = this::privateInstanceMethod;
jaroslav@1692
   145
        sb.append("\n").append(ref2.call());
jaroslav@1692
   146
jaroslav@1692
   147
        // Normal method calls should still work after our magic
jaroslav@1692
   148
        // of making them them accessible from the lambda classes.
jaroslav@1692
   149
        sb.append("\n").append(privateClassMethod());
jaroslav@1692
   150
        sb.append("\n").append(privateInstanceMethod());
jaroslav@1692
   151
jaroslav@1692
   152
        return sb.toString();
jaroslav@1692
   153
    }
jaroslav@1692
   154
jaroslav@1692
   155
    private String privateInstanceMethod() {
jaroslav@1692
   156
        return "foo";
jaroslav@1692
   157
    }
jaroslav@1692
   158
jaroslav@1692
   159
    private static String privateClassMethod() {
jaroslav@1692
   160
        return "foo";
jaroslav@1692
   161
    }
jaroslav@1692
   162
jaroslav@1692
   163
    private String unrelatedPrivateMethod() {
jaroslav@1692
   164
        return "foo";
jaroslav@1692
   165
    }
jaroslav@1639
   166
    
jaroslav@1680
   167
    @Factory public static Object[] create() {
jaroslav@1680
   168
        return VMTest.create(LambdasTest.class);
jaroslav@1639
   169
    }
jaroslav@1639
   170
}
jaroslav@1639
   171