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());
- setupDefaul