Skip to content

Commit 191618c

Browse files
fix(inventory): register close and open functions only when they are set (#67)
* fix(inventory): register close and open function only when the variable is set * test(inventory): add tests to verify open and close functions --------- Co-authored-by: theEvilReaper <theEvilReaper@users.noreply.github.com>
1 parent 0ac633d commit 191618c

2 files changed

Lines changed: 132 additions & 2 deletions

File tree

src/main/java/net/theevilreaper/aves/inventory/BaseInventoryBuilderImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ protected BaseInventoryBuilderImpl(@NotNull InventoryType type) {
4242
@Override
4343
public void register() {
4444
this.checkListenerState(this.openListener, this.closeListener, this.clickListener);
45-
if (this.openFunction == null) {
45+
if (this.openFunction != null) {
4646
this.openListener = registerOpen(this, holder);
4747
}
4848

49-
if (this.closeFunction == null) {
49+
if (this.closeFunction != null) {
5050
this.closeListener = registerClose(this, holder);
5151
}
5252

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package net.theevilreaper.aves.inventory;
2+
3+
import net.kyori.adventure.text.Component;
4+
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
5+
import net.minestom.server.entity.Player;
6+
import net.minestom.server.event.EventFilter;
7+
import net.minestom.server.event.inventory.InventoryCloseEvent;
8+
import net.minestom.server.event.inventory.InventoryOpenEvent;
9+
import net.minestom.server.instance.Instance;
10+
import net.minestom.server.inventory.InventoryType;
11+
import net.minestom.server.network.packet.server.play.SystemChatPacket;
12+
import net.minestom.testing.Collector;
13+
import net.minestom.testing.Env;
14+
import net.minestom.testing.TestConnection;
15+
import net.minestom.testing.extension.MicrotusExtension;
16+
import org.junit.jupiter.api.AfterEach;
17+
import org.junit.jupiter.api.BeforeEach;
18+
import org.junit.jupiter.api.Test;
19+
import org.junit.jupiter.api.extension.ExtendWith;
20+
21+
import static org.junit.jupiter.api.Assertions.assertEquals;
22+
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
23+
import static org.junit.jupiter.api.Assertions.assertNotNull;
24+
25+
@ExtendWith(MicrotusExtension.class)
26+
class BaseInventoryBuilderImplIntegrationTest {
27+
28+
private static final Component TITLE_COMPONENT = Component.text("Test");
29+
30+
private Instance instance;
31+
private TestConnection testConnection;
32+
private Player player;
33+
34+
@BeforeEach
35+
void setup(Env env) {
36+
instance = env.createFlatInstance();
37+
testConnection = env.createConnection();
38+
player = testConnection.connect(instance);
39+
}
40+
41+
@AfterEach
42+
void teardown(Env env) {
43+
env.destroyInstance(instance, true);
44+
}
45+
46+
@Test
47+
void testCloseFunctionCall(Env env) {
48+
GlobalInventoryBuilder testInventory = buildInventory();
49+
testInventory.setCloseFunction(event ->
50+
event.getPlayer().sendMessage(Component.text("Closed"))
51+
);
52+
testInventory.register();
53+
54+
assertNotNull(testInventory.getInventory());
55+
56+
player.openInventory(testInventory.getInventory());
57+
assertNotNull(player.getOpenInventory());
58+
assertInstanceOf(CustomInventory.class, player.getOpenInventory());
59+
60+
Collector<SystemChatPacket> chatCollector = testConnection.trackIncoming(SystemChatPacket.class);
61+
Collector<InventoryCloseEvent> closeTracker = env.trackEvent(InventoryCloseEvent.class, EventFilter.INVENTORY, testInventory.getInventory());
62+
63+
player.closeInventory();
64+
65+
closeTracker.assertSingle(event -> {
66+
assertInstanceOf(CustomInventory.class, event.getInventory());
67+
CustomInventory inventory = (CustomInventory) event.getInventory();
68+
assertEquals("Test", PlainTextComponentSerializer.plainText().serialize(inventory.getTitle()));
69+
});
70+
71+
env.tick();
72+
assertSingleChatMessage(chatCollector, "Closed");
73+
}
74+
75+
@Test
76+
void testOpenFunctionCall(Env env) {
77+
GlobalInventoryBuilder testInventory = buildInventory();
78+
testInventory.setOpenFunction(event ->
79+
event.getPlayer().sendMessage(Component.text("Opened"))
80+
);
81+
testInventory.register();
82+
83+
assertNotNull(testInventory.getInventory());
84+
85+
Collector<SystemChatPacket> chatCollector = testConnection.trackIncoming(SystemChatPacket.class);
86+
Collector<InventoryOpenEvent> openTracker = env.trackEvent(InventoryOpenEvent.class, EventFilter.INVENTORY, testInventory.getInventory());
87+
88+
player.openInventory(testInventory.getInventory());
89+
assertNotNull(player.getOpenInventory());
90+
assertInstanceOf(CustomInventory.class, player.getOpenInventory());
91+
92+
openTracker.assertSingle(event -> {
93+
assertInstanceOf(CustomInventory.class, event.getInventory());
94+
CustomInventory inventory = (CustomInventory) event.getInventory();
95+
assertEquals("Test", PlainTextComponentSerializer.plainText().serialize(inventory.getTitle()));
96+
});
97+
98+
env.tick();
99+
assertSingleChatMessage(chatCollector, "Opened");
100+
}
101+
102+
/**
103+
* Creates a pre-configured {@link GlobalInventoryBuilder} with {@link #TITLE_COMPONENT}
104+
* as title and {@link InventoryType#ANVIL} as type, including a matching layout.
105+
*
106+
* @return a new {@link GlobalInventoryBuilder} ready for use in tests
107+
*/
108+
private GlobalInventoryBuilder buildInventory() {
109+
GlobalInventoryBuilder builder = new GlobalInventoryBuilder(TITLE_COMPONENT, InventoryType.ANVIL);
110+
builder.setLayout(InventoryLayout.fromType(builder.getType()));
111+
return builder;
112+
}
113+
114+
/**
115+
* Asserts that the given {@link Collector} contains exactly one {@link SystemChatPacket}
116+
* whose first component matches the expected plain-text message.
117+
*
118+
* @param collector the packet collector to assert against
119+
* @param expected the expected plain-text message
120+
*/
121+
private void assertSingleChatMessage(Collector<SystemChatPacket> collector, String expected) {
122+
collector.assertSingle(packet -> {
123+
assertNotNull(packet.components());
124+
assertEquals(1, packet.components().size());
125+
Component first = packet.components().iterator().next();
126+
assertNotNull(first);
127+
assertEquals(expected, PlainTextComponentSerializer.plainText().serialize(first));
128+
});
129+
}
130+
}

0 commit comments

Comments
 (0)