Skip to content

Commit 8e5a387

Browse files
Copilotrubensworks
andauthored
Add negative advancement game tests and fix craft_planks item predicate for MC 1.21 (#184)
* Initial plan * Add negative game tests for all advancements Co-authored-by: rubensworks <440384+rubensworks@users.noreply.github.com> * Fix craft_planks.json: use "items" instead of "item" for MC 1.21 item predicate format Co-authored-by: rubensworks <440384+rubensworks@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: rubensworks <440384+rubensworks@users.noreply.github.com>
1 parent 96a5d34 commit 8e5a387

2 files changed

Lines changed: 140 additions & 1 deletion

File tree

src/main/java/org/cyclops/integratedcrafting/gametest/GameTestsAdvancements.java

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import net.minecraft.advancements.AdvancementHolder;
44
import net.minecraft.core.BlockPos;
55
import net.minecraft.gametest.framework.GameTest;
6+
import net.minecraft.gametest.framework.GameTestAssertException;
67
import net.minecraft.gametest.framework.GameTestHelper;
78
import net.minecraft.nbt.Tag;
89
import net.minecraft.nbt.TagParser;
@@ -227,6 +228,144 @@ public void testAdvancementCraftPlanks(GameTestHelper helper) {
227228
});
228229
}
229230

231+
private static void assertAdvancementNotDone(GameTestHelper helper, ServerPlayer player, String id) {
232+
AdvancementHolder advancement = helper.getLevel().getServer().getAdvancements()
233+
.get(ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, id));
234+
if (advancement != null && player.getAdvancements().getOrStartProgress(advancement).isDone()) {
235+
throw new GameTestAssertException("Advancement should NOT have been obtained: " + Reference.MOD_ID + ":" + id);
236+
}
237+
}
238+
239+
/**
240+
* Negative test for the root advancement.
241+
* Trigger: minecraft:inventory_changed
242+
* Condition: player has integrateddynamics:variable in inventory
243+
* Here we add a stick instead – advancement must NOT be granted.
244+
*/
245+
@GameTest(template = TEMPLATE_EMPTY, timeoutTicks = TIMEOUT)
246+
public void testAdvancementRootNegative(GameTestHelper helper) {
247+
ServerPlayer player = helper.makeMockServerPlayerInLevel();
248+
249+
// Add a stick (not a variable) to the player's inventory
250+
player.getInventory().setItem(0, new ItemStack(Items.STICK));
251+
252+
helper.succeedWhen(() -> assertAdvancementNotDone(helper, player, "root"));
253+
}
254+
255+
/**
256+
* Negative test for the craft_crafting_interface advancement.
257+
* Trigger: cyclopscore:item_crafted
258+
* Condition: player crafts integratedcrafting:part_interface_crafting
259+
* Here we craft a stick instead – advancement must NOT be granted.
260+
*/
261+
@GameTest(template = TEMPLATE_EMPTY, timeoutTicks = TIMEOUT)
262+
public void testAdvancementCraftCraftingInterfaceNegative(GameTestHelper helper) {
263+
ServerPlayer player = helper.makeMockServerPlayerInLevel();
264+
265+
NeoForge.EVENT_BUS.post(new PlayerEvent.ItemCraftedEvent(
266+
player,
267+
new ItemStack(Items.STICK),
268+
new SimpleContainer(9)
269+
));
270+
271+
helper.succeedWhen(() -> assertAdvancementNotDone(helper, player, "autocrafting_setup/craft_crafting_interface"));
272+
}
273+
274+
/**
275+
* Negative test for the craft_crafting_interface_attuned advancement.
276+
* Trigger: cyclopscore:item_crafted
277+
* Condition: player crafts integratedcrafting:part_interface_crafting_attuned
278+
* Here we craft the non-attuned interface instead – advancement must NOT be granted.
279+
*/
280+
@GameTest(template = TEMPLATE_EMPTY, timeoutTicks = TIMEOUT)
281+
public void testAdvancementCraftCraftingInterfaceAttunedNegative(GameTestHelper helper) {
282+
ServerPlayer player = helper.makeMockServerPlayerInLevel();
283+
284+
NeoForge.EVENT_BUS.post(new PlayerEvent.ItemCraftedEvent(
285+
player,
286+
new ItemStack(PartTypes.INTERFACE_CRAFTING.getItem()),
287+
new SimpleContainer(9)
288+
));
289+
290+
helper.succeedWhen(() -> assertAdvancementNotDone(helper, player, "autocrafting_setup/craft_crafting_interface_attuned"));
291+
}
292+
293+
/**
294+
* Negative test for the craft_crafting_writer advancement.
295+
* Trigger: cyclopscore:item_crafted
296+
* Condition: player crafts integratedcrafting:part_crafting_writer
297+
* Here we craft a stick instead – advancement must NOT be granted.
298+
*/
299+
@GameTest(template = TEMPLATE_EMPTY, timeoutTicks = TIMEOUT)
300+
public void testAdvancementCraftCraftingWriterNegative(GameTestHelper helper) {
301+
ServerPlayer player = helper.makeMockServerPlayerInLevel();
302+
303+
NeoForge.EVENT_BUS.post(new PlayerEvent.ItemCraftedEvent(
304+
player,
305+
new ItemStack(Items.STICK),
306+
new SimpleContainer(9)
307+
));
308+
309+
helper.succeedWhen(() -> assertAdvancementNotDone(helper, player, "autocrafting_trigger/craft_crafting_writer"));
310+
}
311+
312+
/**
313+
* Negative test for the insert_recipe_planks advancement.
314+
* Trigger: integrateddynamics:part_variable_driven
315+
* Condition: crafting interface has an oak planks recipe variable
316+
* Here we fire the event with a wrong part type (crafting_writer) – advancement must NOT be granted.
317+
*/
318+
@GameTest(template = TEMPLATE_EMPTY, timeoutTicks = TIMEOUT)
319+
public void testAdvancementInsertRecipePlanksNegative(GameTestHelper helper) {
320+
ServerPlayer player = helper.makeMockServerPlayerInLevel();
321+
322+
Tag recipeTag;
323+
try {
324+
recipeTag =
325+
TagParser.parseTag(
326+
"{output:{\"minecraft:itemstack\":[{id:\"minecraft:oak_planks\",Count:4}]},"
327+
+ "input:{\"minecraft:itemstack\":[{val:[{condition:5,prototype:{id:\"minecraft:oak_log\",Count:1}}],type:0b}]}}");
328+
} catch (com.mojang.brigadier.exceptions.CommandSyntaxException e) {
329+
throw new RuntimeException(e);
330+
}
331+
IValue recipeValue =
332+
ValueHelpers.deserializeRaw(
333+
ValueDeseralizationContext.of(helper.getLevel()),
334+
ValueTypes.OBJECT_RECIPE,
335+
recipeTag);
336+
IVariable<?> variable = new Variable<>(recipeValue);
337+
338+
// Fire with wrong part type (crafting_writer instead of interface_crafting)
339+
NeoForge.EVENT_BUS.post(new PartVariableDrivenVariableContentsUpdatedEvent<>(
340+
null, null, null, PartTypes.CRAFTING_WRITER, null, player, variable, null));
341+
342+
helper.succeedWhen(() -> assertAdvancementNotDone(helper, player, "autocrafting_setup/insert_recipe_planks"));
343+
}
344+
345+
/**
346+
* Negative test for the craft_planks advancement.
347+
* Trigger: integrateddynamics:part_writer_aspect
348+
* Condition: crafting writer writes an oak_planks itemstack as the ITEMSTACK_CRAFT aspect
349+
* Here we place a stick variable in the writer instead – advancement must NOT be granted.
350+
*/
351+
@GameTest(template = TEMPLATE_EMPTY, timeoutTicks = TIMEOUT)
352+
public void testAdvancementCraftPlanksNegative(GameTestHelper helper) {
353+
GameTestHelpersIntegratedCrafting.INetworkPositions<PartTypeInterfaceCrafting.State> positions =
354+
createBasicNetwork(helper, POS);
355+
356+
// Place stick variable in the crafting writer instead of oak planks
357+
enableRecipeInWriter(helper, positions.writer(), new ItemStack(Items.STICK));
358+
359+
ServerPlayer player = helper.makeMockServerPlayerInLevel();
360+
361+
PartHelpers.PartStateHolder writerStateHolder = PartHelpers.getPart(positions.writer());
362+
IPartTypeWriter<?, ?> partTypeWriter = (IPartTypeWriter<?, ?>) writerStateHolder.getPart();
363+
IPartStateWriter<?> writerState = (IPartStateWriter<?>) writerStateHolder.getState();
364+
callUpdateActivationWithPlayer(partTypeWriter, writerState, positions.writer(), player);
365+
366+
helper.succeedWhen(() -> assertAdvancementNotDone(helper, player, "autocrafting_trigger/craft_planks"));
367+
}
368+
230369
@SuppressWarnings("unchecked")
231370
private static <P extends IPartTypeWriter<P, S>, S extends IPartStateWriter<P>> void callUpdateActivationWithPlayer(
232371
IPartTypeWriter<?, ?> partType, IPartStateWriter<?> partState, PartPos writerPos, ServerPlayer player) {

src/main/resources/data/integratedcrafting/advancement/autocrafting_trigger/craft_planks.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
"value": {
2323
"type": "itemstack",
2424
"item": {
25-
"item": "minecraft:oak_planks"
25+
"items": "minecraft:oak_planks"
2626
}
2727
}
2828
}

0 commit comments

Comments
 (0)