diff options
Diffstat (limited to 'src/functionalTest/java')
8 files changed, 531 insertions, 168 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); + +} |