package de.vksi.c4j.systemtest.old;
import static de.vksi.c4j.Condition.old;
import static de.vksi.c4j.Condition.postCondition;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import de.vksi.c4j.ContractReference;
import de.vksi.c4j.Pure;
import de.vksi.c4j.Target;
import de.vksi.c4j.systemtest.TransformerAwareRule;
public class OldInSeparateMethodSystemTest {
@Rule
public TransformerAwareRule transformerAware = new TransformerAwareRule();
private DummyClass dummy;
@Before
public void before() {
dummy = new DummyClass();
}
@Test
public void testOldInSeparateMethod() {
dummy.setValue(5);
dummy.checkInSeparateMethod();
}
@Test
public void testOldInNestedSeparateMethod() {
dummy.setValue(5);
dummy.checkInNestedSeparateMethod();
}
@ContractReference(DummyContract.class)
private static class DummyClass {
protected int value;
public void setValue(int value) {
this.value = value;
}
public void checkInNestedSeparateMethod() {
value++;
}
@Pure
public int getValue() {
return value;
}
public void checkInSeparateMethod() {
value++;
}
}
private static class DummyContract extends DummyClass {
@Target
private DummyClass target;
@Override
public void checkInSeparateMethod() {
if (postCondition()) {
assert target.getValue() == getOldValue() + 1;
}
}
@Override
public void checkInNestedSeparateMethod() {
if (postCondition()) {
assert target.getValue() == getNestedOldValue() + 1;
}
}
private int getNestedOldValue() {
return getOldValue();
}
private int getOldValue() {
return old(target.getValue());
}
}
}