diff --git a/javaDSL/src/main/java/de/monticore/java/reporting/JavaDSL2ODDelegator.java b/javaDSL/src/main/java/de/monticore/java/reporting/JavaDSL2ODDelegator.java index e3c10b3d..1f29f85e 100644 --- a/javaDSL/src/main/java/de/monticore/java/reporting/JavaDSL2ODDelegator.java +++ b/javaDSL/src/main/java/de/monticore/java/reporting/JavaDSL2ODDelegator.java @@ -71,15 +71,10 @@ public JavaDSL2ODDelegator(IndentPrinter printer, ReportingRepository reporting) MCArrayTypes2OD mcArrayTypes = new MCArrayTypes2OD(printer, reporting); this.traverser.add4MCArrayTypes(mcArrayTypes); this.traverser.setMCArrayTypesHandler(mcArrayTypes); - - /* - * TODO - * MCBasics2OD does not implement MCBasicsHandler. Figure out if - * this is a bug or intended. - */ + MCBasics2OD mcBasics = new MCBasics2OD(printer, reporting); this.traverser.add4MCBasics(mcBasics); -// this.traverser.setMCBasicsHandler(mcBasics); + this.traverser.setMCBasicsHandler(mcBasics); MCBasicTypes2OD mcBasicTypes = new MCBasicTypes2OD(printer, reporting); this.traverser.add4MCBasicTypes(mcBasicTypes); diff --git a/javaDSL/src/main/java/de/monticore/java/reporting/JavaDSLNodeIdentHelper.java b/javaDSL/src/main/java/de/monticore/java/reporting/JavaDSLNodeIdentHelper.java index 90ac2169..87677896 100644 --- a/javaDSL/src/main/java/de/monticore/java/reporting/JavaDSLNodeIdentHelper.java +++ b/javaDSL/src/main/java/de/monticore/java/reporting/JavaDSLNodeIdentHelper.java @@ -16,10 +16,8 @@ import de.monticore.statements.mccommonstatements._ast.ASTFormalParameter; import de.monticore.statements.mcvardeclarationstatements._ast.ASTDeclaratorId; import de.monticore.statements.mcvardeclarationstatements._ast.ASTVariableDeclarator; -import de.monticore.types.mcbasictypes.MCBasicTypesMill; import de.monticore.types.mcbasictypes._ast.ASTMCPrimitiveType; import de.monticore.types.mcbasictypes._ast.ASTMCQualifiedName; -import de.monticore.types.typeparameters._ast.ASTTypeParameters; public class JavaDSLNodeIdentHelper extends ASTNodeIdentHelper { @@ -142,7 +140,15 @@ public String getIdent(ASTMCPrimitiveType node) { String name = node.printType(); return format(name, type); } - + + public String getIdent(ASTStringLiteral symbol) { + return format(symbol.getValue()); + } + + public String getIdent(ASTIntLiteral symbol) { + return format(String.valueOf(symbol.getValue())); + } + @Override public String getIdent(ASTNode a) { if (a instanceof ASTConstructorDeclaration) { @@ -190,9 +196,6 @@ else if (a instanceof ASTMCQualifiedName) { else if (a instanceof ASTFieldDeclaration) { return getIdent((ASTFieldDeclaration) a); } - else if (a instanceof ASTTypeParameters) { - return getIdent((ASTTypeParameters) a); - } else if (a instanceof ASTEnumDeclaration) { return getIdent((ASTEnumDeclaration) a); } diff --git a/javaDSL/src/test/java/de/monticore/java/AbstractTest.java b/javaDSL/src/test/java/de/monticore/java/AbstractTest.java index 1006df8e..a560961c 100644 --- a/javaDSL/src/test/java/de/monticore/java/AbstractTest.java +++ b/javaDSL/src/test/java/de/monticore/java/AbstractTest.java @@ -23,8 +23,7 @@ public void reset() { LogStub.init(); JavaDSLMill.init(); JavaDSLMill.globalScope().clear(); - CD4CodeMill.init(); - CD4CodeMill.globalScope().clear(); + LogStub.getFindings().clear(); } } \ No newline at end of file diff --git a/javaDSL/src/test/java/de/monticore/java/JavaDSLParserTest.java b/javaDSL/src/test/java/de/monticore/java/JavaDSLParserTest.java index 7b9a10db..b83289f6 100644 --- a/javaDSL/src/test/java/de/monticore/java/JavaDSLParserTest.java +++ b/javaDSL/src/test/java/de/monticore/java/JavaDSLParserTest.java @@ -3,17 +3,16 @@ import de.monticore.expressions.expressionsbasis._ast.ASTExpression; import de.monticore.java.javadsl.JavaDSLMill; -import de.monticore.java.javadsl._ast.ASTCompilationUnit; import de.monticore.java.javadsl._ast.ASTJavaBlock; import de.monticore.java.javadsl._ast.ASTTextBlockLiteral; import de.monticore.java.javadsl._parser.JavaDSLParser; import de.monticore.literals.mcliteralsbasis._ast.ASTLiteral; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import java.io.IOException; import java.io.StringReader; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Optional; import static de.monticore.java.JavaDSLAssertions.*; @@ -22,39 +21,20 @@ public class JavaDSLParserTest extends AbstractTest { - @Test - public void test1() throws IOException { - Path model = Paths.get("src/test/resources/de/monticore/java/parser/ASTClassDeclaration.java"); - JavaDSLParser parser = JavaDSLMill.parser(); - Optional ast = parser.parse(model.toString()); - assertFalse(parser.hasErrors()); - assertTrue(ast.isPresent()); -// AST2ModelFiles.get().serializeASTInstance(ast.get(), "ASTClassDeclaration"); - } - - @Test - public void test2() throws IOException { - Path model = Paths.get("src/test/resources/de/monticore/java/parser/ParseException.java"); - JavaDSLParser parser = JavaDSLMill.parser(); - Optional ast = parser.parse(model.toString()); - assertFalse(parser.hasErrors()); - assertTrue(ast.isPresent()); - // AST2ModelFiles.get().serializeASTInstance(ast.get(), "ParseException"); - } - - @Test - public void test3() throws IOException { - Path model = Paths.get("src/test/resources/de/monticore/java/parser/TokenMgrError.java"); - JavaDSLParser parser = JavaDSLMill.parser(); - Optional ast = parser.parse(model.toString()); - assertFalse(parser.hasErrors()); - assertTrue(ast.isPresent()); - //AST2ModelFiles.get().serializeASTInstance(ast.get(), "TokenMgrError"); + @ParameterizedTest + @ValueSource(strings = { + "src/test/resources/de/monticore/java/parser/ASTClassDeclaration.java", + "src/test/resources/de/monticore/java/parser/ParseException.java", + "src/test/resources/de/monticore/java/parser/TokenMgrError.java", + "src/test/resources/parsableAndCompilableModels/simpleTestClasses/HelloWorld.java" + }) + public void testParser(String path) throws IOException { + assertParsingSuccess(path); } @Test - public void test4() throws IOException { - StringBuffer buffer = new StringBuffer(""); + public void testJavaBlock() throws IOException { + StringBuffer buffer = new StringBuffer(); buffer.append("{ _channel = HIDDEN;"); buffer.append("if (getCompiler() != null) {"); buffer.append(" de.monticore.ast.Comment _comment = new de.monticore.ast.Comment(getText());"); @@ -69,51 +49,52 @@ public void test4() throws IOException { assertFalse(parser.hasErrors()); assertTrue(ast.isPresent()); } - - @Test - public void test5() throws IOException { - Path model = Paths - .get("src/test/resources/parsableAndCompilableModels/simpleTestClasses/HelloWorld.java"); - JavaDSLParser parser = JavaDSLMill.parser(); - Optional ast = parser.parse(model.toString()); - assertFalse(parser.hasErrors()); - assertTrue(ast.isPresent()); -// AST2ModelFiles.get().serializeASTInstance(ast.get(), "ASTClassDeclaration"); - } - - @Test - public void testCondition() throws IOException { + + @ParameterizedTest + @ValueSource(strings = { + "ch = str.charAt(i) < 0x20" + }) + public void testCondition(String input) throws IOException { JavaDSLParser parser = JavaDSLMill.parser(); - Optional ast = parser.parse_StringExpression("ch = str.charAt(i) < 0x20"); + Optional ast = parser.parse_StringExpression(input); assertTrue(ast.isPresent()); } - - @Test - public void testLambdas() throws IOException { + + @ParameterizedTest + @ValueSource(strings = { + "foo -> foo", + "(foo, bar) -> foo", + "(foo, bar) -> { return foo; }" + }) + public void testLambdas(String input) throws IOException { JavaDSLParser parser = JavaDSLMill.parser(); - assertTrue(parser.parse_StringExpression("foo -> foo").isPresent()); - assertTrue(parser.parse_StringExpression("(foo, bar) -> foo").isPresent()); - assertTrue(parser.parse_StringExpression("(foo, bar) -> { return foo; }").isPresent()); + assertTrue(parser.parse_StringExpression(input).isPresent()); } - @Test - public void testMethodReferences() throws IOException { + @ParameterizedTest + @ValueSource(strings = { + "String::length", + "System::currentTimeMillis", + "List::size", + "int[]::clone", + "System.out::println", + "\"abc\"::length", + "foo[x]::bar", + "(test ? list.replaceAll(String::trim) : list) :: iterator", + "super::toString", + "Arrays::sort" + }) + public void testMethodReferences(String input) throws IOException { JavaDSLParser parser = JavaDSLMill.parser(); - assertTrue(parser.parse_StringExpression("String::length").isPresent()); - assertTrue(parser.parse_StringExpression("System::currentTimeMillis").isPresent()); - assertTrue(parser.parse_StringExpression("List::size").isPresent()); - assertTrue(parser.parse_StringExpression("int[]::clone").isPresent()); - assertTrue(parser.parse_StringExpression("System.out::println").isPresent()); - assertTrue(parser.parse_StringExpression("\"abc\"::length").isPresent()); - assertTrue(parser.parse_StringExpression("foo[x]::bar").isPresent()); - assertTrue(parser.parse_StringExpression("(test ? list.replaceAll(String::trim) : list) :: iterator").isPresent()); - assertTrue(parser.parse_StringExpression("super::toString").isPresent()); - assertTrue(parser.parse_StringExpression("Arrays::sort").isPresent()); + assertTrue(parser.parse_StringExpression(input).isPresent()); } - @Test - public void testModuleDeclaration() { - assertParsingSuccess("src/test/resources/moduleDeclaration/module-info.java"); + @ParameterizedTest + @ValueSource(strings = { + "src/test/resources/moduleDeclaration/module-info.java" + }) + public void testModuleDeclaration(String path) { + assertParsingSuccess(path); } @Test diff --git a/javaDSL/src/test/java/de/monticore/java/JavaDSLPrettyPrinterTest.java b/javaDSL/src/test/java/de/monticore/java/JavaDSLPrettyPrinterTest.java index ca495bea..31fb728e 100644 --- a/javaDSL/src/test/java/de/monticore/java/JavaDSLPrettyPrinterTest.java +++ b/javaDSL/src/test/java/de/monticore/java/JavaDSLPrettyPrinterTest.java @@ -12,79 +12,50 @@ import java.nio.file.Paths; import java.util.Optional; -import org.junit.jupiter.api.Test; +import de.se_rwth.commons.logging.Log; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import static org.junit.jupiter.api.Assertions.*; public final class JavaDSLPrettyPrinterTest extends AbstractTest { - + + @ParameterizedTest + @ValueSource(strings = { + "src/test/resources/de/monticore/java/parser/ASTClassDeclaration.java", + "src/test/resources/de/monticore/java/parser/ParseException.java", + "src/test/resources/de/monticore/java/parser/TokenMgrError.java", + "src/test/resources/parsableAndCompilableModels/simpleTestClasses/HelloWorld.java" + }) + public void testPrettyPrinter(String path) throws IOException { + // Parse input + ASTJavaDSLNode ast = parse(path); + + // Prettyprinting input + String output = JavaDSLMill.prettyPrint(ast, false); + + // Parsing printed input + ASTJavaDSLNode printedAST = parse(new StringReader(output)); + assertTrue(ast.deepEquals(printedAST)); + assertTrue(Log.getFindings().isEmpty()); + } + private ASTJavaDSLNode parse(String modelName) throws IOException { Path model = Paths.get(modelName); JavaDSLParser parser = JavaDSLMill.parser(); Optional ast = parser.parse(model.toString()); assertFalse(parser.hasErrors()); assertTrue(ast.isPresent()); + assertTrue(Log.getFindings().isEmpty()); return ast.get(); } - + private ASTJavaDSLNode parse(StringReader reader) throws IOException { JavaDSLParser parser = JavaDSLMill.parser(); Optional ast = parser.parse(reader); assertFalse(parser.hasErrors()); assertTrue(ast.isPresent()); + assertTrue(Log.getFindings().isEmpty()); return ast.get(); } - - @Test - public void test1() throws IOException { - // Parse input - ASTJavaDSLNode ast = parse("src/test/resources/de/monticore/java/parser/ASTClassDeclaration.java"); - - // Prettyprinting input - String output = JavaDSLMill.prettyPrint(ast, false); - - // Parsing printed input - ASTJavaDSLNode printedAST = parse(new StringReader(output)); - assertTrue(ast.deepEquals(printedAST)); - } - - @Test - public void test2() throws IOException { - // Parse input - ASTJavaDSLNode ast = parse("src/test/resources/de/monticore/java/parser/ParseException.java"); - - // Prettyprinting input - String output = JavaDSLMill.prettyPrint(ast, false); - - // Parsing printed input - ASTJavaDSLNode printedAST = parse(new StringReader(output)); - assertTrue(ast.deepEquals(printedAST)); - } - - @Test - public void test3() throws IOException { - // Parse input - ASTJavaDSLNode ast = parse("src/test/resources/de/monticore/java/parser/TokenMgrError.java"); - - // Prettyprinting input - String output = JavaDSLMill.prettyPrint(ast, false); - - // Parsing printed input - ASTJavaDSLNode printedAST = parse(new StringReader(output)); - assertTrue(ast.deepEquals(printedAST)); - } - - @Test - public void test4() throws IOException { - // Parse input - ASTJavaDSLNode ast = parse("src/test/resources/parsableAndCompilableModels/simpleTestClasses/HelloWorld.java"); - - // Prettyprinting input - String output = JavaDSLMill.prettyPrint(ast, false); - - // Parsing printed input - ASTJavaDSLNode printedAST = parse(new StringReader(output)); - assertTrue(ast.deepEquals(printedAST)); - } - } diff --git a/javaDSL/src/test/java/de/monticore/java/JavaDSLToolTest.java b/javaDSL/src/test/java/de/monticore/java/JavaDSLToolTest.java index 9563fc00..fc3690c4 100644 --- a/javaDSL/src/test/java/de/monticore/java/JavaDSLToolTest.java +++ b/javaDSL/src/test/java/de/monticore/java/JavaDSLToolTest.java @@ -1,42 +1,51 @@ /* (c) https://github.com/MontiCore/monticore */ package de.monticore.java; -import de.monticore.cd4code.CD4CodeMill; -import de.monticore.cd4code._parser.CD4CodeParser; -import de.monticore.cdbasis._ast.ASTCDAttribute; -import de.monticore.java.javadsl.JavaDSLMill; -import de.monticore.java.javadsl._ast.ASTFieldDeclaration; -import de.monticore.java.javadsl._ast.ASTMCQualifiedType; -import de.monticore.java.javadsl._parser.JavaDSLParser; -import de.monticore.types.mcbasictypes._ast.ASTMCType; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; +import de.se_rwth.commons.logging.Log; +import org.junit.jupiter.api.io.TempDir; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; -import java.io.IOException; -import java.util.Optional; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.params.provider.Arguments.arguments; -public class JavaDSLToolTest { +public class JavaDSLToolTest extends AbstractTest { - @Test - public void testToolWithTestClass() { - JavaDSLTool.main(new String[] { - "-i", - "src/test/resources/de/monticore/java/parser/Test.java", - "-o", - "target/generator-output" - }); + @TempDir + private Path OUTPUT_DIR; + + public static Stream testTool(){ + return Stream.of( + arguments( + Paths.get("src","test","resources","de","monticore","java","parser","Test.java"), + List.of(Paths.get("de","monticore","foo", "bla", "Test.java"))), + arguments( + Paths.get("src","test","resources","de","monticore","java","parser","ASTClassDeclaration.java"), + List.of( + Paths.get("de","monticore","javadsl","javadsl","_ast","ASTClassDeclaration.java"), + Paths.get("de","monticore","javadsl","javadsl","_ast","Builder.java"))) + ); } - @Test - public void testToolWithASTClassDeclarationClass() { - JavaDSLTool.main(new String[] { - "-i", - "src/test/resources/de/monticore/java/parser/ASTClassDeclaration.java", - "-o", - "target/generator-output" - }); + @ParameterizedTest + @MethodSource + public void testTool(Path inputPath, List relOutputPaths) { + JavaDSLTool.main(new String[] { "-i", inputPath.toString(), "-o", OUTPUT_DIR.toString() }); + + for (Path relExpectedOutputPath : relOutputPaths) { + Path expectedOutput = OUTPUT_DIR.resolve(relExpectedOutputPath); + assertTrue(expectedOutput.toFile().exists(), + "could not find generated file: " + expectedOutput); + assertTrue(expectedOutput.toFile().length() > 0, + "generated file is empty: " + expectedOutput); + } + + assertTrue(Log.getFindings().isEmpty(), "log is not empty"); } - } diff --git a/javaDSL/src/test/java/de/monticore/java/JavaSourceTest.java b/javaDSL/src/test/java/de/monticore/java/JavaSourceTest.java deleted file mode 100644 index 47d03e3d..00000000 --- a/javaDSL/src/test/java/de/monticore/java/JavaSourceTest.java +++ /dev/null @@ -1,87 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.java; - -import java.io.IOException; -import java.nio.file.FileSystem; -import java.nio.file.FileSystems; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.List; - -import de.se_rwth.commons.logging.Log; -import de.se_rwth.commons.logging.LogStub; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * A simple test for MyDSL Tool. - * - */ -public class JavaSourceTest { - - /* All files that initially failed to parse in the java source code JDK 7 - * using original grammar. */ - // @formatter:off - static List initialParsingFails = Arrays.asList( - // Example: - // new String[]{"target","javaLib","java","lang","invoke","LambdaForm.java"}, - ); - // @formatter:on - - ParseJavaFileVisitor visitor = new ParseJavaFileVisitor(initialParsingFails); - ParseJavaFileVisitor visitorFilesFailed = new ParseJavaFileVisitor(); - - private static final int NUMBER_TESTS = 59; - - private static final int NUMBER_COCOS = 532; - - @BeforeEach - public void setup() { - Log.init(); - Log.enableFailQuick(false); - } - - @BeforeEach - public void setUp() { - Log.getFindings().clear(); - } - - @Test - public void testAllJavaSourceFiles() { - Path path = FileSystems.getDefault().getPath("target", "generated-test-resources", "JDK", "java", "lang"); - - try { - Files.walkFileTree(path, visitor); - } - catch (IOException e) { - e.printStackTrace(); - } - assertEquals(visitor.getNumberOfTests(), visitor.getSuccessCount()); - } - - @Test - public void testJavaSourceFilesThatInitiallyFailed() { - FileSystem fs = FileSystems.getDefault(); - for (String[] fail : initialParsingFails) { - visitorFilesFailed.visitFile(fs.getPath("", fail), null); - } - assertEquals(visitorFilesFailed.getNumberOfTests(), visitorFilesFailed.getFailCount()); - } - - @AfterEach - public void printResult() { - LogStub.info("Success rate: " + visitor.getSuccessRate(), JavaSourceTest.class.getName()); - LogStub.info("Fail rate: " + visitorFilesFailed.getFailRate(), JavaSourceTest.class.getName()); - LogStub.info("Number of Tests: " + visitor.getNumberOfTests(), JavaSourceTest.class.getName()); - LogStub.info("Number of Tests with failing cocos: " + visitor.getFailClassesCount(), JavaSourceTest.class.getName() + " (expecting: " + NUMBER_TESTS + ")"); - LogStub.info("Number of failing cocos: " + visitor.getFailCocosCount(), JavaSourceTest.class.getName() + " (expecting: " + NUMBER_COCOS + ")"); - for (Path fileParsedWithErrors : visitorFilesFailed.fails) { - LogStub.info(fileParsedWithErrors.toString(), JavaSourceTest.class.getName()); - } - } - -} diff --git a/javaDSL/src/test/java/de/monticore/java/JavaSourceTestFileVisitor.java b/javaDSL/src/test/java/de/monticore/java/JavaSourceTestFileVisitor.java deleted file mode 100644 index 2bc12860..00000000 --- a/javaDSL/src/test/java/de/monticore/java/JavaSourceTestFileVisitor.java +++ /dev/null @@ -1,182 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.java; - -import java.io.File; -import java.io.IOException; -import java.nio.file.FileSystem; -import java.nio.file.FileSystems; -import java.nio.file.FileVisitResult; -import java.nio.file.FileVisitor; -import java.nio.file.Path; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -import de.monticore.java.javadsl.JavaDSLMill; -import de.monticore.java.javadsl._parser.JavaDSLParser; -import org.antlr.v4.runtime.RecognitionException; - -import de.monticore.java.javadsl._ast.ASTCompilationUnit; -import de.se_rwth.commons.logging.Log; - -class ParseJavaFileVisitor implements FileVisitor { - - private final List ignorePathes; - - List fails = new ArrayList<>(); - - private int numberOfTests = 0; - - private int failingCocos = 0; - - private int failingClasses = 0; - - private int successCount = 0; - - private int failCount = 0; - - private ASTCompilationUnit optModel; - - @SafeVarargs - public ParseJavaFileVisitor(List... ignoreLists) { - numberOfTests = 0; - successCount = 0; - failCount = 0; - - // join all ignoreLists into one ignoreList - List ignoreList = new ArrayList<>(); - for (List list : ignoreLists) { - ignoreList.addAll(list); - } - - // convert representation from String[] to path - FileSystem fileSystem = FileSystems.getDefault(); - ignorePathes = ignoreList.stream() - .map(it -> fileSystem.getPath("", it)).collect(Collectors.toList()); - } - - public int getNumberOfTests() { - return this.numberOfTests; - } - - public int getSuccessCount() { - return this.successCount; - } - - public int getFailCount() { - return this.failCount; - } - - public int getFailCocosCount() { - return this.failingCocos; - } - - public int getFailClassesCount() { - return this.failingClasses; - } - - public double getSuccessRate() { - if (this.numberOfTests == 0) { - return 0; - } - else { - return ((double) this.successCount) / ((double) this.numberOfTests); - } - } - - public double getFailRate() { - if (this.numberOfTests == 0) { - return 0; - } - else { - return ((double) this.failCount) / ((double) this.numberOfTests); - } - } - - @Override - public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { - String model = file.toAbsolutePath().toString(); - if (model.endsWith(".java") && !ignorePathes.contains(file)) { - Log.info("Parsing " + model, ParseJavaFileVisitor.class.getName()); - try { - String parentDirectory = "target/generated-test-resources/JDK"; - String temp = file.toString().replace('\\', '/'); - String modelPath = temp.substring(parentDirectory.length() + 1, temp.lastIndexOf(".")); - optModel = parse(parentDirectory, modelPath); - - if (optModel != null) { - successCount++; - - } - else { - Log.error("Failed to parse " + model); - fails.add(file); - failCount++; - } - } - catch (Exception e) { - Log.error("Failed to parse " + model); - fails.add(file); - failCount++; - } - numberOfTests++; - if(optModel != null) { - try { - Log.getFindings().clear(); - // TODO renenable checks -// JavaDSLCoCoChecker checker = new JavaDSLTypeChecker().getAllTypeChecker(); -// checker.checkAll(optModel); - if (Log.getFindings().size()>0) { - failingClasses++; - failingCocos = failingCocos + Log.getFindings().size(); - } - } catch (Exception ignored) {} - } - } - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult visitFileFailed(Path file, IOException exc) { - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc) { - return FileVisitResult.CONTINUE; - } - - private ASTCompilationUnit parse(String parentDirectory, String modelPath) throws IOException { - try { - String pathToModel = parentDirectory + File.pathSeparator + modelPath + ".java"; - - JavaDSLParser parser = JavaDSLMill.parser(); - Optional optCompilationUnit; - Throwable cause = null; - - try { - optCompilationUnit = parser.parse(pathToModel); - } catch (IOException e) { - optCompilationUnit = Optional.empty(); - cause = e; - } - - if (optCompilationUnit.isEmpty() || parser.hasErrors()) { - throw new IOException("Failed to parse model: " + pathToModel, cause); - } - - // TODO populate symbol table - return optCompilationUnit.get(); - } - catch (RecognitionException e) { - return null; - } - } -} diff --git a/javaDSL/src/test/java/de/monticore/java/ODReportingTest.java b/javaDSL/src/test/java/de/monticore/java/ODReportingTest.java index 02ce11f2..49bfc40c 100644 --- a/javaDSL/src/test/java/de/monticore/java/ODReportingTest.java +++ b/javaDSL/src/test/java/de/monticore/java/ODReportingTest.java @@ -2,58 +2,70 @@ package de.monticore.java; import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Stream; import de.monticore.generating.templateengine.reporting.commons.ReportingRepository; import de.monticore.java.javadsl.JavaDSLMill; import de.monticore.java.javadsl._ast.ASTCompilationUnit; import de.monticore.java.javadsl._symboltable.IJavaDSLArtifactScope; import de.monticore.java.javadsl._symboltable.IJavaDSLGlobalScope; -import de.monticore.java.javadsl._symboltable.JavaDSLScopesGenitor; -import de.monticore.java.javadsl._visitor.JavaDSLTraverser; +import de.monticore.java.javadsl._symboltable.JavaDSLScopesGenitorDelegator; import de.monticore.java.reporting.JavaDSL2ODReporter; import de.monticore.java.reporting.JavaDSLNodeIdentHelper; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import static de.monticore.java.JavaDSLAssertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.params.provider.Arguments.arguments; -@Disabled // TODO These tests are working yet. There are some issues with the JavaDSL2OD transformation public class ODReportingTest extends AbstractTest { - - private static void createAstAndST(String pathName, String modelName) { - ASTCompilationUnit compilationUnit = assertParsingSuccess(pathName + File.separator + modelName + ".java"); + + @TempDir + private Path outputDir; + + private static void createAstAndST(Path pathName, String modelName, Path outputDir) { + ASTCompilationUnit compilationUnit = + assertParsingSuccess(pathName + File.separator + modelName + ".java"); + ReportingRepository reporting = new ReportingRepository(new JavaDSLNodeIdentHelper()); - JavaDSL2ODReporter reporter = new JavaDSL2ODReporter("target", modelName, reporting); - + JavaDSL2ODReporter reporter = + new JavaDSL2ODReporter(outputDir.toString(), modelName, reporting); + IJavaDSLGlobalScope globalScope = JavaDSLMill.globalScope(); globalScope.init(); - - JavaDSLScopesGenitor genitor = JavaDSLMill.scopesGenitor(); - JavaDSLTraverser traverser = JavaDSLMill.traverser(); - - traverser.setJavaDSLHandler(genitor); - traverser.add4JavaDSL(genitor); - genitor.putOnStack(globalScope); - + + JavaDSLScopesGenitorDelegator genitor = JavaDSLMill.scopesGenitorDelegator(); IJavaDSLArtifactScope artifactScope = genitor.createFromAST(compilationUnit); globalScope.addSubScope(artifactScope); - + reporter.flush(compilationUnit); } - - @Test - public void checkHelloWorld() { - createAstAndST("src/test/resources/parsableAndCompilableModels/simpleTestClasses", "HelloWorld"); + + public static Stream testReporting() { + Path resourcePath = Paths.get("src", "test", "resources", "parsableAndCompilableModels"); + return Stream.of(arguments(resourcePath.resolve("simpleTestClasses"), "HelloWorld"), + arguments(resourcePath.resolve("simpleTestClasses"), "GenericClass"), + arguments(resourcePath.resolve("stressfulPackage"), "StressfulSyntax")); } - - @Test - public void checkGenericClass() { - createAstAndST("src/test/resources/parsableAndCompilableModels/simpleTestClasses", "GenericClass"); + + @ParameterizedTest + @MethodSource + public void testReporting(Path basePath, String modelName) { + createAstAndST(basePath, modelName, outputDir); + + Path expectedOutputDir = outputDir.resolve("reports").resolve(modelName); + Path expectedOutputFile = expectedOutputDir.resolve(modelName + "_AST.od"); + assertTrue(expectedOutputDir.toFile().exists(), + "could not find generated directory: " + expectedOutputDir); + assertTrue(expectedOutputDir.toFile().isDirectory(), + "output directory is a file: " + expectedOutputDir); + assertTrue(expectedOutputFile.toFile().exists(), + "could not find generated object diagram: " + expectedOutputFile); + assertTrue(expectedOutputFile.toFile().length() > 0, "generated object diagram is empty"); } - - @Test - public void checkByte() { - createAstAndST("src/test/resources", "java.lang.Byte"); - } - } diff --git a/javaDSL/src/test/java/de/monticore/java/ParsableAndCompilableModelsTest.java b/javaDSL/src/test/java/de/monticore/java/ParsableAndCompilableModelsTest.java index cce2cecf..8a757cfd 100644 --- a/javaDSL/src/test/java/de/monticore/java/ParsableAndCompilableModelsTest.java +++ b/javaDSL/src/test/java/de/monticore/java/ParsableAndCompilableModelsTest.java @@ -1,113 +1,40 @@ /* (c) https://github.com/MontiCore/monticore */ package de.monticore.java; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import static de.monticore.java.JavaDSLAssertions.*; public class ParsableAndCompilableModelsTest extends AbstractTest { - - // package parserBugs.* - @Test - public void test_parserBugs_ExplicitGenericInvocations() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/parserBugs/ExplicitGenericInvocations.java"); - } - - @Test - public void test_parserBugs_InterfaceWithStaticMethod() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/parserBugs/InterfaceWithStaticMethod.java"); - } - - // package basicTestClasses.types.* - @Test - public void test_simpleTestClasses_types_AnnotationTestModel() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/simpleTestClasses/types/SimpleAnnotationTestModel.java"); - } - - @Test - public void test_simpleTestClasses_types_SimpleClassTestModel() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/simpleTestClasses/types/SimpleClassTestModel.java"); - } - - @Test - public void test_simpleTestClasses_types_SimpleEnumTestModels() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/simpleTestClasses/types/SimpleEnumTestModels.java"); - } - - @Test - public void test_simpleTestClasses_types_SimpleInterfaceTestModel() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/simpleTestClasses/types/SimpleInterfaceTestModel.java"); - } - - // package simpleTestClasses.* - @Test - public void test_simpleTestClasses_EmptyClass() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/simpleTestClasses/EmptyClass.java"); - } - - @Test - public void test_simpleTestClasses_HelloWorld() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/simpleTestClasses/HelloWorld.java"); - } - - @Test - public void test_simpleTestClasses_OneFieldClass() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/simpleTestClasses/OneFieldClass.java"); - } - - @Test - public void test_simpleTestClasses_QualifiedNameTestClass() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/simpleTestClasses/QualifiedNameTestClass.java"); + + @ParameterizedTest + @ValueSource(strings = { + // Parser bugs + "src/test/resources/parsableAndCompilableModels/parserBugs/ExplicitGenericInvocations.java", + "src/test/resources/parsableAndCompilableModels/parserBugs/InterfaceWithStaticMethod.java", + // Simple test classes + "src/test/resources/parsableAndCompilableModels/simpleTestClasses/types/SimpleAnnotationTestModel.java", + "src/test/resources/parsableAndCompilableModels/simpleTestClasses/types/SimpleClassTestModel.java", + "src/test/resources/parsableAndCompilableModels/simpleTestClasses/types/SimpleEnumTestModels.java", + "src/test/resources/parsableAndCompilableModels/simpleTestClasses/types/SimpleInterfaceTestModel.java", + "src/test/resources/parsableAndCompilableModels/simpleTestClasses/EmptyClass.java", + "src/test/resources/parsableAndCompilableModels/simpleTestClasses/HelloWorld.java", + "src/test/resources/parsableAndCompilableModels/simpleTestClasses/OneFieldClass.java", + "src/test/resources/parsableAndCompilableModels/simpleTestClasses/QualifiedNameTestClass.java", + // Stressful package + "src/test/resources/parsableAndCompilableModels/stressfulPackage/StressfulSyntax.java", + // Symbol table + "src/test/resources/parsableAndCompilableModels/symbolTable/enums/EnumViaJavaEnum.java", + "src/test/resources/parsableAndCompilableModels/symbolTable/enums/EnumViaJavaInterface.java", + "src/test/resources/parsableAndCompilableModels/symbolTable/resolve/GeneralResolveTestClass.java", + "src/test/resources/parsableAndCompilableModels/symbolTable/resolve/TypeVariableShadowingTestClass.java", + "src/test/resources/parsableAndCompilableModels/symbolTable/typeArgumentsAndParameters/TypeArgumentTestClass.java", + "src/test/resources/parsableAndCompilableModels/symbolTable/typeArgumentsAndParameters/TypeParameterTestClass.java", + "src/test/resources/parsableAndCompilableModels/symbolTable/ScopesSymbolTableTestClass.java", + "src/test/resources/parsableAndCompilableModels/symbolTable/VariablesTestClass.java" + }) + public void testParsableAndCompilableModels(String path) { + assertParsingSuccess(path); } - - // package stressfulPackage - @Test - public void test_stressfulPackage_StressfulSyntax() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/stressfulPackage/StressfulSyntax.java"); - } - - // package symbolTable.enums.* - @Test - public void test_symbolTable_enums_EnumViaJavaEnum() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/symbolTable/enums/EnumViaJavaEnum.java"); - } - - @Test - public void test_symbolTable_enums_EnumViaJavaInterface() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/symbolTable/enums/EnumViaJavaInterface.java"); - } - - // package symbolTable.resolve.* - @Test - public void test_symbolTable_resolve_GeneralResolveTestClass() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/symbolTable/resolve/GeneralResolveTestClass.java"); - } - - @Test - public void test_symbolTable_resolve_TypeVariableShadowingTestClass() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/symbolTable/resolve/TypeVariableShadowingTestClass.java"); - } - - // package symbolTable.typeArgumentsAndParameters.* - @Test - public void test_TypeArgumentsAndParameters_TypeArgumentTestClass() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/symbolTable/typeArgumentsAndParameters/TypeArgumentTestClass.java"); - } - - @Test - public void test_TypeArgumentsAndParameters_TypeParameterTestClass() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/symbolTable/typeArgumentsAndParameters/TypeParameterTestClass.java"); - } - - // package symbolTable.* - @Test - public void test_symbolTable_ScopesSymbolTableTestClass() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/symbolTable/ScopesSymbolTableTestClass.java"); - } - - @Test - public void test_BasicTestClasses_VariablesTestClass() { - assertParsingSuccess("src/test/resources/parsableAndCompilableModels/symbolTable/VariablesTestClass.java"); - } - } diff --git a/javaDSL/src/test/java/de/monticore/java/UnparsableModelsTest.java b/javaDSL/src/test/java/de/monticore/java/UnparsableModelsTest.java index 5d9b7e06..8a6780e6 100644 --- a/javaDSL/src/test/java/de/monticore/java/UnparsableModelsTest.java +++ b/javaDSL/src/test/java/de/monticore/java/UnparsableModelsTest.java @@ -1,30 +1,21 @@ /* (c) https://github.com/MontiCore/monticore */ package de.monticore.java; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import static de.monticore.java.JavaDSLAssertions.*; public class UnparsableModelsTest extends AbstractTest { - - @Test - public void testBasicCompilationUnitMissingBracket() { - assertParsingFailure("src/test/resources/unparsableModels/BasicCompilationUnitMissingBracket.java"); - } - - @Test - public void testTwoTimesClass() { - assertParsingFailure("src/test/resources/unparsableModels/TwoTimesClass.java"); - } - - @Test - public void testWrongExpression() { - assertParsingFailure("src/test/resources/unparsableModels/WrongExpression.java"); - } - - @Test - public void testWrongIdentifierName() { - assertParsingFailure("src/test/resources/unparsableModels/WrongIdentifierName.java"); + + @ParameterizedTest + @ValueSource(strings = { + "src/test/resources/unparsableModels/BasicCompilationUnitMissingBracket.java", + "src/test/resources/unparsableModels/TwoTimesClass.java", + "src/test/resources/unparsableModels/WrongExpression.java", + "src/test/resources/unparsableModels/WrongIdentifierName.java" + }) + public void testUnparsableModels(String path) { + assertParsingFailure(path); } - } diff --git a/ref-code-adaptation/src/main/java/de/monticore/codeAdaption/matcher/MatcherHelper.java b/ref-code-adaptation/src/main/java/de/monticore/codeAdaption/matcher/MatcherHelper.java index 87cd6119..5a735cd1 100644 --- a/ref-code-adaptation/src/main/java/de/monticore/codeAdaption/matcher/MatcherHelper.java +++ b/ref-code-adaptation/src/main/java/de/monticore/codeAdaption/matcher/MatcherHelper.java @@ -189,7 +189,7 @@ public static List cleanReferences(List references) { return references; } - Set temps = new HashSet(references); + Set temps = new HashSet<>(references); for (ISymbol symbol : temps) { for (ISymbol symbol1 : temps) { if (!symbol.equals(symbol1) && (matchInfix(symbol.getName(), symbol1.getName()))) { diff --git a/ref-code-adaptation/src/main/java/de/monticore/codeAdaption/updater/spoonUpdater/SpoonUpdater.java b/ref-code-adaptation/src/main/java/de/monticore/codeAdaption/updater/spoonUpdater/SpoonUpdater.java index 884956c5..4c43ab48 100644 --- a/ref-code-adaptation/src/main/java/de/monticore/codeAdaption/updater/spoonUpdater/SpoonUpdater.java +++ b/ref-code-adaptation/src/main/java/de/monticore/codeAdaption/updater/spoonUpdater/SpoonUpdater.java @@ -169,8 +169,15 @@ public void setOutputDirectory(Path outputPath) { } /*** - *get spoonType form the Spoon Model and the mcType. - * save the found spoonType in the type map. + * Retrieves the spoonType from the Spoon Model based on the provided mcType. + * Saves the found spoonType in the type map. + * + * @param mcType The ASTTypeDeclaration representing the type to be searched + * for in the Spoon model. + * @return The corresponding CtType found in the Spoon model for the + * given mcType. + * @throws AssertionError if no matching CtType is found in the Spoon + * model (assert will fail). */ private CtType getSpoonType(ASTTypeDeclaration mcType) { // cas already found @@ -184,10 +191,19 @@ private CtType getSpoonType(ASTTypeDeclaration mcType) { typeMap.put(mcType, type.get()); return type.get(); } - + /*** - *get spoonMethod form the Spoon Model and the mcType an the mcMethod. - * save the found spoonMethod in the type map. + * Retrieves the spoonMethod from the Spoon Model based on the provided + * mcType and mcMethod. Saves the found spoonMethod in the method map. + * + * @param mcType The ASTTypeDeclaration representing the type to which + * the method belongs. + * @param mcMethod The ASTMethodDeclaration representing the method to be + * searched for in the Spoon model. + * @return The corresponding CtMethod found in the Spoon model for the + * given mcType and mcMethod. + * @throws AssertionError if no matching CtMethod is found in the + * Spoon model (assert will fail). */ public CtMethod getSpoonMethod(ASTTypeDeclaration mcType, ASTMethodDeclaration mcMethod) { // cas method was already found @@ -206,17 +222,30 @@ public CtMethod getSpoonMethod(ASTTypeDeclaration mcType, ASTMethodDeclaratio methodMap.put(mcMethod, method.get()); return method.get(); } - - /*** - * compare a mcType an spoonType and return true if both are identical. + + /** + * Compares a mcType and spoonType and returns true if both are identical. + * + * @param type The ASTTypeDeclaration representing the type to be compared. + * @param spoonType The CtType representing the spoon type to be compared. + * @return True if the file name of the mcType ends with the simple name + * of the spoonType followed by ".java"; otherwise false. */ protected boolean compare(ASTTypeDeclaration type, CtType spoonType) { String fileName = type.get_SourcePositionStart().getFileName().orElse(type.getName()); return fileName.replaceAll("\\\\", ".").endsWith(spoonType.getSimpleName() + ".java"); } - - /*** - *compare spoonMethod and mcMethod and return true if both are identical. + + /** + * Compares a spoonMethod and mcMethod and returns true if both are + * identical. + * + * @param mcMethod The ASTMethodDeclaration representing the method to be + * compared. + * @param spoonMethod The CtMethod representing the spoon method to be + * compared. + * @return True if the names, parameter count, and parameter types of both + * methods match; otherwise false. */ protected boolean compare(ASTMethodDeclaration mcMethod, CtMethod spoonMethod) { // compare names diff --git a/ref-code-adaptation/src/main/java/de/monticore/codeAdaption/utils/AdapterUtils.java b/ref-code-adaptation/src/main/java/de/monticore/codeAdaption/utils/AdapterUtils.java index 153bdd3c..dbadc378 100644 --- a/ref-code-adaptation/src/main/java/de/monticore/codeAdaption/utils/AdapterUtils.java +++ b/ref-code-adaptation/src/main/java/de/monticore/codeAdaption/utils/AdapterUtils.java @@ -47,9 +47,11 @@ public static String getPosition(SourcePosition pos) { } return ""; } - - /*** - * read a java file an remove multilines an single lines comments. + + /** + * Reads a Java file and removes multi-line and single-line comments. + * + * @param file The Java file from which comments will be removed. */ public static void removeComments(File file) { diff --git a/ref-code-adaptation/src/main/java/de/monticore/codeAdaption/utils/JavaLoader.java b/ref-code-adaptation/src/main/java/de/monticore/codeAdaption/utils/JavaLoader.java index d12a3265..8b572731 100644 --- a/ref-code-adaptation/src/main/java/de/monticore/codeAdaption/utils/JavaLoader.java +++ b/ref-code-adaptation/src/main/java/de/monticore/codeAdaption/utils/JavaLoader.java @@ -38,9 +38,17 @@ import org.junit.jupiter.api.Assertions; public class JavaLoader { - - /*** - *parse a class diagram, build the symbol table and check the cocos. + + /** + * Parses a class diagram, builds the symbol table, and checks the + * consistency conditions (CoCos). + * + * @param file The class diagram file to be parsed. It must have a .cd + * extension. + * @return The resulting ASTCDCompilationUnit created from the class + * diagram. + * @throws AssertionError if the provided file does not have a .cd + * extension, or if the AST could not be created successfully. */ public static ASTCDCompilationUnit loadCD(File file) { // parse the class diagram @@ -97,9 +105,13 @@ private static void createCDSymTab(ASTCDCompilationUnit ast) { ast.accept(c.getTraverser()); ast.setEnclosingScope(as); } - - /*** - * loa a java files,transform it to an AST and creation symbol-tables. + + /** + * Loads a Java file, transforms it to an AST, and creates symbol tables. + * + * @param javaFile The Java file to be loaded and processed. + * @return The resulting ASTOrdinaryCompilationUnit created from the + * Java file. */ public static ASTOrdinaryCompilationUnit loadJava(File javaFile) { assertTrue(javaFile.getName().endsWith(".java")); @@ -125,8 +137,13 @@ public static ASTOrdinaryCompilationUnit loadJava(File javaFile) { return (ASTOrdinaryCompilationUnit) ast.get(); } - - /** print a javaASTNode */ + + /** + * Prints a Java ASTNode as a formatted string. + * + * @param node The ASTNode to be printed. + * @return A formatted string representation of the provided ASTNode. + */ public static String print(ASTNode node) { JavaDSLFullPrettyPrinter prettyPrinter = new JavaDSLFullPrettyPrinter(new IndentPrinter()); return prettyPrinter.prettyprint(node); @@ -146,22 +163,24 @@ public static void writeFile(Path path, String content) { Log.error("Exception occur when writing the file " + path); } } - - /*** - * read recursive all java files in a directory and its subdirectories. - * @param directoryPath the root directory to read. - * @return the set of Java files as AST + + /** + * Reads recursively all Java files in a directory and its subdirectories. + * + * @param directoryPath The root directory to read. + * @return A set of Java files represented as ASTOrdinaryCompilationUnit. */ public static Set readJavaCode(Path directoryPath) { Set res = new HashSet<>(); readJavaCode(directoryPath, res); return res.stream().map(JavaLoader::loadJava).collect(Collectors.toSet()); } - - /*** - * read recursive all java files in a directory and its subdirectories. - * @param directoryPath the root directory to read. - * @return the set of Java files as files + + /** + * Reads recursively all Java files in a directory and its subdirectories. + * + * @param directoryPath The root directory to read. + * @return A set of Java files as File objects. */ public static Set readJavaFile(Path directoryPath) { Set res = new HashSet<>();