Skip to content

Commit 928c5a2

Browse files
authored
Merge pull request #4 from Touchie771/tests
Add automated testing and CI workflow
2 parents af43617 + 5b99da7 commit 928c5a2

6 files changed

Lines changed: 299 additions & 1 deletion

File tree

.github/workflows/Test.yml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
name: Test
2+
3+
on:
4+
pull_request:
5+
branches: [master]
6+
push:
7+
branches: [master]
8+
9+
permissions:
10+
contents: read
11+
12+
jobs:
13+
test:
14+
runs-on: ubuntu-latest
15+
timeout-minutes: 30
16+
steps:
17+
- uses: actions/checkout@v4
18+
- name: Setup JDK 21
19+
uses: actions/setup-java@v4
20+
with:
21+
java-version: 21
22+
distribution: 'temurin'
23+
cache: gradle
24+
- name: Make gradlew executable
25+
run: chmod +x gradlew
26+
- name: Test with Gradle
27+
run: ./gradlew test
28+
- name: Upload test results
29+
uses: actions/upload-artifact@v4
30+
if: always()
31+
with:
32+
name: test-results
33+
path: build/test-results/test/

build.gradle

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@ repositories {
1717

1818
dependencies {
1919
compileOnly("io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT")
20+
21+
testImplementation "org.junit.jupiter:junit-jupiter:5.10.2"
22+
testImplementation "org.mockito:mockito-core:5.11.0"
23+
testImplementation "org.mockito:mockito-junit-jupiter:5.11.0"
24+
testImplementation "com.github.seeseemelk:MockBukkit-v1.21:3.106.0"
25+
}
26+
27+
tasks.named('test') {
28+
useJUnitPlatform()
2029
}
2130

2231
tasks {
@@ -72,4 +81,4 @@ publishing {
7281
artifactId = 'minecraftgui'
7382
}
7483
}
75-
}
84+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package me.touchie771.minecraftGUI.api;
2+
3+
import be.seeseemelk.mockbukkit.MockBukkit;
4+
import be.seeseemelk.mockbukkit.ServerMock;
5+
import net.kyori.adventure.text.Component;
6+
import org.bukkit.Material;
7+
import org.bukkit.plugin.Plugin;
8+
import org.junit.jupiter.api.AfterEach;
9+
import org.junit.jupiter.api.BeforeEach;
10+
import org.junit.jupiter.api.Test;
11+
12+
import static org.junit.jupiter.api.Assertions.*;
13+
14+
class MenuTest {
15+
16+
private ServerMock server;
17+
private Plugin plugin;
18+
19+
@BeforeEach
20+
void setUp() {
21+
server = MockBukkit.mock();
22+
plugin = MockBukkit.createMockPlugin();
23+
}
24+
25+
@AfterEach
26+
void tearDown() {
27+
MockBukkit.unmock();
28+
}
29+
30+
@Test
31+
void testMenuBuilderValidation() {
32+
// Test invalid size
33+
assertThrows(IllegalArgumentException.class, () ->
34+
Menu.newBuilder().size(10).title(Component.text("Test")).plugin(plugin).build()
35+
);
36+
37+
// Test missing title
38+
assertThrows(IllegalArgumentException.class, () ->
39+
Menu.newBuilder().size(27).plugin(plugin).build()
40+
);
41+
}
42+
43+
@Test
44+
void testMenuCreation() {
45+
Menu menu = Menu.newBuilder()
46+
.size(27)
47+
.title(Component.text("Test Menu"))
48+
.plugin(plugin)
49+
.build();
50+
51+
assertNotNull(menu);
52+
assertEquals(27, menu.getInventory().getSize());
53+
}
54+
55+
@Test
56+
void testAddItem() {
57+
Menu menu = Menu.newBuilder()
58+
.size(27)
59+
.title(Component.text("Test Menu"))
60+
.plugin(plugin)
61+
.build();
62+
63+
SlotItem item = new SlotItem(Component.text("Diamond"), (short) 0, Material.DIAMOND, 1);
64+
menu.addItems(item);
65+
66+
assertTrue(menu.getItems().contains(item));
67+
assertNotNull(menu.getInventory().getItem(0));
68+
assertEquals(Material.DIAMOND, menu.getInventory().getItem(0).getType());
69+
}
70+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package me.touchie771.minecraftGUI.api;
2+
3+
import net.kyori.adventure.text.Component;
4+
import org.bukkit.Material;
5+
import org.junit.jupiter.api.Test;
6+
import static org.junit.jupiter.api.Assertions.*;
7+
8+
class SlotItemTest {
9+
10+
@Test
11+
void testSlotItemCreation() {
12+
Component name = Component.text("Test Item");
13+
SlotItem item = new SlotItem(name, (short) 0, Material.DIAMOND, 1);
14+
15+
assertEquals(name, item.itemName());
16+
assertEquals(0, item.itemSlot());
17+
assertEquals(Material.DIAMOND, item.material());
18+
assertEquals(1, item.quantity());
19+
}
20+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package me.touchie771.minecraftGUI.api.presets;
2+
3+
import be.seeseemelk.mockbukkit.MockBukkit;
4+
import be.seeseemelk.mockbukkit.ServerMock;
5+
import be.seeseemelk.mockbukkit.entity.PlayerMock;
6+
import me.touchie771.minecraftGUI.api.Menu;
7+
import net.kyori.adventure.text.Component;
8+
import org.bukkit.Material;
9+
import org.bukkit.plugin.Plugin;
10+
import org.junit.jupiter.api.AfterEach;
11+
import org.junit.jupiter.api.BeforeEach;
12+
import org.junit.jupiter.api.Test;
13+
14+
import java.util.concurrent.atomic.AtomicBoolean;
15+
16+
import static org.junit.jupiter.api.Assertions.*;
17+
18+
class ConfirmationMenuTest {
19+
20+
private ServerMock server;
21+
private Plugin plugin;
22+
private PlayerMock player;
23+
24+
@BeforeEach
25+
void setUp() {
26+
server = MockBukkit.mock();
27+
plugin = MockBukkit.createMockPlugin();
28+
player = server.addPlayer();
29+
}
30+
31+
@AfterEach
32+
void tearDown() {
33+
MockBukkit.unmock();
34+
}
35+
36+
@Test
37+
void testConfirmationMenuCreation() {
38+
Menu menu = ConfirmationMenu.create(plugin, Component.text("Confirm?"), () -> {}, () -> {});
39+
40+
assertNotNull(menu);
41+
assertEquals(27, menu.getInventory().getSize());
42+
43+
// Check Items
44+
assertNotNull(menu.getInventory().getItem(11));
45+
assertEquals(Material.LIME_WOOL, menu.getInventory().getItem(11).getType());
46+
47+
assertNotNull(menu.getInventory().getItem(15));
48+
assertEquals(Material.RED_WOOL, menu.getInventory().getItem(15).getType());
49+
}
50+
51+
@Test
52+
void testConfirmClick() {
53+
AtomicBoolean confirmed = new AtomicBoolean(false);
54+
AtomicBoolean canceled = new AtomicBoolean(false);
55+
56+
Menu menu = ConfirmationMenu.create(plugin, Component.text("Confirm?"),
57+
() -> confirmed.set(true),
58+
() -> canceled.set(true)
59+
);
60+
61+
player.openInventory(menu.getInventory());
62+
63+
// Simulate click on Confirm (slot 11)
64+
player.simulateInventoryClick(player.getOpenInventory(), 11);
65+
66+
assertTrue(confirmed.get(), "Confirm runnable should be executed");
67+
assertFalse(canceled.get(), "Cancel runnable should NOT be executed");
68+
}
69+
70+
@Test
71+
void testCancelClick() {
72+
AtomicBoolean confirmed = new AtomicBoolean(false);
73+
AtomicBoolean canceled = new AtomicBoolean(false);
74+
75+
Menu menu = ConfirmationMenu.create(plugin, Component.text("Confirm?"),
76+
() -> confirmed.set(true),
77+
() -> canceled.set(true)
78+
);
79+
80+
player.openInventory(menu.getInventory());
81+
82+
// Simulate click on Cancel (slot 15)
83+
player.simulateInventoryClick(player.getOpenInventory(), 15);
84+
85+
assertFalse(confirmed.get(), "Confirm runnable should NOT be executed");
86+
assertTrue(canceled.get(), "Cancel runnable should be executed");
87+
}
88+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package me.touchie771.minecraftGUI.api.presets;
2+
3+
import be.seeseemelk.mockbukkit.MockBukkit;
4+
import be.seeseemelk.mockbukkit.ServerMock;
5+
import be.seeseemelk.mockbukkit.entity.PlayerMock;
6+
import me.touchie771.minecraftGUI.api.presets.PaginationMenu.PageItem;
7+
import net.kyori.adventure.text.Component;
8+
import org.bukkit.Material;
9+
import org.bukkit.plugin.Plugin;
10+
import org.junit.jupiter.api.AfterEach;
11+
import org.junit.jupiter.api.BeforeEach;
12+
import org.junit.jupiter.api.Test;
13+
14+
import java.util.ArrayList;
15+
import java.util.List;
16+
17+
import static org.junit.jupiter.api.Assertions.*;
18+
19+
class PaginationMenuTest {
20+
21+
private ServerMock server;
22+
private Plugin plugin;
23+
private PlayerMock player;
24+
25+
@BeforeEach
26+
void setUp() {
27+
server = MockBukkit.mock();
28+
plugin = MockBukkit.createMockPlugin();
29+
player = server.addPlayer();
30+
}
31+
32+
@AfterEach
33+
void tearDown() {
34+
MockBukkit.unmock();
35+
}
36+
37+
@Test
38+
void testPaginationLogic() {
39+
// Create 50 items. Since page size is 45, we should have 2 pages.
40+
List<PageItem> items = new ArrayList<>();
41+
for (int i = 0; i < 50; i++) {
42+
items.add(new PageItem(Component.text("Item " + i), Material.STONE, 1, null));
43+
}
44+
45+
PaginationMenu menu = new PaginationMenu(plugin, Component.text("Pages"), items);
46+
menu.open(player);
47+
48+
// Check Page 1
49+
assertNotNull(player.getOpenInventory().getTopInventory().getItem(0), "Item 0 should be present");
50+
assertNotNull(player.getOpenInventory().getTopInventory().getItem(44), "Item 44 should be present");
51+
52+
// Check Next Button (Slot 53)
53+
assertNotNull(player.getOpenInventory().getTopInventory().getItem(53), "Next button should be present");
54+
assertEquals(Material.ARROW, player.getOpenInventory().getTopInventory().getItem(53).getType());
55+
56+
// Check Prev Button (Slot 45) - Should be null on first page
57+
assertNull(player.getOpenInventory().getTopInventory().getItem(45), "Prev button should NOT be present on page 1");
58+
59+
// Click Next Page
60+
player.simulateInventoryClick(player.getOpenInventory(), 53);
61+
62+
// Check Page 2
63+
// Item 45 (index) should be at slot 0
64+
assertNotNull(player.getOpenInventory().getTopInventory().getItem(0), "Item 45 should be present on page 2");
65+
66+
// Check Next Button - Should be null on last page
67+
assertNull(player.getOpenInventory().getTopInventory().getItem(53), "Next button should NOT be present on last page");
68+
69+
// Check Prev Button - Should be present
70+
assertNotNull(player.getOpenInventory().getTopInventory().getItem(45), "Prev button should be present on page 2");
71+
72+
// Click Prev Page
73+
player.simulateInventoryClick(player.getOpenInventory(), 45);
74+
75+
// Should be back on Page 1
76+
assertNull(player.getOpenInventory().getTopInventory().getItem(45), "Prev button should NOT be present on page 1");
77+
}
78+
}

0 commit comments

Comments
 (0)