From 47f99d65a09660863cb5d6b25b239ead3389f3ac Mon Sep 17 00:00:00 2001 From: Thibault Gagnaux Date: Wed, 2 Feb 2022 18:50:13 +0100 Subject: feat: simplifies the whole gradle plugin - the `compileFregeTask` has a new optional input called `mainModuleName`. If it is set, it and only its dependencies will be compiled, otherwise all `.fr`files in the `mainSourceDir`will be compiled. - the internal `DependencyFregeTask` is deleted because it was only used by the vscode plugin and I decided to remove this gradle plugin as a dependency. - an example project folder was added to test the plugin manually. --- .../gradleplugins/FregePluginFunctionalTest.java | 151 +++++---------------- 1 file changed, 35 insertions(+), 116 deletions(-) (limited to 'src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java') diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java index a7c2b35..ce384cb 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java @@ -2,7 +2,6 @@ package ch.fhnw.thga.gradleplugins; 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.DEPS_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.REPL_FREGE_TASK_NAME; @@ -14,7 +13,6 @@ import static org.gradle.testkit.runner.TaskOutcome.FROM_CACHE; import static org.gradle.testkit.runner.TaskOutcome.SUCCESS; import static org.gradle.testkit.runner.TaskOutcome.UP_TO_DATE; 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 java.io.BufferedWriter; @@ -41,15 +39,22 @@ import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.io.TempDir; -import ch.fhnw.thga.gradleplugins.internal.DependencyFregeTask; - @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); +public class FregePluginFunctionalTest +{ + private static final String NEW_LINE = System.lineSeparator(); + private static final String FREGE_COMPLETION_MODULE_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 static FregeDTOBuilder fregeBuilder; @@ -96,9 +101,12 @@ public class FregePluginFunctionalTest { 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(); + Files.createDirectories(testProjectDir.toPath().resolve(Paths.get( + "src", "main", "frege", "ch", "fhnw", "thga" + ))); + File fregeFile = testProjectDir.toPath().resolve(Paths.get( + "src", "main", "frege", "ch", "fhnw", "thga", fregeFileName + )).toFile(); writeToFile(fregeFile, fregeCode); appendToFile(buildFile, buildFileConfig); } @@ -171,7 +179,7 @@ public class FregePluginFunctionalTest { String completionFr = "Completion.fr"; String minimalBuildFileConfig = createFregeSection( fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); - setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, minimalBuildFileConfig); + setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig); BuildResult result = runGradleTask(COMPILE_FREGE_TASK_NAME); @@ -193,7 +201,7 @@ public class FregePluginFunctionalTest { String buildConfigWithCompilerFlags = createFregeSection(fregeBuilder.version("'3.25.84'") .release("'3.25alpha'").compilerFlags("['-v', '-make', '-O', '-hints']") .build()); - setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, + setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, buildConfigWithCompilerFlags); BuildResult result = runGradleTask(COMPILE_FREGE_TASK_NAME); @@ -216,7 +224,7 @@ public class FregePluginFunctionalTest { Path customMainSourceDir = testProjectDir.toPath().resolve(Paths.get("src", "frege")); Files.createDirectories(customMainSourceDir); File completionFr = customMainSourceDir.resolve("Completion.fr").toFile(); - writeToFile(completionFr, SIMPLE_FREGE_CODE); + writeToFile(completionFr, FREGE_COMPLETION_MODULE_CODE); String minimalBuildFileConfig = createFregeSection( fregeBuilder.version("'3.25.84'").release("'3.25alpha'") .mainSourceDir("layout.projectDirectory.dir('src/frege')") @@ -240,7 +248,7 @@ public class FregePluginFunctionalTest { String completionFr = "Completion.fr"; String minimalBuildFileConfig = createFregeSection( fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); - setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, minimalBuildFileConfig); + setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig); BuildResult first = runGradleTask(COMPILE_FREGE_TASK_NAME); assertEquals(SUCCESS, first.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); @@ -254,7 +262,7 @@ public class FregePluginFunctionalTest { String completionFr = "Completion.fr"; String minimalBuildFileConfig = createFregeSection( fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); - setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, minimalBuildFileConfig); + setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig); BuildResult first = runGradleTask(COMPILE_FREGE_TASK_NAME, "--build-cache"); assertEquals(SUCCESS, first.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); @@ -268,7 +276,7 @@ public class FregePluginFunctionalTest { BuildResult second = runGradleTask(COMPILE_FREGE_TASK_NAME, "--build-cache"); assertEquals(SUCCESS, second.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); - setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, ""); + setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, ""); BuildResult third = runGradleTask(COMPILE_FREGE_TASK_NAME, "--build-cache"); assertEquals(FROM_CACHE, third.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); } @@ -284,7 +292,7 @@ public class FregePluginFunctionalTest { String minimalBuildFileConfig = createFregeSection( fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); - setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, minimalBuildFileConfig); + setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig); setupDefaultFregeProjectStructure(frobCode, frobFr, ""); BuildResult result = runGradleTask(COMPILE_FREGE_TASK_NAME); @@ -318,7 +326,7 @@ public class FregePluginFunctionalTest { String buildConfigWithIllegalCompilerFlags = createFregeSection(fregeBuilder .version("'3.25.84'") .release("'3.25alpha'").compilerFlags("['-make', '-bla']").build()); - setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, + setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, buildConfigWithIllegalCompilerFlags); BuildResult result = runAndFailGradleTask(COMPILE_FREGE_TASK_NAME); @@ -339,7 +347,7 @@ public class FregePluginFunctionalTest { String minimalBuildFileConfigWithoutMake = createFregeSection( fregeBuilder.version("'3.25.84'").release("'3.25alpha'").compilerFlags("['-v']") .build()); - setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, + setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfigWithoutMake); setupDefaultFregeProjectStructure(frobCode, frobFr, ""); @@ -376,7 +384,7 @@ public class FregePluginFunctionalTest { String buildFileConfig = createFregeSection( fregeBuilder.version("'3.25.84'").release("'3.25alpha'") .mainModule("'ch.fhnw.thga.Completion'").build()); - setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, buildFileConfig); + setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, buildFileConfig); BuildResult result = runAndFailGradleTask(RUN_FREGE_TASK_NAME); assertTrue(project.getTasks().getByName(RUN_FREGE_TASK_NAME) instanceof RunFregeTask); @@ -400,90 +408,6 @@ public class FregePluginFunctionalTest { } } - @Nested - @TestInstance(Lifecycle.PER_CLASS) - @IndicativeSentencesGeneration( - separator = " -> ", - generator = DisplayNameGenerator.ReplaceUnderscores.class) - class Deps_frege_task_works { - @Test - void given_minimal_build_file_config() throws Exception { - String completionFr = "Completion.fr"; - String minimalBuildFileConfig = createFregeSection( - fregeBuilder - .version("'3.25.84'") - .release("'3.25alpha'") - .build()); - setupDefaultFregeProjectStructure( - SIMPLE_FREGE_CODE, - completionFr, - minimalBuildFileConfig); - - BuildResult result = runGradleTask( - DEPS_FREGE_TASK_NAME, - "-q", - String.format("--replSource=%s", completionFr)); - - assertTrue( - project.getTasks().getByName(DEPS_FREGE_TASK_NAME) - instanceof DependencyFregeTask); - assertEquals(SUCCESS, result.task(":" + DEPS_FREGE_TASK_NAME).getOutcome()); - assertTrue(result.getOutput().contains("frege3.25.84.jar")); - assertFalse(result.getOutput().contains("Completion.java")); - assertFalse( - testProjectDir - .toPath() - .resolve("/build/classes/main/frege/ch/fhnw/thga/Completion.java").toFile() - .exists()); - } - - - @Test - void given_build_file_config_with_dependencies() throws Exception { - String completionFr = "Completion.fr"; - String minimalBuildFileConfig = createFregeSection( - fregeBuilder - .version("'3.25.84'") - .release("'3.25alpha'") - .build()); - setupDefaultFregeProjectStructure( - SIMPLE_FREGE_CODE, - completionFr, - minimalBuildFileConfig); - appendToFile( - buildFile, - String.join( - System.lineSeparator(), - "repositories {", - "mavenCentral()", - "}")); - appendToFile( - buildFile, - String.join( - System.lineSeparator(), - "dependencies {", - "implementation group: 'org.json', name: 'json', version: '20211205'", - "}")); - - BuildResult result = runGradleTask( - DEPS_FREGE_TASK_NAME, - "-q", - String.format("--replSource=%s", completionFr)); - - assertTrue( - project.getTasks().getByName(DEPS_FREGE_TASK_NAME) - instanceof DependencyFregeTask); - assertEquals(SUCCESS, result.task(":" + DEPS_FREGE_TASK_NAME).getOutcome()); - assertTrue(result.getOutput().contains("frege3.25.84.jar")); - assertTrue(result.getOutput().contains("org.json")); - assertFalse(result.getOutput().contains("Completion.java")); - assertFalse( - testProjectDir - .toPath() - .resolve("/build/classes/main/frege/ch/fhnw/thga/Completion.java").toFile() - .exists()); - } - } @Nested @TestInstance(Lifecycle.PER_CLASS) @@ -500,10 +424,10 @@ public class FregePluginFunctionalTest { fregeBuilder .version("'3.25.84'") .release("'3.25alpha'") - .replSource(String.format("'%s'", completionFr)) + .replSource(String.format("'ch.fhnw.thga.Completion'")) .build()); setupDefaultFregeProjectStructure( - SIMPLE_FREGE_CODE, + FREGE_COMPLETION_MODULE_CODE, completionFr, minimalReplModuleConfig); @@ -515,12 +439,7 @@ public class FregePluginFunctionalTest { assertEquals(SUCCESS, result.task(":" + REPL_FREGE_TASK_NAME).getOutcome()); assertTrue(result.getOutput().contains("java -cp")); assertTrue(result.getOutput().contains("frege3.25.84.jar")); - assertFalse(result.getOutput().contains("Completion.java")); - assertFalse( - testProjectDir - .toPath() - .resolve("/build/classes/main/frege/ch/fhnw/thga/Completion.java").toFile() - .exists()); + assertTrue(result.getOutput().contains("Completion.java")); } } @@ -541,7 +460,7 @@ public class FregePluginFunctionalTest { .release("'3.25alpha'") .build()); setupDefaultFregeProjectStructure( - SIMPLE_FREGE_CODE, + FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig); -- cgit From 43ee2210fa07f42a13ac6879ae167db6d2729742 Mon Sep 17 00:00:00 2001 From: Thibault Gagnaux Date: Wed, 9 Feb 2022 10:43:29 +0100 Subject: refactor: introduces staged builder patterns for frege project setup (WIP) --- build.gradle | 15 +- .../DownloadFregeCompilerFunctionalTest.java | 101 +++++++ .../gradleplugins/FregePluginFunctionalTest.java | 310 ++++++++++----------- .../gradleplugins/SharedFunctionalTestLogic.java | 107 +++++++ .../thga/gradleplugins/fregeproject/Build.java | 13 + .../thga/gradleplugins/fregeproject/BuildFile.java | 7 + .../gradleplugins/fregeproject/FregeProject.java | 26 ++ .../fregeproject/FregeProjectBuilder.java | 126 +++++++++ .../gradleplugins/fregeproject/ProjectRoot.java | 9 + src/functionalTest/resources/frege3.25.84.jar | Bin 0 -> 8478454 bytes .../ch/fhnw/thga/gradleplugins/SetupFregeTask.java | 54 +++- .../GradleBuildFileConversionTest.java | 2 +- 12 files changed, 584 insertions(+), 186 deletions(-) create mode 100644 src/functionalTest/java/ch/fhnw/thga/gradleplugins/DownloadFregeCompilerFunctionalTest.java create mode 100644 src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java create mode 100644 src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/Build.java create mode 100644 src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/BuildFile.java create mode 100644 src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProject.java create mode 100644 src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java create mode 100644 src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/ProjectRoot.java create mode 100644 src/functionalTest/resources/frege3.25.84.jar (limited to 'src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java') diff --git a/build.gradle b/build.gradle index 6c41fc2..665835c 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,7 @@ dependencies def junit5Group = 'org.junit.jupiter' def junit5Version = '5.8.2' testImplementation group: junit5Group, name: 'junit-jupiter-api', version: junit5Version + testImplementation group: 'net.jqwik', name: 'jqwik', version: '1.6.3' testRuntimeOnly group: junit5Group, name: 'junit-jupiter-engine', version: junit5Version testRuntimeOnly group: 'org.junit.platform', name: 'junit-platform-console', version: junit5Version testImplementation(enforcedPlatform("org.junit:junit-bom:${junit5Version}")) @@ -62,7 +63,7 @@ tasks.register('consoleLauncher', JavaExec) mainClass = 'org.junit.platform.console.ConsoleLauncher' outputs.dir reportsDir classpath sourceSets.test.runtimeClasspath + sourceSets.functionalTest.runtimeClasspath - args '--scan-classpath', '--details', 'tree', '--reports-dir', reportsDir.get() + args '--scan-classpath', '--details', 'summary', '--reports-dir', reportsDir.get() } tasks.register('functionalTest', Test) @@ -74,10 +75,16 @@ tasks.register('functionalTest', Test) shouldRunAfter test } -check.dependsOn functionalTest +check.dependsOn consoleLauncher tasks.withType(Test).configureEach { - useJUnitPlatform() - maxParallelForks 6 + useJUnitPlatform + { + includeEngines 'jqwik', 'junit-jupiter' + maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1 + } + filter { + includeTestsMatching "*FunctionalTest" + } } diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/DownloadFregeCompilerFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/DownloadFregeCompilerFunctionalTest.java new file mode 100644 index 0000000..58f6222 --- /dev/null +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/DownloadFregeCompilerFunctionalTest.java @@ -0,0 +1,101 @@ +package ch.fhnw.thga.gradleplugins; + +import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_DOWNLOAD_DIRECTORY; +import static ch.fhnw.thga.gradleplugins.FregePlugin.SETUP_FREGE_TASK_NAME; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.createFregeGradleProject; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.createFregeSection; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.runGradleTask; +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.File; +import java.nio.file.Paths; + +import org.gradle.api.Project; +import org.gradle.testkit.runner.BuildResult; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.IndicativeSentencesGeneration; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import ch.fhnw.thga.gradleplugins.fregeproject.FregeProjectBuilder; +import ch.fhnw.thga.gradleplugins.fregeproject.ProjectRoot; + +class DownloadFregeCompilerFunctionalTest +{ + private static FregeDTOBuilder FREGE_BUILDER = FregeDTOBuilder.getInstance(); + private static ProjectRoot FREGE_PROJECT_BUILDER = FregeProjectBuilder.getInstance(); + + @Nested + @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) + class Setup_frege_task_works { + @Test + void given_minimal_build_file_config(@TempDir File testProjectDir) throws Exception + { + String minimalBuildFileConfig = createFregeSection( + FREGE_BUILDER + .version("'3.25.84'") + .release("'3.25alpha'") + .build() + ); + + Project project = FREGE_PROJECT_BUILDER + .projectRoot(testProjectDir) + .buildFile(minimalBuildFileConfig) + .build(); + + BuildResult result = runGradleTask(testProjectDir, 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")) + .toFile() + .exists() + ); + } + + @Test + void given_custom_frege_compiler_download_directory_in_build_file_config( + @TempDir File testProjectDir) + throws Exception + { + String buildFileConfigWithCustomDownloadDir = createFregeSection( + FREGE_BUILDER + .version("'3.25.84'") + .release("'3.25alpha'") + .compilerDownloadDir("layout.projectDirectory.dir('dist')") + .build() + ); + + Project project = FREGE_PROJECT_BUILDER + .projectRoot(testProjectDir) + .buildFile(buildFileConfigWithCustomDownloadDir) + .build(); + + BuildResult result = runGradleTask(testProjectDir, 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("dist", "frege3.25.84.jar")) + .toFile() + .exists() + ); + } + } +} \ No newline at end of file diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java index ce384cb..4355b4a 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java @@ -1,13 +1,17 @@ package ch.fhnw.thga.gradleplugins; -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.SETUP_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.REPL_FREGE_TASK_NAME; import static ch.fhnw.thga.gradleplugins.FregePlugin.RUN_FREGE_TASK_NAME; -import static ch.fhnw.thga.gradleplugins.FregePlugin.SETUP_FREGE_TASK_NAME; +import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_RELATIVE_SOURCE_DIR; import static ch.fhnw.thga.gradleplugins.GradleBuildFileConversionTest.createPluginsSection; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.createFregeSection; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.writeToFile; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.createFregeGradleProject; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.runGradleTask; import static org.gradle.testkit.runner.TaskOutcome.FAILED; import static org.gradle.testkit.runner.TaskOutcome.FROM_CACHE; import static org.gradle.testkit.runner.TaskOutcome.SUCCESS; @@ -22,6 +26,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Collections; import java.util.stream.Stream; import org.gradle.api.Project; @@ -29,20 +34,17 @@ import org.gradle.testfixtures.ProjectBuilder; import org.gradle.testkit.runner.BuildResult; import org.gradle.testkit.runner.GradleRunner; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.IndicativeSentencesGeneration; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInstance; -import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.io.TempDir; -@TestInstance(Lifecycle.PER_CLASS) public class FregePluginFunctionalTest { private static final String NEW_LINE = System.lineSeparator(); + private static FregeDTOBuilder FREGE_BUILDER = FregeDTOBuilder.getInstance(); private static final String FREGE_COMPLETION_MODULE_CODE = String.join ( @@ -56,169 +58,138 @@ public class FregePluginFunctionalTest NEW_LINE ); - private static FregeDTOBuilder fregeBuilder; - - @TempDir - File testProjectDir; - private File buildFile; - private File settingsFile; - private Project project; - - private void writeFile(File destination, String content, boolean append) throws IOException { - try (BufferedWriter output = new BufferedWriter(new FileWriter(destination, append))) { - output.write(content); - } - } - - private void writeToFile(File destination, String content) throws IOException { - writeFile(destination, content, false); - } - - private void appendToFile(File destination, String content) throws IOException { - writeFile(destination, System.lineSeparator() + content, true); - } - - private static String createFregeSection(FregeDTO fregeDTO) { - return String.format( - "%s {%s %s%s}", - FREGE_EXTENSION_NAME, - System.lineSeparator(), - fregeDTO.toBuildFile(), - System.lineSeparator()); - } - private BuildResult runGradleTask(String... taskName) { - return GradleRunner.create().withProjectDir(testProjectDir).withPluginClasspath() - .withArguments(taskName) - .build(); - } - private BuildResult runAndFailGradleTask(String taskName, String... args) { + /*private BuildResult runAndFailGradleTask(String taskName, String... args) { return GradleRunner.create().withProjectDir(testProjectDir).withPluginClasspath() .withArguments(taskName) .buildAndFail(); - } + }*/ - private void setupDefaultFregeProjectStructure(String fregeCode, String fregeFileName, String buildFileConfig) - throws Exception { - Files.createDirectories(testProjectDir.toPath().resolve(Paths.get( - "src", "main", "frege", "ch", "fhnw", "thga" - ))); - File fregeFile = testProjectDir.toPath().resolve(Paths.get( - "src", "main", "frege", "ch", "fhnw", "thga", fregeFileName - )).toFile(); - writeToFile(fregeFile, fregeCode); - appendToFile(buildFile, buildFileConfig); - } - - @BeforeAll - void beforeAll() throws Exception { - settingsFile = new File(testProjectDir, "settings.gradle"); - writeToFile(settingsFile, "rootProject.name='frege-plugin'"); - project = ProjectBuilder.builder().withProjectDir(testProjectDir).build(); - project.getPluginManager().apply(FREGE_PLUGIN_ID); - - } - - @BeforeEach - void setup() throws Exception { - buildFile = new File(testProjectDir, "build.gradle"); - writeToFile(buildFile, createPluginsSection(Stream.of(FREGE_PLUGIN_ID))); - fregeBuilder = FregeDTOBuilder.getInstance(); - } - - @AfterEach - void cleanup() { - testProjectDir.delete(); + static File createFregeSourceFile( + Path fregeFilePath, + String fregeSourceCode) + throws IOException + { + Files.createDirectories( + fregeFilePath + .getParent() + ); + File fregeFile = fregeFilePath.toFile(); + writeToFile(fregeFile, fregeSourceCode); + return fregeFile; } - @Nested - @TestInstance(Lifecycle.PER_CLASS) - @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) - 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()); - 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")) - .toFile().exists()); - } - - @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()); - appendToFile(buildFile, buildFileConfigWithCustomDownloadDir); - - 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("dist", "frege3.25.84.jar")).toFile() - .exists()); - } + static File setupLocalFregeCompiler(File testProjectDir) throws IOException + { + Path fregeCompiler = Paths.get("src/functionalTest/resources/frege3.25.84.jar"); + Files.createDirectories(testProjectDir.toPath().resolve("lib")); + return Files.copy( + fregeCompiler, + testProjectDir.toPath().resolve("lib/frege3.25.84.jar") + ).toFile(); } @Nested - @TestInstance(Lifecycle.PER_CLASS) - @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) + @IndicativeSentencesGeneration( + separator = " -> ", + generator = DisplayNameGenerator.ReplaceUnderscores.class + ) class Compile_frege_task_works { - @Test - 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()); - setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, 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/classes/main/frege/ch/fhnw/thga/Completion.java") - .exists()); - assertTrue(new File( - testProjectDir.getAbsolutePath() - + "/build/classes/main/frege/ch/fhnw/thga/Completion.class") - .exists()); - } - - @Test - void given_frege_code_and_many_compiler_flags() throws Exception { - String completionFr = "Completion.fr"; - String buildConfigWithCompilerFlags = createFregeSection(fregeBuilder.version("'3.25.84'") - .release("'3.25alpha'").compilerFlags("['-v', '-make', '-O', '-hints']") - .build()); - setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, - buildConfigWithCompilerFlags); + @Test + void given_frege_code_in_default_source_dir_and_minimal_build_file_config( + @TempDir File testProjectDir) + throws Exception + { + String minimalBuildFileConfig = createFregeSection( + FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'").build() + ); + Project project = createFregeGradleProject( + testProjectDir, + minimalBuildFileConfig + ); + Path completionFr = + testProjectDir + .toPath() + .resolve(Paths.get(DEFAULT_RELATIVE_SOURCE_DIR, "ch/fhnw/thga/Completion.fr") + ); + createFregeSourceFile(completionFr, FREGE_COMPLETION_MODULE_CODE); + setupLocalFregeCompiler(testProjectDir); + + BuildResult result = runGradleTask(testProjectDir, COMPILE_FREGE_TASK_NAME); - 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(testProjectDir + .toPath() + .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.java") + .toFile() + .exists()); + assertTrue(testProjectDir + .toPath() + .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.class") + .toFile() + .exists()); + } - 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/classes/main/frege/ch/fhnw/thga/Completion.java") - .exists()); - assertTrue(new File( - testProjectDir.getAbsolutePath() - + "/build/classes/main/frege/ch/fhnw/thga/Completion.class") - .exists()); + @Test + void given_frege_code_and_many_compiler_flags( + @TempDir File testProjectDir + ) throws Exception + { + String buildConfigWithCompilerFlags = createFregeSection( + FREGE_BUILDER + .version("'3.25.84'") + .release("'3.25alpha'") + .compilerFlags("['-v', '-make', '-O', '-hints']") + .build() + ); + Project project = createFregeGradleProject( + testProjectDir, + buildConfigWithCompilerFlags + ); + Path completionFr = + testProjectDir + .toPath() + .resolve(Paths.get(DEFAULT_RELATIVE_SOURCE_DIR, "ch/fhnw/thga/Completion.fr") + ); + createFregeSourceFile(completionFr, FREGE_COMPLETION_MODULE_CODE); + setupLocalFregeCompiler(testProjectDir); + + BuildResult result = runGradleTask(testProjectDir, COMPILE_FREGE_TASK_NAME); + + assertTrue( + project + .getTasks() + .getByName(COMPILE_FREGE_TASK_NAME) + instanceof CompileFregeTask + ); + assertEquals( + SUCCESS, + result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome() + ); + assertTrue(testProjectDir + .toPath() + .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.java") + .toFile() + .exists()); + assertTrue(testProjectDir + .toPath() + .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.class") + .toFile() + .exists()); } - @Test + /*@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")); @@ -226,10 +197,11 @@ public class FregePluginFunctionalTest File completionFr = customMainSourceDir.resolve("Completion.fr").toFile(); writeToFile(completionFr, FREGE_COMPLETION_MODULE_CODE); String minimalBuildFileConfig = createFregeSection( - fregeBuilder.version("'3.25.84'").release("'3.25alpha'") + FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'") .mainSourceDir("layout.projectDirectory.dir('src/frege')") .outputDir("layout.buildDirectory.dir('frege')").build()); appendToFile(buildFile, minimalBuildFileConfig); + System.out.println(Files.readString(buildFile.toPath())); BuildResult result = runGradleTask(COMPILE_FREGE_TASK_NAME); @@ -247,9 +219,10 @@ public class FregePluginFunctionalTest void and_is_up_to_date_given_no_code_changes() throws Exception { String completionFr = "Completion.fr"; String minimalBuildFileConfig = createFregeSection( - fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); + FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'").build()); setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig); + System.out.println(Files.readString(buildFile.toPath())); BuildResult first = runGradleTask(COMPILE_FREGE_TASK_NAME); assertEquals(SUCCESS, first.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); @@ -261,7 +234,7 @@ public class FregePluginFunctionalTest void and_is_cached_given_cache_hit() throws Exception { String completionFr = "Completion.fr"; String minimalBuildFileConfig = createFregeSection( - fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); + FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'").build()); setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig); BuildResult first = runGradleTask(COMPILE_FREGE_TASK_NAME, "--build-cache"); @@ -273,6 +246,7 @@ public class FregePluginFunctionalTest NEW_LINE); setupDefaultFregeProjectStructure(codeChange, completionFr, ""); + System.out.println(Files.readString(buildFile.toPath())); BuildResult second = runGradleTask(COMPILE_FREGE_TASK_NAME, "--build-cache"); assertEquals(SUCCESS, second.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); @@ -291,10 +265,11 @@ public class FregePluginFunctionalTest "frob i = complete $ i + i", NEW_LINE); String minimalBuildFileConfig = createFregeSection( - fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); + FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'").build()); setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig); setupDefaultFregeProjectStructure(frobCode, frobFr, ""); + System.out.println(Files.readString(buildFile.toPath())); BuildResult result = runGradleTask(COMPILE_FREGE_TASK_NAME); assertTrue(project.getTasks().getByName(COMPILE_FREGE_TASK_NAME) instanceof CompileFregeTask); @@ -317,13 +292,12 @@ public class FregePluginFunctionalTest } @Nested - @TestInstance(Lifecycle.PER_CLASS) @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) class Compile_frege_task_fails { @Test void given_frege_code_and_illegal_compiler_flags() throws Exception { String completionFr = "Completion.fr"; - String buildConfigWithIllegalCompilerFlags = createFregeSection(fregeBuilder + String buildConfigWithIllegalCompilerFlags = createFregeSection(FREGE_BUILDER .version("'3.25.84'") .release("'3.25alpha'").compilerFlags("['-make', '-bla']").build()); setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, @@ -345,21 +319,23 @@ public class FregePluginFunctionalTest "frob i = complete $ i + i", NEW_LINE); String minimalBuildFileConfigWithoutMake = createFregeSection( - fregeBuilder.version("'3.25.84'").release("'3.25alpha'").compilerFlags("['-v']") + FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'").compilerFlags("['-v']") .build()); setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfigWithoutMake); setupDefaultFregeProjectStructure(frobCode, frobFr, ""); + + System.out.println("Build File: " + Files.readString(buildFile.toPath())); BuildResult result = runAndFailGradleTask(COMPILE_FREGE_TASK_NAME); + assertTrue(project.getTasks().getByName(COMPILE_FREGE_TASK_NAME) instanceof CompileFregeTask); assertEquals(FAILED, result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); } } @Nested - @TestInstance(Lifecycle.PER_CLASS) @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) class Run_frege_task_works { @Test @@ -368,7 +344,7 @@ public class FregePluginFunctionalTest " main = do", NEW_LINE, " println \"Frege rocks\"", NEW_LINE); String mainFr = "Main.fr"; String buildFileConfig = createFregeSection( - fregeBuilder.version("'3.25.84'").release("'3.25alpha'") + FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'") .mainModule("'ch.fhnw.thga.Main'").build()); setupDefaultFregeProjectStructure(fregeCode, mainFr, buildFileConfig); @@ -382,7 +358,7 @@ public class FregePluginFunctionalTest void given_frege_file_without_main_function() throws Exception { String completionFr = "Completion.fr"; String buildFileConfig = createFregeSection( - fregeBuilder.version("'3.25.84'").release("'3.25alpha'") + FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'") .mainModule("'ch.fhnw.thga.Completion'").build()); setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, buildFileConfig); @@ -398,7 +374,7 @@ public class FregePluginFunctionalTest " 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()); + FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'").build()); setupDefaultFregeProjectStructure(fregeCode, mainFr, buildFileConfig); BuildResult result = runGradleTask(RUN_FREGE_TASK_NAME, "--mainModule=ch.fhnw.thga.Main"); @@ -410,7 +386,6 @@ public class FregePluginFunctionalTest @Nested - @TestInstance(Lifecycle.PER_CLASS) @IndicativeSentencesGeneration( separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) @@ -421,7 +396,7 @@ public class FregePluginFunctionalTest { String completionFr = "Completion.fr"; String minimalReplModuleConfig = createFregeSection( - fregeBuilder + FREGE_BUILDER .version("'3.25.84'") .release("'3.25alpha'") .replSource(String.format("'ch.fhnw.thga.Completion'")) @@ -444,7 +419,6 @@ public class FregePluginFunctionalTest } @Nested - @TestInstance(Lifecycle.PER_CLASS) @IndicativeSentencesGeneration( separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) @@ -455,7 +429,7 @@ public class FregePluginFunctionalTest { String completionFr = "Completion.fr"; String minimalBuildFileConfig = createFregeSection( - fregeBuilder + FREGE_BUILDER .version("'3.25.84'") .release("'3.25alpha'") .build()); @@ -470,6 +444,6 @@ public class FregePluginFunctionalTest project.getTasks().getByName(REPL_FREGE_TASK_NAME) instanceof ReplFregeTask); assertEquals(FAILED, result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); - } + }*/ } } \ No newline at end of file diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java new file mode 100644 index 0000000..a0d46a4 --- /dev/null +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java @@ -0,0 +1,107 @@ +package ch.fhnw.thga.gradleplugins; + +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.GradleBuildFileConversionTest.createPluginsSection; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.stream.Stream; + +import org.gradle.api.Project; +import org.gradle.testfixtures.ProjectBuilder; +import org.gradle.testkit.runner.BuildResult; +import org.gradle.testkit.runner.GradleRunner; + +public class SharedFunctionalTestLogic +{ + + static String createFregeSection(FregeDTO fregeDTO) + { + return String.format( + "%s {%s %s%s}", + FREGE_EXTENSION_NAME, + System.lineSeparator(), + fregeDTO.toBuildFile(), + System.lineSeparator()); + } + + private static void writeFile( + File destination, + String content, + boolean append) + throws IOException + { + try (BufferedWriter output = new BufferedWriter(new FileWriter(destination, append))) + { + output.write(content); + } + + } + + static File writeToFile(File destination, String content) throws IOException + { + writeFile(destination, content, false); + return destination; + } + + static File appendToFile(File destination, String content) throws IOException + { + writeFile(destination, System.lineSeparator() + content, true); + return destination; + } + + static BuildResult runGradleTask(File testProjectDir, String... taskName) + { + return GradleRunner + .create() + .withProjectDir(testProjectDir) + .withPluginClasspath() + .withArguments(taskName) + .build(); + } + + static File createSettingsFile(File testProjectDir) throws IOException + { + File settingsFile = new File(testProjectDir, "settings.gradle"); + return writeToFile(settingsFile, "rootProject.name='frege-plugin'"); + } + + private static File createFregePluginBuildFile( + File testProjectDir) + throws IOException + { + File buildFile = new File(testProjectDir, "build.gradle"); + return writeToFile( + buildFile, + createPluginsSection(Stream.of(FREGE_PLUGIN_ID))); + } + + static File createFregeBuildFile( + File testProjectDir, + String fregeBuildFileConfig) + throws IOException + { + return appendToFile( + createFregePluginBuildFile( + testProjectDir), + fregeBuildFileConfig); + } + + static Project createFregeGradleProject( + File testProjectDir, + String fregeBuildFileConfig) + throws Exception + { + createSettingsFile(testProjectDir); + createFregeBuildFile(testProjectDir, fregeBuildFileConfig); + Project project = ProjectBuilder + .builder() + .withProjectDir(testProjectDir) + .build(); + project.getPluginManager().apply(FREGE_PLUGIN_ID); + return project; + } +} diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/Build.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/Build.java new file mode 100644 index 0000000..60fc835 --- /dev/null +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/Build.java @@ -0,0 +1,13 @@ +package ch.fhnw.thga.gradleplugins.fregeproject; + +import java.io.IOException; +import java.nio.file.Path; + +import org.gradle.api.Project; + +public interface Build +{ + Build fregeCompiler(Path fregeCompiler); + Build settingsFile(String settingsFile); + Project build() throws IOException; +} diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/BuildFile.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/BuildFile.java new file mode 100644 index 0000000..ea41350 --- /dev/null +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/BuildFile.java @@ -0,0 +1,7 @@ +package ch.fhnw.thga.gradleplugins.fregeproject; + +public interface BuildFile +{ + Build buildFile(String buildFile); + +} diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProject.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProject.java new file mode 100644 index 0000000..3f4373e --- /dev/null +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProject.java @@ -0,0 +1,26 @@ +package ch.fhnw.thga.gradleplugins.fregeproject; + +import java.io.File; +import java.util.List; + +public class FregeProject +{ + public final File settingsFile; + public final File buildFile; + public final File fregeCompiler; + public final List fregeSourceFiles; + + public FregeProject( + File settingsFile, + File buildFile, + File fregeCompiler, + List fregeSourceFiles + + ) + { + this.settingsFile = settingsFile; + this.buildFile = buildFile; + this.fregeCompiler = fregeCompiler; + this.fregeSourceFiles = fregeSourceFiles; + } +} diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java new file mode 100644 index 0000000..c90c8a8 --- /dev/null +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java @@ -0,0 +1,126 @@ +package ch.fhnw.thga.gradleplugins.fregeproject; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.stream.Stream; + +import org.gradle.api.Project; +import org.gradle.testfixtures.ProjectBuilder; + +import ch.fhnw.thga.gradleplugins.FregeDTO; +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.GradleBuildFileConversionTest.createPluginsSection; + +public final class FregeProjectBuilder implements ProjectRoot, BuildFile, Build +{ + private File projectRoot; + private String buildFile = createPluginsSection(Stream.of(FREGE_PLUGIN_ID)); + private Path fregeCompiler = Paths.get("src/functionalTest/resources/frege3.25.84.jar"); + private String settingsFile = "rootProject.name='frege-plugin'"; + + private static volatile FregeProjectBuilder instance; + + private static String createFregeSection(FregeDTO fregeDTO) + { + return String.format( + "%s {%s %s%s}", + FREGE_EXTENSION_NAME, + System.lineSeparator(), + fregeDTO.toBuildFile(), + System.lineSeparator()); + } + + private static void writeFile( + File destination, + String content, + boolean append) + throws IOException + { + try (BufferedWriter output = new BufferedWriter(new FileWriter(destination, append))) + { + output.write(content); + } + + } + + private static File writeToFile(File destination, String content) throws IOException + { + writeFile(destination, content, false); + return destination; + } + + private static File appendToFile(File destination, String content) throws IOException + { + writeFile(destination, System.lineSeparator() + content, true); + return destination; + } + + private FregeProjectBuilder() {} + + public static ProjectRoot getInstance() + { + FregeProjectBuilder result = instance; + if (result != null) return result; + synchronized (FregeProjectBuilder.class) + { + return instance == null ? new FregeProjectBuilder() + : instance; + } + } + + @Override + public Build fregeCompiler(Path fregeCompiler) + { + this.fregeCompiler = fregeCompiler; + return this; + } + + @Override + public Build settingsFile(String settingsFile) + { + this.settingsFile = String.join( + System.lineSeparator(), + this.settingsFile, + settingsFile + ); + return this; + } + + @Override + public Build buildFile(String buildFile) + { + this.buildFile = String.join( + System.lineSeparator(), + this.buildFile, + buildFile + ); + return this; + } + + @Override + public BuildFile projectRoot(File projectRoot) + { + this.projectRoot = projectRoot; + return this; + } + + @Override + public Project build() throws IOException { + File settingsGradle = new File(projectRoot, "settings.gradle"); + writeToFile(settingsGradle, settingsFile); + File buildGradle = new File(projectRoot, "build.gradle"); + writeToFile(buildGradle, buildFile); + Project project = ProjectBuilder + .builder() + .withProjectDir(projectRoot) + .build(); + project.getPluginManager().apply(FREGE_PLUGIN_ID); + return project; + } +} diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/ProjectRoot.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/ProjectRoot.java new file mode 100644 index 0000000..2b071ee --- /dev/null +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/ProjectRoot.java @@ -0,0 +1,9 @@ +package ch.fhnw.thga.gradleplugins.fregeproject; + +import java.io.File; + +public interface ProjectRoot +{ + BuildFile projectRoot(File projectRoot); + +} diff --git a/src/functionalTest/resources/frege3.25.84.jar b/src/functionalTest/resources/frege3.25.84.jar new file mode 100644 index 0000000..a0090fc Binary files /dev/null and b/src/functionalTest/resources/frege3.25.84.jar differ diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java index 6bfe72d..c4e17d3 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java @@ -6,6 +6,7 @@ import java.net.URL; import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.nio.channels.ReadableByteChannel; +import java.nio.file.Paths; import org.gradle.api.DefaultTask; import org.gradle.api.GradleException; @@ -36,32 +37,59 @@ public abstract class SetupFregeTask extends DefaultTask { public abstract DirectoryProperty getDownloadDir(); @Internal - public Provider getFregeVersionJarName() { + public Provider getFregeVersionJarName() + { return getVersion().map(version -> "frege" + version + ".jar"); } @Internal - final public Provider getDownloadUrl() { + final public Provider getDownloadUrl() + { return getFregeVersionJarName() - .map(name -> String.join("/", FREGE_GITHUB_URL_PREFIX, getRelease().get(), name)); + .map(name -> String.join("/", FREGE_GITHUB_URL_PREFIX, getRelease().get(), name)); } @OutputFile - public Provider getFregeCompilerOutputPath() { + public Provider getFregeCompilerOutputPath() + { return getDownloadDir().file(getFregeVersionJarName()); } @TaskAction public void downloadFregeCompiler() { - String fregeCompilerOutputPath = getFregeCompilerOutputPath().get().getAsFile().getAbsolutePath(); - try (ReadableByteChannel readChannel = Channels.newChannel(new URL(getDownloadUrl().get()).openStream()); - FileOutputStream fregeCompilerOutputStream = new FileOutputStream(fregeCompilerOutputPath);) { - FileChannel writeChannel = fregeCompilerOutputStream.getChannel(); - writeChannel.transferFrom(readChannel, 0, Long.MAX_VALUE); - LOGGER.lifecycle(String.format("Successfully downloaded %s to: %s", getFregeVersionJarName().get(), - fregeCompilerOutputPath)); - } catch (IOException e) { + String fregeCompilerOutputPath = getFregeCompilerOutputPath() + .get() + .getAsFile() + .getAbsolutePath(); + if (Paths + .get(fregeCompilerOutputPath) + .toFile() + .exists() + ) + return; + + try (ReadableByteChannel readChannel = Channels + .newChannel(new URL(getDownloadUrl().get()) + .openStream() + ); + FileOutputStream fregeCompilerOutputStream = new FileOutputStream( + fregeCompilerOutputPath)) + { + FileChannel writeChannel = fregeCompilerOutputStream.getChannel(); + writeChannel.transferFrom( + readChannel, + 0, + Long.MAX_VALUE); + LOGGER.lifecycle( + String.format( + "Successfully downloaded %s to: %s", + getFregeVersionJarName().get(), + fregeCompilerOutputPath + ) + ); + } catch (IOException e) + { throw new GradleException(e.getMessage()); } } -} +} \ No newline at end of file diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java b/src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java index 8512113..c1c920b 100644 --- a/src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java +++ b/src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java @@ -22,7 +22,7 @@ public class GradleBuildFileConversionTest { return String.format("id '%s'", pluginId); } - static String createPluginsSection(Stream pluginIds) { + public static String createPluginsSection(Stream pluginIds) { String plugins = pluginIds.map(pluginId -> buildFilePluginString(pluginId)).collect(Collectors.joining("\n ")); return String.format("plugins {\n %s\n}\n", plugins); } -- cgit From 0aa4dd065ee78f9acc88b39625cc4a9b47f6c944 Mon Sep 17 00:00:00 2001 From: Thibault Gagnaux Date: Wed, 9 Feb 2022 21:37:28 +0100 Subject: refactor: continues with staged builder refactoring --- build.gradle | 3 - .../CompileFregeTaskFunctionalTest.java | 188 +++++++++++++++++++++ .../DownloadFregeCompilerFunctionalTest.java | 101 ----------- .../gradleplugins/FregePluginFunctionalTest.java | 8 +- .../SetupFregeTaskFunctionalTest.java | 102 +++++++++++ .../thga/gradleplugins/fregeproject/Build.java | 6 +- .../fregeproject/FregeProjectBuilder.java | 109 ++++++++---- .../fregeproject/FregeSourceFile.java | 25 +++ .../ch/fhnw/thga/gradleplugins/FregeExtension.java | 10 +- .../fhnw/thga/gradleplugins/FregeDTOBuilder.java | 17 +- .../GradleBuildFileConversionTest.java | 2 +- 11 files changed, 411 insertions(+), 160 deletions(-) create mode 100644 src/functionalTest/java/ch/fhnw/thga/gradleplugins/CompileFregeTaskFunctionalTest.java delete mode 100644 src/functionalTest/java/ch/fhnw/thga/gradleplugins/DownloadFregeCompilerFunctionalTest.java create mode 100644 src/functionalTest/java/ch/fhnw/thga/gradleplugins/SetupFregeTaskFunctionalTest.java create mode 100644 src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeSourceFile.java (limited to 'src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java') diff --git a/build.gradle b/build.gradle index 665835c..fe6d9c0 100644 --- a/build.gradle +++ b/build.gradle @@ -84,7 +84,4 @@ tasks.withType(Test).configureEach includeEngines 'jqwik', 'junit-jupiter' maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1 } - filter { - includeTestsMatching "*FunctionalTest" - } } diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/CompileFregeTaskFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/CompileFregeTaskFunctionalTest.java new file mode 100644 index 0000000..a0512c0 --- /dev/null +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/CompileFregeTaskFunctionalTest.java @@ -0,0 +1,188 @@ +package ch.fhnw.thga.gradleplugins; + +import static ch.fhnw.thga.gradleplugins.FregePlugin.COMPILE_FREGE_TASK_NAME; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.createFregeSection; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.runGradleTask; +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.File; +import java.util.stream.Stream; + +import org.gradle.api.Project; +import org.gradle.testkit.runner.BuildResult; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.IndicativeSentencesGeneration; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import ch.fhnw.thga.gradleplugins.fregeproject.FregeProjectBuilder; +import ch.fhnw.thga.gradleplugins.fregeproject.FregeSourceFile; +import ch.fhnw.thga.gradleplugins.fregeproject.ProjectRoot; + +public class CompileFregeTaskFunctionalTest +{ + private static final String NEW_LINE = System.lineSeparator(); + private static final FregeSourceFile COMPLETION_FR = new FregeSourceFile( + "src/main/frege/ch/fhnw/thga/Completion.fr", + 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 + ) + ); + @Nested + @IndicativeSentencesGeneration( + separator = " -> ", + generator = DisplayNameGenerator.ReplaceUnderscores.class + ) + class Compile_frege_task_works { + + @Test + void given_frege_code_in_default_source_dir_and_minimal_build_file_config( + @TempDir File testProjectDir) + throws Exception + { + String minimalBuildFileConfig = createFregeSection( + FregeDTOBuilder + .builder() + .version("'3.25.84'") + .release("'3.25alpha'") + .build() + ); + + Project project = FregeProjectBuilder + .builder() + .projectRoot(testProjectDir) + .buildFile(minimalBuildFileConfig) + .fregeSourceFiles(() -> Stream.of(COMPLETION_FR)) + .build(); + + BuildResult result = runGradleTask(testProjectDir, COMPILE_FREGE_TASK_NAME); + + assertTrue( + project + .getTasks() + .getByName(COMPILE_FREGE_TASK_NAME) + instanceof CompileFregeTask + ); + assertEquals( + SUCCESS, + result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome() + ); + assertTrue(testProjectDir + .toPath() + .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.java") + .toFile() + .exists()); + assertTrue(testProjectDir + .toPath() + .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.class") + .toFile() + .exists()); + } + @Test + void given_frege_code_and_many_compiler_flags( + @TempDir File testProjectDir) + throws Exception + { + String buildConfigWithCompilerFlags = createFregeSection( + FregeDTOBuilder + .builder() + .version("'3.25.84'") + .release("'3.25alpha'") + .compilerFlags("['-v', '-make', '-O', '-hints']") + .build() + ); + Project project = FregeProjectBuilder + .builder() + .projectRoot(testProjectDir) + .buildFile(buildConfigWithCompilerFlags) + .fregeSourceFiles(() -> Stream.of(COMPLETION_FR)) + .build(); + + BuildResult result = runGradleTask(testProjectDir, COMPILE_FREGE_TASK_NAME); + + assertTrue( + project + .getTasks() + .getByName(COMPILE_FREGE_TASK_NAME) + instanceof CompileFregeTask + ); + assertEquals( + SUCCESS, + result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome() + ); + assertTrue(testProjectDir + .toPath() + .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.java") + .toFile() + .exists() + ); + assertTrue(testProjectDir + .toPath() + .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.class") + .toFile() + .exists() + ); + } + @Test + void given_frege_code_in_custom_source_and_output_dir_and_minimal_build_file_config( + @TempDir File testProjectDir + ) + throws Exception + { + String customSourceAndOutputBuildFileConfig = createFregeSection( + FregeDTOBuilder + .builder() + .version("'3.25.84'") + .release("'3.25alpha'") + .mainSourceDir("layout.projectDirectory.dir('src/frege')") + .outputDir("layout.buildDirectory.dir('frege')") + .build() + ); + Project project = FregeProjectBuilder + .builder() + .projectRoot(testProjectDir) + .buildFile(customSourceAndOutputBuildFileConfig) + .fregeSourceFiles(() -> Stream.of(new FregeSourceFile( + "src/frege/ch/fhnw/thga/Completion.fr", + COMPLETION_FR.getFregeSourceCode()))) + .build(); + + BuildResult result = runGradleTask(testProjectDir, COMPILE_FREGE_TASK_NAME); + System.out.println(result.getOutput()); + assertTrue( + project + .getTasks() + .getByName(COMPILE_FREGE_TASK_NAME) + instanceof CompileFregeTask + ); + assertEquals( + SUCCESS, + result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome() + ); + assertTrue(testProjectDir + .toPath() + .resolve("build/frege/ch/fhnw/thga/Completion.java") + .toFile() + .exists() + ); + assertTrue(testProjectDir + .toPath() + .resolve("build/frege/ch/fhnw/thga/Completion.class") + .toFile() + .exists() + ); + } + } +} diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/DownloadFregeCompilerFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/DownloadFregeCompilerFunctionalTest.java deleted file mode 100644 index 58f6222..0000000 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/DownloadFregeCompilerFunctionalTest.java +++ /dev/null @@ -1,101 +0,0 @@ -package ch.fhnw.thga.gradleplugins; - -import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_DOWNLOAD_DIRECTORY; -import static ch.fhnw.thga.gradleplugins.FregePlugin.SETUP_FREGE_TASK_NAME; -import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.createFregeGradleProject; -import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.createFregeSection; -import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.runGradleTask; -import static org.gradle.testkit.runner.TaskOutcome.SUCCESS; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.io.File; -import java.nio.file.Paths; - -import org.gradle.api.Project; -import org.gradle.testkit.runner.BuildResult; -import org.junit.jupiter.api.DisplayNameGenerator; -import org.junit.jupiter.api.IndicativeSentencesGeneration; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; - -import ch.fhnw.thga.gradleplugins.fregeproject.FregeProjectBuilder; -import ch.fhnw.thga.gradleplugins.fregeproject.ProjectRoot; - -class DownloadFregeCompilerFunctionalTest -{ - private static FregeDTOBuilder FREGE_BUILDER = FregeDTOBuilder.getInstance(); - private static ProjectRoot FREGE_PROJECT_BUILDER = FregeProjectBuilder.getInstance(); - - @Nested - @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) - class Setup_frege_task_works { - @Test - void given_minimal_build_file_config(@TempDir File testProjectDir) throws Exception - { - String minimalBuildFileConfig = createFregeSection( - FREGE_BUILDER - .version("'3.25.84'") - .release("'3.25alpha'") - .build() - ); - - Project project = FREGE_PROJECT_BUILDER - .projectRoot(testProjectDir) - .buildFile(minimalBuildFileConfig) - .build(); - - BuildResult result = runGradleTask(testProjectDir, 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")) - .toFile() - .exists() - ); - } - - @Test - void given_custom_frege_compiler_download_directory_in_build_file_config( - @TempDir File testProjectDir) - throws Exception - { - String buildFileConfigWithCustomDownloadDir = createFregeSection( - FREGE_BUILDER - .version("'3.25.84'") - .release("'3.25alpha'") - .compilerDownloadDir("layout.projectDirectory.dir('dist')") - .build() - ); - - Project project = FREGE_PROJECT_BUILDER - .projectRoot(testProjectDir) - .buildFile(buildFileConfigWithCustomDownloadDir) - .build(); - - BuildResult result = runGradleTask(testProjectDir, 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("dist", "frege3.25.84.jar")) - .toFile() - .exists() - ); - } - } -} \ No newline at end of file diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java index 4355b4a..9cd24c4 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java @@ -44,7 +44,7 @@ import org.junit.jupiter.api.io.TempDir; public class FregePluginFunctionalTest { private static final String NEW_LINE = System.lineSeparator(); - private static FregeDTOBuilder FREGE_BUILDER = FregeDTOBuilder.getInstance(); + private static FregeDTOBuilder FREGE_BUILDER = FregeDTOBuilder.builder(); private static final String FREGE_COMPLETION_MODULE_CODE = String.join ( @@ -97,7 +97,7 @@ public class FregePluginFunctionalTest ) class Compile_frege_task_works { - @Test + /*@Test void given_frege_code_in_default_source_dir_and_minimal_build_file_config( @TempDir File testProjectDir) throws Exception @@ -141,7 +141,7 @@ public class FregePluginFunctionalTest .exists()); } - @Test + @Test void given_frege_code_and_many_compiler_flags( @TempDir File testProjectDir ) throws Exception @@ -189,7 +189,7 @@ public class FregePluginFunctionalTest .exists()); } - /*@Test + @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")); diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SetupFregeTaskFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SetupFregeTaskFunctionalTest.java new file mode 100644 index 0000000..825c555 --- /dev/null +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SetupFregeTaskFunctionalTest.java @@ -0,0 +1,102 @@ +package ch.fhnw.thga.gradleplugins; + +import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_RELATIVE_COMPILER_DOWNLOAD_DIR; +import static ch.fhnw.thga.gradleplugins.FregePlugin.SETUP_FREGE_TASK_NAME; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.createFregeSection; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.runGradleTask; +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.File; +import java.nio.file.Paths; + +import org.gradle.api.Project; +import org.gradle.testkit.runner.BuildResult; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.IndicativeSentencesGeneration; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import ch.fhnw.thga.gradleplugins.fregeproject.FregeProjectBuilder; +import ch.fhnw.thga.gradleplugins.fregeproject.ProjectRoot; + +class SetupFregeTaskFunctionalTest +{ + private static FregeDTOBuilder FREGE_BUILDER = FregeDTOBuilder.builder(); + private static ProjectRoot FREGE_PROJECT_BUILDER = FregeProjectBuilder.builder(); + + @Nested + @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) + class Setup_frege_task_works { + @Test + void given_minimal_build_file_config(@TempDir File testProjectDir) throws Exception + { + String minimalBuildFileConfig = createFregeSection( + FREGE_BUILDER + .version("'3.25.84'") + .release("'3.25alpha'") + .build() + ); + + Project project = FREGE_PROJECT_BUILDER + .projectRoot(testProjectDir) + .buildFile(minimalBuildFileConfig) + .useLocalFregeCompiler(false) + .build(); + + BuildResult result = runGradleTask(testProjectDir, 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_RELATIVE_COMPILER_DOWNLOAD_DIR, "frege3.25.84.jar")) + .toFile() + .exists() + ); + } + + @Test + void given_custom_frege_compiler_download_directory_in_build_file_config( + @TempDir File testProjectDir) + throws Exception + { + String buildFileConfigWithCustomDownloadDir = createFregeSection( + FREGE_BUILDER + .version("'3.25.84'") + .release("'3.25alpha'") + .compilerDownloadDir("layout.projectDirectory.dir('dist')") + .build() + ); + + Project project = FREGE_PROJECT_BUILDER + .projectRoot(testProjectDir) + .buildFile(buildFileConfigWithCustomDownloadDir) + .useLocalFregeCompiler(false) + .build(); + + BuildResult result = runGradleTask(testProjectDir, 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("dist", "frege3.25.84.jar")) + .toFile() + .exists() + ); + } + } +} \ No newline at end of file diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/Build.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/Build.java index 60fc835..175ccaa 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/Build.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/Build.java @@ -1,13 +1,15 @@ package ch.fhnw.thga.gradleplugins.fregeproject; import java.io.IOException; -import java.nio.file.Path; +import java.util.function.Supplier; +import java.util.stream.Stream; import org.gradle.api.Project; public interface Build { - Build fregeCompiler(Path fregeCompiler); + Build useLocalFregeCompiler(boolean useLocalFregeCompiler); Build settingsFile(String settingsFile); + Build fregeSourceFiles(Supplier> fregeSourceFiles); Project build() throws IOException; } diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java index c90c8a8..bb87cdc 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java @@ -4,9 +4,11 @@ import java.io.BufferedWriter; 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.List; +import java.util.function.Supplier; import java.util.stream.Stream; import org.gradle.api.Project; @@ -16,25 +18,30 @@ import ch.fhnw.thga.gradleplugins.FregeDTO; 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.GradleBuildFileConversionTest.createPluginsSection; +import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_RELATIVE_COMPILER_DOWNLOAD_DIR; public final class FregeProjectBuilder implements ProjectRoot, BuildFile, Build { - private File projectRoot; - private String buildFile = createPluginsSection(Stream.of(FREGE_PLUGIN_ID)); - private Path fregeCompiler = Paths.get("src/functionalTest/resources/frege3.25.84.jar"); - private String settingsFile = "rootProject.name='frege-plugin'"; + private static final String LATEST_COMPILER_VERSION = "3.25.84"; + private static final Path LOCAL_COMPILER_PATH = + Paths.get(String.format( + "src/functionalTest/resources/frege%s.jar", + LATEST_COMPILER_VERSION) + ); - private static volatile FregeProjectBuilder instance; + private File projectRoot; + private String buildFile = createPluginsSection( + Stream.of(FREGE_PLUGIN_ID) + ); + private boolean useLocalFregeCompiler = true; + private String settingsFile = "rootProject.name='frege-plugin'"; + private Supplier> fregeSourceFiles = () -> Stream.empty(); - private static String createFregeSection(FregeDTO fregeDTO) + + public static ProjectRoot builder() { - return String.format( - "%s {%s %s%s}", - FREGE_EXTENSION_NAME, - System.lineSeparator(), - fregeDTO.toBuildFile(), - System.lineSeparator()); - } + return new FregeProjectBuilder(); + } private static void writeFile( File destination, @@ -54,30 +61,54 @@ public final class FregeProjectBuilder implements ProjectRoot, BuildFile, Build writeFile(destination, content, false); return destination; } + + private File writeToFile(FregeSourceFile fregeFile) + { + Path fregeFilePath = projectRoot.toPath().resolve(fregeFile.getFregeModulePath()); + try + { + Files.createDirectories( + fregeFilePath + .getParent() + ); + return writeToFile( + fregeFilePath.toFile(), + fregeFile.getFregeSourceCode() + ); + } catch (IOException e) + { + throw new RuntimeException(e.getMessage(), e.getCause()); + } + } private static File appendToFile(File destination, String content) throws IOException { writeFile(destination, System.lineSeparator() + content, true); return destination; - } + } + + private File setupLocalFregeCompilerInDefaultPath() throws IOException + { + Files.createDirectories( + projectRoot + .toPath() + .resolve(DEFAULT_RELATIVE_COMPILER_DOWNLOAD_DIR)); + return Files.copy( + LOCAL_COMPILER_PATH, + projectRoot + .toPath() + .resolve(DEFAULT_RELATIVE_COMPILER_DOWNLOAD_DIR) + .resolve(LOCAL_COMPILER_PATH.getFileName()) + ).toFile(); + } private FregeProjectBuilder() {} - public static ProjectRoot getInstance() - { - FregeProjectBuilder result = instance; - if (result != null) return result; - synchronized (FregeProjectBuilder.class) - { - return instance == null ? new FregeProjectBuilder() - : instance; - } - } @Override - public Build fregeCompiler(Path fregeCompiler) + public Build useLocalFregeCompiler(boolean useLocalFregeCompiler) { - this.fregeCompiler = fregeCompiler; + this.useLocalFregeCompiler = useLocalFregeCompiler; return this; } @@ -111,11 +142,27 @@ public final class FregeProjectBuilder implements ProjectRoot, BuildFile, Build } @Override - public Project build() throws IOException { - File settingsGradle = new File(projectRoot, "settings.gradle"); - writeToFile(settingsGradle, settingsFile); - File buildGradle = new File(projectRoot, "build.gradle"); - writeToFile(buildGradle, buildFile); + public Build fregeSourceFiles(Supplier> fregeSourceFiles) + { + this.fregeSourceFiles = fregeSourceFiles; + return this; + } + + private File createGradleFile(String filename, String content) throws IOException + { + return writeToFile( + new File(projectRoot, filename), + content + ); + } + + @Override + public Project build() throws IOException + { + createGradleFile("settings.gradle", settingsFile); + createGradleFile("build.gradle", buildFile); + if (useLocalFregeCompiler) setupLocalFregeCompilerInDefaultPath(); + fregeSourceFiles.get().map(this::writeToFile).findFirst(); Project project = ProjectBuilder .builder() .withProjectDir(projectRoot) diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeSourceFile.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeSourceFile.java new file mode 100644 index 0000000..d45e158 --- /dev/null +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeSourceFile.java @@ -0,0 +1,25 @@ +package ch.fhnw.thga.gradleplugins.fregeproject; + +import java.nio.file.Path; + +public class FregeSourceFile +{ + private final String modulePath; + private final String sourceCode; + + public FregeSourceFile(String modulePath, String sourceCode) + { + this.modulePath = modulePath; + this.sourceCode = sourceCode; + } + + public String getFregeModulePath() + { + return modulePath; + } + + public String getFregeSourceCode() + { + return sourceCode; + } +} diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java index 5bcbf3d..cfcd393 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java @@ -10,10 +10,10 @@ import org.gradle.api.provider.ListProperty; 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 static final String DEFAULT_RELATIVE_SOURCE_DIR = "src/main/frege"; - public static final List DEFAULT_COMPILER_FLAGS = List.of("-O", "-make"); + public static final String DEFAULT_RELATIVE_COMPILER_DOWNLOAD_DIR = "lib"; + public static final String DEFAULT_RELATIVE_OUTPUT_DIR = "classes/main/frege"; + public static final String DEFAULT_RELATIVE_SOURCE_DIR = "src/main/frege"; + public static final List DEFAULT_COMPILER_FLAGS = List.of("-O", "-make"); public abstract Property getVersion(); @@ -34,7 +34,7 @@ public abstract class FregeExtension { @Inject public FregeExtension(ProjectLayout projectLayout) { getCompilerDownloadDir() - .convention(projectLayout.getProjectDirectory().dir(DEFAULT_DOWNLOAD_DIRECTORY)); + .convention(projectLayout.getProjectDirectory().dir(DEFAULT_RELATIVE_COMPILER_DOWNLOAD_DIR)); getMainSourceDir() .convention(projectLayout.getProjectDirectory().dir(DEFAULT_RELATIVE_SOURCE_DIR)); diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java index cae01d5..d7fe9f1 100644 --- a/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java +++ b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java @@ -10,20 +10,11 @@ public final class FregeDTOBuilder implements Builder { private String compilerFlags = ""; private String replSource = ""; - private static volatile FregeDTOBuilder instance; + private FregeDTOBuilder() {} - private FregeDTOBuilder() { - } - - public static FregeDTOBuilder getInstance() { - FregeDTOBuilder result = instance; - if (result != null) { - return result; - } else { - synchronized (FregeDTOBuilder.class) { - return (instance == null) ? new FregeDTOBuilder() : instance; - } - } + public static FregeDTOBuilder builder() + { + return new FregeDTOBuilder(); } diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java b/src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java index c1c920b..cfc60bb 100644 --- a/src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java +++ b/src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java @@ -33,7 +33,7 @@ public class GradleBuildFileConversionTest { @BeforeEach void setup() { - fregeBuilder = FregeDTOBuilder.getInstance(); + fregeBuilder = FregeDTOBuilder.builder(); } @Nested -- cgit From 7ef464ab2c2a6a2e0b9ee857d6979ab98f1ec930 Mon Sep 17 00:00:00 2001 From: Thibault Gagnaux Date: Fri, 11 Feb 2022 13:58:28 +0100 Subject: refactor: finishes the compileFregeTask refactoring --- build.gradle | 12 +- .../CompileFregeTaskFunctionalTest.java | 344 ++++++++++++++++++--- .../gradleplugins/FregePluginFunctionalTest.java | 298 +----------------- .../gradleplugins/SharedFunctionalTestLogic.java | 14 +- .../fregeproject/FregeProjectBuilder.java | 9 +- .../fhnw/thga/gradleplugins/CompileFregeTask.java | 8 +- .../ch/fhnw/thga/gradleplugins/FregePlugin.java | 6 +- 7 files changed, 329 insertions(+), 362 deletions(-) (limited to 'src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java') diff --git a/build.gradle b/build.gradle index fe6d9c0..9baa197 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,6 @@ dependencies testImplementation group: junit5Group, name: 'junit-jupiter-api', version: junit5Version testImplementation group: 'net.jqwik', name: 'jqwik', version: '1.6.3' testRuntimeOnly group: junit5Group, name: 'junit-jupiter-engine', version: junit5Version - testRuntimeOnly group: 'org.junit.platform', name: 'junit-platform-console', version: junit5Version testImplementation(enforcedPlatform("org.junit:junit-bom:${junit5Version}")) } @@ -56,15 +55,6 @@ configurations functionalRuntimeOnly.extendsFrom runtimeOnly } -tasks.register('consoleLauncher', JavaExec) -{ - dependsOn testClasses - def reportsDir = layout.buildDirectory.dir('test-results') - mainClass = 'org.junit.platform.console.ConsoleLauncher' - outputs.dir reportsDir - classpath sourceSets.test.runtimeClasspath + sourceSets.functionalTest.runtimeClasspath - args '--scan-classpath', '--details', 'summary', '--reports-dir', reportsDir.get() -} tasks.register('functionalTest', Test) { @@ -75,7 +65,7 @@ tasks.register('functionalTest', Test) shouldRunAfter test } -check.dependsOn consoleLauncher +check.dependsOn functionalTest tasks.withType(Test).configureEach { diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/CompileFregeTaskFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/CompileFregeTaskFunctionalTest.java index a0512c0..42a3de2 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/CompileFregeTaskFunctionalTest.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/CompileFregeTaskFunctionalTest.java @@ -1,9 +1,14 @@ package ch.fhnw.thga.gradleplugins; +import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_RELATIVE_SOURCE_DIR; import static ch.fhnw.thga.gradleplugins.FregePlugin.COMPILE_FREGE_TASK_NAME; import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.createFregeSection; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.runAndFailGradleTask; import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.runGradleTask; +import static org.gradle.testkit.runner.TaskOutcome.FAILED; +import static org.gradle.testkit.runner.TaskOutcome.FROM_CACHE; import static org.gradle.testkit.runner.TaskOutcome.SUCCESS; +import static org.gradle.testkit.runner.TaskOutcome.UP_TO_DATE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -15,19 +20,19 @@ import org.gradle.testkit.runner.BuildResult; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.IndicativeSentencesGeneration; import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import ch.fhnw.thga.gradleplugins.fregeproject.FregeProjectBuilder; import ch.fhnw.thga.gradleplugins.fregeproject.FregeSourceFile; -import ch.fhnw.thga.gradleplugins.fregeproject.ProjectRoot; public class CompileFregeTaskFunctionalTest { private static final String NEW_LINE = System.lineSeparator(); private static final FregeSourceFile COMPLETION_FR = new FregeSourceFile( - "src/main/frege/ch/fhnw/thga/Completion.fr", + String.format("%s/%s", + DEFAULT_RELATIVE_SOURCE_DIR, + "ch/fhnw/thga/Completion.fr"), String.join ( NEW_LINE, @@ -40,6 +45,25 @@ public class CompileFregeTaskFunctionalTest NEW_LINE ) ); + private static final String MINIMAL_BUILD_FILE_CONFIG = createFregeSection( + FregeDTOBuilder + .builder() + .version("'3.25.84'") + .release("'3.25alpha'") + .build() + ); + + private static final boolean assertFileExists( + File testProjectDir, + String relativeFilePath) + { + return testProjectDir + .toPath() + .resolve(relativeFilePath) + .toFile() + .exists(); + } + @Nested @IndicativeSentencesGeneration( separator = " -> ", @@ -52,18 +76,10 @@ public class CompileFregeTaskFunctionalTest @TempDir File testProjectDir) throws Exception { - String minimalBuildFileConfig = createFregeSection( - FregeDTOBuilder - .builder() - .version("'3.25.84'") - .release("'3.25alpha'") - .build() - ); - Project project = FregeProjectBuilder .builder() .projectRoot(testProjectDir) - .buildFile(minimalBuildFileConfig) + .buildFile(MINIMAL_BUILD_FILE_CONFIG) .fregeSourceFiles(() -> Stream.of(COMPLETION_FR)) .build(); @@ -79,16 +95,14 @@ public class CompileFregeTaskFunctionalTest SUCCESS, result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome() ); - assertTrue(testProjectDir - .toPath() - .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.java") - .toFile() - .exists()); - assertTrue(testProjectDir - .toPath() - .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.class") - .toFile() - .exists()); + assertFileExists( + testProjectDir, + "build/classes/main/frege/ch/fhnw/thga/Completion.java" + ); + assertFileExists( + testProjectDir, + "build/classes/main/frege/ch/fhnw/thga/Completion.class" + ); } @Test void given_frege_code_and_many_compiler_flags( @@ -122,23 +136,18 @@ public class CompileFregeTaskFunctionalTest SUCCESS, result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome() ); - assertTrue(testProjectDir - .toPath() - .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.java") - .toFile() - .exists() + assertFileExists( + testProjectDir, + "build/classes/main/frege/ch/fhnw/thga/Completion.java" ); - assertTrue(testProjectDir - .toPath() - .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.class") - .toFile() - .exists() + assertFileExists( + testProjectDir, + "build/classes/main/frege/ch/fhnw/thga/Completion.class" ); } @Test void given_frege_code_in_custom_source_and_output_dir_and_minimal_build_file_config( - @TempDir File testProjectDir - ) + @TempDir File testProjectDir) throws Exception { String customSourceAndOutputBuildFileConfig = createFregeSection( @@ -160,7 +169,6 @@ public class CompileFregeTaskFunctionalTest .build(); BuildResult result = runGradleTask(testProjectDir, COMPILE_FREGE_TASK_NAME); - System.out.println(result.getOutput()); assertTrue( project .getTasks() @@ -171,18 +179,262 @@ public class CompileFregeTaskFunctionalTest SUCCESS, result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome() ); - assertTrue(testProjectDir - .toPath() - .resolve("build/frege/ch/fhnw/thga/Completion.java") - .toFile() - .exists() + assertFileExists( + testProjectDir, + "build/classes/main/frege/ch/fhnw/thga/Completion.java" + ); + assertFileExists( + testProjectDir, + "build/classes/main/frege/ch/fhnw/thga/Completion.class" + ); + } + @Test + void and_is_up_to_date_given_no_code_changes( + @TempDir File testProjectDir) + throws Exception + { + FregeProjectBuilder + .builder() + .projectRoot(testProjectDir) + .buildFile(MINIMAL_BUILD_FILE_CONFIG) + .fregeSourceFiles(() -> Stream.of(COMPLETION_FR)) + .build(); + + BuildResult first = runGradleTask(testProjectDir, COMPILE_FREGE_TASK_NAME); + + assertEquals( + SUCCESS, + first.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); + + BuildResult second = runGradleTask(testProjectDir, COMPILE_FREGE_TASK_NAME); + + assertEquals( + UP_TO_DATE, + second.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); + } + @Test + void and_is_cached_given_cache_hit( + @TempDir File testProjectDir) + throws Exception + { + FregeProjectBuilder + .builder() + .projectRoot(testProjectDir) + .buildFile(MINIMAL_BUILD_FILE_CONFIG) + .fregeSourceFiles(() -> Stream.of(COMPLETION_FR)) + .build(); + + BuildResult first = runGradleTask( + testProjectDir, + COMPILE_FREGE_TASK_NAME, + "--build-cache" ); - assertTrue(testProjectDir - .toPath() - .resolve("build/frege/ch/fhnw/thga/Completion.class") - .toFile() - .exists() + + assertEquals( + SUCCESS, + first.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome() + ); + + String codeChange = String.join( + NEW_LINE, + "module ch.fhnw.thga.Completion where", + NEW_LINE, + NEW_LINE, + " frob :: Int -> (Int, String)", + NEW_LINE, + " frob i = (i, \"Frege rocks\")", + NEW_LINE + ); + FregeProjectBuilder + .builder() + .projectRoot(testProjectDir) + .buildFile(MINIMAL_BUILD_FILE_CONFIG) + .fregeSourceFiles(() -> Stream.of(new FregeSourceFile( + COMPLETION_FR.getFregeModulePath(), + codeChange))) + .build(); + + BuildResult second = runGradleTask( + testProjectDir, + COMPILE_FREGE_TASK_NAME, + "--build-cache" + ); + + assertEquals( + SUCCESS, + second.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome() + ); + + FregeProjectBuilder + .builder() + .projectRoot(testProjectDir) + .buildFile(MINIMAL_BUILD_FILE_CONFIG) + .fregeSourceFiles(() -> Stream.of(COMPLETION_FR)) + .build(); + BuildResult third = runGradleTask( + testProjectDir, + COMPILE_FREGE_TASK_NAME, + "--build-cache" + ); + + assertEquals( + FROM_CACHE, + third.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); + } + @Test + void given_two_dependent_frege_files_in_default_source_dir_and_minimal_build_file_config( + @TempDir File testProjectDir) + throws Exception + { + String frobCode = String.join( + NEW_LINE, + "module ch.fhnw.thga.Frob where", + NEW_LINE, + NEW_LINE, + "import ch.fhnw.thga.Completion (complete)", + NEW_LINE, + "frob i = complete $ i + i", + NEW_LINE + ); + Project project = FregeProjectBuilder + .builder() + .projectRoot(testProjectDir) + .buildFile(MINIMAL_BUILD_FILE_CONFIG) + .fregeSourceFiles(() -> Stream.of(COMPLETION_FR, new FregeSourceFile( + String.format( + "%s/%s", + DEFAULT_RELATIVE_SOURCE_DIR, + "ch/fhnw/thga/Frob.fr" + ), + frobCode))) + .build(); + + BuildResult result = runGradleTask( + testProjectDir, + COMPILE_FREGE_TASK_NAME, + "--compileItem=ch.fhnw.thga.Frob" + ); + + assertTrue( + project + .getTasks() + .getByName(COMPILE_FREGE_TASK_NAME) + instanceof CompileFregeTask + ); + assertEquals( + SUCCESS, + result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome() + ); + assertFileExists( + testProjectDir, + "build/classes/main/frege/ch/fhnw/thga/Completion.java" + ); + assertFileExists( + testProjectDir, + "build/classes/main/frege/ch/fhnw/thga/Completion.class" + ); + assertFileExists( + testProjectDir, + "build/classes/main/frege/ch/fhnw/thga/Frob.java" + ); + assertFileExists( + testProjectDir, + "build/classes/main/frege/ch/fhnw/thga/Frob.class" + ); + } + } + @Nested + @IndicativeSentencesGeneration( + separator = " -> ", + generator = DisplayNameGenerator.ReplaceUnderscores.class + ) + class Compile_frege_task_fails + { + @Test + void given_frege_code_and_illegal_compiler_flags( + @TempDir File testProjectDir) + throws Exception + { + String buildConfigWithIllegalCompilerFlags = createFregeSection( + FregeDTOBuilder + .builder() + .version("'3.25.84'") + .release("'3.25alpha'") + .compilerFlags("['-make', '-bla']") + .build() + ); + Project project = FregeProjectBuilder + .builder() + .projectRoot(testProjectDir) + .buildFile(buildConfigWithIllegalCompilerFlags) + .fregeSourceFiles(() -> Stream.of(COMPLETION_FR)) + .build(); + + BuildResult result = runAndFailGradleTask(testProjectDir, COMPILE_FREGE_TASK_NAME); + + assertTrue( + project + .getTasks() + .getByName(COMPILE_FREGE_TASK_NAME) + instanceof CompileFregeTask + ); + assertEquals( + FAILED, + result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome() + ); + } + @Test + void given_two_dependent_frege_files_in_default_source_dir_and_without_make_compiler_flag( + @TempDir File testProjectDir) + throws Exception + { + String frobCode = String.join( + NEW_LINE, + "module ch.fhnw.thga.Frob where", + NEW_LINE, + NEW_LINE, + "import ch.fhnw.thga.Completion (complete)", + NEW_LINE, + "frob i = complete $ i + i", + NEW_LINE + ); + String minimalBuildFileConfigWithoutMake = createFregeSection( + FregeDTOBuilder + .builder() + .version("'3.25.84'") + .release("'3.25alpha'") + .compilerFlags("['-v']") + .build() + ); + Project project = FregeProjectBuilder + .builder() + .projectRoot(testProjectDir) + .buildFile(minimalBuildFileConfigWithoutMake) + .fregeSourceFiles(() -> Stream.of(COMPLETION_FR, new FregeSourceFile( + String.format( + "%s/%s", + DEFAULT_RELATIVE_SOURCE_DIR, + "ch/fhnw/thga/Frob.fr" + ), + frobCode))) + .build(); + + BuildResult result = runAndFailGradleTask( + testProjectDir, + COMPILE_FREGE_TASK_NAME, + "--compileItem=ch.fhnw.thga.Frob" + ); + + assertTrue( + project + .getTasks() + .getByName(COMPILE_FREGE_TASK_NAME) + instanceof CompileFregeTask + ); + assertEquals( + FAILED, + result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome() ); } - } + } } diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java index 9cd24c4..5159c92 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java @@ -43,299 +43,7 @@ import org.junit.jupiter.api.io.TempDir; public class FregePluginFunctionalTest { - private static final String NEW_LINE = System.lineSeparator(); - private static FregeDTOBuilder FREGE_BUILDER = FregeDTOBuilder.builder(); - private static final String FREGE_COMPLETION_MODULE_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 BuildResult runAndFailGradleTask(String taskName, String... args) { - return GradleRunner.create().withProjectDir(testProjectDir).withPluginClasspath() - .withArguments(taskName) - .buildAndFail(); - }*/ - - static File createFregeSourceFile( - Path fregeFilePath, - String fregeSourceCode) - throws IOException - { - Files.createDirectories( - fregeFilePath - .getParent() - ); - File fregeFile = fregeFilePath.toFile(); - writeToFile(fregeFile, fregeSourceCode); - return fregeFile; - } - - static File setupLocalFregeCompiler(File testProjectDir) throws IOException - { - Path fregeCompiler = Paths.get("src/functionalTest/resources/frege3.25.84.jar"); - Files.createDirectories(testProjectDir.toPath().resolve("lib")); - return Files.copy( - fregeCompiler, - testProjectDir.toPath().resolve("lib/frege3.25.84.jar") - ).toFile(); - } - - @Nested - @IndicativeSentencesGeneration( - separator = " -> ", - generator = DisplayNameGenerator.ReplaceUnderscores.class - ) - class Compile_frege_task_works { - - /*@Test - void given_frege_code_in_default_source_dir_and_minimal_build_file_config( - @TempDir File testProjectDir) - throws Exception - { - String minimalBuildFileConfig = createFregeSection( - FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'").build() - ); - Project project = createFregeGradleProject( - testProjectDir, - minimalBuildFileConfig - ); - Path completionFr = - testProjectDir - .toPath() - .resolve(Paths.get(DEFAULT_RELATIVE_SOURCE_DIR, "ch/fhnw/thga/Completion.fr") - ); - createFregeSourceFile(completionFr, FREGE_COMPLETION_MODULE_CODE); - setupLocalFregeCompiler(testProjectDir); - - BuildResult result = runGradleTask(testProjectDir, COMPILE_FREGE_TASK_NAME); - - assertTrue( - project - .getTasks() - .getByName(COMPILE_FREGE_TASK_NAME) - instanceof CompileFregeTask - ); - assertEquals( - SUCCESS, - result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome() - ); - assertTrue(testProjectDir - .toPath() - .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.java") - .toFile() - .exists()); - assertTrue(testProjectDir - .toPath() - .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.class") - .toFile() - .exists()); - } - - @Test - void given_frege_code_and_many_compiler_flags( - @TempDir File testProjectDir - ) throws Exception - { - String buildConfigWithCompilerFlags = createFregeSection( - FREGE_BUILDER - .version("'3.25.84'") - .release("'3.25alpha'") - .compilerFlags("['-v', '-make', '-O', '-hints']") - .build() - ); - Project project = createFregeGradleProject( - testProjectDir, - buildConfigWithCompilerFlags - ); - Path completionFr = - testProjectDir - .toPath() - .resolve(Paths.get(DEFAULT_RELATIVE_SOURCE_DIR, "ch/fhnw/thga/Completion.fr") - ); - createFregeSourceFile(completionFr, FREGE_COMPLETION_MODULE_CODE); - setupLocalFregeCompiler(testProjectDir); - - BuildResult result = runGradleTask(testProjectDir, COMPILE_FREGE_TASK_NAME); - - assertTrue( - project - .getTasks() - .getByName(COMPILE_FREGE_TASK_NAME) - instanceof CompileFregeTask - ); - assertEquals( - SUCCESS, - result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome() - ); - assertTrue(testProjectDir - .toPath() - .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.java") - .toFile() - .exists()); - assertTrue(testProjectDir - .toPath() - .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.class") - .toFile() - .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, FREGE_COMPLETION_MODULE_CODE); - String minimalBuildFileConfig = createFregeSection( - FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'") - .mainSourceDir("layout.projectDirectory.dir('src/frege')") - .outputDir("layout.buildDirectory.dir('frege')").build()); - appendToFile(buildFile, minimalBuildFileConfig); - System.out.println(Files.readString(buildFile.toPath())); - - 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()); - } - - @Test - void and_is_up_to_date_given_no_code_changes() throws Exception { - String completionFr = "Completion.fr"; - String minimalBuildFileConfig = createFregeSection( - FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'").build()); - setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig); - - System.out.println(Files.readString(buildFile.toPath())); - BuildResult first = runGradleTask(COMPILE_FREGE_TASK_NAME); - assertEquals(SUCCESS, first.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); - - BuildResult second = runGradleTask(COMPILE_FREGE_TASK_NAME); - assertEquals(UP_TO_DATE, second.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); - } - - @Test - void and_is_cached_given_cache_hit() throws Exception { - String completionFr = "Completion.fr"; - String minimalBuildFileConfig = createFregeSection( - FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'").build()); - setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig); - - BuildResult first = runGradleTask(COMPILE_FREGE_TASK_NAME, "--build-cache"); - assertEquals(SUCCESS, first.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); - - String codeChange = String.join(NEW_LINE, "module ch.fhnw.thga.Completion where", NEW_LINE, - NEW_LINE, - " frob :: Int -> (Int, String)", NEW_LINE, " frob i = (i, \"Frege rocks\")", - NEW_LINE); - setupDefaultFregeProjectStructure(codeChange, completionFr, ""); - - System.out.println(Files.readString(buildFile.toPath())); - BuildResult second = runGradleTask(COMPILE_FREGE_TASK_NAME, "--build-cache"); - assertEquals(SUCCESS, second.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); - - setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, ""); - BuildResult third = runGradleTask(COMPILE_FREGE_TASK_NAME, "--build-cache"); - assertEquals(FROM_CACHE, third.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); - } - - @Test - void given_two_dependent_frege_files_in_default_source_dir_and_minimal_build_file_config() - throws Exception { - String completionFr = "Completion.fr"; - String frobFr = "Frob.fr"; - String frobCode = String.join(NEW_LINE, "module ch.fhnw.thga.Frob where", NEW_LINE, NEW_LINE, - "import ch.fhnw.thga.Completion (complete)", NEW_LINE, - "frob i = complete $ i + i", NEW_LINE); - - String minimalBuildFileConfig = createFregeSection( - FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'").build()); - setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig); - setupDefaultFregeProjectStructure(frobCode, frobFr, ""); - - System.out.println(Files.readString(buildFile.toPath())); - 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/classes/main/frege/ch/fhnw/thga/Completion.java") - .exists()); - assertTrue(new File( - testProjectDir.getAbsolutePath() - + "/build/classes/main/frege/ch/fhnw/thga/Completion.class") - .exists()); - assertTrue(new File(testProjectDir.getAbsolutePath() - + "/build/classes/main/frege/ch/fhnw/thga/Frob.java") - .exists()); - assertTrue(new File(testProjectDir.getAbsolutePath() - + "/build/classes/main/frege/ch/fhnw/thga/Frob.class") - .exists()); - } - } - - @Nested - @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) - class Compile_frege_task_fails { - @Test - void given_frege_code_and_illegal_compiler_flags() throws Exception { - String completionFr = "Completion.fr"; - String buildConfigWithIllegalCompilerFlags = createFregeSection(FREGE_BUILDER - .version("'3.25.84'") - .release("'3.25alpha'").compilerFlags("['-make', '-bla']").build()); - setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, - buildConfigWithIllegalCompilerFlags); - - BuildResult result = runAndFailGradleTask(COMPILE_FREGE_TASK_NAME); - - assertTrue(project.getTasks().getByName(COMPILE_FREGE_TASK_NAME) instanceof CompileFregeTask); - assertEquals(FAILED, result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); - } - - @Test - void given_two_dependent_frege_files_in_default_source_dir_and_without_make_compiler_flag() - throws Exception { - String completionFr = "Completion.fr"; - String frobFr = "Frob.fr"; - String frobCode = String.join(NEW_LINE, "module ch.fhnw.thga.Frob where", NEW_LINE, NEW_LINE, - "import ch.fhnw.thga.Completion (complete)", NEW_LINE, - "frob i = complete $ i + i", NEW_LINE); - - String minimalBuildFileConfigWithoutMake = createFregeSection( - FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'").compilerFlags("['-v']") - .build()); - setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, - minimalBuildFileConfigWithoutMake); - setupDefaultFregeProjectStructure(frobCode, frobFr, ""); - - System.out.println("Build File: " + Files.readString(buildFile.toPath())); - - BuildResult result = runAndFailGradleTask(COMPILE_FREGE_TASK_NAME); - - - assertTrue(project.getTasks().getByName(COMPILE_FREGE_TASK_NAME) instanceof CompileFregeTask); - assertEquals(FAILED, result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); - } - } - - @Nested + /*@Nested @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) class Run_frege_task_works { @Test @@ -444,6 +152,6 @@ public class FregePluginFunctionalTest project.getTasks().getByName(REPL_FREGE_TASK_NAME) instanceof ReplFregeTask); assertEquals(FAILED, result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); - }*/ - } + } + }*/ } \ No newline at end of file diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java index a0d46a4..3b4ee49 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java @@ -53,15 +53,25 @@ public class SharedFunctionalTestLogic return destination; } - static BuildResult runGradleTask(File testProjectDir, String... taskName) + static BuildResult runGradleTask(File testProjectDir, String... args) { return GradleRunner .create() .withProjectDir(testProjectDir) .withPluginClasspath() - .withArguments(taskName) + .withArguments(args) .build(); } + + static BuildResult runAndFailGradleTask(File testProjectDir, String... args) + { + return GradleRunner + .create() + .withProjectDir(testProjectDir) + .withPluginClasspath() + .withArguments(args) + .buildAndFail(); + } static File createSettingsFile(File testProjectDir) throws IOException { diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java index bb87cdc..d2c6aeb 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java @@ -4,9 +4,11 @@ import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.nio.file.CopyOption; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; import java.util.List; import java.util.function.Supplier; import java.util.stream.Stream; @@ -98,8 +100,9 @@ public final class FregeProjectBuilder implements ProjectRoot, BuildFile, Build projectRoot .toPath() .resolve(DEFAULT_RELATIVE_COMPILER_DOWNLOAD_DIR) - .resolve(LOCAL_COMPILER_PATH.getFileName()) - ).toFile(); + .resolve(LOCAL_COMPILER_PATH.getFileName()), + StandardCopyOption.REPLACE_EXISTING) + .toFile(); } private FregeProjectBuilder() {} @@ -162,7 +165,7 @@ public final class FregeProjectBuilder implements ProjectRoot, BuildFile, Build createGradleFile("settings.gradle", settingsFile); createGradleFile("build.gradle", buildFile); if (useLocalFregeCompiler) setupLocalFregeCompilerInDefaultPath(); - fregeSourceFiles.get().map(this::writeToFile).findFirst(); + fregeSourceFiles.get().map(this::writeToFile).toArray(); Project project = ProjectBuilder .builder() .withProjectDir(projectRoot) diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java index c280607..a3c42d2 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java @@ -25,6 +25,7 @@ import org.gradle.api.tasks.OutputDirectory; import org.gradle.api.tasks.PathSensitive; import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.options.Option; @CacheableTask public abstract class CompileFregeTask extends DefaultTask { @@ -46,7 +47,10 @@ public abstract class CompileFregeTask extends DefaultTask { public abstract Property getFregeDependencies(); @Input - public abstract Property getFregeMainModuleName(); + @Option(option = "compileItem", + description = "The absolute path to the frege file or the module name" + ) + public abstract Property getFregeCompileItem(); @OutputDirectory public abstract DirectoryProperty getFregeOutputDir(); @@ -63,7 +67,7 @@ public abstract class CompileFregeTask extends DefaultTask { @Internal public final Provider> getCompileItems() { - return getFregeMainModuleName() + return getFregeCompileItem() .map(name -> { return name.isEmpty() ? getFregeSourceFiles().get() diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java index ce2ce01..957dc83 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java @@ -52,7 +52,7 @@ public class FregePlugin implements Plugin task.getFregeOutputDir().set(extension.getOutputDir()); task.getFregeCompilerFlags().set(extension.getCompilerFlags()); task.getFregeDependencies().set(implementation.getAsPath()); - task.getFregeMainModuleName().set(""); + task.getFregeCompileItem().set(""); } ); @@ -66,7 +66,7 @@ public class FregePlugin implements Plugin task.dependsOn(compileFregeTask.map( compileTask -> { - compileTask.getFregeMainModuleName().set(task.getMainModule()); + compileTask.getFregeCompileItem().set(task.getMainModule()); return compileTask; }) .get()); @@ -86,7 +86,7 @@ public class FregePlugin implements Plugin task.dependsOn(compileFregeTask.map( compileTask -> { - compileTask.getFregeMainModuleName().set(task.getReplSource()); + compileTask.getFregeCompileItem().set(task.getReplSource()); return compileTask; }) .get()); -- cgit From a4879784e7be87b5ee184b47eb8faba635019a5d Mon Sep 17 00:00:00 2001 From: Thibault Gagnaux Date: Wed, 23 Feb 2022 11:04:50 +0100 Subject: refactor: finishes the replFregeTask refactoring --- .gitignore | 3 +- .../CompileFregeTaskFunctionalTest.java | 26 +--- .../gradleplugins/FregePluginFunctionalTest.java | 157 --------------------- .../gradleplugins/ReplFregeTaskFunctionalTest.java | 102 +++++++++++++ .../gradleplugins/RunFregeTaskFunctionalTest.java | 10 +- .../gradleplugins/SharedFunctionalTestLogic.java | 27 ++++ .../fregeproject/FregeProjectBuilder.java | 18 +-- .../fregeproject/FregeSourceFile.java | 4 +- .../ch/fhnw/thga/gradleplugins/FregeExtension.java | 8 +- .../ch/fhnw/thga/gradleplugins/FregePlugin.java | 12 +- .../ch/fhnw/thga/gradleplugins/ReplFregeTask.java | 28 +++- .../fhnw/thga/gradleplugins/SharedTaskLogic.java | 8 +- .../java/ch/fhnw/thga/gradleplugins/Builder.java | 2 +- .../java/ch/fhnw/thga/gradleplugins/FregeDTO.java | 10 +- .../fhnw/thga/gradleplugins/FregeDTOBuilder.java | 8 +- .../thga/gradleplugins/SharedTaskLogicTest.java | 42 +++++- 16 files changed, 231 insertions(+), 234 deletions(-) delete mode 100644 src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java create mode 100644 src/functionalTest/java/ch/fhnw/thga/gradleplugins/ReplFregeTaskFunctionalTest.java (limited to 'src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java') diff --git a/.gitignore b/.gitignore index 151dd40..0292f5c 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ build .settings bin .DS_Store -lib \ No newline at end of file +lib +.jqwik-database \ No newline at end of file diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/CompileFregeTaskFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/CompileFregeTaskFunctionalTest.java index af3225d..31e6d05 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/CompileFregeTaskFunctionalTest.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/CompileFregeTaskFunctionalTest.java @@ -6,6 +6,8 @@ import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.createFregeSe import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.runAndFailGradleTask; import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.runGradleTask; import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.NEW_LINE; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.MINIMAL_BUILD_FILE_CONFIG; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.COMPLETION_FR; import static org.gradle.testkit.runner.TaskOutcome.FAILED; import static org.gradle.testkit.runner.TaskOutcome.FROM_CACHE; import static org.gradle.testkit.runner.TaskOutcome.SUCCESS; @@ -29,30 +31,6 @@ import ch.fhnw.thga.gradleplugins.fregeproject.FregeSourceFile; public class CompileFregeTaskFunctionalTest { - private static final FregeSourceFile COMPLETION_FR = new FregeSourceFile( - String.format("%s/%s", - DEFAULT_RELATIVE_SOURCE_DIR, - "ch/fhnw/thga/Completion.fr"), - 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 static final String MINIMAL_BUILD_FILE_CONFIG = createFregeSection( - FregeDTOBuilder - .builder() - .version("'3.25.84'") - .release("'3.25alpha'") - .build() - ); - private static final boolean assertFileExists( File testProjectDir, String relativeFilePath) diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java deleted file mode 100644 index 5159c92..0000000 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java +++ /dev/null @@ -1,157 +0,0 @@ -package ch.fhnw.thga.gradleplugins; - -import static ch.fhnw.thga.gradleplugins.FregePlugin.COMPILE_FREGE_TASK_NAME; -import static ch.fhnw.thga.gradleplugins.FregePlugin.SETUP_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.REPL_FREGE_TASK_NAME; -import static ch.fhnw.thga.gradleplugins.FregePlugin.RUN_FREGE_TASK_NAME; -import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_RELATIVE_SOURCE_DIR; -import static ch.fhnw.thga.gradleplugins.GradleBuildFileConversionTest.createPluginsSection; -import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.createFregeSection; -import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.writeToFile; -import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.createFregeGradleProject; -import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.runGradleTask; -import static org.gradle.testkit.runner.TaskOutcome.FAILED; -import static org.gradle.testkit.runner.TaskOutcome.FROM_CACHE; -import static org.gradle.testkit.runner.TaskOutcome.SUCCESS; -import static org.gradle.testkit.runner.TaskOutcome.UP_TO_DATE; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.io.BufferedWriter; -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.Collections; -import java.util.stream.Stream; - -import org.gradle.api.Project; -import org.gradle.testfixtures.ProjectBuilder; -import org.gradle.testkit.runner.BuildResult; -import org.gradle.testkit.runner.GradleRunner; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayNameGenerator; -import org.junit.jupiter.api.IndicativeSentencesGeneration; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; - -public class FregePluginFunctionalTest -{ - /*@Nested - @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) - class Run_frege_task_works { - @Test - 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"; - String buildFileConfig = createFregeSection( - FREGE_BUILDER.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); - 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 completionFr = "Completion.fr"; - String buildFileConfig = createFregeSection( - FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'") - .mainModule("'ch.fhnw.thga.Completion'").build()); - setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, buildFileConfig); - - 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")); - } - - @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( - FREGE_BUILDER.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")); - } - } - - - @Nested - @IndicativeSentencesGeneration( - separator = " -> ", - generator = DisplayNameGenerator.ReplaceUnderscores.class) - class Repl_frege_task_works - { - @Test - void given_minimal_build_file_config_with_replModule() throws Exception - { - String completionFr = "Completion.fr"; - String minimalReplModuleConfig = createFregeSection( - FREGE_BUILDER - .version("'3.25.84'") - .release("'3.25alpha'") - .replSource(String.format("'ch.fhnw.thga.Completion'")) - .build()); - setupDefaultFregeProjectStructure( - FREGE_COMPLETION_MODULE_CODE, - completionFr, - minimalReplModuleConfig); - - BuildResult result = runGradleTask(REPL_FREGE_TASK_NAME); - - assertTrue( - project.getTasks().getByName(REPL_FREGE_TASK_NAME) - instanceof ReplFregeTask); - assertEquals(SUCCESS, result.task(":" + REPL_FREGE_TASK_NAME).getOutcome()); - assertTrue(result.getOutput().contains("java -cp")); - assertTrue(result.getOutput().contains("frege3.25.84.jar")); - assertTrue(result.getOutput().contains("Completion.java")); - } - } - - @Nested - @IndicativeSentencesGeneration( - separator = " -> ", - generator = DisplayNameGenerator.ReplaceUnderscores.class) - class Repl_frege_task_fails - { - @Test - void given_minimal_build_file_config_without_repl_module() throws Exception - { - String completionFr = "Completion.fr"; - String minimalBuildFileConfig = createFregeSection( - FREGE_BUILDER - .version("'3.25.84'") - .release("'3.25alpha'") - .build()); - setupDefaultFregeProjectStructure( - FREGE_COMPLETION_MODULE_CODE, - completionFr, - minimalBuildFileConfig); - - BuildResult result = runAndFailGradleTask(REPL_FREGE_TASK_NAME); - - assertTrue( - project.getTasks().getByName(REPL_FREGE_TASK_NAME) - instanceof ReplFregeTask); - assertEquals(FAILED, result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); - } - }*/ -} \ No newline at end of file diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/ReplFregeTaskFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/ReplFregeTaskFunctionalTest.java new file mode 100644 index 0000000..979d1d4 --- /dev/null +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/ReplFregeTaskFunctionalTest.java @@ -0,0 +1,102 @@ +package ch.fhnw.thga.gradleplugins; + +import static ch.fhnw.thga.gradleplugins.FregePlugin.REPL_FREGE_TASK_NAME; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.COMPLETION_FR; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.MINIMAL_BUILD_FILE_CONFIG; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.createFregeSection; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.runAndFailGradleTask; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.runGradleTask; +import static org.gradle.testkit.runner.TaskOutcome.FAILED; +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS; +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 java.io.File; +import java.util.stream.Stream; + +import org.gradle.api.Project; +import org.gradle.testkit.runner.BuildResult; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.IndicativeSentencesGeneration; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import ch.fhnw.thga.gradleplugins.fregeproject.FregeProjectBuilder; + +public class ReplFregeTaskFunctionalTest +{ + @Nested + @IndicativeSentencesGeneration( + generator = DisplayNameGenerator.ReplaceUnderscores.class) + class Repl_frege_task_works + { + @Test + void given_minimal_build_file_config_with_repl_module( + @TempDir File testProjectDir) + throws Exception + { + String replModuleConfig = createFregeSection( + FregeDTOBuilder + .builder() + .version("'3.25.84'") + .release("'3.25alpha'") + .replModule("'ch.fhnw.thga.Completion'") + .build() + ); + Project project = FregeProjectBuilder + .builder() + .projectRoot(testProjectDir) + .buildFile(replModuleConfig) + .fregeSourceFiles(() -> Stream.of(COMPLETION_FR)) + .build(); + + BuildResult result = runGradleTask(testProjectDir, REPL_FREGE_TASK_NAME); + + assertTrue( + project + .getTasks() + .getByName(REPL_FREGE_TASK_NAME) + instanceof ReplFregeTask); + assertEquals( + SUCCESS, + result.task(":" + REPL_FREGE_TASK_NAME).getOutcome()); + assertTrue(result.getOutput().contains("java -cp")); + assertTrue(result.getOutput().contains("frege3.25.84.jar")); + assertFalse(result.getOutput().contains("Completion.class")); + } + } + + @Nested + @IndicativeSentencesGeneration( + generator = DisplayNameGenerator.ReplaceUnderscores.class) + class Repl_frege_task_fails + { + @Test + void given_minimal_build_file_config_without_repl_module( + @TempDir File testProjectDir) + throws Exception + { + Project project = FregeProjectBuilder + .builder() + .projectRoot(testProjectDir) + .buildFile(MINIMAL_BUILD_FILE_CONFIG) + .fregeSourceFiles(() -> Stream.of(COMPLETION_FR)) + .build(); + + BuildResult result = runAndFailGradleTask(testProjectDir, REPL_FREGE_TASK_NAME); + + assertTrue( + project + .getTasks() + .getByName(REPL_FREGE_TASK_NAME) + instanceof ReplFregeTask + ); + assertEquals( + FAILED, + result.task(":" + REPL_FREGE_TASK_NAME).getOutcome() + ); + } + } +} \ No newline at end of file diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/RunFregeTaskFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/RunFregeTaskFunctionalTest.java index c0c870a..c4d5bad 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/RunFregeTaskFunctionalTest.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/RunFregeTaskFunctionalTest.java @@ -6,6 +6,7 @@ import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.NEW_LINE; import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.createFregeSection; import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.runAndFailGradleTask; import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.runGradleTask; +import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.MINIMAL_BUILD_FILE_CONFIG; import static org.gradle.testkit.runner.TaskOutcome.FAILED; import static org.gradle.testkit.runner.TaskOutcome.SUCCESS; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -91,17 +92,10 @@ public class RunFregeTaskFunctionalTest @TempDir File testProjectDir) throws Exception { - String mainBuildConfig = createFregeSection( - FregeDTOBuilder - .builder() - .version("'3.25.84'") - .release("'3.25alpha'") - .build() - ); Project project = FregeProjectBuilder .builder() .projectRoot(testProjectDir) - .buildFile(mainBuildConfig) + .buildFile(MINIMAL_BUILD_FILE_CONFIG) .fregeSourceFiles(() -> Stream.of(MAIN_FR)) .build(); diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java index c98d7ac..51fa256 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java @@ -3,6 +3,7 @@ package ch.fhnw.thga.gradleplugins; 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.GradleBuildFileConversionTest.createPluginsSection; +import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_RELATIVE_SOURCE_DIR; import java.io.BufferedWriter; import java.io.File; @@ -15,9 +16,35 @@ import org.gradle.testfixtures.ProjectBuilder; import org.gradle.testkit.runner.BuildResult; import org.gradle.testkit.runner.GradleRunner; +import ch.fhnw.thga.gradleplugins.fregeproject.FregeSourceFile; + public class SharedFunctionalTestLogic { public static final String NEW_LINE = System.lineSeparator(); + public static final String MINIMAL_BUILD_FILE_CONFIG = createFregeSection( + FregeDTOBuilder + .builder() + .version("'3.25.84'") + .release("'3.25alpha'") + .build() + ); + public static final FregeSourceFile COMPLETION_FR = new FregeSourceFile( + String.format("%s/%s", + DEFAULT_RELATIVE_SOURCE_DIR, + "ch/fhnw/thga/Completion.fr"), + 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 + ) + ); + static String createFregeSection(FregeDTO fregeDTO) { return String.format( diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java index d2c6aeb..0cb0746 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java @@ -1,27 +1,23 @@ package ch.fhnw.thga.gradleplugins.fregeproject; +import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_RELATIVE_COMPILER_DOWNLOAD_DIR; +import static ch.fhnw.thga.gradleplugins.FregePlugin.FREGE_PLUGIN_ID; +import static ch.fhnw.thga.gradleplugins.GradleBuildFileConversionTest.createPluginsSection; + import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; -import java.nio.file.CopyOption; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; -import java.util.List; import java.util.function.Supplier; import java.util.stream.Stream; import org.gradle.api.Project; import org.gradle.testfixtures.ProjectBuilder; -import ch.fhnw.thga.gradleplugins.FregeDTO; -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.GradleBuildFileConversionTest.createPluginsSection; -import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_RELATIVE_COMPILER_DOWNLOAD_DIR; - public final class FregeProjectBuilder implements ProjectRoot, BuildFile, Build { private static final String LATEST_COMPILER_VERSION = "3.25.84"; @@ -82,12 +78,6 @@ public final class FregeProjectBuilder implements ProjectRoot, BuildFile, Build throw new RuntimeException(e.getMessage(), e.getCause()); } } - - private static File appendToFile(File destination, String content) throws IOException - { - writeFile(destination, System.lineSeparator() + content, true); - return destination; - } private File setupLocalFregeCompilerInDefaultPath() throws IOException { diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeSourceFile.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeSourceFile.java index c161dbd..858f6d4 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeSourceFile.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeSourceFile.java @@ -7,8 +7,8 @@ public class FregeSourceFile public FregeSourceFile(String modulePath, String sourceCode) { - this.modulePath = modulePath; - this.sourceCode = sourceCode; + this.modulePath = modulePath; + this.sourceCode = sourceCode; } public String getFregeModulePath() diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java index cfcd393..18a9500 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java @@ -9,7 +9,8 @@ import org.gradle.api.file.ProjectLayout; import org.gradle.api.provider.ListProperty; import org.gradle.api.provider.Property; -public abstract class FregeExtension { +public abstract class FregeExtension +{ public static final String DEFAULT_RELATIVE_COMPILER_DOWNLOAD_DIR = "lib"; public static final String DEFAULT_RELATIVE_OUTPUT_DIR = "classes/main/frege"; public static final String DEFAULT_RELATIVE_SOURCE_DIR = "src/main/frege"; @@ -29,10 +30,11 @@ public abstract class FregeExtension { public abstract ListProperty getCompilerFlags(); - public abstract Property getReplSource(); + public abstract Property getReplModule(); @Inject - public FregeExtension(ProjectLayout projectLayout) { + public FregeExtension(ProjectLayout projectLayout) + { getCompilerDownloadDir() .convention(projectLayout.getProjectDirectory().dir(DEFAULT_RELATIVE_COMPILER_DOWNLOAD_DIR)); diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java index 957dc83..9b725ac 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java @@ -68,8 +68,8 @@ public class FregePlugin implements Plugin { compileTask.getFregeCompileItem().set(task.getMainModule()); return compileTask; - }) - .get()); + } + )); task.getFregeCompilerJar().set( setupFregeCompilerTask.get().getFregeCompilerOutputPath()); task.getFregeOutputDir().set(extension.getOutputDir()); @@ -82,14 +82,14 @@ public class FregePlugin implements Plugin ReplFregeTask.class, task -> { - task.getReplSource().set(extension.getReplSource()); + task.getReplModule().set(extension.getReplModule()); task.dependsOn(compileFregeTask.map( compileTask -> { - compileTask.getFregeCompileItem().set(task.getReplSource()); + compileTask.getFregeCompileItem().set(task.getReplModule()); return compileTask; - }) - .get()); + } + )); task.getFregeCompilerJar().set( setupFregeCompilerTask.get().getFregeCompilerOutputPath()); task.getFregeOutputDir().set(extension.getOutputDir()); diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java index 7903d7e..67af55e 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java @@ -1,7 +1,9 @@ package ch.fhnw.thga.gradleplugins; +import static ch.fhnw.thga.gradleplugins.SharedTaskLogic.extractClassNameFromFregeModuleName; import org.gradle.api.DefaultTask; import org.gradle.api.file.DirectoryProperty; +import org.gradle.api.file.FileTree; import org.gradle.api.file.RegularFileProperty; import org.gradle.api.provider.Property; import org.gradle.api.provider.Provider; @@ -25,15 +27,29 @@ public abstract class ReplFregeTask extends DefaultTask { public abstract DirectoryProperty getFregeOutputDir(); @Input - @Option(option = "replSource", - description = "The filename which you want to load into the repl, e.g. 'myFregeFile.fr'") - public abstract Property getReplSource(); + @Option(option = "replModule", + description = "The full name of the module which you want to load into the repl, e.g. 'my.mod.Name'") + public abstract Property getReplModule(); @Internal public final Provider getReplClassName() { - return getReplSource() - .map(replSource -> replSource.substring(replSource.lastIndexOf("."))); + return getReplModule() + .map(replSource -> extractClassNameFromFregeModuleName(replSource)); + } + + @Internal + public final Provider getClasspathWithoutReplClassFile() + { + return getFregeOutputDir() + .map(outDir -> outDir.getAsFileTree()) + .map(tree -> tree.matching(pattern -> pattern.exclude("**/*.java"))) + .map(tree -> tree.matching(pattern -> pattern.exclude( + String.format( + "**/%s.class", + getReplClassName().get() + ) + ))); } @TaskAction @@ -45,7 +61,7 @@ public abstract class ReplFregeTask extends DefaultTask { getProject(), getFregeDependencies(), getFregeCompilerJar(), - getFregeOutputDir()) + getClasspathWithoutReplClassFile()) .get().getAsPath(), REPL_MAIN_CLASS)); } diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.java b/src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.java index 57af617..e6191a3 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.java @@ -5,7 +5,8 @@ import org.gradle.api.file.FileCollection; import org.gradle.api.provider.Provider; import org.gradle.api.provider.Property; -public final class SharedTaskLogic { +public final class SharedTaskLogic +{ private SharedTaskLogic() {}; public static final Provider setupClasspath( @@ -19,4 +20,9 @@ public final class SharedTaskLogic { : project.files(depsClasspath, paths); }); } + + public static final String extractClassNameFromFregeModuleName(String moduleName) + { + return moduleName.substring(moduleName.lastIndexOf(".") + 1); + } } diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/Builder.java b/src/test/java/ch/fhnw/thga/gradleplugins/Builder.java index df070a2..d379013 100644 --- a/src/test/java/ch/fhnw/thga/gradleplugins/Builder.java +++ b/src/test/java/ch/fhnw/thga/gradleplugins/Builder.java @@ -15,7 +15,7 @@ public interface Builder { Builder compilerFlags(String compilerFlags); - Builder replSource(String replSource); + Builder replModule(String replModule); 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 e092eac..bea1e81 100644 --- a/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTO.java +++ b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTO.java @@ -14,7 +14,7 @@ public class FregeDTO { public final String outputDir; public final String mainModule; public final String compilerFlags; - public final String replSource; + public final String replModule; public FregeDTO( String version, @@ -24,7 +24,7 @@ public class FregeDTO { String outputDir, String mainModule, String compilerFlags, - String replSource) { + String replModule) { this.version = version; this.release = release; this.compilerDownloadDir = compilerDownloadDir; @@ -32,7 +32,7 @@ public class FregeDTO { this.outputDir = outputDir; this.mainModule = mainModule; this.compilerFlags = compilerFlags; - this.replSource = replSource; + this.replModule = replModule; } public String getVersion() { @@ -63,8 +63,8 @@ public class FregeDTO { return compilerFlags; } - public String getReplSource() { - return replSource; + public String getReplModule() { + return replModule; } private String getFieldValue(Field field) { diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java index d7fe9f1..58e8396 100644 --- a/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java +++ b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java @@ -8,7 +8,7 @@ public final class FregeDTOBuilder implements Builder { private String outputDir = ""; private String mainModule = ""; private String compilerFlags = ""; - private String replSource = ""; + private String replModule = ""; private FregeDTOBuilder() {} @@ -65,9 +65,9 @@ public final class FregeDTOBuilder implements Builder { } @Override - public Builder replSource(String replSource) + public Builder replModule(String replModule) { - this.replSource = replSource; + this.replModule = replModule; return this; } @@ -80,6 +80,6 @@ public final class FregeDTOBuilder implements Builder { outputDir, mainModule, compilerFlags, - replSource); + replModule); } } diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/SharedTaskLogicTest.java b/src/test/java/ch/fhnw/thga/gradleplugins/SharedTaskLogicTest.java index 6f10d70..bb353a8 100644 --- a/src/test/java/ch/fhnw/thga/gradleplugins/SharedTaskLogicTest.java +++ b/src/test/java/ch/fhnw/thga/gradleplugins/SharedTaskLogicTest.java @@ -1,14 +1,52 @@ package ch.fhnw.thga.gradleplugins; -import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static ch.fhnw.thga.gradleplugins.SharedTaskLogic.extractClassNameFromFregeModuleName; + import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; +import net.jqwik.api.Example; +import net.jqwik.api.ForAll; +import net.jqwik.api.Property; + @TestInstance(Lifecycle.PER_CLASS) public class SharedTaskLogicTest { - @Test + @Example void given_valid_frege_module_name_then_can_extract_class_name() { + assertEquals( + extractClassNameFromFregeModuleName("ch.fhnw.thga.Completion"), + "Completion" + ); + } + + @Example + void given_empty_frege_module_name_then_returns_empty_string() + { + assertEquals( + extractClassNameFromFregeModuleName(""), + "" + ); + } + + @Example + void module_name_without_a_package_equals_class_name() + { + assertEquals( + extractClassNameFromFregeModuleName("Completion"), + "Completion" + ); + } + + @Property + void class_name_is_the_suffix_of_the_full_module_name( + @ForAll String aString) + { + String expectedFregeClassName = "Completion"; + assertEquals( + extractClassNameFromFregeModuleName(String.join(".", expectedFregeClassName)), + expectedFregeClassName); } } \ No newline at end of file -- cgit