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