aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/CompileFregeTaskFunctionalTest.java408
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java556
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/ReplFregeTaskFunctionalTest.java183
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/RunFregeTaskFunctionalTest.java179
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/SetupFregeTaskFunctionalTest.java104
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java172
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/Build.java15
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/BuildFile.java7
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProject.java26
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java166
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeSourceFile.java23
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/ProjectRoot.java9
-rw-r--r--src/functionalTest/resources/frege3.25.84.jarbin0 -> 8478454 bytes
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java71
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java18
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java34
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java84
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java54
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.java8
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java41
-rw-r--r--src/test/java/ch/fhnw/thga/gradleplugins/Builder.java2
-rw-r--r--src/test/java/ch/fhnw/thga/gradleplugins/FregeDTO.java10
-rw-r--r--src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java25
-rw-r--r--src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java4
-rw-r--r--src/test/java/ch/fhnw/thga/gradleplugins/SharedTaskLogicTest.java52
25 files changed, 1537 insertions, 714 deletions
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..90a459c
--- /dev/null
+++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/CompileFregeTaskFunctionalTest.java
@@ -0,0 +1,408 @@
+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 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 ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.assertFileExists;
+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.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;
+import ch.fhnw.thga.gradleplugins.fregeproject.FregeSourceFile;
+
+public class CompileFregeTaskFunctionalTest
+{
+ @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
+ {
+ Project project = FregeProjectBuilder
+ .builder()
+ .projectRoot(testProjectDir)
+ .buildFile(MINIMAL_BUILD_FILE_CONFIG)
+ .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()
+ );
+ 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(
+ @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()
+ );
+ 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_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);
+ assertTrue(
+ project
+ .getTasks()
+ .getByName(COMPILE_FREGE_TASK_NAME)
+ instanceof CompileFregeTask
+ );
+ assertEquals(
+ SUCCESS,
+ result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()
+ );
+ assertFileExists(
+ testProjectDir,
+ "build/frege/ch/fhnw/thga/Completion.java"
+ );
+ assertFileExists(
+ testProjectDir,
+ "build/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"
+ );
+
+ 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
deleted file mode 100644
index a7c2b35..0000000
--- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java
+++ /dev/null
@@ -1,556 +0,0 @@
-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;
-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.GradleBuildFileConversionTest.createPluginsSection;
-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.assertFalse;
-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.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.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;
-
-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);
-
- 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) {
- 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")));
- File fregeFile = testProjectDir.toPath().resolve(Paths.get("src", "main", "frege", fregeFileName))
- .toFile();
- writeToFile(fregeFile, fregeCode);
- appendToFile(buildFile, buildFileConfig);
- }
-
- @BeforeAll
- void beforeAll() throws Exception {
- settingsFile = new File(testProjectDir, "settings.gradle");
- 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();
- }
-
- @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());
- }
- }
-
- @Nested
- @TestInstance(Lifecycle.PER_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(SIMPLE_FREGE_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(SIMPLE_FREGE_CODE, completionFr,
- buildConfigWithCompilerFlags);
-
- 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_in_custom_source_dir_and_custom_output_dir_and_minimal_build_file_config()
- throws Exception {
- Path customMainSourceDir = testProjectDir.toPath().resolve(Paths.get("src", "frege"));
- Files.createDirectories(customMainSourceDir);
- File completionFr = customMainSourceDir.resolve("Completion.fr").toFile();
- writeToFile(completionFr, SIMPLE_FREGE_CODE);
- String minimalBuildFileConfig = createFregeSection(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'")
- .mainSourceDir("layout.projectDirectory.dir('src/frege')")
- .outputDir("layout.buildDirectory.dir('frege')").build());
- appendToFile(buildFile, minimalBuildFileConfig);
-
- BuildResult result = runGradleTask(COMPILE_FREGE_TASK_NAME);
-
- assertTrue(project.getTasks().getByName(COMPILE_FREGE_TASK_NAME) instanceof CompileFregeTask);
- assertEquals(SUCCESS, result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome());
- assertTrue(
- new File(testProjectDir.getAbsolutePath()
- + "/build/frege/ch/fhnw/thga/Completion.java").exists());
- assertTrue(
- new File(testProjectDir.getAbsolutePath()
- + "/build/frege/ch/fhnw/thga/Completion.class").exists());
- }
-
- @Test
- 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());
- setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, minimalBuildFileConfig);
-
- 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(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build());
- setupDefaultFregeProjectStructure(SIMPLE_FREGE_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, "");
-
- BuildResult second = runGradleTask(COMPILE_FREGE_TASK_NAME, "--build-cache");
- assertEquals(SUCCESS, second.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome());
-
- setupDefaultFregeProjectStructure(SIMPLE_FREGE_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(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build());
- setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, minimalBuildFileConfig);
- setupDefaultFregeProjectStructure(frobCode, frobFr, "");
-
- 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
- @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
- .version("'3.25.84'")
- .release("'3.25alpha'").compilerFlags("['-make', '-bla']").build());
- setupDefaultFregeProjectStructure(SIMPLE_FREGE_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(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'").compilerFlags("['-v']")
- .build());
- setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr,
- minimalBuildFileConfigWithoutMake);
- setupDefaultFregeProjectStructure(frobCode, frobFr, "");
-
- 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
- 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(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'")
- .mainModule("'ch.fhnw.thga.Main'").build());
- setupDefaultFregeProjectStructure(fregeCode, mainFr, buildFileConfig);
-
- BuildResult result = runGradleTask(RUN_FREGE_TASK_NAME);
- assertTrue(project.getTasks().getByName(RUN_FREGE_TASK_NAME) instanceof RunFregeTask);
- 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(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'")
- .mainModule("'ch.fhnw.thga.Completion'").build());
- setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, buildFileConfig);
-
- BuildResult result = runAndFailGradleTask(RUN_FREGE_TASK_NAME);
- assertTrue(project.getTasks().getByName(RUN_FREGE_TASK_NAME) instanceof RunFregeTask);
- assertEquals(FAILED, result.task(":" + RUN_FREGE_TASK_NAME).getOutcome());
- assertTrue(result.getOutput().contains("Main method not found"));
- }
-
- @Test
- void given_frege_file_with_main_function_and_main_module_command_line_option() throws Exception {
- String fregeCode = String.join(NEW_LINE, "module ch.fhnw.thga.Main where", NEW_LINE, NEW_LINE,
- " main = do", NEW_LINE, " println \"Frege rocks\"", NEW_LINE);
- String mainFr = "Main.fr";
- String buildFileConfig = createFregeSection(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build());
- setupDefaultFregeProjectStructure(fregeCode, mainFr, buildFileConfig);
-
- BuildResult result = runGradleTask(RUN_FREGE_TASK_NAME, "--mainModule=ch.fhnw.thga.Main");
- assertTrue(project.getTasks().getByName(RUN_FREGE_TASK_NAME) instanceof RunFregeTask);
- assertEquals(SUCCESS, result.task(":" + RUN_FREGE_TASK_NAME).getOutcome());
- assertTrue(result.getOutput().contains("Frege rocks"));
- }
- }
-
- @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)
- @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(
- fregeBuilder
- .version("'3.25.84'")
- .release("'3.25alpha'")
- .replSource(String.format("'%s'", completionFr))
- .build());
- setupDefaultFregeProjectStructure(
- SIMPLE_FREGE_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"));
- 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)
- @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(
- fregeBuilder
- .version("'3.25.84'")
- .release("'3.25alpha'")
- .build());
- setupDefaultFregeProjectStructure(
- SIMPLE_FREGE_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..652a3c2
--- /dev/null
+++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/ReplFregeTaskFunctionalTest.java
@@ -0,0 +1,183 @@
+package ch.fhnw.thga.gradleplugins;
+
+import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_RELATIVE_SOURCE_DIR;
+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.NEW_LINE;
+import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.assertFileDoesNotExist;
+import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.assertFileExists;
+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.assertTrue;
+
+import java.io.File;
+import java.nio.file.Paths;
+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;
+import ch.fhnw.thga.gradleplugins.fregeproject.FregeSourceFile;
+
+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"));
+ assertTrue(result.getOutput().contains(
+ Paths.get(COMPLETION_FR.getFregeModulePath()).normalize().toString())
+ );
+ assertFileDoesNotExist(
+ testProjectDir,
+ "build/classes/main/frege/ch/fhnw/thga/Completion.java"
+ );
+ assertFileDoesNotExist(
+ testProjectDir,
+ "build/classes/main/frege/ch/fhnw/thga/Completion.class"
+ );
+ }
+
+ @Test
+ void given_dependent_frege_files_with_command_line_repl_module_option(
+ @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
+ );
+ FregeSourceFile frob_FR = new FregeSourceFile(
+ String.format(
+ "%s/%s",
+ DEFAULT_RELATIVE_SOURCE_DIR,
+ "ch/fhnw/thga/Frob.fr"
+ ),
+ frobCode);
+ Project project = FregeProjectBuilder
+ .builder()
+ .projectRoot(testProjectDir)
+ .buildFile(MINIMAL_BUILD_FILE_CONFIG)
+ .fregeSourceFiles(() -> Stream.of(COMPLETION_FR, frob_FR))
+ .build();
+
+ BuildResult result = runGradleTask(
+ testProjectDir,
+ REPL_FREGE_TASK_NAME,
+ "--replModule=ch.fhnw.thga.Frob"
+ );
+
+ 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(
+ Paths.get(frob_FR.getFregeModulePath()).normalize().toString())
+ );
+ assertFileExists(
+ testProjectDir,
+ "build/classes/main/frege/ch/fhnw/thga/Completion.java"
+ );
+ assertFileExists(
+ testProjectDir,
+ "build/classes/main/frege/ch/fhnw/thga/Completion.class"
+ );
+ assertFileDoesNotExist(
+ testProjectDir,
+ "build/classes/main/frege/ch/fhnw/thga/Frob.java"
+ );
+ assertFileDoesNotExist(
+ testProjectDir,
+ "build/classes/main/frege/ch/fhnw/thga/Frob.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
new file mode 100644
index 0000000..c4d5bad
--- /dev/null
+++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/RunFregeTaskFunctionalTest.java
@@ -0,0 +1,179 @@
+package ch.fhnw.thga.gradleplugins;
+
+import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_RELATIVE_SOURCE_DIR;
+import static ch.fhnw.thga.gradleplugins.FregePlugin.RUN_FREGE_TASK_NAME;
+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;
+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;
+import ch.fhnw.thga.gradleplugins.fregeproject.FregeSourceFile;
+
+public class RunFregeTaskFunctionalTest
+{
+ private static final FregeSourceFile MAIN_FR = new FregeSourceFile(
+ String.format(
+ "%s/%s",
+ DEFAULT_RELATIVE_SOURCE_DIR,
+ "ch/fhnw/thga/Main.fr"
+ ),
+ String.join(
+ NEW_LINE,
+ "module ch.fhnw.thga.Main where",
+ NEW_LINE,
+ NEW_LINE,
+ " main = do",
+ NEW_LINE,
+ " println \"Frege rocks\"",
+ NEW_LINE
+ )
+ );
+ @Nested
+ @IndicativeSentencesGeneration(
+ separator = " -> ",
+ generator = DisplayNameGenerator.ReplaceUnderscores.class
+ )
+ class Run_frege_task_works
+ {
+ @Test
+ void given_frege_file_with_main_function_and_main_module_config(
+ @TempDir File testProjectDir)
+ throws Exception
+ {
+ String mainBuildConfig = createFregeSection(
+ FregeDTOBuilder
+ .builder()
+ .version("'3.25.84'")
+ .release("'3.25alpha'")
+ .mainModule("'ch.fhnw.thga.Main'")
+ .build()
+ );
+ Project project = FregeProjectBuilder
+ .builder()
+ .projectRoot(testProjectDir)
+ .buildFile(mainBuildConfig)
+ .fregeSourceFiles(() -> Stream.of(MAIN_FR))
+ .build();
+
+ BuildResult result = runGradleTask(testProjectDir, 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_with_main_function_and_main_module_command_line_option(
+ @TempDir File testProjectDir)
+ throws Exception
+ {
+ Project project = FregeProjectBuilder
+ .builder()
+ .projectRoot(testProjectDir)
+ .buildFile(MINIMAL_BUILD_FILE_CONFIG)
+ .fregeSourceFiles(() -> Stream.of(MAIN_FR))
+ .build();
+
+ BuildResult result = runGradleTask(
+ testProjectDir,
+ 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 Run_frege_task_fails
+ {
+ @Test
+ void given_frege_file_without_main_function(
+ @TempDir File testProjectDir)
+ throws Exception
+ {
+ String mainBuildConfig = createFregeSection(
+ FregeDTOBuilder
+ .builder()
+ .version("'3.25.84'")
+ .release("'3.25alpha'")
+ .mainModule("'ch.fhnw.thga.Main'")
+ .build()
+ );
+ Project project = FregeProjectBuilder
+ .builder()
+ .projectRoot(testProjectDir)
+ .buildFile(mainBuildConfig)
+ .fregeSourceFiles(() -> Stream.of(new FregeSourceFile(
+ String.format(
+ "%s/%s",
+ DEFAULT_RELATIVE_SOURCE_DIR,
+ "ch/fhnw/thga/Main.fr"
+ ),
+ String.join(
+ NEW_LINE,
+ "module ch.fhnw.thga.Main where",
+ NEW_LINE,
+ NEW_LINE,
+ " add a b = a + b",
+ NEW_LINE
+ )
+ )))
+ .build();
+
+ BuildResult result = runAndFailGradleTask(
+ testProjectDir,
+ 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"));
+ }
+ }
+}
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..6781764
--- /dev/null
+++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SetupFregeTaskFunctionalTest.java
@@ -0,0 +1,104 @@
+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.Tag;
+import org.junit.jupiter.api.io.TempDir;
+
+import ch.fhnw.thga.gradleplugins.fregeproject.FregeProjectBuilder;
+import ch.fhnw.thga.gradleplugins.fregeproject.ProjectRoot;
+
+@Tag("network")
+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/SharedFunctionalTestLogic.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java
new file mode 100644
index 0000000..f935b28
--- /dev/null
+++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java
@@ -0,0 +1,172 @@
+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 org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_RELATIVE_SOURCE_DIR;
+
+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;
+
+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
+ )
+ );
+
+ public static final boolean fileExists(
+ File testProjectDir,
+ String relativeFilePath)
+ {
+ return testProjectDir
+ .toPath()
+ .resolve(relativeFilePath)
+ .toFile()
+ .exists();
+ }
+
+ public static final void assertFileExists(
+ File testProjectDir,
+ String relativeFilePath)
+ {
+ assertTrue(fileExists(testProjectDir, relativeFilePath));
+ }
+
+
+ public static final void assertFileDoesNotExist(
+ File testProjectDir,
+ String relativeFilePath)
+ {
+ assertFalse(fileExists(testProjectDir, relativeFilePath));
+ }
+
+ 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... args)
+ {
+ return GradleRunner
+ .create()
+ .withProjectDir(testProjectDir)
+ .withPluginClasspath()
+ .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
+ {
+ 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..175ccaa
--- /dev/null
+++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/Build.java
@@ -0,0 +1,15 @@
+package ch.fhnw.thga.gradleplugins.fregeproject;
+
+import java.io.IOException;
+import java.util.function.Supplier;
+import java.util.stream.Stream;
+
+import org.gradle.api.Project;
+
+public interface Build
+{
+ Build useLocalFregeCompiler(boolean useLocalFregeCompiler);
+ Build settingsFile(String settingsFile);
+ Build fregeSourceFiles(Supplier<Stream<FregeSourceFile>> fregeSourceFiles);
+ 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<File> fregeSourceFiles;
+
+ public FregeProject(
+ File settingsFile,
+ File buildFile,
+ File fregeCompiler,
+ List<File> 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..0cb0746
--- /dev/null
+++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java
@@ -0,0 +1,166 @@
+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.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.function.Supplier;
+import java.util.stream.Stream;
+
+import org.gradle.api.Project;
+import org.gradle.testfixtures.ProjectBuilder;
+
+public final class FregeProjectBuilder implements ProjectRoot, BuildFile, Build
+{
+ 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 File projectRoot;
+ private String buildFile = createPluginsSection(
+ Stream.of(FREGE_PLUGIN_ID)
+ );
+ private boolean useLocalFregeCompiler = true;
+ private String settingsFile = "rootProject.name='frege-plugin'";
+ private Supplier<Stream<FregeSourceFile>> fregeSourceFiles = () -> Stream.empty();
+
+
+ public static ProjectRoot builder()
+ {
+ return new FregeProjectBuilder();
+ }
+
+ 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 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 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()),
+ StandardCopyOption.REPLACE_EXISTING)
+ .toFile();
+ }
+
+ private FregeProjectBuilder() {}
+
+
+ @Override
+ public Build useLocalFregeCompiler(boolean useLocalFregeCompiler)
+ {
+ this.useLocalFregeCompiler = useLocalFregeCompiler;
+ 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 Build fregeSourceFiles(Supplier<Stream<FregeSourceFile>> 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).toArray();
+ 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/FregeSourceFile.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeSourceFile.java
new file mode 100644
index 0000000..858f6d4
--- /dev/null
+++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeSourceFile.java
@@ -0,0 +1,23 @@
+package ch.fhnw.thga.gradleplugins.fregeproject;
+
+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/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
--- /dev/null
+++ b/src/functionalTest/resources/frege3.25.84.jar
Binary files differ
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java
index bc3c8f7..a39a07b 100644
--- a/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java
@@ -3,17 +3,15 @@ package ch.fhnw.thga.gradleplugins;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
-import java.util.function.BiFunction;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.inject.Inject;
import org.gradle.api.DefaultTask;
-import org.gradle.api.file.Directory;
import org.gradle.api.file.DirectoryProperty;
-import org.gradle.api.file.FileTree;
import org.gradle.api.file.RegularFileProperty;
+import org.gradle.api.logging.LogLevel;
import org.gradle.api.model.ObjectFactory;
import org.gradle.api.provider.ListProperty;
import org.gradle.api.provider.Property;
@@ -28,28 +26,12 @@ 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 {
- private final JavaExec javaExec;
- private static final String FREGE_FILES_GLOB_PATTERN = "**/*.fr";
- private static final BiFunction<String, Directory, FileTree>
- excludeReplSourceFile =
- (String replSource,
- Directory srcDir) ->
- {
- if (replSource.isEmpty()) return srcDir.getAsFileTree();
- return srcDir.getAsFileTree().matching(
- pattern ->
- {
- pattern.exclude(
- String.format(
- "**/%s",
- replSource)
- );
- }
- );
- };
+ private static final String FREGE_FILES_GLOB_PATTERN = "**/*.fr";
+ private JavaExec javaExec;
@InputFile
@PathSensitive(PathSensitivity.RELATIVE)
@@ -66,7 +48,10 @@ public abstract class CompileFregeTask extends DefaultTask {
public abstract Property<String> getFregeDependencies();
@Input
- public abstract Property<String> getReplSource();
+ @Option(option = "compileItem",
+ description = "The absolute path to the frege file or the module name"
+ )
+ public abstract Property<String> getFregeCompileItem();
@OutputDirectory
public abstract DirectoryProperty getFregeOutputDir();
@@ -82,15 +67,19 @@ public abstract class CompileFregeTask extends DefaultTask {
}
@Internal
- public final Provider<FileTree> getSourceFileTree() {
- return getReplSource().zip(
- getFregeMainSourceDir(),
- excludeReplSourceFile);
+ public final Provider<List<String>> getCompileItems() {
+ return getFregeCompileItem()
+ .map(name ->
+ {
+ return name.isEmpty() ? getFregeSourceFiles().get()
+ : List.of(name);
+ });
}
@Internal
- public final Provider<List<String>> getSourceFiles() {
- return getSourceFileTree()
+ public final Provider<List<String>> getFregeSourceFiles() {
+ return getFregeMainSourceDir()
+ .map(srcDir -> srcDir.getAsFileTree())
.map(tree -> tree.matching(pattern -> pattern.include(FREGE_FILES_GLOB_PATTERN)))
.map(tree -> tree.getFiles().stream()
.map(file -> file.getAbsolutePath())
@@ -111,26 +100,32 @@ public abstract class CompileFregeTask extends DefaultTask {
javaExec = objectFactory.newInstance(JavaExec.class);
}
- private List<String> buildCompilerArgsFromProperties(List<String> directoryArg)
+ private List<String> buildCompilerArgsFromProperties(List<String> targetDirectoryArg)
{
return Stream.of(
getDependencyArg().get(),
getFregeCompilerFlags().get(),
- directoryArg,
+ targetDirectoryArg,
getSourcePathArg().get(),
- getSourceFiles().get())
+ getCompileItems().get())
.filter(lists -> !lists.isEmpty())
.flatMap(Collection::stream)
.collect(Collectors.toList());
}
@TaskAction
- public void compileFrege() {
- List<String> directoryArg = List.of(
+ public void compileFrege()
+ {
+ this.getLogging().captureStandardOutput(LogLevel.LIFECYCLE);
+ List<String> targetDirectoryArg = List.of(
"-d",
- getFregeOutputDir().getAsFile().get().getAbsolutePath());
-
- javaExec.setClasspath(getProject().files(getFregeCompilerJar()))
- .setArgs(buildCompilerArgsFromProperties(directoryArg)).exec();
+ getFregeOutputDir().getAsFile().get().getAbsolutePath()
+ );
+ javaExec.setClasspath(
+ getProject()
+ .files(getFregeCompilerJar()))
+ .setErrorOutput(System.out)
+ .setArgs(buildCompilerArgsFromProperties(targetDirectoryArg))
+ .exec();
}
} \ No newline at end of file
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java
index 5bcbf3d..18a9500 100644
--- a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java
@@ -9,11 +9,12 @@ import org.gradle.api.file.ProjectLayout;
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<String> DEFAULT_COMPILER_FLAGS = List.of("-O", "-make");
+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";
+ public static final List<String> DEFAULT_COMPILER_FLAGS = List.of("-O", "-make");
public abstract Property<String> getVersion();
@@ -29,12 +30,13 @@ public abstract class FregeExtension {
public abstract ListProperty<String> getCompilerFlags();
- public abstract Property<String> getReplSource();
+ public abstract Property<String> getReplModule();
@Inject
- public FregeExtension(ProjectLayout projectLayout) {
+ 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/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java
index a318b81..e1f410a 100644
--- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java
@@ -5,8 +5,6 @@ import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.tasks.TaskProvider;
-import ch.fhnw.thga.gradleplugins.internal.DependencyFregeTask;
-
public class FregePlugin implements Plugin<Project>
{
public static final String SETUP_FREGE_TASK_NAME = "setupFrege";
@@ -54,7 +52,7 @@ public class FregePlugin implements Plugin<Project>
task.getFregeOutputDir().set(extension.getOutputDir());
task.getFregeCompilerFlags().set(extension.getCompilerFlags());
task.getFregeDependencies().set(implementation.getAsPath());
- task.getReplSource().set("");
+ task.getFregeCompileItem().set("");
}
);
@@ -63,28 +61,15 @@ public class FregePlugin implements Plugin<Project>
RunFregeTask.class,
task ->
{
- task.dependsOn(compileFregeTask);
- task.getFregeCompilerJar().set(
- setupFregeCompilerTask.get().getFregeCompilerOutputPath());
- task.getFregeOutputDir().set(extension.getOutputDir());
+
task.getMainModule().set(extension.getMainModule());
- task.getFregeDependencies().set(implementation.getAsPath());
- }
- );
-
- project.getTasks().register(
- DEPS_FREGE_TASK_NAME,
- DependencyFregeTask.class,
- task ->
- {
task.dependsOn(compileFregeTask.map(
compileTask ->
{
- compileTask.getReplSource().set(task.getReplSource());
+ compileTask.getFregeCompileItem().set(task.getMainModule());
return compileTask;
- })
- .get());
- task.dependsOn(compileFregeTask);
+ }
+ ));
task.getFregeCompilerJar().set(
setupFregeCompilerTask.get().getFregeCompilerOutputPath());
task.getFregeOutputDir().set(extension.getOutputDir());
@@ -97,18 +82,19 @@ public class FregePlugin implements Plugin<Project>
ReplFregeTask.class,
task ->
{
- task.getReplSource().set(extension.getReplSource());
+ task.getReplModule().set(extension.getReplModule());
task.dependsOn(compileFregeTask.map(
compileTask ->
{
- compileTask.getReplSource().set(task.getReplSource());
+ compileTask.getFregeCompileItem().set(task.getReplModule());
return compileTask;
- })
- .get());
+ }
+ ));
task.getFregeCompilerJar().set(
setupFregeCompilerTask.get().getFregeCompilerOutputPath());
task.getFregeOutputDir().set(extension.getOutputDir());
task.getFregeDependencies().set(implementation.getAsPath());
+ task.getFregeMainSourceDir().set(extension.getMainSourceDir());
}
);
}
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java
index dd18270..1a47f8f 100644
--- a/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java
@@ -1,16 +1,23 @@
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.logging.Logger;
+import org.gradle.api.logging.Logging;
import org.gradle.api.provider.Property;
+import org.gradle.api.provider.Provider;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.InputDirectory;
import org.gradle.api.tasks.InputFile;
+import org.gradle.api.tasks.Internal;
import org.gradle.api.tasks.TaskAction;
import org.gradle.api.tasks.options.Option;
public abstract class ReplFregeTask extends DefaultTask {
+ private static final Logger LOGGER = Logging.getLogger(ReplFregeTask.class);
public static final String REPL_MAIN_CLASS = "frege.repl.FregeRepl";
@InputFile
@@ -22,22 +29,83 @@ public abstract class ReplFregeTask extends DefaultTask {
@InputDirectory
public abstract DirectoryProperty getFregeOutputDir();
+ @InputDirectory
+ public abstract DirectoryProperty getFregeMainSourceDir();
+
@Input
- @Option(option = "replSource",
- description = "The filename which you want to load into the repl, e.g. 'myFregeFile.fr'")
- public abstract Property<String> 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<String> getReplModule();
+
+ @Internal
+ public final Provider<String> getReplClassName()
+ {
+ return getReplModule()
+ .map(replSource -> extractClassNameFromFregeModuleName(replSource));
+ }
+
+ @Internal
+ public final Provider<FileTree> getReplClassFiles()
+ {
+ return getFregeOutputDir()
+ .map(outDir -> outDir.getAsFileTree())
+ .map(tree -> tree.matching(
+ pattern -> pattern.include(
+ String.format(
+ "**/%s.class",
+ getReplClassName().get()
+ )
+ )
+ ));
+ }
+
+ @Internal
+ public final Provider<FileTree> getReplJavaFiles()
+ {
+ return getFregeOutputDir()
+ .map(outDir -> outDir.getAsFileTree())
+ .map(tree -> tree.matching(
+ pattern -> pattern.include(
+ String.format(
+ "**/%s.java",
+ getReplClassName().get()
+ )
+ ))
+ );
+ }
+
+ @Internal
+ public final Provider<FileTree> getReplFregeFile()
+ {
+ return getFregeMainSourceDir()
+ .map(outDir -> outDir.getAsFileTree())
+ .map(tree -> tree.matching(
+ pattern -> pattern.include(
+ String.format(
+ "**/%s.fr",
+ getReplClassName().get()
+ )
+ ))
+ );
+ }
@TaskAction
- public void printStartFregeReplCommand() {
- System.out.println("Execute the following command to start the Frege Repl:");
- System.out.println(String.format(
- "java -cp %s %s",
+ public void printStartFregeReplCommand()
+ {
+ getProject().delete(getReplJavaFiles());
+ getProject().delete(getReplClassFiles());
+ LOGGER.lifecycle(
+ "Execute the following command to start the Frege Repl and load the Frege module:");
+ LOGGER.quiet(String.format(
+ "(echo :l %s && cat) | java -cp %s %s",
+ getReplFregeFile().get().getAsPath(),
SharedTaskLogic.setupClasspath(
getProject(),
getFregeDependencies(),
getFregeCompilerJar(),
getFregeOutputDir())
.get().getAsPath(),
- REPL_MAIN_CLASS));
+ REPL_MAIN_CLASS)
+ );
}
}
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<String> getFregeVersionJarName() {
+ public Provider<String> getFregeVersionJarName()
+ {
return getVersion().map(version -> "frege" + version + ".jar");
}
@Internal
- final public Provider<String> getDownloadUrl() {
+ final public Provider<String> 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<RegularFile> getFregeCompilerOutputPath() {
+ public Provider<RegularFile> 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/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<FileCollection> 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/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java
deleted file mode 100644
index 87f4d2b..0000000
--- a/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package ch.fhnw.thga.gradleplugins.internal;
-
-import org.gradle.api.DefaultTask;
-import org.gradle.api.file.DirectoryProperty;
-import org.gradle.api.file.RegularFileProperty;
-import org.gradle.api.provider.Property;
-import org.gradle.api.tasks.Input;
-import org.gradle.api.tasks.InputDirectory;
-import org.gradle.api.tasks.InputFile;
-import org.gradle.api.tasks.TaskAction;
-import org.gradle.api.tasks.options.Option;
-
-import ch.fhnw.thga.gradleplugins.SharedTaskLogic;
-
-public abstract class DependencyFregeTask extends DefaultTask {
- @InputFile
- public abstract RegularFileProperty getFregeCompilerJar();
-
- @Input
- public abstract Property<String> getFregeDependencies();
-
- @InputDirectory
- 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<String> getReplSource();
-
-
- @TaskAction
- public void fregeDependencies() {
- System.out.println(
- SharedTaskLogic.setupClasspath(
- getProject(),
- getFregeDependencies(),
- getFregeCompilerJar(),
- getFregeOutputDir())
- .get().getAsPath());
- }
-}
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 cae01d5..58e8396 100644
--- a/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java
+++ b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java
@@ -8,22 +8,13 @@ public final class FregeDTOBuilder implements Builder {
private String outputDir = "";
private String mainModule = "";
private String compilerFlags = "";
- private String replSource = "";
+ private String replModule = "";
- 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();
}
@@ -74,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;
}
@@ -89,6 +80,6 @@ public final class FregeDTOBuilder implements Builder {
outputDir,
mainModule,
compilerFlags,
- replSource);
+ replModule);
}
}
diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java b/src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java
index 8512113..cfc60bb 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<String> pluginIds) {
+ public static String createPluginsSection(Stream<String> pluginIds) {
String plugins = pluginIds.map(pluginId -> buildFilePluginString(pluginId)).collect(Collectors.joining("\n "));
return String.format("plugins {\n %s\n}\n", plugins);
}
@@ -33,7 +33,7 @@ public class GradleBuildFileConversionTest {
@BeforeEach
void setup() {
- fregeBuilder = FregeDTOBuilder.getInstance();
+ fregeBuilder = FregeDTOBuilder.builder();
}
@Nested
diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/SharedTaskLogicTest.java b/src/test/java/ch/fhnw/thga/gradleplugins/SharedTaskLogicTest.java
new file mode 100644
index 0000000..bb353a8
--- /dev/null
+++ b/src/test/java/ch/fhnw/thga/gradleplugins/SharedTaskLogicTest.java
@@ -0,0 +1,52 @@
+package ch.fhnw.thga.gradleplugins;
+
+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
+{
+ @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