/** * Copyright (c) 2009 itemis AG (http://www.itemis.eu) 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.codegen.ecore.xtext; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import java.util.Collections; import java.util.Map; import org.eclipse.emf.codegen.ecore.genmodel.GenClass; import org.eclipse.emf.codegen.ecore.genmodel.GenModel; import org.eclipse.emf.codegen.ecore.genmodel.GenModelFactory; import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage; import org.eclipse.emf.codegen.ecore.xtext.GenModelRuntimeModule; 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.EcorePackage; import org.eclipse.emf.ecore.plugin.EcorePlugin; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl; import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl; import org.eclipse.xtext.naming.IQualifiedNameConverter; import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.resource.IEObjectDescription; import org.eclipse.xtext.resource.IResourceDescription; import org.eclipse.xtext.resource.generic.GenericResourceDescriptionManager; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.google.common.collect.Maps; import com.google.inject.Guice; import com.google.inject.Injector; /** * @author Sven Efftinge - Initial contribution and API * @author Jan Koehnlein */ public class GenModelResourceDescriptionManagerTest { private GenericResourceDescriptionManager testMe; private IQualifiedNameConverter converter; private Resource ecoreGenModel; @Before public void setUp() throws Exception { Injector injector = Guice.createInjector(new GenModelRuntimeModule()); testMe = injector.getInstance(GenericResourceDescriptionManager.class); converter = injector.getInstance(IQualifiedNameConverter.class); URI genmodelURI = URI.createURI(EcorePlugin.INSTANCE.getBaseURL().toExternalForm() + "model/Ecore.genmodel"); GenModelPackage.eINSTANCE.eClass(); ResourceSetImpl resourceSet = new ResourceSetImpl(); resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put( Resource.Factory.Registry.DEFAULT_EXTENSION, new EcoreResourceFactoryImpl()); ecoreGenModel = resourceSet.getResource(genmodelURI, true); assertNotNull(ecoreGenModel); } @After public void tearDown() throws Exception { testMe = null; converter = null; ecoreGenModel = null; } @Test public void testEcoreGenModel() throws Exception { Map<QualifiedName, IEObjectDescription> index = createIndex(ecoreGenModel); getAndCheckEntry(index, GenModelPackage.Literals.GEN_PACKAGE, "org.eclipse.emf.ecore"); IEObjectDescription description = getAndCheckEntry(index, GenModelPackage.Literals.GEN_CLASS, "org.eclipse.emf.ecore.EClass"); GenClass genClass = (GenClass)description.getEObjectOrProxy(); assertEquals(EcorePackage.Literals.ECLASS.getName(), genClass.getEcoreClass().getName()); // abstract types are available, too getAndCheckEntry(index, GenModelPackage.Literals.GEN_CLASS, "org.eclipse.emf.ecore.EClassifier"); // GenStructuralFeatures are not indexed assertNoEntry(index, "org.eclipse.emf.ecore.EClassifier.defaultValue"); assertNoEntry(index, "org.eclipse.emf.ecore.EClassifier.getDefaultValue"); assertNoEntry(index, "org.eclipse.emf.ecore.EClassifier.DefaultValue"); } @Test public void testNestedPackage() throws Exception { Resource ecoreResource = new XMIResourceImpl(); Resource genmodelResource = new XMIResourceImpl(); EPackage parent = EcoreFactory.eINSTANCE.createEPackage(); parent.setName("parent"); parent.setNsURI("http://parent"); EPackage child = EcoreFactory.eINSTANCE.createEPackage(); child.setName("child"); child.setNsURI("http://child"); EClass eClass = EcoreFactory.eINSTANCE.createEClass(); eClass.setName("Test"); child.getEClassifiers().add(eClass); parent.getESubpackages().add(child); ecoreResource.getContents().add(parent); GenModel genModel = GenModelFactory.eINSTANCE.createGenModel(); genModel.initialize(Collections.singleton(parent)); genmodelResource.getContents().add(genModel); genModel.initialize(true); genModel.getGenPackages().get(0).setBasePackage("org.foo.bar"); genModel.getGenPackages().get(0).getNestedGenPackages().get(0).setBasePackage("org.foo.zonk"); Map<QualifiedName, IEObjectDescription> index = createIndex(genmodelResource); getAndCheckEntry(index, GenModelPackage.Literals.GEN_PACKAGE, "org.foo.bar.parent"); getAndCheckEntry(index, GenModelPackage.Literals.GEN_PACKAGE, "org.foo.zonk.child"); getAndCheckEntry(index, GenModelPackage.Literals.GEN_CLASS, "org.foo.zonk.child.Test"); assertEquals(3, index.size()); } protected IEObjectDescription getAndCheckEntry(Map<QualifiedName, IEObjectDescription> index, EClass expectedType, String name) { IEObjectDescription element = index.get(converter.toQualifiedName(name)); assertNotNull(element); assertSame(expectedType, element.getEClass()); return element; } protected void assertNoEntry(Map<QualifiedName, IEObjectDescription> index, String name) { IEObjectDescription element = index.get(converter.toQualifiedName(name)); assertNull(element); } protected Map<QualifiedName, IEObjectDescription> createIndex(Resource ecoreResoure) { IResourceDescription description = testMe.getResourceDescription(ecoreResoure); Map<QualifiedName, IEObjectDescription> index = Maps.newHashMap(); for (IEObjectDescription ieObjectDescription : description.getExportedObjects()) { index.put(ieObjectDescription.getName(), ieObjectDescription); } return index; } }