package de.vksi.c4j.systemtest.config.externalcontract; import static de.vksi.c4j.Condition.preCondition; import org.junit.Rule; import org.junit.Test; import de.vksi.c4j.Contract; import de.vksi.c4j.ContractReference; import de.vksi.c4j.systemtest.TransformerAwareRule; public class ExternalContractSystemTest { @Rule public TransformerAwareRule transformerAwareRule = new TransformerAwareRule(); @Test(expected = AssertionError.class) public void testExternalContract() { new TargetClass().method(0); } private static class TargetClass { public void method(int arg) { } } @SuppressWarnings("unused") @Contract private static class ContractClass extends TargetClass { @Override public void method(int arg) { if (preCondition()) { assert arg > 0; } } } @Test public void testLocalContractPreferred() { new TargetClassWithLocalAndExternalContract().method(1); } @Test(expected = AssertionError.class) public void testLocalContractPreferredFailing() { new TargetClassWithLocalAndExternalContract().method(0); } @ContractReference(LocalContract.class) private static class TargetClassWithLocalAndExternalContract { public void method(int arg) { } } private static class LocalContract extends TargetClassWithLocalAndExternalContract { @Override public void method(int arg) { if (preCondition()) { assert arg > 0; } } } @SuppressWarnings("unused") private static class ExternalContract extends TargetClassWithLocalAndExternalContract { @Override public void method(int arg) { if (preCondition()) { assert arg > 1; } } } }