package de.vksi.c4j.systemtest.postcondition;
import static de.vksi.c4j.Condition.ignored;
import static de.vksi.c4j.Condition.postCondition;
import static de.vksi.c4j.Condition.result;
import org.junit.Rule;
import org.junit.Test;
import de.vksi.c4j.ContractReference;
import de.vksi.c4j.systemtest.TransformerAwareRule;
public class PostConditionSystemTest {
@Rule
public TransformerAwareRule transformerAware = new TransformerAwareRule();
@Test
public void testPostCondition() {
new DummyClass().setStaticValue(5);
}
@Test(expected = AssertionError.class)
public void testPostConditionFails() {
new DummyClass().setStaticValue(4);
}
@Test
public void testPostNoArgs() {
new DummyClass().noArgs();
}
@Test
public void testPostConditionWithReturnValue() {
new DummyClass().returnValue(5);
}
@Test(expected = AssertionError.class)
public void testPostConditionWithReturnValueFails() {
new DummyClass().returnValue(4);
}
@Test
public void testPostConditionWithReturnValueAndVoid() {
new DummyClass().returnValueVoid();
}
@ContractReference(DummyContract.class)
private static class DummyClass {
protected static int staticValue;
public void setStaticValue(int value) {
DummyClass.staticValue = value;
}
public int noArgs() {
DummyClass.staticValue = 5;
return 0;
}
public int returnValue(int value) {
return value;
}
public void returnValueVoid() {
}
}
private static class DummyContract extends DummyClass {
@Override
public void setStaticValue(int value) {
if (postCondition()) {
assert DummyClass.staticValue == 5;
}
}
@Override
public int noArgs() {
if (postCondition()) {
assert DummyClass.staticValue == 5;
}
return (Integer) ignored();
}
@Override
public int returnValue(int value) {
if (postCondition()) {
assert result(int.class) == 5;
}
return (Integer) ignored();
}
@Override
public void returnValueVoid() {
if (postCondition()) {
assert result() == null;
}
}
}
}