blob: e9bbcb846efd57e7e06b037f1a34b4a6df2e4ab1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2018 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.examples.eventmanager.tests;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.impl.DynamicEObjectImpl;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.ocl.examples.eventmanager.EventFilter;
import org.eclipse.ocl.examples.eventmanager.EventManager;
import org.eclipse.ocl.examples.eventmanager.EventManagerFactory;
import org.eclipse.ocl.examples.eventmanager.tests.EventManagerTest.Application;
import org.eclipse.ocl.examples.eventmanager.tests.util.BaseTest;
public class LogicalFilterTest extends BaseTest {
private EventManager fixture;
private Application app;
private EClass eClass1;
private EventFilter featureFilterRef;
private DynamicEObjectImpl eObjectCls1;
private EClass eClass2;
private DynamicEObjectImpl eObjectCls2;
private EClass eClass3;
private DynamicEObjectImpl eObjectCls3;
private EClass eClass4;
private DynamicEObjectImpl eObjectCls4;
private EReference ref;
private EventFilter typeFilterAdd;
private EventFilter classFilterCls1;
private EventFilter oldValueFilterCls2;
private EventFilter newValueFilterCls2;
private EventFilter newValueFilterCls3;
private EventFilter newValueFilterWithSubclassesCls3;
private EventFilter newValueFilterWithSubclassesCls4;
@Override
public void setUp() throws Exception {
fixture = EventManagerFactory.eINSTANCE.createEventManager();
app = new Application();
eClass1 = EcoreFactory.eINSTANCE.createEClass();
eClass1.setName("c1");
eObjectCls1 = new DynamicEObjectImpl(eClass1);
eClass2 = EcoreFactory.eINSTANCE.createEClass();
eClass2.setName("c2");
eObjectCls2 = new DynamicEObjectImpl(eClass2);
eClass3 = EcoreFactory.eINSTANCE.createEClass();
eClass3.setName("c3");
eObjectCls3 = new DynamicEObjectImpl(eClass3);
eClass4 = EcoreFactory.eINSTANCE.createEClass();
eClass4.setName("c4");
eClass4.getESuperTypes().add(eClass3); // c4 extends c3
eObjectCls4 = new DynamicEObjectImpl(eClass4);
ref = EcoreFactory.eINSTANCE.createEReference();
typeFilterAdd = EventManagerFactory.eINSTANCE.createEventTypeFilter(Notification.ADD);
classFilterCls1 = EventManagerFactory.eINSTANCE.createClassFilter(eClass1);
oldValueFilterCls2 = EventManagerFactory.eINSTANCE.createOldValueClassFilter(eClass2);
newValueFilterCls2 = EventManagerFactory.eINSTANCE.createNewValueClassFilter(eClass2);
newValueFilterCls3 = EventManagerFactory.eINSTANCE.createNewValueClassFilter(eClass3);
newValueFilterWithSubclassesCls3 = EventManagerFactory.eINSTANCE.createNewValueClassFilterIncludingSubclasses(eClass3);
newValueFilterWithSubclassesCls4 = EventManagerFactory.eINSTANCE.createNewValueClassFilterIncludingSubclasses(eClass4);
featureFilterRef = EventManagerFactory.eINSTANCE.createStructuralFeatureFilter(ref);
}
@Override
public void tearDown() throws Exception {
fixture.unsubscribe(app);
fixture=null;
app=null;
}
public void testMatchingAndWithSameFilterTypeOnSameElementOfMultiNewValue() {
EList<EObject> newValue = new BasicEList<EObject>();
newValue.add(eObjectCls3);
newValue.add(eObjectCls4);
Notification n = new ENotificationImpl(eObjectCls1,
Notification.ADD_MANY, ref, null, newValue);
// require an element from newValue to match both eClass3 and eClass4
// which is possible because eClass4 extends eClass3
EventFilter f = EventManagerFactory.eINSTANCE.createAndFilterFor(
newValueFilterWithSubclassesCls3, newValueFilterWithSubclassesCls4);
assertTrue(f.matchesFor(n)); // should match because eObjectCls4 matches both filters
fixture.subscribe(f, app);
fixture.handleEMFEvent(n);
assertTrue("Did not get notified", app.isNotified());
}
public void testMatchingAndWithSameFilterTypeOnDifferentElementsOfMultiNewValue() {
EList<EObject> newValue = new BasicEList<EObject>();
newValue.add(eObjectCls2);
newValue.add(eObjectCls3);
Notification n = new ENotificationImpl(eObjectCls1,
Notification.ADD_MANY, ref, null, newValue);
// require an element from newValue to match both eClass3 and eClass4
// which is not possible for a single element because eClass2 and eClass3 are
// not in any inheritance relationship
EventFilter f = EventManagerFactory.eINSTANCE.createAndFilterFor(
newValueFilterCls2, newValueFilterCls3);
// neither eObjectCls2 nor eObjectCls3 both fulfill filter for eClass2+eClass3,
// but each individual NewValueClassFilter matches one of the two objects, and
// so the AndFilter matches, too.
assertTrue(f.matchesFor(n));
fixture.subscribe(f, app);
fixture.handleEMFEvent(n);
assertTrue("Did not get notified", app.isNotified());
}
public void testSimpleAndFilter1Stage(){
Notification n = new ENotificationImpl(eObjectCls1, Notification.ADD, ref, eObjectCls2, eObjectCls3);
EventFilter f = EventManagerFactory.eINSTANCE.createAndFilterFor(typeFilterAdd,classFilterCls1,oldValueFilterCls2,newValueFilterCls3,featureFilterRef);
fixture.subscribe(f, app);
fixture.handleEMFEvent(n);
assertTrue("Did not get notified", app.isNotified());
}
public void testSimpleAndFilter3Stage(){
Notification n = new ENotificationImpl(eObjectCls1, Notification.ADD, ref, eObjectCls2, eObjectCls3);
EventFilter f7 = EventManagerFactory.eINSTANCE.createAndFilterFor(
EventManagerFactory.eINSTANCE.createAndFilterFor(
typeFilterAdd,
classFilterCls1),
EventManagerFactory.eINSTANCE.createAndFilterFor(
oldValueFilterCls2,
EventManagerFactory.eINSTANCE.createAndFilterFor(
newValueFilterCls3,
featureFilterRef)));
fixture.subscribe(f7, app);
fixture.handleEMFEvent(n);
assertTrue("Did not get notified", app.isNotified());
}
public void testSimpleOrFilter1Stage1(){
Notification n = new ENotificationImpl(eObjectCls1, 0, null, null, null);
EventFilter f = EventManagerFactory.eINSTANCE.createOrFilterFor(typeFilterAdd,classFilterCls1,oldValueFilterCls2,newValueFilterCls3,featureFilterRef);
fixture.subscribe(f, app);
fixture.handleEMFEvent(n);
assertTrue("Did not get notified", app.isNotified());
}
public void testSimpleOrFilter1Stage2(){
Notification n = new ENotificationImpl(null, Notification.ADD, null, null, null);
EventFilter f = EventManagerFactory.eINSTANCE.createOrFilterFor(typeFilterAdd,classFilterCls1,oldValueFilterCls2,newValueFilterCls3,featureFilterRef);
fixture.subscribe(f, app);
fixture.handleEMFEvent(n);
assertTrue("Did not get notified", app.isNotified());
}
public void testSimpleOrFilter1Stage3(){
Notification n = new ENotificationImpl(null, 0, null, eObjectCls2, null);
EventFilter f = EventManagerFactory.eINSTANCE.createOrFilterFor(typeFilterAdd,classFilterCls1,oldValueFilterCls2,newValueFilterCls3,featureFilterRef);
fixture.subscribe(f, app);
fixture.handleEMFEvent(n);
assertTrue("Did not get notified", app.isNotified());
}
public void testSimpleOrFilter1Stage4(){
Notification n = new ENotificationImpl(null, 0, null, null, eObjectCls3);
EventFilter f = EventManagerFactory.eINSTANCE.createOrFilterFor(typeFilterAdd,classFilterCls1,oldValueFilterCls2,newValueFilterCls3,featureFilterRef);
fixture.subscribe(f, app);
fixture.handleEMFEvent(n);
assertTrue("Did not get notified", app.isNotified());
}
public void testSimpleOrFilter1Stage5(){
Notification n = new ENotificationImpl(null, 0, null, null, null);
EventFilter f = EventManagerFactory.eINSTANCE.createOrFilterFor(typeFilterAdd,classFilterCls1,oldValueFilterCls2,newValueFilterCls3,featureFilterRef);
fixture.subscribe(f, app);
fixture.handleEMFEvent(n);
assertFalse("Get notified", app.isNotified());
}
public void testSimpleOrFilter2Stage1(){
Notification n = new ENotificationImpl(null, 0, null, null, eObjectCls3);
EventFilter f = EventManagerFactory.eINSTANCE.createOrFilterFor(
EventManagerFactory.eINSTANCE.createOrFilterFor(
typeFilterAdd,
classFilterCls1),
EventManagerFactory.eINSTANCE.createOrFilterFor(
EventManagerFactory.eINSTANCE.createOrFilterFor(
oldValueFilterCls2,
newValueFilterCls3),
featureFilterRef));
fixture.subscribe(f, app);
fixture.handleEMFEvent(n);
assertTrue("Did not get notified", app.isNotified());
}
public void testSimpleOrFilter2Stage2(){
Notification n = new ENotificationImpl(null, 0, null, null, null);
EventFilter f = EventManagerFactory.eINSTANCE.createOrFilterFor(
EventManagerFactory.eINSTANCE.createOrFilterFor(
typeFilterAdd,
classFilterCls1),
EventManagerFactory.eINSTANCE.createOrFilterFor(
EventManagerFactory.eINSTANCE.createOrFilterFor(
oldValueFilterCls2,
newValueFilterCls3),
featureFilterRef));
fixture.subscribe(f, app);
fixture.handleEMFEvent(n);
assertFalse("Get notified", app.isNotified());
}
public void testSimpleOrFilter2StageAndNot1(){
Notification n = new ENotificationImpl(null, 0, null, null, eObjectCls3);
EventFilter f = EventManagerFactory.eINSTANCE.createOrFilterFor(
EventManagerFactory.eINSTANCE.createOrFilterFor(
typeFilterAdd,
classFilterCls1),
EventManagerFactory.eINSTANCE.createOrFilterFor(
EventManagerFactory.eINSTANCE.createOrFilterFor(
oldValueFilterCls2,
EventManagerFactory.eINSTANCE.createNotFilter(newValueFilterCls3)),
featureFilterRef));
fixture.subscribe(f, app);
fixture.handleEMFEvent(n);
assertFalse("Get notified", app.isNotified());
}
public void testSimpleOrFilter2StageAndNot2(){
Notification n = new ENotificationImpl(null, 0, null, null, eObjectCls3);
EventFilter f = EventManagerFactory.eINSTANCE.createOrFilterFor(
EventManagerFactory.eINSTANCE.createOrFilterFor(
typeFilterAdd,
classFilterCls1),
EventManagerFactory.eINSTANCE.createOrFilterFor(
EventManagerFactory.eINSTANCE.createOrFilterFor(
oldValueFilterCls2,
EventManagerFactory.eINSTANCE.createNotFilter(newValueFilterCls3)),
featureFilterRef));
f = EventManagerFactory.eINSTANCE.createNotFilter(f);
fixture.subscribe(f, app);
fixture.handleEMFEvent(n);
assertTrue("Get not notified", app.isNotified());
}
public void testSimpleOrFilter2StageDoubleNot(){
Notification n = new ENotificationImpl(null, 0, null, null, eObjectCls3);
EventFilter f = EventManagerFactory.eINSTANCE.createOrFilterFor(
EventManagerFactory.eINSTANCE.createOrFilterFor(
typeFilterAdd,
classFilterCls1),
EventManagerFactory.eINSTANCE.createOrFilterFor(
EventManagerFactory.eINSTANCE.createOrFilterFor(
oldValueFilterCls2,
EventManagerFactory.eINSTANCE.createNotFilter(newValueFilterCls3)),
featureFilterRef));
f = EventManagerFactory.eINSTANCE.createNotFilter(f);
f = EventManagerFactory.eINSTANCE.createNotFilter(f);
fixture.subscribe(f, app);
fixture.handleEMFEvent(n);
assertFalse("Get notified", app.isNotified());
}
/**
* And for 2 identical expressions should get converted to one
*/
public void testDeMorgan1(){
EventFilter f = EventManagerFactory.eINSTANCE.createAndFilterFor(
EventManagerFactory.eINSTANCE.createNotFilter(
EventManagerFactory.eINSTANCE.createAndFilterFor(
newValueFilterCls3,
oldValueFilterCls2)),
EventManagerFactory.eINSTANCE.createOrFilterFor(
EventManagerFactory.eINSTANCE.createNotFilter(
newValueFilterCls3
),
EventManagerFactory.eINSTANCE.createNotFilter(
oldValueFilterCls2
))
);
f = EventManagerFactory.eINSTANCE.createNotFilter(f);
fixture.subscribe(f, app);
Notification n = new ENotificationImpl(null, 0, null, null, eObjectCls3);
fixture.handleEMFEvent(n);
Notification n3 = new ENotificationImpl(null, 0, null, eObjectCls2, null);
fixture.handleEMFEvent(n3);
assertFalse("Get notified",app.isNotified());
Notification n4 = new ENotificationImpl(null, 0, null, eObjectCls2, eObjectCls3);
fixture.handleEMFEvent(n4);
assertTrue("Did not get notified",app.isNotified());
}
/**
* And for 2 identical expressions should get converted to one
*/
public void testDeMorgan2(){
EventFilter f = EventManagerFactory.eINSTANCE.createAndFilterFor(
EventManagerFactory.eINSTANCE.createNotFilter(
EventManagerFactory.eINSTANCE.createOrFilterFor(
newValueFilterCls3,
oldValueFilterCls2)),
EventManagerFactory.eINSTANCE.createAndFilterFor(
EventManagerFactory.eINSTANCE.createNotFilter(
newValueFilterCls3
),
EventManagerFactory.eINSTANCE.createNotFilter(
oldValueFilterCls2
))
);
fixture.subscribe(f, app);
Notification n = new ENotificationImpl(null, 0, null, null, eObjectCls3);
fixture.handleEMFEvent(n);
Notification n3 = new ENotificationImpl(null, 0, null, eObjectCls2, null);
fixture.handleEMFEvent(n3);
Notification n4 = new ENotificationImpl(null, 0, null, eObjectCls2, eObjectCls3);
fixture.handleEMFEvent(n4);
assertFalse("Get notified",app.isNotified());
Notification n5 = new ENotificationImpl(null, 0, null, null, null);
fixture.handleEMFEvent(n5);
assertTrue("Did not get notified",app.isNotified());
}
/**
* Tautology
*/
public void testDeMorganTautology(){
EventFilter f = EventManagerFactory.eINSTANCE.createOrFilterFor(
EventManagerFactory.eINSTANCE.createOrFilterFor(
newValueFilterCls3,
oldValueFilterCls2),
EventManagerFactory.eINSTANCE.createAndFilterFor(
EventManagerFactory.eINSTANCE.createNotFilter(
newValueFilterCls3
),
EventManagerFactory.eINSTANCE.createNotFilter(
oldValueFilterCls2
))
);
fixture.subscribe(f, app);
Notification n = new ENotificationImpl(null, 0, null, null, eObjectCls3);
fixture.handleEMFEvent(n);
assertTrue("Did not get notified",app.isNotified());
app.reset();
Notification n3 = new ENotificationImpl(null, 0, null, eObjectCls2, null);
fixture.handleEMFEvent(n3);
assertTrue("Did not get notified",app.isNotified());
app.reset();
Notification n4 = new ENotificationImpl(null, 0, null, eObjectCls2, eObjectCls3);
fixture.handleEMFEvent(n4);
assertTrue("Did not get notified",app.isNotified());
app.reset();
Notification n5 = new ENotificationImpl(null, 0, null, null, null);
fixture.handleEMFEvent(n5);
assertTrue("Did not get notified",app.isNotified());
}
/**
* Check that negated filters has the same influence as normal
*/
public void testPriorityOfNegatedFilters(){
EventFilter f = EventManagerFactory.eINSTANCE.createAndFilterFor(
classFilterCls1,
EventManagerFactory.eINSTANCE.createNotFilter(newValueFilterCls3));
fixture.subscribe(f, app);
Notification n = new ENotificationImpl(null, 0, null, null, eObjectCls3);
fixture.handleEMFEvent(n);
assertFalse("Erroneously got notified",app.isNotified());
app.reset();
Notification n2 = new ENotificationImpl(eObjectCls1, 0, null, null, eObjectCls2);
fixture.handleEMFEvent(n2);
assertTrue("Did not get notified",app.isNotified());
app.reset();
Notification n3 = new ENotificationImpl(eObjectCls1, 0, null, null, eObjectCls3);
fixture.handleEMFEvent(n3);
assertFalse("Erroneously got notified",app.isNotified());
app.reset();
Notification n4 = new ENotificationImpl(null, 0, null, null, null);
fixture.handleEMFEvent(n4);
assertFalse("Erroneously got notified",app.isNotified());
}
/**
* Check that negated filters has the same influence as normal
*/
public void testPriorityOfNegatedFiltersReversed(){
EventFilter f = EventManagerFactory.eINSTANCE.createAndFilterFor(
EventManagerFactory.eINSTANCE.createNotFilter(classFilterCls1),
newValueFilterCls3);
fixture.subscribe(f, app);
Notification n = new ENotificationImpl(null, 0, null, null, eObjectCls3);
fixture.handleEMFEvent(n);
assertTrue("Did not get notified",app.isNotified());
app.reset();
Notification n2 = new ENotificationImpl(eObjectCls1, 0, null, null, eObjectCls2);
fixture.handleEMFEvent(n2);
assertFalse("Erroneously got notified",app.isNotified());
app.reset();
Notification n3 = new ENotificationImpl(eObjectCls1, 0, null, null, eObjectCls3);
fixture.handleEMFEvent(n3);
assertFalse("Erroneously got notified",app.isNotified());
app.reset();
Notification n4 = new ENotificationImpl(null, 0, null, null, null);
fixture.handleEMFEvent(n4);
assertFalse("Erroneously got notified",app.isNotified());
}
/**
* Tests whether two filters of the same type in an And get handled correctly
*/
public void testAndForSameFilterType(){
EventFilter f = EventManagerFactory.eINSTANCE.createAndFilterFor(
EventManagerFactory.eINSTANCE.createClassFilter(eClass1),
EventManagerFactory.eINSTANCE.createClassFilter(eClass2));
fixture.subscribe(f, app);
Notification n = new ENotificationImpl(eObjectCls1, 0, null, null, null);
fixture.handleEMFEvent(n);
assertFalse("Erroneously got notified",app.isNotified());
app.reset();
Notification n3 = new ENotificationImpl(eObjectCls2, 0, null, null, null);
fixture.handleEMFEvent(n3);
assertFalse("Erroneously got notified",app.isNotified());
app.reset();
Notification n6 = new ENotificationImpl(null, 0, null, null, null);
fixture.handleEMFEvent(n6);
assertFalse("Erroneously got notified",app.isNotified());
}
/**
* Tests the behavior for a simple contradiction with the same filter once not and once negated
*/
public void testSimpleContradiction(){
EventFilter f = EventManagerFactory.eINSTANCE.createAndFilterFor(
newValueFilterCls3,
EventManagerFactory.eINSTANCE.createNotFilter(newValueFilterCls3));
fixture.subscribe(f, app);
Notification n3 = new ENotificationImpl(null, 0, null, null, eObjectCls2);
fixture.handleEMFEvent(n3);
assertFalse("Erroneously got notified",app.isNotified());
app.reset();
Notification n6 = new ENotificationImpl(null, 0, null, null, eObjectCls3);
fixture.handleEMFEvent(n6);
assertFalse("Erroneously got notified",app.isNotified());
}
/**
* Contradiction
*/
public void testDeMorganContradiction(){
EventFilter f = EventManagerFactory.eINSTANCE.createAndFilterFor(
EventManagerFactory.eINSTANCE.createOrFilterFor(
newValueFilterCls3,
oldValueFilterCls2),
EventManagerFactory.eINSTANCE.createAndFilterFor(
EventManagerFactory.eINSTANCE.createNotFilter(newValueFilterCls3),
EventManagerFactory.eINSTANCE.createNotFilter(oldValueFilterCls2)));
fixture.subscribe(f, app);
Notification n3 = new ENotificationImpl(null, 0, null, eObjectCls2, null);
fixture.handleEMFEvent(n3);
assertFalse("Erroneously got notified",app.isNotified());
app.reset();
Notification n4 = new ENotificationImpl(null, 0, null, eObjectCls2, eObjectCls3);
fixture.handleEMFEvent(n4);
assertFalse("Erroneously got notified",app.isNotified());
app.reset();
Notification n5 = new ENotificationImpl(null, 0, null, eObjectCls3, eObjectCls2);
fixture.handleEMFEvent(n5);
assertFalse("Erroneously got notified",app.isNotified());
app.reset();
Notification n6 = new ENotificationImpl(null, 0, null, null, null);
fixture.handleEMFEvent(n6);
assertFalse("Erroneously got notified",app.isNotified());
}
public void testDisjunctiveConversion(){
EventFilter f = EventManagerFactory.eINSTANCE.createOrFilterFor(
EventManagerFactory.eINSTANCE.createNotFilter(
EventManagerFactory.eINSTANCE.createAndFilterFor(
newValueFilterCls3,
oldValueFilterCls2)),
newValueFilterCls3
);
fixture.subscribe(f, app);
boolean notNotfied = false;
Notification n = new ENotificationImpl(null, 0, null, null, eObjectCls3);
fixture.handleEMFEvent(n);
notNotfied = notNotfied || !app.isNotified();
Notification n3 = new ENotificationImpl(null, 0, null, eObjectCls2, null);
fixture.handleEMFEvent(n3);
notNotfied = notNotfied || !app.isNotified();
Notification n4 = new ENotificationImpl(null, 0, null, null, null);
fixture.handleEMFEvent(n4);
notNotfied = notNotfied || !app.isNotified();
assertFalse("Did not get notified", notNotfied);
}
}