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