package de.vksi.c4j.systemtest.inheritance;
import static de.vksi.c4j.Condition.postCondition;
import org.apache.log4j.Level;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import de.vksi.c4j.ContractReference;
import de.vksi.c4j.systemtest.TransformerAwareRule;
public class SuperclassSystemTest {
@Rule
public TransformerAwareRule transformerAware = new TransformerAwareRule();
private DummyClass dummy;
@Before
public void before() {
dummy = new DummyClass();
}
@Test
public void testPreCondition() {
dummy.method(3);
}
@Test(expected = AssertionError.class)
public void testPostConditionFailsInSuperClass() {
dummy.method(0);
}
@Test(expected = AssertionError.class)
public void testPostConditionFailsInDummyClass() {
transformerAware.expectGlobalLog(Level.WARN, "could not find method method in affected class "
+ DummyClass.class.getName() + " for contract class " + DummyContract.class.getName()
+ " - inserting an empty method");
dummy.method(5);
}
@Test
public void testErrorWhenOverriddenTargetMethodIsFinal() {
transformerAware.expectGlobalLog(Level.WARN, "could not find method method in affected class "
+ FinalMethodOverriddenClass.class.getName() + " for contract class "
+ FinalMethodOverriddenContract.class.getName()
+ " and cannot insert a delegate, as the overridden method is final");
new FinalMethodOverriddenClass().method(5);
}
@Test
public void testNoWarningWhenContractMethodNotOverwritten() {
transformerAware.banGlobalLog(Level.WARN, "could not find method method in affected class "
+ NoWarningClass.class.getName() + " for contract class " + SuperContract.class.getName()
+ " - inserting an empty method");
new NoWarningClass().method(3);
}
@Test(expected = AssertionError.class)
public void testPreConditionFailsInSuperClassForDummyClassDeclaringMethod() {
new DummyClassDeclaringMethod().method(0);
}
@ContractReference(NoWarningClassContract.class)
private static class NoWarningClass extends SuperClass {
}
private static class NoWarningClassContract extends NoWarningClass {
}
private static class FinalSuperClass {
public final void method(int arg) {
}
}
@ContractReference(FinalMethodOverriddenContract.class)
private static class FinalMethodOverriddenClass extends FinalSuperClass {
}
@SuppressWarnings("unused")
private static class FinalMethodOverriddenContract {
public void method(int arg) {
if (postCondition()) {
assert arg < 5;
}
}
}
@ContractReference(DummyContract.class)
private static class DummyClass extends SuperClass {
}
private static class DummyContract extends DummyClass {
@Override
public void method(final int arg) {
if (postCondition()) {
assert arg < 5;
}
}
}
@ContractReference(DummyContractDeclaringMethod.class)
private static class DummyClassDeclaringMethod extends SuperClass {
@Override
public void method(int arg) {
}
}
private static class DummyContractDeclaringMethod extends DummyClassDeclaringMethod {
@Override
public void method(final int arg) {
if (postCondition()) {
assert arg < 5;
}
}
}
@ContractReference(SuperContract.class)
private static class SuperClass {
public void method(int arg) {
}
}
private static class SuperContract extends SuperClass {
@Override
public void method(final int arg) {
if (postCondition()) {
assert arg > 0;
}
}
}
}