diff options
Diffstat (limited to 'src/test/java/ch')
4 files changed, 215 insertions, 83 deletions
diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/Builder.java b/src/test/java/ch/fhnw/thga/gradleplugins/Builder.java new file mode 100644 index 0000000..cebaaf3 --- /dev/null +++ b/src/test/java/ch/fhnw/thga/gradleplugins/Builder.java @@ -0,0 +1,15 @@ +package ch.fhnw.thga.gradleplugins; + +public interface Builder { + Builder version(String version); + + Builder release(String release); + + Builder compilerDownloadDir(String downloadDir); + + Builder mainSourceDir(String mainSourceDir); + + Builder outputDir(String outputDir); + + FregeDTO build(); +} diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTO.java b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTO.java new file mode 100644 index 0000000..63d7dae --- /dev/null +++ b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTO.java @@ -0,0 +1,85 @@ +package ch.fhnw.thga.gradleplugins; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class FregeDTO { + public final String version; + public final String release; + public final String compilerDownloadDir; + public final String mainSourceDir; + public final String outputDir; + + public FregeDTO(String version, String release, String compilerDownloadDir, String mainSourceDir, + String outputDir) { + this.version = version; + this.release = release; + this.compilerDownloadDir = compilerDownloadDir; + this.mainSourceDir = mainSourceDir; + this.outputDir = outputDir; + } + + public String getVersion() { + return version; + } + + public String getRelease() { + return release; + } + + public String getCompilerDownloadDir() { + return compilerDownloadDir; + } + + public String getMainSourceDir() { + return mainSourceDir; + } + + public String getOutputDir() { + return outputDir; + } + + private String getFieldValue(Field field) { + try { + return field.get(this).toString(); + } catch (IllegalAccessException | IllegalArgumentException e) { + throw new RuntimeException(e.getMessage(), e.getCause()); + } + } + + private Field getField(String fieldName) { + try { + return FregeDTO.class.getField(fieldName); + } catch (NoSuchFieldException e) { + throw new RuntimeException( + String.format("Field %s not found in class %s", e.getMessage(), FregeDTO.class.getName()), + e.getCause()); + } + } + + private boolean isEmpty(Field field) { + return getFieldValue(field).isEmpty(); + } + + private String toKeyValuePairs(Field field) { + return String.format("%s = %s", field.getName(), getFieldValue(field)); + } + + private boolean isGetterProperty(Method method) { + return method.getName().startsWith("get") && method.getReturnType().getName().contains("Property"); + } + + private String stripGetPrefixAndDecapitalize(String s) { + return Character.toLowerCase(s.charAt(3)) + s.substring(4); + } + + public String toBuildFile() { + Stream<Method> methods = Arrays.stream(FregeExtension.class.getMethods()); + Stream<Field> fields = methods.filter(m -> isGetterProperty(m)) + .map(m -> stripGetPrefixAndDecapitalize(m.getName())).map(name -> getField(name)); + return fields.filter(f -> !isEmpty(f)).map(f -> toKeyValuePairs(f)).collect(Collectors.joining("\n ")); + } +} diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java new file mode 100644 index 0000000..afdc862 --- /dev/null +++ b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java @@ -0,0 +1,48 @@ +package ch.fhnw.thga.gradleplugins; + +public class FregeDTOBuilder implements Builder { + private String version = ""; + private String release = ""; + private String compilerDownloadDir = ""; + private String mainSourceDir = ""; + private String outputDir = ""; + + @Override + public Builder version(String version) { + this.version = version; + return this; + + } + + @Override + public Builder release(String release) { + this.release = release; + return this; + + } + + @Override + public Builder compilerDownloadDir(String downloadDir) { + this.compilerDownloadDir = downloadDir; + return this; + + } + + @Override + public Builder mainSourceDir(String mainSourceDir) { + this.mainSourceDir = mainSourceDir; + return this; + + } + + @Override + public Builder outputDir(String outputDir) { + this.outputDir = outputDir; + return this; + } + + public FregeDTO build() { + return new FregeDTO(version, release, compilerDownloadDir, mainSourceDir, outputDir); + } + +} diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java b/src/test/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java index 31f8d21..81ba9ad 100644 --- a/src/test/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java +++ b/src/test/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java @@ -1,12 +1,10 @@ package ch.fhnw.thga.gradleplugins; -import static ch.fhnw.thga.gradleplugins.FregeExtension.FREGE_COMPILER_OUTPUT_DIRECTORY_KEY; -import static ch.fhnw.thga.gradleplugins.FregeExtension.FREGE_RELEASE_BUILD_FILE_KEY; -import static ch.fhnw.thga.gradleplugins.FregeExtension.FREGE_VERSION_BUILD_FILE_KEY; +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_COMPILER_TASK_NAME; -import static ch.fhnw.thga.gradleplugins.FregePlugin.FREGE_COMPILE_TASK_NAME; +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; @@ -15,7 +13,8 @@ import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; -import java.util.Optional; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -28,7 +27,11 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; public class FregePluginFunctionalTest { - @TempDir File testProjectDir; + + private final FregeDTOBuilder fregeBuilder = new FregeDTOBuilder(); + + @TempDir + File testProjectDir; private File buildFile; private File settingsFile; private Project project; @@ -50,51 +53,61 @@ public class FregePluginFunctionalTest { } private void appendToFile(File destination, String content) throws IOException { - writeFile(destination, content, true); + writeFile(destination, "\n" + content, true); } private static String buildFilePluginString(String pluginId) { return String.format("id '%s'", pluginId); } - private static String buildFileFregeExtension(String fregeVersion, String fregeRelease, - Optional<String> compilerPath) { - String optionalCompilerPathLine = compilerPath.isPresent() ? String.format(" %s = %s\n", FREGE_COMPILER_OUTPUT_DIRECTORY_KEY, compilerPath.get()) : ""; - return String.format("%s {\n %s = %s\n %s = %s\n%s}\n", FREGE_EXTENSION_NAME, FREGE_VERSION_BUILD_FILE_KEY, - fregeVersion, FREGE_RELEASE_BUILD_FILE_KEY, fregeRelease, optionalCompilerPathLine); - } - - private static String writeBuildFilePlugins(Stream<String> pluginIds) { + private 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); } - private void assertSetupFregeCompilerTask(String fregeConfig) throws Exception { - System.out.println(fregeConfig); - appendToFile(buildFile, fregeConfig); - assertTrue(project.getTasks().getByName(SETUP_FREGE_COMPILER_TASK_NAME) instanceof SetupFregeCompilerTask); + 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(SETUP_FREGE_COMPILER_TASK_NAME).build(); + .withArguments(taskName).build(); System.out.println(result.getOutput()); - assertEquals(SUCCESS, result.task(":" + SETUP_FREGE_COMPILER_TASK_NAME).getOutcome()); + 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, writeBuildFilePlugins(Stream.of(FREGE_PLUGIN_ID))); + 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_version_and_release_then_fregeDTO_can_be_converted_to_build_file_string() { + FregeDTO fregeDTO = fregeBuilder.version("'3.25'").release("'3.25alpha'").build(); + String expected = "version = '3.25'\n release = '3.25alpha'"; + assertEquals(expected, fregeDTO.toBuildFile()); + } + + @Test + void given_version_release_and_compiler_download_dir_then_fregeDTO_can_be_converted_to_build_file_string() { + FregeDTO fregeDTO = fregeBuilder.version("'3.25'").release("'3.25alpha'") + .compilerDownloadDir("layout.projectDirectory.dir('dist')").build(); + String expected = "version = '3.25'\n release = '3.25alpha'\n compilerDownloadDir = layout.projectDirectory.dir('dist')"; + assertEquals(expected, fregeDTO.toBuildFile()); + } + + @Test void given_single_plugin_id_then_it_is_correctly_converted_to_build_file_string() { String pluginId = "frege"; Stream<String> pluginIds = Stream.of(pluginId); String expected = "plugins {\n" + " id '" + pluginId + "'\n" + "}\n"; - assertEquals(expected, writeBuildFilePlugins(pluginIds)); + assertEquals(expected, createPluginsSection(pluginIds)); } @Test @@ -103,73 +116,44 @@ public class FregePluginFunctionalTest { String javaId = "java"; Stream<String> pluginIds = Stream.of(fregeId, javaId); String expected = "plugins {\n" + " id '" + fregeId + "'\n" + " id '" + javaId + "'\n" + "}\n"; - assertEquals(expected, writeBuildFilePlugins(pluginIds)); + assertEquals(expected, createPluginsSection(pluginIds)); } @Test - void given_default_plugin_ids_then_they_are_correctly_converted_to_build_file_string() { - String fregeId = "frege"; - String javaId = "java"; - Stream<String> pluginIds = Stream.of(fregeId, javaId); - String expected = "plugins {\n" + " id '" + fregeId + "'\n" + " id '" + javaId + "'\n" + "}\n"; - assertEquals(expected, writeBuildFilePlugins(pluginIds)); - } - - @Test - void given_frege_version_and_frege_release_then_they_are_correctly_converted_to_build_file_string() { - String fregeVersion = "'3.25.84'"; - String fregeRelease = "'3.25alpha'"; - String expectedFregeConfig = FREGE_EXTENSION_NAME + " {\n" + " fregeVersion = " + fregeVersion + "\n" - + " fregeRelease = " + fregeRelease + "\n" + "}\n"; - assertEquals(expectedFregeConfig, buildFileFregeExtension(fregeVersion, fregeRelease, Optional.empty())); + 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_frege_version_and_frege_release_and_frege_compiler_path_then_they_are_correctly_converted_to_build_file_string() { - String fregeVersion = "'3.25.84'"; - String fregeRelease = "'3.25alpha'"; - String fregeCompilerPath = "layout.projectDirectory.file('lib/frege3.25.84')"; - String expectedFregeConfig = - FREGE_EXTENSION_NAME + " {\n" + " fregeVersion = " + fregeVersion + "\n" - + " fregeRelease = " + fregeRelease + "\n" - + " fregeCompilerOutputDirectory = " + fregeCompilerPath + "\n" + "}\n"; - assertEquals(expectedFregeConfig, buildFileFregeExtension(fregeVersion, fregeRelease, Optional.of(fregeCompilerPath))); + 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 given_frege_compiler_version_3_25_84_and_3_25_alpha_release_without_frege_compiler_path_when_running_the_setup_frege_compiler_task_then_the_frege_compiler_is_correctly_setup() - throws Exception { - String fregeConfig = buildFileFregeExtension("'3.25.84'", "'3.25alpha'", Optional.empty()); - assertSetupFregeCompilerTask(fregeConfig); - assertTrue(new File(testProjectDir.getAbsolutePath() + "/lib/frege3.25.84.jar").exists()); - + 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()); } - - @Test - void given_frege_compiler_version_3_25_84_when_running_the_setup_frege_compiler_task_then_the_frege_compiler_is_correctly_setup() - throws Exception { - String fregeConfig = buildFileFregeExtension("'3.25.84'", "'3.25alpha'", Optional.of("layout.buildDirectory.dir('dist')")); - assertSetupFregeCompilerTask(fregeConfig); - assertTrue(new File(testProjectDir.getAbsolutePath() + "/build/dist/frege3.25.84.jar").exists()); - } - - @Test - void frege_compile_task_is_correctly_executed() - throws Exception { - String fregeConfig = buildFileFregeExtension("'3.25.84'", "'3.25alpha'", Optional.of("layout.buildDirectory.dir('dist')")); - String fregeCode = "module ch.fhnw.thga.Completion where\n\n" + - "complete :: Int -> (Int, String)\n" + - "complete i = (i, \"Frege rocks\")\n"; - File completionFr = new File(testProjectDir, "Completion.fr"); - writeToFile(completionFr, fregeCode); - System.out.println(fregeConfig); - appendToFile(buildFile, fregeConfig); - assertTrue(project.getTasks().getByName(FREGE_COMPILE_TASK_NAME) instanceof FregeCompileTask); - BuildResult result = GradleRunner.create().withProjectDir(testProjectDir).withPluginClasspath() - .withArguments(FREGE_COMPILE_TASK_NAME).build(); - System.out.println(result.getOutput()); - assertEquals(SUCCESS, result.task(":" + FREGE_COMPILE_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()); - } }
\ No newline at end of file |