aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/DownloadFregeCompilerFunctionalTest.java101
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java310
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java107
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/Build.java13
-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.java126
-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/SetupFregeTask.java54
-rw-r--r--src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java2
11 files changed, 573 insertions, 182 deletions
diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/DownloadFregeCompilerFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/DownloadFregeCompilerFunctionalTest.java
new file mode 100644
index 0000000..58f6222
--- /dev/null
+++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/DownloadFregeCompilerFunctionalTest.java
@@ -0,0 +1,101 @@
+package ch.fhnw.thga.gradleplugins;
+
+import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_DOWNLOAD_DIRECTORY;
+import static ch.fhnw.thga.gradleplugins.FregePlugin.SETUP_FREGE_TASK_NAME;
+import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.createFregeGradleProject;
+import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.createFregeSection;
+import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.runGradleTask;
+import static org.gradle.testkit.runner.TaskOutcome.SUCCESS;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.File;
+import java.nio.file.Paths;
+
+import org.gradle.api.Project;
+import org.gradle.testkit.runner.BuildResult;
+import org.junit.jupiter.api.DisplayNameGenerator;
+import org.junit.jupiter.api.IndicativeSentencesGeneration;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+import ch.fhnw.thga.gradleplugins.fregeproject.FregeProjectBuilder;
+import ch.fhnw.thga.gradleplugins.fregeproject.ProjectRoot;
+
+class DownloadFregeCompilerFunctionalTest
+{
+ private static FregeDTOBuilder FREGE_BUILDER = FregeDTOBuilder.getInstance();
+ private static ProjectRoot FREGE_PROJECT_BUILDER = FregeProjectBuilder.getInstance();
+
+ @Nested
+ @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class)
+ class Setup_frege_task_works {
+ @Test
+ void given_minimal_build_file_config(@TempDir File testProjectDir) throws Exception
+ {
+ String minimalBuildFileConfig = createFregeSection(
+ FREGE_BUILDER
+ .version("'3.25.84'")
+ .release("'3.25alpha'")
+ .build()
+ );
+
+ Project project = FREGE_PROJECT_BUILDER
+ .projectRoot(testProjectDir)
+ .buildFile(minimalBuildFileConfig)
+ .build();
+
+ BuildResult result = runGradleTask(testProjectDir, SETUP_FREGE_TASK_NAME);
+
+ assertTrue(
+ project
+ .getTasks()
+ .getByName(SETUP_FREGE_TASK_NAME) instanceof SetupFregeTask
+ );
+ assertEquals(SUCCESS, result.task(":" + SETUP_FREGE_TASK_NAME).getOutcome());
+ assertTrue(
+ testProjectDir
+ .toPath()
+ .resolve(Paths.get(DEFAULT_DOWNLOAD_DIRECTORY, "frege3.25.84.jar"))
+ .toFile()
+ .exists()
+ );
+ }
+
+ @Test
+ void given_custom_frege_compiler_download_directory_in_build_file_config(
+ @TempDir File testProjectDir)
+ throws Exception
+ {
+ String buildFileConfigWithCustomDownloadDir = createFregeSection(
+ FREGE_BUILDER
+ .version("'3.25.84'")
+ .release("'3.25alpha'")
+ .compilerDownloadDir("layout.projectDirectory.dir('dist')")
+ .build()
+ );
+
+ Project project = FREGE_PROJECT_BUILDER
+ .projectRoot(testProjectDir)
+ .buildFile(buildFileConfigWithCustomDownloadDir)
+ .build();
+
+ BuildResult result = runGradleTask(testProjectDir, SETUP_FREGE_TASK_NAME);
+
+ assertTrue(
+ project
+ .getTasks()
+ .getByName(SETUP_FREGE_TASK_NAME) instanceof SetupFregeTask
+ );
+ assertEquals(SUCCESS, result.task(":" + SETUP_FREGE_TASK_NAME).getOutcome());
+ assertTrue(
+ testProjectDir
+ .toPath()
+ .resolve(Paths.get("dist", "frege3.25.84.jar"))
+ .toFile()
+ .exists()
+ );
+ }
+ }
+} \ No newline at end of file
diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java
index ce384cb..4355b4a 100644
--- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java
+++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java
@@ -1,13 +1,17 @@
package ch.fhnw.thga.gradleplugins;
-import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_DOWNLOAD_DIRECTORY;
import static ch.fhnw.thga.gradleplugins.FregePlugin.COMPILE_FREGE_TASK_NAME;
+import static ch.fhnw.thga.gradleplugins.FregePlugin.SETUP_FREGE_TASK_NAME;
import static ch.fhnw.thga.gradleplugins.FregePlugin.FREGE_EXTENSION_NAME;
import static ch.fhnw.thga.gradleplugins.FregePlugin.FREGE_PLUGIN_ID;
import static ch.fhnw.thga.gradleplugins.FregePlugin.REPL_FREGE_TASK_NAME;
import static ch.fhnw.thga.gradleplugins.FregePlugin.RUN_FREGE_TASK_NAME;
-import static ch.fhnw.thga.gradleplugins.FregePlugin.SETUP_FREGE_TASK_NAME;
+import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_RELATIVE_SOURCE_DIR;
import static ch.fhnw.thga.gradleplugins.GradleBuildFileConversionTest.createPluginsSection;
+import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.createFregeSection;
+import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.writeToFile;
+import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.createFregeGradleProject;
+import static ch.fhnw.thga.gradleplugins.SharedFunctionalTestLogic.runGradleTask;
import static org.gradle.testkit.runner.TaskOutcome.FAILED;
import static org.gradle.testkit.runner.TaskOutcome.FROM_CACHE;
import static org.gradle.testkit.runner.TaskOutcome.SUCCESS;
@@ -22,6 +26,7 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.util.Collections;
import java.util.stream.Stream;
import org.gradle.api.Project;
@@ -29,20 +34,17 @@ import org.gradle.testfixtures.ProjectBuilder;
import org.gradle.testkit.runner.BuildResult;
import org.gradle.testkit.runner.GradleRunner;
import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.IndicativeSentencesGeneration;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.TestInstance;
-import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.junit.jupiter.api.io.TempDir;
-@TestInstance(Lifecycle.PER_CLASS)
public class FregePluginFunctionalTest
{
private static final String NEW_LINE = System.lineSeparator();
+ private static FregeDTOBuilder FREGE_BUILDER = FregeDTOBuilder.getInstance();
private static final String FREGE_COMPLETION_MODULE_CODE =
String.join
(
@@ -56,169 +58,138 @@ public class FregePluginFunctionalTest
NEW_LINE
);
- private static FregeDTOBuilder fregeBuilder;
-
- @TempDir
- File testProjectDir;
- private File buildFile;
- private File settingsFile;
- private Project project;
-
- private void writeFile(File destination, String content, boolean append) throws IOException {
- try (BufferedWriter output = new BufferedWriter(new FileWriter(destination, append))) {
- output.write(content);
- }
- }
-
- private void writeToFile(File destination, String content) throws IOException {
- writeFile(destination, content, false);
- }
-
- private void appendToFile(File destination, String content) throws IOException {
- writeFile(destination, System.lineSeparator() + content, true);
- }
-
- private static String createFregeSection(FregeDTO fregeDTO) {
- return String.format(
- "%s {%s %s%s}",
- FREGE_EXTENSION_NAME,
- System.lineSeparator(),
- fregeDTO.toBuildFile(),
- System.lineSeparator());
- }
- private BuildResult runGradleTask(String... taskName) {
- return GradleRunner.create().withProjectDir(testProjectDir).withPluginClasspath()
- .withArguments(taskName)
- .build();
- }
- private BuildResult runAndFailGradleTask(String taskName, String... args) {
+ /*private BuildResult runAndFailGradleTask(String taskName, String... args) {
return GradleRunner.create().withProjectDir(testProjectDir).withPluginClasspath()
.withArguments(taskName)
.buildAndFail();
- }
+ }*/
- private void setupDefaultFregeProjectStructure(String fregeCode, String fregeFileName, String buildFileConfig)
- throws Exception {
- Files.createDirectories(testProjectDir.toPath().resolve(Paths.get(
- "src", "main", "frege", "ch", "fhnw", "thga"
- )));
- File fregeFile = testProjectDir.toPath().resolve(Paths.get(
- "src", "main", "frege", "ch", "fhnw", "thga", fregeFileName
- )).toFile();
- writeToFile(fregeFile, fregeCode);
- appendToFile(buildFile, buildFileConfig);
- }
-
- @BeforeAll
- void beforeAll() throws Exception {
- settingsFile = new File(testProjectDir, "settings.gradle");
- writeToFile(settingsFile, "rootProject.name='frege-plugin'");
- project = ProjectBuilder.builder().withProjectDir(testProjectDir).build();
- project.getPluginManager().apply(FREGE_PLUGIN_ID);
-
- }
-
- @BeforeEach
- void setup() throws Exception {
- buildFile = new File(testProjectDir, "build.gradle");
- writeToFile(buildFile, createPluginsSection(Stream.of(FREGE_PLUGIN_ID)));
- fregeBuilder = FregeDTOBuilder.getInstance();
- }
-
- @AfterEach
- void cleanup() {
- testProjectDir.delete();
+ static File createFregeSourceFile(
+ Path fregeFilePath,
+ String fregeSourceCode)
+ throws IOException
+ {
+ Files.createDirectories(
+ fregeFilePath
+ .getParent()
+ );
+ File fregeFile = fregeFilePath.toFile();
+ writeToFile(fregeFile, fregeSourceCode);
+ return fregeFile;
}
- @Nested
- @TestInstance(Lifecycle.PER_CLASS)
- @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class)
- class Setup_frege_task_works {
-
- @Test
- void given_minimal_build_file_config() throws Exception {
- String minimalBuildFileConfig = createFregeSection(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build());
- appendToFile(buildFile, minimalBuildFileConfig);
-
- BuildResult result = runGradleTask(SETUP_FREGE_TASK_NAME);
-
- assertTrue(project.getTasks().getByName(SETUP_FREGE_TASK_NAME) instanceof SetupFregeTask);
- assertEquals(SUCCESS, result.task(":" + SETUP_FREGE_TASK_NAME).getOutcome());
- assertTrue(testProjectDir.toPath()
- .resolve(Paths.get(DEFAULT_DOWNLOAD_DIRECTORY, "frege3.25.84.jar"))
- .toFile().exists());
- }
-
- @Test
- void given_custom_frege_compiler_download_directory_in_build_file_config() throws Exception {
- String buildFileConfigWithCustomDownloadDir = createFregeSection(fregeBuilder
- .version("'3.25.84'")
- .release("'3.25alpha'")
- .compilerDownloadDir("layout.projectDirectory.dir('dist')").build());
- appendToFile(buildFile, buildFileConfigWithCustomDownloadDir);
-
- BuildResult result = runGradleTask(SETUP_FREGE_TASK_NAME);
-
- assertTrue(project.getTasks().getByName(SETUP_FREGE_TASK_NAME) instanceof SetupFregeTask);
- assertEquals(SUCCESS, result.task(":" + SETUP_FREGE_TASK_NAME).getOutcome());
- assertTrue(testProjectDir.toPath().resolve(Paths.get("dist", "frege3.25.84.jar")).toFile()
- .exists());
- }
+ static File setupLocalFregeCompiler(File testProjectDir) throws IOException
+ {
+ Path fregeCompiler = Paths.get("src/functionalTest/resources/frege3.25.84.jar");
+ Files.createDirectories(testProjectDir.toPath().resolve("lib"));
+ return Files.copy(
+ fregeCompiler,
+ testProjectDir.toPath().resolve("lib/frege3.25.84.jar")
+ ).toFile();
}
@Nested
- @TestInstance(Lifecycle.PER_CLASS)
- @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class)
+ @IndicativeSentencesGeneration(
+ separator = " -> ",
+ generator = DisplayNameGenerator.ReplaceUnderscores.class
+ )
class Compile_frege_task_works {
- @Test
- void given_frege_code_in_default_source_dir_and_minimal_build_file_config() throws Exception {
- String completionFr = "Completion.fr";
- String minimalBuildFileConfig = createFregeSection(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build());
- setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig);
-
- BuildResult result = runGradleTask(COMPILE_FREGE_TASK_NAME);
-
- assertTrue(project.getTasks().getByName(COMPILE_FREGE_TASK_NAME) instanceof CompileFregeTask);
- assertEquals(SUCCESS, result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome());
- assertTrue(new File(
- testProjectDir.getAbsolutePath()
- + "/build/classes/main/frege/ch/fhnw/thga/Completion.java")
- .exists());
- assertTrue(new File(
- testProjectDir.getAbsolutePath()
- + "/build/classes/main/frege/ch/fhnw/thga/Completion.class")
- .exists());
- }
-
- @Test
- void given_frege_code_and_many_compiler_flags() throws Exception {
- String completionFr = "Completion.fr";
- String buildConfigWithCompilerFlags = createFregeSection(fregeBuilder.version("'3.25.84'")
- .release("'3.25alpha'").compilerFlags("['-v', '-make', '-O', '-hints']")
- .build());
- setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr,
- buildConfigWithCompilerFlags);
+ @Test
+ void given_frege_code_in_default_source_dir_and_minimal_build_file_config(
+ @TempDir File testProjectDir)
+ throws Exception
+ {
+ String minimalBuildFileConfig = createFregeSection(
+ FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'").build()
+ );
+ Project project = createFregeGradleProject(
+ testProjectDir,
+ minimalBuildFileConfig
+ );
+ Path completionFr =
+ testProjectDir
+ .toPath()
+ .resolve(Paths.get(DEFAULT_RELATIVE_SOURCE_DIR, "ch/fhnw/thga/Completion.fr")
+ );
+ createFregeSourceFile(completionFr, FREGE_COMPLETION_MODULE_CODE);
+ setupLocalFregeCompiler(testProjectDir);
+
+ BuildResult result = runGradleTask(testProjectDir, COMPILE_FREGE_TASK_NAME);
- BuildResult result = runGradleTask(COMPILE_FREGE_TASK_NAME);
+ assertTrue(
+ project
+ .getTasks()
+ .getByName(COMPILE_FREGE_TASK_NAME)
+ instanceof CompileFregeTask
+ );
+ assertEquals(
+ SUCCESS,
+ result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()
+ );
+ assertTrue(testProjectDir
+ .toPath()
+ .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.java")
+ .toFile()
+ .exists());
+ assertTrue(testProjectDir
+ .toPath()
+ .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.class")
+ .toFile()
+ .exists());
+ }
- assertTrue(project.getTasks().getByName(COMPILE_FREGE_TASK_NAME) instanceof CompileFregeTask);
- assertEquals(SUCCESS, result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome());
- assertTrue(new File(
- testProjectDir.getAbsolutePath()
- + "/build/classes/main/frege/ch/fhnw/thga/Completion.java")
- .exists());
- assertTrue(new File(
- testProjectDir.getAbsolutePath()
- + "/build/classes/main/frege/ch/fhnw/thga/Completion.class")
- .exists());
+ @Test
+ void given_frege_code_and_many_compiler_flags(
+ @TempDir File testProjectDir
+ ) throws Exception
+ {
+ String buildConfigWithCompilerFlags = createFregeSection(
+ FREGE_BUILDER
+ .version("'3.25.84'")
+ .release("'3.25alpha'")
+ .compilerFlags("['-v', '-make', '-O', '-hints']")
+ .build()
+ );
+ Project project = createFregeGradleProject(
+ testProjectDir,
+ buildConfigWithCompilerFlags
+ );
+ Path completionFr =
+ testProjectDir
+ .toPath()
+ .resolve(Paths.get(DEFAULT_RELATIVE_SOURCE_DIR, "ch/fhnw/thga/Completion.fr")
+ );
+ createFregeSourceFile(completionFr, FREGE_COMPLETION_MODULE_CODE);
+ setupLocalFregeCompiler(testProjectDir);
+
+ BuildResult result = runGradleTask(testProjectDir, COMPILE_FREGE_TASK_NAME);
+
+ assertTrue(
+ project
+ .getTasks()
+ .getByName(COMPILE_FREGE_TASK_NAME)
+ instanceof CompileFregeTask
+ );
+ assertEquals(
+ SUCCESS,
+ result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()
+ );
+ assertTrue(testProjectDir
+ .toPath()
+ .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.java")
+ .toFile()
+ .exists());
+ assertTrue(testProjectDir
+ .toPath()
+ .resolve("build/classes/main/frege/ch/fhnw/thga/Completion.class")
+ .toFile()
+ .exists());
}
- @Test
+ /*@Test
void given_frege_code_in_custom_source_dir_and_custom_output_dir_and_minimal_build_file_config()
throws Exception {
Path customMainSourceDir = testProjectDir.toPath().resolve(Paths.get("src", "frege"));
@@ -226,10 +197,11 @@ public class FregePluginFunctionalTest
File completionFr = customMainSourceDir.resolve("Completion.fr").toFile();
writeToFile(completionFr, FREGE_COMPLETION_MODULE_CODE);
String minimalBuildFileConfig = createFregeSection(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'")
+ FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'")
.mainSourceDir("layout.projectDirectory.dir('src/frege')")
.outputDir("layout.buildDirectory.dir('frege')").build());
appendToFile(buildFile, minimalBuildFileConfig);
+ System.out.println(Files.readString(buildFile.toPath()));
BuildResult result = runGradleTask(COMPILE_FREGE_TASK_NAME);
@@ -247,9 +219,10 @@ public class FregePluginFunctionalTest
void and_is_up_to_date_given_no_code_changes() throws Exception {
String completionFr = "Completion.fr";
String minimalBuildFileConfig = createFregeSection(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build());
+ FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'").build());
setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig);
+ System.out.println(Files.readString(buildFile.toPath()));
BuildResult first = runGradleTask(COMPILE_FREGE_TASK_NAME);
assertEquals(SUCCESS, first.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome());
@@ -261,7 +234,7 @@ public class FregePluginFunctionalTest
void and_is_cached_given_cache_hit() throws Exception {
String completionFr = "Completion.fr";
String minimalBuildFileConfig = createFregeSection(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build());
+ FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'").build());
setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig);
BuildResult first = runGradleTask(COMPILE_FREGE_TASK_NAME, "--build-cache");
@@ -273,6 +246,7 @@ public class FregePluginFunctionalTest
NEW_LINE);
setupDefaultFregeProjectStructure(codeChange, completionFr, "");
+ System.out.println(Files.readString(buildFile.toPath()));
BuildResult second = runGradleTask(COMPILE_FREGE_TASK_NAME, "--build-cache");
assertEquals(SUCCESS, second.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome());
@@ -291,10 +265,11 @@ public class FregePluginFunctionalTest
"frob i = complete $ i + i", NEW_LINE);
String minimalBuildFileConfig = createFregeSection(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build());
+ FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'").build());
setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig);
setupDefaultFregeProjectStructure(frobCode, frobFr, "");
+ System.out.println(Files.readString(buildFile.toPath()));
BuildResult result = runGradleTask(COMPILE_FREGE_TASK_NAME);
assertTrue(project.getTasks().getByName(COMPILE_FREGE_TASK_NAME) instanceof CompileFregeTask);
@@ -317,13 +292,12 @@ public class FregePluginFunctionalTest
}
@Nested
- @TestInstance(Lifecycle.PER_CLASS)
@IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class)
class Compile_frege_task_fails {
@Test
void given_frege_code_and_illegal_compiler_flags() throws Exception {
String completionFr = "Completion.fr";
- String buildConfigWithIllegalCompilerFlags = createFregeSection(fregeBuilder
+ String buildConfigWithIllegalCompilerFlags = createFregeSection(FREGE_BUILDER
.version("'3.25.84'")
.release("'3.25alpha'").compilerFlags("['-make', '-bla']").build());
setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr,
@@ -345,21 +319,23 @@ public class FregePluginFunctionalTest
"frob i = complete $ i + i", NEW_LINE);
String minimalBuildFileConfigWithoutMake = createFregeSection(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'").compilerFlags("['-v']")
+ FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'").compilerFlags("['-v']")
.build());
setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr,
minimalBuildFileConfigWithoutMake);
setupDefaultFregeProjectStructure(frobCode, frobFr, "");
+
+ System.out.println("Build File: " + Files.readString(buildFile.toPath()));
BuildResult result = runAndFailGradleTask(COMPILE_FREGE_TASK_NAME);
+
assertTrue(project.getTasks().getByName(COMPILE_FREGE_TASK_NAME) instanceof CompileFregeTask);
assertEquals(FAILED, result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome());
}
}
@Nested
- @TestInstance(Lifecycle.PER_CLASS)
@IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class)
class Run_frege_task_works {
@Test
@@ -368,7 +344,7 @@ public class FregePluginFunctionalTest
" main = do", NEW_LINE, " println \"Frege rocks\"", NEW_LINE);
String mainFr = "Main.fr";
String buildFileConfig = createFregeSection(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'")
+ FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'")
.mainModule("'ch.fhnw.thga.Main'").build());
setupDefaultFregeProjectStructure(fregeCode, mainFr, buildFileConfig);
@@ -382,7 +358,7 @@ public class FregePluginFunctionalTest
void given_frege_file_without_main_function() throws Exception {
String completionFr = "Completion.fr";
String buildFileConfig = createFregeSection(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'")
+ FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'")
.mainModule("'ch.fhnw.thga.Completion'").build());
setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, buildFileConfig);
@@ -398,7 +374,7 @@ public class FregePluginFunctionalTest
" main = do", NEW_LINE, " println \"Frege rocks\"", NEW_LINE);
String mainFr = "Main.fr";
String buildFileConfig = createFregeSection(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build());
+ FREGE_BUILDER.version("'3.25.84'").release("'3.25alpha'").build());
setupDefaultFregeProjectStructure(fregeCode, mainFr, buildFileConfig);
BuildResult result = runGradleTask(RUN_FREGE_TASK_NAME, "--mainModule=ch.fhnw.thga.Main");
@@ -410,7 +386,6 @@ public class FregePluginFunctionalTest
@Nested
- @TestInstance(Lifecycle.PER_CLASS)
@IndicativeSentencesGeneration(
separator = " -> ",
generator = DisplayNameGenerator.ReplaceUnderscores.class)
@@ -421,7 +396,7 @@ public class FregePluginFunctionalTest
{
String completionFr = "Completion.fr";
String minimalReplModuleConfig = createFregeSection(
- fregeBuilder
+ FREGE_BUILDER
.version("'3.25.84'")
.release("'3.25alpha'")
.replSource(String.format("'ch.fhnw.thga.Completion'"))
@@ -444,7 +419,6 @@ public class FregePluginFunctionalTest
}
@Nested
- @TestInstance(Lifecycle.PER_CLASS)
@IndicativeSentencesGeneration(
separator = " -> ",
generator = DisplayNameGenerator.ReplaceUnderscores.class)
@@ -455,7 +429,7 @@ public class FregePluginFunctionalTest
{
String completionFr = "Completion.fr";
String minimalBuildFileConfig = createFregeSection(
- fregeBuilder
+ FREGE_BUILDER
.version("'3.25.84'")
.release("'3.25alpha'")
.build());
@@ -470,6 +444,6 @@ public class FregePluginFunctionalTest
project.getTasks().getByName(REPL_FREGE_TASK_NAME)
instanceof ReplFregeTask);
assertEquals(FAILED, result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome());
- }
+ }*/
}
} \ No newline at end of file
diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java
new file mode 100644
index 0000000..a0d46a4
--- /dev/null
+++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/SharedFunctionalTestLogic.java
@@ -0,0 +1,107 @@
+package ch.fhnw.thga.gradleplugins;
+
+import static ch.fhnw.thga.gradleplugins.FregePlugin.FREGE_EXTENSION_NAME;
+import static ch.fhnw.thga.gradleplugins.FregePlugin.FREGE_PLUGIN_ID;
+import static ch.fhnw.thga.gradleplugins.GradleBuildFileConversionTest.createPluginsSection;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.stream.Stream;
+
+import org.gradle.api.Project;
+import org.gradle.testfixtures.ProjectBuilder;
+import org.gradle.testkit.runner.BuildResult;
+import org.gradle.testkit.runner.GradleRunner;
+
+public class SharedFunctionalTestLogic
+{
+
+ static String createFregeSection(FregeDTO fregeDTO)
+ {
+ return String.format(
+ "%s {%s %s%s}",
+ FREGE_EXTENSION_NAME,
+ System.lineSeparator(),
+ fregeDTO.toBuildFile(),
+ System.lineSeparator());
+ }
+
+ private static void writeFile(
+ File destination,
+ String content,
+ boolean append)
+ throws IOException
+ {
+ try (BufferedWriter output = new BufferedWriter(new FileWriter(destination, append)))
+ {
+ output.write(content);
+ }
+
+ }
+
+ static File writeToFile(File destination, String content) throws IOException
+ {
+ writeFile(destination, content, false);
+ return destination;
+ }
+
+ static File appendToFile(File destination, String content) throws IOException
+ {
+ writeFile(destination, System.lineSeparator() + content, true);
+ return destination;
+ }
+
+ static BuildResult runGradleTask(File testProjectDir, String... taskName)
+ {
+ return GradleRunner
+ .create()
+ .withProjectDir(testProjectDir)
+ .withPluginClasspath()
+ .withArguments(taskName)
+ .build();
+ }
+
+ static File createSettingsFile(File testProjectDir) throws IOException
+ {
+ File settingsFile = new File(testProjectDir, "settings.gradle");
+ return writeToFile(settingsFile, "rootProject.name='frege-plugin'");
+ }
+
+ private static File createFregePluginBuildFile(
+ File testProjectDir)
+ throws IOException
+ {
+ File buildFile = new File(testProjectDir, "build.gradle");
+ return writeToFile(
+ buildFile,
+ createPluginsSection(Stream.of(FREGE_PLUGIN_ID)));
+ }
+
+ static File createFregeBuildFile(
+ File testProjectDir,
+ String fregeBuildFileConfig)
+ throws IOException
+ {
+ return appendToFile(
+ createFregePluginBuildFile(
+ testProjectDir),
+ fregeBuildFileConfig);
+ }
+
+ static Project createFregeGradleProject(
+ File testProjectDir,
+ String fregeBuildFileConfig)
+ throws Exception
+ {
+ createSettingsFile(testProjectDir);
+ createFregeBuildFile(testProjectDir, fregeBuildFileConfig);
+ Project project = ProjectBuilder
+ .builder()
+ .withProjectDir(testProjectDir)
+ .build();
+ project.getPluginManager().apply(FREGE_PLUGIN_ID);
+ return project;
+ }
+}
diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/Build.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/Build.java
new file mode 100644
index 0000000..60fc835
--- /dev/null
+++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/Build.java
@@ -0,0 +1,13 @@
+package ch.fhnw.thga.gradleplugins.fregeproject;
+
+import java.io.IOException;
+import java.nio.file.Path;
+
+import org.gradle.api.Project;
+
+public interface Build
+{
+ Build fregeCompiler(Path fregeCompiler);
+ Build settingsFile(String settingsFile);
+ Project build() throws IOException;
+}
diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/BuildFile.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/BuildFile.java
new file mode 100644
index 0000000..ea41350
--- /dev/null
+++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/BuildFile.java
@@ -0,0 +1,7 @@
+package ch.fhnw.thga.gradleplugins.fregeproject;
+
+public interface BuildFile
+{
+ Build buildFile(String buildFile);
+
+}
diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProject.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProject.java
new file mode 100644
index 0000000..3f4373e
--- /dev/null
+++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProject.java
@@ -0,0 +1,26 @@
+package ch.fhnw.thga.gradleplugins.fregeproject;
+
+import java.io.File;
+import java.util.List;
+
+public class FregeProject
+{
+ public final File settingsFile;
+ public final File buildFile;
+ public final File fregeCompiler;
+ public final List<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..c90c8a8
--- /dev/null
+++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/FregeProjectBuilder.java
@@ -0,0 +1,126 @@
+package ch.fhnw.thga.gradleplugins.fregeproject;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.stream.Stream;
+
+import org.gradle.api.Project;
+import org.gradle.testfixtures.ProjectBuilder;
+
+import ch.fhnw.thga.gradleplugins.FregeDTO;
+import static ch.fhnw.thga.gradleplugins.FregePlugin.FREGE_EXTENSION_NAME;
+import static ch.fhnw.thga.gradleplugins.FregePlugin.FREGE_PLUGIN_ID;
+import static ch.fhnw.thga.gradleplugins.GradleBuildFileConversionTest.createPluginsSection;
+
+public final class FregeProjectBuilder implements ProjectRoot, BuildFile, Build
+{
+ private File projectRoot;
+ private String buildFile = createPluginsSection(Stream.of(FREGE_PLUGIN_ID));
+ private Path fregeCompiler = Paths.get("src/functionalTest/resources/frege3.25.84.jar");
+ private String settingsFile = "rootProject.name='frege-plugin'";
+
+ private static volatile FregeProjectBuilder instance;
+
+ private static String createFregeSection(FregeDTO fregeDTO)
+ {
+ return String.format(
+ "%s {%s %s%s}",
+ FREGE_EXTENSION_NAME,
+ System.lineSeparator(),
+ fregeDTO.toBuildFile(),
+ System.lineSeparator());
+ }
+
+ private static void writeFile(
+ File destination,
+ String content,
+ boolean append)
+ throws IOException
+ {
+ try (BufferedWriter output = new BufferedWriter(new FileWriter(destination, append)))
+ {
+ output.write(content);
+ }
+
+ }
+
+ private static File writeToFile(File destination, String content) throws IOException
+ {
+ writeFile(destination, content, false);
+ return destination;
+ }
+
+ private static File appendToFile(File destination, String content) throws IOException
+ {
+ writeFile(destination, System.lineSeparator() + content, true);
+ return destination;
+ }
+
+ private FregeProjectBuilder() {}
+
+ public static ProjectRoot getInstance()
+ {
+ FregeProjectBuilder result = instance;
+ if (result != null) return result;
+ synchronized (FregeProjectBuilder.class)
+ {
+ return instance == null ? new FregeProjectBuilder()
+ : instance;
+ }
+ }
+
+ @Override
+ public Build fregeCompiler(Path fregeCompiler)
+ {
+ this.fregeCompiler = fregeCompiler;
+ return this;
+ }
+
+ @Override
+ public Build settingsFile(String settingsFile)
+ {
+ this.settingsFile = String.join(
+ System.lineSeparator(),
+ this.settingsFile,
+ settingsFile
+ );
+ return this;
+ }
+
+ @Override
+ public Build buildFile(String buildFile)
+ {
+ this.buildFile = String.join(
+ System.lineSeparator(),
+ this.buildFile,
+ buildFile
+ );
+ return this;
+ }
+
+ @Override
+ public BuildFile projectRoot(File projectRoot)
+ {
+ this.projectRoot = projectRoot;
+ return this;
+ }
+
+ @Override
+ public Project build() throws IOException {
+ File settingsGradle = new File(projectRoot, "settings.gradle");
+ writeToFile(settingsGradle, settingsFile);
+ File buildGradle = new File(projectRoot, "build.gradle");
+ writeToFile(buildGradle, buildFile);
+ Project project = ProjectBuilder
+ .builder()
+ .withProjectDir(projectRoot)
+ .build();
+ project.getPluginManager().apply(FREGE_PLUGIN_ID);
+ return project;
+ }
+}
diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/ProjectRoot.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/ProjectRoot.java
new file mode 100644
index 0000000..2b071ee
--- /dev/null
+++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/fregeproject/ProjectRoot.java
@@ -0,0 +1,9 @@
+package ch.fhnw.thga.gradleplugins.fregeproject;
+
+import java.io.File;
+
+public interface ProjectRoot
+{
+ BuildFile projectRoot(File projectRoot);
+
+}
diff --git a/src/functionalTest/resources/frege3.25.84.jar b/src/functionalTest/resources/frege3.25.84.jar
new file mode 100644
index 0000000..a0090fc
--- /dev/null
+++ b/src/functionalTest/resources/frege3.25.84.jar
Binary files differ
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java
index 6bfe72d..c4e17d3 100644
--- a/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java
@@ -6,6 +6,7 @@ import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.ReadableByteChannel;
+import java.nio.file.Paths;
import org.gradle.api.DefaultTask;
import org.gradle.api.GradleException;
@@ -36,32 +37,59 @@ public abstract class SetupFregeTask extends DefaultTask {
public abstract DirectoryProperty getDownloadDir();
@Internal
- public Provider<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/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java b/src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java
index 8512113..c1c920b 100644
--- a/src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java
+++ b/src/test/java/ch/fhnw/thga/gradleplugins/GradleBuildFileConversionTest.java
@@ -22,7 +22,7 @@ public class GradleBuildFileConversionTest {
return String.format("id '%s'", pluginId);
}
- static String createPluginsSection(Stream<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);
}