From ef1b03dbab2e6971bf1ec6b135f3c8d7ef0bc14f Mon Sep 17 00:00:00 2001 From: Cookiebowser <lucas.doering@live.de> Date: Thu, 9 Feb 2023 13:04:05 +0100 Subject: [PATCH] added generator tests for Sets/Relations in embedded mode --- .../hhu/stups/codegenerator/TestHelper.java | 50 +++++ .../hhu/stups/codegenerator/rust/TestRS.java | 48 +---- .../rust_embedded/TestGenerator.java | 202 ++++++++++++++++++ .../codegenerator/rust_embedded/TestSets.java | 86 ++++++++ .../embedded/ConstNestedRelation.mch | 21 ++ .../embedded/ConstPowRelation.mch | 21 ++ .../codegenerator/embedded/ConstPowSet.mch | 20 ++ .../embedded/MaxPowEnumeratedSet.mch | 24 +++ .../codegenerator/embedded/NestedRelation.mch | 31 +++ .../codegenerator/embedded/PowRelation.mch | 26 +++ .../embedded/RedundantConstRelation.mch | 21 ++ .../embedded/RedundantConstSet.mch | 20 ++ .../embedded/SimpleEnumeratedSet.mch | 23 ++ .../embedded/SimplePowEnumeratedSet.mch | 23 ++ .../embedded/SimplePowPowEnumeratedSet.mch | 23 ++ .../codegenerator/embedded/SimpleRelation.mch | 27 +++ 16 files changed, 625 insertions(+), 41 deletions(-) create mode 100644 src/test/java/de/hhu/stups/codegenerator/TestHelper.java create mode 100644 src/test/java/de/hhu/stups/codegenerator/rust_embedded/TestGenerator.java create mode 100644 src/test/java/de/hhu/stups/codegenerator/rust_embedded/TestSets.java create mode 100644 src/test/resources/de/hhu/stups/codegenerator/embedded/ConstNestedRelation.mch create mode 100644 src/test/resources/de/hhu/stups/codegenerator/embedded/ConstPowRelation.mch create mode 100644 src/test/resources/de/hhu/stups/codegenerator/embedded/ConstPowSet.mch create mode 100644 src/test/resources/de/hhu/stups/codegenerator/embedded/MaxPowEnumeratedSet.mch create mode 100644 src/test/resources/de/hhu/stups/codegenerator/embedded/NestedRelation.mch create mode 100644 src/test/resources/de/hhu/stups/codegenerator/embedded/PowRelation.mch create mode 100644 src/test/resources/de/hhu/stups/codegenerator/embedded/RedundantConstRelation.mch create mode 100644 src/test/resources/de/hhu/stups/codegenerator/embedded/RedundantConstSet.mch create mode 100644 src/test/resources/de/hhu/stups/codegenerator/embedded/SimpleEnumeratedSet.mch create mode 100644 src/test/resources/de/hhu/stups/codegenerator/embedded/SimplePowEnumeratedSet.mch create mode 100644 src/test/resources/de/hhu/stups/codegenerator/embedded/SimplePowPowEnumeratedSet.mch create mode 100644 src/test/resources/de/hhu/stups/codegenerator/embedded/SimpleRelation.mch diff --git a/src/test/java/de/hhu/stups/codegenerator/TestHelper.java b/src/test/java/de/hhu/stups/codegenerator/TestHelper.java new file mode 100644 index 000000000..a3036fae9 --- /dev/null +++ b/src/test/java/de/hhu/stups/codegenerator/TestHelper.java @@ -0,0 +1,50 @@ +package de.hhu.stups.codegenerator; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Path; +import java.util.List; + +public class TestHelper { + public static void writeInputToOutput(InputStream inputStream, OutputStream outputStream) throws IOException { + int size; + byte[] buffer = new byte[1024]; + while ((size = inputStream.read(buffer)) != -1) + outputStream.write(buffer, 0, size); + } + + public static void writeInputToSystem(InputStream inputStream) throws IOException { + writeInputToOutput(inputStream, System.err); + } + + public static String streamToString(InputStream inputStream) throws IOException { + ByteArrayOutputStream result = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int length; + while ((length = inputStream.read(buffer)) != -1) { + result.write(buffer, 0, length); + } + return result.toString(); + } + + public static List<Path> generateCode(Path machinePath, GeneratorMode mode, boolean forModelChecking, String addition, boolean embedded) throws IOException { + CodeGenerator codeGenerator = new CodeGenerator(); + return codeGenerator.generate(machinePath, + mode, + false, + String.valueOf(Integer.MIN_VALUE), + String.valueOf(Integer.MAX_VALUE), + "10", + forModelChecking, + false, + true, + addition, + false, + false, + null, + null, + embedded); + } +} diff --git a/src/test/java/de/hhu/stups/codegenerator/rust/TestRS.java b/src/test/java/de/hhu/stups/codegenerator/rust/TestRS.java index 2abe2ab17..39cdb6bba 100644 --- a/src/test/java/de/hhu/stups/codegenerator/rust/TestRS.java +++ b/src/test/java/de/hhu/stups/codegenerator/rust/TestRS.java @@ -2,6 +2,7 @@ package de.hhu.stups.codegenerator.rust; import de.hhu.stups.codegenerator.CodeGenerator; import de.hhu.stups.codegenerator.GeneratorMode; +import de.hhu.stups.codegenerator.TestHelper; import java.io.*; import java.nio.file.Files; @@ -15,27 +16,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class TestRS { - public static void writeInputToOutput(InputStream inputStream, OutputStream outputStream) throws IOException { - int size; - byte[] buffer = new byte[1024]; - while ((size = inputStream.read(buffer)) != -1) - outputStream.write(buffer, 0, size); - } - - public static void writeInputToSystem(InputStream inputStream) throws IOException { - writeInputToOutput(inputStream, System.err); - } - - private static String streamToString(InputStream inputStream) throws IOException { - ByteArrayOutputStream result = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - int length; - while ((length = inputStream.read(buffer)) != -1) { - result.write(buffer, 0, length); - } - return result.toString(); - } - public void testRS(String machine) throws Exception { testRS(machine, null, "DefaultAddition.strs", false); } @@ -68,21 +48,7 @@ public class TestRS { if (machinePath == null) { machinePath = "../../../resources/test/de/hhu/stups/codegenerator/"; } if (!machinePath.endsWith("/")) { machinePath += "/"; } Path mchPath = Paths.get(CodeGenerator.class.getClassLoader().getResource("").toURI()).resolve(machinePath + machine + ".mch").normalize(); - CodeGenerator codeGenerator = new CodeGenerator(); - List<Path> rsFilePaths = codeGenerator.generate(mchPath, - GeneratorMode.RS, - false, - String.valueOf(Integer.MIN_VALUE), - String.valueOf(Integer.MAX_VALUE), - "10", - modelChecking, - false, - true, - addition, - false, - false, - null, - null); + List<Path> rsFilePaths = TestHelper.generateCode(mchPath, GeneratorMode.RS, modelChecking, addition, false); Path typesPath = Paths.get(this.getClass().getClassLoader().getResource("./").toURI()).getParent().getParent().getParent().getParent().resolve(Paths.get("btypes_primitives/src/main/rust/bmachine/src")); Files.createDirectories(typesPath); @@ -99,8 +65,8 @@ public class TestRS { File newMainFile = typesPath.resolve(Paths.get("main.rs")).toFile(); mainPath.toFile().renameTo(newMainFile); Process process = runtime.exec("cargo build --release --manifest-path " + mainPath.getParent().getParent().toFile().getAbsolutePath() + "/Cargo.toml"); - writeInputToSystem(process.getErrorStream()); - writeInputToOutput(process.getErrorStream(), process.getOutputStream()); + TestHelper.writeInputToSystem(process.getErrorStream()); + TestHelper.writeInputToOutput(process.getErrorStream(), process.getOutputStream()); process.waitFor(); if (process.exitValue() != 0) { throw new Exception("cargo build failed, exitcode: " + process.exitValue()); @@ -119,15 +85,15 @@ public class TestRS { Process executeProcess = runtime.exec("cargo run --release --manifest-path " + mainPath.getParent().getParent().toFile().getAbsolutePath() + "/Cargo.toml" + progArgs); executeProcess.waitFor(); - String error = streamToString(executeProcess.getErrorStream()); + String error = TestHelper.streamToString(executeProcess.getErrorStream()); if(executeProcess.exitValue() != 0) { throw new RuntimeException(error); } - String result = streamToString(executeProcess.getInputStream()); + String result = TestHelper.streamToString(executeProcess.getInputStream()); if (modelChecking && !machine.contains("MC")) machine += "_MC"; File outFile = Paths.get(CodeGenerator.class.getClassLoader().getResource("de/hhu/stups/codegenerator/" + machine + ".out").toURI()).toFile(); - String expectedOutput = streamToString(new FileInputStream(outFile)).replaceAll("[\n\r]", ""); + String expectedOutput = TestHelper.streamToString(new FileInputStream(outFile)).replaceAll("[\n\r]", ""); result = result.replaceAll("\n", ""); if (!modelChecking) { diff --git a/src/test/java/de/hhu/stups/codegenerator/rust_embedded/TestGenerator.java b/src/test/java/de/hhu/stups/codegenerator/rust_embedded/TestGenerator.java new file mode 100644 index 000000000..d63b8ba78 --- /dev/null +++ b/src/test/java/de/hhu/stups/codegenerator/rust_embedded/TestGenerator.java @@ -0,0 +1,202 @@ +package de.hhu.stups.codegenerator.rust_embedded; + +import de.hhu.stups.codegenerator.CodeGenerator; +import de.hhu.stups.codegenerator.GeneratorMode; +import de.hhu.stups.codegenerator.definitions.SetDefinition; +import de.hhu.stups.codegenerator.definitions.SetDefinitions; +import de.hhu.stups.codegenerator.generators.MachineGenerator; +import de.prob.parser.antlr.BProject; +import de.prob.parser.ast.types.EnumeratedSetElementType; +import org.junit.Test; + +import java.io.File; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.*; + + +public class TestGenerator { + + private MachineGenerator getMachineGenerator(String machine) { + ClassLoader classLoader = this.getClass().getClassLoader(); + File file = new File(classLoader.getResource("de/hhu/stups/codegenerator/embedded/"+machine).getFile()); + assertTrue(file.exists()); + MachineGenerator machineGenerator = new MachineGenerator(GeneratorMode.RS, false, "-2147483648", "2147483647", + "10", false, false, null, false, false, null, true); + + BProject bProject = CodeGenerator.parseProject(file.toPath()); + machineGenerator.generateMachine(bProject.getMainMachine(), GeneratorMode.RS); + return machineGenerator; + } + + @Test + public void test_SimpleEnumeratedSet() { + MachineGenerator machineGenerator = getMachineGenerator("SimpleEnumeratedSet.mch"); + SetDefinitions setDefinitions = machineGenerator.getSetDefinitions(); + + assertEquals(1, setDefinitions.size()); + + SetDefinition setCounters = setDefinitions.getDefinition(new EnumeratedSetElementType("Counters", null)); + assertNotNull(setCounters); + assertEquals(3, setCounters.getElements().size()); + } + + @Test + public void test_SimplePowEnumeratedSet() { + MachineGenerator machineGenerator = getMachineGenerator("SimplePowEnumeratedSet.mch"); + SetDefinitions setDefinitions = machineGenerator.getSetDefinitions(); + + assertEquals(2, setDefinitions.size()); + + SetDefinition setCounters = setDefinitions.getDefinition(new EnumeratedSetElementType("POW(Counters)", null)); + assertNotNull(setCounters); + assertEquals(8, setCounters.getElements().size()); + } + + @Test + public void test_SimplePowPowEnumeratedSet() { + MachineGenerator machineGenerator = getMachineGenerator("SimplePowPowEnumeratedSet.mch"); + SetDefinitions setDefinitions = machineGenerator.getSetDefinitions(); + + assertEquals(3, setDefinitions.size()); + + SetDefinition setCounters = setDefinitions.getDefinition(new EnumeratedSetElementType("POW(POW(Counters))", null)); + assertNotNull(setCounters); + assertEquals(16, setCounters.getElements().size()); + } + + @Test + public void test_MaxPowEnumeratedSet() { + MachineGenerator machineGenerator = getMachineGenerator("MaxPowEnumeratedSet.mch"); + SetDefinitions setDefinitions = machineGenerator.getSetDefinitions(); + + assertEquals(4, setDefinitions.size()); + + SetDefinition setCounters = setDefinitions.getDefinition(new EnumeratedSetElementType("POW(POW(POW(Counters)))", null)); + assertNotNull(setCounters); + assertEquals(16, setCounters.getElements().size()); + } + + @Test + public void test_SimpleRelation() { + MachineGenerator machineGenerator = getMachineGenerator("SimpleRelation.mch"); + SetDefinitions setDefinitions = machineGenerator.getSetDefinitions(); + + //relation itself does not need an enum, only when its needed as an SetItem (i.e. powerset/nested relation) + assertEquals(2, setDefinitions.size()); + assertTrue(setDefinitions.containsDefinition(new EnumeratedSetElementType("Counters", null))); + assertTrue(setDefinitions.containsDefinition(new EnumeratedSetElementType("Persons", null))); + } + + @Test + public void test_PowRelation() { + MachineGenerator machineGenerator = getMachineGenerator("PowRelation.mch"); + SetDefinitions setDefinitions = machineGenerator.getSetDefinitions(); + + assertEquals(4, setDefinitions.size()); + assertTrue(setDefinitions.containsDefinition(new EnumeratedSetElementType("Counters", null))); + assertTrue(setDefinitions.containsDefinition(new EnumeratedSetElementType("Persons", null))); + SetDefinition rel = setDefinitions.getDefinition(new EnumeratedSetElementType("Counters*Persons", null)); + assertNotNull(rel); + assertEquals(6, rel.getElements().size()); + SetDefinition powRel = setDefinitions.getDefinition(new EnumeratedSetElementType("POW(Counters*Persons)", null)); + assertNotNull(powRel); + assertEquals(64, powRel.getElements().size()); + } + + @Test + public void test_NestedRelation() { + MachineGenerator machineGenerator = getMachineGenerator("NestedRelation.mch"); + SetDefinitions setDefinitions = machineGenerator.getSetDefinitions(); + + assertEquals(5, setDefinitions.size()); + assertTrue(setDefinitions.containsDefinition(new EnumeratedSetElementType("Counters", null))); + assertTrue(setDefinitions.containsDefinition(new EnumeratedSetElementType("Persons", null))); + assertTrue(setDefinitions.containsDefinition(new EnumeratedSetElementType("Shift", null))); + assertTrue(setDefinitions.containsDefinition(new EnumeratedSetElementType("Counters*Persons", null))); + SetDefinition powRel = setDefinitions.getDefinition(new EnumeratedSetElementType("POW(Counters*Persons)", null)); + assertNotNull(powRel); + assertEquals(16, powRel.getElements().size()); + } + + @Test + public void test_RedundantConstSet() { + MachineGenerator machineGenerator = getMachineGenerator("RedundantConstSet.mch"); + SetDefinitions setDefinitions = machineGenerator.getSetDefinitions(); + + assertEquals(1, setDefinitions.size()); + SetDefinition personsSet = setDefinitions.getDefinition(new EnumeratedSetElementType("Persons", null)); + assertNotNull(personsSet); + assertEquals(3, personsSet.getElements().size()); + } + + @Test + public void test_ConstPowSet() { + MachineGenerator machineGenerator = getMachineGenerator("ConstPowSet.mch"); + SetDefinitions setDefinitions = machineGenerator.getSetDefinitions(); + + assertEquals(2, setDefinitions.size()); + SetDefinition groupsSet = setDefinitions.getDefinition(new EnumeratedSetElementType("POW(Persons)", null)); + assertNotNull(groupsSet); + assertTrue(groupsSet.isConstant()); + List<String> groupElements = groupsSet.getElements(); + assertEquals(2, groupElements.size()); + Integer p1_p3_Idx = null; + Integer p2_Idx = null; + for (int i = 0; i < groupElements.size(); i++) { + switch (groupElements.get(i)) { + case "SET_P1__P3_TES": p1_p3_Idx = i; break; + case "SET_P2_TES": p2_Idx = i; break; + } + } + assertNotNull(p1_p3_Idx); + assertNotNull(p2_Idx); + Map<Integer, boolean[]> idxToBitarr = groupsSet.bitArrIndexed(); + assertArrayEquals(new boolean[]{true, false, true}, idxToBitarr.get(p1_p3_Idx)); + assertArrayEquals(new boolean[]{false, true, false}, idxToBitarr.get(p2_Idx)); + } + + @Test + public void test_RedundantConstRelation() { + MachineGenerator machineGenerator = getMachineGenerator("RedundantConstRelation.mch"); + SetDefinitions setDefinitions = machineGenerator.getSetDefinitions(); + + assertEquals(2, setDefinitions.size()); + assertTrue(setDefinitions.containsDefinition(new EnumeratedSetElementType("Counters", null))); + assertTrue(setDefinitions.containsDefinition(new EnumeratedSetElementType("Persons", null))); + } + + @Test + public void test_ConstPowRelation() { + MachineGenerator machineGenerator = getMachineGenerator("ConstPowRelation.mch"); + SetDefinitions setDefinitions = machineGenerator.getSetDefinitions(); + + assertEquals(4, setDefinitions.size()); + assertTrue(setDefinitions.containsDefinition(new EnumeratedSetElementType("Counters", null))); + assertTrue(setDefinitions.containsDefinition(new EnumeratedSetElementType("Persons", null))); + SetDefinition rel = setDefinitions.getDefinition(new EnumeratedSetElementType("Counters*Persons", null)); + assertNotNull(rel); + assertEquals(6, rel.getElements().size()); + SetDefinition powRel = setDefinitions.getDefinition(new EnumeratedSetElementType("POW(Counters*Persons)", null)); + assertNotNull(powRel); + assertEquals(2, powRel.getElements().size()); + } + + @Test + public void test_ConstNestedRelation() { + MachineGenerator machineGenerator = getMachineGenerator("ConstNestedRelation.mch"); + SetDefinitions setDefinitions = machineGenerator.getSetDefinitions(); + + assertEquals(5, setDefinitions.size()); + //TODO?: currently, setDef for 'Persons*POW(Counters*Counters)' is generated, not sure if that is necessary + assertTrue(setDefinitions.containsDefinition(new EnumeratedSetElementType("Counters", null))); + assertTrue(setDefinitions.containsDefinition(new EnumeratedSetElementType("Persons", null))); + SetDefinition rel = setDefinitions.getDefinition(new EnumeratedSetElementType("Counters*Counters", null)); + assertNotNull(rel); + assertEquals(36, rel.getElements().size()); + SetDefinition powRel = setDefinitions.getDefinition(new EnumeratedSetElementType("POW(Counters*Counters)", null)); + assertNotNull(powRel); + assertEquals(2, powRel.getElements().size()); + } +} diff --git a/src/test/java/de/hhu/stups/codegenerator/rust_embedded/TestSets.java b/src/test/java/de/hhu/stups/codegenerator/rust_embedded/TestSets.java new file mode 100644 index 000000000..0602051d6 --- /dev/null +++ b/src/test/java/de/hhu/stups/codegenerator/rust_embedded/TestSets.java @@ -0,0 +1,86 @@ +package de.hhu.stups.codegenerator.rust_embedded; + +import de.hhu.stups.codegenerator.CodeGenerator; +import de.hhu.stups.codegenerator.GeneratorMode; +import de.hhu.stups.codegenerator.TestHelper; +import org.junit.Before; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.junit.Assert.assertNotNull; + +public class TestSets { + final ClassLoader classLoader = this.getClass().getClassLoader(); + final Path rustSrcPath = Paths.get(classLoader.getResource("./").toURI()).getParent().getParent().getParent().getParent().resolve(Paths.get("btypes_primitives/src/main/rust_embedded/bmachine/src")); + final Runtime runtime = Runtime.getRuntime(); + + public TestSets() throws URISyntaxException, IOException { + Files.createDirectories(rustSrcPath); + } + + @Before + public void beforeEach() { + File[] oldFiles = rustSrcPath.toFile().listFiles(); + if (oldFiles != null) Arrays.stream(oldFiles).forEach(File::delete); + } + + @Test + public void test_SimpleEnumeratedSet() throws IOException, InterruptedException { + boolean execute = true; + boolean modelChecking = false; + boolean noInv = false; + boolean noDead = false; + + String machineFile = ""; + URL machineURL = classLoader.getResource("de/hhu/stups/codegenerator/embedded/" + machineFile); + assertNotNull(machineURL); + Path machinePath = Paths.get(machineURL.getPath()); + List<Path> rsFilePaths = TestHelper.generateCode(machinePath, GeneratorMode.RS, false, "DefaultAddition.strs", true); + rsFilePaths = rsFilePaths.stream().map(path -> { + Path dest = rustSrcPath.resolve(Paths.get(path.toFile().getName())); + path.toFile().renameTo(dest.toFile()); + return dest; + }).collect(Collectors.toList()); + + Path mainPath = rsFilePaths.get(rsFilePaths.size() - 1); + File newMainFile = rustSrcPath.resolve(Paths.get("main.rs")).toFile(); + mainPath.toFile().renameTo(newMainFile); + + Process process = runtime.exec("cargo build --release --manifest-path " + mainPath.getParent().getParent().toFile().getAbsolutePath() + "/Cargo.toml"); + TestHelper.writeInputToSystem(process.getErrorStream()); + TestHelper.writeInputToOutput(process.getErrorStream(), process.getOutputStream()); + process.waitFor(); + if (process.exitValue() != 0) { + throw new RuntimeException("cargo build failed, exitcode: " + process.exitValue()); + } + + if(!execute) { + rsFilePaths.forEach(p -> p.toFile().delete()); + return; + } + + String progArgs = ""; + if (modelChecking) { progArgs = " -- mixed 2 true"; } + if (noDead) { progArgs += " -nodead"; } + if (noInv) { progArgs += " -noinv"; } + + Process executeProcess = runtime.exec("cargo run --release --manifest-path " + mainPath.getParent().getParent().toFile().getAbsolutePath() + "/Cargo.toml" + progArgs); + executeProcess.waitFor(); + + String error = TestHelper.streamToString(executeProcess.getErrorStream()); + if(executeProcess.exitValue() != 0) { + throw new RuntimeException(error); + } + String result = TestHelper.streamToString(executeProcess.getInputStream()); + } +} diff --git a/src/test/resources/de/hhu/stups/codegenerator/embedded/ConstNestedRelation.mch b/src/test/resources/de/hhu/stups/codegenerator/embedded/ConstNestedRelation.mch new file mode 100644 index 000000000..ff54c75a4 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/embedded/ConstNestedRelation.mch @@ -0,0 +1,21 @@ +MACHINE ConstNestedRelation + +SETS + Counters={C1, C2, C3, C4, C5, C6} + ;Persons={P1, P2} + +CONCRETE_CONSTANTS + nxt + +PROPERTIES + nxt : Persons --> (Counters >+> Counters) + & nxt = {P1 |-> { C1 |-> C3, C3 |-> C5 }, P2 |-> {C2 |-> C6, C6 |-> C2}} + +INVARIANT /* Machine without Invariant crashes MC-generator (even if MC is disabled...) */ + 1 = 1 + + +OPERATIONS + + out <-- relCount = out := card(nxt) +END diff --git a/src/test/resources/de/hhu/stups/codegenerator/embedded/ConstPowRelation.mch b/src/test/resources/de/hhu/stups/codegenerator/embedded/ConstPowRelation.mch new file mode 100644 index 000000000..7c01e5617 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/embedded/ConstPowRelation.mch @@ -0,0 +1,21 @@ +MACHINE ConstPowRelation + +SETS + Counters={C1, C2, C3} + ;Persons={P1, P2} + +CONCRETE_CONSTANTS + Counter2Person + +PROPERTIES + Counter2Person : POW(Counters <-> Persons) + & Counter2Person = {{(C1|->P1), (C3|->P2)}, {(C1|->P1), (C2|->P2)}} + +INVARIANT /* Machine without Invariant crashes MC-generator (even if MC is disabled...) */ + 1 = 1 + + +OPERATIONS + + out <-- relCount = out := card(Counter2Person) +END diff --git a/src/test/resources/de/hhu/stups/codegenerator/embedded/ConstPowSet.mch b/src/test/resources/de/hhu/stups/codegenerator/embedded/ConstPowSet.mch new file mode 100644 index 000000000..7392a8b96 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/embedded/ConstPowSet.mch @@ -0,0 +1,20 @@ +MACHINE ConstPowSet + +SETS + Persons={P1, P2, P3} + +CONCRETE_CONSTANTS + Groups + +PROPERTIES + Groups <: POW(Persons) + & Groups = {{P1, P3}, {P2}} + +INVARIANT /* Machine without Invariant crashes MC-generater (even if MC is disabled...) */ + 1 = 1 + + +OPERATIONS + + out <-- groupsCount = out := card(Groups) +END diff --git a/src/test/resources/de/hhu/stups/codegenerator/embedded/MaxPowEnumeratedSet.mch b/src/test/resources/de/hhu/stups/codegenerator/embedded/MaxPowEnumeratedSet.mch new file mode 100644 index 000000000..78e0a054f --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/embedded/MaxPowEnumeratedSet.mch @@ -0,0 +1,24 @@ +MACHINE MaxPowEnumeratedSet + +SETS + Counters={C1} + +VARIABLES + AvailableCounters + +INVARIANT + AvailableCounters : POW(POW(POW(POW(Counters)))) + +INITIALISATION + AvailableCounters := {} + +OPERATIONS + + AddCounter(c) = + PRE + /* @grd1 */ c <: POW(POW(Counters)) + THEN + AvailableCounters := AvailableCounters \/ { c } + END + +END diff --git a/src/test/resources/de/hhu/stups/codegenerator/embedded/NestedRelation.mch b/src/test/resources/de/hhu/stups/codegenerator/embedded/NestedRelation.mch new file mode 100644 index 000000000..56bb286d1 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/embedded/NestedRelation.mch @@ -0,0 +1,31 @@ +MACHINE NestedRelation + +SETS + Counters={C1, C2} + ;Persons={P1, P2} + ;Shift={S1, S2} + +VARIABLES + Shift2Counter2Person + +INVARIANT + Shift2Counter2Person : Shift <-> (Counters <-> Persons) + +INITIALISATION + Shift2Counter2Person := {} + +OPERATIONS + + ManCounter(c, p, s) = + PRE + /* @grd1 */ c : Counters + & /* @grd2 */ p : Persons + & s : Shift + & s : dom(Shift2Counter2Person) => ( + c /: dom(Shift2Counter2Person(s)) + & p /: ran(Shift2Counter2Person(s)) + ) + THEN + Shift2Counter2Person(s) := {(c |-> p)} + END +END diff --git a/src/test/resources/de/hhu/stups/codegenerator/embedded/PowRelation.mch b/src/test/resources/de/hhu/stups/codegenerator/embedded/PowRelation.mch new file mode 100644 index 000000000..7d2fee85e --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/embedded/PowRelation.mch @@ -0,0 +1,26 @@ +MACHINE PowRelation + +SETS + Counters={C1, C2, C3} + ;Persons={P1, P2} + +VARIABLES + Counter2Person + +INVARIANT + Counter2Person : POW(Counters <-> Persons) + +INITIALISATION + Counter2Person := {} + +OPERATIONS + + ManCounter(c, p) = + PRE + /* @grd1 */ c : Counters + & /* @grd2 */ p : Persons + & {(c |-> p)} /: Counter2Person + THEN + Counter2Person := Counter2Person \/ {{(c |-> p)}} + END +END diff --git a/src/test/resources/de/hhu/stups/codegenerator/embedded/RedundantConstRelation.mch b/src/test/resources/de/hhu/stups/codegenerator/embedded/RedundantConstRelation.mch new file mode 100644 index 000000000..dbd96cc36 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/embedded/RedundantConstRelation.mch @@ -0,0 +1,21 @@ +MACHINE RedundantConstRelation + +SETS + Persons={P1, P2, P3} + ;Counters={C1, C2} + +CONCRETE_CONSTANTS + Counter2Persons + +PROPERTIES + Counter2Persons : Counters <-> Persons + & Counter2Persons = {(C1|->P1), (C2|->P3)} + +INVARIANT /* Machine without Invariant crashes MC-generator (even if MC is disabled...) */ + 1 = 1 + + +OPERATIONS + + out <-- relCount = out := card(Counter2Persons) +END diff --git a/src/test/resources/de/hhu/stups/codegenerator/embedded/RedundantConstSet.mch b/src/test/resources/de/hhu/stups/codegenerator/embedded/RedundantConstSet.mch new file mode 100644 index 000000000..4a42c0330 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/embedded/RedundantConstSet.mch @@ -0,0 +1,20 @@ +MACHINE RedundantConstSet + +SETS + Persons={P1, P2, P3} + +CONCRETE_CONSTANTS + Managers + +PROPERTIES + Managers <: Persons + & Managers = {P1, P3} + +INVARIANT /* Machine without Invariant crashes MC-generator (even if MC is disabled...) */ + 1 = 1 + + +OPERATIONS + + out <-- workerCount = out := card(Persons - Managers) +END diff --git a/src/test/resources/de/hhu/stups/codegenerator/embedded/SimpleEnumeratedSet.mch b/src/test/resources/de/hhu/stups/codegenerator/embedded/SimpleEnumeratedSet.mch new file mode 100644 index 000000000..e51d430d6 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/embedded/SimpleEnumeratedSet.mch @@ -0,0 +1,23 @@ +MACHINE SimpleEnumeratedSet + +SETS + Counters={C1, C2, C3} + +VARIABLES + AvailableCounters + +INVARIANT + AvailableCounters <: Counters + +INITIALISATION + AvailableCounters := {} + +OPERATIONS + + AddCounter(c) = + PRE + /* @grd1 */ c : Counters + THEN + AvailableCounters := AvailableCounters \/ { c } + END +END diff --git a/src/test/resources/de/hhu/stups/codegenerator/embedded/SimplePowEnumeratedSet.mch b/src/test/resources/de/hhu/stups/codegenerator/embedded/SimplePowEnumeratedSet.mch new file mode 100644 index 000000000..5201c2cad --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/embedded/SimplePowEnumeratedSet.mch @@ -0,0 +1,23 @@ +MACHINE SimplePowEnumeratedSet + +SETS + Counters={C1, C2, C3} + +VARIABLES + AvailableCounters + +INVARIANT + AvailableCounters <: POW(Counters) + +INITIALISATION + AvailableCounters := {} + +OPERATIONS + + AddCounter(c) = + PRE + /* @grd1 */ c <: Counters + THEN + AvailableCounters := AvailableCounters \/ { c } + END +END diff --git a/src/test/resources/de/hhu/stups/codegenerator/embedded/SimplePowPowEnumeratedSet.mch b/src/test/resources/de/hhu/stups/codegenerator/embedded/SimplePowPowEnumeratedSet.mch new file mode 100644 index 000000000..6691df00a --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/embedded/SimplePowPowEnumeratedSet.mch @@ -0,0 +1,23 @@ +MACHINE SimplePowPowEnumeratedSet + +SETS + Counters={C1, C2} + +VARIABLES + AvailableCounters + +INVARIANT + AvailableCounters <: POW(POW(Counters)) + +INITIALISATION + AvailableCounters := {} + +OPERATIONS + + AddCounter(c) = + PRE + /* @grd1 */ c <: POW(Counters) + THEN + AvailableCounters := AvailableCounters \/ { c } + END +END diff --git a/src/test/resources/de/hhu/stups/codegenerator/embedded/SimpleRelation.mch b/src/test/resources/de/hhu/stups/codegenerator/embedded/SimpleRelation.mch new file mode 100644 index 000000000..fd9a21ee4 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/embedded/SimpleRelation.mch @@ -0,0 +1,27 @@ +MACHINE SimpleRelation + +SETS + Counters={C1, C2, C3} + ;Persons={P1, P2} + +VARIABLES + Counter2Person + +INVARIANT + Counter2Person : Counters <-> Persons + +INITIALISATION + Counter2Person := {} + +OPERATIONS + + ManCounter(c, p) = + PRE + /* @grd1 */ c : Counters + & /* @grd2 */ p : Persons + & c /: dom(Counter2Person) + & p /: ran(Counter2Person) + THEN + Counter2Person(c) := p + END +END -- GitLab