package de.vksi.c4j.systemtest.unchanged; import static de.vksi.c4j.Condition.postCondition; import static de.vksi.c4j.Condition.unchanged; 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 UnchangedForPrimitivesSystemTest { @Rule public TransformerAwareRule transformerAware = new TransformerAwareRule(); private TargetClass target; @Before public void before() { target = new TargetClass(); } @Test public void testUnchanged() { target.setHour(3); } @Test(expected = AssertionError.class) public void testUnchangedWrongForField() { target.setHourWrongForField(3); } @Test(expected = AssertionError.class) public void testUnchangedWrongForMethod() { target.setHourWrongForMethod(3); } @SuppressWarnings("unused") @ContractReference(ContractClass.class) private static class TargetClass { protected int hour; protected int minute; private int minuteForGetter; public int getHour() { return hour; } public void setHour(int hour) { this.hour = hour; } public void setHourWrongForField(int hour) { this.minute = hour; } public void setHourWrongForMethod(int hour) { this.minuteForGetter = hour; } @Pure public int getMinute() { return minuteForGetter; } } private static class ContractClass extends TargetClass { @Target private TargetClass target; @Override public void setHour(int hour) { if (postCondition()) { assert unchanged(target.minute); assert unchanged(target.getMinute()); } } @Override public void setHourWrongForField(int hour) { if (postCondition()) { assert unchanged(target.minute); } } @Override public void setHourWrongForMethod(int hour) { if (postCondition()) { assert unchanged(target.getMinute()); } } } }