Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions .github/workflows/Test.yml
Original file line number Diff line number Diff line change
@@ -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/
11 changes: 10 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -72,4 +81,4 @@ publishing {
artifactId = 'minecraftgui'
}
}
}
}
70 changes: 70 additions & 0 deletions src/test/java/me/touchie771/minecraftGUI/api/MenuTest.java
Original file line number Diff line number Diff line change
@@ -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());
}
}
20 changes: 20 additions & 0 deletions src/test/java/me/touchie771/minecraftGUI/api/SlotItemTest.java
Original file line number Diff line number Diff line change
@@ -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());
}
}
Original file line number Diff line number Diff line change
@@ -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");
}
}
Original file line number Diff line number Diff line change
@@ -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<PageItem> 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");
}
}