/******************************************************************************* * Copyright (c) 2009, 2011 SAP AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * SAP AG - initial API and implementation ******************************************************************************/ package org.eclipse.ocl.examples.eventmanager.tests.framework; import junit.framework.TestCase; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.impl.AdapterImpl; 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.InternalEObject; import org.eclipse.emf.ecore.impl.DynamicEObjectImpl; import org.eclipse.emf.ecore.impl.ENotificationImpl; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceImpl; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.ocl.examples.eventmanager.EventFilter; import org.eclipse.ocl.examples.eventmanager.EventManager; import org.eclipse.ocl.examples.eventmanager.EventManagerFactory; public class IncludeSubclassesTest extends TestCase { private ResourceSet set; class App extends AdapterImpl{ public boolean noti = false; @Override public void notifyChanged(Notification msg) { this.noti =true; } } @Override public void setUp() { try { super.setUp(); } catch (Exception e) { /*...*/ } set = new ResourceSetImpl(); Resource r = new ResourceImpl(); set.getResources().add(r); } @Override public void tearDown() { set = null; try { super.tearDown(); } catch (Exception e) { /*...*/ } } public void testIncludingSubclassesFilterElementInsertionClassGetClass(){ EventManager m = EventManagerFactory.eINSTANCE.createEventManagerFor(set); EClass cls = EcoreFactory.eINSTANCE.createEClass(); EventFilter filter = EventManagerFactory.eINSTANCE.createFilterForElementInsertion(cls); EReference ref = EcoreFactory.eINSTANCE.createEReference(); ref.setContainment(true); Notification noti = new ENotificationImpl(null, Notification.SET, ref, null, new DynamicEObjectImpl(cls)); App app = new App(); m.subscribe(filter, app); m.handleEMFEvent(noti); assertTrue("Application not notified",app.noti); app.noti= false; EList<Adapter> eAdapters = set.getResources().get(0).eAdapters(); for(int i = 0; i< eAdapters.size(); i++){ eAdapters.get(i).notifyChanged(noti); } assertTrue("Application not notified",app.noti); } public void testIncludingSubclassesFilterElementInsertionClassGetSubclass(){ EventManager m = EventManagerFactory.eINSTANCE.createEventManagerFor(set); EClass cls = EcoreFactory.eINSTANCE.createEClass(); EClass subcls = EcoreFactory.eINSTANCE.createEClass(); subcls.getESuperTypes().add(cls); EventFilter filter = EventManagerFactory.eINSTANCE.createFilterForElementInsertion(cls); EReference ref = EcoreFactory.eINSTANCE.createEReference(); ref.setContainment(true); Notification noti = new ENotificationImpl(null, Notification.SET, ref, null, new DynamicEObjectImpl(subcls)); App app = new App(); m.subscribe(filter, app); m.handleEMFEvent(noti); assertTrue("Application not notified",app.noti); app.noti= false; EList<Adapter> eAdapters = set.getResources().get(0).eAdapters(); for(int i = 0; i< eAdapters.size(); i++){ eAdapters.get(i).notifyChanged(noti); } assertTrue("Application not notified",app.noti); } public void testDoubleSubscriptionExpectSubclassButNoSuperClass(){ EventManager m = EventManagerFactory.eINSTANCE.createEventManagerFor(set); EClass classA = EcoreFactory.eINSTANCE.createEClass(); EClass classB = EcoreFactory.eINSTANCE.createEClass(); classB.getESuperTypes().add(classA); EventFilter filter = EventManagerFactory.eINSTANCE.createAndFilterFor( EventManagerFactory.eINSTANCE.createNotFilter( EventManagerFactory.eINSTANCE.createClassFilterIncludingSubclasses(classA) ), EventManagerFactory.eINSTANCE.createClassFilterIncludingSubclasses(classB)); App app = new App(); m.subscribe(filter, app); EObject object = new DynamicEObjectImpl(classB); Notification noti = new ENotificationImpl((InternalEObject)object, 0, null, null, null); m.handleEMFEvent(noti); m.unsubscribe(app); EObject object2 = new DynamicEObjectImpl(classA); Notification noti2 = new ENotificationImpl((InternalEObject)object2, 0, null, null, null); App app2 = new App(); m.subscribe(filter, app2); m.handleEMFEvent(noti2); assertFalse("Application wrongly notified",app2.noti); m.unsubscribe(app2); Notification noti3 = new ENotificationImpl(null, 0, null, null, null); App app3 = new App(); m.subscribe(filter, app3); m.handleEMFEvent(noti3); assertFalse("Application wrongly notified",app3.noti); m.unsubscribe(app3); } public void testDoubleSubscriptionExpectSuperclassButNoSubClass(){ EventManager m = EventManagerFactory.eINSTANCE.createEventManagerFor(set); EClass classA = EcoreFactory.eINSTANCE.createEClass(); EClass classB = EcoreFactory.eINSTANCE.createEClass(); classB.getESuperTypes().add(classA); EventFilter filter = EventManagerFactory.eINSTANCE.createAndFilterFor( EventManagerFactory.eINSTANCE.createNotFilter( EventManagerFactory.eINSTANCE.createClassFilterIncludingSubclasses(classB) ), EventManagerFactory.eINSTANCE.createClassFilterIncludingSubclasses(classA)); App app = new App(); m.subscribe(filter, app); EObject object = new DynamicEObjectImpl(classB); Notification noti = new ENotificationImpl((InternalEObject)object, 0, null, null, null); m.handleEMFEvent(noti); m.unsubscribe(app); EObject object2 = new DynamicEObjectImpl(classA); Notification noti2 = new ENotificationImpl((InternalEObject)object2, 0, null, null, null); App app2 = new App(); m.subscribe(filter, app2); m.handleEMFEvent(noti2); assertTrue("Application not notified",app2.noti); m.unsubscribe(app2); Notification noti3 = new ENotificationImpl(null, 0, null, null, null); App app3 = new App(); m.subscribe(filter, app3); m.handleEMFEvent(noti3); assertFalse("Application wrongly notified",app3.noti); m.unsubscribe(app3); } public void testNegatedSubscriptionClassANotificationSubclassB(){ EventManager m = EventManagerFactory.eINSTANCE.createEventManagerFor(set); EClass classA = EcoreFactory.eINSTANCE.createEClass(); EClass classB = EcoreFactory.eINSTANCE.createEClass(); classB.getESuperTypes().add(classA); EventFilter filter =EventManagerFactory.eINSTANCE.createNotFilter( EventManagerFactory.eINSTANCE.createClassFilterIncludingSubclasses(classA)); App app = new App(); m.subscribe(filter, app); EObject object = new DynamicEObjectImpl(classB); Notification noti = new ENotificationImpl((InternalEObject)object, 0, null, null, null); m.handleEMFEvent(noti); m.unsubscribe(app); assertFalse("Get wrongly notified", app.noti); } }