From 45413d0e3e03f583041ebb59d35906f238c13a41 Mon Sep 17 00:00:00 2001
From: king-tyler <8304181+king-tyler@users.noreply.github.com>
Date: Mon, 29 Jun 2020 22:10:48 -0500
Subject: [PATCH] Add testing for other Gradle versions (#23)

---
 .github/workflows/pull_request.yml            |  2 +-
 README.md                                     |  2 +
 build.gradle                                  |  3 ++
 .../XtextProjectPluginsFunctionalTest.java    | 47 +++++++++++++------
 .../mydsl-xtend/example.mydsl.ui/build.gradle |  4 +-
 .../example.mydsl.ui/build.gradle             |  4 +-
 .../mydsl/example.mydsl.ui/build.gradle       |  4 +-
 7 files changed, 48 insertions(+), 18 deletions(-)

diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml
index 7f8e439..8a63bab 100644
--- a/.github/workflows/pull_request.yml
+++ b/.github/workflows/pull_request.yml
@@ -16,4 +16,4 @@ jobs:
       with:
         java-version: ${{ matrix.jdk }}
     - name: Build
-      run: ./gradlew build --info --stacktrace --warning-mode=fail
+      run: ./gradlew build "-PgradleVersions=6.2.2,current" --info --stacktrace --warning-mode=fail
diff --git a/README.md b/README.md
index 5e7e5a4..6e4af68 100644
--- a/README.md
+++ b/README.md
@@ -14,6 +14,8 @@ within Gradle. This includes:
 * Generates the project's `build.properties` when imported into Eclipse so that dsl project can be launched and tested
   within Eclipse PDE.
 
+These plugins have been successfully tested with Gradle 6.2 up to 6.5. They should work with newer versions as well.
+
 ## Usage
 
 gradle-xtext-generator provides the following plugins:
diff --git a/build.gradle b/build.gradle
index 877766b..bfc6ff9 100644
--- a/build.gradle
+++ b/build.gradle
@@ -128,6 +128,9 @@ tasks.named(JavaPlugin.TEST_TASK_NAME) {
     systemProperty 'm2', file(repository.url)
     systemProperty 'pluginVersion', version
     systemProperty 'xtextVersion', xtextVersion
+    if (findProperty('gradleVersions') != null) {
+        systemProperty 'gradleVersions', gradleVersions
+    }
     doFirst {
         mkdir temporaryDir
     }
diff --git a/src/test/java/com/github/zxhr/gradle/xtext/XtextProjectPluginsFunctionalTest.java b/src/test/java/com/github/zxhr/gradle/xtext/XtextProjectPluginsFunctionalTest.java
index 6b24322..2ed1d5d 100644
--- a/src/test/java/com/github/zxhr/gradle/xtext/XtextProjectPluginsFunctionalTest.java
+++ b/src/test/java/com/github/zxhr/gradle/xtext/XtextProjectPluginsFunctionalTest.java
@@ -36,12 +36,23 @@
 import org.gradle.api.UncheckedIOException;
 import org.gradle.testkit.runner.BuildResult;
 import org.gradle.testkit.runner.GradleRunner;
-import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
 
 public class XtextProjectPluginsFunctionalTest {
 
     private Path tempDir;
 
+    public static Stream<String> getGradleVersions() {
+        String gradleVersions = System.getProperty("gradleVersions");
+        Stream<String> current = Stream.of("current");
+        if (gradleVersions == null) {
+            return current;
+        } else {
+            return Stream.concat(current, Stream.of(gradleVersions.split(","))).distinct();
+        }
+    }
+
     private void setupProject(String project) throws IOException {
         tempDir = Files.createTempDirectory(Paths.get(System.getProperty("testdir")), project);
         Path rootProject = Paths.get("src", "test", "resources", project);
@@ -56,14 +67,15 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO
         });
     }
 
-    @Test
-    public void testXtextJavaProject() throws IOException {
+    @ParameterizedTest(name = "Xtext Java Project - Gradle {0}")
+    @MethodSource("getGradleVersions")
+    public void testXtextJavaProject(String gradleVersion) throws IOException {
         setupProject("mydsl");
-        BuildResult result = runProject(CLEAN_TASK_NAME, BUILD_TASK_NAME, ECLIPSE_TASK_NAME);
+        BuildResult result = runProject(gradleVersion, CLEAN_TASK_NAME, BUILD_TASK_NAME, ECLIPSE_TASK_NAME);
         checkProjectsGenerated(result, "example.mydsl", "example.mydsl.ide", "example.mydsl.ui", "example.mydsl.web");
         checkEclipsePdeSetup(tempDir.resolve("example.mydsl.ui"));
 
-        result = runProject(BUILD_TASK_NAME);
+        result = runProject(gradleVersion, BUILD_TASK_NAME);
         assertEquals(UP_TO_DATE, result.task(getTask(GENERATE_MWE2_TASK_NAME)).getOutcome());
         Path pluginXml = tempDir
                 .resolve(Paths.get("example.mydsl", "build", "src-gen", "main", "resources", "plugin.xml"));
@@ -71,26 +83,33 @@ public void testXtextJavaProject() throws IOException {
         assertTrue(pluginXmlText.contains("point=\"org.example.extension.point\""));
     }
 
-    @Test
-    public void testXtextXtendProject() throws IOException {
+    @ParameterizedTest(name = "Xtext Xtend Project - Gradle {0}")
+    @MethodSource("getGradleVersions")
+    public void testXtextXtendProject(String gradleVersion) throws IOException {
         setupProject("mydsl-xtend");
-        BuildResult result = runProject(CLEAN_TASK_NAME, BUILD_TASK_NAME);
+        BuildResult result = runProject(gradleVersion, CLEAN_TASK_NAME, BUILD_TASK_NAME);
         checkProjectsGenerated(result, "example.mydsl", "example.mydsl.ide", "example.mydsl.ui", "example.mydsl.web");
     }
 
-    @Test
-    public void testDifferentVersionXtextProject() throws IOException {
+    @ParameterizedTest(name = "Xtext 2.20.0 Java Project - Gradle {0}")
+    @MethodSource("getGradleVersions")
+    public void testDifferentVersionXtextProject(String gradleVersion) throws IOException {
         setupProject("mydsl-xtext-version");
-        BuildResult result = runProject(CLEAN_TASK_NAME, BUILD_TASK_NAME);
+        BuildResult result = runProject(gradleVersion, CLEAN_TASK_NAME, BUILD_TASK_NAME);
         checkProjectsGenerated(result, "example.mydsl", "example.mydsl.ide", "example.mydsl.ui", "example.mydsl.web");
     }
 
-    private BuildResult runProject(String... tasks) {
-        List<String> arguments = new ArrayList<>(asList(tasks));
+    private BuildResult runProject(String gradleVersion, String... tasks) {
+        List<String> arguments = new ArrayList<>();
         arguments.addAll(asList("-PxtextExampleVersion=" + System.getProperty("xtextVersion"),
                 "-PpluginVersion=" + System.getProperty("pluginVersion"),
                 "-Dmaven.repo.local=" + System.getProperty("m2"), "-s", "--warning-mode=fail"));
-        return GradleRunner.create().withProjectDir(tempDir.toFile()).forwardOutput().withArguments(arguments).build();
+        arguments.addAll(asList(tasks));
+        GradleRunner runner = GradleRunner.create();
+        if (!"current".equals(gradleVersion)) {
+            runner = runner.withGradleVersion(gradleVersion);
+        }
+        return runner.withProjectDir(tempDir.toFile()).forwardOutput().withArguments(arguments).build();
     }
 
     private void checkProjectsGenerated(BuildResult result, String runtimeProject, String genericIdeProject,
diff --git a/src/test/resources/mydsl-xtend/example.mydsl.ui/build.gradle b/src/test/resources/mydsl-xtend/example.mydsl.ui/build.gradle
index 193ec72..08b6490 100644
--- a/src/test/resources/mydsl-xtend/example.mydsl.ui/build.gradle
+++ b/src/test/resources/mydsl-xtend/example.mydsl.ui/build.gradle
@@ -11,7 +11,9 @@ repositories {
         patternLayout {
             artifact '[artifact]_[revision].[ext]'
         }
-        metadataSources.artifact()
+        metadataSources {
+            artifact()
+        }
     }
 }
 
diff --git a/src/test/resources/mydsl-xtext-version/example.mydsl.ui/build.gradle b/src/test/resources/mydsl-xtext-version/example.mydsl.ui/build.gradle
index 193ec72..08b6490 100644
--- a/src/test/resources/mydsl-xtext-version/example.mydsl.ui/build.gradle
+++ b/src/test/resources/mydsl-xtext-version/example.mydsl.ui/build.gradle
@@ -11,7 +11,9 @@ repositories {
         patternLayout {
             artifact '[artifact]_[revision].[ext]'
         }
-        metadataSources.artifact()
+        metadataSources {
+            artifact()
+        }
     }
 }
 
diff --git a/src/test/resources/mydsl/example.mydsl.ui/build.gradle b/src/test/resources/mydsl/example.mydsl.ui/build.gradle
index 0a98398..3a99094 100644
--- a/src/test/resources/mydsl/example.mydsl.ui/build.gradle
+++ b/src/test/resources/mydsl/example.mydsl.ui/build.gradle
@@ -12,7 +12,9 @@ repositories {
         patternLayout {
             artifact '[artifact]_[revision].[ext]'
         }
-        metadataSources.artifact()
+        metadataSources {
+            artifact()
+        }
     }
 }