package org.drools.planner.core.move.generic;
import org.drools.planner.core.domain.entity.PlanningEntityDescriptor;
import org.drools.planner.core.domain.solution.SolutionDescriptor;
import org.drools.planner.core.domain.variable.PlanningVariableDescriptor;
import org.drools.planner.core.score.director.ScoreDirector;
import org.drools.planner.core.testdata.domain.TestdataChainedAnchor;
import org.drools.planner.core.testdata.domain.TestdataChainedEntity;
import org.junit.Test;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
public class GenericChainedChangeMoveTest {
@Test
public void noTrailing() {
TestdataChainedAnchor a0 = new TestdataChainedAnchor("a0");
TestdataChainedEntity a1 = new TestdataChainedEntity("a1");
a1.setChainedObject(a0);
TestdataChainedEntity a2 = new TestdataChainedEntity("a2");
a2.setChainedObject(a1);
TestdataChainedEntity a3 = new TestdataChainedEntity("a3");
a3.setChainedObject(a2);
TestdataChainedAnchor b0 = new TestdataChainedAnchor("b0");
TestdataChainedEntity b1 = new TestdataChainedEntity("b1");
b1.setChainedObject(b0);
PlanningEntityDescriptor entityDescriptor = TestdataChainedEntity.buildEntityDescriptor();
PlanningVariableDescriptor variableDescriptor = entityDescriptor.getPlanningVariableDescriptor("chainedObject");
ScoreDirector scoreDirector = mock(ScoreDirector.class);
GenericChainedChangeMove move = new GenericChainedChangeMove(a3, variableDescriptor, b1, null, null);
move.doMove(scoreDirector);
assertEquals(a0, a1.getChainedObject());
assertEquals(a1, a2.getChainedObject());
assertEquals(b0, b1.getChainedObject());
assertEquals(b1, a3.getChainedObject());
verify(scoreDirector).beforeVariableChanged(a3, "chainedObject");
verify(scoreDirector).afterVariableChanged(a3, "chainedObject");
verifyNoMoreInteractions(scoreDirector);
}
@Test
public void oldAndNewTrailing() {
TestdataChainedAnchor a0 = new TestdataChainedAnchor("a0");
TestdataChainedEntity a1 = new TestdataChainedEntity("a1");
a1.setChainedObject(a0);
TestdataChainedEntity a2 = new TestdataChainedEntity("a2");
a2.setChainedObject(a1);
TestdataChainedEntity a3 = new TestdataChainedEntity("a3");
a3.setChainedObject(a2);
TestdataChainedAnchor b0 = new TestdataChainedAnchor("b0");
TestdataChainedEntity b1 = new TestdataChainedEntity("b1");
b1.setChainedObject(b0);
PlanningEntityDescriptor entityDescriptor = TestdataChainedEntity.buildEntityDescriptor();
PlanningVariableDescriptor variableDescriptor = entityDescriptor.getPlanningVariableDescriptor("chainedObject");
ScoreDirector scoreDirector = mock(ScoreDirector.class);
GenericChainedChangeMove move = new GenericChainedChangeMove(a2, variableDescriptor, b0, a3, b1);
move.doMove(scoreDirector);
assertEquals(a0, a1.getChainedObject());
assertEquals(a1, a3.getChainedObject());
assertEquals(b0, a2.getChainedObject());
assertEquals(a2, b1.getChainedObject());
verify(scoreDirector).beforeVariableChanged(a2, "chainedObject");
verify(scoreDirector).afterVariableChanged(a2, "chainedObject");
verify(scoreDirector).beforeVariableChanged(a3, "chainedObject");
verify(scoreDirector).afterVariableChanged(a3, "chainedObject");
verify(scoreDirector).beforeVariableChanged(b1, "chainedObject");
verify(scoreDirector).afterVariableChanged(b1, "chainedObject");
verifyNoMoreInteractions(scoreDirector);
}
}