package hu.bme.mit.incquery.cep.tests; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNotNull; import static org.junit.Assume.assumeNotNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.mockito.Mockito.withSettings; import hu.bme.mit.incquery.cep.api.EventPatternAutomatonOptions; import hu.bme.mit.incquery.cep.metamodels.cep.AtomicEventPattern; import hu.bme.mit.incquery.cep.metamodels.cep.ComplexEventPattern; import hu.bme.mit.incquery.cep.metamodels.cep.ComplexOperator; import hu.bme.mit.incquery.cep.metamodels.cep.EventPattern; import hu.bme.mit.incquery.cep.metamodels.internalsm.InternalExecutionModel; import hu.bme.mit.incquery.cep.metamodels.internalsm.InternalsmFactory; import hu.bme.mit.incquery.cep.metamodels.internalsm.StateMachine; import hu.bme.mit.incquery.cep.runtime.evaluation.SMUtils; import hu.bme.mit.incquery.cep.runtime.evaluation.StateMachineBuilder; import java.util.Arrays; import java.util.List; import junit.framework.Assert; import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.InternalEObject; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; @Ignore @RunWith(Parameterized.class) public class StateMachineBuilderTest { private enum EventPatternType { ATOMIC, ORDERED, UNORDERED, MIXED; } @Parameters public static List<EventPatternType[]> data() { return Arrays.asList(new EventPatternType[][] { { EventPatternType.ATOMIC }, { EventPatternType.ORDERED }, { EventPatternType.UNORDERED }, { EventPatternType.MIXED } }); } private StateMachineBuilder smBuilder; private InternalExecutionModel model; private EventPatternType eventPatternType; public StateMachineBuilderTest(EventPatternType eventPatternType) { this.eventPatternType = eventPatternType; } @Before public void setUp() throws Exception { model = InternalsmFactory.eINSTANCE.createInternalExecutionModel(); } @After public void tearDown() throws Exception { smBuilder = null; model = null; eventPatternType = null; } @Test public void testBuildStateMachine() { assumeNotNull(eventPatternType); EventPattern testEventPattern = getTestEventPattern(eventPatternType); assertNotNull(testEventPattern); int expected = calculateNumberOfStates(testEventPattern, eventPatternType); assertFalse(expected == 0); smBuilder = new StateMachineBuilder(model, testEventPattern, EventPatternAutomatonOptions.getDefault()); StateMachine stateMachine = smBuilder.buildStateMachine(); assertNotNull(stateMachine); Assert.assertEquals(expected, stateMachine.getStates().size()); } private int calculateNumberOfStates(EventPattern pattern, EventPatternType type) { if (type.equals(EventPatternType.ATOMIC)) { return 1 + 2; } if (type.equals(EventPatternType.ORDERED)) { return SMUtils.flattenEventPatterns(pattern).size() + 2; } if (type.equals(EventPatternType.UNORDERED)) { return (1 << SMUtils.flattenEventPatterns(pattern).size()) + 1; } if (type.equals(EventPatternType.MIXED)) { return -1; // TODO } return 0; } private EventPattern getTestEventPattern(EventPatternType type) { EventPattern eventPattern = null; switch (type) { case ATOMIC: eventPattern = getAtomicPattern(); break; case ORDERED: eventPattern = getOrderedPattern(); break; case UNORDERED: eventPattern = getUnorderedPattern(); break; case MIXED: eventPattern = getMixedPattern(); break; } return eventPattern; } private EventPattern getAtomicPattern() { EventPattern eventPattern = mock(EventPattern.class, withSettings().extraInterfaces(InternalEObject.class)); when(eventPattern.getId()).thenReturn("testPattern"); AtomicEventPattern atomicEventPattern = mock(AtomicEventPattern.class); when(atomicEventPattern.getType()).thenReturn("test1"); return eventPattern; } private EventPattern getOrderedPattern() { ComplexEventPattern complexEventPattern = mock(ComplexEventPattern.class, withSettings().extraInterfaces(InternalEObject.class)); when(complexEventPattern.getOperator()).thenReturn(ComplexOperator.ORDERED); when(complexEventPattern.getId()).thenReturn("complexPattern1"); AtomicEventPattern atomicEventPattern1 = mock(AtomicEventPattern.class); AtomicEventPattern atomicEventPattern2 = mock(AtomicEventPattern.class); AtomicEventPattern atomicEventPattern3 = mock(AtomicEventPattern.class); when(atomicEventPattern1.getType()).thenReturn("test1"); when(atomicEventPattern1.getId()).thenReturn("atomicPattern1"); when(atomicEventPattern2.getType()).thenReturn("test2"); when(atomicEventPattern2.getId()).thenReturn("atomicPattern2"); when(atomicEventPattern3.getType()).thenReturn("test3"); when(atomicEventPattern3.getId()).thenReturn("atomicPattern3"); when(atomicEventPattern1.eContainer()).thenReturn(complexEventPattern); when(atomicEventPattern2.eContainer()).thenReturn(complexEventPattern); when(atomicEventPattern3.eContainer()).thenReturn(complexEventPattern); EList<EventPattern> returnables2 = new BasicEList<EventPattern>(); returnables2.add(atomicEventPattern1); returnables2.add(atomicEventPattern2); returnables2.add(atomicEventPattern3); when(complexEventPattern.getCompositionEvents()).thenReturn(returnables2); return complexEventPattern; } private EventPattern getUnorderedPattern() { ComplexEventPattern complexEventPattern = mock(ComplexEventPattern.class, withSettings().extraInterfaces(InternalEObject.class)); when(complexEventPattern.getOperator()).thenReturn(ComplexOperator.UNORDERED); when(complexEventPattern.getId()).thenReturn("complexPattern1"); AtomicEventPattern atomicEventPattern1 = mock(AtomicEventPattern.class); when(atomicEventPattern1.eContainer()).thenReturn(complexEventPattern); AtomicEventPattern atomicEventPattern2 = mock(AtomicEventPattern.class); when(atomicEventPattern2.eContainer()).thenReturn(complexEventPattern); AtomicEventPattern atomicEventPattern3 = mock(AtomicEventPattern.class); when(atomicEventPattern1.getType()).thenReturn("test1"); when(atomicEventPattern1.getId()).thenReturn("atomicPattern1"); when(atomicEventPattern2.getType()).thenReturn("test2"); when(atomicEventPattern2.getId()).thenReturn("atomicPattern2"); when(atomicEventPattern3.getType()).thenReturn("test3"); when(atomicEventPattern3.getId()).thenReturn("atomicPattern3"); when(atomicEventPattern1.eContainer()).thenReturn(complexEventPattern); when(atomicEventPattern2.eContainer()).thenReturn(complexEventPattern); when(atomicEventPattern3.eContainer()).thenReturn(complexEventPattern); EList<EventPattern> returnables2 = new BasicEList<EventPattern>(); returnables2.add(atomicEventPattern1); returnables2.add(atomicEventPattern2); returnables2.add(atomicEventPattern3); when(complexEventPattern.getCompositionEvents()).thenReturn(returnables2); return complexEventPattern; } private EventPattern getMixedPattern() { return null; } }