From 42bdca9c70e54d095e9ebfd69e82d1bca15bf9ac Mon Sep 17 00:00:00 2001 From: Thibault Gagnaux Date: Tue, 9 Nov 2021 22:26:45 +0100 Subject: feat: adds two tests and makes them pass for new `runFregeTask` --- .../gradleplugins/FregePluginFunctionalTest.java | 74 +++++++++++++++++----- .../fhnw/thga/gradleplugins/CompileFregeTask.java | 1 - .../ch/fhnw/thga/gradleplugins/FregeExtension.java | 5 +- .../ch/fhnw/thga/gradleplugins/FregePlugin.java | 14 +++- .../ch/fhnw/thga/gradleplugins/RunFregeTask.java | 41 ++++++++++++ .../java/ch/fhnw/thga/gradleplugins/Builder.java | 2 + .../java/ch/fhnw/thga/gradleplugins/FregeDTO.java | 8 ++- .../fhnw/thga/gradleplugins/FregeDTOBuilder.java | 10 ++- 8 files changed, 131 insertions(+), 24 deletions(-) create mode 100644 src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java index e93bd19..1ea8e90 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java @@ -2,11 +2,9 @@ package ch.fhnw.thga.gradleplugins; import static ch.fhnw.thga.gradleplugins.GradleBuildFileConversionTest.createPluginsSection; import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_DOWNLOAD_DIRECTORY; -import static ch.fhnw.thga.gradleplugins.FregePlugin.COMPILE_FREGE_TASK_NAME; -import static ch.fhnw.thga.gradleplugins.FregePlugin.FREGE_EXTENSION_NAME; -import static ch.fhnw.thga.gradleplugins.FregePlugin.FREGE_PLUGIN_ID; -import static ch.fhnw.thga.gradleplugins.FregePlugin.SETUP_FREGE_TASK_NAME; +import static ch.fhnw.thga.gradleplugins.FregePlugin.*; import static org.gradle.testkit.runner.TaskOutcome.SUCCESS; +import static org.gradle.testkit.runner.TaskOutcome.FAILED; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -35,6 +33,7 @@ import org.junit.jupiter.api.io.TempDir; @TestInstance(Lifecycle.PER_CLASS) public class FregePluginFunctionalTest { + private static final String NEW_LINE = System.lineSeparator(); private final FregeDTOBuilder fregeBuilder = new FregeDTOBuilder(); @@ -62,9 +61,14 @@ public class FregePluginFunctionalTest { return String.format("%s {\n %s\n}", FREGE_EXTENSION_NAME, fregeDTO.toBuildFile()); } - private BuildResult runGradleTask(String taskName) { - return GradleRunner.create().withProjectDir(testProjectDir).withPluginClasspath() - .withArguments(taskName).build(); + private BuildResult runGradleTask(String taskName, String... args) { + return GradleRunner.create().withProjectDir(testProjectDir).withPluginClasspath().withArguments(taskName) + .build(); + } + + private BuildResult runAndFailGradleTask(String taskName, String... args) { + return GradleRunner.create().withProjectDir(testProjectDir).withPluginClasspath().withArguments(taskName) + .buildAndFail(); } @BeforeAll @@ -92,13 +96,13 @@ public class FregePluginFunctionalTest { class Setup_frege_task_works { @Test - void given_minimal_build_file_config() - throws Exception { - String minimalBuildFileConfig = createFregeSection(fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); + void given_minimal_build_file_config() throws Exception { + String minimalBuildFileConfig = createFregeSection( + fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); appendToFile(buildFile, minimalBuildFileConfig); BuildResult result = runGradleTask(SETUP_FREGE_TASK_NAME); - + assertTrue(project.getTasks().getByName(SETUP_FREGE_TASK_NAME) instanceof SetupFregeTask); assertEquals(SUCCESS, result.task(":" + SETUP_FREGE_TASK_NAME).getOutcome()); assertTrue(testProjectDir.toPath().resolve(Paths.get(DEFAULT_DOWNLOAD_DIRECTORY, "frege3.25.84.jar")) @@ -106,10 +110,9 @@ public class FregePluginFunctionalTest { } @Test - void given_custom_frege_compiler_download_directory_in_build_file_config() - throws Exception { - String buildFileConfigWithCustomDownloadDir = createFregeSection(fregeBuilder.version("'3.25.84'").release("'3.25alpha'") - .compilerDownloadDir("layout.projectDirectory.dir('dist')").build()); + void given_custom_frege_compiler_download_directory_in_build_file_config() throws Exception { + String buildFileConfigWithCustomDownloadDir = createFregeSection(fregeBuilder.version("'3.25.84'") + .release("'3.25alpha'").compilerDownloadDir("layout.projectDirectory.dir('dist')").build()); appendToFile(buildFile, buildFileConfigWithCustomDownloadDir); BuildResult result = runGradleTask(SETUP_FREGE_TASK_NAME); @@ -132,7 +135,8 @@ public class FregePluginFunctionalTest { File completionFr = testProjectDir.toPath().resolve(Paths.get("src", "main", "frege", "Completion.fr")) .toFile(); writeToFile(completionFr, fregeCode); - String minimalBuildFileConfig = createFregeSection(fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); + String minimalBuildFileConfig = createFregeSection( + fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); appendToFile(buildFile, minimalBuildFileConfig); BuildResult result = runGradleTask(COMPILE_FREGE_TASK_NAME); @@ -147,4 +151,42 @@ public class FregePluginFunctionalTest { .exists()); } } + + @Nested + @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) + class Run_frege_task_works { + @Test + void given_frege_file_with_main_function() throws Exception { + String fregeCode = String.join(NEW_LINE, "module ch.fhnw.thga.Main where", NEW_LINE, NEW_LINE, + " main = do", NEW_LINE, " println \"Frege rocks\"", NEW_LINE); + Files.createDirectories(testProjectDir.toPath().resolve(Paths.get("src", "main", "frege"))); + File mainFr = testProjectDir.toPath().resolve(Paths.get("src", "main", "frege", "Main.fr")).toFile(); + writeToFile(mainFr, fregeCode); + String minimalBuildFileConfig = createFregeSection( + fregeBuilder.version("'3.25.84'").release("'3.25alpha'").mainModule("'ch.fhnw.thga.Main'").build()); + appendToFile(buildFile, minimalBuildFileConfig); + + BuildResult result = runGradleTask(RUN_FREGE_TASK_NAME); + assertTrue(project.getTasks().getByName(RUN_FREGE_TASK_NAME) instanceof RunFregeTask); + assertEquals(SUCCESS, result.task(":" + RUN_FREGE_TASK_NAME).getOutcome()); + assertTrue(result.getOutput().contains("Frege rocks")); + } + + @Test + void given_frege_file_without_main_function() throws Exception { + String fregeCode = "module ch.fhnw.thga.Completion where\n\n" + "complete :: Int -> (Int, String)\n" + + "complete i = (i, \"Frege rocks\")\n"; + Files.createDirectories(testProjectDir.toPath().resolve(Paths.get("src", "main", "frege"))); + File completeFr = testProjectDir.toPath().resolve(Paths.get("src", "main", "frege", "Complete.fr")).toFile(); + writeToFile(completeFr, fregeCode); + String minimalBuildFileConfig = createFregeSection( + fregeBuilder.version("'3.25.84'").release("'3.25alpha'").mainModule("'ch.fhnw.thga.Completion'").build()); + appendToFile(buildFile, minimalBuildFileConfig); + + BuildResult result = runAndFailGradleTask(RUN_FREGE_TASK_NAME); + assertTrue(project.getTasks().getByName(RUN_FREGE_TASK_NAME) instanceof RunFregeTask); + assertEquals(FAILED, result.task(":" + RUN_FREGE_TASK_NAME).getOutcome()); + assertTrue(result.getOutput().contains("Main method not found")); + } + } } \ No newline at end of file diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java index 551f6c5..6ba6212 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java @@ -29,7 +29,6 @@ public abstract class CompileFregeTask extends DefaultTask { @Inject public CompileFregeTask(ObjectFactory objectFactory) { javaExec = objectFactory.newInstance(JavaExec.class); - } @TaskAction diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java index fd4f1b4..139429b 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java @@ -8,11 +8,14 @@ import org.gradle.api.provider.Property; public abstract class FregeExtension { public static final String DEFAULT_DOWNLOAD_DIRECTORY = "lib"; + public static final String DEFAULT_RELATIVE_OUTPUT_DIR = "classes/main/frege"; public abstract Property getVersion(); public abstract Property getRelease(); + public abstract Property getMainModule(); + public abstract DirectoryProperty getCompilerDownloadDir(); public abstract DirectoryProperty getMainSourceDir(); @@ -23,7 +26,7 @@ public abstract class FregeExtension { public FregeExtension(ProjectLayout projectLayout) { getCompilerDownloadDir().convention(projectLayout.getProjectDirectory().dir(DEFAULT_DOWNLOAD_DIRECTORY)); getMainSourceDir().convention(projectLayout.getProjectDirectory()); - getOutputDir().convention(projectLayout.getBuildDirectory().dir("classes/main/frege")); + getOutputDir().convention(projectLayout.getBuildDirectory().dir(DEFAULT_RELATIVE_OUTPUT_DIR)); } } diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java index 4f0bb34..8c50a5f 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java @@ -7,6 +7,7 @@ import org.gradle.api.tasks.TaskProvider; public class FregePlugin implements Plugin { public static final String SETUP_FREGE_TASK_NAME = "setupFrege"; public static final String COMPILE_FREGE_TASK_NAME = "compileFrege"; + public static final String RUN_FREGE_TASK_NAME = "runFrege"; public static final String FREGE_PLUGIN_ID = "ch.fhnw.thga.frege"; public static final String FREGE_EXTENSION_NAME = "frege"; @@ -20,11 +21,18 @@ public class FregePlugin implements Plugin { task.getDownloadDir().set(extension.getCompilerDownloadDir()); }); - project.getTasks().register(COMPILE_FREGE_TASK_NAME, CompileFregeTask.class, task -> { - task.dependsOn(setupFregeCompilerTask); + TaskProvider compileFregeTask = project.getTasks().register(COMPILE_FREGE_TASK_NAME, + CompileFregeTask.class, task -> { + task.dependsOn(setupFregeCompilerTask); + task.getFregeCompilerJar().set(setupFregeCompilerTask.get().getFregeCompilerOutputPath()); + task.getFregeMainSourceDir().set(extension.getMainSourceDir()); + task.getFregeOutputDir().set(extension.getOutputDir()); + }); + project.getTasks().register(RUN_FREGE_TASK_NAME, RunFregeTask.class, task -> { + task.dependsOn(compileFregeTask); task.getFregeCompilerJar().set(setupFregeCompilerTask.get().getFregeCompilerOutputPath()); - task.getFregeMainSourceDir().set(extension.getMainSourceDir()); task.getFregeOutputDir().set(extension.getOutputDir()); + task.getMainModule().set(extension.getMainModule()); }); } } diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java new file mode 100644 index 0000000..2f619a5 --- /dev/null +++ b/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java @@ -0,0 +1,41 @@ +package ch.fhnw.thga.gradleplugins; + +import javax.inject.Inject; + +import org.gradle.api.DefaultTask; +import org.gradle.api.file.DirectoryProperty; +import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.logging.Logger; +import org.gradle.api.logging.Logging; +import org.gradle.api.model.ObjectFactory; +import org.gradle.api.provider.Property; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.InputDirectory; +import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.JavaExec; +import org.gradle.api.tasks.TaskAction; + +public abstract class RunFregeTask extends DefaultTask { + public static final Logger LOGGER = Logging.getLogger(SetupFregeTask.class); + private final JavaExec javaExec; + + @InputFile + public abstract RegularFileProperty getFregeCompilerJar(); + + @InputDirectory + public abstract DirectoryProperty getFregeOutputDir(); + + @Input + public abstract Property getMainModule(); + + @Inject + public RunFregeTask(ObjectFactory objectFactory) { + javaExec = objectFactory.newInstance(JavaExec.class); + } + + @TaskAction + public void runFrege() { + javaExec.getMainClass().set(getMainModule()); + javaExec.setClasspath(getProject().files(getFregeCompilerJar(), getFregeOutputDir())).exec(); + } +} diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/Builder.java b/src/test/java/ch/fhnw/thga/gradleplugins/Builder.java index cebaaf3..c8aeda7 100644 --- a/src/test/java/ch/fhnw/thga/gradleplugins/Builder.java +++ b/src/test/java/ch/fhnw/thga/gradleplugins/Builder.java @@ -11,5 +11,7 @@ public interface Builder { Builder outputDir(String outputDir); + Builder mainModule(String mainModule); + FregeDTO build(); } diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTO.java b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTO.java index 63d7dae..271d07b 100644 --- a/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTO.java +++ b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTO.java @@ -12,14 +12,16 @@ public class FregeDTO { public final String compilerDownloadDir; public final String mainSourceDir; public final String outputDir; + public final String mainModule; public FregeDTO(String version, String release, String compilerDownloadDir, String mainSourceDir, - String outputDir) { + String outputDir, String mainModule) { this.version = version; this.release = release; this.compilerDownloadDir = compilerDownloadDir; this.mainSourceDir = mainSourceDir; this.outputDir = outputDir; + this.mainModule = mainModule; } public String getVersion() { @@ -42,6 +44,10 @@ public class FregeDTO { return outputDir; } + public String getMainModule() { + return mainModule; + } + private String getFieldValue(Field field) { try { return field.get(this).toString(); diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java index afdc862..5c24f10 100644 --- a/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java +++ b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java @@ -6,6 +6,7 @@ public class FregeDTOBuilder implements Builder { private String compilerDownloadDir = ""; private String mainSourceDir = ""; private String outputDir = ""; + private String mainModule = ""; @Override public Builder version(String version) { @@ -41,8 +42,13 @@ public class FregeDTOBuilder implements Builder { return this; } - public FregeDTO build() { - return new FregeDTO(version, release, compilerDownloadDir, mainSourceDir, outputDir); + @Override + public Builder mainModule(String mainModule) { + this.mainModule = mainModule; + return this; } + public FregeDTO build() { + return new FregeDTO(version, release, compilerDownloadDir, mainSourceDir, outputDir, mainModule); + } } -- cgit From 06d18924294dfe78eaba8eafe3a5ec559c43aecb Mon Sep 17 00:00:00 2001 From: Thibault Gagnaux Date: Wed, 10 Nov 2021 00:37:04 +0100 Subject: refactor: tests and makes `FregeDTOBuilder` a singleton --- .../gradleplugins/FregePluginFunctionalTest.java | 79 +++++++++++++++------- .../fhnw/thga/gradleplugins/FregeDTOBuilder.java | 19 +++++- .../GradleBuildFileConversionTest.java | 8 ++- 3 files changed, 80 insertions(+), 26 deletions(-) diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java index 1ea8e90..3e36f52 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java @@ -13,6 +13,7 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; import java.util.stream.Stream; @@ -34,8 +35,13 @@ import org.junit.jupiter.api.io.TempDir; @TestInstance(Lifecycle.PER_CLASS) public class FregePluginFunctionalTest { private static final String NEW_LINE = System.lineSeparator(); + private static final String SIMPLE_FREGE_CODE = String.join(NEW_LINE, + "module ch.fhnw.thga.Completion where", NEW_LINE, + NEW_LINE, + " complete :: Int -> (Int, String)", NEW_LINE, + " complete i = (i, \"Frege rocks\")", NEW_LINE); - private final FregeDTOBuilder fregeBuilder = new FregeDTOBuilder(); + private static FregeDTOBuilder fregeBuilder; @TempDir File testProjectDir; @@ -71,6 +77,14 @@ public class FregePluginFunctionalTest { .buildAndFail(); } + private void setupDefaultFregeProjectStructure(String fregeCode, String fregeFileName, String buildFileConfig) throws Exception { + Files.createDirectories(testProjectDir.toPath().resolve(Paths.get("src", "main", "frege"))); + File fregeFile = testProjectDir.toPath().resolve(Paths.get("src", "main", "frege", fregeFileName)) + .toFile(); + writeToFile(fregeFile, fregeCode); + appendToFile(buildFile, buildFileConfig); + } + @BeforeAll void beforeAll() throws Exception { settingsFile = new File(testProjectDir, "settings.gradle"); @@ -84,14 +98,16 @@ public class FregePluginFunctionalTest { void setup() throws Exception { buildFile = new File(testProjectDir, "build.gradle"); writeToFile(buildFile, createPluginsSection(Stream.of(FREGE_PLUGIN_ID))); + fregeBuilder = FregeDTOBuilder.getInstance(); } @AfterEach void cleanup() { - buildFile.delete(); + testProjectDir.delete(); } @Nested + @TestInstance(Lifecycle.PER_CLASS) @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) class Setup_frege_task_works { @@ -124,20 +140,16 @@ public class FregePluginFunctionalTest { } @Nested + @TestInstance(Lifecycle.PER_CLASS) @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) class Compile_frege_task_works { @Test - void given_frege_code_in_src_main_frege_and_minimal_build_file_config() throws Exception { - String fregeCode = "module ch.fhnw.thga.Completion where\n\n" + "complete :: Int -> (Int, String)\n" - + "complete i = (i, \"Frege rocks\")\n"; - Files.createDirectories(testProjectDir.toPath().resolve(Paths.get("src", "main", "frege"))); - File completionFr = testProjectDir.toPath().resolve(Paths.get("src", "main", "frege", "Completion.fr")) - .toFile(); - writeToFile(completionFr, fregeCode); + void given_frege_code_in_default_source_dir_and_minimal_build_file_config() throws Exception { + String completionFr = "Completion.fr"; String minimalBuildFileConfig = createFregeSection( fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); - appendToFile(buildFile, minimalBuildFileConfig); + setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, minimalBuildFileConfig); BuildResult result = runGradleTask(COMPILE_FREGE_TASK_NAME); @@ -150,21 +162,43 @@ public class FregePluginFunctionalTest { testProjectDir.getAbsolutePath() + "/build/classes/main/frege/ch/fhnw/thga/Completion.class") .exists()); } + + @Test + void given_frege_code_in_custom_source_dir_and_custom_output_dir_and_minimal_build_file_config() + throws Exception { + Path customMainSourceDir = testProjectDir.toPath().resolve(Paths.get("src", "frege")); + Files.createDirectories(customMainSourceDir); + File completionFr = customMainSourceDir.resolve("Completion.fr").toFile(); + writeToFile(completionFr, SIMPLE_FREGE_CODE); + String minimalBuildFileConfig = createFregeSection(fregeBuilder.version("'3.25.84'").release("'3.25alpha'") + .mainSourceDir("layout.projectDirectory.dir('src/frege')") + .outputDir("layout.buildDirectory.dir('frege')").build()); + appendToFile(buildFile, minimalBuildFileConfig); + + BuildResult result = runGradleTask(COMPILE_FREGE_TASK_NAME); + + assertTrue(project.getTasks().getByName(COMPILE_FREGE_TASK_NAME) instanceof CompileFregeTask); + assertEquals(SUCCESS, result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); + assertTrue( + new File(testProjectDir.getAbsolutePath() + "/build/frege/ch/fhnw/thga/Completion.java").exists()); + assertTrue( + new File(testProjectDir.getAbsolutePath() + "/build/frege/ch/fhnw/thga/Completion.class").exists()); + } } @Nested + @TestInstance(Lifecycle.PER_CLASS) @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) class Run_frege_task_works { @Test void given_frege_file_with_main_function() throws Exception { String fregeCode = String.join(NEW_LINE, "module ch.fhnw.thga.Main where", NEW_LINE, NEW_LINE, " main = do", NEW_LINE, " println \"Frege rocks\"", NEW_LINE); - Files.createDirectories(testProjectDir.toPath().resolve(Paths.get("src", "main", "frege"))); - File mainFr = testProjectDir.toPath().resolve(Paths.get("src", "main", "frege", "Main.fr")).toFile(); - writeToFile(mainFr, fregeCode); - String minimalBuildFileConfig = createFregeSection( - fregeBuilder.version("'3.25.84'").release("'3.25alpha'").mainModule("'ch.fhnw.thga.Main'").build()); - appendToFile(buildFile, minimalBuildFileConfig); + String mainFr = "Main.fr"; + String buildFileConfig = createFregeSection( + fregeBuilder.version("'3.25.84'").release("'3.25alpha'") + .mainModule("'ch.fhnw.thga.Main'").build()); + setupDefaultFregeProjectStructure(fregeCode, mainFr, buildFileConfig); BuildResult result = runGradleTask(RUN_FREGE_TASK_NAME); assertTrue(project.getTasks().getByName(RUN_FREGE_TASK_NAME) instanceof RunFregeTask); @@ -174,14 +208,11 @@ public class FregePluginFunctionalTest { @Test void given_frege_file_without_main_function() throws Exception { - String fregeCode = "module ch.fhnw.thga.Completion where\n\n" + "complete :: Int -> (Int, String)\n" - + "complete i = (i, \"Frege rocks\")\n"; - Files.createDirectories(testProjectDir.toPath().resolve(Paths.get("src", "main", "frege"))); - File completeFr = testProjectDir.toPath().resolve(Paths.get("src", "main", "frege", "Complete.fr")).toFile(); - writeToFile(completeFr, fregeCode); - String minimalBuildFileConfig = createFregeSection( - fregeBuilder.version("'3.25.84'").release("'3.25alpha'").mainModule("'ch.fhnw.thga.Completion'").build()); - appendToFile(buildFile, minimalBuildFileConfig); + String completionFr = "Completion.fr"; + String buildFileConfig = createFregeSection( + fregeBuilder.version("'3.25.84'").release("'3.25alpha'") + .mainModule("'ch.fhnw.thga.Completion'").build()); + setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, buildFileConfig); BuildResult result = runAndFailGradleTask(RUN_FREGE_TASK_NAME); assertTrue(project.getTasks().getByName(RUN_FREGE_TASK_NAME) instanceof RunFregeTask); diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java index 5c24f10..f4cabbe 100644 --- a/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java +++ b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java @@ -1,6 +1,6 @@ package ch.fhnw.thga.gradleplugins; -public class FregeDTOBuilder implements Builder { +public final class FregeDTOBuilder implements Builder { private String version = ""; private String release = ""; private String compilerDownloadDir = ""; @@ -8,6 +8,23 @@ public class FregeDTOBuilder implements Builder { private String outputDir = ""; private String mainModule = ""; + private static volatile FregeDTOBuilder instance; + + private FregeDTOBuilder() { + } + + public static FregeDTOBuilder getInstance() { + FregeDTOBuilder result = instance; + if (result != null) { + return result; + } else { + synchronized (FregeDTOBuilder.class) { + return (instance == null) ? new FregeDTOBuilder() : instance; + } + } + } + + @Override public Builder version(String version) { this.version = version; diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java b/src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java index 80c8827..8512113 100644 --- a/src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java +++ b/src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java @@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.stream.Stream; import java.util.stream.Collectors; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.IndicativeSentencesGeneration; import org.junit.jupiter.api.Nested; @@ -15,7 +16,7 @@ import org.junit.jupiter.api.TestInstance.Lifecycle; @TestInstance(Lifecycle.PER_CLASS) public class GradleBuildFileConversionTest { - private final FregeDTOBuilder fregeBuilder = new FregeDTOBuilder(); + private static FregeDTOBuilder fregeBuilder; private static String buildFilePluginString(String pluginId) { return String.format("id '%s'", pluginId); @@ -30,6 +31,11 @@ public class GradleBuildFileConversionTest { assertTrue(subStrings.allMatch(substring -> s.contains(substring))); } + @BeforeEach + void setup() { + fregeBuilder = FregeDTOBuilder.getInstance(); + } + @Nested @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) class Converting_Frege_DTO_to_build_file_key_value_pairs_works { -- cgit From a5bdb321ebff31e5b2005c6b511fc3873ec9cc7f Mon Sep 17 00:00:00 2001 From: Thibault Gagnaux Date: Wed, 10 Nov 2021 09:15:23 +0100 Subject: feat: `mainModule` property can be configured with command-line option --- .../thga/gradleplugins/FregePluginFunctionalTest.java | 19 +++++++++++++++++-- .../java/ch/fhnw/thga/gradleplugins/RunFregeTask.java | 2 ++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java index 3e36f52..aa3a7f4 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java @@ -67,7 +67,7 @@ public class FregePluginFunctionalTest { return String.format("%s {\n %s\n}", FREGE_EXTENSION_NAME, fregeDTO.toBuildFile()); } - private BuildResult runGradleTask(String taskName, String... args) { + private BuildResult runGradleTask(String... taskName) { return GradleRunner.create().withProjectDir(testProjectDir).withPluginClasspath().withArguments(taskName) .build(); } @@ -191,7 +191,7 @@ public class FregePluginFunctionalTest { @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) class Run_frege_task_works { @Test - void given_frege_file_with_main_function() throws Exception { + void given_frege_file_with_main_function_and_main_module_config() throws Exception { String fregeCode = String.join(NEW_LINE, "module ch.fhnw.thga.Main where", NEW_LINE, NEW_LINE, " main = do", NEW_LINE, " println \"Frege rocks\"", NEW_LINE); String mainFr = "Main.fr"; @@ -219,5 +219,20 @@ public class FregePluginFunctionalTest { assertEquals(FAILED, result.task(":" + RUN_FREGE_TASK_NAME).getOutcome()); assertTrue(result.getOutput().contains("Main method not found")); } + + @Test + void given_frege_file_with_main_function_and_main_module_command_line_option() throws Exception { + String fregeCode = String.join(NEW_LINE, "module ch.fhnw.thga.Main where", NEW_LINE, NEW_LINE, + " main = do", NEW_LINE, " println \"Frege rocks\"", NEW_LINE); + String mainFr = "Main.fr"; + String buildFileConfig = createFregeSection( + fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); + setupDefaultFregeProjectStructure(fregeCode, mainFr, buildFileConfig); + + BuildResult result = runGradleTask(RUN_FREGE_TASK_NAME, "--mainModule=ch.fhnw.thga.Main"); + assertTrue(project.getTasks().getByName(RUN_FREGE_TASK_NAME) instanceof RunFregeTask); + assertEquals(SUCCESS, result.task(":" + RUN_FREGE_TASK_NAME).getOutcome()); + assertTrue(result.getOutput().contains("Frege rocks")); + } } } \ No newline at end of file diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java index 2f619a5..d27816c 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java @@ -14,6 +14,7 @@ import org.gradle.api.tasks.InputDirectory; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.JavaExec; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.options.Option; public abstract class RunFregeTask extends DefaultTask { public static final Logger LOGGER = Logging.getLogger(SetupFregeTask.class); @@ -26,6 +27,7 @@ public abstract class RunFregeTask extends DefaultTask { public abstract DirectoryProperty getFregeOutputDir(); @Input + @Option(option = "mainModule", description = "The full name of the Frege module with a main function, e.g. 'my.mod.Name'") public abstract Property getMainModule(); @Inject -- cgit From f3924e8748efe3b035a43ec62eb1ab54179c6221 Mon Sep 17 00:00:00 2001 From: Thibault Gagnaux Date: Wed, 10 Nov 2021 09:31:00 +0100 Subject: chore: updates junit 5.7.2 -> 5.8.1, README and version --- .github/workflows/build.yml | 35 +++++++++++++++++++++++++++++++++++ .github/workflows/main.yml | 35 ----------------------------------- README.md | 24 ++++++++++++++++++++---- build.gradle | 2 +- gradle.properties | 2 +- 5 files changed, 57 insertions(+), 41 deletions(-) create mode 100644 .github/workflows/build.yml delete mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..c82e9d6 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,35 @@ +name: Test +on: + push: + branches: [ main, develop ] + pull_request: + branches: [ main, develop ] + workflow_dispatch: + +jobs: + ci: + name: ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [macos-10.15, ubuntu-20.04, windows-2019] + + steps: + - name: Checkout Repository + uses: actions/checkout@v2.3.4 + + - name: Setup Java 11 + uses: actions/setup-java@v2 + with: + distribution: 'adopt-openj9' + java-version: '11' + + - name: Run Unit & Functional Tests + run: | + if [ "$RUNNER_OS" = "Windows" ]; then + ./gradlew.bat clean check + else + ./gradlew clean check + fi + shell: bash \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index c82e9d6..0000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Test -on: - push: - branches: [ main, develop ] - pull_request: - branches: [ main, develop ] - workflow_dispatch: - -jobs: - ci: - name: ${{ matrix.os }} - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [macos-10.15, ubuntu-20.04, windows-2019] - - steps: - - name: Checkout Repository - uses: actions/checkout@v2.3.4 - - - name: Setup Java 11 - uses: actions/setup-java@v2 - with: - distribution: 'adopt-openj9' - java-version: '11' - - - name: Run Unit & Functional Tests - run: | - if [ "$RUNNER_OS" = "Windows" ]; then - ./gradlew.bat clean check - else - ./gradlew clean check - fi - shell: bash \ No newline at end of file diff --git a/README.md b/README.md index f909cf7..76b42c5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # Frege Gradle Plugin -Compile frege code with gradle. +![build](https://github.com/tricktron/frege-gradle-plugin/actions/workflows/build.yml/badge.svg) + +Simplifies setting up your Frege project. ## Installation @@ -10,18 +12,32 @@ git clone https://github.com/tricktron/frege-gradle-plugin.git ``` ## How to Use -1. Specify the frege compiler release and version in your `build.gradle`: +1. Specify the frege compiler release, version and main module in your `build.gradle`: ```groovy frege { version = '3.25.84' release = '3.25alpha' + mainModule = 'my.mod.Name' } ``` -See the [frege releases](https://github.com/Frege/frege/releases) for all available versions. +See the [Frege Releases](https://github.com/Frege/frege/releases) for all available versions. + +Optional configuration parameters inside `build.gradle`: +- compilerDownloadDir: defaults to `/lib` +- mainSourceDir: defaults to `/src/main/frege` +- outputDir: defaults to `/build/classes/main/frege` + + + + +### Added Tasks + +- **setupFrege**: Downloads the specified version of the Frege compiler. +- **compileFrege**: All your `*.fr` files in `mainSourceDir` get compiled to `outputDir`. +- **runFrege**: Runs the Frege module specified by `mainModule`. Alternatively you can also pass the main module by command line, e.g: `gradle runFrege --mainModule=my.mod.Name`. -2. Run the newly added `compileFrege` task. All your `*.fr` files get compiled to `build/classes/frege`. ## How to Contribute Try to add another task, e.g. `fregeDoc` to the [FregePluginFunctionalTest.java](src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java) file and try to make the test pass. \ No newline at end of file diff --git a/build.gradle b/build.gradle index a30daed..f64913d 100644 --- a/build.gradle +++ b/build.gradle @@ -45,7 +45,7 @@ tasks.withType(Test).configureEach { dependencies { def junit5Group = 'org.junit.jupiter' - def junit5Version = '5.7.2' + def junit5Version = '5.8.1' testImplementation group: junit5Group, name: 'junit-jupiter-api', version: junit5Version testRuntimeOnly group: junit5Group, name: 'junit-jupiter-engine', version: junit5Version } diff --git a/gradle.properties b/gradle.properties index cae3d07..52f90fe 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ group = ch.fhnw.thga -version = 1.0.0-alpha \ No newline at end of file +version = 1.1.0-alpha \ No newline at end of file -- cgit