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.
2 * Back 2 Browser Bytecode Translator
3 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
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.
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.
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.
18 package org.apidesign.bck2brwsr.tck;
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;
31 * @author Jaroslav Tulach <jtulach@netbeans.org>
33 public class ReflectionTest {
34 @Compare public boolean nonNullThis() {
38 @Compare public String intType() {
39 return Integer.TYPE.toString();
42 @Compare public String voidType() throws Exception {
43 return void.class.toString();
46 @Compare public String longClass() {
47 return long.class.toString();
50 @Compare public String namesOfMethods() {
51 StringBuilder sb = new StringBuilder();
52 String[] arr = new String[20];
54 for (Method m : StaticUse.class.getMethods()) {
55 arr[i++] = m.getName();
57 for (String s : sort(arr, i)) {
58 sb.append(s).append("\n");
63 @Compare public String cannotCallNonStaticMethodWithNull() throws Exception {
64 StaticUse.class.getMethod("instanceMethod").invoke(null);
65 return "should not happen";
68 @Compare public Object voidReturnType() throws Exception {
69 return StaticUse.class.getMethod("instanceMethod").getReturnType();
73 @Compare public boolean isEnum() {
74 return E.A.getClass().isEnum();
77 @Compare public boolean isNotEnum() {
78 return "".getClass().isEnum();
81 @Compare public String newInstanceFails() throws InstantiationException {
83 return "success: " + StaticUse.class.newInstance();
84 } catch (IllegalAccessException ex) {
85 return ex.getClass().getName();
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();
94 @Compare public String paramTypesNotFound() throws Exception {
95 return StaticUse.class.getMethod("plus", int.class, double.class).toString();
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);
102 @Compare public String classGetNameForByte() {
103 return byte.class.getName();
105 @Compare public String classGetNameForBaseObject() {
106 return newObject().getClass().getName();
108 @Compare public String classGetNameForJavaObject() {
109 return new Object().getClass().getName();
111 @Compare public String classGetNameForObjectArray() {
112 return (new Object[3]).getClass().getName();
114 @Compare public String classGetNameForSimpleIntArray() {
115 return (new int[3]).getClass().getName();
117 @Compare public boolean sameClassGetNameForSimpleCharArray() {
118 return (new char[3]).getClass() == (new char[34]).getClass();
120 @Compare public String classGetNameForMultiIntArray() {
121 return (new int[3][4][5][6][7][8][9]).getClass().getName();
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();
129 @Compare public String classGetNameForMultiStringArray() {
130 return (new String[3][4][5][6][7][8][9]).getClass().getName();
133 @Compare public String classForByte() throws Exception {
134 return Class.forName("[Z").getName();
137 @Compare public String classForUnknownArray() {
139 return Class.forName("[W").getName();
140 } catch (Exception ex) {
141 return ex.getClass().getName();
145 @Compare public String classForUnknownDeepArray() {
147 return Class.forName("[[[[[W").getName();
148 } catch (Exception ex) {
149 return ex.getClass().getName();
153 @Compare public String componentGetNameForObjectArray() {
154 return (new Object[3]).getClass().getComponentType().getName();
156 @Compare public boolean sameComponentGetNameForObjectArray() {
157 return (new Object[3]).getClass().getComponentType() == Object.class;
159 @Compare public String componentGetNameForSimpleIntArray() {
160 return (new int[3]).getClass().getComponentType().getName();
162 @Compare public String componentGetNameForMultiIntArray() {
163 return (new int[3][4][5][6][7][8][9]).getClass().getComponentType().getName();
165 @Compare public String componentGetNameForMultiStringArray() {
166 Class<?> c = (new String[3][4][5][6][7][8][9]).getClass();
167 StringBuilder sb = new StringBuilder();
169 sb.append(c.getName()).append("\n");
170 c = c.getComponentType();
175 return sb.toString();
178 @Compare public boolean isArray() {
179 return new Object[0].getClass().isArray();
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]);
189 @JavaScriptBody(args = {}, body = "return new Object();")
190 private static Object newObject() {
195 public static Object[] create() {
196 return VMTest.create(ReflectionTest.class);