Skip to content

Commit

Permalink
Add event support for GameTests and add an item capability test
Browse files Browse the repository at this point in the history
  • Loading branch information
jaredlll08 committed Jul 27, 2022
1 parent aede630 commit e59ffea
Show file tree
Hide file tree
Showing 13 changed files with 250 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
DataVersion: 2975,
size: [1, 2, 1],
data: [
{pos: [0, 0, 0], state: "minecraft:polished_andesite"},
{pos: [0, 1, 0], state: "minecraft:chest{facing:east,type:single,waterlogged:false}", nbt: {Items: [{Count: 2b, Slot: 2b, id: "minecraft:diamond"}], id: "minecraft:chest"}}
],
entities: [],
palette: [
"minecraft:polished_andesite",
"minecraft:chest{facing:east,type:single,waterlogged:false}"
]
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.blamejared.crafttweaker.gametest.logger.appender;

import com.blamejared.crafttweaker.CraftTweakerCommon;
import com.blamejared.crafttweaker.api.CraftTweakerAPI;
import net.minecraft.gametest.framework.GameTestAssertException;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.*;
Expand Down Expand Up @@ -29,7 +30,8 @@ protected GameTestLoggerAppender(String name, Filter filter, Layout<? extends Se
@Override
public void append(LogEvent event) {

final String message = ((PatternLayout) getLayout()).toSerializable(event).replaceAll(System.lineSeparator(), "");
final String message = ((PatternLayout) getLayout()).toSerializable(event)
.replaceAll(System.lineSeparator(), "");

messages.add(new LogMessage(message, event.getLevel()));
}
Expand Down Expand Up @@ -94,7 +96,9 @@ public void assertOutputContains(int index, String message) {

public void dump() {

this.log.forEach(CraftTweakerCommon.LOG::info);
for(int i = 0; i < this.log.size(); i++) {
CraftTweakerCommon.LOG.info("{}: '{}'", i, this.log.get(i));
}
}

}
Expand Down
1 change: 1 addition & 0 deletions Forge/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ dependencies {
implementation(fg.deobf("mezz.jei:jei-1.18.2:9.7.0.229"))
annotationProcessor("org.spongepowered:mixin:0.8.5-SNAPSHOT:processor")

gametestCompileOnly(project(":Common"))
gametestCompileOnly(files(project(":Common").dependencyProject.sourceSets.gametest.get().java.srcDirs))
(project.ext["zenCodeTestDeps"] as Set<*>).forEach {
gametestImplementation(project(it.toString()).dependencyProject.sourceSets.test.get().output)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.blamejared.crafttweaker.gametest.api.event;

import com.blamejared.crafttweaker.api.action.base.IUndoableAction;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.Event;
import net.minecraftforge.eventbus.api.EventPriority;

import java.util.function.Consumer;

public class ActionRegisterTestEvent<T extends Event> implements IUndoableAction {

private final Class<T> typeOfT;
private final Consumer<T> consumer;
private final EventPriority priority;

public ActionRegisterTestEvent(Class<T> typeOfT, Consumer<T> consumer, EventPriority priority) {

this.typeOfT = typeOfT;
this.consumer = new TestEventHandlerWrapper<>(consumer);
this.priority = priority;
}

@Override
public void apply() {

MinecraftForge.EVENT_BUS.addListener(priority, false, typeOfT, consumer);
}

@Override
public String describe() {

return "Registering test event listener for " + typeOfT.getSimpleName() + ".";
}

@Override
public void undo() {

}

@Override
public String describeUndo() {

return "null";
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.blamejared.crafttweaker.gametest.api.event;

import com.blamejared.crafttweaker.api.CraftTweakerAPI;
import com.blamejared.crafttweaker.api.action.event.ActionRegisterEvent;
import com.blamejared.crafttweaker.api.annotation.ZenRegister;
import net.minecraftforge.eventbus.api.Event;
import net.minecraftforge.eventbus.api.EventPriority;
import org.openzen.zencode.java.ZenCodeType;

import java.util.function.Consumer;

@ZenRegister
@ZenCodeType.Name("crafttweaker.api.events.CTTestEventManager")
public class CTTestEventManager {

@ZenCodeType.Method
public static <T extends Event> void register(Class<T> typeOfT, Consumer<T> consumer) {

register(typeOfT, EventPriority.NORMAL, consumer);
}

@ZenCodeType.Method
public static <T extends Event> void register(Class<T> typeOfT, EventPriority priority, Consumer<T> consumer) {

CraftTweakerAPI.apply(new ActionRegisterTestEvent<>(typeOfT, consumer, priority));
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.blamejared.crafttweaker.gametest.api.event;

import com.blamejared.crafttweaker.api.annotation.ZenRegister;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraftforge.eventbus.api.Event;
import org.openzen.zencode.java.ZenCodeType;

@ZenRegister
@ZenCodeType.Name("test.api.TestEvent")
public class TestEvent extends Event {

private final String testName;
private final Level level;
private final BlockPos pos;
private final Player player;

public TestEvent(String testName, Level level, BlockPos pos, Player player) {

this.testName = testName;
this.level = level;
this.pos = pos;
this.player = player;
}

@ZenCodeType.Method
@ZenCodeType.Getter("testName")
public String testName() {

return testName;
}

@ZenCodeType.Method
@ZenCodeType.Getter("level")
public Level level() {

return level;
}

@ZenCodeType.Method
@ZenCodeType.Getter("pos")
public BlockPos pos() {

return pos;
}

@ZenCodeType.Method
@ZenCodeType.Getter("innerPos")
public BlockPos innerPos() {

return pos().above(2);
}

@ZenCodeType.Method
@ZenCodeType.Getter("player")
public Player player() {

return player;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.blamejared.crafttweaker.gametest.api.event;

import com.blamejared.crafttweaker.api.CraftTweakerAPI;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.Event;

import java.util.function.Consumer;

public class TestEventHandlerWrapper<T extends Event> implements Consumer<T> {

public TestEventHandlerWrapper(Consumer<T> consumer) {

this.consumer = consumer;
}

private final Consumer<T> consumer;

@Override
public void accept(T t) {

try {
consumer.accept(t);
} catch(Throwable throwable) {
CraftTweakerAPI.LOGGER.error("Error occurred in event handler", throwable);
}
MinecraftForge.EVENT_BUS.unregister(this);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.blamejared.crafttweaker.gametest.test.forge.capability;

import com.blamejared.crafttweaker.gametest.CraftTweakerGameTest;
import com.blamejared.crafttweaker.gametest.api.event.TestEvent;
import com.blamejared.crafttweaker.gametest.framework.ScriptBuilder;
import com.blamejared.crafttweaker.gametest.framework.annotation.CraftTweakerGameTestHolder;
import com.blamejared.crafttweaker.gametest.framework.annotation.TestModifier;
import com.blamejared.crafttweaker.gametest.logger.appender.GameTestLoggerAppender;
import com.blamejared.crafttweaker.impl.script.scriptrun.GameTestScriptRunner;
import com.blamejared.crafttweaker.platform.Services;
import net.minecraft.core.BlockPos;
import net.minecraft.gametest.framework.GameTest;
import net.minecraft.gametest.framework.GameTestHelper;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraftforge.common.MinecraftForge;

@CraftTweakerGameTestHolder
public class ItemCapabilityTest implements CraftTweakerGameTest {

@GameTest(template = "crafttweaker:chest_with_item")
@TestModifier(implicitSuccession = true)
public void testItemHandler(GameTestHelper helper, ScriptBuilder builder) {

builder.file("capability/item_handler_test.zs");

GameTestLoggerAppender.QueryableLog log = GameTestScriptRunner.runScripts(helper, builder);
log.assertNoErrors();
log.assertNoWarnings();

MinecraftForge.EVENT_BUS.post(new TestEvent("testItemHandler", helper.getLevel(), helper.absolutePos(BlockPos.ZERO), helper.makeMockPlayer()));
log.assertOutput(3, Services.PLATFORM.createMCItemStack(new ItemStack(Items.DIAMOND, 2)).getCommandString());
log.assertOutput(4, Services.PLATFORM.createMCItemStack(new ItemStack(Items.DIRT)).getCommandString());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import crafttweaker.api.events.CTTestEventManager;
import test.api.TestEvent;
import crafttweaker.api.capability.IItemHandler;
import crafttweaker.api.capability.Capabilities;

println("running");
CTTestEventManager.register<TestEvent>((event) => {

var player = event.player;
var pos = event.innerPos;
var level = event.level;

if level.isClientSide { return; }

var blockEntity = level.getBlockEntity(pos);

if blockEntity != null {

var itemHandler = blockEntity.getCapability<IItemHandler>(Capabilities.ITEM);
if itemHandler != null {
println(itemHandler.getStackInSlot(2).commandString);
itemHandler.insertItem(1, <item:minecraft:dirt>, false);
println(itemHandler.getStackInSlot(1).commandString);
}
}

});
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public void accept(T t) {
try {
consumer.accept(t);
} catch(Throwable throwable) {
CraftTweakerAPI.LOGGER.error("Error occured in event handler", throwable);
CraftTweakerAPI.LOGGER.error("Error occurred in event handler", throwable);
}
}

Expand Down

0 comments on commit e59ffea

Please sign in to comment.