/* * This file is part of the Jikes RVM project (http://jikesrvm.org). * * This file is licensed to You under the Eclipse Public License (EPL); * You may not use this file except in compliance with the License. You * may obtain a copy of the License at * * http://www.opensource.org/licenses/eclipse-1.0.php * * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. */ package test.org.jikesrvm.basic.core.bytecode; import test.org.jikesrvm.basic.core.bytecode.data.SubClassInDifferentPackage; public class TestClassHierarchy { public interface Magic { void magic(); } protected static class A implements Magic { public void magic() { System.out.print("A"); } } protected static class B extends A { public void magic() { System.out.print("B"); } } protected static class C extends B { public void magic() { System.out.print("C"); } } protected static class D extends A { public void magic() { System.out.print("D"); } } protected class E extends D { public void magic() { System.out.print("E"); } } protected class F extends A { public void magic() { System.out.print("F"); } } protected class G extends F { public void magic() { System.out.print("G"); } } protected class H implements Magic { public void magic() { System.out.print("H"); } } protected class I extends H { public void magic() { System.out.print("I"); } } protected class J extends I { public void magic() { System.out.print("J"); } } /* In TestClassHierarchy: A B extends A C extends B D extends A E extends D F extends A G extends F H I extends H J extends I In class SubClassInDifferentPackage extends TestClassHierarchy: P_B extends A P_C1 extends B P_C2 extends P_B P_D extends A P_E1 extends D P_E2 extends P_D P_F extends A P_G1 extends F P_G2 extends P_F P_H P_I1 extends H P_I2 extends P_H P_J1 extends I P_J2 extends P_I1 P_J3 In class SubSubClass extends SubClassInDifferentPackage: O_C1 extends P_B O_C2 extends P_B O_E extends P_D O_G extends SubClassInDifferentPackage.P_F O_I1 extends H O_I2 extends P_H O_J1 extends P_I1 O_J2 extends P_I2 */ static class SubSubClass extends test.org.jikesrvm.basic.core.bytecode.data.SubClassInDifferentPackage { static class O_C1 extends P_B { public void magic() { System.out.print("O_C1"); } } class O_C2 extends P_B { public void magic() { System.out.print("O_C2"); } } class O_E extends P_D { public void magic() { System.out.print("O_E"); } } class O_G extends SubClassInDifferentPackage.P_F { public void magic() { System.out.print("O_G"); } } class O_I1 extends H { public void magic() { System.out.print("O_I1"); } } class O_I2 extends P_H { public void magic() { System.out.print("O_I2"); } } class O_J1 extends P_I1 { public void magic() { System.out.print("O_J1"); } } class O_J2 extends P_I2 { public void magic() { System.out.print("O_J2"); } } private void runTests() { runTest("A", new A()); runTest("B", new B()); runTest("C", new C()); runTest("D", new D()); runTest("E", new E()); runTest("F", new F()); runTest("G", new G()); runTest("H", new H()); runTest("I", new I()); runTest("J", new J()); runTest("P_B", new P_B()); runTest("P_C1", new P_C1()); runTest("P_C2", new P_C2()); runTest("P_D", new P_D()); runTest("P_E1", new P_E1()); runTest("P_E2", new P_E2()); runTest("P_F", new P_F()); runTest("P_G1", new P_G1()); runTest("P_G2", new P_G2()); runTest("P_H", new P_H()); runTest("P_I1", new P_I1()); runTest("P_I2", new P_I2()); runTest("P_J1", new P_J1()); runTest("P_J2", new P_J2()); runTest("P_J3", new P_J3()); runTest("O_C1", new O_C1()); runTest("O_C2", new O_C2()); runTest("O_E", new O_E()); runTest("O_G", new O_G()); runTest("O_I1", new O_I1()); runTest("O_I2", new O_I2()); runTest("O_J1", new O_J1()); runTest("O_J2", new O_J2()); } private static void runTest(final String name, final Magic x3) { System.out.print("Testing " + name + " instanceOf: "); testInstanceOf(x3); System.out.print(" casts: "); testCasts(x3); System.out.print(" magic: "); x3.magic(); System.out.println(); } @SuppressWarnings({"UnusedDeclaration"}) private static void testCasts(final Object x) { try { final A o = (A) x; success(); } catch (final ClassCastException cce) { failure(); } try { final B o = (B) x; success(); } catch (final ClassCastException cce) { failure(); } try { final C o = (C) x; success(); } catch (final ClassCastException cce) { failure(); } try { final D o = (D) x; success(); } catch (final ClassCastException cce) { failure(); } try { final E o = (E) x; success(); } catch (final ClassCastException cce) { failure(); } try { final F o = (F) x; success(); } catch (final ClassCastException cce) { failure(); } try { final G o = (G) x; success(); } catch (final ClassCastException cce) { failure(); } try { final H o = (H) x; success(); } catch (final ClassCastException cce) { failure(); } try { final I o = (I) x; success(); } catch (final ClassCastException cce) { failure(); } try { final J o = (J) x; success(); } catch (final ClassCastException cce) { failure(); } try { final P_B o = (P_B) x; success(); } catch (final ClassCastException cce) { failure(); } try { final P_C1 o = (P_C1) x; success(); } catch (final ClassCastException cce) { failure(); } try { final P_C2 o = (P_C2) x; success(); } catch (final ClassCastException cce) { failure(); } try { final P_D o = (P_D) x; success(); } catch (final ClassCastException cce) { failure(); } try { final SubClassInDifferentPackage.P_E1 o = (SubClassInDifferentPackage.P_E1) x; success(); } catch (final ClassCastException cce) { failure(); } try { final SubClassInDifferentPackage.P_E2 o = (SubClassInDifferentPackage.P_E2) x; success(); } catch (final ClassCastException cce) { failure(); } try { final SubClassInDifferentPackage.P_F o = (SubClassInDifferentPackage.P_F) x; success(); } catch (final ClassCastException cce) { failure(); } try { final SubClassInDifferentPackage.P_G1 o = (SubClassInDifferentPackage.P_G1) x; success(); } catch (final ClassCastException cce) { failure(); } try { final SubClassInDifferentPackage.P_G2 o = (SubClassInDifferentPackage.P_G2) x; success(); } catch (final ClassCastException cce) { failure(); } try { final SubClassInDifferentPackage.P_H o = (SubClassInDifferentPackage.P_H) x; success(); } catch (final ClassCastException cce) { failure(); } try { final SubClassInDifferentPackage.P_I1 o = (SubClassInDifferentPackage.P_I1) x; success(); } catch (final ClassCastException cce) { failure(); } try { final SubClassInDifferentPackage.P_I2 o = (SubClassInDifferentPackage.P_I2) x; success(); } catch (final ClassCastException cce) { failure(); } try { final SubClassInDifferentPackage.P_J1 o = (SubClassInDifferentPackage.P_J1) x; success(); } catch (final ClassCastException cce) { failure(); } try { final SubClassInDifferentPackage.P_J2 o = (SubClassInDifferentPackage.P_J2) x; success(); } catch (final ClassCastException cce) { failure(); } try { final SubClassInDifferentPackage.P_J3 o = (SubClassInDifferentPackage.P_J3) x; success(); } catch (final ClassCastException cce) { failure(); } try { final O_C1 o = (O_C1) x; success(); } catch (final ClassCastException cce) { failure(); } try { final O_C2 o = (O_C2) x; success(); } catch (final ClassCastException cce) { failure(); } try { final O_E o = (O_E) x; success(); } catch (final ClassCastException cce) { failure(); } try { final O_G o = (O_G) x; success(); } catch (final ClassCastException cce) { failure(); } try { final O_I1 o = (O_I1) x; success(); } catch (final ClassCastException cce) { failure(); } try { final O_I2 o = (O_I2) x; success(); } catch (final ClassCastException cce) { failure(); } try { final O_J1 o = (O_J1) x; success(); } catch (final ClassCastException cce) { failure(); } try { final O_J2 o = (O_J2) x; success(); } catch (final ClassCastException cce) { failure(); } } private static void failure() {System.out.print("0");} private static void success() {System.out.print("1");} private static void testInstanceOf(final Object x) { io(A.class, (x instanceof A)); io(B.class, (x instanceof B)); io(C.class, (x instanceof C)); io(D.class, (x instanceof D)); io(E.class, (x instanceof E)); io(F.class, (x instanceof F)); io(G.class, (x instanceof G)); io(H.class, (x instanceof H)); io(I.class, (x instanceof I)); io(J.class, (x instanceof J)); io(P_B.class, (x instanceof P_B)); io(P_C1.class, (x instanceof P_C1)); io(P_C2.class, (x instanceof P_C2)); io(P_D.class, (x instanceof P_D)); io(SubClassInDifferentPackage.P_E1.class, (x instanceof SubClassInDifferentPackage.P_E1)); io(SubClassInDifferentPackage.P_E2.class, (x instanceof SubClassInDifferentPackage.P_E2)); io(SubClassInDifferentPackage.P_F.class, (x instanceof SubClassInDifferentPackage.P_F)); io(SubClassInDifferentPackage.P_G1.class, (x instanceof SubClassInDifferentPackage.P_G1)); io(SubClassInDifferentPackage.P_G2.class, (x instanceof SubClassInDifferentPackage.P_G2)); io(SubClassInDifferentPackage.P_H.class, (x instanceof SubClassInDifferentPackage.P_H)); io(SubClassInDifferentPackage.P_I1.class, (x instanceof SubClassInDifferentPackage.P_I1)); io(SubClassInDifferentPackage.P_I2.class, (x instanceof SubClassInDifferentPackage.P_I2)); io(SubClassInDifferentPackage.P_J1.class, (x instanceof SubClassInDifferentPackage.P_J1)); io(SubClassInDifferentPackage.P_J2.class, (x instanceof SubClassInDifferentPackage.P_J2)); io(SubClassInDifferentPackage.P_J3.class, (x instanceof SubClassInDifferentPackage.P_J3)); io(O_C1.class, (x instanceof O_C1)); io(O_C2.class, (x instanceof O_C2)); io(O_E.class, (x instanceof O_E)); io(O_G.class, (x instanceof O_G)); io(O_I1.class, (x instanceof O_I1)); io(O_I2.class, (x instanceof O_I2)); io(O_J1.class, (x instanceof O_J1)); io(O_J2.class, (x instanceof O_J2)); } @SuppressWarnings({"UnusedDeclaration"}) private static void io(final Class type, final boolean test) { System.out.print(test?"1":"0"); } } private static void testInnerClass() { class Inner { } Class enclosing = Inner.class.getEnclosingClass(); if (enclosing == null) System.out.println("Inner class has no enclosing class"); else if (enclosing != TestClassHierarchy.class) System.out.println("Bad enclosing class"); else System.out.println("Correct enclosing class"); enclosing = SubSubClass.class.getEnclosingClass(); if (enclosing == null) System.out.println("SubSubClass class has no enclosing class"); else if (enclosing != TestClassHierarchy.class) System.out.println("Bad enclosing class"); else System.out.println("Correct enclosing class"); } public static void main(String[] args) { new SubSubClass().runTests(); testInnerClass(); } }