/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.io.Serializable;
import java.util.Arrays;
/**
* Exercise some class-related instructions.
*/
public class Classes {
int mSome;
public void subFunc(boolean wantSub) {
Main.assertTrue(!wantSub);
}
void checkCast(Object thisRef, Object moreRef, Object nullRef) {
System.out.println("Classes.checkCast");
Classes classes;
MoreClasses more;
classes = (Classes) thisRef;
Main.assertTrue(thisRef instanceof Classes);
classes = (Classes) moreRef;
Main.assertTrue(moreRef instanceof Classes);
more = (MoreClasses) moreRef;
Main.assertTrue(moreRef instanceof MoreClasses);
Main.assertTrue(!(thisRef instanceof MoreClasses));
try {
more = (MoreClasses) thisRef;
Main.assertTrue(false);
} catch (ClassCastException cce) {
//System.out.println(" class cast msg: " + cce.getMessage());
//Dalvik throws terser message than Hotspot VM
Main.assertTrue(cce.getMessage().regionMatches(false, 0, "Classes", 0, 7));
}
Main.assertTrue(!(thisRef instanceof MoreClasses));
/* hopefully these classes cause a resolve */
try {
java.math.RoundingMode mode = (java.math.RoundingMode) thisRef;
Main.assertTrue(false);
} catch (ClassCastException cce) {
//System.out.println(" class cast msg: " + cce.getMessage());
//Dalvik throws terser message than Hotspot VM
Main.assertTrue(cce.getMessage().regionMatches(false, 0, "Classes", 0, 7));
}
Main.assertTrue(!(thisRef instanceof java.math.BigDecimal));
/* try some stuff with a null reference */
classes = (Classes) nullRef;
classes = (MoreClasses) nullRef;
more = (MoreClasses) nullRef;
Main.assertTrue(!(nullRef instanceof Classes));
}
static void xTests(Object x) {
Main.assertTrue( x instanceof Classes);
Main.assertTrue(!(x instanceof MoreClasses));
}
static void yTests(Object y) {
Main.assertTrue( y instanceof Classes);
Main.assertTrue( y instanceof MoreClasses);
}
static void xarTests(Object xar) {
Main.assertTrue( xar instanceof Object);
Main.assertTrue(!(xar instanceof Classes));
Main.assertTrue( xar instanceof Classes[]);
Main.assertTrue(!(xar instanceof MoreClasses[]));
Main.assertTrue( xar instanceof Object[]);
Main.assertTrue(!(xar instanceof Object[][]));
}
static void yarTests(Object yar) {
Main.assertTrue( yar instanceof Classes[]);
Main.assertTrue( yar instanceof MoreClasses[]);
}
static void xarararTests(Object xararar) {
Main.assertTrue( xararar instanceof Object);
Main.assertTrue( xararar instanceof Object[]);
Main.assertTrue(!(xararar instanceof Classes));
Main.assertTrue(!(xararar instanceof Classes[]));
Main.assertTrue(!(xararar instanceof Classes[][]));
Main.assertTrue( xararar instanceof Classes[][][]);
Main.assertTrue(!(xararar instanceof MoreClasses[][][]));
Main.assertTrue( xararar instanceof Object[][][]);
Main.assertTrue( xararar instanceof Serializable);
Main.assertTrue( xararar instanceof Serializable[]);
Main.assertTrue( xararar instanceof Serializable[][]);
Main.assertTrue(!(xararar instanceof Serializable[][][]));
}
static void yarararTests(Object yararar) {
Main.assertTrue( yararar instanceof Classes[][][]);
Main.assertTrue( yararar instanceof MoreClasses[][][]);
}
static void iarTests(Object iar) {
Main.assertTrue( iar instanceof Object);
Main.assertTrue(!(iar instanceof Object[]));
}
static void iararTests(Object iarar) {
Main.assertTrue( iarar instanceof Object);
Main.assertTrue( iarar instanceof Object[]);
Main.assertTrue(!(iarar instanceof Object[][]));
}
/*
* Exercise filled-new-array and test instanceof on arrays.
*
* We call out instead of using "instanceof" directly to avoid
* compiler optimizations.
*/
static void arrayInstance() {
System.out.println("Classes.arrayInstance");
Classes x = new Classes();
Classes[] xar = new Classes[1];
Classes[][] xarar = new Classes[1][1];
Classes[][][] xararar = new Classes[1][2][3];
MoreClasses y = new MoreClasses();
MoreClasses[] yar = new MoreClasses[3];
MoreClasses[][] yarar = new MoreClasses[2][3];
MoreClasses[][][] yararar = new MoreClasses[1][2][3];
int[] iar = new int[1];
int[][] iarar = new int[1][1];
Object test;
xTests(x);
yTests(y);
xarTests(xar);
yarTests(yar);
xarararTests(xararar);
yarararTests(yararar);
iarTests(iar);
iararTests(iarar);
yararar[0] = yarar;
yararar[0][0] = yar;
yararar[0][1] = yar;
yararar[0][0][0] = y;
yararar[0][0][1] = y;
yararar[0][0][2] = y;
yararar[0][1][0] = y;
yararar[0][1][1] = y;
yararar[0][1][2] = y;
String strForm;
String[][][][] multi1 = new String[2][3][2][1];
multi1[0] = new String[2][3][2];
multi1[0][1] = new String[3][2];
multi1[0][1][2] = new String[2];
multi1[0][1][2][1] = "HELLO-1";
strForm = Arrays.deepToString(multi1);
String[][][][][] multi2 = new String[5][2][3][2][1];
multi2[0] = new String[5][2][3][2];
multi2[0][1] = new String[5][2][3];
multi2[0][1][2] = new String[5][2];
multi2[0][1][2][1] = new String[5];
multi2[0][1][2][1][4] = "HELLO-2";
strForm = Arrays.deepToString(multi2);
String[][][][][][] multi3 = new String[2][5][2][3][2][1];
multi3[0] = new String[2][][][][];
multi3[0][1] = new String[3][][][];
multi3[0][1][2] = new String[2][][];
multi3[0][1][2][1] = new String[5][];
multi3[0][1][2][1][4] = new String[2];
multi3[0][1][2][1][4][1] = "HELLO-3";
strForm = Arrays.deepToString(multi3);
// build up pieces
String[][][][][][] multi4 = new String[1][][][][][];
multi4[0] = new String[2][][][][];
multi4[0][1] = new String[3][][][];
multi4[0][1][2] = new String[2][][];
multi4[0][1][2][1] = new String[5][];
multi4[0][1][2][1][4] = new String[2];
multi4[0][1][2][1][4][1] = "HELLO-4";
strForm = Arrays.deepToString(multi4);
/* this is expected to fail; 1073921584 * 4 overflows 32 bits */
try {
String[][][][][] multiX = new String[5][2][3][2][1073921584];
Main.assertTrue(false);
} catch (Error e) {
//System.out.println(" Got expected failure: " + e);
}
}
public static void run() {
Classes classes = new Classes();
MoreClasses more = new MoreClasses();
classes.checkCast(classes, more, null);
more.subFunc(true);
more.superFunc(false);
arrayInstance();
}
}
class MoreClasses extends Classes {
int mMore;
public MoreClasses() {}
public void subFunc(boolean wantSub) {
Main.assertTrue(wantSub);
}
public void superFunc(boolean wantSub) {
super.subFunc(wantSub);
}
}