blob: 05cf84302ab56c9cfeef836bc92052cbc326b7b9 [file] [log] [blame]
jeffhao5d1ac922011-09-29 17:41:15 -07001/*
2 * Copyright 2006 The Android Open Source Project
3 */
4
5import java.lang.reflect.Array;
6
7/**
8 * Test java.lang.reflect.Array.
9 */
10public class Main {
11 public static void main(String[] args) {
12 testSingleInt();
Elliott Hughes741b5b72012-01-31 19:18:51 -080013 testSingleChar();
14 testSingleShort();
15 testSingleLong();
jeffhao5d1ac922011-09-29 17:41:15 -070016 testSingle();
17 testMultiInt();
18 testMulti();
19
20 System.out.println("ReflectArrayTest passed");
21 }
22
23 static void testSingleInt() {
24 Object intArray;
25
26 intArray = Array.newInstance(Integer.TYPE, 2);
27
28 int[] array = (int[]) intArray;
29 array[0] = 5;
30 Array.setInt(intArray, 1, 6);
31
32 if (Array.getInt(intArray, 0) != 5)
33 throw new RuntimeException();
34 if (array[1] != 6)
35 throw new RuntimeException();
36 try {
37 array[2] = 27;
38 throw new RuntimeException("store should have failed");
Elliott Hughes741b5b72012-01-31 19:18:51 -080039 } catch (ArrayIndexOutOfBoundsException abe) { }
40 try {
41 Array.setInt(intArray, 2, 27);
42 throw new RuntimeException("store should have failed");
43 } catch (ArrayIndexOutOfBoundsException abe) { }
jeffhao5d1ac922011-09-29 17:41:15 -070044 if (array.length != Array.getLength(intArray) ||
45 array.length != 2)
46 {
47 throw new RuntimeException("bad len");
48 }
49
Elliott Hughes741b5b72012-01-31 19:18:51 -080050 Integer x123 = Integer.valueOf(123);
51 Integer x456 = Integer.valueOf(456);
52
53 Array.set(intArray, 0, x123);
54 Array.set(intArray, 1, x456);
55 if (!Array.get(intArray, 0).equals(x123) || !Array.get(intArray, 1).equals(x456)) {
56 throw new RuntimeException("bad 123 or 456");
57 }
58
jeffhao5d1ac922011-09-29 17:41:15 -070059 int[][] wrongArray;
60 try {
61 wrongArray = (int[][]) intArray;
62 throw new RuntimeException("cast should have failed");
Elliott Hughes741b5b72012-01-31 19:18:51 -080063 } catch (ClassCastException cce) { }
jeffhao5d1ac922011-09-29 17:41:15 -070064
65 intArray = Array.newInstance(Integer.TYPE, 0);
66 if (Array.getLength(intArray) != 0)
67 throw new RuntimeException();
68 System.out.println("ReflectArrayTest.testSingleInt passed");
69 }
70
Elliott Hughes741b5b72012-01-31 19:18:51 -080071 static void testSingleChar() {
72 Object charArray = Array.newInstance(Character.TYPE, 7);
73
74 char[] array = (char[]) charArray;
75 array[0] = '0';
76 array[1] = 'W';
77 array[2] = '2';
78 array[3] = '3';
79 array[4] = 'X';
80 array[5] = '5';
81 array[6] = '6';
82 Array.setChar(charArray, 1, '1');
83 Array.setChar(charArray, 4, '4');
84 try {
85 Array.setShort(charArray, 3, (short) 'Y');
86 throw new RuntimeException("shouldn't allow short in char array");
87 } catch (IllegalArgumentException iae) {}
88 try {
89 Array.setInt(charArray, 5, 'Z');
90 throw new RuntimeException("shouldn't allow int in char array");
91 } catch (IllegalArgumentException iae) {}
92
93 try {
94 for (int i = 0; i < array.length; i++) {
95 if (Array.getInt(charArray, i) - '0' != i) {
96 throw new RuntimeException("mismatch: " + i + " is " + array[i]);
97 }
98 }
99
100 if (Array.getInt(charArray, 4) != '4') {
101 throw new RuntimeException("load should have worked");
102 }
103 } catch (IllegalArgumentException iae) {
Elliott Hughesfa23b1d2012-02-02 10:31:31 -0800104 iae.printStackTrace();
Elliott Hughes741b5b72012-01-31 19:18:51 -0800105 }
106 try {
107 Array.getByte(charArray, 2);
108 throw new RuntimeException("shouldn't allow read of char as byte");
109 } catch (IllegalArgumentException iae) {}
110
111 Array.setChar(charArray, 3, (char) 0xffff);
112 try {
113 if (Array.getInt(charArray, 3) != 0xffff) {
114 throw new RuntimeException("char got sign-extended? "
115 + Array.getInt(charArray, 3));
116 }
117 } catch (IllegalArgumentException iae) {
Elliott Hughesfa23b1d2012-02-02 10:31:31 -0800118 iae.printStackTrace();
Elliott Hughes741b5b72012-01-31 19:18:51 -0800119 }
120
121 System.out.println("ReflectArrayTest.testSingleChar passed");
122 }
123
124 static void testSingleShort() {
125 Object shortArray = Array.newInstance(Short.TYPE, 1);
126 Array.setShort(shortArray, 0, (short) -1);
127 if (Array.getInt(shortArray, 0) != -1) {
128 throw new RuntimeException("short didn't get sign-extended");
129 }
130
131 Short box = (Short) Array.get(shortArray, 0);
132
133 System.out.println("ReflectArrayTest.testSingleShort passed");
134 }
135
136 static void testSingleLong() {
137 Object longArray = Array.newInstance(Long.TYPE, 2);
138 Array.setInt(longArray, 0, 123);
139 Array.setLong(longArray, 1, 0x1122334455667788L);
140 try {
141 Array.getInt(longArray, 0);
142 throw new RuntimeException("shouldn't allow read of long as int");
143 } catch (IllegalArgumentException iae) {}
144
145 long[] array = (long[]) longArray;
146 if (array[0] != 123 || array[1] != 0x1122334455667788L) {
147 throw new RuntimeException();
148 }
149
150 float f = Array.getFloat(longArray, 0);
151 if (f < 122.9 || f > 123.1) {
152 throw new RuntimeException("long-as-float failed - " + f);
153 }
154 if (Array.getLong(longArray, 1) != 0x1122334455667788L) {
155 throw new RuntimeException("long1 failed");
156 }
157
158 System.out.println("ReflectArrayTest.testSingleLong passed");
159 }
160
jeffhao5d1ac922011-09-29 17:41:15 -0700161 static void testSingle() {
162 Object strArray;
163
164 strArray = Array.newInstance(String.class, 2);
165
166 String[] array = (String[]) strArray;
167 array[0] = "entry zero";
168 Array.set(strArray, 1, "entry one");
Elliott Hughes741b5b72012-01-31 19:18:51 -0800169 try {
170 Array.set(strArray, 2, "entry two");
171 throw new RuntimeException("store should have failed");
172 } catch (ArrayIndexOutOfBoundsException abe) { }
jeffhao5d1ac922011-09-29 17:41:15 -0700173
174 //System.out.println("array: " + array);
175
176 if (!"entry zero".equals(Array.get(strArray, 0)))
177 throw new RuntimeException();
178 if (!"entry one".equals(array[1]))
179 throw new RuntimeException();
180
181 if (array.length != Array.getLength(strArray) ||
182 array.length != 2)
183 {
184 throw new RuntimeException("bad len");
185 }
Elliott Hughes741b5b72012-01-31 19:18:51 -0800186
187 try {
188 Array.set(strArray, 0, new Integer(5));
189 throw new RuntimeException("store of Integer should have failed");
190 } catch (IllegalArgumentException iae) {}
jeffhao5d1ac922011-09-29 17:41:15 -0700191 System.out.println("ReflectArrayTest.testSingle passed");
192 }
193
194 static void testMultiInt() {
195 Object intIntIntArray;
196 int[] dimensions = { 3, 2, 1 };
197
198 intIntIntArray = Array.newInstance(Integer.TYPE, dimensions);
199 int[][][] array3 = (int[][][]) intIntIntArray;
200
201 array3[0][0][0] = 123; // trouble
202 array3[2][1][0] = 456;
203
204 try {
205 array3[2][1][1] = 768;
206 throw new RuntimeException("store should have failed");
207 }
208 catch (ArrayIndexOutOfBoundsException abe) {
209 }
210 System.out.println("ReflectArrayTest.testMultiInt passed");
211 }
212
213 static void testMulti() {
214 Object strStrStrArray;
215 int[] dimensions = { 1, 2, 3 };
216
217 strStrStrArray = Array.newInstance(String.class, dimensions);
218 String[][][] array3 = (String[][][]) strStrStrArray;
219
220 array3[0][0][0] = "zero zero zero";
221 array3[0][1][2] = "zero one two";
222
223 try {
224 array3[1][0][0] = "bad store";
225 throw new RuntimeException("store should have failed");
226 }
227 catch (ArrayIndexOutOfBoundsException abe) {
228 }
229
230 try {
231 String[][] array2 = (String[][]) strStrStrArray;
232 throw new RuntimeException("expecting bad cast");
233 }
234 catch (ClassCastException cce) {
235 }
236
237 String[] strar = new String[4];
238 strar[2] = "zero one two ++";
239 array3[0][1] = strar;
240 System.out.println(array3[0][1][2]);
241 //System.out.println("array3: " + array3);
242
243
244 int[] dimensions2 = { 1, 2 };
245 strStrStrArray = Array.newInstance(String[].class, dimensions2);
246 array3 = (String[][][]) strStrStrArray;
247
248 array3[0][1] = new String[3];
249 array3[0][1][2] = "zero one two";
250 try {
251 array3[1][0][0] = "bad store";
252 throw new RuntimeException("store should have failed");
253 }
254 catch (ArrayIndexOutOfBoundsException abe) {
255 }
256 System.out.println("ReflectArrayTest.testMulti passed");
257 }
258}