package de.vksi.c4j.systemtest.cleanup; import static de.vksi.c4j.Condition.old; import static de.vksi.c4j.Condition.postCondition; import static de.vksi.c4j.Condition.preCondition; import static org.junit.Assert.assertEquals; import org.junit.Rule; import org.junit.Test; import de.vksi.c4j.ContractReference; import de.vksi.c4j.Target; import de.vksi.c4j.internal.runtime.OldCache; import de.vksi.c4j.systemtest.TransformerAwareRule; public class OldStoreCleanupSystemTest { @Rule public TransformerAwareRule transformerAwareRule = new TransformerAwareRule(); @Test public void testOldStoreCleanup() { new OldClass().method(3); assertEquals(0, OldCache.getOldStoreSize()); } @Test public void testOldStoreCleanupAfterFailure() { try { new OldClass().methodFailingContract(3); } catch (AssertionError e) { } assertEquals(0, OldCache.getOldStoreSize()); } @Test public void testOldStoreCleanupAfterFailureInMethod() { try { new OldClass().methodFailingSelf(3); } catch (RuntimeException e) { } assertEquals(0, OldCache.getOldStoreSize()); } @ContractReference(OldClassContract.class) private static class OldClass { protected int value; public void method(int incrementor) { value += incrementor; } public void methodFailingContract(int incrementor) { } public void methodFailingSelf(int incrementor) { throw new RuntimeException(); } } private static class OldClassContract extends OldClass { @Target private OldClass target; @Override public void method(int incrementor) { if (postCondition()) { int oldValue = old(target.value); assert target.value == (oldValue + incrementor); } } @Override public void methodFailingContract(int incrementor) { if (preCondition()) { assert false; } if (postCondition()) { assert target.value == old(target.value).intValue() + incrementor; } } @Override public void methodFailingSelf(int incrementor) { if (postCondition()) { assert target.value == old(target.value); } } } @Test public void testOldStoreCleanupWithMultipleCalls() { new TargetClass().method(); } @ContractReference(TargetClassContract.class) private static class TargetClass extends SuperClass { @Override public void method() { } } private static class TargetClassContract extends TargetClass { @Target private TargetClass target; @Override public void method() { if (postCondition()) { assert old(target.field) == 1; } } } @SuppressWarnings("unused") @ContractReference(SuperClassContract.class) private static class SuperClass { protected int field = 1; public void method() { } } private static class SuperClassContract extends SuperClass { @Target private SuperClass target; @Override public void method() { if (postCondition()) { assert old(target.field) == 1; } } } }