package sushi.simulation; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.junit.Before; import org.junit.Test; import sushi.bpmn.element.AbstractBPMNElement; import sushi.bpmn.element.BPMNAndGateway; import sushi.bpmn.element.BPMNEndEvent; import sushi.bpmn.element.BPMNProcess; import sushi.bpmn.element.BPMNStartEvent; import sushi.bpmn.element.BPMNTask; import sushi.bpmn.element.BPMNXORGateway; import sushi.bpmn.monitoringpoint.MonitoringPointStateTransition; import sushi.bpmn.monitoringpoint.MonitoringPoint; import sushi.correlation.AttributeCorrelator; import sushi.event.SushiEvent; import sushi.event.SushiEventType; import sushi.event.attribute.SushiAttribute; import sushi.event.attribute.SushiAttributeTree; import sushi.event.attribute.SushiAttributeTypeEnum; import sushi.eventhandling.Broker; import sushi.persistence.Persistor; import sushi.process.SushiProcess; public class SimulationTest { private SushiAttribute location, movie; private SushiEventType eventType1, eventType2, eventType3, eventType4, eventType5, eventType6, eventType7, eventType8, eventType9; private BPMNProcess simpleBPMNProcess, complexBPMNProcess, loopProcess; private Map<SushiAttribute, List<Serializable>> attributes; @Before public void setup(){ Persistor.useTestEnviroment(); createEventTypes(); } private void createEventTypes() { SushiAttributeTree values = new SushiAttributeTree(); attributes = new HashMap<SushiAttribute, List<Serializable>>(); eventType1 = new SushiEventType("EventType1", values); Broker.send(eventType1); eventType2 = new SushiEventType("EventType2", values); Broker.send(eventType2); eventType3 = new SushiEventType("EventType3", values); Broker.send(eventType3); eventType4 = new SushiEventType("EventType4", values); Broker.send(eventType4); eventType5 = new SushiEventType("EventType5", values); Broker.send(eventType5); } private SushiProcess createSimpleCorrelatedProcess() { simpleBPMNProcess = new BPMNProcess("1", "SimpleProcess", null); BPMNStartEvent startEvent = new BPMNStartEvent("2", "StartEvent", null); BPMNTask task1 = new BPMNTask("3", "Task1", Arrays.asList(new MonitoringPoint(eventType1, MonitoringPointStateTransition.terminate, ""))); BPMNTask task2 = new BPMNTask("4", "Task2", Arrays.asList(new MonitoringPoint(eventType2, MonitoringPointStateTransition.terminate, ""))); BPMNEndEvent endEvent = new BPMNEndEvent("5", "EndEvent", null); AbstractBPMNElement.connectElements(startEvent, task1); AbstractBPMNElement.connectElements(task1, task2); AbstractBPMNElement.connectElements(task2, endEvent); List<SushiEventType> eventTypes = Arrays.asList(eventType1, eventType2); SushiProcess process = new SushiProcess("SimpleProcess", eventTypes); process.save(); simpleBPMNProcess.addBPMNElements(Arrays.asList(startEvent, task1, task2, endEvent)); simpleBPMNProcess.save(); process.setBpmnProcess(simpleBPMNProcess); process.merge(); return process; } private SushiProcess createComplexProcess() { complexBPMNProcess = new BPMNProcess("6", "ComplexProcess", null); BPMNStartEvent startEvent = new BPMNStartEvent("7", "StartEvent", null); BPMNTask task1 = new BPMNTask("8", "Task1", Arrays.asList(new MonitoringPoint(eventType1, MonitoringPointStateTransition.terminate, ""))); BPMNAndGateway and1 = new BPMNAndGateway("9", "XOR1", null); BPMNTask task2 = new BPMNTask("10", "Task2", Arrays.asList(new MonitoringPoint(eventType2, MonitoringPointStateTransition.terminate, ""))); BPMNTask task3 = new BPMNTask("11", "Task3", Arrays.asList(new MonitoringPoint(eventType3, MonitoringPointStateTransition.terminate, ""))); BPMNTask task4 = new BPMNTask("12", "Task4", Arrays.asList(new MonitoringPoint(eventType4, MonitoringPointStateTransition.terminate, ""))); BPMNTask task5 = new BPMNTask("13", "Task5", Arrays.asList(new MonitoringPoint(eventType5, MonitoringPointStateTransition.terminate, ""))); BPMNAndGateway and2 = new BPMNAndGateway("14", "XOR2", null); BPMNEndEvent endEvent = new BPMNEndEvent("15", "EndEvent", null); AbstractBPMNElement.connectElements(startEvent, task1); AbstractBPMNElement.connectElements(task1, and1); AbstractBPMNElement.connectElements(and1, task2); AbstractBPMNElement.connectElements(task2, task4); AbstractBPMNElement.connectElements(and1, task3); AbstractBPMNElement.connectElements(task3, task5); AbstractBPMNElement.connectElements(task4, and2); AbstractBPMNElement.connectElements(task5, and2); AbstractBPMNElement.connectElements(and2, endEvent); complexBPMNProcess.addBPMNElements(Arrays.asList(startEvent, task1, task2, task3, task4, task5, and1, and2, endEvent)); complexBPMNProcess.save(); List<SushiEventType> eventTypes = Arrays.asList(eventType1, eventType2, eventType3, eventType4, eventType5); SushiProcess process = new SushiProcess("ComplexProcess", eventTypes); process.save(); process.setBpmnProcess(simpleBPMNProcess); process.merge(); return process; } @Test public void simpleProcessTest(){ SushiProcess process = createSimpleCorrelatedProcess(); Map<AbstractBPMNElement, String> elementDurations = new HashMap<AbstractBPMNElement, String>(); Map<AbstractBPMNElement, DerivationType> elementDerivation = new HashMap<AbstractBPMNElement, DerivationType>(); for(AbstractBPMNElement bpmnElement : simpleBPMNProcess.getBPMNElementsWithOutSequenceFlows()){ elementDerivation.put(bpmnElement, DerivationType.FIXED); elementDurations.put(bpmnElement, "1"); } Simulator simulator = new Simulator(process, simpleBPMNProcess, attributes, elementDurations, new HashMap<AbstractBPMNElement, String>(), elementDerivation, null); simulator.simulate(1); List<SushiEvent> events = SushiEvent.findAll(); assertTrue(events.size() == 2); assertEquals(eventType1, events.get(0).getEventType()); assertEquals(eventType2, events.get(1).getEventType()); } @Test public void complexProcessTest(){ SushiProcess process = createComplexProcess(); Map<AbstractBPMNElement, String> elementDurations = new HashMap<AbstractBPMNElement, String>(); Map<AbstractBPMNElement, DerivationType> elementDerivation = new HashMap<AbstractBPMNElement, DerivationType>(); for(AbstractBPMNElement bpmnElement : complexBPMNProcess.getBPMNElementsWithOutSequenceFlows()){ elementDerivation.put(bpmnElement, DerivationType.FIXED); elementDurations.put(bpmnElement, "1"); } Simulator simulator = new Simulator(process, complexBPMNProcess, attributes, elementDurations, new HashMap<AbstractBPMNElement, String>(), elementDerivation, null); simulator.simulate(1); List<SushiEvent> events = SushiEvent.findAll(); assertTrue(events.size() == 5); assertEquals(eventType1, events.get(0).getEventType()); assertTrue(eventType2.equals(events.get(1).getEventType()) || eventType3.equals(events.get(1).getEventType())); assertTrue(eventType4.equals(events.get(2).getEventType()) || eventType5.equals(events.get(2).getEventType()) || eventType2.equals(events.get(1).getEventType()) || eventType3.equals(events.get(1).getEventType())); } }