vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 26 Jan 2013 08:47:05 +0100
changeset 592 5e13b1ac2886
parent 453 5aca91d00356
child 649 4b16b7e23cab
permissions -rw-r--r--
In order to support fields of the same name in subclasses we are now prefixing them with name of the class that defines them. To provide convenient way to access them from generated bytecode and also directly from JavaScript, there is a getter/setter function for each field. It starts with _ followed by the field name. If called with a parameter, it sets the field, with a parameter it just returns it.
jaroslav@355
     1
/**
jaroslav@355
     2
 * Back 2 Browser Bytecode Translator
jaroslav@355
     3
 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@355
     4
 *
jaroslav@355
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@355
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@355
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@355
     8
 *
jaroslav@355
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@355
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@355
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@355
    12
 * GNU General Public License for more details.
jaroslav@355
    13
 *
jaroslav@355
    14
 * You should have received a copy of the GNU General Public License
jaroslav@355
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@355
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@355
    17
 */
jaroslav@355
    18
package org.apidesign.bck2brwsr.tck;
jaroslav@355
    19
jaroslav@392
    20
import java.lang.reflect.Method;
jaroslav@392
    21
import java.util.Arrays;
jaroslav@392
    22
import java.util.Collections;
jaroslav@392
    23
import java.util.List;
jaroslav@392
    24
import org.apidesign.bck2brwsr.core.JavaScriptBody;
jaroslav@355
    25
import org.apidesign.bck2brwsr.vmtest.Compare;
jaroslav@355
    26
import org.apidesign.bck2brwsr.vmtest.VMTest;
jaroslav@355
    27
import org.testng.annotations.Factory;
jaroslav@355
    28
jaroslav@355
    29
/**
jaroslav@355
    30
 *
jaroslav@355
    31
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@355
    32
 */
jaroslav@355
    33
public class ReflectionTest {
jaroslav@412
    34
    @Compare public boolean nonNullThis() {
jaroslav@412
    35
        return this == null;
jaroslav@412
    36
    }
jaroslav@412
    37
    
jaroslav@355
    38
    @Compare public String intType() {
jaroslav@355
    39
        return Integer.TYPE.toString();
jaroslav@355
    40
    }
jaroslav@355
    41
jaroslav@413
    42
    @Compare public String voidType() throws Exception {
jaroslav@413
    43
        return void.class.toString();
jaroslav@413
    44
    }
jaroslav@413
    45
jaroslav@355
    46
    @Compare public String longClass() {
jaroslav@355
    47
        return long.class.toString();
jaroslav@355
    48
    }
jaroslav@355
    49
    
jaroslav@392
    50
    @Compare public String namesOfMethods() {
jaroslav@392
    51
        StringBuilder sb = new StringBuilder();
jaroslav@392
    52
        String[] arr = new String[20];
jaroslav@392
    53
        int i = 0;
jaroslav@392
    54
        for (Method m : StaticUse.class.getMethods()) {
jaroslav@392
    55
            arr[i++] = m.getName();
jaroslav@392
    56
        }
jaroslav@392
    57
        for (String s : sort(arr, i)) {
jaroslav@392
    58
            sb.append(s).append("\n");
jaroslav@392
    59
        }
jaroslav@392
    60
        return sb.toString();
jaroslav@392
    61
    }
jaroslav@392
    62
    
jaroslav@413
    63
    @Compare public String cannotCallNonStaticMethodWithNull() throws Exception {
jaroslav@416
    64
        StaticUse.class.getMethod("instanceMethod").invoke(null);
jaroslav@416
    65
        return "should not happen";
jaroslav@416
    66
    }
jaroslav@416
    67
jaroslav@416
    68
    @Compare public Object voidReturnType() throws Exception {
jaroslav@416
    69
        return StaticUse.class.getMethod("instanceMethod").getReturnType();
jaroslav@413
    70
    }
jaroslav@413
    71
    
jaroslav@586
    72
    enum E { A, B };
jaroslav@586
    73
    @Compare public boolean isEnum() {
jaroslav@586
    74
        return E.A.getClass().isEnum();
jaroslav@586
    75
    }
jaroslav@586
    76
jaroslav@586
    77
    @Compare public boolean isNotEnum() {
jaroslav@586
    78
        return "".getClass().isEnum();
jaroslav@586
    79
    }
jaroslav@586
    80
    
jaroslav@394
    81
    @Compare public String newInstanceFails() throws InstantiationException {
jaroslav@394
    82
        try {
jaroslav@394
    83
            return "success: " + StaticUse.class.newInstance();
jaroslav@394
    84
        } catch (IllegalAccessException ex) {
jaroslav@394
    85
            return ex.getClass().getName();
jaroslav@394
    86
        }
jaroslav@394
    87
    }
jaroslav@394
    88
    
jaroslav@418
    89
    @Compare public String paramTypes() throws Exception {
jaroslav@418
    90
        Method plus = StaticUse.class.getMethod("plus", int.class, Integer.TYPE);
jaroslav@418
    91
        final Class[] pt = plus.getParameterTypes();
jaroslav@418
    92
        return pt[0].getName();
jaroslav@418
    93
    }
jaroslav@420
    94
    @Compare public String paramTypesNotFound() throws Exception {
jaroslav@420
    95
        return StaticUse.class.getMethod("plus", int.class, double.class).toString();
jaroslav@420
    96
    }
jaroslav@418
    97
    @Compare public int methodWithArgs() throws Exception {
jaroslav@418
    98
        Method plus = StaticUse.class.getMethod("plus", int.class, Integer.TYPE);
jaroslav@418
    99
        return (Integer)plus.invoke(null, 2, 3);
jaroslav@418
   100
    }
jaroslav@418
   101
    
jaroslav@448
   102
    @Compare public String classGetNameForByte() {
jaroslav@448
   103
         return byte.class.getName();
jaroslav@448
   104
    }
jaroslav@448
   105
    @Compare public String classGetNameForBaseObject() {
jaroslav@448
   106
        return newObject().getClass().getName();
jaroslav@448
   107
    }
jaroslav@448
   108
    @Compare public String classGetNameForJavaObject() {
jaroslav@448
   109
        return new Object().getClass().getName();
jaroslav@448
   110
    }
jaroslav@448
   111
    @Compare public String classGetNameForObjectArray() {
jaroslav@448
   112
        return (new Object[3]).getClass().getName();
jaroslav@448
   113
    }
jaroslav@448
   114
    @Compare public String classGetNameForSimpleIntArray() {
jaroslav@448
   115
        return (new int[3]).getClass().getName();
jaroslav@448
   116
    }
jaroslav@448
   117
    @Compare public boolean sameClassGetNameForSimpleCharArray() {
jaroslav@448
   118
        return (new char[3]).getClass() == (new char[34]).getClass();
jaroslav@448
   119
    }
jaroslav@448
   120
    @Compare public String classGetNameForMultiIntArray() {
jaroslav@448
   121
        return (new int[3][4][5][6][7][8][9]).getClass().getName();
jaroslav@448
   122
    }
jaroslav@453
   123
    @Compare public String classGetNameForMultiIntArrayInner() {
jaroslav@453
   124
        final int[][][][][][][] arr = new int[3][4][5][6][7][8][9];
jaroslav@453
   125
        int[][][][][][] subarr = arr[0];
jaroslav@453
   126
        int[][][][][] subsubarr = subarr[0];
jaroslav@453
   127
        return subsubarr.getClass().getName();
jaroslav@453
   128
    }
jaroslav@448
   129
    @Compare public String classGetNameForMultiStringArray() {
jaroslav@448
   130
        return (new String[3][4][5][6][7][8][9]).getClass().getName();
jaroslav@448
   131
    }
jaroslav@448
   132
    
jaroslav@449
   133
    @Compare public String classForByte() throws Exception {
jaroslav@449
   134
        return Class.forName("[Z").getName();
jaroslav@449
   135
    }
jaroslav@452
   136
jaroslav@452
   137
    @Compare public String classForUnknownArray() {
jaroslav@452
   138
        try {
jaroslav@452
   139
            return Class.forName("[W").getName();
jaroslav@452
   140
        } catch (Exception ex) {
jaroslav@452
   141
            return ex.getClass().getName();
jaroslav@452
   142
        }
jaroslav@452
   143
    }
jaroslav@452
   144
    
jaroslav@452
   145
    @Compare public String classForUnknownDeepArray() {
jaroslav@452
   146
        try {
jaroslav@452
   147
            return Class.forName("[[[[[W").getName();
jaroslav@452
   148
        } catch (Exception ex) {
jaroslav@452
   149
            return ex.getClass().getName();
jaroslav@452
   150
        }
jaroslav@452
   151
    }
jaroslav@449
   152
    
jaroslav@449
   153
    @Compare public String componentGetNameForObjectArray() {
jaroslav@449
   154
        return (new Object[3]).getClass().getComponentType().getName();
jaroslav@449
   155
    }
jaroslav@449
   156
    @Compare public boolean sameComponentGetNameForObjectArray() {
jaroslav@449
   157
        return (new Object[3]).getClass().getComponentType() == Object.class;
jaroslav@449
   158
    }
jaroslav@449
   159
    @Compare public String componentGetNameForSimpleIntArray() {
jaroslav@449
   160
        return (new int[3]).getClass().getComponentType().getName();
jaroslav@449
   161
    }
jaroslav@449
   162
    @Compare public String componentGetNameForMultiIntArray() {
jaroslav@449
   163
        return (new int[3][4][5][6][7][8][9]).getClass().getComponentType().getName();
jaroslav@449
   164
    }
jaroslav@449
   165
    @Compare public String componentGetNameForMultiStringArray() {
jaroslav@449
   166
        Class<?> c = (new String[3][4][5][6][7][8][9]).getClass();
jaroslav@449
   167
        StringBuilder sb = new StringBuilder();
jaroslav@449
   168
        for (;;) {
jaroslav@449
   169
            sb.append(c.getName()).append("\n");
jaroslav@449
   170
            c = c.getComponentType();
jaroslav@449
   171
            if (c == null) {
jaroslav@449
   172
                break;
jaroslav@449
   173
            }
jaroslav@449
   174
        }
jaroslav@449
   175
        return sb.toString();
jaroslav@449
   176
    }
jaroslav@449
   177
    
jaroslav@448
   178
    @Compare public boolean isArray() {
jaroslav@448
   179
        return new Object[0].getClass().isArray();
jaroslav@448
   180
    }
jaroslav@448
   181
    
jaroslav@392
   182
    @JavaScriptBody(args = { "arr", "len" }, body="var a = arr.slice(0, len); a.sort(); return a;")
jaroslav@392
   183
    private static String[] sort(String[] arr, int len) {
jaroslav@392
   184
        List<String> list = Arrays.asList(arr).subList(0, len);
jaroslav@392
   185
        Collections.sort(list);
jaroslav@392
   186
        return list.toArray(new String[0]);
jaroslav@392
   187
    }
jaroslav@355
   188
    
jaroslav@448
   189
    @JavaScriptBody(args = {}, body = "return new Object();")
jaroslav@448
   190
    private static Object newObject() {
jaroslav@448
   191
        return new Object();
jaroslav@448
   192
    }
jaroslav@448
   193
    
jaroslav@355
   194
    @Factory
jaroslav@355
   195
    public static Object[] create() {
jaroslav@355
   196
        return VMTest.create(ReflectionTest.class);
jaroslav@355
   197
    }
jaroslav@355
   198
    
jaroslav@355
   199
}