/** * */ package it.xsemantics.dsl.tests; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.xtext.generator.IGenerator; import org.eclipse.xtext.generator.InMemoryFileSystemAccess; import org.eclipse.xtext.junit4.util.ParseHelper; import org.eclipse.xtext.junit4.validation.ValidationTestHelper; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.util.IAcceptor; import org.eclipse.xtext.xbase.compiler.CompilationTestHelper; import com.google.common.collect.Lists; import com.google.inject.Inject; /** * A custom helper since we generate two classes for each input file. * * @author Lorenzo Bettini * */ public class XsemanticsCompilationTestHelper extends CompilationTestHelper { @Inject private XsemanticsOnTheFlyJavaCompiler javaCompiler; @Inject private ParseHelper<EObject> parseHelper; @Inject private ValidationTestHelper validationTestHelper; @Inject private IGenerator generator; /** * A result contains information about various aspects of a compiled piece of code. * */ public static interface Result { /** * @return the loaded, validated and fully linked source resource */ Resource getSource(); /** * Compile all Java sources generated for a resource */ void compileToJava(); /** * @return access to all generated artifacts. The key points to the pathesa dn the values are the generated code. */ Map<String,CharSequence> getAllGeneratedResources(); } public void compileAll(CharSequence source, IAcceptor<Result> acceptor) { try { compileAll(parseHelper.parse(source), acceptor); } catch (Exception e) { throw new RuntimeException(e); } } public void compileAll(final EObject parsed, IAcceptor<Result> acceptor) { validationTestHelper.assertNoErrors(parsed); final InMemoryFileSystemAccess access = new InMemoryFileSystemAccess(); ResourceSet resourceSet = parsed.eResource().getResourceSet(); for (Resource resource : Lists.newArrayList(resourceSet.getResources())) { if (resource instanceof XtextResource) { generator.doGenerate(resource, access); } } acceptor.accept(new Result() { public Resource getSource() { return parsed.eResource(); } public void compileToJava() { Map<String, String> toCompile = new HashMap<String, String>(); for (final Entry<String, CharSequence> e : access.getTextFiles().entrySet()) { String name = e.getKey().substring( "DEFAULT_OUTPUT".length(), e.getKey().length() - ".java".length()); name = name.replace('/', '.'); toCompile.put(name, e.getValue().toString()); } javaCompiler.compileAll(toCompile); } public Map<String, CharSequence> getAllGeneratedResources() { return access.getTextFiles(); } }); } }