package de.vksi.c4j.systemtest.staticmethods;
import static de.vksi.c4j.Condition.old;
import static de.vksi.c4j.Condition.postCondition;
import static de.vksi.c4j.Condition.preCondition;
import org.junit.Rule;
import org.junit.Test;
import de.vksi.c4j.ContractReference;
import de.vksi.c4j.systemtest.TransformerAwareRule;
public class ContractForInheritedStaticMethodSystemTest {
@Rule
public TransformerAwareRule transformerAwareRule = new TransformerAwareRule();
@Test
public void testStaticMethodPrePostAndOld() {
TargetClass.main("test");
}
@Test(expected = AssertionError.class)
public void testStaticMethodPreFailing() {
TargetClass.main();
}
@Test(expected = AssertionError.class)
public void testStaticMethodPostFailing() {
TargetClass.main("test1", "test2");
}
@SuppressWarnings("unused")
private static class SuperClass {
protected static int numCalls = 0;
public static void main(String... args) {
numCalls += args.length;
}
public static int staticMethodWithReturnValue() {
return 0;
}
}
@ContractReference(ContractClass.class)
private static class TargetClass extends SuperClass {
}
private static class ContractClass extends TargetClass {
public static void main(String... args) {
if (preCondition()) {
assert args.length > 0;
}
if (postCondition()) {
assert TargetClass.numCalls == old(TargetClass.numCalls) + 1;
}
}
}
}