/**
* Copyright (c) 2011-2012 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.ecore.xcore.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.GlobalRegistries;
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<XtextResourceSet> resourceSetProvider;
public static class MyXcoreInjectorProvider extends XcoreInjectorProvider
{
private Injector injector;
@Override
public Injector getInjector()
{
if (injector == null)
{
stateBeforeInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
this.injector =
new XcoreStandaloneSetup()
{
@Override
public Injector createInjector()
{
return Guice.createInjector(new org.eclipse.emf.ecore.xcore.XcoreRuntimeModule()
{
@Override
public Class<? extends XtextResource> bindXtextResource()
{
return InspectableXcoreResource.class;
}
});
}
}.createInjectorAndDoEMFRegistration();
stateAfterInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
}
return injector;
}
@Override
public void setupRegistry()
{
super.setupRegistry();
if (injector != null)
{
new XcoreStandaloneSetup().register(injector);
}
}
}
public static class InspectableXcoreResource extends XcoreResource
{
public EList<EObject> getContentsUnsafe()
{
return contents;
}
public boolean isFullyInitialized()
{
return fullyInitialized;
}
}
@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());
assertFalse(((InspectableXcoreResource)resource).isFullyInitialized());
}
@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());
assertFalse(((InspectableXcoreResource)resource).isFullyInitialized());
}
@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());
assertTrue(((InspectableXcoreResource)resource).isFullyInitialized());
}
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<IEObjectDescription> eclass = resourceDescription.getExportedObjectsByType(EcorePackage.Literals.ECLASS).iterator();
Iterator<IEObjectDescription> genclass = resourceDescription.getExportedObjectsByType(GenModelPackage.Literals.GEN_CLASS).iterator();
Iterator<IEObjectDescription> 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());
assertFalse(resource.isFullyInitialized());
}
}