package de.vksi.c4j.systemtest.pure;
import org.junit.Rule;
import org.junit.Test;
import de.vksi.c4j.AllowPureAccess;
import de.vksi.c4j.Pure;
import de.vksi.c4j.systemtest.TransformerAwareRule;
public class PureCallingStaticUnpureInNestedMethodSystemTest {
@Rule
public TransformerAwareRule transformerAwareRule = new TransformerAwareRule();
@Test(expected = AssertionError.class)
public void testCallingStaticUnpureInNestedConstructor() {
new TargetClass().methodCallingStaticUnpureInNestedConstructor();
}
@Test(expected = AssertionError.class)
public void testCallingStaticUnpureInNestedMethodModifyingOwnStaticField() {
new TargetClass().methodCallingStaticUnpureInNestedMethodModifyingOwnStaticField();
}
@Test
public void testCallingStaticUnpureInNestedMethodModifyingAccessibleField() {
new TargetClass().methodCallingStaticUnpureInNestedMethodModifyingAccessibleStaticField();
}
@SuppressWarnings("unused")
private static class TargetClass {
public static int value;
@Pure
public void methodCallingStaticUnpureInNestedConstructor() {
new UnpureClass();
}
@Pure
public void methodCallingStaticUnpureInNestedMethodModifyingOwnStaticField() {
new OtherClass().methodModifyingOwnStaticField();
}
@Pure
public void methodCallingStaticUnpureInNestedMethodModifyingAccessibleStaticField() {
new AllowingClass().methodModifyingAccessibleStaticField();
}
}
private static class UnpureClass {
public UnpureClass() {
TargetClass.value = 3;
}
}
@SuppressWarnings("unused")
private static class OtherClass {
protected static int value;
public void methodModifyingOwnStaticField() {
OtherClass.value = 3;
}
}
@SuppressWarnings("unused")
private static class AllowingClass {
@AllowPureAccess
protected static int value;
public void methodModifyingAccessibleStaticField() {
AllowingClass.value = 3;
}
}
}