package de.vksi.c4j.systemtest.contractclassmagic;
import static de.vksi.c4j.Condition.preCondition;
import org.junit.Rule;
import org.junit.Test;
import de.vksi.c4j.ContractReference;
import de.vksi.c4j.Pure;
import de.vksi.c4j.systemtest.TransformerAwareRule;
public class StaticMemberAccessSystemTest {
@Rule
public TransformerAwareRule transformerAware = new TransformerAwareRule();
@Test
public void testStaticFieldAccessFromContractClass() throws Exception {
new TargetClass().method();
}
@ContractReference(ContractClass.class)
private static class TargetClass {
public static final Boolean STATIC_VAR = Boolean.TRUE;
public void method() {
}
}
private static class ContractClass extends TargetClass {
@Override
public void method() {
if (preCondition()) {
assert Boolean.TRUE.equals(STATIC_VAR);
}
}
}
@Test
public void testOverriddenStaticFieldAccessFromContractClass() throws Exception {
new TargetClassOverridden().method();
}
@SuppressWarnings("unused")
@ContractReference(ContractClassOverridden.class)
private static class TargetClassOverridden {
public static final Boolean STATIC_VAR = Boolean.TRUE;
public void method() {
}
}
private static class ContractClassOverridden extends TargetClassOverridden {
private static final Boolean STATIC_VAR = Boolean.FALSE;
@Override
public void method() {
if (preCondition()) {
assert Boolean.FALSE.equals(STATIC_VAR);
}
}
}
@Test
public void testStaticMethodAccessFromContractClass() throws Exception {
new TargetClassMethod().method();
}
@ContractReference(ContractClassMethod.class)
private static class TargetClassMethod {
public void method() {
}
@Pure
public static String staticMethod() {
return "static value";
}
}
private static class ContractClassMethod extends TargetClassMethod {
@Override
public void method() {
if (preCondition()) {
assert "static value".equals(staticMethod());
}
}
}
}