aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormodmuss50 <modmuss50@gmail.com>2021-03-06 11:40:07 +0000
committerGitHub <noreply@github.com>2021-03-06 11:40:07 +0000
commit87f3743b2423b59e40ca5a74e8641affffa57499 (patch)
tree2c2b04051a4161dc4387f1a735bc28502902fee8 /src
parent679026ef31d619409187a564bc0623891f5979e6 (diff)
downloadarchitectury-loom-87f3743b2423b59e40ca5a74e8641affffa57499.tar.gz
architectury-loom-87f3743b2423b59e40ca5a74e8641affffa57499.tar.bz2
architectury-loom-87f3743b2423b59e40ca5a74e8641affffa57499.zip
Rewrite tests to be easier to write and maintain (#361)
Diffstat (limited to 'src')
-rw-r--r--src/test/groovy/net/fabricmc/loom/AccessWidenerTest.groovy56
-rw-r--r--src/test/groovy/net/fabricmc/loom/BuildUtils.groovy209
-rw-r--r--src/test/groovy/net/fabricmc/loom/DecompileTest.groovy54
-rw-r--r--src/test/groovy/net/fabricmc/loom/EmptyBuildFunctionalTest.groovy51
-rw-r--r--src/test/groovy/net/fabricmc/loom/EmptyBuildMojangFunctionalTest.groovy50
-rw-r--r--src/test/groovy/net/fabricmc/loom/KotlinTest.groovy50
-rw-r--r--src/test/groovy/net/fabricmc/loom/LegacyProjectTest.groovy53
-rw-r--r--src/test/groovy/net/fabricmc/loom/MixinBuildFunctionalTest.groovy69
-rw-r--r--src/test/groovy/net/fabricmc/loom/MojangMappingsProjectTest.groovy50
-rw-r--r--src/test/groovy/net/fabricmc/loom/ReproducibleBuildTest.groovy70
-rw-r--r--src/test/groovy/net/fabricmc/loom/SimpleBuildFunctionalTest.groovy62
-rw-r--r--src/test/groovy/net/fabricmc/loom/SimpleProjectTest.groovy63
-rw-r--r--src/test/groovy/net/fabricmc/loom/util/ArchiveAssertionsTrait.groovy41
-rw-r--r--src/test/groovy/net/fabricmc/loom/util/ProjectTestTrait.groovy97
-rw-r--r--src/test/resources/accesswidener/expected.accesswidener7
-rw-r--r--src/test/resources/projects/accesswidener/build.gradle96
-rw-r--r--src/test/resources/projects/accesswidener/gradle.properties17
-rw-r--r--src/test/resources/projects/accesswidener/settings.gradle2
-rw-r--r--src/test/resources/projects/accesswidener/src/main/java/net/fabricmc/example/ExampleMod.java14
-rw-r--r--src/test/resources/projects/accesswidener/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java15
-rw-r--r--src/test/resources/projects/accesswidener/src/main/resources/fabric.mod.json37
-rw-r--r--src/test/resources/projects/accesswidener/src/main/resources/modid.accesswidener7
-rw-r--r--src/test/resources/projects/accesswidener/src/main/resources/modid.mixins.json14
-rw-r--r--src/test/resources/projects/kotlin/build.gradle.kts20
-rw-r--r--src/test/resources/projects/kotlin/settings.gradle2
-rw-r--r--src/test/resources/projects/kotlin/src/main/kotlin/net/fabricmc/language/kotlin/TestModClass.kt15
-rw-r--r--src/test/resources/projects/kotlin/src/main/resources/fabric.mod.json33
-rw-r--r--src/test/resources/projects/legacy/build.gradle45
-rw-r--r--src/test/resources/projects/legacy/gradle.properties17
-rw-r--r--src/test/resources/projects/legacy/settings.gradle2
-rw-r--r--src/test/resources/projects/legacy/src/main/java/net/fabricmc/example/ExampleMod.java14
-rw-r--r--src/test/resources/projects/legacy/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java15
-rw-r--r--src/test/resources/projects/legacy/src/main/resources/fabric.mod.json36
-rw-r--r--src/test/resources/projects/legacy/src/main/resources/modid.mixins.json14
-rw-r--r--src/test/resources/projects/mojangMappings/build.gradle92
-rw-r--r--src/test/resources/projects/mojangMappings/gradle.properties17
-rw-r--r--src/test/resources/projects/mojangMappings/settings.gradle2
-rw-r--r--src/test/resources/projects/mojangMappings/src/main/java/net/fabricmc/example/ExampleMod.java14
-rw-r--r--src/test/resources/projects/mojangMappings/src/main/resources/fabric.mod.json33
-rw-r--r--src/test/resources/projects/reproducible/build.gradle51
-rw-r--r--src/test/resources/projects/reproducible/gradle.properties17
-rw-r--r--src/test/resources/projects/reproducible/settings.gradle2
-rw-r--r--src/test/resources/projects/reproducible/src/main/java/net/fabricmc/example/ExampleMod.java14
-rw-r--r--src/test/resources/projects/reproducible/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java15
-rw-r--r--src/test/resources/projects/reproducible/src/main/resources/fabric.mod.json36
-rw-r--r--src/test/resources/projects/reproducible/src/main/resources/modid.mixins.json14
-rw-r--r--src/test/resources/projects/simple/build.gradle92
-rw-r--r--src/test/resources/projects/simple/gradle.properties17
-rw-r--r--src/test/resources/projects/simple/settings.gradle2
-rw-r--r--src/test/resources/projects/simple/src/main/java/net/fabricmc/example/ExampleMod.java14
-rw-r--r--src/test/resources/projects/simple/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java15
-rw-r--r--src/test/resources/projects/simple/src/main/resources/fabric.mod.json36
-rw-r--r--src/test/resources/projects/simple/src/main/resources/modid.mixins.json14
53 files changed, 1453 insertions, 441 deletions
diff --git a/src/test/groovy/net/fabricmc/loom/AccessWidenerTest.groovy b/src/test/groovy/net/fabricmc/loom/AccessWidenerTest.groovy
new file mode 100644
index 00000000..a1449001
--- /dev/null
+++ b/src/test/groovy/net/fabricmc/loom/AccessWidenerTest.groovy
@@ -0,0 +1,56 @@
+/*
+ * This file is part of fabric-loom, licensed under the MIT License (MIT).
+ *
+ * Copyright (c) 2016, 2017, 2018 FabricMC
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package net.fabricmc.loom
+
+import net.fabricmc.loom.util.ArchiveAssertionsTrait
+import net.fabricmc.loom.util.ProjectTestTrait
+import spock.lang.Specification
+import spock.lang.Unroll
+
+import static org.gradle.testkit.runner.TaskOutcome.SUCCESS
+
+class AccessWidenerTest extends Specification implements ProjectTestTrait, ArchiveAssertionsTrait {
+ @Override
+ String name() {
+ "accesswidener"
+ }
+
+ @Unroll
+ def "accesswidener (gradle #gradle)"() {
+ when:
+ def result = create("build", gradle)
+ then:
+ result.task(":build").outcome == SUCCESS
+ getArchiveEntry("fabric-example-mod-1.0.0.jar", "modid.accesswidener") == expected()
+ where:
+ gradle | _
+ '6.8.3' | _
+ '7.0-milestone-2' | _
+ }
+
+ String expected() {
+ new File("src/test/resources/accesswidener/expected.accesswidener").text
+ }
+}
diff --git a/src/test/groovy/net/fabricmc/loom/BuildUtils.groovy b/src/test/groovy/net/fabricmc/loom/BuildUtils.groovy
deleted file mode 100644
index 58fe3cfd..00000000
--- a/src/test/groovy/net/fabricmc/loom/BuildUtils.groovy
+++ /dev/null
@@ -1,209 +0,0 @@
-package net.fabricmc.loom
-
-/**
- * Created by Mitchell Skaggs on 6/12/2019.
- */
-static String genBuildFile(String mappingsDep = "\"net.fabricmc:yarn:\${project.yarn_mappings}\"") {
- """
-plugins {
- id 'fabric-loom'
- id 'maven-publish'
-}
-sourceCompatibility = JavaVersion.VERSION_1_8
-targetCompatibility = JavaVersion.VERSION_1_8
-
-archivesBaseName = project.archives_base_name
-version = project.mod_version
-group = project.maven_group
-
-
-minecraft {
-}
-
-dependencies {
- //to change the versions see the gradle.properties file
- minecraft "com.mojang:minecraft:\${project.minecraft_version}"
- mappings ${mappingsDep}
- modImplementation "net.fabricmc:fabric-loader:\${project.loader_version}"
-
- // Fabric API. This is technically optional, but you probably want it anyway.
- modImplementation "net.fabricmc.fabric-api:fabric-api:\${project.fabric_version}"
-
- // PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs.
- // You may need to force-disable transitiveness on them.
-}
-
-processResources {
- inputs.property "version", project.version
-
- filesMatching("fabric.mod.json") {
- expand "version": project.version
- }
-}
-
-// ensure that the encoding is set to UTF-8, no matter what the system default is
-// this fixes some edge cases with special characters not displaying correctly
-// see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html
-tasks.withType(JavaCompile) {
- options.encoding = "UTF-8"
-}
-
-// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
-// if it is present.
-// If you remove this task, sources will not be generated.
-task sourcesJar(type: Jar, dependsOn: classes) {
- classifier = "sources"
- from sourceSets.main.allSource
-}
-
-jar {
- from "LICENSE"
-}
-
-// configure the maven publication
-publishing {
- publications {
- mavenJava(MavenPublication) {
- // add all the jars that should be included when publishing to maven
- artifact(jar) {
- builtBy remapJar
- }
- artifact(sourcesJar) {
- builtBy remapSourcesJar
- }
- }
- }
-
- // select the repositories you want to publish to
- repositories {
- // uncomment to publish to the local maven
- // mavenLocal()
- }
-}
-"""
-}
-
-static String genPropsFile(String mcVersion, String yarnVersion, String loaderVersion, String fabricVersion, boolean caching = true, boolean parallel = true) {
- """
-org.gradle.caching=$caching
-org.gradle.parallel=$parallel
-
-# Fabric Properties
-# check these on https://fabricmc.net/use
-minecraft_version=$mcVersion
-yarn_mappings=$yarnVersion
-loader_version=$loaderVersion
-
-# Mod Properties
-mod_version = 1.0.0
-maven_group = net.fabricmc
-archives_base_name = fabric-example-mod
-
-# Dependencies
-# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric
-fabric_version=$fabricVersion
-"""
-}
-
-static String genSettingsFile(String name) {
- """
-rootProject.name = '$name'
-"""
-}
-
-static String genModJsonFile() {
- """
-{
- "schemaVersion": 1,
- "id": "modid",
- "version": "\${version}",
-
- "name": "Example Mod",
- "description": "This is an example description! Tell everyone what your mod is about!",
- "authors": [
- "Me!"
- ],
- "contact": {
- "homepage": "https://fabricmc.net/",
- "sources": "https://github.com/FabricMC/fabric-example-mod"
- },
-
- "license": "CC0-1.0",
-
- "environment": "*",
- "entrypoints": {
- "main": [
- "net.fabricmc.example.ExampleMod"
- ]
- },
- "mixins": [
- "modid.mixins.json"
- ],
-
- "depends": {
- "fabricloader": ">=0.4.0",
- "fabric": "*"
- },
- "suggests": {
- "flamingo": "*"
- }
-}
-"""
-}
-
-static String genModJavaFile() {
- """
-package net.fabricmc.example;
-
-import net.fabricmc.api.ModInitializer;
-
-public class ExampleMod implements ModInitializer {
- @Override
- public void onInitialize() {
- // This code runs as soon as Minecraft is in a mod-load-ready state.
- // However, some things (like resources) may still be uninitialized.
- // Proceed with mild caution.
-
- System.out.println("Hello Fabric world!");
- }
-}
-"""
-}
-
-static String genModMixinsJsonFile() {
- """
-{
- "required": true,
- "package": "net.fabricmc.example.mixin",
- "compatibilityLevel": "JAVA_8",
- "mixins": [
- ],
- "client": [
- "ExampleMixin"
- ],
- "injectors": {
- "defaultRequire": 1
- }
-}
-"""
-}
-
-static String genModMixinsJavaFile() {
- """
-package net.fabricmc.example.mixin;
-
-import net.minecraft.client.MinecraftClient;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(MinecraftClient.class)
-public class ExampleMixin {
- @Inject(at = @At("HEAD"), method = "init()V")
- private void init(CallbackInfo info) {
- System.out.println("This line is printed by an example mod mixin!");
- }
-}
-"""
-}
diff --git a/src/test/groovy/net/fabricmc/loom/DecompileTest.groovy b/src/test/groovy/net/fabricmc/loom/DecompileTest.groovy
new file mode 100644
index 00000000..b30f90a1
--- /dev/null
+++ b/src/test/groovy/net/fabricmc/loom/DecompileTest.groovy
@@ -0,0 +1,54 @@
+/*
+ * This file is part of fabric-loom, licensed under the MIT License (MIT).
+ *
+ * Copyright (c) 2016, 2017, 2018 FabricMC
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package net.fabricmc.loom
+
+import net.fabricmc.loom.util.ProjectTestTrait
+import spock.lang.Ignore
+import spock.lang.Specification
+import spock.lang.Unroll
+
+import static org.gradle.testkit.runner.TaskOutcome.SUCCESS
+
+@Ignore // TODO this fails due to the plugin classpath being setup differently. We need to explore other ways to do this.
+class DecompileTest extends Specification implements ProjectTestTrait {
+ @Override
+ String name() {
+ "simple"
+ }
+
+ @Unroll
+ def "#decompiler decompile"() {
+ when:
+ def result = create(task)
+
+ then:
+ result.task(":${task}").outcome == SUCCESS
+
+ where:
+ decompiler | task
+ 'fernflower' | "genSources"
+ 'cfr' | "genSourcesWithExperimentalCfr"
+ }
+}
diff --git a/src/test/groovy/net/fabricmc/loom/EmptyBuildFunctionalTest.groovy b/src/test/groovy/net/fabricmc/loom/EmptyBuildFunctionalTest.groovy
deleted file mode 100644
index 996ab656..00000000
--- a/src/test/groovy/net/fabricmc/loom/EmptyBuildFunctionalTest.groovy
+++ /dev/null
@@ -1,51 +0,0 @@
-package net.fabricmc.loom
-
-import org.gradle.testkit.runner.GradleRunner
-import org.junit.Rule
-import org.junit.rules.TemporaryFolder
-import spock.lang.Specification
-import spock.lang.Unroll
-
-import static net.fabricmc.loom.BuildUtils.*
-import static org.gradle.testkit.runner.TaskOutcome.SUCCESS
-
-/**
- * Created by Mitchell Skaggs on 6/10/2019.
- */
-class EmptyBuildFunctionalTest extends Specification {
- @Rule
- TemporaryFolder testProjectDir = new TemporaryFolder()
- File settingsFile
- File buildFile
- File propsFile
-
- def setup() {
- settingsFile = testProjectDir.newFile('settings.gradle')
- buildFile = testProjectDir.newFile('build.gradle')
- propsFile = testProjectDir.newFile('gradle.properties')
- }
-
- @Unroll
- def "empty build succeeds using Minecraft #mcVersion"() {
- given:
- settingsFile << genSettingsFile("empty-build-functional-test")
- propsFile << genPropsFile(mcVersion, yarnVersion, loaderVersion, fabricVersion)
- buildFile << genBuildFile()
-
- when:
- def result = GradleRunner.create()
- .withProjectDir(testProjectDir.root)
- .withArguments('build',"--stacktrace", "--warning-mode", System.getenv().TEST_WARNING_MODE ?: 'all')
- .withPluginClasspath()
- .forwardOutput()
- .build()
-
- then:
- result.task(":build").outcome == SUCCESS
-
- where:
- mcVersion | yarnVersion | loaderVersion | fabricVersion
- '1.14' | '1.14+build.21' | '0.4.8+build.155' | '0.3.0+build.183'
- '1.16.2' | '1.16.2+build.26:v2' | '0.9.2+build.206' | '0.19.0+build.398-1.16'
- }
-}
diff --git a/src/test/groovy/net/fabricmc/loom/EmptyBuildMojangFunctionalTest.groovy b/src/test/groovy/net/fabricmc/loom/EmptyBuildMojangFunctionalTest.groovy
deleted file mode 100644
index d360ba6f..00000000
--- a/src/test/groovy/net/fabricmc/loom/EmptyBuildMojangFunctionalTest.groovy
+++ /dev/null
@@ -1,50 +0,0 @@
-package net.fabricmc.loom
-
-import org.gradle.testkit.runner.GradleRunner
-import org.junit.Rule
-import org.junit.rules.TemporaryFolder
-import spock.lang.Specification
-import spock.lang.Unroll
-
-import static net.fabricmc.loom.BuildUtils.*
-import static org.gradle.testkit.runner.TaskOutcome.SUCCESS
-
-/**
- * Created by Mitchell Skaggs on 6/10/2019.
- */
-class EmptyBuildMojangFunctionalTest extends Specification {
- @Rule
- TemporaryFolder testProjectDir = new TemporaryFolder()
- File settingsFile
- File buildFile
- File propsFile
-
- def setup() {
- settingsFile = testProjectDir.newFile('settings.gradle')
- buildFile = testProjectDir.newFile('build.gradle')
- propsFile = testProjectDir.newFile('gradle.properties')
- }
-
- @Unroll
- def "empty build succeeds using Minecraft #mcVersion"() {
- given:
- settingsFile << genSettingsFile("empty-build-functional-test")
- propsFile << genPropsFile(mcVersion, "nope", loaderVersion, fabricVersion)
- buildFile << genBuildFile("minecraft.officialMojangMappings()")
-
- when:
- def result = GradleRunner.create()
- .withProjectDir(testProjectDir.root)
- .withArguments('build',"--stacktrace", "--warning-mode", System.getenv().TEST_WARNING_MODE ?: 'all')
- .withPluginClasspath()
- .forwardOutput()
- .build()
-
- then:
- result.task(":build").outcome == SUCCESS
-
- where:
- mcVersion | loaderVersion | fabricVersion
- '1.16.2' | '0.9.2+build.206' | '0.19.0+build.398-1.16'
- }
-}
diff --git a/src/test/groovy/net/fabricmc/loom/KotlinTest.groovy b/src/test/groovy/net/fabricmc/loom/KotlinTest.groovy
new file mode 100644
index 00000000..380dffda
--- /dev/null
+++ b/src/test/groovy/net/fabricmc/loom/KotlinTest.groovy
@@ -0,0 +1,50 @@
+/*
+ * This file is part of fabric-loom, licensed under the MIT License (MIT).
+ *
+ * Copyright (c) 2016, 2017, 2018 FabricMC
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package net.fabricmc.loom
+
+import net.fabricmc.loom.util.ProjectTestTrait
+import spock.lang.Specification
+import spock.lang.Unroll
+
+import static org.gradle.testkit.runner.TaskOutcome.SUCCESS
+
+class KotlinTest extends Specification implements ProjectTestTrait {
+ @Override
+ String name() {
+ "kotlin"
+ }
+
+ @Unroll
+ def "kotlin build (gradle #gradle)"() {
+ when:
+ def result = create("build", gradle)
+ then:
+ result.task(":build").outcome == SUCCESS
+ where:
+ gradle | _
+ '6.8.3' | _
+ '7.0-milestone-2' | _
+ }
+}
diff --git a/src/test/groovy/net/fabricmc/loom/LegacyProjectTest.groovy b/src/test/groovy/net/fabricmc/loom/LegacyProjectTest.groovy
new file mode 100644
index 00000000..aac95fe8
--- /dev/null
+++ b/src/test/groovy/net/fabricmc/loom/LegacyProjectTest.groovy
@@ -0,0 +1,53 @@
+/*
+ * This file is part of fabric-loom, licensed under the MIT License (MIT).
+ *
+ * Copyright (c) 2016, 2017, 2018 FabricMC
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package net.fabricmc.loom
+
+import net.fabricmc.loom.util.ProjectTestTrait
+import spock.lang.Specification
+import spock.lang.Unroll
+
+import static org.gradle.testkit.runner.TaskOutcome.SUCCESS
+
+// This test uses gradle 4.9 and 1.14.4 v1 mappings
+class LegacyProjectTest extends Specification implements ProjectTestTrait {
+ @Override
+ String name() {
+ "legacy"
+ }
+
+ @Unroll
+ def "build"() {
+ when:
+ def result = create("build", "4.9")
+ then:
+ result.task(":build").outcome == SUCCESS
+ }
+
+ @Override
+ String warningMode() {
+ // Gradle 4.9 doesnt support fail, and well this is a legacy test so deprecations are expected
+ 'all'
+ }
+}
diff --git a/src/test/groovy/net/fabricmc/loom/MixinBuildFunctionalTest.groovy b/src/test/groovy/net/fabricmc/loom/MixinBuildFunctionalTest.groovy
deleted file mode 100644
index b40a2ba7..00000000
--- a/src/test/groovy/net/fabricmc/loom/MixinBuildFunctionalTest.groovy
+++ /dev/null
@@ -1,69 +0,0 @@
-package net.fabricmc.loom
-
-import org.gradle.testkit.runner.GradleRunner
-import org.junit.Rule
-import org.junit.rules.TemporaryFolder
-import spock.lang.Ignore
-import spock.lang.Specification
-import spock.lang.Unroll
-
-import static net.fabricmc.loom.BuildUtils.*
-import static org.gradle.testkit.runner.TaskOutcome.SUCCESS
-
-/**
- * Created by Mitchell Skaggs on 6/10/2019.
- */
-class MixinBuildFunctionalTest extends Specification {
- @Rule
- TemporaryFolder testProjectDir = new TemporaryFolder()
- File settingsFile
- File buildFile
- File propsFile
- File modJsonFile
- File modJavaFile
- File modMixinsJsonFile
- File modMixinsJavaFile
-
- def setup() {
- settingsFile = testProjectDir.newFile('settings.gradle')
- buildFile = testProjectDir.newFile('build.gradle')
- propsFile = testProjectDir.newFile('gradle.properties')
-
- testProjectDir.newFolder("src", "main", "resources")
- modJsonFile = testProjectDir.newFile('src/main/resources/fabric.mod.json')
- modMixinsJsonFile = testProjectDir.newFile('src/main/resources/modid.mixins.json')
-
- testProjectDir.newFolder("src", "main", "java", "net", "fabricmc", "example")
- modJavaFile = testProjectDir.newFile("src/main/java/net/fabricmc/example/ExampleMod.java")
-
- testProjectDir.newFolder("src", "main", "java", "net", "fabricmc", "example", "mixin")
- modMixinsJavaFile = testProjectDir.newFile("src/main/java/net/fabricmc/example/mixin/ExampleMixin.java")
- }
-
- @Unroll
- def "mixin build succeeds using Minecraft #mcVersion"() {
- given:
- settingsFile << genSettingsFile("mixin-build-functional-test")
- propsFile << genPropsFile(mcVersion, yarnVersion, loaderVersion, fabricVersion)
- buildFile << genBuildFile()
- modJsonFile << genModJsonFile()
- modJavaFile << genModJavaFile()
- modMixinsJsonFile << genModMixinsJsonFile()
- modMixinsJavaFile << genModMixinsJavaFile()
-
- when:
- def result = GradleRunner.create()
- .withProjectDir(testProjectDir.root)
- .withArguments('build','--stacktrace', "--warning-mode", System.getenv().TEST_WARNING_MODE ?: 'all')
- .withPluginClasspath()
- .forwardOutput()
- .build()
-
- then:
- result.task(":build").outcome == SUCCESS
-
- where:
- mcVersion | yarnVersion | loaderVersion | fabricVersion
- '1.14' | '1.14+build.21' | '0.4.8+build.155' | '0.3.0+build.184'
- }
-}
diff --git a/src/test/groovy/net/fabricmc/loom/MojangMappingsProjectTest.groovy b/src/test/groovy/net/fabricmc/loom/MojangMappingsProjectTest.groovy
new file mode 100644
index 00000000..dd8a9808
--- /dev/null
+++ b/src/test/groovy/net/fabricmc/loom/MojangMappingsProjectTest.groovy
@@ -0,0 +1,50 @@
+/*
+ * This file is part of fabric-loom, licensed under the MIT License (MIT).
+ *
+ * Copyright (c) 2016, 2017, 2018 FabricMC
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package net.fabricmc.loom
+
+import net.fabricmc.loom.util.ProjectTestTrait
+import spock.lang.Specification
+import spock.lang.Unroll
+
+import static org.gradle.testkit.runner.TaskOutcome.SUCCESS
+
+class MojangMappingsProjectTest extends Specification implements ProjectTestTrait {
+ @Override
+ String name() {
+ "mojangMappings"
+ }
+
+ @Unroll
+ def "build (gradle #gradle)"() {
+ when:
+ def result = create("build", gradle)
+ then:
+ result.task(":build").outcome == SUCCESS
+ where:
+ gradle | _
+ '6.8.3' | _
+ '7.0-milestone-2' | _
+ }
+}
diff --git a/src/test/groovy/net/fabricmc/loom/ReproducibleBuildTest.groovy b/src/test/groovy/net/fabricmc/loom/ReproducibleBuildTest.groovy
new file mode 100644
index 00000000..b33f8949
--- /dev/null
+++ b/src/test/groovy/net/fabricmc/loom/ReproducibleBuildTest.groovy
@@ -0,0 +1,70 @@
+/*
+ * This file is part of fabric-loom, licensed under the MIT License (MIT).
+ *
+ * Copyright (c) 2016, 2017, 2018 FabricMC
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package net.fabricmc.loom
+
+import net.fabricmc.loom.util.ProjectTestTrait
+import spock.lang.Ignore
+import spock.lang.Specification
+import spock.lang.Unroll
+
+import java.security.DigestInputStream
+import java.security.MessageDigest
+
+import static org.gradle.testkit.runner.TaskOutcome.SUCCESS
+
+@Ignore //TODO this is currently failing!
+class ReproducibleBuildTest extends Specification implements ProjectTestTrait {
+ @Override
+ String name() {
+ "reproducible"
+ }
+
+ @Unroll
+ def "build (gradle #gradle)"() {
+ when:
+ def result = create("build", gradle)
+ then:
+ result.task(":build").outcome == SUCCESS
+ getOutputHash("fabric-example-mod-1.0.0.jar") == modHash
+ getOutputHash("fabric-example-mod-1.0.0-sources.jar") == sourceHash
+ where:
+ gradle | modHash | sourceHash
+ '6.8.3' | "e1beb19574f3446800e0a5e289121365" | "123"
+ '7.0-milestone-2' | "9759775e1f5440a18667c41cf1961908" | "123"
+ }
+
+ String getOutputHash(String name) {
+ generateMD5(getOutputFile(name))
+ }
+
+ String generateMD5(File file) {
+ file.withInputStream {
+ new DigestInputStream(it, MessageDigest.getInstance('MD5')).withStream {
+ it.eachByte {}
+ it.messageDigest.digest().encodeHex() as String
+ }
+ }
+ }
+}
diff --git a/src/test/groovy/net/fabricmc/loom/SimpleBuildFunctionalTest.groovy b/src/test/groovy/net/fabricmc/loom/SimpleBuildFunctionalTest.groovy
deleted file mode 100644
index 756a3faa..00000000
--- a/src/test/groovy/net/fabricmc/loom/SimpleBuildFunctionalTest.groovy
+++ /dev/null
@@ -1,62 +0,0 @@
-package net.fabricmc.loom
-
-import org.gradle.testkit.runner.GradleRunner
-import org.junit.Rule
-import org.junit.rules.TemporaryFolder
-import spock.lang.Specification
-import spock.lang.Unroll
-
-import static net.fabricmc.loom.BuildUtils.*
-import static org.gradle.testkit.runner.TaskOutcome.SUCCESS
-
-/**
- * Created by Mitchell Skaggs on 6/10/2019.
- */
-class SimpleBuildFunctionalTest extends Specification {
- @Rule
- TemporaryFolder testProjectDir = new TemporaryFolder()
- File settingsFile
- File buildFile
- File propsFile
- File modJsonFile
- File modExampleFile
-
- def setup() {
- settingsFile = testProjectDir.newFile('settings.gradle')
- buildFile = testProjectDir.newFile('build.gradle')
- propsFile = testProjectDir.newFile('gradle.properties')
-
- testProjectDir.newFolder("src", "main", "resources")
- modJsonFile = testProjectDir.newFile('src/main/resources/fabric.mod.json')
-
- testProjectDir.newFolder("src", "main", "java", "net", "fabricmc", "example")
- modExampleFile = testProjectDir.newFile("src/main/java/net/fabricmc/example/ExampleMod.java")
- }
-
- @Unroll
- def "simple build succeeds using Minecraft #mcVersion"() {
- given:
- settingsFile << genSettingsFile("simple-build-functional-test")
- propsFile << genPropsFile(mcVersion, yarnVersion, loaderVersion, fabricVersion)
- buildFile << genBuildFile()
- modJsonFile << genModJsonFile()
- modExampleFile << genModJavaFile()
-
- when:
- def result = GradleRunner.create()
- .withProjectDir(testProjectDir.root)
- .withArguments('build',"--stacktrace", "--warning-mode", System.getenv().TEST_WARNING_MODE ?: 'all')
- .withPluginClasspath()
- .forwardOutput()
- .withDebug(true)
- .build()
-
- then:
- result.task(":build").outcome == SUCCESS
-
- where:
- mcVersion | yarnVersion | loaderVersion | fabricVersion
- '19w45a' | '19w45a+build.2:v2' | '0.6.2+build.166' | '0.4.9+build.258-1.15'
- '1.14' | '1.14+build.21' | '0.4.8+build.155' | '0.3.0+build.184'
- }
-}
diff --git a/src/test/groovy/net/fabricmc/loom/SimpleProjectTest.groovy b/src/test/groovy/net/fabricmc/loom/SimpleProjectTest.groovy
new file mode 100644
index 00000000..6954b88d
--- /dev/null
+++ b/src/test/groovy/net/fabricmc/loom/SimpleProjectTest.groovy
@@ -0,0 +1,63 @@
+/*
+ * This file is part of fabric-loom, licensed under the MIT License (MIT).
+ *
+ * Copyright (c) 2016, 2017, 2018 FabricMC
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package net.fabricmc.loom
+
+import net.fabricmc.loom.util.ProjectTestTrait
+import spock.lang.Specification
+import spock.lang.Unroll
+
+import static org.gradle.testkit.runner.TaskOutcome.SUCCESS
+
+class SimpleProjectTest extends Specification implements ProjectTestTrait {
+ @Override
+ String name() {
+ "simple"
+ }
+
+ @Unroll
+ def "build (gradle #gradle)"() {
+ when:
+ def result = create("build", gradle)
+ then:
+ result.task(":build").outcome == SUCCESS
+ where:
+ gradle | _
+ '6.8.3' | _
+ '7.0-milestone-2' | _
+ }
+
+ @Unroll
+ def "#ide config generation"() {
+ when:
+ def result = create(ide)
+ then:
+ result.task(":${ide}").outcome == SUCCESS
+ where:
+ ide | _
+ 'idea' | _
+ 'eclipse' | _
+ 'vscode' | _
+ }
+}
diff --git a/src/test/groovy/net/fabricmc/loom/util/ArchiveAssertionsTrait.groovy b/src/test/groovy/net/fabricmc/loom/util/ArchiveAssertionsTrait.groovy
new file mode 100644
index 00000000..4225864e
--- /dev/null
+++ b/src/test/groovy/net/fabricmc/loom/util/ArchiveAssertionsTrait.groovy
@@ -0,0 +1,41 @@
+/*
+ * This file is part of fabric-loom, licensed under the MIT License (MIT).
+ *
+ * Copyright (c) 2016, 2017, 2018 FabricMC
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package net.fabricmc.loom.util
+
+import org.zeroturnaround.zip.ZipUtil
+
+trait ArchiveAssertionsTrait extends ProjectTestTrait {
+ String getArchiveEntry(String name, String entry) {
+ def file = getOutputFile(name)
+
+ def bytes = ZipUtil.unpackEntry(file, entry)
+
+ if (bytes == null) {
+ throw new FileNotFoundException("Could not find ${entry} in ${name}")
+ }
+
+ new String(bytes as byte[])
+ }
+} \ No newline at end of file
diff --git a/src/test/groovy/net/fabricmc/loom/util/ProjectTestTrait.groovy b/src/test/groovy/net/fabricmc/loom/util/ProjectTestTrait.groovy
new file mode 100644
index 00000000..7dfcac50
--- /dev/null
+++ b/src/test/groovy/net/fabricmc/loom/util/ProjectTestTrait.groovy
@@ -0,0 +1,97 @@
+/*
+ * This file is part of fabric-loom, licensed under the MIT License (MIT).
+ *
+ * Copyright (c) 2016, 2017, 2018 FabricMC
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package net.fabricmc.loom.util
+
+import org.gradle.testkit.runner.BuildResult
+import org.gradle.testkit.runner.GradleRunner
+import spock.lang.Shared
+
+trait ProjectTestTrait {
+ static File gradleHome = File.createTempDir()
+
+ File testProjectDir = File.createTempDir()
+
+ abstract String name()
+
+ @SuppressWarnings('unused')
+ def setup() {
+ def baseProjectDir = new File("src/test/resources/projects/" + name())
+
+ if (!baseProjectDir.exists()) {
+ throw new FileNotFoundException("Failed to find project directory at:" + baseProjectDir.absolutePath)
+ }
+
+ baseProjectDir.eachFileRecurse {file ->
+ if (file.isDirectory()) {
+ return
+ }
+
+ def path = file.path.replace(baseProjectDir.path, "")
+
+ File tempFile = new File(testProjectDir, path)
+ tempFile.parentFile.mkdirs()
+ tempFile << file.text
+ }
+
+ // Disable the CI checks to ensure nothing is skipped
+ System.setProperty("fabric.loom.ci", "false")
+ }
+
+ @SuppressWarnings('unused')
+ def cleanupSpec() {
+ testProjectDir.deleteDir()
+ gradleHome.deleteDir()
+ }
+
+ BuildResult create(String task, String gradleVersion = "6.8.3") {
+ GradleRunner.create()
+ .withProjectDir(testProjectDir)
+ .withArguments(task, "--stacktrace", "--warning-mode", warningMode(), "--gradle-user-home", gradleHomeDirectory(gradleVersion))
+ .withPluginClasspath()
+ .withGradleVersion(gradleVersion)
+ .forwardOutput()
+ .withDebug(true)
+ .build()
+ }
+
+ String warningMode() {
+ System.getenv().TEST_WARNING_MODE ?: 'all'
+ }
+
+ String gradleHomeDirectory(String gradleVersion) {
+ // Each gradle version gets its own dir to run on, to ensure that a full run is done.
+ new File(gradleHome, gradleVersion).absolutePath
+ }
+
+ File getOutputFile(String name) {
+ def file = new File(testProjectDir, "build/libs/" + name)
+
+ if (!file.exists()) {
+ throw new FileNotFoundException("Could not find ${name} at ${file.absolutePath}")
+ }
+
+ return file
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/accesswidener/expected.accesswidener b/src/test/resources/accesswidener/expected.accesswidener
new file mode 100644
index 00000000..80c2d801
--- /dev/null
+++ b/src/test/resources/accesswidener/expected.accesswidener
@@ -0,0 +1,7 @@
+accessWidener v1 intermediary
+accessible class net/minecraft/class_1928$class_5199
+accessible class net/minecraft/class_1928$class_4314
+extendable class net/minecraft/class_1928$class_4314
+accessible class net/minecraft/class_5235$class_5238
+accessible method net/minecraft/class_1928$class_4314 <init> (Ljava/util/function/Supplier;Ljava/util/function/Function;Ljava/util/function/BiConsumer;Lnet/minecraft/class_1928$class_5199;)V
+extendable method net/minecraft/class_1928$class_4314 <init> (Ljava/util/function/Supplier;Ljava/util/function/Function;Ljava/util/function/BiConsumer;Lnet/minecraft/class_1928$class_5199;)V
diff --git a/src/test/resources/projects/accesswidener/build.gradle b/src/test/resources/projects/accesswidener/build.gradle
new file mode 100644
index 00000000..42e0b4ec
--- /dev/null
+++ b/src/test/resources/projects/accesswidener/build.gradle
@@ -0,0 +1,96 @@
+plugins {
+ id 'fabric-loom'
+ id 'maven-publish'
+}
+
+sourceCompatibility = JavaVersion.VERSION_1_8
+targetCompatibility = JavaVersion.VERSION_1_8
+
+archivesBaseName = project.archives_base_name
+version = project.mod_version
+group = project.maven_group
+
+repositories {
+ // Add repositories to retrieve artifacts from in here.
+ // You should only use this when depending on other mods because
+ // Loom adds the essential maven repositories to download Minecraft and libraries from automatically.
+ // See https://docs.gradle.org/current/userguide/declaring_repositories.html
+ // for more information about repositories.
+}
+
+loom {
+ accessWidener = file("src/main/resources/modid.accesswidener")
+}
+
+dependencies {
+ // To change the versions see the gradle.properties file
+ minecraft "com.mojang:minecraft:${project.minecraft_version}"
+ mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
+ modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
+
+ // Fabric API. This is technically optional, but you probably want it anyway.
+ modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
+
+ // PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs.
+ // You may need to force-disable transitiveness on them.
+}
+
+processResources {
+ inputs.property "version", project.version
+
+ filesMatching("fabric.mod.json") {
+ expand "version": project.version
+ }
+}
+
+tasks.withType(JavaCompile).configureEach {
+ // ensure that the encoding is set to UTF-8, no matter what the system default is
+ // this fixes some edge cases with special characters not displaying correctly
+ // see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html
+ // If Javadoc is generated, this must be specified in that task too.
+ it.options.encoding = "UTF-8"
+
+ // The Minecraft launcher currently installs Java 8 for users, so your mod probably wants to target Java 8 too
+ // JDK 9 introduced a new way of specifying this that will make sure no newer classes or methods are used.
+ // We'll use that if it's available, but otherwise we'll use the older option.
+ def targetVersion = 8
+ if (JavaVersion.current().isJava9Compatible()) {
+ it.options.release = targetVersion
+ }
+}
+
+java {
+ // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
+ // if it is present.
+ // If you remove this line, sources will not be generated.
+ withSourcesJar()
+}
+
+jar {
+ from("LICENSE") {
+ rename { "${it}_${project.archivesBaseName}"}
+ }
+}
+
+// configure the maven publication
+publishing {
+ publications {
+ mavenJava(MavenPublication) {
+ // add all the jars that should be included when publishing to maven
+ artifact(remapJar) {
+ builtBy remapJar
+ }
+ artifact(sourcesJar) {
+ builtBy remapSourcesJar
+ }
+ }
+ }
+
+ // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
+ repositories {
+ // Add repositories to publish to here.
+ // Notice: This block does NOT have the same function as the block in the top level.
+ // The repositories here will be used for publishing your artifact, not for
+ // retrieving dependencies.
+ }
+}
diff --git a/src/test/resources/projects/accesswidener/gradle.properties b/src/test/resources/projects/accesswidener/gradle.properties
new file mode 100644
index 00000000..2e85dfd8
--- /dev/null
+++ b/src/test/resources/projects/accesswidener/gradle.properties
@@ -0,0 +1,17 @@
+# Done to increase the memory available to gradle.
+org.gradle.jvmargs=-Xmx1G
+
+# Fabric Properties
+ # check these on https://fabricmc.net/use
+ minecraft_version=1.16.5
+ yarn_mappings=1.16.5+build.5
+ loader_version=0.11.2
+
+# Mod Properties
+ mod_version = 1.0.0
+ maven_group = com.example
+ archives_base_name = fabric-example-mod
+
+# Dependencies
+ # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
+ fabric_version=0.31.0+1.16
diff --git a/src/test/resources/projects/accesswidener/settings.gradle b/src/test/resources/projects/accesswidener/settings.gradle
new file mode 100644
index 00000000..c162c363
--- /dev/null
+++ b/src/test/resources/projects/accesswidener/settings.gradle
@@ -0,0 +1,2 @@
+rootProject.name = "fabric-example-mod"
+
diff --git a/src/test/resources/projects/accesswidener/src/main/java/net/fabricmc/example/ExampleMod.java b/src/test/resources/projects/accesswidener/src/main/java/net/fabricmc/example/ExampleMod.java
new file mode 100644
index 00000000..e5ed082e
--- /dev/null
+++ b/src/test/resources/projects/accesswidener/src/main/java/net/fabricmc/example/ExampleMod.java
@@ -0,0 +1,14 @@
+package net.fabricmc.example;
+
+import net.fabricmc.api.ModInitializer;
+
+public class ExampleMod implements ModInitializer {
+ @Override
+ public void onInitialize() {
+ // This code runs as soon as Minecraft is in a mod-load-ready state.
+ // However, some things (like resources) may still be uninitialized.
+ // Proceed with mild caution.
+
+ System.out.println("Hello Fabric world!");
+ }
+}
diff --git a/src/test/resources/projects/accesswidener/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java b/src/test/resources/projects/accesswidener/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java
new file mode 100644
index 00000000..83ee1a89
--- /dev/null
+++ b/src/test/resources/projects/accesswidener/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java
@@ -0,0 +1,15 @@
+package net.fabricmc.example.mixin;
+
+import net.minecraft.client.gui.screen.TitleScreen;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(TitleScreen.class)
+public class ExampleMixin {
+ @Inject(at = @At("HEAD"), method = "init()V")
+ private void init(CallbackInfo info) {
+ System.out.println("This line is printed by an example mod mixin!");
+ }
+}
diff --git a/src/test/resources/projects/accesswidener/src/main/resources/fabric.mod.json b/src/test/resources/projects/accesswidener/src/main/resources/fabric.mod.json
new file mode 100644
index 00000000..27a8bdf7
--- /dev/null
+++ b/src/test/resources/projects/accesswidener/src/main/resources/fabric.mod.json
@@ -0,0 +1,37 @@
+{
+ "schemaVersion": 1,
+ "id": "modid",
+ "version": "${version}",
+
+ "name": "Example Mod",
+ "description": "This is an example description! Tell everyone what your mod is about!",
+ "authors": [
+ "Me!"
+ ],
+ "contact": {
+ "homepage": "https://fabricmc.net/",
+ "sources": "https://github.com/FabricMC/fabric-example-mod"
+ },
+
+ "license": "CC0-1.0",
+
+ "environment": "*",
+ "entrypoints": {
+ "main": [
+ "net.fabricmc.example.ExampleMod"
+ ]
+ },
+ "mixins": [
+ "modid.mixins.json"
+ ],
+
+ "depends": {
+ "fabricloader": ">=0.7.4",
+ "fabric": "*",
+ "minecraft": "1.16.x"
+ },
+ "suggests": {
+ "another-mod": "*"
+ },
+ "accessWidener" : "modid.accesswidener"
+}
diff --git a/src/test/resources/projects/accesswidener/src/main/resources/modid.accesswidener b/src/test/resources/projects/accesswidener/src/main/resources/modid.accesswidener
new file mode 100644
index 00000000..9f81b7f8
--- /dev/null
+++ b/src/test/resources/projects/accesswidener/src/main/resources/modid.accesswidener
@@ -0,0 +1,7 @@
+accessWidener v1 named
+
+accessible method net/minecraft/world/GameRules$Type <init> (Ljava/util/function/Supplier;Ljava/util/function/Function;Ljava/util/function/BiConsumer;Lnet/minecraft/world/GameRules$Acceptor;)V
+extendable method net/minecraft/world/GameRules$Type <init> (Ljava/util/function/Supplier;Ljava/util/function/Function;Ljava/util/function/BiConsumer;Lnet/minecraft/world/GameRules$Acceptor;)V
+
+accessible class net/minecraft/world/GameRules$Acceptor
+accessible class net/minecraft/client/gui/screen/world/EditGameRulesScreen$RuleWidgetFactory
diff --git a/src/test/resources/projects/accesswidener/src/main/resources/modid.mixins.json b/src/test/resources/projects/accesswidener/src/main/resources/modid.mixins.json
new file mode 100644
index 00000000..21fe73a4
--- /dev/null
+++ b/src/test/resources/projects/accesswidener/src/main/resources/modid.mixins.json
@@ -0,0 +1,14 @@
+{
+ "required": true,
+ "minVersion": "0.8",
+ "package": "net.fabricmc.example.mixin",
+ "compatibilityLevel": "JAVA_8",
+ "mixins": [
+ ],
+ "client": [
+ "ExampleMixin"
+ ],
+ "injectors": {
+ "defaultRequire": 1
+ }
+}
diff --git a/src/test/resources/projects/kotlin/build.gradle.kts b/src/test/resources/projects/kotlin/build.gradle.kts
new file mode 100644
index 00000000..5330c341
--- /dev/null
+++ b/src/test/resources/projects/kotlin/build.gradle.kts
@@ -0,0 +1,20 @@
+import java.util.Properties
+
+plugins {
+ kotlin("jvm") version "1.4.31"
+ id("fabric-loom")
+}
+
+java {
+ sourceCompatibility = JavaVersion.VERSION_1_8
+ targetCompatibility = JavaVersion.VERSION_1_8
+}
+
+version = "0.0.1"
+
+dependencies {
+ minecraft(group = "com.mojang", name = "minecraft", version = "1.16.5")
+ mappings(group = "net.fabricmc", name = "yarn", version = "1.16.5+build.5", classifier = "v2")
+ modImplementation("net.fabricmc:fabric-loader:0.11.2")
+ modImplementation(group = "net.fabricmc", name = "fabric-language-kotlin", version = "1.5.0+kotlin.1.4.31")
+} \ No newline at end of file
diff --git a/src/test/resources/projects/kotlin/settings.gradle b/src/test/resources/projects/kotlin/settings.gradle
new file mode 100644
index 00000000..c162c363
--- /dev/null
+++ b/src/test/resources/projects/kotlin/settings.gradle
@@ -0,0 +1,2 @@
+rootProject.name = "fabric-example-mod"
+
diff --git a/src/test/resources/projects/kotlin/src/main/kotlin/net/fabricmc/language/kotlin/TestModClass.kt b/src/test/resources/projects/kotlin/src/main/kotlin/net/fabricmc/language/kotlin/TestModClass.kt
new file mode 100644
index 00000000..5213187f
--- /dev/null
+++ b/src/test/resources/projects/kotlin/src/main/kotlin/net/fabricmc/language/kotlin/TestModClass.kt
@@ -0,0 +1,15 @@
+package net.fabricmc.language.kotlin
+
+import net.fabricmc.api.ModInitializer
+import org.apache.logging.log4j.LogManager
+
+class TestModClass : ModInitializer {
+
+ val logger = LogManager.getFormatterLogger("KotlinLanguageTest")
+
+ override fun onInitialize() {
+ logger.info("**************************")
+ logger.info("Hello from Kotlin TestModClass")
+ logger.info("**************************")
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/projects/kotlin/src/main/resources/fabric.mod.json b/src/test/resources/projects/kotlin/src/main/resources/fabric.mod.json
new file mode 100644
index 00000000..5618f96e
--- /dev/null
+++ b/src/test/resources/projects/kotlin/src/main/resources/fabric.mod.json
@@ -0,0 +1,33 @@
+{
+ "schemaVersion": 1,
+ "id": "modid",
+ "version": "${version}",
+
+ "name": "Example Mod",
+ "description": "This is an example description! Tell everyone what your mod is about!",
+ "authors": [
+ "Me!"
+ ],
+ "contact": {
+ "homepage": "https://fabricmc.net/",
+ "sources": "https://github.com/FabricMC/fabric-example-mod"
+ },
+
+ "license": "CC0-1.0",
+
+ "environment": "*",
+ "entrypoints": {
+ "main": [
+ "net.fabricmc.language.kotlin.TestModClass"
+ ]
+ },
+
+ "depends": {
+ "fabricloader": ">=0.7.4",
+ "fabric": "*",
+ "minecraft": "1.16.x"
+ },
+ "suggests": {
+ "another-mod": "*"
+ }
+}
diff --git a/src/test/resources/projects/legacy/build.gradle b/src/test/resources/projects/legacy/build.gradle
new file mode 100644
index 00000000..92e5147d
--- /dev/null
+++ b/src/test/resources/projects/legacy/build.gradle
@@ -0,0 +1,45 @@
+plugins {
+ id 'fabric-loom'
+}
+
+sourceCompatibility = JavaVersion.VERSION_1_8
+targetCompatibility = JavaVersion.VERSION_1_8
+
+archivesBaseName = project.archives_base_name
+version = project.mod_version
+group = project.maven_group
+
+dependencies {
+ minecraft "com.mojang:minecraft:${project.minecraft_version}"
+ mappings "net.fabricmc:yarn:${project.yarn_mappings}"
+ modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
+ modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
+}
+
+processResources {
+ inputs.property "version", project.version
+
+ from(sourceSets.main.resources.srcDirs) {
+ include "fabric.mod.json"
+ expand "version": project.version
+ }
+
+ from(sourceSets.main.resources.srcDirs) {
+ exclude "fabric.mod.json"
+ }
+}
+
+tasks.withType(JavaCompile) {
+ options.encoding = "UTF-8"
+}
+
+task sourcesJar(type: Jar, dependsOn: classes) {
+ classifier = "sources"
+ from sourceSets.main.allSource
+}
+
+jar {
+ from("LICENSE") {
+ rename { "${it}_${project.archivesBaseName}"}
+ }
+}
diff --git a/src/test/resources/projects/legacy/gradle.properties b/src/test/resources/projects/legacy/gradle.properties
new file mode 100644
index 00000000..440dabe5
--- /dev/null
+++ b/src/test/resources/projects/legacy/gradle.properties
@@ -0,0 +1,17 @@
+# Done to increase the memory available to gradle.
+org.gradle.jvmargs=-Xmx1G
+
+# Fabric Properties
+ # check these on https://fabricmc.net/use
+ minecraft_version=1.14.4
+ yarn_mappings=1.14.4+build.18
+ loader_version=0.11.2
+
+# Mod Properties
+ mod_version = 1.0.0
+ maven_group = com.example
+ archives_base_name = fabric-example-mod
+
+# Dependencies
+ # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
+ fabric_version=0.28.5+1.14
diff --git a/src/test/resources/projects/legacy/settings.gradle b/src/test/resources/projects/legacy/settings.gradle
new file mode 100644
index 00000000..c162c363
--- /dev/null
+++ b/src/test/resources/projects/legacy/settings.gradle
@@ -0,0 +1,2 @@
+rootProject.name = "fabric-example-mod"
+
diff --git a/src/test/resources/projects/legacy/src/main/java/net/fabricmc/example/ExampleMod.java b/src/test/resources/projects/legacy/src/main/java/net/fabricmc/example/ExampleMod.java
new file mode 100644
index 00000000..e5ed082e
--- /dev/null
+++ b/src/test/resources/projects/legacy/src/main/java/net/fabricmc/example/ExampleMod.java
@@ -0,0 +1,14 @@
+package net.fabricmc.example;
+
+import net.fabricmc.api.ModInitializer;
+
+public class ExampleMod implements ModInitializer {
+ @Override
+ public void onInitialize() {
+ // This code runs as soon as Minecraft is in a mod-load-ready state.
+ // However, some things (like resources) may still be uninitialized.
+ // Proceed with mild caution.
+
+ System.out.println("Hello Fabric world!");
+ }
+}
diff --git a/src/test/resources/projects/legacy/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java b/src/test/resources/projects/legacy/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java
new file mode 100644
index 00000000..481e10e4
--- /dev/null
+++ b/src/test/resources/projects/legacy/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java
@@ -0,0 +1,15 @@
+package net.fabricmc.example.mixin;
+
+import net.minecraft.client.MinecraftClient;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(MinecraftClient.class)
+public class ExampleMixin {
+ @Inject(at = @At("HEAD"), method = "init()V")
+ private void init(CallbackInfo info) {
+ System.out.println("This line is printed by an example mod mixin!");
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/projects/legacy/src/main/resources/fabric.mod.json b/src/test/resources/projects/legacy/src/main/resources/fabric.mod.json
new file mode 100644
index 00000000..9c6ccfa9
--- /dev/null
+++ b/src/test/resources/projects/legacy/src/main/resources/fabric.mod.json
@@ -0,0 +1,36 @@
+{
+ "schemaVersion": 1,
+ "id": "modid",
+ "version": "${version}",
+
+ "name": "Example Mod",
+ "description": "This is an example description! Tell everyone what your mod is about!",
+ "authors": [
+ "Me!"
+ ],
+ "contact": {
+ "homepage": "https://fabricmc.net/",
+ "sources": "https://github.com/FabricMC/fabric-example-mod"
+ },
+
+ "license": "CC0-1.0",
+
+ "environment": "*",
+ "entrypoints": {
+ "main": [
+ "net.fabricmc.example.ExampleMod"
+ ]
+ },
+ "mixins": [
+ "modid.mixins.json"
+ ],
+
+ "depends": {
+ "fabricloader": ">=0.7.4",
+ "fabric": "*",
+ "minecraft": "1.16.x"
+ },
+ "suggests": {
+ "another-mod": "*"
+ }
+}
diff --git a/src/test/resources/projects/legacy/src/main/resources/modid.mixins.json b/src/test/resources/projects/legacy/src/main/resources/modid.mixins.json
new file mode 100644
index 00000000..21fe73a4
--- /dev/null
+++ b/src/test/resources/projects/legacy/src/main/resources/modid.mixins.json
@@ -0,0 +1,14 @@
+{
+ "required": true,
+ "minVersion": "0.8",
+ "package": "net.fabricmc.example.mixin",
+ "compatibilityLevel": "JAVA_8",
+ "mixins": [
+ ],
+ "client": [
+ "ExampleMixin"
+ ],
+ "injectors": {
+ "defaultRequire": 1
+ }
+}
diff --git a/src/test/resources/projects/mojangMappings/build.gradle b/src/test/resources/projects/mojangMappings/build.gradle
new file mode 100644
index 00000000..193627e9
--- /dev/null
+++ b/src/test/resources/projects/mojangMappings/build.gradle
@@ -0,0 +1,92 @@
+plugins {
+ id 'fabric-loom'
+ id 'maven-publish'
+}
+
+sourceCompatibility = JavaVersion.VERSION_1_8
+targetCompatibility = JavaVersion.VERSION_1_8
+
+archivesBaseName = project.archives_base_name
+version = project.mod_version
+group = project.maven_group
+
+repositories {
+ // Add repositories to retrieve artifacts from in here.
+ // You should only use this when depending on other mods because
+ // Loom adds the essential maven repositories to download Minecraft and libraries from automatically.
+ // See https://docs.gradle.org/current/userguide/declaring_repositories.html
+ // for more information about repositories.
+}
+
+dependencies {
+ // To change the versions see the gradle.properties file
+ minecraft "com.mojang:minecraft:${project.minecraft_version}"
+ mappings loom.officialMojangMappings()
+ modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
+
+ // Fabric API. This is technically optional, but you probably want it anyway.
+ modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
+
+ // PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs.
+ // You may need to force-disable transitiveness on them.
+}
+
+processResources {
+ inputs.property "version", project.version
+
+ filesMatching("fabric.mod.json") {
+ expand "version": project.version
+ }
+}
+
+tasks.withType(JavaCompile).configureEach {
+ // ensure that the encoding is set to UTF-8, no matter what the system default is
+ // this fixes some edge cases with special characters not displaying correctly
+ // see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html
+ // If Javadoc is generated, this must be specified in that task too.
+ it.options.encoding = "UTF-8"
+
+ // The Minecraft launcher currently installs Java 8 for users, so your mod probably wants to target Java 8 too
+ // JDK 9 introduced a new way of specifying this that will make sure no newer classes or methods are used.
+ // We'll use that if it's available, but otherwise we'll use the older option.
+ def targetVersion = 8
+ if (JavaVersion.current().isJava9Compatible()) {
+ it.options.release = targetVersion
+ }
+}
+
+java {
+ // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
+ // if it is present.
+ // If you remove this line, sources will not be generated.
+ withSourcesJar()
+}
+
+jar {
+ from("LICENSE") {
+ rename { "${it}_${project.archivesBaseName}"}
+ }
+}
+
+// configure the maven publication
+publishing {
+ publications {
+ mavenJava(MavenPublication) {
+ // add all the jars that should be included when publishing to maven
+ artifact(remapJar) {
+ builtBy remapJar
+ }
+ artifact(sourcesJar) {
+ builtBy remapSourcesJar
+ }
+ }
+ }
+
+ // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
+ repositories {
+ // Add repositories to publish to here.
+ // Notice: This block does NOT have the same function as the block in the top level.
+ // The repositories here will be used for publishing your artifact, not for
+ // retrieving dependencies.
+ }
+}
diff --git a/src/test/resources/projects/mojangMappings/gradle.properties b/src/test/resources/projects/mojangMappings/gradle.properties
new file mode 100644
index 00000000..2e85dfd8
--- /dev/null
+++ b/src/test/resources/projects/mojangMappings/gradle.properties
@@ -0,0 +1,17 @@
+# Done to increase the memory available to gradle.
+org.gradle.jvmargs=-Xmx1G
+
+# Fabric Properties
+ # check these on https://fabricmc.net/use
+ minecraft_version=1.16.5
+ yarn_mappings=1.16.5+build.5
+ loader_version=0.11.2
+
+# Mod Properties
+ mod_version = 1.0.0
+ maven_group = com.example
+ archives_base_name = fabric-example-mod
+
+# Dependencies
+ # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
+ fabric_version=0.31.0+1.16
diff --git a/src/test/resources/projects/mojangMappings/settings.gradle b/src/test/resources/projects/mojangMappings/settings.gradle
new file mode 100644
index 00000000..c162c363
--- /dev/null
+++ b/src/test/resources/projects/mojangMappings/settings.gradle
@@ -0,0 +1,2 @@
+rootProject.name = "fabric-example-mod"
+
diff --git a/src/test/resources/projects/mojangMappings/src/main/java/net/fabricmc/example/ExampleMod.java b/src/test/resources/projects/mojangMappings/src/main/java/net/fabricmc/example/ExampleMod.java
new file mode 100644
index 00000000..e5ed082e
--- /dev/null
+++ b/src/test/resources/projects/mojangMappings/src/main/java/net/fabricmc/example/ExampleMod.java
@@ -0,0 +1,14 @@
+package net.fabricmc.example;
+
+import net.fabricmc.api.ModInitializer;
+
+public class ExampleMod implements ModInitializer {
+ @Override
+ public void onInitialize() {
+ // This code runs as soon as Minecraft is in a mod-load-ready state.
+ // However, some things (like resources) may still be uninitialized.
+ // Proceed with mild caution.
+
+ System.out.println("Hello Fabric world!");
+ }
+}
diff --git a/src/test/resources/projects/mojangMappings/src/main/resources/fabric.mod.json b/src/test/resources/projects/mojangMappings/src/main/resources/fabric.mod.json
new file mode 100644
index 00000000..f8af34f7
--- /dev/null
+++ b/src/test/resources/projects/mojangMappings/src/main/resources/fabric.mod.json
@@ -0,0 +1,33 @@
+{
+ "schemaVersion": 1,
+ "id": "modid",
+ "version": "${version}",
+
+ "name": "Example Mod",
+ "description": "This is an example description! Tell everyone what your mod is about!",
+ "authors": [
+ "Me!"
+ ],
+ "contact": {
+ "homepage": "https://fabricmc.net/",
+ "sources": "https://github.com/FabricMC/fabric-example-mod"
+ },
+
+ "license": "CC0-1.0",
+
+ "environment": "*",
+ "entrypoints": {
+ "main": [
+ "net.fabricmc.example.ExampleMod"
+ ]
+ },
+
+ "depends": {
+ "fabricloader": ">=0.7.4",
+ "fabric": "*",
+ "minecraft": "1.16.x"
+ },
+ "suggests": {
+ "another-mod": "*"
+ }
+}
diff --git a/src/test/resources/projects/reproducible/build.gradle b/src/test/resources/projects/reproducible/build.gradle
new file mode 100644
index 00000000..0fb0dc6f
--- /dev/null
+++ b/src/test/resources/projects/reproducible/build.gradle
@@ -0,0 +1,51 @@
+plugins {
+ id 'fabric-loom'
+ id 'maven-publish'
+}
+
+sourceCompatibility = JavaVersion.VERSION_1_8
+targetCompatibility = JavaVersion.VERSION_1_8
+
+archivesBaseName = project.archives_base_name
+version = project.mod_version
+group = project.maven_group
+
+dependencies {
+ minecraft "com.mojang:minecraft:${project.minecraft_version}"
+ mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
+ modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
+ modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
+}
+
+processResources {
+ inputs.property "version", project.version
+
+ filesMatching("fabric.mod.json") {
+ expand "version": project.version
+ }
+}
+
+tasks.withType(JavaCompile).configureEach {
+ it.options.encoding = "UTF-8"
+
+ def targetVersion = 8
+ if (JavaVersion.current().isJava9Compatible()) {
+ it.options.release = targetVersion
+ }
+}
+
+java {
+ withSourcesJar()
+}
+
+jar {
+ from("LICENSE") {
+ rename { "${it}_${project.archivesBaseName}"}
+ }
+}
+
+// Make Jars Reproducible
+tasks.withType(AbstractArchiveTask) {
+ preserveFileTimestamps = false
+ reproducibleFileOrder = true
+} \ No newline at end of file
diff --git a/src/test/resources/projects/reproducible/gradle.properties b/src/test/resources/projects/reproducible/gradle.properties
new file mode 100644
index 00000000..2e85dfd8
--- /dev/null
+++ b/src/test/resources/projects/reproducible/gradle.properties
@@ -0,0 +1,17 @@
+# Done to increase the memory available to gradle.
+org.gradle.jvmargs=-Xmx1G
+
+# Fabric Properties
+ # check these on https://fabricmc.net/use
+ minecraft_version=1.16.5
+ yarn_mappings=1.16.5+build.5
+ loader_version=0.11.2
+
+# Mod Properties
+ mod_version = 1.0.0
+ maven_group = com.example
+ archives_base_name = fabric-example-mod
+
+# Dependencies
+ # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
+ fabric_version=0.31.0+1.16
diff --git a/src/test/resources/projects/reproducible/settings.gradle b/src/test/resources/projects/reproducible/settings.gradle
new file mode 100644
index 00000000..c162c363
--- /dev/null
+++ b/src/test/resources/projects/reproducible/settings.gradle
@@ -0,0 +1,2 @@
+rootProject.name = "fabric-example-mod"
+
diff --git a/src/test/resources/projects/reproducible/src/main/java/net/fabricmc/example/ExampleMod.java b/src/test/resources/projects/reproducible/src/main/java/net/fabricmc/example/ExampleMod.java
new file mode 100644
index 00000000..e5ed082e
--- /dev/null
+++ b/src/test/resources/projects/reproducible/src/main/java/net/fabricmc/example/ExampleMod.java
@@ -0,0 +1,14 @@
+package net.fabricmc.example;
+
+import net.fabricmc.api.ModInitializer;
+
+public class ExampleMod implements ModInitializer {
+ @Override
+ public void onInitialize() {
+ // This code runs as soon as Minecraft is in a mod-load-ready state.
+ // However, some things (like resources) may still be uninitialized.
+ // Proceed with mild caution.
+
+ System.out.println("Hello Fabric world!");
+ }
+}
diff --git a/src/test/resources/projects/reproducible/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java b/src/test/resources/projects/reproducible/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java
new file mode 100644
index 00000000..83ee1a89
--- /dev/null
+++ b/src/test/resources/projects/reproducible/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java
@@ -0,0 +1,15 @@
+package net.fabricmc.example.mixin;
+
+import net.minecraft.client.gui.screen.TitleScreen;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(TitleScreen.class)
+public class ExampleMixin {
+ @Inject(at = @At("HEAD"), method = "init()V")
+ private void init(CallbackInfo info) {
+ System.out.println("This line is printed by an example mod mixin!");
+ }
+}
diff --git a/src/test/resources/projects/reproducible/src/main/resources/fabric.mod.json b/src/test/resources/projects/reproducible/src/main/resources/fabric.mod.json
new file mode 100644
index 00000000..9c6ccfa9
--- /dev/null
+++ b/src/test/resources/projects/reproducible/src/main/resources/fabric.mod.json
@@ -0,0 +1,36 @@
+{
+ "schemaVersion": 1,
+ "id": "modid",
+ "version": "${version}",
+
+ "name": "Example Mod",
+ "description": "This is an example description! Tell everyone what your mod is about!",
+ "authors": [
+ "Me!"
+ ],
+ "contact": {
+ "homepage": "https://fabricmc.net/",
+ "sources": "https://github.com/FabricMC/fabric-example-mod"
+ },
+
+ "license": "CC0-1.0",
+
+ "environment": "*",
+ "entrypoints": {
+ "main": [
+ "net.fabricmc.example.ExampleMod"
+ ]
+ },
+ "mixins": [
+ "modid.mixins.json"
+ ],
+
+ "depends": {
+ "fabricloader": ">=0.7.4",
+ "fabric": "*",
+ "minecraft": "1.16.x"
+ },
+ "suggests": {
+ "another-mod": "*"
+ }
+}
diff --git a/src/test/resources/projects/reproducible/src/main/resources/modid.mixins.json b/src/test/resources/projects/reproducible/src/main/resources/modid.mixins.json
new file mode 100644
index 00000000..21fe73a4
--- /dev/null
+++ b/src/test/resources/projects/reproducible/src/main/resources/modid.mixins.json
@@ -0,0 +1,14 @@
+{
+ "required": true,
+ "minVersion": "0.8",
+ "package": "net.fabricmc.example.mixin",
+ "compatibilityLevel": "JAVA_8",
+ "mixins": [
+ ],
+ "client": [
+ "ExampleMixin"
+ ],
+ "injectors": {
+ "defaultRequire": 1
+ }
+}
diff --git a/src/test/resources/projects/simple/build.gradle b/src/test/resources/projects/simple/build.gradle
new file mode 100644
index 00000000..771502c4
--- /dev/null
+++ b/src/test/resources/projects/simple/build.gradle
@@ -0,0 +1,92 @@
+plugins {
+ id 'fabric-loom'
+ id 'maven-publish'
+}
+
+sourceCompatibility = JavaVersion.VERSION_1_8
+targetCompatibility = JavaVersion.VERSION_1_8
+
+archivesBaseName = project.archives_base_name
+version = project.mod_version
+group = project.maven_group
+
+repositories {
+ // Add repositories to retrieve artifacts from in here.
+ // You should only use this when depending on other mods because
+ // Loom adds the essential maven repositories to download Minecraft and libraries from automatically.
+ // See https://docs.gradle.org/current/userguide/declaring_repositories.html
+ // for more information about repositories.
+}
+
+dependencies {
+ // To change the versions see the gradle.properties file
+ minecraft "com.mojang:minecraft:${project.minecraft_version}"
+ mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
+ modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
+
+ // Fabric API. This is technically optional, but you probably want it anyway.
+ modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
+
+ // PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs.
+ // You may need to force-disable transitiveness on them.
+}
+
+processResources {
+ inputs.property "version", project.version
+
+ filesMatching("fabric.mod.json") {
+ expand "version": project.version
+ }
+}
+
+tasks.withType(JavaCompile).configureEach {
+ // ensure that the encoding is set to UTF-8, no matter what the system default is
+ // this fixes some edge cases with special characters not displaying correctly
+ // see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html
+ // If Javadoc is generated, this must be specified in that task too.
+ it.options.encoding = "UTF-8"
+
+ // The Minecraft launcher currently installs Java 8 for users, so your mod probably wants to target Java 8 too
+ // JDK 9 introduced a new way of specifying this that will make sure no newer classes or methods are used.
+ // We'll use that if it's available, but otherwise we'll use the older option.
+ def targetVersion = 8
+ if (JavaVersion.current().isJava9Compatible()) {
+ it.options.release = targetVersion
+ }
+}
+
+java {
+ // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
+ // if it is present.
+ // If you remove this line, sources will not be generated.
+ withSourcesJar()
+}
+
+jar {
+ from("LICENSE") {
+ rename { "${it}_${project.archivesBaseName}"}
+ }
+}
+
+// configure the maven publication
+publishing {
+ publications {
+ mavenJava(MavenPublication) {
+ // add all the jars that should be included when publishing to maven
+ artifact(remapJar) {
+ builtBy remapJar
+ }
+ artifact(sourcesJar) {
+ builtBy remapSourcesJar
+ }
+ }
+ }
+
+ // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
+ repositories {
+ // Add repositories to publish to here.
+ // Notice: This block does NOT have the same function as the block in the top level.
+ // The repositories here will be used for publishing your artifact, not for
+ // retrieving dependencies.
+ }
+}
diff --git a/src/test/resources/projects/simple/gradle.properties b/src/test/resources/projects/simple/gradle.properties
new file mode 100644
index 00000000..2e85dfd8
--- /dev/null
+++ b/src/test/resources/projects/simple/gradle.properties
@@ -0,0 +1,17 @@
+# Done to increase the memory available to gradle.
+org.gradle.jvmargs=-Xmx1G
+
+# Fabric Properties
+ # check these on https://fabricmc.net/use
+ minecraft_version=1.16.5
+ yarn_mappings=1.16.5+build.5
+ loader_version=0.11.2
+
+# Mod Properties
+ mod_version = 1.0.0
+ maven_group = com.example
+ archives_base_name = fabric-example-mod
+
+# Dependencies
+ # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
+ fabric_version=0.31.0+1.16
diff --git a/src/test/resources/projects/simple/settings.gradle b/src/test/resources/projects/simple/settings.gradle
new file mode 100644
index 00000000..c162c363
--- /dev/null
+++ b/src/test/resources/projects/simple/settings.gradle
@@ -0,0 +1,2 @@
+rootProject.name = "fabric-example-mod"
+
diff --git a/src/test/resources/projects/simple/src/main/java/net/fabricmc/example/ExampleMod.java b/src/test/resources/projects/simple/src/main/java/net/fabricmc/example/ExampleMod.java
new file mode 100644
index 00000000..e5ed082e
--- /dev/null
+++ b/src/test/resources/projects/simple/src/main/java/net/fabricmc/example/ExampleMod.java
@@ -0,0 +1,14 @@
+package net.fabricmc.example;
+
+import net.fabricmc.api.ModInitializer;
+
+public class ExampleMod implements ModInitializer {
+ @Override
+ public void onInitialize() {
+ // This code runs as soon as Minecraft is in a mod-load-ready state.
+ // However, some things (like resources) may still be uninitialized.
+ // Proceed with mild caution.
+
+ System.out.println("Hello Fabric world!");
+ }
+}
diff --git a/src/test/resources/projects/simple/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java b/src/test/resources/projects/simple/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java
new file mode 100644
index 00000000..83ee1a89
--- /dev/null
+++ b/src/test/resources/projects/simple/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java
@@ -0,0 +1,15 @@
+package net.fabricmc.example.mixin;
+
+import net.minecraft.client.gui.screen.TitleScreen;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(TitleScreen.class)
+public class ExampleMixin {
+ @Inject(at = @At("HEAD"), method = "init()V")
+ private void init(CallbackInfo info) {
+ System.out.println("This line is printed by an example mod mixin!");
+ }
+}
diff --git a/src/test/resources/projects/simple/src/main/resources/fabric.mod.json b/src/test/resources/projects/simple/src/main/resources/fabric.mod.json
new file mode 100644
index 00000000..9c6ccfa9
--- /dev/null
+++ b/src/test/resources/projects/simple/src/main/resources/fabric.mod.json
@@ -0,0 +1,36 @@
+{
+ "schemaVersion": 1,
+ "id": "modid",
+ "version": "${version}",
+
+ "name": "Example Mod",
+ "description": "This is an example description! Tell everyone what your mod is about!",
+ "authors": [
+ "Me!"
+ ],
+ "contact": {
+ "homepage": "https://fabricmc.net/",
+ "sources": "https://github.com/FabricMC/fabric-example-mod"
+ },
+
+ "license": "CC0-1.0",
+
+ "environment": "*",
+ "entrypoints": {
+ "main": [
+ "net.fabricmc.example.ExampleMod"
+ ]
+ },
+ "mixins": [
+ "modid.mixins.json"
+ ],
+
+ "depends": {
+ "fabricloader": ">=0.7.4",
+ "fabric": "*",
+ "minecraft": "1.16.x"
+ },
+ "suggests": {
+ "another-mod": "*"
+ }
+}
diff --git a/src/test/resources/projects/simple/src/main/resources/modid.mixins.json b/src/test/resources/projects/simple/src/main/resources/modid.mixins.json
new file mode 100644
index 00000000..21fe73a4
--- /dev/null
+++ b/src/test/resources/projects/simple/src/main/resources/modid.mixins.json
@@ -0,0 +1,14 @@
+{
+ "required": true,
+ "minVersion": "0.8",
+ "package": "net.fabricmc.example.mixin",
+ "compatibilityLevel": "JAVA_8",
+ "mixins": [
+ ],
+ "client": [
+ "ExampleMixin"
+ ],
+ "injectors": {
+ "defaultRequire": 1
+ }
+}