package de.vksi.c4j.systemtest.cleanup; import static de.vksi.c4j.Condition.postCondition; import static de.vksi.c4j.Condition.preCondition; import static de.vksi.c4j.Condition.unchanged; import static org.junit.Assert.assertTrue; 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.internal.runtime.PureEvaluator; import de.vksi.c4j.systemtest.TransformerAwareRule; public class UnchangedCleanupSystemTest { @Rule public TransformerAwareRule transformerAwareRule = new TransformerAwareRule(); @Test public void testUnchangedCleanup() { new TargetClass().method(1); assertTrue(PureEvaluator.isUnpureCacheEmpty()); } @Test public void testUnchangedCleanupAfterPreConditionFails() { try { new TargetClass().method(0); } catch (AssertionError e) { // expected } assertTrue(PureEvaluator.isUnpureCacheEmpty()); } @ContractReference(ContractClass.class) private static class TargetClass { public void method(int arg) { } @Pure public String getName() { return "constantString"; } } private static class ContractClass extends TargetClass { @Target private TargetClass target; @Override public void method(int arg) { if (preCondition()) { assert arg > 0; } if (postCondition()) { assert unchanged(target.getName()); } } } }