diff --git a/language/src/test/java/cocos/ParentComponentInputConnectionDirectionCoCoTest.java b/language/src/test/java/cocos/ParentComponentInputConnectionDirectionCoCoTest.java index 45b1dfc0..4374e2b7 100644 --- a/language/src/test/java/cocos/ParentComponentInputConnectionDirectionCoCoTest.java +++ b/language/src/test/java/cocos/ParentComponentInputConnectionDirectionCoCoTest.java @@ -1,22 +1,26 @@ /* (c) https://github.com/MontiCore/monticore */ package cocos; -import de.monticore.lang.sysmlparts._cocos.SysMLPartsASTConnectionUsageCoCo; 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._parser.SysMLv2Parser; +import de.monticore.lang.sysmlv2._symboltable.ISysMLv2ArtifactScope; import de.monticore.lang.sysmlv2.cocos.ParentComponentInputConnectionDirectionCoCo; +import de.se_rwth.commons.logging.Finding; import de.se_rwth.commons.logging.Log; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import java.io.IOException; +import java.util.List; +import java.util.stream.Collectors; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.assertj.core.api.Assertions.assertThat; public class ParentComponentInputConnectionDirectionCoCoTest { @@ -33,8 +37,9 @@ public static void init() { @BeforeEach public void reset() { SysMLv2Mill.globalScope().clear(); - Log.getFindings().clear(); - Log.enableFailQuick(true); + SysMLv2Mill.initializePrimitives(); + SysMLv2Mill.addCollectionTypes(); + Log.clearFindings(); } @Nested @@ -56,12 +61,10 @@ public void testValid() throws IOException { + "connect sysInAnother to sysOut;" + "}"; - ASTSysMLModel ast = SysMLv2Mill.parser().parse_String(validModel).get(); - SysMLv2Mill.scopesGenitorDelegator().createFromAST(ast); - var checker = new SysMLv2CoCoChecker(); - checker.addCoCo((SysMLPartsASTConnectionUsageCoCo) new ParentComponentInputConnectionDirectionCoCo()); - checker.checkAll(ast); - assertTrue(Log.getFindings().isEmpty()); + var ast = parse(validModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(0); } @Test @@ -80,12 +83,10 @@ public void testValidConjugatedModel() throws IOException { + "connect sysInAnother to sysOut;" + "}"; - ASTSysMLModel ast = SysMLv2Mill.parser().parse_String(validModel).get(); - SysMLv2Mill.scopesGenitorDelegator().createFromAST(ast); - var checker = new SysMLv2CoCoChecker(); - checker.addCoCo((SysMLPartsASTConnectionUsageCoCo) new ParentComponentInputConnectionDirectionCoCo()); - checker.checkAll(ast); - assertTrue(Log.getFindings().isEmpty()); + var ast = parse(validModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(0); } @Test @@ -100,14 +101,11 @@ public void testInvalid() throws IOException { + "connect sysIn to a.output;" + "}"; - ASTSysMLModel ast = SysMLv2Mill.parser().parse_String(invalidModel).get(); - SysMLv2Mill.scopesGenitorDelegator().createFromAST(ast); - var checker = new SysMLv2CoCoChecker(); - checker.addCoCo((SysMLPartsASTConnectionUsageCoCo) new ParentComponentInputConnectionDirectionCoCo()); - Log.enableFailQuick(false); - checker.checkAll(ast); - assertTrue(Log.getFindings().stream() - .anyMatch(f -> f.getMsg().contains("0x10AA6"))); + var ast = parse(invalidModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(1); + assertThat(errors.get(0).getMsg()).contains("0x10AA6"); } @Test @@ -121,14 +119,39 @@ public void testInvalidConjugatedModel() throws IOException { + "connect sysIn to a.output;" + "}"; - ASTSysMLModel ast = SysMLv2Mill.parser().parse_String(invalidModel).get(); - SysMLv2Mill.scopesGenitorDelegator().createFromAST(ast); + var ast = parse(invalidModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(1); + assertThat(errors.get(0).getMsg()).contains("0x10AA6"); + } + + private ASTSysMLModel parse(String model) throws IOException { + var optAst = SysMLv2Mill.parser().parse_String(model); + assertThat(optAst).isPresent(); + return optAst.get(); + } + + private ISysMLv2ArtifactScope createSt(ASTSysMLModel ast) { + var tool = new SysMLv2Tool(); + var scope = tool.createSymbolTable(ast); + tool.completeSymbolTable(ast); + return scope; + } + + private List check(ASTSysMLModel ast) { var checker = new SysMLv2CoCoChecker(); - checker.addCoCo((SysMLPartsASTConnectionUsageCoCo) new ParentComponentInputConnectionDirectionCoCo()); + checker.addCoCo(new ParentComponentInputConnectionDirectionCoCo()); Log.enableFailQuick(false); checker.checkAll(ast); - assertTrue(Log.getFindings().stream() - .anyMatch(f -> f.getMsg().contains("0x10AA6"))); + return Log.getFindings().stream().filter(Finding::isError).collect( + Collectors.toList()); + } + + @AfterEach + void clearLog() { + Log.clearFindings(); + Log.enableFailQuick(true); } } } diff --git a/language/src/test/java/cocos/PartTypeDefinitionExistsCoCoTest.java b/language/src/test/java/cocos/PartTypeDefinitionExistsCoCoTest.java index 3a86deed..a5a0f380 100644 --- a/language/src/test/java/cocos/PartTypeDefinitionExistsCoCoTest.java +++ b/language/src/test/java/cocos/PartTypeDefinitionExistsCoCoTest.java @@ -1,22 +1,26 @@ /* (c) https://github.com/MontiCore/monticore */ package cocos; -import de.monticore.lang.sysmlparts._cocos.SysMLPartsASTPartUsageCoCo; 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._parser.SysMLv2Parser; +import de.monticore.lang.sysmlv2._symboltable.ISysMLv2ArtifactScope; import de.monticore.lang.sysmlv2.cocos.PartTypeDefinitionExistsCoCo; +import de.se_rwth.commons.logging.Finding; import de.se_rwth.commons.logging.Log; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import java.io.IOException; +import java.util.List; +import java.util.stream.Collectors; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.assertj.core.api.Assertions.assertThat; public class PartTypeDefinitionExistsCoCoTest { @@ -33,8 +37,9 @@ public static void init() { @BeforeEach public void reset() { SysMLv2Mill.globalScope().clear(); - Log.getFindings().clear(); - Log.enableFailQuick(true); + SysMLv2Mill.initializePrimitives(); + SysMLv2Mill.addCollectionTypes(); + Log.clearFindings(); } @Nested @@ -49,12 +54,10 @@ public void testValid() throws IOException { + "part subcomp2: SubComponent2;" + "}"; - ASTSysMLModel ast = SysMLv2Mill.parser().parse_String(validModel).get(); - SysMLv2Mill.scopesGenitorDelegator().createFromAST(ast); - var checker = new SysMLv2CoCoChecker(); - checker.addCoCo((SysMLPartsASTPartUsageCoCo) new PartTypeDefinitionExistsCoCo()); - checker.checkAll(ast); - assertTrue(Log.getFindings().isEmpty()); + var ast = parse(validModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(0); } @Test @@ -66,15 +69,39 @@ public void testInvalid() throws IOException { + "part subcomp2: UndefinedComponent;" + "}"; - ASTSysMLModel ast = SysMLv2Mill.parser().parse_String(invalidModel).get(); - SysMLv2Mill.scopesGenitorDelegator().createFromAST(ast); + var ast = parse(invalidModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(1); + assertThat(errors.get(0).getMsg()).contains("0x10AA1"); + } + + private ASTSysMLModel parse(String model) throws IOException { + var optAst = SysMLv2Mill.parser().parse_String(model); + assertThat(optAst).isPresent(); + return optAst.get(); + } + + private ISysMLv2ArtifactScope createSt(ASTSysMLModel ast) { + var tool = new SysMLv2Tool(); + var scope = tool.createSymbolTable(ast); + tool.completeSymbolTable(ast); + return scope; + } + + private List check(ASTSysMLModel ast) { var checker = new SysMLv2CoCoChecker(); - checker.addCoCo((SysMLPartsASTPartUsageCoCo) new PartTypeDefinitionExistsCoCo()); + checker.addCoCo(new PartTypeDefinitionExistsCoCo()); Log.enableFailQuick(false); checker.checkAll(ast); - assertTrue(Log.getFindings().stream() - .anyMatch(f -> f.getMsg().contains("0x10AA1"))); + return Log.getFindings().stream().filter(Finding::isError).collect( + Collectors.toList()); } - } + @AfterEach + void clearLog() { + Log.clearFindings(); + Log.enableFailQuick(true); + } + } } diff --git a/language/src/test/java/cocos/QualifiedPortNameExistsCoCoTest.java b/language/src/test/java/cocos/QualifiedPortNameExistsCoCoTest.java index 8598a274..b55a6e8e 100644 --- a/language/src/test/java/cocos/QualifiedPortNameExistsCoCoTest.java +++ b/language/src/test/java/cocos/QualifiedPortNameExistsCoCoTest.java @@ -1,24 +1,26 @@ /* (c) https://github.com/MontiCore/monticore */ package cocos; -import de.monticore.lang.sysmlparts._cocos.SysMLPartsASTConnectionUsageCoCo; -import de.monticore.lang.sysmlparts._cocos.SysMLPartsASTPartDefCoCo; -import de.monticore.lang.sysmlparts._cocos.SysMLPartsASTPartUsageCoCo; 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._parser.SysMLv2Parser; +import de.monticore.lang.sysmlv2._symboltable.ISysMLv2ArtifactScope; import de.monticore.lang.sysmlv2.cocos.QualifiedPortNameExistsCoCo; +import de.se_rwth.commons.logging.Finding; import de.se_rwth.commons.logging.Log; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import java.io.IOException; +import java.util.List; +import java.util.stream.Collectors; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.assertj.core.api.Assertions.assertThat; public class QualifiedPortNameExistsCoCoTest { @@ -35,8 +37,9 @@ public static void init() { @BeforeEach public void reset() { SysMLv2Mill.globalScope().clear(); - Log.getFindings().clear(); - Log.enableFailQuick(true); + SysMLv2Mill.initializePrimitives(); + SysMLv2Mill.addCollectionTypes(); + Log.clearFindings(); } @Nested @@ -52,12 +55,10 @@ public void testValid() throws IOException { + "connect a.p to b.q;" + "}"; - ASTSysMLModel ast = SysMLv2Mill.parser().parse_String(validModel).get(); - SysMLv2Mill.scopesGenitorDelegator().createFromAST(ast); - var checker = new SysMLv2CoCoChecker(); - checker.addCoCo(new QualifiedPortNameExistsCoCo()); - checker.checkAll(ast); - assertTrue(Log.getFindings().isEmpty()); + var ast = parse(validModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(0); } @Test @@ -71,14 +72,39 @@ public void testInvalid() throws IOException { + "connect a.wrongName to b.q;" + "}"; - ASTSysMLModel ast = SysMLv2Mill.parser().parse_String(invalidModel).get(); - SysMLv2Mill.scopesGenitorDelegator().createFromAST(ast); + var ast = parse(invalidModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(1); + assertThat(errors.get(0).getMsg()).contains("0x10AA4"); + } + + private ASTSysMLModel parse(String model) throws IOException { + var optAst = SysMLv2Mill.parser().parse_String(model); + assertThat(optAst).isPresent(); + return optAst.get(); + } + + private ISysMLv2ArtifactScope createSt(ASTSysMLModel ast) { + var tool = new SysMLv2Tool(); + var scope = tool.createSymbolTable(ast); + tool.completeSymbolTable(ast); + return scope; + } + + private List check(ASTSysMLModel ast) { var checker = new SysMLv2CoCoChecker(); checker.addCoCo(new QualifiedPortNameExistsCoCo()); Log.enableFailQuick(false); checker.checkAll(ast); - assertTrue(Log.getFindings().stream() - .anyMatch(f -> f.getMsg().contains("0x10AA4"))); + return Log.getFindings().stream().filter(Finding::isError).collect( + Collectors.toList()); + } + + @AfterEach + void clearLog() { + Log.clearFindings(); + Log.enableFailQuick(true); } } } diff --git a/language/src/test/java/cocos/RefinementTargetDefinitionExistsCoCoTest.java b/language/src/test/java/cocos/RefinementTargetDefinitionExistsCoCoTest.java index 550587ac..a9e924de 100644 --- a/language/src/test/java/cocos/RefinementTargetDefinitionExistsCoCoTest.java +++ b/language/src/test/java/cocos/RefinementTargetDefinitionExistsCoCoTest.java @@ -1,22 +1,26 @@ /* (c) https://github.com/MontiCore/monticore */ package cocos; -import de.monticore.lang.sysmlparts._cocos.SysMLPartsASTPartDefCoCo; 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._parser.SysMLv2Parser; +import de.monticore.lang.sysmlv2._symboltable.ISysMLv2ArtifactScope; import de.monticore.lang.sysmlv2.cocos.RefinementTargetDefinitionExistsCoCo; +import de.se_rwth.commons.logging.Finding; import de.se_rwth.commons.logging.Log; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import java.io.IOException; +import java.util.List; +import java.util.stream.Collectors; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.assertj.core.api.Assertions.assertThat; public class RefinementTargetDefinitionExistsCoCoTest { @@ -33,8 +37,9 @@ public static void init() { @BeforeEach public void reset() { SysMLv2Mill.globalScope().clear(); - Log.getFindings().clear(); - Log.enableFailQuick(true); + SysMLv2Mill.initializePrimitives(); + SysMLv2Mill.addCollectionTypes(); + Log.clearFindings(); } @Nested @@ -45,27 +50,49 @@ public void testValid() throws IOException { "part def BasePart;" + "part def Refining refines BasePart;"; - ASTSysMLModel ast = SysMLv2Mill.parser().parse_String(validModel).get(); - SysMLv2Mill.scopesGenitorDelegator().createFromAST(ast); - var checker = new SysMLv2CoCoChecker(); - checker.addCoCo((SysMLPartsASTPartDefCoCo) new RefinementTargetDefinitionExistsCoCo()); - checker.checkAll(ast); - assertTrue(Log.getFindings().isEmpty()); + var ast = parse(validModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(0); } @Test public void testInvalid() throws IOException { String invalidModel = "part def Refining refines UndefinedBasePart;"; - ASTSysMLModel ast = SysMLv2Mill.parser().parse_String(invalidModel).get(); - SysMLv2Mill.scopesGenitorDelegator().createFromAST(ast); + var ast = parse(invalidModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(1); + assertThat(errors.get(0).getMsg()).contains("0x10AA2"); + } + + private ASTSysMLModel parse(String model) throws IOException { + var optAst = SysMLv2Mill.parser().parse_String(model); + assertThat(optAst).isPresent(); + return optAst.get(); + } + + private ISysMLv2ArtifactScope createSt(ASTSysMLModel ast) { + var tool = new SysMLv2Tool(); + var scope = tool.createSymbolTable(ast); + tool.completeSymbolTable(ast); + return scope; + } + + private List check(ASTSysMLModel ast) { var checker = new SysMLv2CoCoChecker(); - checker.addCoCo((SysMLPartsASTPartDefCoCo) new RefinementTargetDefinitionExistsCoCo()); + checker.addCoCo(new RefinementTargetDefinitionExistsCoCo()); Log.enableFailQuick(false); checker.checkAll(ast); - assertTrue(Log.getFindings().stream() - .anyMatch(f -> f.getMsg().contains("0x10AA2"))); + return Log.getFindings().stream().filter(Finding::isError).collect( + Collectors.toList()); } - } + @AfterEach + void clearLog() { + Log.clearFindings(); + Log.enableFailQuick(true); + } + } } diff --git a/language/src/test/java/cocos/SubcomponentOutputConnectionDirectionCoCoTest.java b/language/src/test/java/cocos/SubcomponentOutputConnectionDirectionCoCoTest.java index 3e706be7..18c74360 100644 --- a/language/src/test/java/cocos/SubcomponentOutputConnectionDirectionCoCoTest.java +++ b/language/src/test/java/cocos/SubcomponentOutputConnectionDirectionCoCoTest.java @@ -1,22 +1,26 @@ /* (c) https://github.com/MontiCore/monticore */ package cocos; -import de.monticore.lang.sysmlparts._cocos.SysMLPartsASTConnectionUsageCoCo; 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._parser.SysMLv2Parser; +import de.monticore.lang.sysmlv2._symboltable.ISysMLv2ArtifactScope; import de.monticore.lang.sysmlv2.cocos.SubcomponentOutputConnectionDirectionCoCo; +import de.se_rwth.commons.logging.Finding; import de.se_rwth.commons.logging.Log; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import java.io.IOException; +import java.util.List; +import java.util.stream.Collectors; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.assertj.core.api.Assertions.assertThat; public class SubcomponentOutputConnectionDirectionCoCoTest { @@ -33,8 +37,9 @@ public static void init() { @BeforeEach public void reset() { SysMLv2Mill.globalScope().clear(); - Log.getFindings().clear(); - Log.enableFailQuick(true); + SysMLv2Mill.initializePrimitives(); + SysMLv2Mill.addCollectionTypes(); + Log.clearFindings(); } @Nested @@ -56,12 +61,10 @@ public void testValid() throws IOException { + "connect a.output to b.input;" // (Sub) Output -> (Sub) Input + "connect c.output to sysOutput;" // (Sub) Output -> (main) Output + "}"; - ASTSysMLModel ast = SysMLv2Mill.parser().parse_String(validModel).get(); - SysMLv2Mill.scopesGenitorDelegator().createFromAST(ast); - var checker = new SysMLv2CoCoChecker(); - checker.addCoCo((SysMLPartsASTConnectionUsageCoCo) new SubcomponentOutputConnectionDirectionCoCo()); - checker.checkAll(ast); - assertTrue(Log.getFindings().isEmpty()); + var ast = parse(validModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(0); } @Test @@ -79,12 +82,10 @@ public void testValidConjugatedModel() throws IOException { + "connect a.output to b.input;" // (Sub) Output -> (Sub) Input + "connect c.output to sysOutput;" // (Sub) Output -> (main) Output + "}"; - ASTSysMLModel ast = SysMLv2Mill.parser().parse_String(validModel).get(); - SysMLv2Mill.scopesGenitorDelegator().createFromAST(ast); - var checker = new SysMLv2CoCoChecker(); - checker.addCoCo((SysMLPartsASTConnectionUsageCoCo) new SubcomponentOutputConnectionDirectionCoCo()); - checker.checkAll(ast); - assertTrue(Log.getFindings().isEmpty()); + var ast = parse(validModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(0); } @Test @@ -99,14 +100,11 @@ public void testInvalidSubOutToSubOut() throws IOException { + "connect a.output to b.output;" // (Sub) Output -> (Sub) Output + "}"; - ASTSysMLModel ast = SysMLv2Mill.parser().parse_String(invalidModel).get(); - SysMLv2Mill.scopesGenitorDelegator().createFromAST(ast); - var checker = new SysMLv2CoCoChecker(); - checker.addCoCo((SysMLPartsASTConnectionUsageCoCo) new SubcomponentOutputConnectionDirectionCoCo()); - Log.enableFailQuick(false); - checker.checkAll(ast); - assertTrue(Log.getFindings().stream() - .anyMatch(f -> f.getMsg().contains("0x10AA5"))); + var ast = parse(invalidModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(1); + assertThat(errors.get(0).getMsg()).contains("0x10AA5"); } @Test @@ -120,14 +118,11 @@ public void testInvalidSubOutToMainInConjugatedModel() throws IOException { + "connect a.output to sysInput;" // (Sub) Output -> (main) Input + "}"; - ASTSysMLModel ast = SysMLv2Mill.parser().parse_String(invalidModel).get(); - SysMLv2Mill.scopesGenitorDelegator().createFromAST(ast); - var checker = new SysMLv2CoCoChecker(); - checker.addCoCo((SysMLPartsASTConnectionUsageCoCo) new SubcomponentOutputConnectionDirectionCoCo()); - Log.enableFailQuick(false); - checker.checkAll(ast); - assertTrue(Log.getFindings().stream() - .anyMatch(f -> f.getMsg().contains("0x10AA5"))); + var ast = parse(invalidModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(1); + assertThat(errors.get(0).getMsg()).contains("0x10AA5"); } @Test @@ -142,14 +137,39 @@ public void testInvalidSubOutToMainIn() throws IOException { + "connect a.output to sysInput;" // (Sub) Output -> (main) Input + "}"; - ASTSysMLModel ast = SysMLv2Mill.parser().parse_String(invalidModel).get(); - SysMLv2Mill.scopesGenitorDelegator().createFromAST(ast); + var ast = parse(invalidModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(1); + assertThat(errors.get(0).getMsg()).contains("0x10AA5"); + } + + private ASTSysMLModel parse(String model) throws IOException { + var optAst = SysMLv2Mill.parser().parse_String(model); + assertThat(optAst).isPresent(); + return optAst.get(); + } + + private ISysMLv2ArtifactScope createSt(ASTSysMLModel ast) { + var tool = new SysMLv2Tool(); + var scope = tool.createSymbolTable(ast); + tool.completeSymbolTable(ast); + return scope; + } + + private List check(ASTSysMLModel ast) { var checker = new SysMLv2CoCoChecker(); - checker.addCoCo((SysMLPartsASTConnectionUsageCoCo) new SubcomponentOutputConnectionDirectionCoCo()); + checker.addCoCo(new SubcomponentOutputConnectionDirectionCoCo()); Log.enableFailQuick(false); checker.checkAll(ast); - assertTrue(Log.getFindings().stream() - .anyMatch(f -> f.getMsg().contains("0x10AA5"))); + return Log.getFindings().stream().filter(Finding::isError).collect( + Collectors.toList()); + } + + @AfterEach + void clearLog() { + Log.clearFindings(); + Log.enableFailQuick(true); } } } diff --git a/language/src/test/java/cocos/UniqueSubPartNamesInConnectionCoCoTest.java b/language/src/test/java/cocos/UniqueSubPartNamesInConnectionCoCoTest.java index d7d11bca..38913d6b 100644 --- a/language/src/test/java/cocos/UniqueSubPartNamesInConnectionCoCoTest.java +++ b/language/src/test/java/cocos/UniqueSubPartNamesInConnectionCoCoTest.java @@ -1,23 +1,26 @@ /* (c) https://github.com/MontiCore/monticore */ package cocos; -import de.monticore.lang.sysmlparts._cocos.SysMLPartsASTConnectionUsageCoCo; -import de.monticore.lang.sysmlparts._cocos.SysMLPartsASTPartDefCoCo; 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._parser.SysMLv2Parser; +import de.monticore.lang.sysmlv2._symboltable.ISysMLv2ArtifactScope; import de.monticore.lang.sysmlv2.cocos.UniqueSubPartNamesInConnectionCoCo; +import de.se_rwth.commons.logging.Finding; import de.se_rwth.commons.logging.Log; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import java.io.IOException; +import java.util.List; +import java.util.stream.Collectors; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.assertj.core.api.Assertions.assertThat; public class UniqueSubPartNamesInConnectionCoCoTest { @@ -34,8 +37,9 @@ public static void init() { @BeforeEach public void reset() { SysMLv2Mill.globalScope().clear(); - Log.getFindings().clear(); - Log.enableFailQuick(true); + SysMLv2Mill.initializePrimitives(); + SysMLv2Mill.addCollectionTypes(); + Log.clearFindings(); } @Nested @@ -51,12 +55,10 @@ public void testValid() throws IOException { + "connect a.p to b.q;" + "}"; - ASTSysMLModel ast = SysMLv2Mill.parser().parse_String(validModel).get(); - SysMLv2Mill.scopesGenitorDelegator().createFromAST(ast); - var checker = new SysMLv2CoCoChecker(); - checker.addCoCo((SysMLPartsASTConnectionUsageCoCo) new UniqueSubPartNamesInConnectionCoCo()); - checker.checkAll(ast); - assertTrue(Log.getFindings().isEmpty()); + var ast = parse(validModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(0); } @Test @@ -69,14 +71,11 @@ public void testInvalidUndefined() throws IOException { + "connect a.p to c.q;" + "}"; - ASTSysMLModel ast = SysMLv2Mill.parser().parse_String(invalidModel).get(); - SysMLv2Mill.scopesGenitorDelegator().createFromAST(ast); - var checker = new SysMLv2CoCoChecker(); - checker.addCoCo((SysMLPartsASTConnectionUsageCoCo) new UniqueSubPartNamesInConnectionCoCo()); - Log.enableFailQuick(false); - checker.checkAll(ast); - assertTrue(Log.getFindings().stream() - .anyMatch(f -> f.getMsg().contains("0x10AA3"))); + var ast = parse(invalidModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(1); + assertThat(errors.get(0).getMsg()).contains("0x10AA3"); } @Test @@ -89,14 +88,75 @@ public void testInvalidDuplicateName() throws IOException { + "connect a.p to a.p;" + "}"; - ASTSysMLModel ast = SysMLv2Mill.parser().parse_String(invalidModel).get(); - SysMLv2Mill.scopesGenitorDelegator().createFromAST(ast); + var ast = parse(invalidModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(2); + assertThat(errors.get(0).getMsg()).contains("0x10AA3"); + assertThat(errors.get(1).getMsg()).contains("0x10AA3"); + } + + @Test + public void testInvalidBothUndefined() throws IOException { + String invalidModel = + "part def A { port p; }" + + "part def System {" + + "part a: A;" + + "connect undefined1.p to undefined2.p;" + + "}"; + + var ast = parse(invalidModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(2); + assertThat(errors.get(0).getMsg()).contains("0x10AA3"); + assertThat(errors.get(1).getMsg()).contains("0x10AA3"); + } + + @Test + public void testInvalidUndefinedAndDuplicateName() throws IOException { + String invalidModel = + "part def A { port p; }" + + "part def System {" + + "part duplicate1: A;" + + "part duplicate1: ~A;" + + "connect duplicate1.p to undefined3.p;" + + "}"; + + var ast = parse(invalidModel); + createSt(ast); + var errors = check(ast); + assertThat(errors).hasSize(2); + assertThat(errors.get(0).getMsg()).contains("0x10AA3"); + assertThat(errors.get(1).getMsg()).contains("0x10AA3"); + } + + private ASTSysMLModel parse(String model) throws IOException { + var optAst = SysMLv2Mill.parser().parse_String(model); + assertThat(optAst).isPresent(); + return optAst.get(); + } + + private ISysMLv2ArtifactScope createSt(ASTSysMLModel ast) { + var tool = new SysMLv2Tool(); + var scope = tool.createSymbolTable(ast); + tool.completeSymbolTable(ast); + return scope; + } + + private List check(ASTSysMLModel ast) { var checker = new SysMLv2CoCoChecker(); checker.addCoCo(new UniqueSubPartNamesInConnectionCoCo()); Log.enableFailQuick(false); checker.checkAll(ast); - assertTrue(Log.getFindings().stream() - .anyMatch(f -> f.getMsg().contains("0x10AA3"))); + return Log.getFindings().stream().filter(Finding::isError).collect( + Collectors.toList()); + } + + @AfterEach + void clearLog() { + Log.clearFindings(); + Log.enableFailQuick(true); } } }