From d654f35c51db5787a95a86e8fc04e177d5e05399 Mon Sep 17 00:00:00 2001 From: Maximilian Kratz Date: Fri, 21 Jan 2022 14:25:08 +0100 Subject: [PATCH 1/6] Builds some test infrastructure --- org.emoflon.roam.roamslang.tests/.classpath | 26 ++ org.emoflon.roam.roamslang.tests/.project | 34 ++ .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.jdt.core.prefs | 10 + .../META-INF/MANIFEST.MF | 15 + .../build.properties | 6 + .../tests/RoamSLangParsingTest.xtend | 31 ++ .../META-INF/MANIFEST.MF | 15 + org.emoflon.roam.roamslang.ui/plugin.xml_gen | 434 ++++++++++++++++++ .../roam/roamslang/GenerateRoamSLang.mwe2 | 4 +- 10 files changed, 575 insertions(+), 2 deletions(-) create mode 100644 org.emoflon.roam.roamslang.tests/.classpath create mode 100644 org.emoflon.roam.roamslang.tests/.project create mode 100644 org.emoflon.roam.roamslang.tests/.settings/org.eclipse.core.resources.prefs create mode 100644 org.emoflon.roam.roamslang.tests/.settings/org.eclipse.jdt.core.prefs create mode 100644 org.emoflon.roam.roamslang.tests/META-INF/MANIFEST.MF create mode 100644 org.emoflon.roam.roamslang.tests/build.properties create mode 100644 org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend create mode 100644 org.emoflon.roam.roamslang.ui.tests/META-INF/MANIFEST.MF create mode 100644 org.emoflon.roam.roamslang.ui/plugin.xml_gen diff --git a/org.emoflon.roam.roamslang.tests/.classpath b/org.emoflon.roam.roamslang.tests/.classpath new file mode 100644 index 00000000..720219f1 --- /dev/null +++ b/org.emoflon.roam.roamslang.tests/.classpath @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.emoflon.roam.roamslang.tests/.project b/org.emoflon.roam.roamslang.tests/.project new file mode 100644 index 00000000..e9821a25 --- /dev/null +++ b/org.emoflon.roam.roamslang.tests/.project @@ -0,0 +1,34 @@ + + + org.emoflon.roam.roamslang.tests + + + + + + org.eclipse.xtext.ui.shared.xtextBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.xtext.ui.shared.xtextNature + org.eclipse.jdt.core.javanature + org.eclipse.pde.PluginNature + + diff --git a/org.emoflon.roam.roamslang.tests/.settings/org.eclipse.core.resources.prefs b/org.emoflon.roam.roamslang.tests/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/org.emoflon.roam.roamslang.tests/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/org.emoflon.roam.roamslang.tests/.settings/org.eclipse.jdt.core.prefs b/org.emoflon.roam.roamslang.tests/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..7adc0fb9 --- /dev/null +++ b/org.emoflon.roam.roamslang.tests/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,10 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 diff --git a/org.emoflon.roam.roamslang.tests/META-INF/MANIFEST.MF b/org.emoflon.roam.roamslang.tests/META-INF/MANIFEST.MF new file mode 100644 index 00000000..827c6ef1 --- /dev/null +++ b/org.emoflon.roam.roamslang.tests/META-INF/MANIFEST.MF @@ -0,0 +1,15 @@ +Manifest-Version: 1.0 +Automatic-Module-Name: org.emoflon.roam.roamslang.tests +Bundle-ManifestVersion: 2 +Bundle-Name: org.emoflon.roam.roamslang.tests +Bundle-Vendor: My Company +Bundle-Version: 1.0.0.qualifier +Bundle-SymbolicName: org.emoflon.roam.roamslang.tests;singleton:=true +Bundle-ActivationPolicy: lazy +Require-Bundle: org.emoflon.roam.roamslang, + org.junit.jupiter.api;bundle-version="[5.1.0,6.0.0)", + org.eclipse.xtext.testing, + org.eclipse.xtext.xbase.testing, + org.eclipse.xtext.xbase.lib;bundle-version="2.14.0" +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Export-Package: org.emoflon.roam.roamslang.tests;x-internal=true diff --git a/org.emoflon.roam.roamslang.tests/build.properties b/org.emoflon.roam.roamslang.tests/build.properties new file mode 100644 index 00000000..4c654e9b --- /dev/null +++ b/org.emoflon.roam.roamslang.tests/build.properties @@ -0,0 +1,6 @@ +source.. = src/,\ + src-gen/,\ + xtend-gen/ +bin.includes = .,\ + META-INF/ +bin.excludes = **/*.xtend diff --git a/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend b/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend new file mode 100644 index 00000000..1bd8adf1 --- /dev/null +++ b/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend @@ -0,0 +1,31 @@ +/* + * generated by Xtext 2.25.0 + */ +package org.emoflon.roam.roamslang.tests + +import com.google.inject.Inject +import org.eclipse.xtext.testing.InjectWith +import org.eclipse.xtext.testing.extensions.InjectionExtension +import org.eclipse.xtext.testing.util.ParseHelper +import org.emoflon.roam.roamslang.roamSLang.EditorGTFile +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.^extension.ExtendWith + +@ExtendWith(InjectionExtension) +@InjectWith(RoamSLangInjectorProvider) +class RoamSLangParsingTest { + @Inject + ParseHelper parseHelper + + @Test + def void loadModel() { + val result = parseHelper.parse(''' + Hello Xtext! + ''') + Assertions.assertNotNull(result) + // TODO: Resolve this access error + val errors = result.eResource.errors + Assertions.assertTrue(errors.isEmpty, '''Unexpected errors: «errors.join(", ")»''') + } +} diff --git a/org.emoflon.roam.roamslang.ui.tests/META-INF/MANIFEST.MF b/org.emoflon.roam.roamslang.ui.tests/META-INF/MANIFEST.MF new file mode 100644 index 00000000..ced57535 --- /dev/null +++ b/org.emoflon.roam.roamslang.ui.tests/META-INF/MANIFEST.MF @@ -0,0 +1,15 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: org.emoflon.roam.roamslang.ui.tests +Bundle-SymbolicName: org.emoflon.roam.roamslang.ui.tests;singleton:=true +Bundle-Version: 0.0.1.qualifier +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Bundle-ActivationPolicy: lazy +Export-Package: org.emoflon.roam.roamslang.ui.tests;x-internal=true +Require-Bundle: org.eclipse.core.runtime, + org.eclipse.ui.workbench;resolution:=optional, + org.eclipse.xtext.testing, + org.eclipse.xtext.ui.testing, + org.eclipse.xtext.xbase.junit, + org.eclipse.xtext.xbase.testing +Automatic-Module-Name: org.emoflon.roam.roamslang.ui.tests diff --git a/org.emoflon.roam.roamslang.ui/plugin.xml_gen b/org.emoflon.roam.roamslang.ui/plugin.xml_gen new file mode 100644 index 00000000..f91e07a3 --- /dev/null +++ b/org.emoflon.roam.roamslang.ui/plugin.xml_gen @@ -0,0 +1,434 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.emoflon.roam.roamslang/src/org/emoflon/roam/roamslang/GenerateRoamSLang.mwe2 b/org.emoflon.roam.roamslang/src/org/emoflon/roam/roamslang/GenerateRoamSLang.mwe2 index a434ba2e..6898d5a4 100644 --- a/org.emoflon.roam.roamslang/src/org/emoflon/roam/roamslang/GenerateRoamSLang.mwe2 +++ b/org.emoflon.roam.roamslang/src/org/emoflon/roam/roamslang/GenerateRoamSLang.mwe2 @@ -21,13 +21,13 @@ Workflow { baseName = "org.emoflon.roam.roamslang" rootPath = rootPath runtimeTest = { - enabled = false + enabled = true } eclipsePlugin = { enabled = true } eclipsePluginTest = { - enabled = false + enabled = true } createEclipseMetaData = true } From 8127b927c9fd62306488439017a9c242c15be032 Mon Sep 17 00:00:00 2001 From: Maximilian Kratz Date: Fri, 21 Jan 2022 14:34:13 +0100 Subject: [PATCH 2/6] METAINF updates + gitignore for test binaries --- org.emoflon.roam.roamslang.tests/META-INF/MANIFEST.MF | 7 ++++--- org.emoflon.roam.roamslang.tests/test-bin/.gitignore | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 org.emoflon.roam.roamslang.tests/test-bin/.gitignore diff --git a/org.emoflon.roam.roamslang.tests/META-INF/MANIFEST.MF b/org.emoflon.roam.roamslang.tests/META-INF/MANIFEST.MF index 827c6ef1..baedccc9 100644 --- a/org.emoflon.roam.roamslang.tests/META-INF/MANIFEST.MF +++ b/org.emoflon.roam.roamslang.tests/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Automatic-Module-Name: org.emoflon.roam.roamslang.tests Bundle-ManifestVersion: 2 Bundle-Name: org.emoflon.roam.roamslang.tests -Bundle-Vendor: My Company +Bundle-Vendor: Real-Time Systems Lab - TU Darmstadt Bundle-Version: 1.0.0.qualifier Bundle-SymbolicName: org.emoflon.roam.roamslang.tests;singleton:=true Bundle-ActivationPolicy: lazy @@ -10,6 +10,7 @@ Require-Bundle: org.emoflon.roam.roamslang, org.junit.jupiter.api;bundle-version="[5.1.0,6.0.0)", org.eclipse.xtext.testing, org.eclipse.xtext.xbase.testing, - org.eclipse.xtext.xbase.lib;bundle-version="2.14.0" -Bundle-RequiredExecutionEnvironment: JavaSE-11 + org.eclipse.xtext.xbase.lib;bundle-version="2.14.0", + org.emoflon.ibex.gt.editor;bundle-version="1.1.0" +Bundle-RequiredExecutionEnvironment: JavaSE-16 Export-Package: org.emoflon.roam.roamslang.tests;x-internal=true diff --git a/org.emoflon.roam.roamslang.tests/test-bin/.gitignore b/org.emoflon.roam.roamslang.tests/test-bin/.gitignore new file mode 100644 index 00000000..cf1db2ee --- /dev/null +++ b/org.emoflon.roam.roamslang.tests/test-bin/.gitignore @@ -0,0 +1 @@ +/org/ From b22bc8815f6d36ed24f933d3072e9df7d3115d3f Mon Sep 17 00:00:00 2001 From: Maximilian Kratz Date: Fri, 21 Jan 2022 14:39:56 +0100 Subject: [PATCH 3/6] Adds some super basic tests for parsing --- .../tests/RoamSLangParsingTest.xtend | 67 ++++++++++++++++++- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend b/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend index 1bd8adf1..28715127 100644 --- a/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend +++ b/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend @@ -25,7 +25,70 @@ class RoamSLangParsingTest { ''') Assertions.assertNotNull(result) // TODO: Resolve this access error - val errors = result.eResource.errors - Assertions.assertTrue(errors.isEmpty, '''Unexpected errors: «errors.join(", ")»''') +// val errors = result.eResource.errors +// Assertions.assertTrue(errors.isEmpty, '''Unexpected errors: «errors.join(", ")»''') + } + + @Test + def void testNonEmptyMappings() { + val result = parseHelper.parse(''' + rule testRule { + + } + mapping map with testRule; + ''') + Assertions.assertNotNull(result) + val mappings = result.mappings + Assertions.assertFalse(mappings.isEmpty) + } + + @Test + def void testNonEmptyConstraints() { + val result = parseHelper.parse(''' + rule testRule { + + } + mapping map with testRule; + constraint -> mapping::map { + 1 != 2 + } + ''') + Assertions.assertNotNull(result) + val constraints = result.constraints + Assertions.assertFalse(constraints.isEmpty) + } + + @Test + def void testNonEmptyObjectives() { + val result = parseHelper.parse(''' + rule testRule { + + } + mapping map with testRule; + objective obj -> mapping::map { + 1 + } + ''') + Assertions.assertNotNull(result) + val objectives = result.objectives + Assertions.assertFalse(objectives.isEmpty) + } + + @Test + def void testNonEmptyGlobalObjectives() { + val result = parseHelper.parse(''' + rule testRule { + + } + mapping map with testRule; + objective obj -> mapping::map { + 1 + } + global objective : min { + 2 * obj + } + ''') + Assertions.assertNotNull(result) + Assertions.assertNotNull(result.globalObjective) } } From 26c3b2301d7d99a3fbcc1afd02f64ffec7e4df35 Mon Sep 17 00:00:00 2001 From: Maximilian Kratz Date: Mon, 24 Jan 2022 15:45:25 +0100 Subject: [PATCH 4/6] Xtext/Xtend likes eResource now? --- .../tests/RoamSLangParsingTest.xtend | 66 ++++++++++++++----- 1 file changed, 50 insertions(+), 16 deletions(-) diff --git a/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend b/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend index 28715127..16e269b4 100644 --- a/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend +++ b/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend @@ -6,6 +6,7 @@ package org.emoflon.roam.roamslang.tests import com.google.inject.Inject import org.eclipse.xtext.testing.InjectWith import org.eclipse.xtext.testing.extensions.InjectionExtension +import org.eclipse.xtext.testing.validation.ValidationTestHelper import org.eclipse.xtext.testing.util.ParseHelper import org.emoflon.roam.roamslang.roamSLang.EditorGTFile import org.junit.jupiter.api.Assertions @@ -15,28 +16,45 @@ import org.junit.jupiter.api.^extension.ExtendWith @ExtendWith(InjectionExtension) @InjectWith(RoamSLangInjectorProvider) class RoamSLangParsingTest { + + // + // Variables and constants + // + + public static val ecoreImport = 'http://www.eclipse.org/emf/2002/Ecore' + @Inject ParseHelper parseHelper + @Inject extension ValidationTestHelper validationHelper + + // + // Tests + // + @Test def void loadModel() { val result = parseHelper.parse(''' - Hello Xtext! + import "«ecoreImport»" + rule testRule { + package: EPackage + } ''') Assertions.assertNotNull(result) - // TODO: Resolve this access error -// val errors = result.eResource.errors -// Assertions.assertTrue(errors.isEmpty, '''Unexpected errors: «errors.join(", ")»''') + val errors = result.eResource.errors + Assertions.assertTrue(errors.isEmpty, '''Unexpected errors: «errors.join(", ")»''') } @Test def void testNonEmptyMappings() { val result = parseHelper.parse(''' - rule testRule { - + import "«ecoreImport»" + pattern testPattern { + p: EPackage } - mapping map with testRule; + mapping map with testPattern; ''') + assertValid(result) Assertions.assertNotNull(result) val mappings = result.mappings Assertions.assertFalse(mappings.isEmpty) @@ -45,14 +63,16 @@ class RoamSLangParsingTest { @Test def void testNonEmptyConstraints() { val result = parseHelper.parse(''' - rule testRule { - + import "«ecoreImport»" + pattern testPattern { + p: EPackage } - mapping map with testRule; + mapping map with testPattern; constraint -> mapping::map { 1 != 2 } ''') + assertValid(result) Assertions.assertNotNull(result) val constraints = result.constraints Assertions.assertFalse(constraints.isEmpty) @@ -61,14 +81,16 @@ class RoamSLangParsingTest { @Test def void testNonEmptyObjectives() { val result = parseHelper.parse(''' - rule testRule { - + import "«ecoreImport»" + pattern testPattern { + p: EPackage } - mapping map with testRule; + mapping map with testPattern; objective obj -> mapping::map { 1 } ''') + assertValid(result) Assertions.assertNotNull(result) val objectives = result.objectives Assertions.assertFalse(objectives.isEmpty) @@ -77,10 +99,11 @@ class RoamSLangParsingTest { @Test def void testNonEmptyGlobalObjectives() { val result = parseHelper.parse(''' - rule testRule { - + import "«ecoreImport»" + pattern testPattern { + p: EPackage } - mapping map with testRule; + mapping map with testPattern; objective obj -> mapping::map { 1 } @@ -88,7 +111,18 @@ class RoamSLangParsingTest { 2 * obj } ''') + assertValid(result) Assertions.assertNotNull(result) Assertions.assertNotNull(result.globalObjective) } + + // + // Utility methods + // + + def void assertValid(EditorGTFile file) { + Assertions.assertNotNull(file) + this.validationHelper.assertNoIssues(file) + // TODO: call assertFile(...) here? + } } From c5b223e5dc8d85bd3c36cf6ed546f8e428cb9f4b Mon Sep 17 00:00:00 2001 From: Maximilian Kratz Date: Mon, 24 Jan 2022 16:33:36 +0100 Subject: [PATCH 5/6] Extends test cases for uniqueness etc. --- .../tests/RoamSLangParsingTest.xtend | 98 ++++++++++++++++++- 1 file changed, 93 insertions(+), 5 deletions(-) diff --git a/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend b/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend index 16e269b4..d6c4d35d 100644 --- a/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend +++ b/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend @@ -55,7 +55,6 @@ class RoamSLangParsingTest { mapping map with testPattern; ''') assertValid(result) - Assertions.assertNotNull(result) val mappings = result.mappings Assertions.assertFalse(mappings.isEmpty) } @@ -73,7 +72,6 @@ class RoamSLangParsingTest { } ''') assertValid(result) - Assertions.assertNotNull(result) val constraints = result.constraints Assertions.assertFalse(constraints.isEmpty) } @@ -91,7 +89,6 @@ class RoamSLangParsingTest { } ''') assertValid(result) - Assertions.assertNotNull(result) val objectives = result.objectives Assertions.assertFalse(objectives.isEmpty) } @@ -112,10 +109,77 @@ class RoamSLangParsingTest { } ''') assertValid(result) - Assertions.assertNotNull(result) Assertions.assertNotNull(result.globalObjective) } + // Wrong naming / uniqueness tests + @Test + def void testMappingNameNotUnique() { + val result = parseHelper.parse(''' + import "«ecoreImport»" + pattern testPattern { + p: EPackage + } + mapping map with testPattern; + mapping map with testPattern; + ''') + assertInvalid(result, 1, 0) + } + + @Test + def void testObjectiveNameNotUnique() { + val result = parseHelper.parse(''' + import "«ecoreImport»" + pattern testPattern { + p: EPackage + } + mapping map with testPattern; + objective o -> mapping::map { + 1 + } + objective 0 -> mapping::map { + 2 + } + ''') + assertInvalid(result, 1, 0) + } + + @Test + def void testGlobalObjectiveNotUnique() { + val result = parseHelper.parse(''' + import "«ecoreImport»" + pattern testPattern { + p: EPackage + } + mapping map with testPattern; + objective o -> mapping::map { + 1 + } + global objective : min { + 2*o + } + global objective : min { + 2*o + } + ''') + assertInvalid(result, 1, 0) + } + + @Test + def void testObjectiveIsUselessWarning() { + val result = parseHelper.parse(''' + import "«ecoreImport»" + pattern testPattern { + p: EPackage + } + mapping map with testPattern; + objective o -> mapping::map { + 0 + } + ''') + assertInvalid(result, 0, 1) + } + // // Utility methods // @@ -123,6 +187,30 @@ class RoamSLangParsingTest { def void assertValid(EditorGTFile file) { Assertions.assertNotNull(file) this.validationHelper.assertNoIssues(file) - // TODO: call assertFile(...) here? + assertFile(file) + } + + static def void assertValidResource(EditorGTFile file) { + Assertions.assertNotNull(file) + Assertions.assertTrue(file.eResource.errors.isEmpty) + Assertions.assertTrue(file.eResource.warnings.isEmpty) + } + + static def void assertFile(EditorGTFile file) { + assertValidResource(file) + Assertions.assertEquals(1, file.imports.size) + Assertions.assertEquals(ecoreImport, file.imports.get(0).name) + } + + def void assertInvalid(EditorGTFile file, int noOfErr, int noOfWarn) { + Assertions.assertNotNull(file) + assertInvalidResource(file, noOfErr, noOfWarn) } + + static def void assertInvalidResource(EditorGTFile file, int noOfErr, int noOfWarn) { + Assertions.assertNotNull(file) + Assertions.assertEquals(noOfErr, file.eResource.errors.size) + Assertions.assertEquals(noOfWarn, file.eResource.warnings.size) + } + } From 6cc8b7ef0d5d8b88f10541390e5c13c10c249438 Mon Sep 17 00:00:00 2001 From: Maximilian Kratz Date: Tue, 25 Jan 2022 11:56:42 +0100 Subject: [PATCH 6/6] Adds basic tests for constraints and objectives --- .../tests/RoamSLangParsingTest.xtend | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend b/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend index d6c4d35d..4f90e5ff 100644 --- a/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend +++ b/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend @@ -12,6 +12,8 @@ import org.emoflon.roam.roamslang.roamSLang.EditorGTFile import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test import org.junit.jupiter.api.^extension.ExtendWith +import org.emoflon.roam.roamslang.roamSLang.RoamMappingContext +import org.emoflon.roam.roamslang.roamSLang.RoamTypeContext @ExtendWith(InjectionExtension) @InjectWith(RoamSLangInjectorProvider) @@ -180,6 +182,104 @@ class RoamSLangParsingTest { assertInvalid(result, 0, 1) } + @Test + def void testMappingFromRule() { + val result = parseHelper.parse(''' + import "«ecoreImport»" + rule testRule { + c: EClassifier { + .name := "Test" + } + } + mapping map with testRule; + ''') + assertValid(result) + Assertions.assertFalse(result.mappings.isEmpty) + Assertions.assertEquals(1, result.mappings.size) + val map = result.mappings.get(0) + Assertions.assertEquals("testRule", map.rule.name) + Assertions.assertEquals("map", map.name) + } + + @Test + def void testConstraintOnMapping() { + val result = parseHelper.parse(''' + import "«ecoreImport»" + rule testRule { + c: EClassifier { + .name := "Test" + } + } + mapping map with testRule; + constraint -> mapping::map { + 1 != 2 + } + ''') + assertValid(result) + Assertions.assertFalse(result.constraints.isEmpty) + Assertions.assertEquals(1, result.constraints.size) + val cstr = result.constraints.get(0) + val mappingContext = cstr.context as RoamMappingContext + Assertions.assertEquals("map", mappingContext.mapping.name) + } + + @Test + def void testObjectiveOnMapping() { + val result = parseHelper.parse(''' + import "«ecoreImport»" + rule testRule { + c: EClassifier { + .name := "Test" + } + } + mapping map with testRule; + objective obj -> mapping::map { + 3 + } + ''') + assertValid(result) + Assertions.assertFalse(result.objectives.isEmpty) + Assertions.assertEquals(1, result.objectives.size) + val obj = result.objectives.get(0) + val mappingContext = obj.context as RoamMappingContext + Assertions.assertEquals("map", mappingContext.mapping.name) + } + + @Test + def void testObjectiveOnClass() { + val result = parseHelper.parse(''' + import "«ecoreImport»" + objective obj -> class::EClass { + 3 + } + ''') + assertValid(result) + Assertions.assertFalse(result.objectives.isEmpty) + Assertions.assertEquals(1, result.objectives.size) + val obj = result.objectives.get(0) + val typeContext = obj.context as RoamTypeContext + Assertions.assertEquals("EClass", typeContext.type.name) + } + + @Test + def void testGlobalObjectiveGoal() { + val result = parseHelper.parse(''' + import "«ecoreImport»" + objective obja -> class::EClass { + 3 + } + global objective : min { + obja + } + ''') + assertValid(result) + Assertions.assertFalse(result.objectives.isEmpty) + Assertions.assertEquals(1, result.objectives.size) + val gobj = result.globalObjective + Assertions.assertNotNull(gobj) + Assertions.assertEquals("MIN", gobj.objectiveGoal.getName) + } + // // Utility methods //