From cd5d39b867ad5435039d1a47244252078600ca0b Mon Sep 17 00:00:00 2001 From: Thibault Gagnaux Date: Wed, 7 Jul 2021 17:21:33 +0200 Subject: Refactors tests - Uses the builder pattern to simplify the creation of `build.gradle` test files. - Adds `gradlew clean test` github workflow --- .../fhnw/thga/gradleplugins/CompileFregeTask.java | 42 ++++++ .../fhnw/thga/gradleplugins/FregeCompileTask.java | 42 ------ .../ch/fhnw/thga/gradleplugins/FregeExtension.java | 27 ++-- .../ch/fhnw/thga/gradleplugins/FregePlugin.java | 29 ++-- .../thga/gradleplugins/SetupFregeCompilerTask.java | 65 --------- .../ch/fhnw/thga/gradleplugins/SetupFregeTask.java | 66 +++++++++ .../java/ch/fhnw/thga/gradleplugins/Builder.java | 15 +++ .../java/ch/fhnw/thga/gradleplugins/FregeDTO.java | 85 ++++++++++++ .../fhnw/thga/gradleplugins/FregeDTOBuilder.java | 48 +++++++ .../gradleplugins/FregePluginFunctionalTest.java | 150 +++++++++------------ 10 files changed, 344 insertions(+), 225 deletions(-) create mode 100644 src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java delete mode 100644 src/main/java/ch/fhnw/thga/gradleplugins/FregeCompileTask.java delete mode 100644 src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeCompilerTask.java create mode 100644 src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java create mode 100644 src/test/java/ch/fhnw/thga/gradleplugins/Builder.java create mode 100644 src/test/java/ch/fhnw/thga/gradleplugins/FregeDTO.java create mode 100644 src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java (limited to 'src') diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java new file mode 100644 index 0000000..551f6c5 --- /dev/null +++ b/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java @@ -0,0 +1,42 @@ +package ch.fhnw.thga.gradleplugins; + +import java.util.List; + +import javax.inject.Inject; + +import org.gradle.api.DefaultTask; +import org.gradle.api.file.DirectoryProperty; +import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.model.ObjectFactory; +import org.gradle.api.tasks.InputDirectory; +import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.JavaExec; +import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.TaskAction; + +public abstract class CompileFregeTask extends DefaultTask { + private final JavaExec javaExec; + + @InputFile + public abstract RegularFileProperty getFregeCompilerJar(); + + @InputDirectory + public abstract DirectoryProperty getFregeMainSourceDir(); + + @OutputDirectory + public abstract DirectoryProperty getFregeOutputDir(); + + @Inject + public CompileFregeTask(ObjectFactory objectFactory) { + javaExec = objectFactory.newInstance(JavaExec.class); + + } + + @TaskAction + public void compileFrege() { + String fregeMainSourceDir = getFregeMainSourceDir().getAsFile().get().getAbsolutePath(); + List args = List.of("-v", "-d", getFregeOutputDir().get().getAsFile().getAbsolutePath(), "-sp", + fregeMainSourceDir, fregeMainSourceDir); + javaExec.setClasspath(getProject().files(getFregeCompilerJar())).setArgs(args).exec(); + } +} diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregeCompileTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregeCompileTask.java deleted file mode 100644 index 0f19f08..0000000 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregeCompileTask.java +++ /dev/null @@ -1,42 +0,0 @@ -package ch.fhnw.thga.gradleplugins; - -import java.util.List; - -import javax.inject.Inject; - -import org.gradle.api.DefaultTask; -import org.gradle.api.file.DirectoryProperty; -import org.gradle.api.file.RegularFileProperty; -import org.gradle.api.model.ObjectFactory; -import org.gradle.api.tasks.InputDirectory; -import org.gradle.api.tasks.InputFile; -import org.gradle.api.tasks.JavaExec; -import org.gradle.api.tasks.OutputDirectory; -import org.gradle.api.tasks.TaskAction; - -public abstract class FregeCompileTask extends DefaultTask { - private final JavaExec javaExec; - - @InputFile - public abstract RegularFileProperty getFregeCompilerJar(); - - @InputDirectory - public abstract DirectoryProperty getFregeMainSourceDir(); - - @OutputDirectory - public abstract DirectoryProperty getFregeOutputDir(); - - @Inject - public FregeCompileTask(ObjectFactory objectFactory) { - javaExec = objectFactory.newInstance(JavaExec.class); - - } - - - @TaskAction - public void compileFrege() { - String fregeMainSourceDir = getFregeMainSourceDir().getAsFile().get().getAbsolutePath(); - List args = List.of("-v", "-d", getFregeOutputDir().get().getAsFile().getAbsolutePath(), "-sp", fregeMainSourceDir, fregeMainSourceDir); - javaExec.setClasspath(getProject().files(getFregeCompilerJar())).setArgs(args).exec(); - } -} diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java index 2763ebc..fd4f1b4 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java @@ -1,36 +1,29 @@ package ch.fhnw.thga.gradleplugins; -import java.io.File; - import javax.inject.Inject; import org.gradle.api.file.DirectoryProperty; import org.gradle.api.file.ProjectLayout; import org.gradle.api.provider.Property; - public abstract class FregeExtension { - public static final String DEFAULT_FREGE_EXTENSION_NAMESPACE = "frege"; - public static final String FREGE_VERSION_BUILD_FILE_KEY = "fregeVersion"; - public static final String FREGE_RELEASE_BUILD_FILE_KEY = "fregeRelease"; - public static final String FREGE_COMPILER_OUTPUT_DIRECTORY_KEY = "fregeCompilerOutputDirectory"; + public static final String DEFAULT_DOWNLOAD_DIRECTORY = "lib"; + + public abstract Property getVersion(); - public abstract Property getFregeVersion(); + public abstract Property getRelease(); - public abstract Property getFregeRelease(); + public abstract DirectoryProperty getCompilerDownloadDir(); - public abstract DirectoryProperty getFregeCompilerOutputDirectory(); + public abstract DirectoryProperty getMainSourceDir(); - public abstract DirectoryProperty getFregeMainSourceDir(); - - public abstract DirectoryProperty getFregeOutputDir(); + public abstract DirectoryProperty getOutputDir(); @Inject public FregeExtension(ProjectLayout projectLayout) { - getFregeCompilerOutputDirectory().convention(projectLayout.getProjectDirectory().dir("lib")); - // TODO: change to projectDir/src/main/frege - getFregeMainSourceDir().convention(projectLayout.getProjectDirectory()); - getFregeOutputDir().convention(projectLayout.getBuildDirectory().dir("classes/main/frege")); + getCompilerDownloadDir().convention(projectLayout.getProjectDirectory().dir(DEFAULT_DOWNLOAD_DIRECTORY)); + getMainSourceDir().convention(projectLayout.getProjectDirectory()); + getOutputDir().convention(projectLayout.getBuildDirectory().dir("classes/main/frege")); } } diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java index 429edbb..4f0bb34 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java @@ -5,33 +5,26 @@ import org.gradle.api.Project; import org.gradle.api.tasks.TaskProvider; public class FregePlugin implements Plugin { - public static final String SETUP_FREGE_COMPILER_TASK_NAME = "setupFregeCompiler"; - public static final String FREGE_COMPILE_TASK_NAME = "fregeCompile"; + public static final String SETUP_FREGE_TASK_NAME = "setupFrege"; + public static final String COMPILE_FREGE_TASK_NAME = "compileFrege"; public static final String FREGE_PLUGIN_ID = "ch.fhnw.thga.frege"; public static final String FREGE_EXTENSION_NAME = "frege"; @Override public void apply(Project project) { FregeExtension extension = project.getExtensions().create(FREGE_EXTENSION_NAME, FregeExtension.class); - TaskProvider setupFregeCompilerTask = - project.getTasks().register(SETUP_FREGE_COMPILER_TASK_NAME, SetupFregeCompilerTask.class, task -> { - task.getFregeVersion().set(extension.getFregeVersion()); - task.getFregeRelease().set(extension.getFregeRelease()); - task.getFregeCompilerOutputDirectory().set(extension.getFregeCompilerOutputDirectory()); - }); + TaskProvider setupFregeCompilerTask = project.getTasks().register(SETUP_FREGE_TASK_NAME, + SetupFregeTask.class, task -> { + task.getVersion().set(extension.getVersion()); + task.getRelease().set(extension.getRelease()); + task.getDownloadDir().set(extension.getCompilerDownloadDir()); + }); - project.getTasks().register(FREGE_COMPILE_TASK_NAME, FregeCompileTask.class, task -> { + project.getTasks().register(COMPILE_FREGE_TASK_NAME, CompileFregeTask.class, task -> { task.dependsOn(setupFregeCompilerTask); task.getFregeCompilerJar().set(setupFregeCompilerTask.get().getFregeCompilerOutputPath()); - task.getFregeMainSourceDir().set(extension.getFregeMainSourceDir()); - task.getFregeOutputDir().set(extension.getFregeOutputDir()); + task.getFregeMainSourceDir().set(extension.getMainSourceDir()); + task.getFregeOutputDir().set(extension.getOutputDir()); }); - //Configuration fregeCompiler = project.getConfigurations().create("fregeCompiler", c -> { - // c.setVisible(false); - // c.setCanBeConsumed(false); - // c.setCanBeResolved(true); - // c.setDescription("The frege compiler"); - // c.defaultDependencies(d -> d.add(project.getDependencies().create("frege3.25.84.jar"))); - //}); } } diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeCompilerTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeCompilerTask.java deleted file mode 100644 index b3d08a1..0000000 --- a/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeCompilerTask.java +++ /dev/null @@ -1,65 +0,0 @@ -package ch.fhnw.thga.gradleplugins; - -import java.io.FileOutputStream; -import java.io.IOException; -import java.net.URL; -import java.nio.channels.Channels; -import java.nio.channels.FileChannel; -import java.nio.channels.ReadableByteChannel; - -import org.gradle.api.DefaultTask; -import org.gradle.api.GradleException; -import org.gradle.api.file.DirectoryProperty; -import org.gradle.api.file.RegularFile; -import org.gradle.api.logging.Logger; -import org.gradle.api.logging.Logging; -import org.gradle.api.provider.Property; -import org.gradle.api.provider.Provider; -import org.gradle.api.tasks.Input; -import org.gradle.api.tasks.Internal; -import org.gradle.api.tasks.OutputFile; -import org.gradle.api.tasks.TaskAction; - -public abstract class SetupFregeCompilerTask extends DefaultTask { - public static final Logger LOGGER = Logging.getLogger(SetupFregeCompilerTask.class); - - private static final String FREGE_GITHUB_URL_PREFIX = "https://github.com/Frege/frege/releases/download"; - - @Input - public abstract Property getFregeVersion(); - - @Input - public abstract Property getFregeRelease(); - - @Internal - public abstract DirectoryProperty getFregeCompilerOutputDirectory(); - - @Internal - public Provider getFregeVersionJarName() { - return getFregeVersion().map(version -> "frege" + version + ".jar"); - } - - @Internal - public Provider getDownloadUrl() { - return getFregeVersionJarName() - .map(name -> String.join("/", FREGE_GITHUB_URL_PREFIX, getFregeRelease().get(), name)); - } - - @OutputFile - public Provider getFregeCompilerOutputPath() { - return getFregeCompilerOutputDirectory().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) { - throw new GradleException(e.getMessage()); - } - } -} diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java new file mode 100644 index 0000000..7f92053 --- /dev/null +++ b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java @@ -0,0 +1,66 @@ +package ch.fhnw.thga.gradleplugins; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URL; +import java.nio.channels.Channels; +import java.nio.channels.FileChannel; +import java.nio.channels.ReadableByteChannel; + +import org.gradle.api.DefaultTask; +import org.gradle.api.GradleException; +import org.gradle.api.file.DirectoryProperty; +import org.gradle.api.file.RegularFile; +import org.gradle.api.logging.Logger; +import org.gradle.api.logging.Logging; +import org.gradle.api.provider.Property; +import org.gradle.api.provider.Provider; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.Internal; +import org.gradle.api.tasks.OutputFile; +import org.gradle.api.tasks.TaskAction; + +public abstract class SetupFregeTask extends DefaultTask { + public static final Logger LOGGER = Logging.getLogger(SetupFregeTask.class); + + private static final String FREGE_GITHUB_URL_PREFIX = "https://github.com/Frege/frege/releases/download"; + + @Input + public abstract Property getVersion(); + + @Input + public abstract Property getRelease(); + + @Internal + public abstract DirectoryProperty getDownloadDir(); + + @Internal + public Provider getFregeVersionJarName() { + return getVersion().map(version -> "frege" + version + ".jar"); + } + + @Internal + public Provider getDownloadUrl() { + return getFregeVersionJarName() + .map(name -> String.join("/", FREGE_GITHUB_URL_PREFIX, getRelease().get(), name)); + } + + @OutputFile + public Provider 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) { + throw new GradleException(e.getMessage()); + } + } +} 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 methods = Arrays.stream(FregeExtension.class.getMethods()); + Stream 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 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 pluginIds) { + private static String createPluginsSection(Stream 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 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 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 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 -- cgit