package hu.bme.mit.incquery.cep.tests;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotSame;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertSame;
import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
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.Event;
import hu.bme.mit.incquery.cep.metamodels.cep.EventPattern;
import hu.bme.mit.incquery.cep.metamodels.internalsm.FinalState;
import hu.bme.mit.incquery.cep.metamodels.internalsm.Guard;
import hu.bme.mit.incquery.cep.metamodels.internalsm.State;
import hu.bme.mit.incquery.cep.metamodels.internalsm.StateMachine;
import hu.bme.mit.incquery.cep.metamodels.internalsm.Transition;
import hu.bme.mit.incquery.cep.metamodels.internalsm.TrapState;
import hu.bme.mit.incquery.cep.runtime.evaluation.SMUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.junit.Test;
public class SMUtilsTests {
SMUtils smUtils;
@Test
public void isEnabledTest(){
Transition transition= mock(Transition.class);
Guard guard = mock(Guard.class);
when(transition.getGuard()).thenReturn(guard);
AtomicEventPattern atomicEventPattern = mock(AtomicEventPattern.class);
when(guard.getEventType()).thenReturn(atomicEventPattern);
when(atomicEventPattern.getType()).thenReturn("testTheSame");
Event event = mock(Event.class);
when(event.getType()).thenReturn("testTheSame");
assertTrue(SMUtils.isEnabled(transition, event));
when(event.getType()).thenReturn("testTheDifferent");
assertFalse(SMUtils.isEnabled(transition, event));
}
@Test
public void isFinalTest(){
FinalState finalMock = mock(FinalState.class);
State nonFinalMock = mock(State.class);
assertTrue(SMUtils.isFinal(finalMock));
assertFalse(SMUtils.isFinal(nonFinalMock));
}
@Test
public void getTrapStateTest(){
StateMachine stateMachine = mock(StateMachine.class);
TrapState trapState = mock(TrapState.class);
EList<State> states = new BasicEList<State>();
states.add(trapState);
when(stateMachine.getStates()).thenReturn(states);
assertSame(trapState, SMUtils.getTrapState(stateMachine));
State nonTrapState = mock(State.class);
states = new BasicEList<State>();
states.add(nonTrapState);
when(stateMachine.getStates()).thenReturn(states);
assertNotSame(trapState, SMUtils.getTrapState(stateMachine));
assertNull(SMUtils.getTrapState(stateMachine));
}
@Test
public void flattenEventPatternsTest() {
//TODO unordered+mixed case
ComplexEventPattern rootPattern = mock(ComplexEventPattern.class);
ComplexEventPattern c1 = mock(ComplexEventPattern.class);
ComplexEventPattern c2 = mock(ComplexEventPattern.class);
ComplexEventPattern c3 = mock(ComplexEventPattern.class);
List<AtomicEventPattern> baseAtomicEventPatternList = prepareAtomicEventPatterns();
for(int i=0; i<10; i++){
List<AtomicEventPattern> atomicEventPatterns = new ArrayList<AtomicEventPattern>(baseAtomicEventPatternList);
Collections.shuffle(atomicEventPatterns);
List<AtomicEventPattern> referenceListOfPatterns = new ArrayList<AtomicEventPattern>(atomicEventPatterns);
BasicEList<EventPattern> c1Components = new BasicEList<EventPattern>();
c1Components.add(atomicEventPatterns.remove(0));
c1Components.add(atomicEventPatterns.remove(0));
when(c1.getCompositionEvents()).thenReturn(c1Components);
when(c1.getOperator()).thenReturn(ComplexOperator.ORDERED);
BasicEList<EventPattern> c2Components = new BasicEList<EventPattern>();
c1Components.add(c3);
c1Components.add(atomicEventPatterns.remove(0));
when(c2.getCompositionEvents()).thenReturn(c2Components);
when(c2.getOperator()).thenReturn(ComplexOperator.ORDERED);
BasicEList<EventPattern> c3Components = new BasicEList<EventPattern>();
c1Components.add(atomicEventPatterns.remove(0));
c1Components.add(atomicEventPatterns.remove(0));
when(c3.getCompositionEvents()).thenReturn(c3Components);
when(c3.getOperator()).thenReturn(ComplexOperator.ORDERED);
BasicEList<EventPattern> rootComponents = new BasicEList<EventPattern>();
rootComponents.add(c1);
rootComponents.add(c2);
when(rootPattern.getCompositionEvents()).thenReturn(rootComponents);
when(rootPattern.getOperator()).thenReturn(ComplexOperator.ORDERED);
List<AtomicEventPattern> flattenedList = SMUtils.flattenEventPatterns(rootPattern);
for (AtomicEventPattern atomicEventPattern : flattenedList) {
//System.out.println(atomicEventPattern.getId() + " -- " + referenceListOfPatterns.remove(0).getId());
assertEquals(referenceListOfPatterns.remove(0).getId(), atomicEventPattern.getId());
}
}
}
private List<AtomicEventPattern> prepareAtomicEventPatterns(){
List<AtomicEventPattern> atomicEvents = new ArrayList<AtomicEventPattern>();
AtomicEventPattern a1 = mock(AtomicEventPattern.class);
when(a1.getId()).thenReturn("a1");
atomicEvents.add(a1);
AtomicEventPattern a2 = mock(AtomicEventPattern.class);
when(a2.getId()).thenReturn("a2");
atomicEvents.add(a2);
AtomicEventPattern a3 = mock(AtomicEventPattern.class);
when(a3.getId()).thenReturn("a3");
atomicEvents.add(a3);
AtomicEventPattern a4 = mock(AtomicEventPattern.class);
when(a4.getId()).thenReturn("a4");
atomicEvents.add(a4);
AtomicEventPattern a5 = mock(AtomicEventPattern.class);
when(a5.getId()).thenReturn("a5");
atomicEvents.add(a5);
return atomicEvents;
}
}