package de.vksi.c4j.systemtest.contractclassmagic;
import static de.vksi.c4j.Condition.preCondition;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import de.vksi.c4j.AllowPureAccess;
import de.vksi.c4j.ConstructorContract;
import de.vksi.c4j.ContractReference;
import de.vksi.c4j.systemtest.TransformerAwareRule;
public class ConstructorInInnerClassesSystemTest {
@Rule
public TransformerAwareRule transformerAware = new TransformerAwareRule();
@AllowPureAccess
private static int expectedNumCalls;
@Before
public void before() {
expectedNumCalls = 0;
}
@Test
public void testConstructorInInnerClass() {
new InnerClass();
assertEquals(1, expectedNumCalls);
}
@Test
public void testConstructorInStaticInnerClass() {
new StaticInnerClass();
assertEquals(1, expectedNumCalls);
}
@Test
public void testConstructorInAnonymousClass() {
new SuperClass() {
};
assertEquals(1, expectedNumCalls);
}
@Test
public void testConstructorInLocalClass() {
class LocalClass extends SuperClass {
}
new LocalClass();
assertEquals(1, expectedNumCalls);
}
@Test
public void testConstructorWithParameter() {
new InnerClassWithParameter(3);
assertEquals(1, expectedNumCalls);
}
public class InnerClassWithParameter extends SuperClassWithParameter {
public InnerClassWithParameter(int value) {
super(value);
}
}
@ContractReference(SuperClassWithParameterContract.class)
private static class SuperClassWithParameter {
public SuperClassWithParameter(int value) {
}
}
@SuppressWarnings("unused")
private static class SuperClassWithParameterContract extends SuperClassWithParameter {
public SuperClassWithParameterContract() {
super(0);
}
@ConstructorContract
public void constructor(int value) {
if (preCondition()) {
expectedNumCalls++;
}
}
}
private static class StaticInnerClass extends SuperClass {
}
private class InnerClass extends SuperClass {
}
@ContractReference(SuperClassContract.class)
private static class SuperClass {
public SuperClass() {
}
}
@SuppressWarnings("unused")
private static class SuperClassContract extends SuperClass {
@ConstructorContract
public void constructor() {
if (preCondition()) {
expectedNumCalls++;
}
}
}
}