Skip to content

Commit

Permalink
Setup the test sourceset better when using split sources. (#1179)
Browse files Browse the repository at this point in the history
* Setup the test sourceset better when using split sources.

Fixes #1060

Also added a tool to extract test projects to make them easier to work on.

* Fix
  • Loading branch information
modmuss50 authored Sep 26, 2024
1 parent bc9ce58 commit 567f978
Show file tree
Hide file tree
Showing 6 changed files with 115 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,12 @@ private void evaluate(Project project) {
extendsFrom(project, clientOnlySourceSet.getCompileClasspathConfigurationName(), mainSourceSet.getCompileClasspathConfigurationName());
extendsFrom(project, clientOnlySourceSet.getRuntimeClasspathConfigurationName(), mainSourceSet.getRuntimeClasspathConfigurationName());

// Test source set depends on client
final SourceSet testSourceSet = SourceSetHelper.getSourceSetByName(SourceSet.TEST_SOURCE_SET_NAME, project);
extendsFrom(project, testSourceSet.getCompileClasspathConfigurationName(), clientOnlySourceSet.getCompileClasspathConfigurationName());
extendsFrom(project, testSourceSet.getRuntimeClasspathConfigurationName(), clientOnlySourceSet.getRuntimeClasspathConfigurationName());
project.getDependencies().add(testSourceSet.getImplementationConfigurationName(), clientOnlySourceSet.getOutput());

RemapConfigurations.configureClientConfigurations(project, clientOnlySourceSet);

// Include the client only output in the jars
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class SplitProjectTest extends Specification implements GradleProjectTestTrait {

then:
result.task(":build").outcome == SUCCESS
result.task(":test").outcome == SUCCESS

where:
version << STANDARD_TEST_VERSIONS
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/*
* This file is part of fabric-loom, licensed under the MIT License (MIT).
*
* Copyright (c) 2024 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.test.util

// A helper script to extract the test project from the resources and add the gradle wrapper
// Useful for testing an intergration test project in a real environment
class ExtractTestProject {
static void main(String[] args) {
if (args.length != 1) {
throw new IllegalArgumentException("Expected one argument: the project name")
}

def projectName = args[0]
def targetDirectory = new File("test/$projectName")
def sourceDirectory = new File("src/test/resources/projects/$projectName")

if (targetDirectory.exists()) {
targetDirectory.deleteDir()
}

copyDir(sourceDirectory, targetDirectory)
copyDir(new File("gradle"), new File(targetDirectory, "gradle"))
copyFile(new File("gradlew"), new File(targetDirectory, "gradlew"))
copyFile(new File("gradlew.bat"), new File(targetDirectory, "gradlew.bat"))

new File(targetDirectory, "settings.gradle").text = """
pluginManagement {
repositories {
maven {
name = 'Fabric'
url = 'https://maven.fabricmc.net/'
}
mavenCentral()
gradlePluginPortal()
mavenLocal()
}
}
"""

def buildGradle = new File(targetDirectory, "build.gradle")
buildGradle.text = buildGradle.text.replace("id 'fabric-loom'", "id 'fabric-loom' version '1.8.local'")
}

private static void copyDir(File source, File target) {
source.eachFileRecurse { file ->
if (file.isDirectory()) {
return
}

def relativePath = source.toPath().relativize(file.toPath())
def targetFile = new File(target, relativePath.toString())
copyFile(file, targetFile)
}
}

private static void copyFile(File source, File target) {
target.parentFile.mkdirs()
target.bytes = source.bytes
println("Copied $source to $target")
}
}
9 changes: 7 additions & 2 deletions src/test/resources/projects/splitSources/build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
plugins {
id 'fabric-loom' version '0.12.local'
id 'fabric-loom'
id 'maven-publish'
}

Expand All @@ -24,13 +24,18 @@ loom {
dependencies {
minecraft "com.mojang:minecraft:1.18.2"
mappings "net.fabricmc:yarn:1.18.2+build.1:v2"
modImplementation "net.fabricmc:fabric-loader:0.13.3"
modImplementation "net.fabricmc:fabric-loader:0.16.5"
testImplementation "net.fabricmc:fabric-loader-junit:0.16.5"

modImplementation "net.fabricmc.fabric-api:fabric-api:0.47.8+1.18.2"

shade "com.googlecode.json-simple:json-simple:1.1.1"
}

test {
useJUnitPlatform()
}

tasks.withType(JavaCompile).configureEach {
it.options.release = 17
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"required": true,
"minVersion": "0.8",
"package": "net.fabricmc.example.mixin",
"package": "net.fabricmc.example.client.mixin",
"compatibilityLevel": "JAVA_17",
"mixins": [
],
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package net.fabricmc.example.test;

import net.fabricmc.example.client.ExampleModClient;

import net.minecraft.client.MinecraftClient;
import org.junit.jupiter.api.Test;

public class ExampleModTest {
@Test
void testClientClass() {
// Check we can compile against our own client code
ExampleModClient exampleModClient = new ExampleModClient();

// And minecrafts client code
MinecraftClient client = null;
}
}

0 comments on commit 567f978

Please sign in to comment.