diff --git a/build.gradle b/build.gradle index 38d447851..f7057ae6f 100644 --- a/build.gradle +++ b/build.gradle @@ -179,6 +179,13 @@ publishing { } +// The de.rwth.se.cdgen plugin lives in the standalone ./cdgradle build. To also check and publish it, we have to add it here. +def cdgradleBuild = gradle.includedBuilds.find { it.name == 'cdgradle' } +if (cdgradleBuild != null) { + tasks.named('check') { dependsOn cdgradleBuild.task(':check') } + tasks.named('publish') { dependsOn cdgradleBuild.task(':publish') } +} + /* TODO (ALu): Once all dependant projects are published, we can properly use transitive dependencies: diff --git a/cdgradle-it/build.gradle b/cdgradle-it/build.gradle new file mode 100644 index 000000000..7439a61d7 --- /dev/null +++ b/cdgradle-it/build.gradle @@ -0,0 +1,52 @@ +/* (c) https://github.com/MontiCore/monticore */ + +def cdgradleBuild = gradle.includedBuilds.find { it.name == 'cdgradle' } + +configurations { + cdgenPluginRuntime +} + +dependencies { + cdgenPluginRuntime "de.se_rwth.commons:se-commons-gradle:$mc_version" + cdgenPluginRuntime "de.se_rwth.commons:se-commons-logging:$mc_version" + + testImplementation project(':cdlang') + + testImplementation gradleTestKit() + testImplementation "org.junit.jupiter:junit-jupiter-api:$junit_version" + testImplementation "org.junit.jupiter:junit-jupiter-params:$junit_version" + testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junit_version" + testRuntimeOnly "org.junit.platform:junit-platform-launcher:$junit_version" + testImplementation "commons-io:commons-io:2.21.0" +} + +tasks.named('test', Test) { + useJUnitPlatform() + + def cd4aJar = project(':cdlang').tasks.named('jar').flatMap { it.archiveFile } + def cdRuntimeJar = project(':cd-runtime').tasks.named('jar').flatMap { it.archiveFile } + def pluginRuntime = configurations.cdgenPluginRuntime + + dependsOn cd4aJar, cdRuntimeJar + inputs.files(cd4aJar, cdRuntimeJar, pluginRuntime) + + File pluginJar = null + if (cdgradleBuild != null) { + pluginJar = new File(cdgradleBuild.projectDir, "target/libs/cdgradle-${version}.jar") + dependsOn cdgradleBuild.task(':jar') + inputs.file(pluginJar).withPropertyName('cdgradlePluginJar') + } + def resolvedPluginJar = pluginJar + + doFirst { + def cp = ([resolvedPluginJar] + pluginRuntime.files.toList()).findAll { it != null } + systemProperty 'cdgen.pluginClasspath', cp*.absolutePath.join(File.pathSeparator) + systemProperty 'cdgen.cd4aJar', cd4aJar.get().asFile.absolutePath + systemProperty 'cdgen.runtimeJar', cdRuntimeJar.get().asFile.absolutePath + systemProperty 'cdgen.version', version.toString() + + // MontiVerse passthrough + systemProperty 'maven.repo.local', System.getProperty('maven.repo.local') ?: '' + systemProperty 'useLocalRepo', findProperty('useLocalRepo') ?: '' + } +} diff --git a/cdgradle-it/src/test/java/de/monticore/cdgen/CDGenGradlePluginTest.java b/cdgradle-it/src/test/java/de/monticore/cdgen/CDGenGradlePluginTest.java new file mode 100644 index 000000000..1c3fe98f1 --- /dev/null +++ b/cdgradle-it/src/test/java/de/monticore/cdgen/CDGenGradlePluginTest.java @@ -0,0 +1,131 @@ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.cdgen; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +import de.monticore.cd4code.CD4CodeMill; +import de.monticore.symbols.basicsymbols.BasicSymbolsMill; +import de.se_rwth.commons.logging.LogStub; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.commons.io.FileUtils; +import org.gradle.testkit.runner.BuildResult; +import org.gradle.testkit.runner.GradleRunner; +import org.gradle.testkit.runner.TaskOutcome; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.io.TempDir; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +public class CDGenGradlePluginTest { + + private static final List PLUGIN_CLASSPATH = parseClasspath("cdgen.pluginClasspath"); + + private static final String CD4A_JAR = requiredProperty("cdgen.cd4aJar"); + + private static final String RUNTIME_JAR = requiredProperty("cdgen.runtimeJar"); + + private static final String VERSION = requiredProperty("cdgen.version"); + + @TempDir + File testProjectDir; + + @ParameterizedTest + @ValueSource(strings = { "8.5", "8.7", "8.14" }) + public void testCDGen(String gradleVersion) throws IOException { + FileUtils.copyDirectory(new File("src/test/resources/testProject"), testProjectDir); + + BuildResult result = runner(gradleVersion).withArguments(withProperties("build", "--info", + "--stacktrace")).build(); + assertEquals(TaskOutcome.SUCCESS, result.task(":generateClassDiagrams").getOutcome()); + assertEquals(TaskOutcome.SUCCESS, result.task(":compileJava").getOutcome()); + + String log = result.getOutput().replace('\\', '/'); + assertTrue(log.contains("/cd-runtime/target/libs/") && log.contains("-cd-runtime.jar"), + "cdToolTargetRuntime was not the local :cd-runtime build"); + assertFalse(log.matches("(?s).*modules-2/files-[^\\s\"]*/de\\.monticore\\.lang/cd4analysis/.*"), + "a Nexus de.monticore.lang:cd4analysis leaked onto the generator classpath"); + + File symbolsOut = new File(testProjectDir, "build/cdgensymbols/main/original/MyCD.cdsym"); + assertTrue(symbolsOut.exists(), "Exported original symbols missing"); + + // The generated symbols must be resolvable + LogStub.initPlusLog(); + CD4CodeMill.init(); + BasicSymbolsMill.initializePrimitives(); + BasicSymbolsMill.initializeString(); + CD4CodeMill.globalScope().getSymbolPath().addEntry(symbolsOut.getParentFile().toPath()); + CD4CodeMill.globalScope().loadDiagram("MyCD"); + + CD4CodeMill.globalScope().resolveMethod("MyCD.MyCD.CanBeObserved.getName"); + // Check for a method within a class, which is TOPed + // We explicitly expect the method to be resolvable via IncompleteA + CD4CodeMill.globalScope().resolveMethod("MyCD.MyCD.IncompleteA.getName"); + CD4CodeMill.globalScope().resolveType("MyCD.MyCD.BBuilder"); + + Assertions.assertEquals(0, LogStub.getFindingsCount()); + CD4CodeMill.reset(); + } + + /** The plugin with a decorator in a custom source set and a custom config template. */ + @ParameterizedTest + @ValueSource(strings = { "8.5", "8.7", "8.14" }) + public void testCDGenOwnDecorator(String gradleVersion) throws IOException { + FileUtils.copyDirectory(new File("src/test/resources/testProject"), testProjectDir); + + BuildResult result = runner(gradleVersion).withArguments(withProperties("build", "--info", + "--stacktrace", "-PwithCustomDec=true")).build(); + assertEquals(TaskOutcome.SUCCESS, result.task(":generateClassDiagrams").getOutcome()); + assertEquals(TaskOutcome.SUCCESS, result.task(":compileJava").getOutcome()); + + if (!result.getOutput().contains("I am decorating")) { + System.err.println(result.getOutput()); + fail("Failed to find \"I am decorating\" in output"); + } + } + + private GradleRunner runner(String gradleVersion) { + return GradleRunner.create().withPluginClasspath(PLUGIN_CLASSPATH).withGradleVersion( + gradleVersion).withProjectDir(testProjectDir); + } + + private List withProperties(String... args) { + List ret = new ArrayList<>(Arrays.asList(args)); + + String mavenRepo = System.getProperty("maven.repo.local"); + if (mavenRepo != null && !mavenRepo.isEmpty()) { + ret.add("-Dmaven.repo.local=" + mavenRepo); + } + String useLocalRepo = System.getProperty("useLocalRepo"); + if (useLocalRepo != null && !useLocalRepo.isEmpty()) { + ret.add("-PuseLocalRepo=" + useLocalRepo); + } + + ret.add("-Pversion=" + VERSION); + ret.add("-Pcdgen_cd4aJarFile=" + CD4A_JAR); + ret.add("-Pcdgen_runtimeJarFile=" + RUNTIME_JAR); + return ret; + } + + private static List parseClasspath(String propertyKey) { + return Arrays.stream(requiredProperty(propertyKey).split(File.pathSeparator)).map(File::new) + .collect(Collectors.toList()); + } + + private static String requiredProperty(String key) { + String value = System.getProperty(key); + if (value == null || value.isEmpty()) { + throw new IllegalStateException("system property '" + key + + "' is not set -- run this via the :cdgradle-it:test task"); + } + return value; + } + +} diff --git a/cdtool/cdgradle/src/test/resources/cdgradle-it/build.gradle b/cdgradle-it/src/test/resources/testProject/build.gradle similarity index 100% rename from cdtool/cdgradle/src/test/resources/cdgradle-it/build.gradle rename to cdgradle-it/src/test/resources/testProject/build.gradle diff --git a/cdgradle-it/src/test/resources/testProject/gradle.properties b/cdgradle-it/src/test/resources/testProject/gradle.properties new file mode 100644 index 000000000..dce7243b9 --- /dev/null +++ b/cdgradle-it/src/test/resources/testProject/gradle.properties @@ -0,0 +1 @@ +useLocalRepo=false diff --git a/cdgradle-it/src/test/resources/testProject/settings.gradle b/cdgradle-it/src/test/resources/testProject/settings.gradle new file mode 100644 index 000000000..42451fe89 --- /dev/null +++ b/cdgradle-it/src/test/resources/testProject/settings.gradle @@ -0,0 +1,12 @@ +/* (c) https://github.com/MontiCore/monticore */ +pluginManagement { + repositories { + if (("true").equals(providers.gradleProperty('useLocalRepo').getOrElse('false'))) { + mavenLocal() + } + mavenCentral() + gradlePluginPortal() + maven { url = "https://nexus.se.rwth-aachen.de/content/groups/public" } + } +} +rootProject.name = 'testProject' diff --git a/cdtool/cdgradle/src/test/resources/cdgradle-it/src/dec/java/MyOwnDecorator.java b/cdgradle-it/src/test/resources/testProject/src/dec/java/MyOwnDecorator.java similarity index 100% rename from cdtool/cdgradle/src/test/resources/cdgradle-it/src/dec/java/MyOwnDecorator.java rename to cdgradle-it/src/test/resources/testProject/src/dec/java/MyOwnDecorator.java diff --git a/cdtool/cdgradle/src/test/resources/cdgradle-it/src/dec/resources/CD2OwnDecorator.ftl b/cdgradle-it/src/test/resources/testProject/src/dec/resources/CD2OwnDecorator.ftl similarity index 100% rename from cdtool/cdgradle/src/test/resources/cdgradle-it/src/dec/resources/CD2OwnDecorator.ftl rename to cdgradle-it/src/test/resources/testProject/src/dec/resources/CD2OwnDecorator.ftl diff --git a/cdtool/cdgradle/src/test/resources/cdgradle-it/src/main/cds/MyCD.cd b/cdgradle-it/src/test/resources/testProject/src/main/cds/MyCD.cd similarity index 100% rename from cdtool/cdgradle/src/test/resources/cdgradle-it/src/main/cds/MyCD.cd rename to cdgradle-it/src/test/resources/testProject/src/main/cds/MyCD.cd diff --git a/cdtool/cdgradle/src/test/resources/cdgradle-it/src/main/cds/MyCD2.cd b/cdgradle-it/src/test/resources/testProject/src/main/cds/MyCD2.cd similarity index 100% rename from cdtool/cdgradle/src/test/resources/cdgradle-it/src/main/cds/MyCD2.cd rename to cdgradle-it/src/test/resources/testProject/src/main/cds/MyCD2.cd diff --git a/cdtool/cdgradle/src/test/resources/cdgradle-it/src/main/java/MyCD/IncompleteA.java b/cdgradle-it/src/test/resources/testProject/src/main/java/MyCD/IncompleteA.java similarity index 100% rename from cdtool/cdgradle/src/test/resources/cdgradle-it/src/main/java/MyCD/IncompleteA.java rename to cdgradle-it/src/test/resources/testProject/src/main/java/MyCD/IncompleteA.java diff --git a/cdgradle/build.gradle b/cdgradle/build.gradle new file mode 100644 index 000000000..79c1e417b --- /dev/null +++ b/cdgradle/build.gradle @@ -0,0 +1,72 @@ +/* (c) https://github.com/MontiCore/monticore */ +plugins { + id 'java-library' + id 'java-gradle-plugin' + id 'maven-publish' + id 'de.se_rwth.codestyle' version "$mc_version" +} + +group = 'de.monticore.lang.cd4analysis' + +layout.buildDirectory = layout.projectDirectory.dir('target') + +repositories { + if (providers.gradleProperty('useLocalRepo').getOrElse('false') == 'true') { + mavenLocal() + } + maven { + url = providers.gradleProperty('repo') + .getOrElse('https://nexus.se.rwth-aachen.de/content/groups/public') + def u = providers.gradleProperty('mavenUser') + def p = providers.gradleProperty('mavenPassword') + if (u.present && p.present) { + credentials { + username = u.get() + password = p.get() + } + } + } + mavenCentral() +} + +dependencies { + implementation "de.se_rwth.commons:se-commons-gradle:$mc_version" + implementation "de.se_rwth.commons:se-commons-logging:$mc_version" +} + +gradlePlugin { + plugins { + cdplugin { + id = "de.rwth.se.cdgen" + implementationClass = "de.monticore.cdgen.gradleplugin.CDGenGradlePlugin" + } + } +} + +publishing { + repositories.maven { + credentials.username = mavenUser + credentials.password = mavenPassword + def releasesRepoUrl = "https://nexus.se.rwth-aachen.de/content/repositories/monticore-releases/" + def snapshotsRepoUrl = "https://nexus.se.rwth-aachen.de/content/repositories/monticore-snapshots/" + url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl + } +} + +def buildInfoVersion = project.version.toString() + +tasks.register('generateResources') { + ext { + propFile = layout.buildDirectory.file("generated/buildInfo.properties") + } + outputs.file propFile + doLast { + File f = propFile.get().asFile + f.parentFile.mkdirs() + f.text = "version=$buildInfoVersion" + } +} +processResources { + from files(generateResources) + dependsOn generateResources +} diff --git a/cdgradle/gradle.properties b/cdgradle/gradle.properties new file mode 100644 index 000000000..425460f01 --- /dev/null +++ b/cdgradle/gradle.properties @@ -0,0 +1,11 @@ +# (c) https://github.com/MontiCore/monticore +mavenUser=${username} +mavenPassword=${password} + +version=7.10.0-SNAPSHOT +mc_version=7.10.0-SNAPSHOT + +repo=https://nexus.se.rwth-aachen.de/content/groups/public +useLocalRepo=false + +org.gradle.jvmargs=-Xmx2048m diff --git a/cdgradle/settings.gradle b/cdgradle/settings.gradle new file mode 100644 index 000000000..d17770dbb --- /dev/null +++ b/cdgradle/settings.gradle @@ -0,0 +1,24 @@ +/* (c) https://github.com/MontiCore/monticore */ + +pluginManagement { + repositories { + if (providers.gradleProperty('useLocalRepo').getOrElse('false') == 'true') { + mavenLocal() + } + maven { + url = providers.gradleProperty('repo') + .getOrElse('https://nexus.se.rwth-aachen.de/content/groups/public') + if (providers.gradleProperty('mavenUser').present + && providers.gradleProperty('mavenPassword').present) { + credentials { + username = providers.gradleProperty('mavenUser').get() + password = providers.gradleProperty('mavenPassword').get() + } + } + } + mavenCentral() + gradlePluginPortal() + } +} + +rootProject.name = 'cdgradle' diff --git a/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenAction.java b/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenAction.java similarity index 100% rename from cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenAction.java rename to cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenAction.java diff --git a/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenGradlePlugin.java b/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenGradlePlugin.java similarity index 100% rename from cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenGradlePlugin.java rename to cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenGradlePlugin.java diff --git a/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenTask.java b/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenTask.java similarity index 98% rename from cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenTask.java rename to cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenTask.java index bb02c6ac4..228d1983a 100644 --- a/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenTask.java +++ b/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenTask.java @@ -17,7 +17,7 @@ import org.gradle.api.tasks.*; /** - * Gradle Task of the {@link de.monticore.cdgen.CDGenTool} It is an all-files task, as -i A.cd -i + * Gradle Task of the {@code de.monticore.cdgen.CDGenTool} It is an all-files task, as -i A.cd -i * B.cd is allowed */ @CacheableTask diff --git a/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenToolInvoker.java b/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenToolInvoker.java new file mode 100644 index 000000000..ba1c79cef --- /dev/null +++ b/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenToolInvoker.java @@ -0,0 +1,31 @@ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.cdgen.gradleplugin; + +import de.monticore.gradle.common.GradleLog; +import de.se_rwth.commons.logging.Log; + +import java.util.Arrays; + +public class CDGenToolInvoker { + + protected static final String CDGEN_TOOL_CLASS = "de.monticore.cdgen.CDGenTool"; + + public static void run(String[] args) { + GradleLog.init(); + Log.info("Starting CDGenTool: \n" + "\t java -jar CDGenTool.jar " + Arrays.toString(args), + CDGenToolInvoker.class.getName()); + invokeGradleMain(args); + } + + public static void invokeGradleMain(String[] args) { + try { + Class.forName(CDGEN_TOOL_CLASS).getMethod("gradleMain", String[].class).invoke(null, + (Object) args); + } + catch (ReflectiveOperationException e) { + throw new IllegalStateException("Could not invoke " + CDGEN_TOOL_CLASS + + ".gradleMain(String[]); is the cd4analysis generator on the cdTool configuration?", e); + } + } + +} diff --git a/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDSourceDirectorySet.java b/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDSourceDirectorySet.java similarity index 100% rename from cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDSourceDirectorySet.java rename to cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDSourceDirectorySet.java diff --git a/cdlang-it/build.gradle b/cdlang-it/build.gradle new file mode 100644 index 000000000..e90ef7646 --- /dev/null +++ b/cdlang-it/build.gradle @@ -0,0 +1,21 @@ +/* (c) https://github.com/MontiCore/monticore */ + +plugins { + id 'de.rwth.se.cdgen' +} + +dependencies { + cdTool project(':cdlang') + cdToolTargetRuntime project(':cd-runtime') + + testImplementation "de.se_rwth.commons:se-commons-logging:$mc_version" + testImplementation "de.se_rwth.commons:se-commons-utilities:$mc_version" + + testImplementation platform('org.junit:junit-bom:5.10.0') + testImplementation 'org.junit.jupiter:junit-jupiter' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' +} + +tasks.named('generateTestClassDiagrams') { + coCos = true +} diff --git a/cdlang-it/src/test/cds/associations/Library.cd b/cdlang-it/src/test/cds/associations/Library.cd new file mode 100644 index 000000000..10159074d --- /dev/null +++ b/cdlang-it/src/test/cds/associations/Library.cd @@ -0,0 +1,38 @@ +/* (c) https://github.com/MontiCore/monticore */ +package associations; + +/* + * Associations and compositions: named associations, role names, navigation + * directions (-> and <->), multiplicities and the {ordered} stereotype. + */ +classdiagram Library { + + class Library { + String name; + } + + class Book { + String title; + String isbn; + } + + class Copy { + int inventoryNumber; + } + + class Member { + String name; + int memberId; + } + + class Loan { + String dueDate; + boolean returned; + } + + composition [1] Library <- (catalog) Book [*] {ordered}; + composition [1] Book <- Copy [1..*]; + association [1] Library (library) <-> Member [*]; + association borrows [0..1] Member (borrower) <-> Loan [*]; + association [1] Loan -> (lentCopy) Copy [1]; +} diff --git a/cdlang-it/src/test/cds/basics/Shapes.cd b/cdlang-it/src/test/cds/basics/Shapes.cd new file mode 100644 index 000000000..27a05ca52 --- /dev/null +++ b/cdlang-it/src/test/cds/basics/Shapes.cd @@ -0,0 +1,33 @@ +/* (c) https://github.com/MontiCore/monticore */ +package basics; + +/* + * Plain CD4Analysis: classes, inheritance, an abstract class, an enum, and + * attributes using primitives, String and user-defined types. + */ +classdiagram Shapes { + + enum Color { RED, GREEN, BLUE; } + + abstract class Shape { + Color color; + double x; + double y; + } + + class Circle extends Shape { + double radius; + } + + class Rectangle extends Shape { + double width; + double height; + } + + class Drawing { + String title; + boolean readOnly; + } + + composition [1] Drawing <- (elements) Shape [*] {ordered}; +} diff --git a/cdlang-it/src/test/cds/packages/Warehouse.cd b/cdlang-it/src/test/cds/packages/Warehouse.cd new file mode 100644 index 000000000..a4a738e29 --- /dev/null +++ b/cdlang-it/src/test/cds/packages/Warehouse.cd @@ -0,0 +1,33 @@ +/* (c) https://github.com/MontiCore/monticore */ + +/* + * Nested packages inside a class diagram plus qualified cross-package + * references from associations. (No top-level `package` declaration: the + * generator adds a default package named after the diagram.) + */ +classdiagram Warehouse { + + package catalog { + class Product { + String id; + String name; + double price; + } + + enum Category { ELECTRONICS, BOOKS, FOOD; } + } + + package stock { + class StorageSite { + String location; + } + + class StockItem { + int quantity; + } + } + + association [1] stock.StorageSite (site) <-> stock.StockItem [*]; + association [*] stock.StockItem -> (product) catalog.Product [1]; + association [*] catalog.Product -> (category) catalog.Category [1]; +} diff --git a/cdlang-it/src/test/java/de/monticore/cdlangit/CdlangItGenerationTest.java b/cdlang-it/src/test/java/de/monticore/cdlangit/CdlangItGenerationTest.java new file mode 100644 index 000000000..003b8f996 --- /dev/null +++ b/cdlang-it/src/test/java/de/monticore/cdlangit/CdlangItGenerationTest.java @@ -0,0 +1,14 @@ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.cdlangit; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.Test; + +class CdlangItGenerationTest { + + @Test + void testTest() { + assertTrue(true); + } + +} diff --git a/cdlang/src/main/java/de/monticore/cdgen/CDGenTool.java b/cdlang/src/main/java/de/monticore/cdgen/CDGenTool.java index 76f461322..40d3f5246 100644 --- a/cdlang/src/main/java/de/monticore/cdgen/CDGenTool.java +++ b/cdlang/src/main/java/de/monticore/cdgen/CDGenTool.java @@ -55,7 +55,7 @@ * This tool provides configurable decorator functionality in addition to generation. This tool is * tested via * the CDGenGradlePluginTest: - * cdtool/cdgradle/src/test/java/de/monticore/cdgen/CDGenGradlePluginTest.java + * cdgradle-it/src/test/java/de/monticore/cdgen/CDGenGradlePluginTest.java */ public class CDGenTool extends CD4CodeTool { @@ -374,33 +374,32 @@ public void createAndExportDecoratedSymbolTable(ASTCDCompilationUnit decorated, public Options addAdditionalOptions(Options options) { options.addOption(Option.builder("c").longOpt("checkcococs").desc( - "Checks all CoCos on the given mode.").build()); + "Checks all CoCos on the given mode.").get()); options.addOption(Option.builder("o").longOpt("output").argName("dir").hasArg().desc( - "Sets the output path.").build()); + "Sets the output path.").get()); options.addOption(Option.builder("ct").longOpt("configtemplate").hasArg().argName("template") - .desc("Sets a template for configuration.").build()); + .desc("Sets a template for configuration.").get()); options.addOption(Option.builder("fp").longOpt("template").hasArg().argName("path").desc( - "Sets the path for additional templates.").build()); + "Sets the path for additional templates.").get()); options.addOption(Option.builder("hwc").longOpt("handwrittencode").hasArg().argName("hwcpath") - .desc("Sets the path for additional, handwritten classes.").build()); + .desc("Sets the path for additional, handwritten classes.").get()); options.addOption(Option.builder("c2mc").longOpt("class2mc").desc( - "Enables to resolve java classes in the model path").build()); + "Enables to resolve java classes in the model path").get()); options.addOption(Option.builder().longOpt("class2mc-no-jdk").desc( "Does not resolve types from the installed JDK's standard library. Only the symbolpath is used.") .build()); options.addOption(Option.builder("cliconfig").desc("Configures additional").hasArgs().argName( - "fqn:key[=value]").build()); + "fqn:key[=value]").get()); - options.addOption(org.apache.commons.cli.Option.builder("sd").longOpt("symboltabledecorated") - .argName("file").hasArg().desc( - "Serializes the decorated symbol table of the given artifact.").build()); + options.addOption(Option.builder("sd").longOpt("symboltabledecorated").argName("file").hasArg() + .desc("Serializes the decorated symbol table of the given artifact.").get()); return options; } diff --git a/cdtool/cdgradle/build.gradle b/cdtool/cdgradle/build.gradle deleted file mode 100644 index d00acf7e2..000000000 --- a/cdtool/cdgradle/build.gradle +++ /dev/null @@ -1,85 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -plugins { - id 'java-library' - id 'java-gradle-plugin' - id 'maven-publish' -} - - -configurations { - cdTool -} - - -dependencies { - implementation "de.se_rwth.commons:se-commons-gradle:$mc_version" - cdTool(project(":cdlang")) - compileOnly(project(":cdlang")) // As the main/cdtool dependency does not have an api dependency to cdlang - - testImplementation "org.junit.jupiter:junit-jupiter-api:$junit_version" - testImplementation "org.junit.jupiter:junit-jupiter-params:$junit_version" - testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junit_version" - testRuntimeOnly "org.junit.platform:junit-platform-launcher:$junit_version" - testImplementation gradleTestKit() - testImplementation(project(":cdlang")) // For symbol table tests, etc. -} - - -sourceSets { - main.compileClasspath += configurations.cdTool - test.compileClasspath += configurations.cdTool -} - - -gradlePlugin { - plugins { - cdplugin { - id = "de.rwth.se.cdgen" - implementationClass = "de.monticore.cdgen.gradleplugin.CDGenGradlePlugin" - } - } -} - -publishing { - repositories.maven { - credentials.username = mavenUser - credentials.password = mavenPassword - def releasesRepoUrl = "https://nexus.se.rwth-aachen.de/content/repositories/monticore-releases/" - def snapshotsRepoUrl = "https://nexus.se.rwth-aachen.de/content/repositories/monticore-snapshots/" - url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl - } -} - -// The CDGenGradlePluginTest uses the output of the jar task -test.dependsOn(project(":cdlang").tasks.jar) -test.inputs.files(project(":cdlang").tasks.jar) - -// Write the version to the jar -def buildInfoVersion = project.version.toString() - -tasks.register('generateResources') { - ext { - propFile = layout.buildDirectory.file("generated/buildInfo.properties") - } - outputs.file propFile - doLast { - File f = propFile.get().asFile - f.parentFile.mkdirs() - f.text = "version=$buildInfoVersion" - } -} -processResources { - from files(generateResources) - dependsOn generateResources -} - -tasks.withType(Test).configureEach { - useJUnitPlatform() - dependsOn project.tasks.getByPath(":cdlang:jar") - dependsOn project.tasks.getByPath(":cd-runtime:jar") - dependsOn generateResources - - // For the MontiVerse - systemProperty "maven.repo.local", System.getProperty("maven.repo.local") - systemProperty "useLocalRepo", findProperty("useLocalRepo") -} diff --git a/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenToolInvoker.java b/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenToolInvoker.java deleted file mode 100644 index ef9fc77e2..000000000 --- a/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenToolInvoker.java +++ /dev/null @@ -1,17 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.cdgen.gradleplugin; - -import de.monticore.gradle.common.GradleLog; -import de.se_rwth.commons.logging.Log; -import java.util.Arrays; - -public class CDGenToolInvoker { - - public static void run(String[] args) { - GradleLog.init(); - Log.info("Starting CDGenTool: \n" + "\t java -jar CDGenTool.jar " + Arrays.toString(args), - CDGenToolInvoker.class.getName()); - de.monticore.cdgen.CDGenTool.gradleMain(args); - } - -} diff --git a/cdtool/cdgradle/src/test/java/de/monticore/cdgen/CDGenGradlePluginTest.java b/cdtool/cdgradle/src/test/java/de/monticore/cdgen/CDGenGradlePluginTest.java deleted file mode 100644 index d6ac7f4f0..000000000 --- a/cdtool/cdgradle/src/test/java/de/monticore/cdgen/CDGenGradlePluginTest.java +++ /dev/null @@ -1,138 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.cdgen; - -import static org.junit.jupiter.api.Assertions.*; - -import de.monticore.cd4code.CD4CodeMill; -import de.monticore.symbols.basicsymbols.BasicSymbolsMill; -import de.se_rwth.commons.logging.LogStub; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Properties; -import javax.annotation.Nullable; - -import org.apache.commons.io.FileUtils; -import org.gradle.testkit.runner.BuildResult; -import org.gradle.testkit.runner.GradleRunner; -import org.gradle.testkit.runner.TaskOutcome; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.io.TempDir; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; - -public class CDGenGradlePluginTest { - - @TempDir - File testProjectDir; - - @ParameterizedTest - @ValueSource(strings = { "8.5", "8.7", "8.14" }) - public void testCDGen(String version) throws IOException { - FileUtils.copyDirectory(new File("src/test/resources/cdgradle-it"), testProjectDir); - - BuildResult result = GradleRunner.create().withPluginClasspath().withGradleVersion(version) - .withProjectDir(testProjectDir).withArguments(withProperties("build", "--info", - "--stacktrace")).build(); - assertEquals(TaskOutcome.SUCCESS, result.task(":generateClassDiagrams").getOutcome()); - assertEquals(TaskOutcome.SUCCESS, result.task(":compileJava").getOutcome()); - - File origSymbolsOut = new File(testProjectDir, "build/cdgensymbols/main/original/MyCD.cdsym"); - assertTrue(origSymbolsOut.exists(), "Exported original symbols missing"); - - File symbolsOut = new File(testProjectDir, "build/cdgensymbols/main/original/MyCD.cdsym"); - assertTrue(symbolsOut.exists(), "Exported decorated symbols missing"); - - // Test if we can successfully resolve a decorated function - LogStub.initPlusLog(); - CD4CodeMill.init(); - BasicSymbolsMill.initializePrimitives(); - BasicSymbolsMill.initializeString(); - // Load the (freshly generated) CD-sym - CD4CodeMill.globalScope().getSymbolPath().addEntry(symbolsOut.getParentFile().toPath()); - CD4CodeMill.globalScope().loadDiagram("MyCD"); - - CD4CodeMill.globalScope().resolveMethod("MyCD.MyCD.CanBeObserved.getName"); - // Check for a method within a class, which is TOPed - // We explicitly expect the method to be resolvable via IncompleteA - CD4CodeMill.globalScope().resolveMethod("MyCD.MyCD.IncompleteA.getName"); - CD4CodeMill.globalScope().resolveType("MyCD.MyCD.BBuilder"); - - Assertions.assertEquals(0, LogStub.getFindingsCount()); - - CD4CodeMill.reset(); - } - - /** - * Test the CDGenPlugin with a decorator written in a custom sourceSet and a custom config - * template - * - * @param version gradle version - * @throws IOException in case of errors - */ - @ParameterizedTest - @ValueSource(strings = { "8.5", "8.7", "8.14" }) - public void testCDGenOwnDecorator(String version) throws IOException { - FileUtils.copyDirectory(new File("src/test/resources/cdgradle-it"), testProjectDir); - - BuildResult result = GradleRunner.create().withPluginClasspath().withGradleVersion(version) - .withProjectDir(testProjectDir).withArguments(withProperties("build", "--info", - "--stacktrace", "-PwithCustomDec=true" // with custom decorator - )).build(); - assertEquals(TaskOutcome.SUCCESS, result.task(":generateClassDiagrams").getOutcome()); - assertEquals(TaskOutcome.SUCCESS, result.task(":compileJava").getOutcome()); - - if (!result.getOutput().contains("I am decorating")) { - System.err.println(result.getOutput()); - fail("Failed to find \"I am decorating\" in output"); - } - } - - Properties loadProperties() { - Properties properties = new Properties(); - try { - properties.load(this.getClass().getClassLoader().getResourceAsStream("buildInfo.properties")); - } - catch (IOException e) { - throw new RuntimeException(e); - } - return properties; - } - - List withProperties(String... args) { - return withProperties(Arrays.asList(args)); - } - - List withProperties(List runnerArgs) { - List ret = new ArrayList<>(runnerArgs); - @Nullable - String mavenRepo = System.getProperty("maven.repo.local"); - if (mavenRepo != null && !mavenRepo.isEmpty()) { - ret.add("-Dmaven.repo.local=" + mavenRepo); - } - @Nullable - String useLocalRepo = System.getProperty("useLocalRepo"); - if (useLocalRepo != null && !useLocalRepo.isEmpty()) { - ret.add("-PuseLocalRepo=" + useLocalRepo); - } - - File langLibs = new File("../../cdlang/target/libs"); - File runtimeLibs = new File("../../cd-runtime/target/libs"); - - String projVersion = loadProperties().getProperty("version"); - File cd4aJarFile = new File(langLibs, "cd4analysis-" + projVersion + ".jar").getAbsoluteFile(); - File runtimeJarFile = new File(runtimeLibs, "cd4analysis-" + projVersion + "-cd-runtime.jar") - .getAbsoluteFile(); - assertTrue(cd4aJarFile.exists()); - assertTrue(runtimeJarFile.exists()); - - ret.add("-Pversion=" + projVersion); - ret.add("-Pcdgen_cd4aJarFile=" + cd4aJarFile); - ret.add("-Pcdgen_runtimeJarFile=" + runtimeJarFile); - - return ret; - } - -} diff --git a/cdtool/cdgradle/src/test/resources/cdgradle-it/gradle.properties b/cdtool/cdgradle/src/test/resources/cdgradle-it/gradle.properties deleted file mode 100644 index 96dda3e3a..000000000 --- a/cdtool/cdgradle/src/test/resources/cdgradle-it/gradle.properties +++ /dev/null @@ -1,4 +0,0 @@ -useLocalRepo=false -version=7.10.0-SNAPSHOT -cdgen_cd4aJarFile=../../../../../../cdlang/target/libs/cd4analysis-7.9.0-SNAPSHOT.jar -cdgen_runtimeJarFile=../../../../../../cd-runtime/target/libs/cd4analysis-7.9.0-SNAPSHOT-cd-runtime.jar diff --git a/cdtool/cdgradle/src/test/resources/cdgradle-it/settings.gradle b/cdtool/cdgradle/src/test/resources/cdgradle-it/settings.gradle deleted file mode 100644 index e732275e7..000000000 --- a/cdtool/cdgradle/src/test/resources/cdgradle-it/settings.gradle +++ /dev/null @@ -1,14 +0,0 @@ -pluginManagement { - repositories { - if (("true").equals(getProperty('useLocalRepo'))) { - mavenLocal() - } - mavenCentral() - gradlePluginPortal() - - maven { - url "https://nexus.se.rwth-aachen.de/content/groups/public" - } - } -} -rootProject.name = 'cgradle-it' diff --git a/settings.gradle b/settings.gradle index 954bfbce8..c78f5832e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1,6 @@ /* (c) https://github.com/MontiCore/monticore */ pluginManagement { + includeBuild('cdgradle') repositories { if(("true").equals(getProperty('useLocalRepo'))){ mavenLocal() @@ -30,7 +31,8 @@ if(!hasProperty('bootstrap')) { if("true".equals(getProperty('genTR'))){ include(":trafo-library") } - include(':cdtool:cdgradle') + include(':cdlang-it') + include(':cdgradle-it') } include(':cd-runtime') include(':symtabdefinitiontool')