From 297f68e8092a24b020cc57634edf6624d0e6a6b1 Mon Sep 17 00:00:00 2001 From: Maximilian Kratz Date: Fri, 21 Mar 2025 09:01:53 +0100 Subject: [PATCH] Adds a test case to trigger the `elt` bug in the GIPSL code gen --- gipsl.all.build.eltbug/.classpath | 8 +++ gipsl.all.build.eltbug/.project | 25 ++++++++ .../.settings/org.eclipse.jdt.core.prefs | 7 +++ gipsl.all.build.eltbug/META-INF/MANIFEST.MF | 17 ++++++ gipsl.all.build.eltbug/build.properties | 5 ++ .../src/gipsl/all/build/eltbug/Model.gipsl | 58 +++++++++++++++++++ .../eltbug/connector/EltBugConnector.java | 25 ++++++++ test.suite.gips/META-INF/MANIFEST.MF | 1 + .../all/build/GipslAllBuildEltBugTest.java | 41 +++++++++++++ 9 files changed, 187 insertions(+) create mode 100644 gipsl.all.build.eltbug/.classpath create mode 100644 gipsl.all.build.eltbug/.project create mode 100644 gipsl.all.build.eltbug/.settings/org.eclipse.jdt.core.prefs create mode 100644 gipsl.all.build.eltbug/META-INF/MANIFEST.MF create mode 100644 gipsl.all.build.eltbug/build.properties create mode 100644 gipsl.all.build.eltbug/src/gipsl/all/build/eltbug/Model.gipsl create mode 100644 gipsl.all.build.eltbug/src/gipsl/all/build/eltbug/connector/EltBugConnector.java create mode 100644 test.suite.gips/src/test/suite/gipsl/all/build/GipslAllBuildEltBugTest.java diff --git a/gipsl.all.build.eltbug/.classpath b/gipsl.all.build.eltbug/.classpath new file mode 100644 index 00000000..0b423a2c --- /dev/null +++ b/gipsl.all.build.eltbug/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/gipsl.all.build.eltbug/.project b/gipsl.all.build.eltbug/.project new file mode 100644 index 00000000..522ee6c0 --- /dev/null +++ b/gipsl.all.build.eltbug/.project @@ -0,0 +1,25 @@ + + + gipsl.all.build.eltbug + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.xtext.ui.shared.xtextBuilder + + + + + + org.emoflon.gips.gipsl.ui.gipsNature + org.eclipse.jdt.core.javanature + org.eclipse.pde.PluginNature + org.eclipse.xtext.ui.shared.xtextNature + + diff --git a/gipsl.all.build.eltbug/.settings/org.eclipse.jdt.core.prefs b/gipsl.all.build.eltbug/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..cc4eaa53 --- /dev/null +++ b/gipsl.all.build.eltbug/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=21 +org.eclipse.jdt.core.compiler.compliance=21 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=21 diff --git a/gipsl.all.build.eltbug/META-INF/MANIFEST.MF b/gipsl.all.build.eltbug/META-INF/MANIFEST.MF new file mode 100644 index 00000000..2cef077e --- /dev/null +++ b/gipsl.all.build.eltbug/META-INF/MANIFEST.MF @@ -0,0 +1,17 @@ +Manifest-Version: 1.0 +Automatic-Module-Name: gipsl.all.build.eltbug +Bundle-ManifestVersion: 2 +Bundle-Name: gipsl.all.build.eltbug +Bundle-Vendor: My Company +Bundle-Version: 1.0.0.qualifier +Export-Package: gipsl.all.build.eltbug.connector +Bundle-SymbolicName: gipsl.all.build.eltbug; singleton:=true +Bundle-ActivationPolicy: lazy +Bundle-RequiredExecutionEnvironment: JavaSE-21 +Require-Bundle: org.emoflon.ibex.common, + org.emoflon.ibex.gt, + org.emoflon.gips.core, + org.emoflon.ibex.gt.democles, + org.emoflon.ibex.gt.hipe, + gipsl.all.build.model, + test.suite.utils diff --git a/gipsl.all.build.eltbug/build.properties b/gipsl.all.build.eltbug/build.properties new file mode 100644 index 00000000..14acfb7c --- /dev/null +++ b/gipsl.all.build.eltbug/build.properties @@ -0,0 +1,5 @@ +source.. = src/,\ + src-gen/ +bin.includes = META-INF/,\ + .,\ + plugin.xml diff --git a/gipsl.all.build.eltbug/src/gipsl/all/build/eltbug/Model.gipsl b/gipsl.all.build.eltbug/src/gipsl/all/build/eltbug/Model.gipsl new file mode 100644 index 00000000..08903f28 --- /dev/null +++ b/gipsl.all.build.eltbug/src/gipsl/all/build/eltbug/Model.gipsl @@ -0,0 +1,58 @@ +package "gipsl.all.build.eltbug" +import "platform:/resource/gipsl.all.build.model/model/Model.ecore" + +config { + solver := GUROBI; + timeLimit := true [value := 10.0]; + randomSeed := true [value := 0]; + presolve := true; + debugOutput := false; +} + +rule mapVnode { + root: Root { + -containers -> substrateContainer + -containers -> virtualContainer + } + + substrateContainer: SubstrateContainer { + -substrateNodes -> snode + } + + virtualContainer: VirtualContainer { + -virtualNodes -> vnode + } + + snode: SubstrateResourceNode + + vnode: VirtualResourceNode { + ++ -host -> snode + } +} + +pattern findRoot { + root : Root +} + +// +// GIPSL starts here! +// + +mapping n2n to mapVnode; + +// Every node must be mapped exactly once +constraint with VirtualNode { + mappings.n2n->filter(element.nodes.vnode == context)->sum(element.value) == 1 +} + +// This function triggers the bug within the code generation +function dummy with Root { + mappings.n2n->sum(element.value) + * + patterns.findRoot->sum(1) + // ^this does also trigger the bug when access uses `rules.xy` +} + +objective : min { + functions.dummy +} diff --git a/gipsl.all.build.eltbug/src/gipsl/all/build/eltbug/connector/EltBugConnector.java b/gipsl.all.build.eltbug/src/gipsl/all/build/eltbug/connector/EltBugConnector.java new file mode 100644 index 00000000..6aa586c5 --- /dev/null +++ b/gipsl.all.build.eltbug/src/gipsl/all/build/eltbug/connector/EltBugConnector.java @@ -0,0 +1,25 @@ +package gipsl.all.build.eltbug.connector; + +import org.emoflon.gips.core.milp.SolverOutput; + +import gipsl.all.build.eltbug.api.gips.EltbugGipsAPI; +import test.suite.gips.utils.AConnector; +import test.suite.gips.utils.GipsTestUtils; +import test.suite.gips.utils.GlobalTestConfig; + +public class EltBugConnector extends AConnector { + + public EltBugConnector(final String modelPath) { + api = new EltbugGipsAPI(); + api.init(GipsTestUtils.pathToAbsUri(modelPath)); + GlobalTestConfig.overrideSolver(api); + } + + @Override + public SolverOutput run(final String outputPath) { + final SolverOutput output = solve(); + ((EltbugGipsAPI) api).getN2n().applyNonZeroMappings(); + return output; + } + +} diff --git a/test.suite.gips/META-INF/MANIFEST.MF b/test.suite.gips/META-INF/MANIFEST.MF index febd47e2..76d9fe37 100644 --- a/test.suite.gips/META-INF/MANIFEST.MF +++ b/test.suite.gips/META-INF/MANIFEST.MF @@ -41,6 +41,7 @@ Import-Package: gips.enumequals.connector, gipsl.all.build.and.connector, gipsl.all.build.booleanbrackets.connector, gipsl.all.build.count.connector, + gipsl.all.build.eltbug.connector, gipsl.all.build.equals.fxeqctrafo.connector, gipsl.all.build.filter.connector, gipsl.all.build.implication.connector, diff --git a/test.suite.gips/src/test/suite/gipsl/all/build/GipslAllBuildEltBugTest.java b/test.suite.gips/src/test/suite/gipsl/all/build/GipslAllBuildEltBugTest.java new file mode 100644 index 00000000..f80c2846 --- /dev/null +++ b/test.suite.gips/src/test/suite/gipsl/all/build/GipslAllBuildEltBugTest.java @@ -0,0 +1,41 @@ +package test.suite.gipsl.all.build; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.emoflon.gips.core.milp.SolverOutput; +import org.emoflon.gips.core.milp.SolverStatus; +import org.junit.jupiter.api.Test; + +import gipsl.all.build.eltbug.connector.EltBugConnector; + +public class GipslAllBuildEltBugTest extends AGipslAllBuildTest { + + // Setup method + + public void callableSetUp() { + gen.persistModel(MODEL_PATH); + con = new EltBugConnector(MODEL_PATH); + } + + // Actual tests + // Positive tests + + @Test + public void testMap2to1() { + gen.genSubstrateNode("s1", 10); + gen.genVirtualNode("v1", 1); + gen.genVirtualNode("v2", 1); + callableSetUp(); + + final SolverOutput ret = con.run(OUTPUT_PATH); + + assertEquals(SolverStatus.OPTIMAL, ret.status()); + assertEquals(2, ret.objectiveValue()); + } + + @Override + public Class getConnectorClass() { + return EltBugConnector.class; + } + +}