package de.vksi.c4j.systemtest.staticmethods; import static de.vksi.c4j.Condition.postCondition; import static de.vksi.c4j.Condition.preCondition; import static org.junit.Assert.assertEquals; import org.junit.Rule; import org.junit.Test; import de.vksi.c4j.ConstructorContract; import de.vksi.c4j.ContractReference; import de.vksi.c4j.systemtest.TransformerAwareRule; public class ContractForStaticInitializerSystemTest { @Rule public TransformerAwareRule transformerAwareRule = new TransformerAwareRule(); @Test public void testStaticInitializer() { TargetClass.main(); } @Test(expected = AssertionError.class) public void testStaticInitializerPreFailing() { TargetClassFailingPre.main(); } @Test(expected = AssertionError.class) public void testStaticInitializerPostFailing() { TargetClassFailingPost.main(); } @Test public void testStaticInitializerOfContractClassExecutedWhenTargetClassDoesntHaveOne() { TargetClassWithoutStaticInitializer.main(); assertEquals(1, ContractClassWithStaticInitializer.STATIC_FIELD); } @Test public void testStaticInitializerOfTargetClassWhenContractClassDoesntHaveOne() { TargetClassWithStaticInitializer.main(); } @ContractReference(ContractClass.class) private static class TargetClass { private static int numCalls = 0; static { numCalls = 1; } public static void main(String... args) { } } private static class ContractClass extends TargetClass { static { if (preCondition()) { assert TargetClass.numCalls == 0; } if (postCondition()) { assert TargetClass.numCalls == 1; } } } @ContractReference(ContractClassFailingPre.class) private static class TargetClassFailingPre { private static int numCalls = 0; static { numCalls = 1; } public static void main(String... args) { } } @SuppressWarnings("unused") private static class ContractClassFailingPre extends TargetClassFailingPre { @ConstructorContract public static void staticInitializer() { if (preCondition()) { assert TargetClassFailingPre.numCalls == -1; } if (postCondition()) { assert TargetClassFailingPre.numCalls == 1; } } } @ContractReference(ContractClassFailingPost.class) private static class TargetClassFailingPost { private static int numCalls = 0; static { numCalls = 1; } public static void main(String... args) { } } @SuppressWarnings("unused") private static class ContractClassFailingPost extends TargetClassFailingPost { @ConstructorContract public static void staticInitializer() { if (preCondition()) { assert TargetClassFailingPost.numCalls == 0; } if (postCondition()) { assert TargetClassFailingPost.numCalls == 2; } } } @ContractReference(ContractClassWithStaticInitializer.class) private static class TargetClassWithoutStaticInitializer { public static void main(String... args) { } } private static class ContractClassWithStaticInitializer extends TargetClassWithoutStaticInitializer { public static int STATIC_FIELD; static { STATIC_FIELD = 1; } public static void main(String... args) { if (preCondition()) { assert args.length == 0; } } } @SuppressWarnings("unused") @ContractReference(ContractClassWithoutStaticInitializer.class) private static class TargetClassWithStaticInitializer { public static int STATIC_FIELD; static { STATIC_FIELD = 1; } public static void main(String... args) { } } private static class ContractClassWithoutStaticInitializer extends TargetClassWithStaticInitializer { } }