/** * Copyright (c) 2015 Eclipse contributors 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 */ package org.eclipse.emf.test.core.ecore; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EPackage; 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.EContentAdapter; import org.eclipse.emf.ecore.util.EcoreUtil; import org.junit.Before; import org.junit.Test; public class EContentAdapterTest { private ResourceSet resourceSet; private Resource rootResource; private Resource childResource; private EPackage ePackage; private EClass eClass; @Before public void setup() { resourceSet = new ResourceSetImpl(); rootResource = resourceSet.createResource(URI.createFileURI("Root.ecore")); childResource = resourceSet.createResource(URI.createFileURI("Child.ecore")); ePackage = EcoreFactory.eINSTANCE.createEPackage(); ePackage.setName("MyPackage"); ePackage.setNsPrefix("my_package"); eClass = EcoreFactory.eINSTANCE.createEClass(); rootResource.getContents().add(ePackage); childResource.getContents().add(eClass); resourceSet.eAdapters().add(new EContentAdapter()); } @Test public void testAddingAlreadyAdaptedObjectToCrossContainmentReference() { EList<Adapter> eAdapters = eClass.eAdapters(); int size = eAdapters.size(); ePackage.getEClassifiers().add(eClass); int expectedSize = eAdapters.size(); assertEquals("No additional EContentAdapter is expected", expectedSize, size); } @Test public void testRemovingStillAdaptedObjectFromCrossContainmentReference() { ePackage.getEClassifiers().add(eClass); EList<Adapter> eAdapters = eClass.eAdapters(); int expectedSize = eAdapters.size(); ePackage.getEClassifiers().add(eClass); int size = eAdapters.size(); assertEquals("No removal of EContentAdapter is expected", expectedSize, size); } @Test public void testAddingAlreadyAdaptedObjectToResourceContents() { EList<Adapter> eAdapters = eClass.eAdapters(); int expectedSize = eAdapters.size(); childResource.getContents().remove(eClass); int size = eAdapters.size(); assertEquals("Removal of EContentAdapter is expected", expectedSize - 1, size); ePackage.getEClassifiers().add(eClass); size = eAdapters.size(); assertEquals("Addition of EContentAdapter is expected", expectedSize, size); childResource.getContents().add(eClass); size = eAdapters.size(); assertEquals("No additional EContentAdapter is expected", expectedSize, size); } @Test public void testRemovingStillAdaptedObjectFromResourceContents() { ePackage.getEClassifiers().add(eClass); EList<Adapter> eAdapters = eClass.eAdapters(); int expectedSize = eAdapters.size(); childResource.getContents().remove(eClass); int size = eAdapters.size(); assertEquals("No removal of EContentAdapter is expected", expectedSize, size); } @Test public void testRemovingStillAdaptedObjectFromCrossContainmentReferenceAndResourceContents() { ePackage.getEClassifiers().add(eClass); EList<Adapter> eAdapters = eClass.eAdapters(); int expectedSize = eAdapters.size(); ePackage.getEClassifiers().remove(eClass); childResource.getContents().remove(eClass); int size = eAdapters.size(); assertEquals("No removal of EContentAdapter is expected", expectedSize - 1, size); } @Test public void testProxyResolve() { EList<Adapter> eAdapters = eClass.eAdapters(); int expectedSize = eAdapters.size(); EClass proxyEClass = EcoreFactory.eINSTANCE.createEClass(); proxyEClass.getESuperTypes(); ((InternalEObject)proxyEClass).eSetProxyURI(EcoreUtil.getURI(eClass)); EList<Adapter> proxyEAdapters = proxyEClass.eAdapters(); int expectedProxySize = proxyEAdapters.size(); ePackage.getEClassifiers().add(proxyEClass); assertTrue("Added proxy is still a proxy", proxyEClass.eIsProxy()); int proxySize = proxyEAdapters.size(); assertEquals("One EContentAdapter is expected", expectedProxySize + 1, proxySize); // Resolve the proxy. ePackage.getEClassifiers().get(0); proxySize = proxyEAdapters.size(); assertEquals("No EContentAdapter is expected", expectedProxySize, proxySize); int size = eAdapters.size(); assertEquals("One EContentAdapter is expected", expectedSize, size); } @Test public void testRemoveContentAdapter() { EList<Adapter> childResourceEAdapters = childResource.eAdapters(); ePackage.getEClassifiers().add(eClass); EList<Adapter> eAdapters = eClass.eAdapters(); int expectedSize = eAdapters.size(); resourceSet.eAdapters().clear(); assertEquals("No EContentAdapter is expected", expectedSize-1, eAdapters.size()); assertEquals("No EContentAdapter is expected", 0, childResourceEAdapters.size()); } @Test public void testRemoveResource() { EList<Adapter> childResourceEAdapters = childResource.eAdapters(); ePackage.getEClassifiers().add(eClass); EList<Adapter> eAdapters = eClass.eAdapters(); int expectedSize = eAdapters.size(); resourceSet.getResources().remove(childResource); assertEquals("One EContentAdapter is expected", expectedSize, eAdapters.size()); assertEquals("No EContentAdapter is expected", 0, childResourceEAdapters.size()); } }