package de.vksi.c4j.systemtest.pure; import org.junit.Rule; import org.junit.Test; import de.vksi.c4j.Pure; import de.vksi.c4j.systemtest.TransformerAwareRule; public class PureInheritanceSystemTest { @Rule public TransformerAwareRule transformerAware = new TransformerAwareRule(); @Test public void testPureFromSuperClass() { new PureSubClass().pureMethod(); } @Test(expected = AssertionError.class) public void testPureFromSuperClassButUnpure() { new UnpureSubClass().pureMethod(); } @Test public void testPureFromInterface() { new ClassHavingPureMethod().pureMethod(); } @Test(expected = AssertionError.class) public void testPureFromInterfaceButUnpure() { new ClassHavingUnpureMethod().pureMethod(); } @Test public void testPureFromIndirectInterface() { new ClassHavingIndirectPureMethod().pureMethod(); } @Test(expected = AssertionError.class) public void testPureFromIndirectInterfaceButUnpure() { new ClassHavingIndirectUnpureMethod().pureMethod(); } private static class PureSubClass extends SuperClass { @Override public void pureMethod() { } } @SuppressWarnings("unused") private static class UnpureSubClass extends SuperClass { protected String field; @Override public void pureMethod() { field = "invalid"; } } @SuppressWarnings("unused") private static class SuperClass { @Pure public void pureMethod() { } } private static class ClassHavingPureMethod implements HasPureMethod { @Override public void pureMethod() { } } private static class ClassHavingUnpureMethod implements HasPureMethod { @Override public void pureMethod() { unpureMethod(); } public void unpureMethod() { } } public interface HasPureMethod { @Pure void pureMethod(); } private static class SuperClassWithInterface implements HasPureMethod { @Override public void pureMethod() { } } private static class ClassHavingIndirectPureMethod extends SuperClassWithInterface { @Override public void pureMethod() { } } private static class ClassHavingIndirectUnpureMethod extends SuperClassWithInterface { private ClassHavingUnpureMethod otherObj = new ClassHavingUnpureMethod(); @Override public void pureMethod() { otherObj.unpureMethod(); } } }