From 09d3a9aa1b77bc7247f90cc6b3868073d21b1fc4 Mon Sep 17 00:00:00 2001 From: Lorenzo Bettini Date: Thu, 7 May 2020 14:35:41 +0200 Subject: [PATCH] 130: compiler test with several files Task-Url: http://github.com/LorenzoBettini/edelta/issues/130 --- .../src/edelta/tests/EdeltaCompilerTest.xtend | 107 +++++++++- .../edelta/tests/EdeltaCompilerTest.java | 195 ++++++++++++++++++ 2 files changed, 301 insertions(+), 1 deletion(-) diff --git a/edelta.parent/edelta.tests/src/edelta/tests/EdeltaCompilerTest.xtend b/edelta.parent/edelta.tests/src/edelta/tests/EdeltaCompilerTest.xtend index 3c571dcb2..cea59d7c2 100644 --- a/edelta.parent/edelta.tests/src/edelta/tests/EdeltaCompilerTest.xtend +++ b/edelta.parent/edelta.tests/src/edelta/tests/EdeltaCompilerTest.xtend @@ -21,6 +21,7 @@ import org.junit.runner.RunWith import static edelta.testutils.EdeltaTestUtils.* import static extension org.junit.Assert.* +import java.util.List @RunWith(XtextRunner) @InjectWith(EdeltaInjectorProviderTestableDerivedStateComputer) @@ -1102,6 +1103,98 @@ class EdeltaCompilerTest extends EdeltaAbstractTest { ) } + @Test + def void testCompilationOfSeveralFilesWithUseAs() { + #[ + ''' + import org.eclipse.emf.ecore.EClass + import org.eclipse.emf.ecore.EcorePackage + + package test1 + + def enrichWithReference(EClass c, String prefix) : void { + c.addNewEReference(prefix + "Ref", + EcorePackage.eINSTANCE.EObject) + } + ''', + ''' + import org.eclipse.emf.ecore.EClass + import org.eclipse.emf.ecore.EcorePackage + import test1.MyFile0 + + package test2 + + use test1.MyFile0 as extension my + + def enrichWithAttribute(EClass c, String prefix) : void { + c.addNewEAttribute(prefix + "Attr", + EcorePackage.eINSTANCE.EString) + c.enrichWithReference(prefix) + } + ''', + ''' + import org.eclipse.emf.ecore.EClass + import test2.MyFile1 + + package test3 + + metamodel "foo" + + use test2.MyFile1 as extension my + + modifyEcore aModificationTest epackage foo { + ecoreref(FooClass) + .enrichWithAttribute("prefix") + // attribute and reference are added by the calls + // to external operations! + ecoreref(prefixAttr).changeable = true + ecoreref(prefixRef).containment = true + } + '''].checkCompilationOfSeveralFiles( + #[ + "test3.MyFile2" -> + ''' + package test3; + + import edelta.lib.AbstractEdelta; + import org.eclipse.emf.ecore.EPackage; + import org.eclipse.xtext.xbase.lib.Extension; + import test2.MyFile1; + + @SuppressWarnings("all") + public class MyFile2 extends AbstractEdelta { + @Extension + private MyFile1 my; + + public MyFile2() { + my = new MyFile1(this); + } + + public MyFile2(final AbstractEdelta other) { + super(other); + } + + public void aModificationTest(final EPackage it) { + this.my.enrichWithAttribute(getEClass("foo", "FooClass"), "prefix"); + getEAttribute("foo", "FooClass", "prefixAttr").setChangeable(true); + getEReference("foo", "FooClass", "prefixRef").setContainment(true); + } + + @Override + public void performSanityChecks() throws Exception { + ensureEPackageIsLoaded("foo"); + } + + @Override + protected void doExecute() throws Exception { + aModificationTest(getEPackage("foo")); + } + } + ''' + ] + ) + } + @Test def void testCompilationOfPersonListExampleModifyEcore() { val rs = createResourceSetWithEcore( @@ -1204,7 +1297,7 @@ class EdeltaCompilerTest extends EdeltaAbstractTest { val rs = createResourceSet(input) checkCompilation(rs, expectedGeneratedJava, checkValidationErrors) } - + private def void checkCompilation(ResourceSet rs, CharSequence expectedGeneratedJava, boolean checkValidationErrors) { rs.compile [ if (checkValidationErrors) { @@ -1219,6 +1312,18 @@ class EdeltaCompilerTest extends EdeltaAbstractTest { ] } + private def void checkCompilationOfSeveralFiles(List inputs, + List> expectations) { + createResourceSet(inputs).compile [ + assertNoValidationErrors + for (expectation : expectations) { + expectation.value.toString.assertEquals + (getGeneratedCode(expectation.key)) + } + assertGeneratedJavaCodeCompiles + ] + } + private def assertNoValidationErrors(Result it) { val allErrors = getErrorsAndWarnings.filter[severity == Severity.ERROR] if (!allErrors.empty) { diff --git a/edelta.parent/edelta.tests/xtend-gen/edelta/tests/EdeltaCompilerTest.java b/edelta.parent/edelta.tests/xtend-gen/edelta/tests/EdeltaCompilerTest.java index 5758f1b51..2f20d5e3a 100644 --- a/edelta.parent/edelta.tests/xtend-gen/edelta/tests/EdeltaCompilerTest.java +++ b/edelta.parent/edelta.tests/xtend-gen/edelta/tests/EdeltaCompilerTest.java @@ -7,6 +7,8 @@ import edelta.tests.EdeltaInjectorProviderTestableDerivedStateComputer; import edelta.testutils.EdeltaTestUtils; import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.xtend2.lib.StringConcatenation; import org.eclipse.xtext.diagnostics.Severity; @@ -2299,6 +2301,188 @@ public void testExecutionOfComplexOperationsWithSubPackages() { true); } + @Test + public void testCompilationOfSeveralFilesWithUseAs() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("import org.eclipse.emf.ecore.EClass"); + _builder.newLine(); + _builder.append("import org.eclipse.emf.ecore.EcorePackage"); + _builder.newLine(); + _builder.newLine(); + _builder.append("package test1"); + _builder.newLine(); + _builder.newLine(); + _builder.append("def enrichWithReference(EClass c, String prefix) : void {"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("c.addNewEReference(prefix + \"Ref\","); + _builder.newLine(); + _builder.append("\t\t"); + _builder.append("EcorePackage.eINSTANCE.EObject)"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("import org.eclipse.emf.ecore.EClass"); + _builder_1.newLine(); + _builder_1.append("import org.eclipse.emf.ecore.EcorePackage"); + _builder_1.newLine(); + _builder_1.append("import test1.MyFile0"); + _builder_1.newLine(); + _builder_1.newLine(); + _builder_1.append("package test2"); + _builder_1.newLine(); + _builder_1.newLine(); + _builder_1.append("use test1.MyFile0 as extension my"); + _builder_1.newLine(); + _builder_1.newLine(); + _builder_1.append("def enrichWithAttribute(EClass c, String prefix) : void {"); + _builder_1.newLine(); + _builder_1.append("\t"); + _builder_1.append("c.addNewEAttribute(prefix + \"Attr\","); + _builder_1.newLine(); + _builder_1.append("\t\t"); + _builder_1.append("EcorePackage.eINSTANCE.EString)"); + _builder_1.newLine(); + _builder_1.append("\t"); + _builder_1.append("c.enrichWithReference(prefix)"); + _builder_1.newLine(); + _builder_1.append("}"); + _builder_1.newLine(); + StringConcatenation _builder_2 = new StringConcatenation(); + _builder_2.append("import org.eclipse.emf.ecore.EClass"); + _builder_2.newLine(); + _builder_2.append("import test2.MyFile1"); + _builder_2.newLine(); + _builder_2.newLine(); + _builder_2.append("package test3"); + _builder_2.newLine(); + _builder_2.newLine(); + _builder_2.append("metamodel \"foo\""); + _builder_2.newLine(); + _builder_2.newLine(); + _builder_2.append("use test2.MyFile1 as extension my"); + _builder_2.newLine(); + _builder_2.newLine(); + _builder_2.append("modifyEcore aModificationTest epackage foo {"); + _builder_2.newLine(); + _builder_2.append("\t"); + _builder_2.append("ecoreref(FooClass)"); + _builder_2.newLine(); + _builder_2.append("\t\t"); + _builder_2.append(".enrichWithAttribute(\"prefix\")"); + _builder_2.newLine(); + _builder_2.append("\t"); + _builder_2.append("// attribute and reference are added by the calls"); + _builder_2.newLine(); + _builder_2.append("\t"); + _builder_2.append("// to external operations!"); + _builder_2.newLine(); + _builder_2.append("\t"); + _builder_2.append("ecoreref(prefixAttr).changeable = true"); + _builder_2.newLine(); + _builder_2.append("\t"); + _builder_2.append("ecoreref(prefixRef).containment = true"); + _builder_2.newLine(); + _builder_2.append("}"); + _builder_2.newLine(); + StringConcatenation _builder_3 = new StringConcatenation(); + _builder_3.append("package test3;"); + _builder_3.newLine(); + _builder_3.newLine(); + _builder_3.append("import edelta.lib.AbstractEdelta;"); + _builder_3.newLine(); + _builder_3.append("import org.eclipse.emf.ecore.EPackage;"); + _builder_3.newLine(); + _builder_3.append("import org.eclipse.xtext.xbase.lib.Extension;"); + _builder_3.newLine(); + _builder_3.append("import test2.MyFile1;"); + _builder_3.newLine(); + _builder_3.newLine(); + _builder_3.append("@SuppressWarnings(\"all\")"); + _builder_3.newLine(); + _builder_3.append("public class MyFile2 extends AbstractEdelta {"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("@Extension"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("private MyFile1 my;"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("public MyFile2() {"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("my = new MyFile1(this);"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("}"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("public MyFile2(final AbstractEdelta other) {"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("super(other);"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("}"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("public void aModificationTest(final EPackage it) {"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("this.my.enrichWithAttribute(getEClass(\"foo\", \"FooClass\"), \"prefix\");"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("getEAttribute(\"foo\", \"FooClass\", \"prefixAttr\").setChangeable(true);"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("getEReference(\"foo\", \"FooClass\", \"prefixRef\").setContainment(true);"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("}"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("@Override"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("public void performSanityChecks() throws Exception {"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("ensureEPackageIsLoaded(\"foo\");"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("}"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("@Override"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("protected void doExecute() throws Exception {"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("aModificationTest(getEPackage(\"foo\"));"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("}"); + _builder_3.newLine(); + _builder_3.append("}"); + _builder_3.newLine(); + Pair _mappedTo = Pair.of("test3.MyFile2", _builder_3.toString()); + this.checkCompilationOfSeveralFiles(Collections.unmodifiableList(CollectionLiterals.newArrayList(_builder.toString(), _builder_1.toString(), _builder_2.toString())), + Collections.>unmodifiableList(CollectionLiterals.>newArrayList(_mappedTo))); + } + @Test public void testCompilationOfPersonListExampleModifyEcore() { final ResourceSet rs = this.createResourceSetWithEcore( @@ -2542,6 +2726,17 @@ private void checkCompilation(final ResourceSet rs, final CharSequence expectedG this.compilationTestHelper.compile(rs, _function); } + private void checkCompilationOfSeveralFiles(final List inputs, final List> expectations) { + final IAcceptor _function = (CompilationTestHelper.Result it) -> { + this.assertNoValidationErrors(it); + for (final Pair expectation : expectations) { + Assert.assertEquals(expectation.getValue().toString(), it.getGeneratedCode(expectation.getKey())); + } + this.assertGeneratedJavaCodeCompiles(it); + }; + this.compilationTestHelper.compile(this.createResourceSet(((CharSequence[])Conversions.unwrapArray(inputs, CharSequence.class))), _function); + } + private void assertNoValidationErrors(final CompilationTestHelper.Result it) { final Function1 _function = (Issue it_1) -> { Severity _severity = it_1.getSeverity();