package de.vksi.c4j.acceptancetest.s2;
import static de.vksi.c4j.Condition.postCondition;
import static de.vksi.c4j.Condition.unchanged;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import de.vksi.c4j.ContractReference;
import de.vksi.c4j.Target;
import de.vksi.c4j.acceptancetest.floatingwindow.Vector;
import de.vksi.c4j.acceptancetest.floatingwindow.WindowStyle;
import de.vksi.c4j.acceptancetest.point.Color;
import de.vksi.c4j.systemtest.TransformerAwareRule;
public class NNUnchangedS2Test {
@Rule
public TransformerAwareRule transformerAware = new TransformerAwareRule();
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test
public void testUnchangedViolation() {
thrown.expect(AssertionError.class);
thrown.expectMessage("illegal access on unchangeable object");
Window window = new Window(new Vector(0, 0));
window.setStyleColor(Color.BLUE);
}
@ContractReference(WindowContract.class)
public static class Window {
public Vector upperLeftCorner;
public WindowStyle style;
public Window(Vector upperLeftCorner) {
this.upperLeftCorner = upperLeftCorner;
style = new WindowStyle();
}
public void setStyleColor(Color color) {
style.color = color;
//postcondition violation: upperLeftCorner changed
upperLeftCorner.setX(5);
}
}
public static class WindowContract extends Window {
@Target
private Window target;
public WindowContract() {
super(null);
}
@Override
public void setStyleColor(Color color) {
if (postCondition()) {
assert target.style.color.equals(color) : "color set";
assert unchanged(target.upperLeftCorner) : "upperLeftCorner unchanged";
}
}
}
}