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..baedccc9 --- /dev/null +++ b/org.emoflon.roam.roamslang.tests/META-INF/MANIFEST.MF @@ -0,0 +1,16 @@ +Manifest-Version: 1.0 +Automatic-Module-Name: org.emoflon.roam.roamslang.tests +Bundle-ManifestVersion: 2 +Bundle-Name: org.emoflon.roam.roamslang.tests +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 +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", + 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/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..4f90e5ff --- /dev/null +++ b/org.emoflon.roam.roamslang.tests/src/org/emoflon/roam/roamslang/tests/RoamSLangParsingTest.xtend @@ -0,0 +1,316 @@ +/* + * 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.validation.ValidationTestHelper +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 +import org.emoflon.roam.roamslang.roamSLang.RoamMappingContext +import org.emoflon.roam.roamslang.roamSLang.RoamTypeContext + +@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(''' + import "«ecoreImport»" + rule testRule { + package: EPackage + } + ''') + Assertions.assertNotNull(result) + val errors = result.eResource.errors + Assertions.assertTrue(errors.isEmpty, '''Unexpected errors: «errors.join(", ")»''') + } + + @Test + def void testNonEmptyMappings() { + val result = parseHelper.parse(''' + import "«ecoreImport»" + pattern testPattern { + p: EPackage + } + mapping map with testPattern; + ''') + assertValid(result) + val mappings = result.mappings + Assertions.assertFalse(mappings.isEmpty) + } + + @Test + def void testNonEmptyConstraints() { + val result = parseHelper.parse(''' + import "«ecoreImport»" + pattern testPattern { + p: EPackage + } + mapping map with testPattern; + constraint -> mapping::map { + 1 != 2 + } + ''') + assertValid(result) + val constraints = result.constraints + Assertions.assertFalse(constraints.isEmpty) + } + + @Test + def void testNonEmptyObjectives() { + val result = parseHelper.parse(''' + import "«ecoreImport»" + pattern testPattern { + p: EPackage + } + mapping map with testPattern; + objective obj -> mapping::map { + 1 + } + ''') + assertValid(result) + val objectives = result.objectives + Assertions.assertFalse(objectives.isEmpty) + } + + @Test + def void testNonEmptyGlobalObjectives() { + val result = parseHelper.parse(''' + import "«ecoreImport»" + pattern testPattern { + p: EPackage + } + mapping map with testPattern; + objective obj -> mapping::map { + 1 + } + global objective : min { + 2 * obj + } + ''') + assertValid(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) + } + + @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 + // + + def void assertValid(EditorGTFile file) { + Assertions.assertNotNull(file) + this.validationHelper.assertNoIssues(file) + 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) + } + +} 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/ 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 }