package de.vksi.c4j.systemtest.unchanged;
import static de.vksi.c4j.Condition.postCondition;
import static de.vksi.c4j.Condition.unchanged;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import de.vksi.c4j.ContractReference;
import de.vksi.c4j.Pure;
import de.vksi.c4j.Target;
import de.vksi.c4j.systemtest.MutableString;
import de.vksi.c4j.systemtest.TransformerAwareRule;
public class UnchangedForObjectsSystemTest {
@Rule
public TransformerAwareRule transformerAware = new TransformerAwareRule();
private TargetClass target;
@Before
public void before() {
target = new TargetClass();
}
@Test
public void testFieldRemainsUnchanged() {
target.fieldRemainsUnchanged();
}
@Test
public void testMethodRemainsUnchanged() {
target.methodRemainsUnchanged();
}
@Test
public void testParameterRemainsUnchanged() {
target.parameterRemainsUnchanged(new MutableString());
}
@Test(expected = AssertionError.class)
public void testFieldIsChanged() {
target.fieldIsChanged();
}
@Test(expected = AssertionError.class)
public void testMethodIsChanged() {
target.methodIsChanged();
}
@Test(expected = AssertionError.class)
public void testParameterIsChanged() {
target.parameterIsChanged(new MutableString());
}
@Test(expected = AssertionError.class)
public void testParameter5IsChanged() {
target.parameter5IsChanged(0, 0, 0, 0, new MutableString());
}
@Test(expected = AssertionError.class)
public void testParameterArrayIsChanged() {
target.parameterArrayIsChanged(new MutableString[] { new MutableString() });
}
@Test(expected = AssertionError.class)
public void testParameterArrayIsReplaced() {
target.parameterArrayIsReplaced(new MutableString[] { new MutableString("original") });
}
@Test(expected = AssertionError.class)
public void testFieldIsReplaced() {
target.fieldIsReplaced();
}
@Test(expected = AssertionError.class)
public void testMethodIsReplaced() {
target.methodIsReplaced();
}
@Test(expected = AssertionError.class)
public void testParameterIsReplaced() {
target.parameterIsReplaced(new MutableString());
}
@ContractReference(ContractClass.class)
private static class TargetClass {
protected MutableString field = new MutableString();
@Pure
public MutableString method() {
return field;
}
public void fieldRemainsUnchanged() {
}
public void methodRemainsUnchanged() {
}
public void parameterRemainsUnchanged(MutableString param) {
}
public void fieldIsChanged() {
field.setValue("abc");
}
public void methodIsChanged() {
field.setValue("abc");
}
public void parameterIsChanged(MutableString param) {
param.setValue("abc");
}
public void parameter5IsChanged(int a, int b, int c, int d, MutableString param) {
param.setValue("abc");
}
public void parameterArrayIsChanged(MutableString[] param) {
param[0].setValue("abc");
}
public void parameterArrayIsReplaced(MutableString[] param) {
param[0] = new MutableString("replacement");
}
public void fieldIsReplaced() {
field = new MutableString();
}
public void methodIsReplaced() {
field = new MutableString();
}
public void parameterIsReplaced(MutableString param) {
param = new MutableString();
}
}
private static class ContractClass extends TargetClass {
@Target
private TargetClass target;
@Override
public void fieldRemainsUnchanged() {
if (postCondition()) {
assert unchanged(target.field);
}
}
@Override
public void methodRemainsUnchanged() {
if (postCondition()) {
assert unchanged(target.method());
}
}
@Override
public void parameterRemainsUnchanged(MutableString param) {
if (postCondition()) {
assert unchanged(param);
}
}
@Override
public void fieldIsChanged() {
if (postCondition()) {
assert unchanged(target.field);
}
}
@Override
public void methodIsChanged() {
if (postCondition()) {
assert unchanged(target.method());
}
}
@Override
public void parameterIsChanged(MutableString param) {
if (postCondition()) {
assert unchanged(param);
}
}
@Override
public void parameter5IsChanged(int a, int b, int c, int d, MutableString param) {
if (postCondition()) {
assert unchanged(param);
}
}
@Override
public void parameterArrayIsChanged(MutableString[] param) {
if (postCondition()) {
assert unchanged(param);
}
}
@Override
public void parameterArrayIsReplaced(MutableString[] param) {
if (postCondition()) {
assert unchanged(param);
}
}
@Override
public void fieldIsReplaced() {
if (postCondition()) {
assert unchanged(target.field);
}
}
@Override
public void methodIsReplaced() {
if (postCondition()) {
assert unchanged(target.method());
}
}
@Override
public void parameterIsReplaced(MutableString param) {
if (postCondition()) {
assert unchanged(param);
}
}
}
}