package fr.luc.bettermcguis; import fr.luc.bettermcguis.api.GuiClickContext; import fr.luc.bettermcguis.api.GuiItem; import fr.luc.bettermcguis.api.GuiType; import fr.luc.bettermcguis.event.GuiClickEvent; import fr.luc.bettermcguis.event.GuiEventManager; import fr.luc.bettermcguis.event.annotation.GuiEventHandler; import fr.luc.bettermcguis.type.SimpleGui; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryAction; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import static org.junit.jupiter.api.Assertions.*; public class GuiLifecycleAndEventTest { @Test @DisplayName("GuiItem doit exécuter son callback de clic et annuler l'action par défaut") void testGuiItemClickHandling() { AtomicBoolean itemActionRan = new AtomicBoolean(false); GuiItem item = GuiItem.of(Material.COMPASS) .onClick(ctx -> itemActionRan.set(true)); Player player = Mockito.mock(Player.class); SimpleGui gui = new SimpleGui("Test", GuiType.CHEST_1_ROW); GuiClickContext ctx = new GuiClickContext( player, gui, item, 4, null, ClickType.LEFT, InventoryAction.PICKUP_ALL, null, null, null ); item.handleClick(ctx); assertTrue(itemActionRan.get()); assertTrue(ctx.isCancelled()); // Annulé par défaut } @Test @DisplayName("GuiEventManager doit trier les écouteurs par priorité et distribuer les événements") void testEventManagerPriorityAndDispatch() { GuiEventManager eventManager = new GuiEventManager(); List executionOrder = new ArrayList<>(); Object listener = new Object() { @GuiEventHandler(priority = 5) public void onLowPriorityClick(GuiClickEvent event) { executionOrder.add("low"); } @GuiEventHandler(priority = 100) public void onHighPriorityClick(GuiClickEvent event) { executionOrder.add("high"); } }; eventManager.registerListeners(listener); Player player = Mockito.mock(Player.class); SimpleGui gui = new SimpleGui("Priority Test", GuiType.CHEST_1_ROW); GuiClickContext ctx = new GuiClickContext(player, gui, null, 0, null, ClickType.LEFT, InventoryAction.NOTHING, null, null, null); eventManager.dispatch(new GuiClickEvent(ctx)); assertEquals(2, executionOrder.size()); assertEquals("high", executionOrder.get(0)); assertEquals("low", executionOrder.get(1)); } }