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