package de.vksi.c4j.systemtest.pure; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import de.vksi.c4j.Pure; import de.vksi.c4j.systemtest.TransformerAwareRule; public class PureOnlyForOwnMethodsFieldsAndParametersSystemTest { @Rule public TransformerAwareRule transformerAwareRule = new TransformerAwareRule(); private TargetClass target; @Before public void before() { target = new TargetClass(); } @Test public void testPure() { target.pureMethod("paramValue"); } @Test(expected = AssertionError.class) public void testPureCallingUnpureOnFieldAfterSettingField() { target.pureMethodCallingUnpureOnFieldAfterSettingField(); } @Test(expected = AssertionError.class) public void testPureSettingFieldTwice() { target.pureMethodSettingFieldTwice(); } @Test(expected = AssertionError.class) public void testPureCallingUnpureOnField() { target.pureMethodCallingUnpureOnField(); } @Test(expected = AssertionError.class) public void testPureCallingUnpureOnSelf() { target.pureMethodCallingUnpureOnSelf(); } @Test(expected = AssertionError.class) public void testPureCallingUnpureOnParameter() { target.pureMethodCallingUnpureOnParameter(new OtherClass()); } @Test(expected = AssertionError.class) public void testPureCallingStaticUnpure() { target.pureMethodCallingStaticUnpure(); } @Test(expected = AssertionError.class) public void testPureSettingStaticField() { target.pureMethodSettingStaticField(); } @Test(expected = NullPointerException.class) public void testPureCallingUnpureOnNull() { new NullClass().pureMethodCallingNullField(); } private static class TargetClass { private String field = "fieldValue"; private OtherClass otherTypeField = new OtherClass(); @Pure public void pureMethod(String param) { StringBuilder builder = new StringBuilder(); builder.append(field); builder.append(" - "); builder.append(param); } @Pure public void pureMethodCallingUnpureOnFieldAfterSettingField() { otherTypeField = new OtherClass(); otherTypeField.unpureMethod(); } @Pure public void pureMethodSettingFieldTwice() { otherTypeField = new OtherClass(); otherTypeField = new OtherClass(); } @Pure public void pureMethodCallingUnpureOnField() { otherTypeField.unpureMethod(); } @Pure public void pureMethodCallingUnpureOnSelf() { unpureMethod(); } @Pure public void pureMethodCallingUnpureOnParameter(OtherClass param) { param.unpureMethod(); } @Pure public void pureMethodCallingStaticUnpure() { OtherClass.staticUnpureMethod(); } @Pure public void pureMethodSettingStaticField() { OtherClass.staticField = 3; } public void unpureMethod() { } } @SuppressWarnings("unused") private static class OtherClass { public static int staticField; public static void staticUnpureMethod() { } public void unpureMethod() { } } private static class NullClass { private OtherClass nullField; @Pure public void pureMethodCallingNullField() { nullField.unpureMethod(); } } }