package de.vksi.c4j.systemtest.contractclassmagic; 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.Target; import de.vksi.c4j.systemtest.TransformerAwareRule; public class ContractClassAccessingTargetClassFieldsSystemTest { @Rule public TransformerAwareRule transformerAwareRule = new TransformerAwareRule(); @Test public void testContractClassAccessingTargetClassField() { new TargetClass().method(3, 3); } @ContractReference(ContractClass.class) private static class TargetClass { protected int value; public void method(int value, int param) { this.value = value; } } private static class ContractClass extends TargetClass { @Target private TargetClass target; @Override public void method(int value, int param) { if (postCondition()) { assert target.value >= param; } } } @Test public void testContractClassAccessingOverriddenTargetClassField() { new TargetClassOverridden().method(); } @SuppressWarnings("unused") @ContractReference(ContractClassOverridden.class) private static class TargetClassOverridden { protected Boolean value = Boolean.TRUE; public void method() { } } private static class ContractClassOverridden extends TargetClassOverridden { private Boolean value = Boolean.FALSE; @Override public void method() { if (preCondition()) { assert !value.booleanValue(); } } } }