From c4590c4734ffb5ff6b32b1587b3271b876eb9dad Mon Sep 17 00:00:00 2001 From: MKZaito <127297267+MKZaito@users.noreply.github.com> Date: Thu, 2 Apr 2026 21:07:21 +0200 Subject: [PATCH] TC3 Test --- .../java/cocos/ReproduceTC3FindingsTest.java | 130 ++++++++++++++++++ .../test/resources/cocos/repro/model1.sysml | 1 + .../test/resources/cocos/repro/model2.sysml | 11 ++ .../test/resources/cocos/repro/model3.sysml | 6 + .../test/resources/cocos/repro/model4.sysml | 12 ++ .../test/resources/cocos/repro/model5.sysml | 6 + .../test/resources/cocos/repro/model6.sysml | 24 ++++ .../test/resources/cocos/repro/model7.sysml | 19 +++ .../test/resources/cocos/repro/model8.sysml | 18 +++ .../test/resources/cocos/repro/model9.sysml | 10 ++ 10 files changed, 237 insertions(+) create mode 100644 language/src/test/java/cocos/ReproduceTC3FindingsTest.java create mode 100644 language/src/test/resources/cocos/repro/model1.sysml create mode 100644 language/src/test/resources/cocos/repro/model2.sysml create mode 100644 language/src/test/resources/cocos/repro/model3.sysml create mode 100644 language/src/test/resources/cocos/repro/model4.sysml create mode 100644 language/src/test/resources/cocos/repro/model5.sysml create mode 100644 language/src/test/resources/cocos/repro/model6.sysml create mode 100644 language/src/test/resources/cocos/repro/model7.sysml create mode 100644 language/src/test/resources/cocos/repro/model8.sysml create mode 100644 language/src/test/resources/cocos/repro/model9.sysml diff --git a/language/src/test/java/cocos/ReproduceTC3FindingsTest.java b/language/src/test/java/cocos/ReproduceTC3FindingsTest.java new file mode 100644 index 00000000..23e09279 --- /dev/null +++ b/language/src/test/java/cocos/ReproduceTC3FindingsTest.java @@ -0,0 +1,130 @@ +package cocos; + +import de.monticore.lang.sysmlv2.SysMLv2Mill; +import de.monticore.lang.sysmlv2.SysMLv2Tool; +import de.monticore.lang.sysmlv2._ast.ASTSysMLModel; +import de.monticore.lang.sysmlv2._cocos.SysMLv2CoCoChecker; +import de.monticore.lang.sysmlv2.cocos.AssignActionTypeCheck3; +import de.monticore.lang.sysmlv2.cocos.ConstraintIsBooleanTC3; +import de.monticore.lang.sysmlv2.cocos.SendActionTypeCheck3; +import de.monticore.lang.sysmlv2.cocos.SpecializationExistsTC3; +import de.monticore.lang.sysmlv2.cocos.TypeCheck3TransitionGuards; +import de.monticore.lang.sysmlv2.types3.SysMLTypeCheck3; +import de.se_rwth.commons.logging.Finding; +import de.se_rwth.commons.logging.Log; +import de.se_rwth.commons.logging.LogStub; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Optional; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ReproduceTC3FindingsTest { + + private static final String MODEL_PATH = "src/test/resources/cocos/repro"; + + private SysMLv2Tool tool; + + @BeforeAll public static void init() { + LogStub.init(); + } + + @BeforeEach public void reset() { + Log.getFindings().clear(); + SysMLv2Mill.reset(); + SysMLv2Mill.init(); + SysMLv2Mill.prepareGlobalScope(); + + tool = new SysMLv2Tool(); + tool.init(); + //SysMLTypeCheck3.init(); + } + + @Disabled + @ParameterizedTest + @ValueSource(strings = { + "model1.sysml", + "model2.sysml", + "model3.sysml", + "model4.sysml", + "model5.sysml", + "model6.sysml", + "model7.sysml", + "model8.sysml", + "model9.sysml", + }) + public void reproducingErrors(String modelName) throws IOException { + Path file = Paths.get(MODEL_PATH, modelName); + System.out.println("Testing reproducing model: " + modelName); + + Optional optAst = SysMLv2Mill.parser().parse(file.toString()); + assertThat(optAst).isPresent(); + ASTSysMLModel model = optAst.get(); + + tool.createSymbolTable(model); + tool.completeSymbolTable(model); + tool.finalizeSymbolTable(model); + + + var constraintIsBooleanChecker = new SysMLv2CoCoChecker(); + constraintIsBooleanChecker.addCoCo(new ConstraintIsBooleanTC3()); + + var specializationExistsTC3Checker = new SysMLv2CoCoChecker(); + specializationExistsTC3Checker.addCoCo(new SpecializationExistsTC3()); + + var typeCheck3TransitionGuardsChecker = new SysMLv2CoCoChecker(); + typeCheck3TransitionGuardsChecker.addCoCo(new TypeCheck3TransitionGuards()); + + var sendActionTypeCheck3Checker = new SysMLv2CoCoChecker(); + sendActionTypeCheck3Checker.addCoCo(new SendActionTypeCheck3()); + + var assignActionTypeCheck3Checker = new SysMLv2CoCoChecker(); + assignActionTypeCheck3Checker.addCoCo(new AssignActionTypeCheck3()); + + var checker = new SysMLv2CoCoChecker(); + checker.addCoCo(new ConstraintIsBooleanTC3()); + checker.addCoCo(new SpecializationExistsTC3()); + checker.addCoCo(new TypeCheck3TransitionGuards()); + checker.addCoCo(new SendActionTypeCheck3()); + checker.addCoCo(new AssignActionTypeCheck3()); + + + // checkCoCo(model, typeCheck3TransitionGuardsChecker, "TypeCheck3TransitionGuards", modelName); + // checkCoCo(model, sendActionTypeCheck3Checker, "SendActionTypeCheck3", modelName); + // checkCoCo(model, assignActionTypeCheck3Checker, "AssignActionTypeCheck3", modelName); + // checkCoCo(model, constraintIsBooleanChecker, "ConstraintIsBooleanTC3",modelName); + // checkCoCo(model, specializationExistsTC3Checker, "SpecializationExistsTC3", modelName); + + checkCoCo(model, checker, "All TC3 CoCos", modelName); + } + + private void checkCoCo(ASTSysMLModel model, SysMLv2CoCoChecker coCoChecker, String cocoName, String modelName) { + + Log.clearFindings(); + try { + coCoChecker.checkAll(model); + } catch (Exception e) { + System.out.println("[Error] CoCo " + cocoName + + " error caused by " + modelName + + ": " + e.getMessage()); + return; + } + //new findings + if (!Log.getFindings().isEmpty()) { + System.out.println("[FAIL] CoCo " + cocoName + + " found " + Log.getFindings().size() + + " issues in " + modelName); + Log.getFindings().forEach(f -> System.out.println("[LOG] " + f)); + } else { + System.out.println("[PASS] CoCo " + cocoName); + } + } +} diff --git a/language/src/test/resources/cocos/repro/model1.sysml b/language/src/test/resources/cocos/repro/model1.sysml new file mode 100644 index 00000000..97d3d7cf --- /dev/null +++ b/language/src/test/resources/cocos/repro/model1.sysml @@ -0,0 +1 @@ +part def Repro0xA0324 :> MissingSymbol; diff --git a/language/src/test/resources/cocos/repro/model2.sysml b/language/src/test/resources/cocos/repro/model2.sysml new file mode 100644 index 00000000..234db6a6 --- /dev/null +++ b/language/src/test/resources/cocos/repro/model2.sysml @@ -0,0 +1,11 @@ +part def Repro0xF737F { + attribute data : Packet; + require constraint { + forall v in data.values(): + v.size == 0 + } +} + +attribute def Packet { + attribute size : int; +} diff --git a/language/src/test/resources/cocos/repro/model3.sysml b/language/src/test/resources/cocos/repro/model3.sysml new file mode 100644 index 00000000..765f52fa --- /dev/null +++ b/language/src/test/resources/cocos/repro/model3.sysml @@ -0,0 +1,6 @@ +requirement Repro0xF737F { + attribute input : boolean; + require constraint { + input.values == true + } +} diff --git a/language/src/test/resources/cocos/repro/model4.sysml b/language/src/test/resources/cocos/repro/model4.sysml new file mode 100644 index 00000000..3808a8da --- /dev/null +++ b/language/src/test/resources/cocos/repro/model4.sysml @@ -0,0 +1,12 @@ +requirement Repro0xF737F { + subject c : SomePart; + require constraint { + c.behavior.something == true + } +} + +part def SomePart { + #delayed exhibit state behavior { + state S; + } +} diff --git a/language/src/test/resources/cocos/repro/model5.sysml b/language/src/test/resources/cocos/repro/model5.sysml new file mode 100644 index 00000000..ea3d68e7 --- /dev/null +++ b/language/src/test/resources/cocos/repro/model5.sysml @@ -0,0 +1,6 @@ +requirement Repro0x7C001 { + attribute input : boolean; + require constraint { + input = true + } +} diff --git a/language/src/test/resources/cocos/repro/model6.sysml b/language/src/test/resources/cocos/repro/model6.sysml new file mode 100644 index 00000000..7f665276 --- /dev/null +++ b/language/src/test/resources/cocos/repro/model6.sysml @@ -0,0 +1,24 @@ +requirement Repro0xB0166 { + subject p : PartWithPort; + require constraint { + p.port1.val == true + } +} + +part def PartWithPort { + port port1 : PortDef; +} + +port def PortDef { + attribute val : boolean; +} + +part myPart { + port myPort : PortDef; + satisfy Repro0xB0166 { + subject p = myPort; + } + require constraint { + myPort.val == true + } +} diff --git a/language/src/test/resources/cocos/repro/model7.sysml b/language/src/test/resources/cocos/repro/model7.sysml new file mode 100644 index 00000000..a15bede3 --- /dev/null +++ b/language/src/test/resources/cocos/repro/model7.sysml @@ -0,0 +1,19 @@ +package Repro0xB0166{ +port def Booleans { + in attribute val: boolean; +} + +part def model2 { + port input: Booleans; + port output: ~Booleans; +} + +requirement 'Requirement' { + subject m2: model2; + attribute a: boolean; + + assert constraint { + m2.input.val == implies true + } +} +} diff --git a/language/src/test/resources/cocos/repro/model8.sysml b/language/src/test/resources/cocos/repro/model8.sysml new file mode 100644 index 00000000..18859e0d --- /dev/null +++ b/language/src/test/resources/cocos/repro/model8.sysml @@ -0,0 +1,18 @@ +package Repro0xFD118{ +port def Booleans { + in attribute val: boolean; +} + +part def model1 { + port input: Booleans; + port output: ~Booleans; +} + +requirement 'Requirement' { + subject model1; + + assert constraint { + input.val == implies true + } +} +} diff --git a/language/src/test/resources/cocos/repro/model9.sysml b/language/src/test/resources/cocos/repro/model9.sysml new file mode 100644 index 00000000..9ca81181 --- /dev/null +++ b/language/src/test/resources/cocos/repro/model9.sysml @@ -0,0 +1,10 @@ +requirement Repro0xFD226 { + attribute input : boolean; + part def S { + attribute input : int; + } + subject s : S; + require constraint { + input = true + } +}