package de.vksi.c4j.systemtest.contractclassmagic;
import static de.vksi.c4j.Condition.ignored;
import static de.vksi.c4j.Condition.postCondition;
import static de.vksi.c4j.Condition.preCondition;
import static de.vksi.c4j.Condition.result;
import org.junit.Rule;
import org.junit.Test;
import de.vksi.c4j.ContractReference;
import de.vksi.c4j.error.UsageError;
import de.vksi.c4j.systemtest.TransformerAwareRule;
public class ContractMethodCallingOtherContractMethodSystemTest {
@Rule
public TransformerAwareRule transformerAwareRule = new TransformerAwareRule();
@Test(expected = UsageError.class)
public void testErrorWhenCallingOtherTargetMethod() {
new TargetClassCallingOtherTargetMethod().method();
}
@Test(expected = UsageError.class)
public void testErrorWhenCallingOverriddenContractMethod() {
new TargetClassCallingOverriddenContractMethod().method();
}
@Test
public void testSuccessWhenCallingOtherContractMethod() {
new TargetClassCallingOtherContractMethod().method();
}
@ContractReference(ContractClassCallingOtherTargetMethod.class)
private static class TargetClassCallingOtherTargetMethod {
public void method() {
}
public int getX() {
return 0;
}
}
private static class ContractClassCallingOtherTargetMethod extends TargetClassCallingOtherTargetMethod {
@Override
public void method() {
if (preCondition()) {
assert getX() == 0;
}
}
}
@ContractReference(ContractClassCallingOtherContractMethod.class)
private static class TargetClassCallingOtherContractMethod {
public void method() {
}
}
private static class ContractClassCallingOtherContractMethod extends TargetClassCallingOtherContractMethod {
@Override
public void method() {
if (preCondition()) {
assert otherContractMethod() == 0;
}
}
private int otherContractMethod() {
return 0;
}
}
@SuppressWarnings("unused")
@ContractReference(ContractClassCallingOverriddenContractMethod.class)
private static class TargetClassCallingOverriddenContractMethod {
public void method() {
}
public int otherMethod() {
return 0;
}
}
private static class ContractClassCallingOverriddenContractMethod extends
TargetClassCallingOverriddenContractMethod {
@Override
public void method() {
if (preCondition()) {
assert otherMethod() == 0;
}
}
@Override
public int otherMethod() {
if (postCondition()) {
int result = (Integer) result();
assert result == 0;
}
return (Integer) ignored();
}
}
}