package org.eclipse.emf.ecore.xcore.tests.scoping; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.Iterator; import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.xcore.XcoreInjectorProvider; import org.eclipse.emf.ecore.xcore.XcoreStandaloneSetup; import org.eclipse.emf.ecore.xcore.resource.XcoreResource; import org.eclipse.xtext.common.types.TypesPackage; import org.eclipse.xtext.junit4.InjectWith; import org.eclipse.xtext.junit4.XtextRunner; import org.eclipse.xtext.resource.IEObjectDescription; import org.eclipse.xtext.resource.IResourceDescription; import org.eclipse.xtext.resource.IResourceDescription.Manager; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.resource.XtextResourceSet; import org.eclipse.xtext.util.StringInputStream; import org.junit.Test; import org.junit.runner.RunWith; import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Provider; @RunWith(XtextRunner.class) @InjectWith(LazyGenmodelInferenceTest.MyXcoreInjectorProvider.class) public class LazyGenmodelInferenceTest { @Inject private Provider resourceSetProvider; public static class MyXcoreInjectorProvider extends XcoreInjectorProvider { private Injector injector; @Override public Injector getInjector() { if (injector == null) { this.injector = new XcoreStandaloneSetup() { @Override public Injector createInjector() { return Guice.createInjector(new org.eclipse.emf.ecore.xcore.XcoreRuntimeModule() { public Class bindXtextResource() { return InspectableXcoreResource.class; } }); } }.createInjectorAndDoEMFRegistration(); } return injector; } @Override public void setupRegistry() { super.setupRegistry(); if (injector != null) { new XcoreStandaloneSetup().register(injector); } } } public static class InspectableXcoreResource extends XcoreResource { public EList getContentsUnsafe() { return contents; } } @Test public void testSetup() { XtextResourceSet resourceSet = resourceSetProvider.get(); Resource resource = resourceSet.createResource(URI.createURI("foo.xcore")); assertTrue(resource.toString(), resource instanceof InspectableXcoreResource); assertNull(((InspectableXcoreResource)resource).getContentsUnsafe()); } @Test public void testContentsWithoutDerived() throws IOException { XtextResourceSet resourceSet = resourceSetProvider.get(); Resource resource = resourceSet.createResource(URI.createURI("foo.xcore")); resource.load(new StringInputStream("package foo.bar class Baz {}"), null); assertEquals(1, ((InspectableXcoreResource)resource).getContentsUnsafe().size()); } @Test public void testContentsWithDerived() throws IOException { XtextResourceSet resourceSet = resourceSetProvider.get(); Resource resource = resourceSet.createResource(URI.createURI("foo.xcore")); resource.load(new StringInputStream("package foo.bar class Baz {}"), null); assertTrue(1 < resource.getContents().size()); } public void testResourceDescriptionManagerDoesNotResolve() throws IOException { XtextResourceSet resourceSet = resourceSetProvider.get(); InspectableXcoreResource resource = (InspectableXcoreResource) resourceSet.createResource(URI.createURI("foo.xcore")); resource.load(new StringInputStream("package foo.bar class Baz {}"), null); Manager manager = resource.getResourceServiceProvider().getResourceDescriptionManager(); IResourceDescription resourceDescription = manager.getResourceDescription(resource); Iterator eclass = resourceDescription.getExportedObjectsByType(EcorePackage.Literals.ECLASS) .iterator(); Iterator genclass = resourceDescription.getExportedObjectsByType( GenModelPackage.Literals.GEN_CLASS).iterator(); Iterator jvmTypes = resourceDescription.getExportedObjectsByType( TypesPackage.Literals.JVM_GENERIC_TYPE).iterator(); final String expected = "foo.bar.Baz"; assertEquals(expected, eclass.next().getName().toString()); assertFalse(eclass.hasNext()); assertEquals(expected, genclass.next().getName().toString()); assertFalse(genclass.hasNext()); assertEquals(expected, jvmTypes.next().getName().toString()); assertEquals(expected + "Impl", jvmTypes.next().getName().toString()); assertFalse(genclass.hasNext()); assertEquals(1, resource.getContentsUnsafe().size()); } }