package de.vksi.c4j.systemtest.contractclassmagic; import static de.vksi.c4j.Condition.preCondition; import org.junit.Rule; import org.junit.Test; import de.vksi.c4j.ConstructorContract; import de.vksi.c4j.ContractReference; import de.vksi.c4j.error.UsageError; import de.vksi.c4j.systemtest.TransformerAwareRule; public class ConstructorContractSystemTest { @Rule public TransformerAwareRule transformerAwareRule = new TransformerAwareRule(); @Test public void constructorContractSuccess() { new TargetClass(1); } @Test(expected = AssertionError.class) public void constructorContractFailure() { new TargetClass(0); } @Test(expected = UsageError.class) public void constructorContract_NoArgConstructorMissing() throws Exception { new TargetForContractClassMissingNoArgConstructor().method(1); } @Test(expected = UsageError.class) public void constructorContract_NonStaticNestedContractClass() throws Exception { new TargetForNonStaticNestedContractClass().method(1); } @ContractReference(ContractClass.class) private static class TargetClass { public TargetClass(int value) { } } @SuppressWarnings("unused") private static class ContractClass { @ConstructorContract public void construct(int value) { if (preCondition()) { assert value > 0; } } } @ContractReference(ContractClassMissingNoArgConstructor.class) private static class TargetForContractClassMissingNoArgConstructor { public void method(int arg) { } } @SuppressWarnings("unused") private static class ContractClassMissingNoArgConstructor extends TargetForContractClassMissingNoArgConstructor { public ContractClassMissingNoArgConstructor(int arg) { } @Override public void method(int arg) { if (preCondition()) { assert arg > 0; } } } @ContractReference(NonStaticNestedContractClass.class) private static class TargetForNonStaticNestedContractClass { public void method(int arg) { } } private class NonStaticNestedContractClass extends TargetForNonStaticNestedContractClass { @Override public void method(int arg) { if (preCondition()) { assert arg > 0; } } } }