package de.vksi.c4j.systemtest.pure;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import de.vksi.c4j.ContractReference;
import de.vksi.c4j.PureTarget;
import de.vksi.c4j.systemtest.TransformerAwareRule;
public class PureTargetSystemTest {
@Rule
public TransformerAwareRule transformerAware = new TransformerAwareRule();
private TargetClass target;
@Before
public void before() {
target = new TargetClass();
}
@Test
public void testPureMethod() {
target.pureMethod();
}
@Test
public void testPureMethodReadingField() {
target.pureMethodReadingField();
}
@Test(expected = AssertionError.class)
public void testPureMethodWritingField() {
target.unpureMethodWritingField();
}
@Test
public void testPureMethodCallingOtherPureMethod() {
target.pureMethodCallingOtherPureMethod();
}
@Test(expected = AssertionError.class)
public void testUnpureMethodCallingOtherUnpureMethod() {
target.unpureMethodCallingOtherUnpureMethod();
}
@Test
public void testPureMethodCallingPureMethodInOtherClass() {
target.pureMethodCallingPureMethodInOtherClass(new OtherClass());
}
@Test(expected = AssertionError.class)
public void testUnpureMethodCallingUnpureMethodInOtherClass() {
target.unpureMethodCallingUnpureMethodInOtherClass(new OtherClass());
}
@ContractReference(ContractClass.class)
private static class TargetClass {
private String field = "sample";
public void pureMethod() {
}
public String pureMethodReadingField() {
return field;
}
public void unpureMethodWritingField() {
field = "illegal";
}
public void pureMethodCallingOtherPureMethod() {
otherPureMethod();
}
protected void otherPureMethod() {
}
public void unpureMethodCallingOtherUnpureMethod() {
otherUnpureMethod();
}
private void otherUnpureMethod() {
}
public void pureMethodCallingPureMethodInOtherClass(OtherClass other) {
other.pureMethodInOtherClass();
}
public void unpureMethodCallingUnpureMethodInOtherClass(OtherClass other) {
other.unpureMethodInOtherClass();
}
}
private static class ContractClass extends TargetClass {
@Override
@PureTarget
public void pureMethod() {
}
@Override
@PureTarget
public String pureMethodReadingField() {
return null;
}
@Override
@PureTarget
public void unpureMethodWritingField() {
}
@Override
@PureTarget
public void pureMethodCallingOtherPureMethod() {
}
@Override
@PureTarget
protected void otherPureMethod() {
}
@Override
@PureTarget
public void unpureMethodCallingOtherUnpureMethod() {
}
@Override
@PureTarget
public void pureMethodCallingPureMethodInOtherClass(OtherClass other) {
}
@Override
@PureTarget
public void unpureMethodCallingUnpureMethodInOtherClass(OtherClass other) {
}
}
@ContractReference(OtherClassContract.class)
private static class OtherClass {
public void pureMethodInOtherClass() {
}
public void unpureMethodInOtherClass() {
}
}
private static class OtherClassContract extends OtherClass {
@Override
@PureTarget
public void pureMethodInOtherClass() {
}
}
}