package de.vksi.c4j.systemtest.config.externalcontract; import static de.vksi.c4j.Condition.ignored; import static de.vksi.c4j.Condition.postCondition; import static de.vksi.c4j.Condition.result; import org.junit.Rule; import org.junit.Test; import de.vksi.c4j.Contract; import de.vksi.c4j.Target; import de.vksi.c4j.systemtest.TransformerAwareRule; public class ObjectContractSystemTest { @Rule public TransformerAwareRule transformerAwareRule = new TransformerAwareRule(); @Test(expected = AssertionError.class) public void testHashCodeConsistency() { TargetClassViolatingHashCodeConsistency target1 = new TargetClassViolatingHashCodeConsistency(1); TargetClassViolatingHashCodeConsistency target2 = new TargetClassViolatingHashCodeConsistency(1); target1.equals(target2); } private static class TargetClassViolatingHashCodeConsistency { private int x; public TargetClassViolatingHashCodeConsistency(int x) { this.x = x; } @Override public boolean equals(Object obj) { if (!getClass().equals(obj.getClass())) { return false; } TargetClassViolatingHashCodeConsistency other = (TargetClassViolatingHashCodeConsistency) obj; return x == other.x; } } @SuppressWarnings("unused") @Contract(forTarget = Object.class) private static class ObjectContract { @Target private Object target; @Override public boolean equals(Object obj) { if (postCondition()) { Boolean result = result(); if (result) { assert target.hashCode() == obj.hashCode(); } } return (Boolean) ignored(); } } }