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