/*
 *  This file is part of the Jikes RVM project (http://jikesrvm.org).
 *
 *  This file is licensed to You under the Common Public License (CPL);
 *  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/cpl1.0.php
 *
 *  See the COPYRIGHT.txt file distributed with this work for information
 *  regarding copyright ownership.
 */
package test.org.jikesrvm.basic.core.bytecode;

class TestClassInitializer {
  private static class TypeA {
    static { System.out.println("TypeA.<clinit>()"); }

    static int f() {
      System.out.println("TypeA.f()");
      return 123;
    }

    static int i = f();
  }

  private static class TypeB {
    static { System.out.println("TypeB.<clinit>()"); }

    int f() {
      System.out.println("TypeB.f()");
      return 456;
    }
  }

  private static class TypeC {
    static { System.out.println("TypeC.<clinit>()"); }
  }

  private static class TypeD extends TypeC {
    static { System.out.println("TypeD.<clinit>()"); }

    static int i = 123;
  }

  public static void main(final String[] args) {
    int i = TypeA.i;
    System.out.println(i);     // test initialization before first field reference
    System.out.println(new TypeB().f()); // test initialization before first instance creation
    System.out.println(TypeD.i);   // test order of superclass initialization
  }
}
