/** * Copyright (c) 2004 IBM Corporation 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: * IBM - Initial API and implementation */ package org.eclipse.emf.test.core.ecore; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.Collections; import java.util.List; 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.notify.impl.DelegatingNotifyingListImpl; import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.ETypedElement; import org.eclipse.emf.ecore.EcoreFactory; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl; import org.junit.Test; public class ListTest { private int notificationCount; /* * bugzilla 76290 */ @Test public void testRemoveAllNotUnique() { List<String> list = new DelegatingNotifyingListImpl<String>() { private static final long serialVersionUID = 1L; List<String> delegateList = new BasicEList<String>(); @Override public boolean isUnique() { return false; } @Override public boolean isNotificationRequired() { return true; } @Override public void dispatchNotification(Notification notification) { // Ignore } @Override protected List<String> delegateList() { return delegateList; } }; list.add("a"); list.add("b"); list.add("a"); list.add("c"); assertEquals(4, list.size()); assertEquals("a", list.get(0)); assertEquals("a", list.get(2)); list.removeAll(Collections.singleton("a")); assertEquals(2, list.size()); list.removeAll(Collections.EMPTY_LIST); assertEquals(2, list.size()); } @Test public void testRemoveAllProxy() { ResourceSet resourceSet = new ResourceSetImpl(); resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("ecore", new EcoreResourceFactoryImpl()); Resource resourceA= resourceSet.createResource(URI.createURI("http:///A.ecore")); EPackage ePackageA = EcoreFactory.eINSTANCE.createEPackage(); EClass eClassA = EcoreFactory.eINSTANCE.createEClass(); eClassA.setName("A"); ePackageA.getEClassifiers().add(eClassA); resourceA.getContents().add(ePackageA); Resource resourceB = resourceSet.createResource(URI.createURI("http:///B.ecore")); EPackage ePackageB = EcoreFactory.eINSTANCE.createEPackage(); EClass eClassB = EcoreFactory.eINSTANCE.createEClass(); eClassB.setName("B"); ePackageB.getEClassifiers().add(eClassB); resourceB.getContents().add(ePackageB); EClass eClassProxyA = EcoreFactory.eINSTANCE.createEClass(); ((InternalEObject)eClassProxyA).eSetProxyURI(EcoreUtil.getURI(eClassA)); eClassB.getESuperTypes().add(eClassProxyA); eClassB.getESuperTypes().remove(eClassA); assertEquals(true, eClassB.getESuperTypes().isEmpty()); eClassB.getESuperTypes().add(eClassProxyA); eClassB.getESuperTypes().removeAll(Collections.singleton(eClassA)); assertEquals(true, eClassB.getESuperTypes().isEmpty()); EClass eClassC = EcoreFactory.eINSTANCE.createEClass(); ePackageB.getEClassifiers().add(eClassC); eClassC.getESuperTypes().add(eClassProxyA); eClassC.getESuperTypes().removeAll(Collections.singleton(eClassA)); assertEquals(true, eClassC.getESuperTypes().isEmpty()); } /* * bugzilla 76290 */ @Test public void testDynamicModel() { EPackage pack = EcoreFactory.eINSTANCE.createEPackage(); EClass city = EcoreFactory.eINSTANCE.createEClass(); city.setName("City"); pack.getEClassifiers().add(city); EClass person = EcoreFactory.eINSTANCE.createEClass(); person.setName("Person"); pack.getEClassifiers().add(person); final EReference trips = EcoreFactory.eINSTANCE.createEReference(); trips.setName("trips"); trips.setEType(city); trips.setContainment(false); trips.setUnique(false); trips.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY); person.getEStructuralFeatures().add(trips); final EObject ny = pack.getEFactoryInstance().create(city); final EObject paris = pack.getEFactoryInstance().create(city); final EObject rio = pack.getEFactoryInstance().create(city); EObject john = pack.getEFactoryInstance().create(person); @SuppressWarnings("unchecked") List<EObject> johnTrips = (List<EObject>)john.eGet(trips); johnTrips.add(paris); johnTrips.add(ny); johnTrips.add(rio); johnTrips.add(paris); johnTrips.add(ny); assertEquals(5, johnTrips.size()); assertEquals(ny, johnTrips.get(1)); assertEquals(ny, johnTrips.get(4)); assertEquals(paris, johnTrips.get(0)); assertEquals(paris, johnTrips.get(3)); Adapter adapter = new AdapterImpl() { @Override public void notifyChanged(Notification msg) { switch(notificationCount++) { case 0: { assertEquals(Notification.REMOVE_MANY, msg.getEventType()); assertEquals(trips, msg.getFeature()); assertTrue(msg.getOldValue() instanceof List<?>); assertEquals(1, msg.getPosition()); break; } case 1: { assertEquals(Notification.REMOVE, msg.getEventType()); assertEquals(trips, msg.getFeature()); assertEquals(paris, msg.getOldValue()); assertEquals(0, msg.getPosition()); break; } } } }; john.eAdapters().add(adapter); johnTrips.removeAll(Collections.singleton(ny)); assertEquals(3, johnTrips.size()); johnTrips.remove(paris); assertEquals(2, johnTrips.size()); assertEquals(paris, johnTrips.get(1)); assertEquals(2, notificationCount); } }