package de.vksi.c4j.systemtest.pure; import static de.vksi.c4j.Condition.preCondition; import org.junit.Rule; import org.junit.Test; import de.vksi.c4j.AllowPureAccess; import de.vksi.c4j.ContractReference; import de.vksi.c4j.Pure; import de.vksi.c4j.systemtest.MutableString; import de.vksi.c4j.systemtest.TransformerAwareRule; public class AllowPureAccessOnObjectSystemTest { @Rule public TransformerAwareRule transformerAwareRule = new TransformerAwareRule(); @Test public void testAllowPureAccessFromTargetClass() { new TargetClass().modifyValue(); } @Test public void testAllowPureAccessFromContractClass() { new TargetClass().modifyValueInContract(); } @Test public void testAllowPureReassignmentFromTargetClass() { new TargetClass().reassignValue(); } @Test public void testAllowPureReassignmentFromContractClass() { new TargetClass().reassignValueInContract(); } @ContractReference(TargetClassContract.class) private static class TargetClass { @AllowPureAccess private MutableString value = new MutableString(); @AllowPureAccess public static MutableString staticValue = new MutableString(); @Pure public void modifyValue() { value.setValue("new value"); } @Pure public void modifyValueInContract() { } @Pure public void reassignValue() { value = new MutableString("new value"); } @Pure public void reassignValueInContract() { } } private static class TargetClassContract extends TargetClass { @Override public void modifyValueInContract() { if (preCondition()) { TargetClass.staticValue.setValue("contract value"); } } @Override public void reassignValueInContract() { if (preCondition()) { TargetClass.staticValue = new MutableString("contract value"); } } } }