package org.jbpm.sim;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.sim.def.JbpmSimulationExperiment;
import org.jbpm.sim.exe.ExperimentReader;
import org.jbpm.sim.kpi.BusinessFigureCalculator;
import org.jbpm.sim.report.ScenarioReport;
public class BusinessFiguresTest extends AbstractSimTestCase {
private static final String testProcessXml = "<process-definition name='test' start-distribution='startDist'>"
+ " <start-state name='start'>"
+ " <transition to='node1' />"
+ " </start-state>"
+ " <node name='node1'>"
+ " <transition to='end'>"
+ " <simulation-action class='org.jbpm.sim.kpi.BusinessFigureAction'>"
+ " <name>testFigure</name> "
+ " </simulation-action>"
+ " </transition>"
+ " </node>"
+ " <end-state name='end'/>"
+ "</process-definition>";
private static final String experimentConfiguration = "<experiment name='MySimulationExperiment'"
+ " run-time='100'"
+ " real-start-time='01.01.1970 01:00:00:002'"
+ " time-unit='minute'>"
+ " <scenario name ='test'>"
+ " <distribution name='startDist' sample-type='real' type='constant' value='20' /> "
+ " <sim-process name='test' />"
+ " <business-figure name='testFigure' type='costs' "
+ " automatic-calculation='none'"
+ // | process - start | process -end"
" handler='org.jbpm.sim.BusinessFiguresTest$BusinessFigureHandler' />"
+ " </scenario>"
+ " <output path='target' />" // currently just used as parameter for DESMO-J
+ "</experiment>";
public static class BusinessFigureHandler implements BusinessFigureCalculator {
public Number calculate(ExecutionContext executionContext) {
return new Double(10);
}
}
public void testBusinessFigureConfiguredInProcess() {
ExperimentReader reader = new ExperimentReader(experimentConfiguration);
// inject process definition
reader.addProcessDefinition("test", testProcessXml);
JbpmSimulationExperiment experiment = reader.readExperiment();
experiment.run();
ScenarioReport report = experiment.getScenario("test").getScenarioReport();
assertEquals(1, report.getBusinessFigureTypes().size());
assertEquals("costs", report.getBusinessFigureTypes().iterator().next());
assertEquals(40d, //
report.getBusinessFigureValue("costs"), //
0.1);
}
/**
* and now the same with the usage of the figure configured in the experiment, no change in the
* process definition required
*/
private static final String testProcessXml2 = "<process-definition name='test' start-distribution='startDist'>"
+ " <start-state name='start'>"
+ " <transition to='node1' />"
+ " </start-state>"
+ " <node name='node1'>"
+ " <transition to='end' />"
+ " </node>"
+ " <end-state name='end'/>"
+ "</process-definition>";
private static final String experimentConfiguration2 = "<experiment name='MySimulationExperiment'"
+ " run-time='100'"
+ " real-start-time='01.01.1970 01:00:00:002'"
+ " time-unit='minute'>"
+ " <scenario name ='test'>"
+ " <distribution name='startDist' sample-type='real' type='constant' value='20' /> "
+ " <business-figure name='testFigure' type='costs' "
+ " automatic-calculation='none'"
+ // | process - start | process -end"
" handler='org.jbpm.sim.BusinessFiguresTest$BusinessFigureHandler' />"
+ " <sim-process name='test'>"
+ " <node-overwrite node-name='node1'>"
+ " <calculate-business-figure name='testFigure' /> "
+ " </node-overwrite> "
+ " </sim-process>"
+ " </scenario>"
+ " <output path='target' />" // currently just used as parameter for DESMO-J
+ "</experiment>";
public void testBusinessFigureConfiguredInExperiment() {
ExperimentReader reader = new ExperimentReader(experimentConfiguration2);
// inject process definition
reader.addProcessDefinition("test", testProcessXml2);
JbpmSimulationExperiment experiment = reader.readExperiment();
experiment.run();
ScenarioReport report = experiment.getScenario("test").getScenarioReport();
assertEquals(1, report.getBusinessFigureTypes().size());
assertEquals("costs", report.getBusinessFigureTypes().iterator().next());
assertEquals(40d, //
report.getBusinessFigureValue("costs"), //
0.1);
}
}