package de.vksi.c4j.systemtest.contractclassmagic; import static de.vksi.c4j.Condition.ignored; 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.Pure; import de.vksi.c4j.Target; import de.vksi.c4j.systemtest.TransformerAwareRule; public class MethodCallSystemTest { @Rule public TransformerAwareRule transformerAware = new TransformerAwareRule(); private TargetClass target; @Before public void before() { target = new TargetClass(); } @Test public void testPreConditionWithMethodAccess() { target.setValue(5); target.methodContractHasMethodAccess(); } @Test public void testPreConditionWithMethodAccessAndMethodAlsoInContract() { target.setValue(5); target.methodContractHasMethodAccessAndMethodAlsoInContract(); } @Test public void testPreConditionWithMethodAccessOnContractOnly() { target.setValue(5); target.methodContractHasMethodAccessOnContractOnly(); } @ContractReference(ContractClass.class) private static class TargetClass { protected int value; public void setValue(int value) { this.value = value; } @Pure protected int getValue() { return value; } @Pure protected int getValueAlsoInContract() { return value; } public void methodContractHasMethodAccess() { } public void methodContractHasMethodAccessAndMethodAlsoInContract() { } public void methodContractHasMethodAccessOnContractOnly() { } } private static class ContractClass extends TargetClass { @Target private TargetClass target; @Override public void methodContractHasMethodAccess() { if (preCondition()) { assert target.getValue() == 5; } } @Override public void methodContractHasMethodAccessAndMethodAlsoInContract() { if (preCondition()) { assert target.getValueAlsoInContract() == 5; } } @Override protected int getValueAlsoInContract() { return (Integer) ignored(); } @Override public void methodContractHasMethodAccessOnContractOnly() { if (preCondition()) { assert target.getValue() == getFive(); } } public int getFive() { return 5; } } }