package de.vksi.c4j.systemtest.contractclassmagic;
import static de.vksi.c4j.Condition.preCondition;
import org.junit.Before;
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 FieldAccessSystemTest {
@Rule
public TransformerAwareRule transformerAware = new TransformerAwareRule();
private DummyClass dummy;
@Before
public void before() {
dummy = new DummyClass();
}
@Test
public void testPreConditionWithFieldAccess() {
dummy.setValue(5);
dummy.methodContractHasFieldAccess();
}
@ContractReference(DummyContract.class)
private static class DummyClass {
protected int value;
public void methodContractHasFieldAccess() {
}
public void setValue(int value) {
this.value = value;
}
}
private static class DummyContract extends DummyClass {
@Target
private DummyClass target;
@Override
public void methodContractHasFieldAccess() {
if (preCondition()) {
assert target.value == 5;
}
}
}
@Test
public void testFieldAccessWithSameFieldInSuperClass() {
new TargetClass().method();
}
@ContractReference(TargetClassContract.class)
private static class TargetClass extends SuperClass {
@Override
public void method() {
}
}
private static class TargetClassContract extends TargetClass {
@Target
private TargetClass target;
@Override
public void method() {
if (preCondition()) {
assert target.field == 0;
}
}
}
@SuppressWarnings("unused")
@ContractReference(SuperClassContract.class)
private static class SuperClass {
protected int field;
public void method() {
}
}
private static class SuperClassContract extends SuperClass {
@Target
private SuperClass target;
@Override
public void method() {
if (preCondition()) {
assert target.field == 0;
}
}
}
}