/* * 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 jikesRVM.core.bytecode; import java.util.ArrayList; import java.util.List; import org.junit.Test; import gov.nasa.jpf.annotation.Conditional; import gov.nasa.jpf.util.test.TestJPF; public class TestClassInitializer extends TestJPF { private static class TypeA { static { initOrder.add("TypeA.<clinit>()"); } static int f() { initOrder.add("TypeA.f()"); return 123; } static int i = f(); } private static class TypeB { static { initOrder.add("TypeB.<clinit>()"); } int f() { initOrder.add("TypeB.f()"); return 456; } } private static class TypeC { static { initOrder.add("TypeC.<clinit>()"); } } private static class TypeD extends TypeC { static { initOrder.add("TypeD.<clinit>()"); } static int i = 123; } static String[] JPF_CONFIGURATION = new String[] { "+nhandler.delegateUnhandledNative", "+search.class=.search.RandomSearch", "+choice=MapChoice" }; @Conditional static boolean a = true; @Test public void test() { if (verifyNoPropertyViolation(JPF_CONFIGURATION)) { if (a) { int i = TypeA.i; initOrder.add(i); // test initialization before first field // reference initOrder.add(new TypeB().f()); // test initialization before // first instance creation initOrder.add(TypeD.i); // test order of superclass // initialization assertEquals("TypeA.<clinit>()", initOrder.get(0).toString()); assertEquals("TypeA.f()", initOrder.get(1).toString()); assertEquals("123", initOrder.get(2).toString()); assertEquals("TypeB.<clinit>()", initOrder.get(3).toString()); assertEquals("TypeB.f()", initOrder.get(4).toString()); assertEquals("456", initOrder.get(5).toString()); assertEquals("TypeC.<clinit>()", initOrder.get(6).toString()); assertEquals("TypeD.<clinit>()", initOrder.get(7).toString()); assertEquals("123", initOrder.get(8).toString()); } } } static List<Object> initOrder = new ArrayList<>(9); }