From 40061ba31806ecb5d032ea3a1f3b0358476982c9 Mon Sep 17 00:00:00 2001 From: Touchie771 Date: Wed, 26 Nov 2025 19:10:53 +0200 Subject: [PATCH 1/2] added tests --- build.gradle | 11 ++- .../touchie771/minecraftGUI/api/MenuTest.java | 70 +++++++++++++++ .../minecraftGUI/api/SlotItemTest.java | 20 +++++ .../api/presets/ConfirmationMenuTest.java | 88 +++++++++++++++++++ .../api/presets/PaginationMenuTest.java | 78 ++++++++++++++++ 5 files changed, 266 insertions(+), 1 deletion(-) create mode 100644 src/test/java/me/touchie771/minecraftGUI/api/MenuTest.java create mode 100644 src/test/java/me/touchie771/minecraftGUI/api/SlotItemTest.java create mode 100644 src/test/java/me/touchie771/minecraftGUI/api/presets/ConfirmationMenuTest.java create mode 100644 src/test/java/me/touchie771/minecraftGUI/api/presets/PaginationMenuTest.java diff --git a/build.gradle b/build.gradle index e3b6ac9..a42f825 100644 --- a/build.gradle +++ b/build.gradle @@ -17,6 +17,15 @@ repositories { dependencies { compileOnly("io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT") + + testImplementation "org.junit.jupiter:junit-jupiter:5.10.2" + testImplementation "org.mockito:mockito-core:5.11.0" + testImplementation "org.mockito:mockito-junit-jupiter:5.11.0" + testImplementation "com.github.seeseemelk:MockBukkit-v1.21:3.106.0" +} + +tasks.named('test') { + useJUnitPlatform() } tasks { @@ -72,4 +81,4 @@ publishing { artifactId = 'minecraftgui' } } -} +} \ No newline at end of file diff --git a/src/test/java/me/touchie771/minecraftGUI/api/MenuTest.java b/src/test/java/me/touchie771/minecraftGUI/api/MenuTest.java new file mode 100644 index 0000000..6cefded --- /dev/null +++ b/src/test/java/me/touchie771/minecraftGUI/api/MenuTest.java @@ -0,0 +1,70 @@ +package me.touchie771.minecraftGUI.api; + +import be.seeseemelk.mockbukkit.MockBukkit; +import be.seeseemelk.mockbukkit.ServerMock; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +import org.bukkit.plugin.Plugin; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class MenuTest { + + private ServerMock server; + private Plugin plugin; + + @BeforeEach + void setUp() { + server = MockBukkit.mock(); + plugin = MockBukkit.createMockPlugin(); + } + + @AfterEach + void tearDown() { + MockBukkit.unmock(); + } + + @Test + void testMenuBuilderValidation() { + // Test invalid size + assertThrows(IllegalArgumentException.class, () -> + Menu.newBuilder().size(10).title(Component.text("Test")).plugin(plugin).build() + ); + + // Test missing title + assertThrows(IllegalArgumentException.class, () -> + Menu.newBuilder().size(27).plugin(plugin).build() + ); + } + + @Test + void testMenuCreation() { + Menu menu = Menu.newBuilder() + .size(27) + .title(Component.text("Test Menu")) + .plugin(plugin) + .build(); + + assertNotNull(menu); + assertEquals(27, menu.getInventory().getSize()); + } + + @Test + void testAddItem() { + Menu menu = Menu.newBuilder() + .size(27) + .title(Component.text("Test Menu")) + .plugin(plugin) + .build(); + + SlotItem item = new SlotItem(Component.text("Diamond"), (short) 0, Material.DIAMOND, 1); + menu.addItems(item); + + assertTrue(menu.getItems().contains(item)); + assertNotNull(menu.getInventory().getItem(0)); + assertEquals(Material.DIAMOND, menu.getInventory().getItem(0).getType()); + } +} \ No newline at end of file diff --git a/src/test/java/me/touchie771/minecraftGUI/api/SlotItemTest.java b/src/test/java/me/touchie771/minecraftGUI/api/SlotItemTest.java new file mode 100644 index 0000000..193f0ff --- /dev/null +++ b/src/test/java/me/touchie771/minecraftGUI/api/SlotItemTest.java @@ -0,0 +1,20 @@ +package me.touchie771.minecraftGUI.api; + +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +class SlotItemTest { + + @Test + void testSlotItemCreation() { + Component name = Component.text("Test Item"); + SlotItem item = new SlotItem(name, (short) 0, Material.DIAMOND, 1); + + assertEquals(name, item.itemName()); + assertEquals(0, item.itemSlot()); + assertEquals(Material.DIAMOND, item.material()); + assertEquals(1, item.quantity()); + } +} \ No newline at end of file diff --git a/src/test/java/me/touchie771/minecraftGUI/api/presets/ConfirmationMenuTest.java b/src/test/java/me/touchie771/minecraftGUI/api/presets/ConfirmationMenuTest.java new file mode 100644 index 0000000..57e87a3 --- /dev/null +++ b/src/test/java/me/touchie771/minecraftGUI/api/presets/ConfirmationMenuTest.java @@ -0,0 +1,88 @@ +package me.touchie771.minecraftGUI.api.presets; + +import be.seeseemelk.mockbukkit.MockBukkit; +import be.seeseemelk.mockbukkit.ServerMock; +import be.seeseemelk.mockbukkit.entity.PlayerMock; +import me.touchie771.minecraftGUI.api.Menu; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +import org.bukkit.plugin.Plugin; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.concurrent.atomic.AtomicBoolean; + +import static org.junit.jupiter.api.Assertions.*; + +class ConfirmationMenuTest { + + private ServerMock server; + private Plugin plugin; + private PlayerMock player; + + @BeforeEach + void setUp() { + server = MockBukkit.mock(); + plugin = MockBukkit.createMockPlugin(); + player = server.addPlayer(); + } + + @AfterEach + void tearDown() { + MockBukkit.unmock(); + } + + @Test + void testConfirmationMenuCreation() { + Menu menu = ConfirmationMenu.create(plugin, Component.text("Confirm?"), () -> {}, () -> {}); + + assertNotNull(menu); + assertEquals(27, menu.getInventory().getSize()); + + // Check Items + assertNotNull(menu.getInventory().getItem(11)); + assertEquals(Material.LIME_WOOL, menu.getInventory().getItem(11).getType()); + + assertNotNull(menu.getInventory().getItem(15)); + assertEquals(Material.RED_WOOL, menu.getInventory().getItem(15).getType()); + } + + @Test + void testConfirmClick() { + AtomicBoolean confirmed = new AtomicBoolean(false); + AtomicBoolean canceled = new AtomicBoolean(false); + + Menu menu = ConfirmationMenu.create(plugin, Component.text("Confirm?"), + () -> confirmed.set(true), + () -> canceled.set(true) + ); + + player.openInventory(menu.getInventory()); + + // Simulate click on Confirm (slot 11) + player.simulateInventoryClick(player.getOpenInventory(), 11); + + assertTrue(confirmed.get(), "Confirm runnable should be executed"); + assertFalse(canceled.get(), "Cancel runnable should NOT be executed"); + } + + @Test + void testCancelClick() { + AtomicBoolean confirmed = new AtomicBoolean(false); + AtomicBoolean canceled = new AtomicBoolean(false); + + Menu menu = ConfirmationMenu.create(plugin, Component.text("Confirm?"), + () -> confirmed.set(true), + () -> canceled.set(true) + ); + + player.openInventory(menu.getInventory()); + + // Simulate click on Cancel (slot 15) + player.simulateInventoryClick(player.getOpenInventory(), 15); + + assertFalse(confirmed.get(), "Confirm runnable should NOT be executed"); + assertTrue(canceled.get(), "Cancel runnable should be executed"); + } +} \ No newline at end of file diff --git a/src/test/java/me/touchie771/minecraftGUI/api/presets/PaginationMenuTest.java b/src/test/java/me/touchie771/minecraftGUI/api/presets/PaginationMenuTest.java new file mode 100644 index 0000000..743bb9e --- /dev/null +++ b/src/test/java/me/touchie771/minecraftGUI/api/presets/PaginationMenuTest.java @@ -0,0 +1,78 @@ +package me.touchie771.minecraftGUI.api.presets; + +import be.seeseemelk.mockbukkit.MockBukkit; +import be.seeseemelk.mockbukkit.ServerMock; +import be.seeseemelk.mockbukkit.entity.PlayerMock; +import me.touchie771.minecraftGUI.api.presets.PaginationMenu.PageItem; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +import org.bukkit.plugin.Plugin; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class PaginationMenuTest { + + private ServerMock server; + private Plugin plugin; + private PlayerMock player; + + @BeforeEach + void setUp() { + server = MockBukkit.mock(); + plugin = MockBukkit.createMockPlugin(); + player = server.addPlayer(); + } + + @AfterEach + void tearDown() { + MockBukkit.unmock(); + } + + @Test + void testPaginationLogic() { + // Create 50 items. Since page size is 45, we should have 2 pages. + List items = new ArrayList<>(); + for (int i = 0; i < 50; i++) { + items.add(new PageItem(Component.text("Item " + i), Material.STONE, 1, null)); + } + + PaginationMenu menu = new PaginationMenu(plugin, Component.text("Pages"), items); + menu.open(player); + + // Check Page 1 + assertNotNull(player.getOpenInventory().getTopInventory().getItem(0), "Item 0 should be present"); + assertNotNull(player.getOpenInventory().getTopInventory().getItem(44), "Item 44 should be present"); + + // Check Next Button (Slot 53) + assertNotNull(player.getOpenInventory().getTopInventory().getItem(53), "Next button should be present"); + assertEquals(Material.ARROW, player.getOpenInventory().getTopInventory().getItem(53).getType()); + + // Check Prev Button (Slot 45) - Should be null on first page + assertNull(player.getOpenInventory().getTopInventory().getItem(45), "Prev button should NOT be present on page 1"); + + // Click Next Page + player.simulateInventoryClick(player.getOpenInventory(), 53); + + // Check Page 2 + // Item 45 (index) should be at slot 0 + assertNotNull(player.getOpenInventory().getTopInventory().getItem(0), "Item 45 should be present on page 2"); + + // Check Next Button - Should be null on last page + assertNull(player.getOpenInventory().getTopInventory().getItem(53), "Next button should NOT be present on last page"); + + // Check Prev Button - Should be present + assertNotNull(player.getOpenInventory().getTopInventory().getItem(45), "Prev button should be present on page 2"); + + // Click Prev Page + player.simulateInventoryClick(player.getOpenInventory(), 45); + + // Should be back on Page 1 + assertNull(player.getOpenInventory().getTopInventory().getItem(45), "Prev button should NOT be present on page 1"); + } +} \ No newline at end of file From 5b99da7e82591e2d80670a6f4d791fc1af1ff50c Mon Sep 17 00:00:00 2001 From: Touchie771 Date: Wed, 26 Nov 2025 19:15:37 +0200 Subject: [PATCH 2/2] added auto test workflow --- .github/workflows/Test.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .github/workflows/Test.yml diff --git a/.github/workflows/Test.yml b/.github/workflows/Test.yml new file mode 100644 index 0000000..55a423c --- /dev/null +++ b/.github/workflows/Test.yml @@ -0,0 +1,33 @@ +name: Test + +on: + pull_request: + branches: [master] + push: + branches: [master] + +permissions: + contents: read + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v4 + - name: Setup JDK 21 + uses: actions/setup-java@v4 + with: + java-version: 21 + distribution: 'temurin' + cache: gradle + - name: Make gradlew executable + run: chmod +x gradlew + - name: Test with Gradle + run: ./gradlew test + - name: Upload test results + uses: actions/upload-artifact@v4 + if: always() + with: + name: test-results + path: build/test-results/test/ \ No newline at end of file