aboutsummaryrefslogtreecommitdiff
path: root/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java')
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java118
1 files changed, 118 insertions, 0 deletions
diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java
new file mode 100644
index 0000000..6800f96
--- /dev/null
+++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java
@@ -0,0 +1,118 @@
+package ch.fhnw.thga.gradleplugins;
+
+import static ch.fhnw.thga.gradleplugins.FregeDTOTest.createPluginsSection;
+import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_DOWNLOAD_DIRECTORY;
+import static ch.fhnw.thga.gradleplugins.FregePlugin.COMPILE_FREGE_TASK_NAME;
+import static ch.fhnw.thga.gradleplugins.FregePlugin.FREGE_EXTENSION_NAME;
+import static ch.fhnw.thga.gradleplugins.FregePlugin.FREGE_PLUGIN_ID;
+import static ch.fhnw.thga.gradleplugins.FregePlugin.SETUP_FREGE_TASK_NAME;
+import static 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.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.file.Files;
+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.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+public class FregePluginFunctionalTest {
+
+ private final FregeDTOBuilder fregeBuilder = new FregeDTOBuilder();
+
+ @TempDir
+ File testProjectDir;
+ private File buildFile;
+ private File settingsFile;
+ private Project project;
+
+ private void writeFile(File destination, String content, boolean append) throws IOException {
+ BufferedWriter output = null;
+ try {
+ output = new BufferedWriter(new FileWriter(destination, append));
+ output.write(content);
+ } finally {
+ if (output != null) {
+ output.close();
+ }
+ }
+ }
+
+ private void writeToFile(File destination, String content) throws IOException {
+ writeFile(destination, content, false);
+ }
+
+ private void appendToFile(File destination, String content) throws IOException {
+ writeFile(destination, "\n" + content, true);
+ }
+
+ private static String createFregeSection(FregeDTO fregeDTO) {
+ return String.format("%s {\n %s\n}", FREGE_EXTENSION_NAME, fregeDTO.toBuildFile());
+ }
+
+ private void assertGradleTaskOutcome(String buildFileTaskConfig, String taskName) throws Exception {
+ appendToFile(buildFile, buildFileTaskConfig);
+ BuildResult result = GradleRunner.create().withProjectDir(testProjectDir).withPluginClasspath()
+ .withArguments(taskName).build();
+ System.out.println(result.getOutput());
+ assertEquals(SUCCESS, result.task(":" + taskName).getOutcome());
+ }
+
+ @BeforeEach
+ void setup() throws Exception {
+ buildFile = new File(testProjectDir, "build.gradle");
+ settingsFile = new File(testProjectDir, "settings.gradle");
+ writeToFile(buildFile, createPluginsSection(Stream.of(FREGE_PLUGIN_ID)));
+ writeToFile(settingsFile, "rootProject.name='frege-plugin'");
+ project = ProjectBuilder.builder().withProjectDir(testProjectDir).build();
+ project.getPluginManager().apply(FREGE_PLUGIN_ID);
+ }
+
+ @Test
+ void given_setup_frege_compiler_task_when_frege_version_and_frege_release_is_specified_then_frege_compiler_is_successfully_downloaded_to_default_directory()
+ throws Exception {
+ FregeDTO minimalFregeDTO = fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build();
+ assertTrue(project.getTasks().getByName(SETUP_FREGE_TASK_NAME) instanceof SetupFregeTask);
+ assertGradleTaskOutcome(createFregeSection(minimalFregeDTO), SETUP_FREGE_TASK_NAME);
+ assertTrue(testProjectDir.toPath().resolve(Paths.get(DEFAULT_DOWNLOAD_DIRECTORY, "frege3.25.84.jar")).toFile()
+ .exists());
+ }
+
+ @Test
+ void given_setup_frege_compiler_task_when_frege_version_and_frege_release_and_download_directory_is_specified_then_frege_compiler_is_successfully_downloaded_to_specified_directory()
+ throws Exception {
+ FregeDTO fregeDTO = fregeBuilder.version("'3.25.84'").release("'3.25alpha'")
+ .compilerDownloadDir("layout.projectDirectory.dir('dist')").build();
+ assertTrue(project.getTasks().getByName(SETUP_FREGE_TASK_NAME) instanceof SetupFregeTask);
+ assertGradleTaskOutcome(createFregeSection(fregeDTO), SETUP_FREGE_TASK_NAME);
+ assertTrue(testProjectDir.toPath().resolve(Paths.get("dist", "frege3.25.84.jar")).toFile().exists());
+ }
+
+ @Test
+ void frege_compile_task_is_correctly_executed() throws Exception {
+ String fregeCode = "module ch.fhnw.thga.Completion where\n\n" + "complete :: Int -> (Int, String)\n"
+ + "complete i = (i, \"Frege rocks\")\n";
+ Files.createDirectories(testProjectDir.toPath().resolve(Paths.get("src", "main", "frege")));
+ File completionFr = testProjectDir.toPath().resolve(Paths.get("src", "main", "frege", "Completion.fr"))
+ .toFile();
+ writeToFile(completionFr, fregeCode);
+ FregeDTO minimalFregeDTO = fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build();
+ assertTrue(project.getTasks().getByName(COMPILE_FREGE_TASK_NAME) instanceof CompileFregeTask);
+ assertGradleTaskOutcome(createFregeSection(minimalFregeDTO), COMPILE_FREGE_TASK_NAME);
+ 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());
+ }
+} \ No newline at end of file