Skip to content

Commit

Permalink
Added tests for MiniZinc Intelligent Ensembles (implementation will
Browse files Browse the repository at this point in the history
follow soon).
  • Loading branch information
jiracekz committed Jul 24, 2015
1 parent 9e91bf2 commit 3e9b946
Show file tree
Hide file tree
Showing 8 changed files with 404 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@ public Collection<EnsembleInstance> createInstances(KnowledgeContainer container

ScriptOutputVariableRegistry outputVars = scriptRunner.runScript(inputVars);

createInstancesFromOutput(outputVars);

return null;
return createInstancesFromOutput(outputVars);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

public class ScriptInputVariableRegistry {
Expand All @@ -19,22 +17,35 @@ public Entry(String name2, String value2) {
name = name2;
value = value2;
}

@Override
public String toString() {
return String.format("%s=%s", name, value);
}
}

private List<Entry> inputVariables;

public List<Entry> getInputVariables() {
return inputVariables;
}

// supported primitive types (for others -> exception)
// for each there needs to be an overload of the addVariable function
// supported are also arrays and sets
public static final Set<Class<?>> supportedPrimitiveTypes
= new HashSet<Class<?>>(Arrays.asList(Boolean.class, Integer.class, Float.class, ScriptIdentifier.class));

/**
* Just for testing purposes. Use the parameterless constructor instead
* @param entryList
*/
public ScriptInputVariableRegistry(List<Entry> entryList) {
this.inputVariables = entryList;
}

public ScriptInputVariableRegistry() {
inputVariables = new ArrayList<>();
this(new ArrayList<Entry>());
}

public List<Entry> getInputVariables() {
return inputVariables;
}

private void addVariable(String name, Object value) {
Expand Down Expand Up @@ -72,7 +83,7 @@ public void addVariable(String name, Object[][] value) throws UnsupportedVariabl
// TODO
}

public void addVariable(String name, Set<?> value) throws UnsupportedVariableTypeException {
public void addVariable(String name, Set<Integer> value) throws UnsupportedVariableTypeException {
// TODO
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public <T> T[][] getArray2dValue(String varName, Class<T> innerType)
return null;
}

public <T> Set<T> getSetValue(String varName, Class<T> innerType)
public Set<Integer> getSetValue(String varName)
throws OutputVariableParseException, UnsupportedVariableTypeException {
// TODO
return null;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
package cz.cuni.mff.d3s.deeco.demo.intelligent;

import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertThat;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

import org.junit.Test;

import cz.cuni.mff.d3s.deeco.annotations.processor.AnnotationProcessorException;
Expand All @@ -17,14 +23,20 @@ public static void main(String[] args) throws InstantiationException, IllegalAcc
new IntelligentEnsemblesTest().testEnsembles(false);
}

//@Test
// TODO finish the integration test
@Test
public void testEnsembles() throws InstantiationException, IllegalAccessException, DEECoException, AnnotationProcessorException {
testEnsembles(true);
}

private void testEnsembles(boolean silent) throws InstantiationException, IllegalAccessException, DEECoException, AnnotationProcessorException {

ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (silent) {
RescuerComponent.outputStream = new PrintStream(baos);
} else {
RescuerComponent.outputStream = System.out;
}

/* create main application container */
SimulationTimer simulationTimer = new DiscreteEventTimer();
DEECoSimulation realm = new DEECoSimulation(simulationTimer);
Expand All @@ -36,16 +48,21 @@ private void testEnsembles(boolean silent) throws InstantiationException, Illega
deeco.deployComponent(new RescuerComponent("1", 30));
deeco.deployComponent(new RescuerComponent("2", 0));
deeco.deployComponent(new RescuerComponent("3", 100));
deeco.deployComponent(new RescuerComponent("4", 600));
deeco.deployComponent(new RescuerComponent("4", 60));
deeco.deployComponent(new RescuerComponent("5", 70));
deeco.deployComponent(new RescuerComponent("6", 80));
deeco.deployEnsembleFactory(new IntelligentEnsembleFactory());

/* WHEN simulation is performed */
realm.start(1001);
realm.start(1002);

if (silent) {
// TODO test assertions
assertThat(baos.toString(), containsString("Rescuer 1: train 2"));
assertThat(baos.toString(), containsString("Rescuer 2: train 2"));
assertThat(baos.toString(), containsString("Rescuer 3: train 1"));
assertThat(baos.toString(), containsString("Rescuer 4: train 2"));
assertThat(baos.toString(), containsString("Rescuer 5: train 1"));
assertThat(baos.toString(), containsString("Rescuer 6: train 1"));
}
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
package cz.cuni.mff.d3s.deeco.demo.intelligent;

import java.io.PrintStream;

import cz.cuni.mff.d3s.deeco.annotations.Component;
import cz.cuni.mff.d3s.deeco.annotations.In;
import cz.cuni.mff.d3s.deeco.annotations.PeriodicScheduling;
import cz.cuni.mff.d3s.deeco.annotations.Process;
import cz.cuni.mff.d3s.deeco.annotations.PlaysRole;

@Component
@PlaysRole(Rescuer.class)
public class RescuerComponent {

public static PrintStream outputStream = System.out;

public String id;

public Integer pos;
Expand All @@ -17,5 +24,13 @@ public RescuerComponent(String id, Integer pos) {
this.id = id;
this.pos = pos;
}

@Process
@PeriodicScheduling(period = 1000, offset = 1)
public static void printTrainId(@In("id") String id, @In("trainId") Integer trainId) {
if (trainId > 0) {
outputStream.printf("Rescuer %s: train %d", id, trainId);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package cz.cuni.mff.d3s.deeco.ensembles.intelligent;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.atMost;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.refEq;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;

import java.util.ArrayList;
import java.util.Collection;

import javax.management.openmbean.InvalidOpenTypeException;

import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;

import cz.cuni.mff.d3s.deeco.ensembles.EnsembleFormationException;
import cz.cuni.mff.d3s.deeco.ensembles.EnsembleInstance;
import cz.cuni.mff.d3s.deeco.knowledge.container.KnowledgeContainer;

public class MiniZincIntelligentEnsembleFactoryTest {

class MiniZincIntelligentEnsembleFactoryMock extends MiniZincIntelligentEnsembleFactory {

public ScriptInputVariableRegistry inputVars;
public Collection<EnsembleInstance> resultCollection;

public MiniZincIntelligentEnsembleFactoryMock(MznScriptRunner scriptRunner, ScriptInputVariableRegistry inputVars,
Collection<EnsembleInstance> resultCollection) {
super(scriptRunner);
this.inputVars = inputVars;
this.resultCollection = resultCollection;
}

@Override
public int getSchedulingOffset() {
throw new InvalidOpenTypeException("The method getSchedulingOffset should not have been called.");
}

@Override
public int getSchedulingPeriod() {
throw new InvalidOpenTypeException("The method getSchedulingOffset should not have been called.");
}

@Override
protected ScriptInputVariableRegistry parseInput(KnowledgeContainer knowledgeContainer) throws EnsembleFormationException {
return inputVars;
}

@Override
protected Collection<EnsembleInstance> createInstancesFromOutput(ScriptOutputVariableRegistry scriptOutput)
throws EnsembleFormationException {
return resultCollection;
}
}

@Test
public void createInstancesTest() throws EnsembleFormationException {
KnowledgeContainer container = Mockito.mock(KnowledgeContainer.class);
ScriptInputVariableRegistry inputVars = Mockito.mock(ScriptInputVariableRegistry.class);
ScriptOutputVariableRegistry outputVars = Mockito.mock(ScriptOutputVariableRegistry.class);
Collection<EnsembleInstance> resultCollection = new ArrayList<EnsembleInstance>();

MznScriptRunner runnerMock = Mockito.mock(MznScriptRunner.class);
Mockito.doReturn(outputVars).when(runnerMock).runScript(any());

MiniZincIntelligentEnsembleFactory target = Mockito.spy(
new MiniZincIntelligentEnsembleFactoryMock(runnerMock, inputVars, resultCollection));
Collection<EnsembleInstance> returnValue = target.createInstances(container);

Mockito.verify(target, times(1)).parseInput(refEq(container));
Mockito.verify(target, times(1)).createInstancesFromOutput(refEq(outputVars));
Mockito.verify(target, times(1)).createInstances(any());
Mockito.verify(runnerMock, times(1)).runScript(refEq(inputVars));
Mockito.verifyNoMoreInteractions(target, runnerMock);
Assert.assertSame(resultCollection, returnValue);
}
}
Loading

0 comments on commit 3e9b946

Please sign in to comment.